Skip to content

Commit

Permalink
[heartbeat] version ping/pong packets and start moving code to onwire…
Browse files Browse the repository at this point in the history
…_vX.(c|h)

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Sep 11, 2020
1 parent a9edd6b commit 32357ce
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 86 deletions.
2 changes: 2 additions & 0 deletions libknet/Makefile.am
Expand Up @@ -38,6 +38,7 @@ sources = \
logging.c \
netutils.c \
onwire.c \
onwire_v1.c \
threads_common.c \
threads_dsthandler.c \
threads_heartbeat.c \
Expand Down Expand Up @@ -72,6 +73,7 @@ noinst_HEADERS = \
logging.h \
netutils.h \
onwire.h \
onwire_v1.h \
threads_common.h \
threads_dsthandler.h \
threads_heartbeat.h \
Expand Down
29 changes: 10 additions & 19 deletions libknet/onwire.h
Expand Up @@ -35,14 +35,6 @@

#define KNET_HEADER_TYPE_DATA 0x00 /* pure data packet */

/*
* NOTE: adding packets in the PMSK requires changes to thread_rx.c
* KNET_LINK_DYNIP code handling as thread_rx expects
* link_id as first uint8_t in the packet structure.
* See also above pmtud and ping/pong packets.
*/

#define KNET_HEADER_TYPE_PMSK 0x80 /* packet mask */
#define KNET_HEADER_TYPE_PING 0x81 /* heartbeat */
#define KNET_HEADER_TYPE_PONG 0x82 /* reply to heartbeat */
#define KNET_HEADER_TYPE_PMTUD 0x83 /* Used to determine Path MTU */
Expand Down Expand Up @@ -78,18 +70,18 @@ struct knet_header_payload_data {
* KNET_HEADER_TYPE_PING / KNET_HEADER_TYPE_PONG
*/

struct knet_header_payload_ping {
struct knet_header_payload_ping_v1 {
uint8_t khp_ping_link; /* changing khp_ping_link requires changes to thread_rx.c
KNET_LINK_DYNIP code handling */
uint32_t khp_ping_time[4]; /* ping timestamp */
seq_num_t khp_ping_seq_num; /* transport host seq_num */
uint8_t khp_ping_timed; /* timed pinged (1) or forced by seq_num (0) */
} __attribute__((packed));

#define khp_ping_link kh_payload.khp_ping.khp_ping_link
#define khp_ping_time kh_payload.khp_ping.khp_ping_time
#define khp_ping_seq_num kh_payload.khp_ping.khp_ping_seq_num
#define khp_ping_timed kh_payload.khp_ping.khp_ping_timed
#define khp_ping_v1_link kh_payload.khp_ping_v1.khp_ping_link
#define khp_ping_v1_time kh_payload.khp_ping_v1.khp_ping_time
#define khp_ping_v1_seq_num kh_payload.khp_ping_v1.khp_ping_seq_num
#define khp_ping_v1_timed kh_payload.khp_ping_v1.khp_ping_timed

/*
* KNET_HEADER_TYPE_PMTUD / KNET_HEADER_TYPE_PMTUD_REPLY
Expand All @@ -111,8 +103,7 @@ struct knet_header_payload_ping {
#define KNET_PMTUD_MIN_MTU_V6 1280

struct knet_header_payload_pmtud {
uint8_t khp_pmtud_link; /* changing khp_pmtud_link requires changes to thread_rx.c
KNET_LINK_DYNIP code handling */
uint8_t khp_pmtud_link; /* link_id */
uint16_t khp_pmtud_size; /* size of the current packet */
uint8_t khp_pmtud_data[0]; /* pointer to empty/random data/fill buffer */
} __attribute__((packed));
Expand All @@ -134,9 +125,9 @@ size_t calc_min_mtu(knet_handle_t knet_h);
*/

union knet_header_payload {
struct knet_header_payload_data khp_data; /* pure data packet struct */
struct knet_header_payload_ping khp_ping; /* heartbeat packet struct */
struct knet_header_payload_pmtud khp_pmtud; /* Path MTU discovery packet struct */
struct knet_header_payload_data khp_data; /* pure data packet struct */
struct knet_header_payload_ping_v1 khp_ping_v1; /* heartbeat packet struct */
struct knet_header_payload_pmtud khp_pmtud; /* Path MTU discovery packet struct */
} __attribute__((packed));

/*
Expand All @@ -158,7 +149,7 @@ struct knet_header {

#define KNET_HEADER_ALL_SIZE sizeof(struct knet_header)
#define KNET_HEADER_SIZE (KNET_HEADER_ALL_SIZE - sizeof(union knet_header_payload))
#define KNET_HEADER_PING_SIZE (KNET_HEADER_SIZE + sizeof(struct knet_header_payload_ping))
#define KNET_HEADER_PING_V1_SIZE (KNET_HEADER_SIZE + sizeof(struct knet_header_payload_ping_v1))
#define KNET_HEADER_PMTUD_SIZE (KNET_HEADER_SIZE + sizeof(struct knet_header_payload_pmtud))
#define KNET_HEADER_DATA_SIZE (KNET_HEADER_SIZE + sizeof(struct knet_header_payload_data))

Expand Down
97 changes: 97 additions & 0 deletions libknet/onwire_v1.c
@@ -0,0 +1,97 @@
/*
* Copyright (C) 2020 Red Hat, Inc. All rights reserved.
*
* Authors: Fabio M. Di Nitto <fabbione@kronosnet.org>
*
* This software licensed under LGPL-2.0+
*/

#include "config.h"

#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <time.h>

#include "logging.h"
#include "host.h"
#include "links.h"

int prep_ping_v1(knet_handle_t knet_h, struct knet_link *dst_link, int timed, ssize_t *outlen, struct timespec clock_now, uint8_t onwire_ver)
{
*outlen = KNET_HEADER_PING_V1_SIZE;

/* preparing ping buffer */
knet_h->pingbuf->kh_version = onwire_ver;
knet_h->pingbuf->kh_max_ver = KNET_HEADER_ONWIRE_MAX_VER;
knet_h->pingbuf->kh_type = KNET_HEADER_TYPE_PING;
knet_h->pingbuf->kh_node = htons(knet_h->host_id);
knet_h->pingbuf->khp_ping_v1_link = dst_link->link_id;
knet_h->pingbuf->khp_ping_v1_timed = timed;
memmove(&knet_h->pingbuf->khp_ping_v1_time[0], &clock_now, sizeof(struct timespec));

if (pthread_mutex_lock(&knet_h->tx_seq_num_mutex)) {
log_debug(knet_h, KNET_SUB_HEARTBEAT, "Unable to get seq mutex lock");
return -1;
}
knet_h->pingbuf->khp_ping_v1_seq_num = htons(knet_h->tx_seq_num);
pthread_mutex_unlock(&knet_h->tx_seq_num_mutex);

return 0;
}

void prep_pong_v1(knet_handle_t knet_h, ssize_t *outlen, struct knet_header *inbuf)
{
*outlen = KNET_HEADER_PING_V1_SIZE;
inbuf->kh_type = KNET_HEADER_TYPE_PONG;
inbuf->kh_node = htons(knet_h->host_id);
}

void process_ping_v1(knet_handle_t knet_h, struct knet_host *src_host, struct knet_link *src_link, struct knet_header *inbuf, ssize_t len)
{
int wipe_bufs = 0;
seq_num_t recv_seq_num = ntohs(inbuf->khp_ping_v1_seq_num);

if (!inbuf->khp_ping_v1_timed) {
/*
* we might be receiving this message from all links, but we want
* to process it only the first time
*/
if (recv_seq_num != src_host->untimed_rx_seq_num) {
/*
* cache the untimed seq num
*/
src_host->untimed_rx_seq_num = recv_seq_num;
/*
* if the host has received data in between
* untimed ping, then we don't need to wipe the bufs
*/
if (src_host->got_data) {
src_host->got_data = 0;
wipe_bufs = 0;
} else {
wipe_bufs = 1;
}
}
_seq_num_lookup(src_host, recv_seq_num, 0, wipe_bufs);
} else {
/*
* pings always arrives in bursts over all the link
* catch the first of them to cache the seq num and
* avoid duplicate processing
*/
if (recv_seq_num != src_host->timed_rx_seq_num) {
src_host->timed_rx_seq_num = recv_seq_num;

if (recv_seq_num == 0) {
_seq_num_lookup(src_host, recv_seq_num, 0, 1);
}
}
}
}

void process_pong_v1(knet_handle_t knet_h, struct knet_host *src_host, struct knet_link *src_link, struct knet_header *inbuf, struct timespec *recvtime)
{
memmove(recvtime, &inbuf->khp_ping_v1_time[0], sizeof(struct timespec));
}
21 changes: 21 additions & 0 deletions libknet/onwire_v1.h
@@ -0,0 +1,21 @@
/*
* Copyright (C) 2020 Red Hat, Inc. All rights reserved.
*
* Authors: Fabio M. Di Nitto <fabbione@kronosnet.org>
*
* This software licensed under LGPL-2.0+
*/

#ifndef __KNET_ONWIRE_V1_H__
#define __KNET_ONWIRE_V1_H__

#include <stdint.h>

#include "internals.h"

int prep_ping_v1(knet_handle_t knet_h, struct knet_link *dst_link, int timed, ssize_t *outlen, struct timespec clock_now, uint8_t onwire_ver);
void prep_pong_v1(knet_handle_t knet_h, ssize_t *outlen, struct knet_header *inbuf);
void process_ping_v1(knet_handle_t knet_h, struct knet_host *src_host, struct knet_link *src_link, struct knet_header *inbuf, ssize_t len);
void process_pong_v1(knet_handle_t knet_h, struct knet_host *src_host, struct knet_link *src_link, struct knet_header *inbuf, struct timespec *recvtime);

#endif
2 changes: 1 addition & 1 deletion libknet/tests/pckt_test.c
Expand Up @@ -15,7 +15,7 @@ int main(void)
printf("\nKronosnet network header size printout:\n\n");
printf("KNET_HEADER_ALL_SIZE: %zu\n", KNET_HEADER_ALL_SIZE);
printf("KNET_HEADER_SIZE: %zu\n", KNET_HEADER_SIZE);
printf("KNET_HEADER_PING_SIZE: %zu (%zu)\n", KNET_HEADER_PING_SIZE, sizeof(struct knet_header_payload_ping));
printf("KNET_HEADER_PING_V1_SIZE: %zu (%zu)\n", KNET_HEADER_PING_V1_SIZE, sizeof(struct knet_header_payload_ping_v1));
printf("KNET_HEADER_PMTUD_SIZE: %zu (%zu)\n", KNET_HEADER_PMTUD_SIZE, sizeof(struct knet_header_payload_pmtud));
printf("KNET_HEADER_DATA_SIZE: %zu (%zu)\n", KNET_HEADER_DATA_SIZE, sizeof(struct knet_header_payload_data));

Expand Down

0 comments on commit 32357ce

Please sign in to comment.