static void _stop_transports(knet_handle_t knet_h)
{
+ int i;
knet_transport_ops_t *ops = NULL;
- ops = get_udp_transport();
- ops->handle_free(knet_h, knet_h->transport);
+ for (i=0; i<KNET_MAX_TRANSPORTS; i++) {
+ switch (i) {
+ case KNET_TRANSPORT_UDP:
+ ops = get_udp_transport();
+ break;
+ }
+ if (ops) {
+ ops->handle_free(knet_h, knet_h->transports[i]);
+ }
+ }
}
static void _stop_threads(knet_handle_t knet_h)
struct knet_link_status status;
/* internals */
uint8_t link_id;
+ uint8_t transport_type; /* #defined constant from API */
knet_transport_link_t transport;
int outsock;
int listener_sock;
struct knet_host *host_head;
struct knet_host *host_tail;
struct knet_host *host_index[KNET_MAX_HOST];
- knet_transport_t transport;
- struct knet_transport_ops *transport_ops;
+ knet_transport_t transports[KNET_MAX_TRANSPORTS];
+ struct knet_transport_ops *transport_ops[KNET_MAX_TRANSPORTS];
uint16_t host_ids[KNET_MAX_HOST];
size_t host_ids_entries;
struct knet_listener *listener_head;
* -
*/
+#define KNET_TRANSPORT_UDP 0
+#define KNET_MAX_TRANSPORTS 1
+
/*
* knet_link_set_config
*
*
* link_id - see above
*
+ * transport - one of the above KNET_TRANSPORT_xxx constants
+ *
* src_addr - sockaddr_storage that can be either IPv4 or IPv6
*
* dst_addr - sockaddr_storage that can be either IPv4 or IPv6
*/
int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id,
+ uint8_t transport,
struct sockaddr_storage *src_addr,
struct sockaddr_storage *dst_addr);
*
* link_id - see above
*
+ * transport - see above
+ *
* src_addr - sockaddr_storage that can be either IPv4 or IPv6
*
* dst_addr - sockaddr_storage that can be either IPv4 or IPv6
*/
int knet_link_get_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id,
+ uint8_t *transport,
struct sockaddr_storage *src_addr,
struct sockaddr_storage *dst_addr,
uint8_t *dynamic);
}
int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id,
+ uint8_t transport,
struct sockaddr_storage *src_addr,
struct sockaddr_storage *dst_addr)
{
return -1;
}
+ if (transport != KNET_TRANSPORT_UDP) {
+ errno = EINVAL;
+ return -1;
+ }
+
savederrno = pthread_rwlock_wrlock(&knet_h->global_rwlock);
if (savederrno) {
log_err(knet_h, KNET_SUB_LINK, "Unable to get write lock: %s",
goto exit_unlock;
}
+ link->transport_type = transport;
link->dynamic = KNET_LINK_STATIC;
memmove(&link->dst_addr, dst_addr, sizeof(struct sockaddr_storage));
}
- knet_h->transport_ops = get_udp_transport();
+ switch (transport) {
+ case KNET_TRANSPORT_UDP:
+ knet_h->transport_ops[link->transport_type] = get_udp_transport();
+ break;
+ default:
+ errno = EINVAL;
+ err = -1;
+ goto exit_unlock;
+ }
/* First time we've used this transport for this handle */
- if (!knet_h->transport) {
- knet_h->transport_ops->handle_allocate(knet_h, &knet_h->transport);
+ if (!knet_h->transports[transport]) {
+ knet_h->transport_ops[link->transport_type]->handle_allocate(knet_h, &knet_h->transports[transport]);
}
- if (!knet_h->transport) {
+ if (!knet_h->transports[transport]) {
savederrno = errno;
log_err(knet_h, KNET_SUB_LISTENER, "Failed to allocate transport handle for %s: %s",
- knet_h->transport_ops->transport_name,
+ knet_h->transport_ops[link->transport_type]->transport_name,
strerror(savederrno));
err = -1;
goto exit_unlock;
}
int knet_link_get_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id,
+ uint8_t *transport,
struct sockaddr_storage *src_addr,
struct sockaddr_storage *dst_addr,
uint8_t *dynamic)
memmove(src_addr, &link->src_addr, sizeof(struct sockaddr_storage));
+ if (transport) {
+ *transport = link->transport_type;
+ }
+
if (link->dynamic == KNET_LINK_STATIC) {
*dynamic = 0;
memmove(dst_addr, &link->dst_addr, sizeof(struct sockaddr_storage));
}
if (enabled) {
- if (knet_h->transport_ops->link_allocate(
- knet_h, knet_h->transport,
+ if (knet_h->transport_ops[link->transport_type]->link_allocate(
+ knet_h, knet_h->transports[link->transport_type],
link,
&link->transport, link_id,
&link->src_addr, &link->dst_addr,
memset(listener, 0, sizeof(struct knet_listener));
memmove(&listener->address, &lnk->src_addr, sizeof(struct sockaddr_storage));
- knet_h->transport_ops->link_listener_start(knet_h, lnk->transport, link_id,
- &lnk->src_addr, &lnk->dst_addr);
+ knet_h->transport_ops[lnk->transport_type]->link_listener_start(knet_h, lnk->transport, link_id,
+ &lnk->src_addr, &lnk->dst_addr);
/* pushing new host to the front */
listener->next = knet_h->listener_head;
}
}
- knet_h->transport_ops->link_free(lnk->transport);
+ knet_h->transport_ops[lnk->transport_type]->link_free(lnk->transport);
lnk->transport = NULL;
epoll_ctl(knet_h->recv_from_links_epollfd, EPOLL_CTL_DEL, listener->sock, &ev);
exit(FAIL);
}
- if (knet_link_set_config(knet_h, 1, 0, &ss, NULL) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &ss, NULL) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
knet_handle_t knet_h;
int logfds[2];
struct sockaddr_storage src, dst, get_src, get_dst;
- uint8_t dynamic = 0;
+ uint8_t dynamic = 0, transport = 0;
memset(&src, 0, sizeof(struct sockaddr_storage));
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(NULL, 1, 0, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(NULL, 1, 0, &transport, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted invalid knet_h or returned incorrect error: %s\n", strerror(errno));
exit(FAIL);
}
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(knet_h, 1, 0, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(knet_h, 1, 0, &transport, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted invalid host_id or returned incorrect error: %s\n", strerror(errno));
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(knet_h, 1, KNET_MAX_LINK, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(knet_h, 1, KNET_MAX_LINK, &transport, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted invalid linkid or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(knet_h, 1, 0, NULL, &get_dst, &dynamic)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(knet_h, 1, 0, &transport, NULL, &get_dst, &dynamic)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted invalid src_addr or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(knet_h, 1, 0, &get_src, &get_dst, NULL)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(knet_h, 1, 0, &transport, &get_src, &get_dst, NULL)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted invalid dynamic or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(knet_h, 1, 0, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(knet_h, 1, 0, &transport, &get_src, &get_dst, &dynamic)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted unconfigured link or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_config with incorrect dst_addr\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if ((!knet_link_get_config(knet_h, 1, 0, &get_src, NULL, &dynamic)) || (errno != EINVAL)) {
+ if ((!knet_link_get_config(knet_h, 1, 0, &transport, &get_src, NULL, &dynamic)) || (errno != EINVAL)) {
printf("knet_link_get_config accepted invalid dst_addr or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if (knet_link_get_config(knet_h, 1, 0, &get_src, &get_dst, &dynamic) < 0) {
+ if (knet_link_get_config(knet_h, 1, 0, &transport, &get_src, &get_dst, &dynamic) < 0) {
printf("knet_link_get_config failed: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_config with correct parameters for dynamic link\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, NULL) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, NULL) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
memset(&get_src, 0, sizeof(struct sockaddr_storage));
memset(&get_dst, 0, sizeof(struct sockaddr_storage));
- if (knet_link_get_config(knet_h, 1, 0, &get_src, &get_dst, &dynamic) < 0) {
+ if (knet_link_get_config(knet_h, 1, 0, &transport, &get_src, &get_dst, &dynamic) < 0) {
printf("knet_link_get_config failed: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_enable with disabled link\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_link_list with 1 link\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_ping_timers with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_pong_count with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_priority with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_get_status with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_config incorrect knet_h\n");
- if ((!knet_link_set_config(NULL, 1, 0, &src, &dst)) || (errno != EINVAL)) {
+ if ((!knet_link_set_config(NULL, 1, 0, KNET_TRANSPORT_UDP, &src, &dst)) || (errno != EINVAL)) {
printf("knet_link_set_config accepted invalid knet_h or returned incorrect error: %s\n", strerror(errno));
exit(FAIL);
}
printf("Test knet_link_set_config with unconfigured host_id\n");
- if ((!knet_link_set_config(knet_h, 1, 0, &src, &dst)) || (errno != EINVAL)) {
+ if ((!knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst)) || (errno != EINVAL)) {
printf("knet_link_set_config accepted invalid host_id or returned incorrect error: %s\n", strerror(errno));
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
exit(FAIL);
}
- if ((!knet_link_set_config(knet_h, 1, KNET_MAX_LINK, &src, &dst)) || (errno != EINVAL)) {
+ if ((!knet_link_set_config(knet_h, 1, KNET_MAX_LINK, KNET_TRANSPORT_UDP, &src, &dst)) || (errno != EINVAL)) {
printf("knet_link_set_config accepted invalid linkid or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_config with incorrect src_addr\n");
- if ((!knet_link_set_config(knet_h, 1, 0, NULL, &dst)) || (errno != EINVAL)) {
+ if ((!knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, NULL, &dst)) || (errno != EINVAL)) {
printf("knet_link_set_config accepted invalid src_addr or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_config with dynamic dst_addr\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, NULL) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, NULL) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
exit(FAIL);
}
- if ((!knet_link_set_config(knet_h, 1, 0, &src, NULL)) || (errno != EBUSY)) {
+ if ((!knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, NULL)) || (errno != EBUSY)) {
printf("knet_link_set_config accepted request while link enabled or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_config with static dst_addr\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_enable with incorrect values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_ping_timers with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_pong_count with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf("Test knet_link_set_priority with correct values\n");
- if (knet_link_set_config(knet_h, 1, 0, &src, &dst) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
exit(FAIL);
}
- if (knet_link_set_config(knet_h, 1, 0, &lo, &lo) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &lo, &lo) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
exit(FAIL);
}
- if (knet_link_set_config(knet_h, 1, 0, &lo, &lo) < 0) {
+ if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, &lo, &lo) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
printf(" -c [implementation]:[crypto]:[hashing] crypto configuration. (default disabled)\n");
printf(" Example: -c nss:aes128:sha1\n");
printf(" -p [active|passive|rr] (default: passive)\n");
+ printf(" -P [udp|sctp|tcp] (default: udp) protocol (transport) to use\n");
printf(" -t [nodeid] This nodeid (required)\n");
printf(" -n [nodeid],[link1_ip_addr],[link2_..] Other nodes information (at least one required)\n");
printf(" Example: -t 1,192.168.8.1,3ffe::8:1,..\n");
{
int logfd;
int rv;
- char *cryptocfg = NULL, *policystr = NULL;
+ char *cryptocfg = NULL, *policystr = NULL, *protostr = NULL;
char *othernodeinfo[MAX_NODES];
struct node nodes[MAX_NODES];
int thisnodeid = -1;
struct sockaddr_storage *src;
int i, link_idx, allnodesup = 0;
int policy = KNET_LINK_POLICY_PASSIVE, policyfound = 0;
+ int protocol = KNET_TRANSPORT_UDP, protofound = 0;
int wait = 1;
struct knet_handle_crypto_cfg knet_handle_crypto_cfg;
char *cryptomodel = NULL, *cryptotype = NULL, *cryptohash = NULL;
memset(nodes, 0, sizeof(nodes));
optind = 0;
- while ((rv = getopt(argc, argv, "CT:s:ldowb:t:n:c:p:h")) != EOF) {
+ while ((rv = getopt(argc, argv, "CT:s:ldowb:t:n:c:p:P:h")) != EOF) {
switch(rv) {
case 'h':
print_help();
exit(FAIL);
}
break;
+ case 'P':
+ if (protostr) {
+ printf("Error: -P can only be specified once\n");
+ exit(FAIL);
+ }
+ protostr = optarg;
+ if (!strcmp(protostr, "udp")) {
+ protocol = KNET_TRANSPORT_UDP;
+ protofound = 1;
+ }
+ if (!protofound) {
+ printf("Error: invalid protocol %s specified. -P accepts udp\n", policystr);
+ exit(FAIL);
+ }
+ break;
case 't':
if (thisnodeid >= 0) {
printf("Error: -t can only be specified once\n");
}
}
if (knet_link_set_config(knet_h, nodes[i].nodeid, link_idx,
- src,
+ protocol, src,
&nodes[i].address[link_idx]) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
exit(FAIL);
static struct knet_handle_crypto_cfg knet_handle_crypto_cfg;
static uint8_t loglevel = KNET_LOG_INFO;
static uint8_t use_stdout = 0;
+static uint8_t use_transport = KNET_TRANSPORT_UDP;
static char *src_host = NULL;
static char *src_port = NULL;
static int can_use_sync = 0;
}
}
+static void set_transport(int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (!strncmp(argv[i], "udp", 3)) {
+ use_transport = KNET_TRANSPORT_UDP;
+ break;
+ }
+ }
+}
+
static void set_debug(int argc, char *argv[])
{
int i;
continue;
if (!strncmp(argv[i], "stdout", 6))
continue;
+ if (!strncmp(argv[i], "udp", 3))
+ continue;
node_id = i - 1;
exit(EXIT_FAILURE);
}
- knet_link_set_config(knet_h, node_id, 0, &src_addr, &dst_addr);
+ knet_link_set_config(knet_h, node_id, 0, use_transport, &src_addr, &dst_addr);
knet_link_set_ping_timers(knet_h, node_id, 0, 1000, 5000, 2048);
knet_link_set_pong_count(knet_h, node_id, 0, 3);
knet_link_set_enable(knet_h, node_id, 0, 1);
}
set_debug(argc, argv);
+ set_transport(argc, argv);
if ((knet_h = knet_handle_new(1, logfd, loglevel)) == NULL) {
printf("Unable to create new knet_handle_t\n");
failsafe = 0;
pad_len = 0;
- dst_link->last_bad_mtu = knet_h->transport_ops->link_get_mtu_overhead(dst_link->transport);
+ dst_link->last_bad_mtu = knet_h->transport_ops[dst_link->transport_type]->link_get_mtu_overhead(dst_link->transport);
knet_h->pmtudbuf->khp_pmtud_link = dst_link->link_id;
static void _close_socket(knet_handle_t knet_h, int sockfd)
{
struct epoll_event ev;
+ int i;
log_err(knet_h, KNET_SUB_LINK_T, "EOF received on socket fd %d", sockfd);
}
/* Tell transport that the FD has been closed */
- knet_h->transport_ops->handle_fd_eof(knet_h, sockfd);
+ for (i=0; i<KNET_MAX_TRANSPORTS; i++) {
+ if (knet_h->transports[i] &&
+ !knet_h->transport_ops[i]->handle_fd_eof(knet_h, sockfd))
+ break;
+ }
}
static void _handle_send_to_links(knet_handle_t knet_h, int sockfd, int8_t channel, struct mmsghdr *msg, int type)
#ifdef DEBUG
/*
- * Keeping this light (and therefore not thread-safe) as it's
+ * Keeping this light (and there fornot thread-safe) as it's
* for debugging only
*/
const char *_transport_print_ip(const struct sockaddr_storage *ss)
#include <netinet/in.h>
-#include <netinet/sctp.h>
knet_transport_ops_t *get_udp_transport(void);