]> git.proxmox.com Git - mirror_kronosnet.git/commitdiff
libknet: Add support for multiple transports
authorChristine Caulfield <ccaulfie@redhat.com>
Fri, 2 Dec 2016 15:10:08 +0000 (15:10 +0000)
committerChristine Caulfield <ccaulfie@redhat.com>
Fri, 2 Dec 2016 15:10:08 +0000 (15:10 +0000)
Changes the API to add transport to
knet_link_set_config & knet_link_get_config

26 files changed:
libknet/handle.c
libknet/internals.h
libknet/libknet.h
libknet/link.c
libknet/listener.c
libknet/tests/api_knet_host_remove.c
libknet/tests/api_knet_link_get_config.c
libknet/tests/api_knet_link_get_enable.c
libknet/tests/api_knet_link_get_link_list.c
libknet/tests/api_knet_link_get_ping_timers.c
libknet/tests/api_knet_link_get_pong_count.c
libknet/tests/api_knet_link_get_priority.c
libknet/tests/api_knet_link_get_status.c
libknet/tests/api_knet_link_set_config.c
libknet/tests/api_knet_link_set_enable.c
libknet/tests/api_knet_link_set_ping_timers.c
libknet/tests/api_knet_link_set_pong_count.c
libknet/tests/api_knet_link_set_priority.c
libknet/tests/api_knet_send.c
libknet/tests/api_knet_send_sync.c
libknet/tests/knet_bench.c
libknet/tests/ping_test.c
libknet/threads_pmtud.c
libknet/threads_send_recv.c
libknet/transport_common.c
libknet/transports.h

index a8e5b3faea9c6b6b20e13cb52ba260e1f29e9d1d..bb9979bf7c9c68bce5e81a7250e33cc14717c807 100644 (file)
@@ -500,10 +500,19 @@ exit_fail:
 
 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)
index 95db8994ef262e8cc37252ca91937b33cce586a4..b29461d880d2345b5cdc2af2c3ccbd4b894987b9 100644 (file)
@@ -53,6 +53,7 @@ struct knet_link {
        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;
@@ -139,8 +140,8 @@ struct knet_handle {
        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;
index 520b270d78253faa1f9fd9560c01916bc4be82b0..cde0ca2702434f1159c82c5ec0a059e828a923d1 100644 (file)
@@ -864,6 +864,9 @@ int knet_host_get_status(knet_handle_t knet_h, uint16_t host_id,
  * -
  */
 
+#define KNET_TRANSPORT_UDP   0
+#define KNET_MAX_TRANSPORTS  1
+
 /*
  * knet_link_set_config
  *
@@ -873,6 +876,8 @@ int knet_host_get_status(knet_handle_t knet_h, uint16_t host_id,
  *
  * 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
@@ -888,6 +893,7 @@ int knet_host_get_status(knet_handle_t knet_h, uint16_t host_id,
  */
 
 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);
 
@@ -900,6 +906,8 @@ int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
  *
  * 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
@@ -915,6 +923,7 @@ int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
  */
 
 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);
index 9f70d2a2d996e60e608cd12bc3f05c5c2ef19b63..95cc09718e3982a5ba0e452f877601edf7da5cec 100644 (file)
@@ -44,6 +44,7 @@ int _link_updown(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id,
 }
 
 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)
 {
@@ -66,6 +67,11 @@ int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
                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",
@@ -121,6 +127,7 @@ int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
                goto exit_unlock;
        }
 
+       link->transport_type = transport;
        link->dynamic = KNET_LINK_STATIC;
 
        memmove(&link->dst_addr, dst_addr, sizeof(struct sockaddr_storage));
@@ -144,16 +151,24 @@ int knet_link_set_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
        }
 
 
-       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;
@@ -177,6 +192,7 @@ 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)
@@ -240,6 +256,10 @@ int knet_link_get_config(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
 
        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));
@@ -316,8 +336,8 @@ int knet_link_set_enable(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id
        }
 
        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,
