Skip to content

Commit

Permalink
[transports] add support for SCTP one-to-many
Browse files Browse the repository at this point in the history
Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Feb 14, 2017
1 parent 2ab89c6 commit eda900a
Show file tree
Hide file tree
Showing 8 changed files with 670 additions and 6 deletions.
1 change: 1 addition & 0 deletions libknet/Makefile.am
Expand Up @@ -40,6 +40,7 @@ sources = \
threads_tx.c \
transport_udp.c \
transport_sctp.c \
transport_sctp_many.c \
transport_common.c

include_HEADERS = libknet.h
Expand Down
3 changes: 3 additions & 0 deletions libknet/handle.c
Expand Up @@ -380,6 +380,9 @@ static int _start_transports(knet_handle_t knet_h)
case KNET_TRANSPORT_SCTP:
knet_h->transport_ops[i] = get_sctp_transport();
break;
case KNET_TRANSPORT_SCTP_MANY:
knet_h->transport_ops[i] = get_sctp_many_transport();
break;
}

if (knet_h->transport_ops[i]) {
Expand Down
7 changes: 4 additions & 3 deletions libknet/libknet.h
Expand Up @@ -927,9 +927,10 @@ int knet_addrtostr(const struct sockaddr_storage *ss, socklen_t sslen,
* -1 on error and errno is set.
*/

#define KNET_TRANSPORT_UDP 0
#define KNET_TRANSPORT_SCTP 1
#define KNET_MAX_TRANSPORTS 2
#define KNET_TRANSPORT_UDP 0
#define KNET_TRANSPORT_SCTP 1
#define KNET_TRANSPORT_SCTP_MANY 2
#define KNET_MAX_TRANSPORTS 3

struct transport_info {
const char *name; /* UDP/SCTP/etc... */
Expand Down
2 changes: 1 addition & 1 deletion libknet/tests/api_knet_handle_get_transport_list.c
Expand Up @@ -88,7 +88,7 @@ static void test(void)

expected_count = KNET_MAX_TRANSPORTS;
#ifndef HAVE_NETINET_SCTP_H
expected_count--;
expected_count = expected_count - 2;
#endif

if (transport_list_entries != expected_count) {
Expand Down
168 changes: 168 additions & 0 deletions libknet/tests/api_knet_link_set_enable.c
Expand Up @@ -346,6 +346,170 @@ static void test_sctp(void)
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
}

static void test_sctp_many(void)
{
knet_handle_t knet_h;
int logfds[2];
struct sockaddr_storage src, dst;

memset(&src, 0, sizeof(struct sockaddr_storage));

if (knet_strtoaddr("127.0.0.1", "50000", &src, sizeof(struct sockaddr_storage)) < 0) {
printf("Unable to convert src to sockaddr: %s\n", strerror(errno));
exit(FAIL);
}

memset(&dst, 0, sizeof(struct sockaddr_storage));

if (knet_strtoaddr("127.0.0.1", "50000", &dst, sizeof(struct sockaddr_storage)) < 0) {
printf("Unable to convert dst to sockaddr: %s\n", strerror(errno));
exit(FAIL);
}

printf("Test knet_link_set_enable incorrect knet_h\n");

if ((!knet_link_set_enable(NULL, 1, 0, 1)) || (errno != EINVAL)) {
printf("knet_link_set_enable accepted invalid knet_h or returned incorrect error: %s\n", strerror(errno));
exit(FAIL);
}

setup_logpipes(logfds);

knet_h = knet_handle_new(1, logfds[1], KNET_LOG_DEBUG);

if (!knet_h) {
printf("knet_handle_new failed: %s\n", strerror(errno));
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

printf("Test knet_link_set_enable with unconfigured host_id\n");

if ((!knet_link_set_enable(knet_h, 1, 0, 1)) || (errno != EINVAL)) {
printf("knet_link_set_enable accepted invalid host_id or returned incorrect error: %s\n", strerror(errno));
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

flush_logs(logfds[0], stdout);

printf("Test knet_link_set_enable with incorrect linkid\n");

if (knet_host_add(knet_h, 1) < 0) {
printf("Unable to add host_id 1: %s\n", strerror(errno));
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

if ((!knet_link_set_enable(knet_h, 1, KNET_MAX_LINK, 1)) || (errno != EINVAL)) {
printf("knet_link_set_enable accepted invalid linkid or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

flush_logs(logfds[0], stdout);

printf("Test knet_link_set_enable with unconfigured link\n");

if ((!knet_link_set_enable(knet_h, 1, 0, 1)) || (errno != EINVAL)) {
printf("knet_link_set_enable accepted unconfigured link or returned incorrect error: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

flush_logs(logfds[0], stdout);

printf("Test knet_link_set_enable with incorrect values\n");

if (knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_SCTP_MANY, &src, &dst) < 0) {
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

if ((!knet_link_set_enable(knet_h, 1, 0, 2)) || (errno != EINVAL)) {
printf("knet_link_set_enable accepted incorrect value for enabled or returned incorrect error: %s\n", strerror(errno));
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

flush_logs(logfds[0], stdout);

printf("Test knet_link_set_enable with correct values (1)\n");

if (knet_link_set_enable(knet_h, 1, 0, 1) < 0) {
printf("knet_link_set_enable failed: %s\n", strerror(errno));
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

if (knet_h->host_index[1]->link[0].status.enabled != 1) {
printf("knet_link_set_enable failed to set correct values\n");
knet_link_set_enable(knet_h, 1, 0, 0);
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

printf("Wait 2 seconds for sockets to connect\n");
sleep(2);

printf("Test knet_link_set_enable with correct values (0)\n");

if (knet_link_set_enable(knet_h, 1, 0, 0) < 0) {
printf("knet_link_set_enable failed: %s\n", strerror(errno));
knet_link_set_enable(knet_h, 1, 0, 0);
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

if (knet_h->host_index[1]->link[0].status.enabled != 0) {
printf("knet_link_set_enable failed to set correct values\n");
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

knet_link_set_enable(knet_h, 1, 0, 0);
knet_link_clear_config(knet_h, 1, 0);
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
}
#endif

int main(int argc, char *argv[])
Expand All @@ -360,6 +524,10 @@ int main(int argc, char *argv[])
printf("Testing with SCTP\n");

test_sctp();

printf("Testing with SCTP_MANY\n");

test_sctp_many();
#else
printf("Skipping SCTP test. Protocol not supported in this build\n");
#endif
Expand Down
8 changes: 6 additions & 2 deletions libknet/tests/knet_bench.c
Expand Up @@ -58,7 +58,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] (default: udp) protocol (transport) to use\n");
printf(" -P [udp|sctp|sctp_many] (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");
Expand Down Expand Up @@ -220,8 +220,12 @@ static void setup_knet(int argc, char *argv[])
protocol = KNET_TRANSPORT_SCTP;
protofound = 1;
}
if (!strcmp(protostr, "sctp_many")) {
protocol = KNET_TRANSPORT_SCTP_MANY;
protofound = 1;
}
if (!protofound) {
printf("Error: invalid protocol %s specified. -P accepts udp|sctp\n", policystr);
printf("Error: invalid protocol %s specified. -P accepts udp|sctp|sctp_many\n", policystr);
exit(FAIL);
}
break;
Expand Down

0 comments on commit eda900a

Please sign in to comment.