index 7ed0bfe0e7d9d10e6ed909e03a4f7539621ae3ac..f766e5e675b076a762e0276300cc316232db3acc 100644 (file)
@@ -61,8 +61,8 @@ int _listener_add(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id)
 
                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;
@@ -142,7 +142,7 @@ int _listener_remove(knet_handle_t knet_h, uint16_t host_id, uint8_t link_id)
                }
        }
 
-       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);
index 1f7d23ed0931d43df8119368a21457dcd1d08550..82834bb522752c68c36cd4404a9ad7a8bae990be 100644 (file)
@@ -82,7 +82,7 @@ static void test(void)
                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);
index 258edaf10a984fe5605ac082761e83b2c511050f..694b97805f20ce5238f56f6ec76e2ce48efaf7a3 100644 (file)
@@ -26,7 +26,7 @@ static void test(void)
        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));
 
@@ -47,7 +47,7 @@ static void test(void)
        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);
        }
@@ -68,7 +68,7 @@ static void test(void)
        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);
@@ -91,7 +91,7 @@ static void test(void)
        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);
@@ -107,7 +107,7 @@ static void test(void)
        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);
@@ -123,7 +123,7 @@ static void test(void)
        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);
@@ -139,7 +139,7 @@ static void test(void)
        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);
@@ -152,7 +152,7 @@ static void test(void)
 
        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);
@@ -164,7 +164,7 @@ static void test(void)
        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);
@@ -189,7 +189,7 @@ static void test(void)
        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);
@@ -213,7 +213,7 @@ static void test(void)
 
        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);
@@ -225,7 +225,7 @@ static void test(void)
        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);
index e0bb1c4df12b7619dea8e5173ac37f6abe1fb0f3..076c8cb98d734d178d9d8031796aa84ecc567daf 100644 (file)
@@ -121,7 +121,7 @@ static void test(void)
 
        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);
index 993941dbdac3de9db6efc7e21305146ec49c2c89..4901ff7fbbd5c46ac7759cb8f30c91ed3d92b120 100644 (file)
@@ -134,7 +134,7 @@ static void test(void)
 
        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);
index 746494ae6e3fb30cac3b4d3ed5adbc03da2ef581..0d2d7debcd79cdfa82770f104c0874a4528e9e8b 100644 (file)
@@ -148,7 +148,7 @@ static void test(void)
 
        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);
index 031495566f82f3371deab4685fb5d76ff52f4ade..6faf0da88cf9f4ae3b32e02f9b8b9e325dff6edb 100644 (file)
@@ -121,7 +121,7 @@ static void test(void)
 
        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);
index 64bbc1a39a55dcac50685cfb9c4eb25d4fa5c9b1..c85e5c0795654347ee99c24d5eb11e197e427243 100644 (file)
@@ -121,7 +121,7 @@ static void test(void)
 
        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);
index fc79d310bc364f19fec7099481388a6a17c7f28c..c85df92f6aec4919ec51f5498d5122b201bf1689 100644 (file)
@@ -123,7 +123,7 @@ static void test(void)
 
        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);
index ca9ef43bb731011a96f682dd85eff2d42cd2d28c..e0f3652e297a0c5c7f20d83ff24b714c84844ddf 100644 (file)
@@ -44,7 +44,7 @@ static void test(void)
 
        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);
        }
@@ -62,7 +62,7 @@ static void test(void)
 
        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);
@@ -82,7 +82,7 @@ static void test(void)
                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);
@@ -95,7 +95,7 @@ static void test(void)
 
        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);
@@ -108,7 +108,7 @@ static void test(void)
 
        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);
@@ -161,7 +161,7 @@ static void test(void)
                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);
@@ -181,7 +181,7 @@ static void test(void)
 
        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);
index 3a1a446166074002dc3c2dbb39f285b910c52a41..a83e6182584f34b5879980ffdad5ad0c8cc14c1d 100644 (file)
@@ -107,7 +107,7 @@ static void test(void)
 
        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);
index 133abff7ca9ab968b8ca93b17bb1bf7ad0bf578c..77bccb75d9d342c80445ba7dbf87fea0865036b8 100644 (file)
@@ -146,7 +146,7 @@ static void test(void)
 
        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);
index 968f20e740fd48da8a4bf1df89c6c98ec542cd0f..0929b458535878848465bab3745a2b86230a50d3 100644 (file)
@@ -120,7 +120,7 @@ static void test(void)
 
        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);
index 5179a9a9d346c68058d25fc7132f32e2d22e7a6e..83ebf36b89052e327bc441345ca72a4b13f1fa9a 100644 (file)
@@ -107,7 +107,7 @@ static void test(void)
 
        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);
index 081718dd4a27953f52dc4d35c298d5c657a1eacb..da64d83da1ee01cf2f446d87c524fca46424e050 100644 (file)
@@ -181,7 +181,7 @@ static void test(void)
                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);
index bab9df6d63539862391cc17ab8a19a0155e200bf..be41881af7f2c7d861da52f7a84898bb358905a8 100644 (file)
@@ -305,7 +305,7 @@ static void test(void)
                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);
index 433d4d53c3d3bcf966900eb2e165dc3a3c25b542..3b7357617b9349365241d3d223c5d4a429dfa532 100644 (file)
@@ -56,6 +56,7 @@ static void print_help(void)
        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");
@@ -142,7 +143,7 @@ static void setup_knet(int argc, char *argv[])
 {
        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;
@@ -157,6 +158,7 @@ static void setup_knet(int argc, char *argv[])
        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;
@@ -164,7 +166,7 @@ static void setup_knet(int argc, char *argv[])
        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();
@@ -203,6 +205,21 @@ static void setup_knet(int argc, char *argv[])
                                        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");
@@ -400,7 +417,7 @@ static void setup_knet(int argc, char *argv[])
                                }
                        }
                        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);
index 55557c9df00280912599de49cb25398ce1ab63f4..65a699b0e57d3afbf881837b2c42dd0691f758ff 100644 (file)
@@ -29,6 +29,7 @@ static knet_handle_t knet_h;
 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;
@@ -103,6 +104,18 @@ static void set_log(int argc, char *argv[])
        }
 }
 
+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;
@@ -162,6 +175,8 @@ static void argv_to_hosts(int argc, char *argv[])
                        continue;
                if (!strncmp(argv[i], "stdout", 6))
                        continue;
+               if (!strncmp(argv[i], "udp", 3))
+                       continue;
 
                node_id = i - 1;
 
@@ -191,7 +206,7 @@ static void argv_to_hosts(int argc, char *argv[])
                        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);
@@ -424,6 +439,7 @@ int main(int argc, char *argv[])
        }
 
        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");
index 16a816a6f98b28873df6bc66d970d8d3fb2ae8da..3011416e34759d09aee27351575833a594aac591 100644 (file)
@@ -41,7 +41,7 @@ static int _handle_check_link_pmtud(knet_handle_t knet_h, struct knet_host *dst_
        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;
 
index d7b34430342778b6d0cb29c00131a63b82dc13ec..4cdf2ccc74bc0a6f55076cf00f77e409be858f6d 100644 (file)
@@ -474,6 +474,7 @@ out:
 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);
 
@@ -487,7 +488,11 @@ static void _close_socket(knet_handle_t knet_h, int 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)
index 8455a476d8643c554abe86319396e3e2523335dc..f55170d716f3fc9e42550e4ef7116e0a12d60f1c 100644 (file)
@@ -22,7 +22,7 @@
 
 #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)
index 5a0cbd030251b4eb427980e38406f0c3977456fd..2abac866d1be5237151947888a67f6a060e642d6 100644 (file)
@@ -1,5 +1,4 @@
 #include <netinet/in.h>
-#include <netinet/sctp.h>
 
 knet_transport_ops_t *get_udp_transport(void);