diff options
Diffstat (limited to 'src/libhydra/plugins/kernel_netlink/suites/test_socket.c')
-rw-r--r-- | src/libhydra/plugins/kernel_netlink/suites/test_socket.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/suites/test_socket.c b/src/libhydra/plugins/kernel_netlink/suites/test_socket.c index ceea6535d..c66aa2c02 100644 --- a/src/libhydra/plugins/kernel_netlink/suites/test_socket.c +++ b/src/libhydra/plugins/kernel_netlink/suites/test_socket.c @@ -41,6 +41,37 @@ bool netlink_msg_loss(struct nlmsghdr *hdr) START_TEST(test_echo) { netlink_socket_t *s; + struct nlmsghdr *out; + struct rtmsg *msg; + char dst[] = { + 127,0,0,1 + }; + size_t len; + netlink_buf_t request = { + .hdr = { + .nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)), + .nlmsg_flags = NLM_F_REQUEST, + .nlmsg_type = RTM_GETROUTE, + }, + }; + + msg = NLMSG_DATA(&request.hdr); + msg->rtm_family = AF_INET; + netlink_add_attribute(&request.hdr, RTA_DST, + chunk_from_thing(dst), sizeof(request)); + + s = netlink_socket_create(NETLINK_ROUTE, NULL); + + ck_assert(s->send(s, &request.hdr, &out, &len) == SUCCESS); + ck_assert_int_eq(out->nlmsg_type, RTM_NEWROUTE); + free(out); + s->destroy(s); +} +END_TEST + +START_TEST(test_echo_dump) +{ + netlink_socket_t *s; struct nlmsghdr *out, *current; struct rtgenmsg *msg; size_t len; @@ -76,6 +107,38 @@ END_TEST CALLBACK(stress, void*, netlink_socket_t *s) { + struct nlmsghdr *out; + struct rtmsg *msg; + char dst[] = { + 127,0,0,1 + }; + size_t len; + int i; + netlink_buf_t request = { + .hdr = { + .nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)), + .nlmsg_flags = NLM_F_REQUEST, + .nlmsg_type = RTM_GETROUTE, + }, + }; + + for (i = 0; i < 10; i++) + { + msg = NLMSG_DATA(&request.hdr); + msg->rtm_family = AF_INET; + netlink_add_attribute(&request.hdr, RTA_DST, + chunk_from_thing(dst), sizeof(request)); + + ck_assert(s->send(s, &request.hdr, &out, &len) == SUCCESS); + ck_assert_int_eq(out->nlmsg_type, RTM_NEWROUTE); + free(out); + } + return NULL; +} + +CALLBACK(stress_dump, void*, + netlink_socket_t *s) +{ struct nlmsghdr *out, *current; struct rtgenmsg *msg; size_t len; @@ -129,6 +192,25 @@ START_TEST(test_stress) } END_TEST +START_TEST(test_stress_dump) +{ + thread_t *threads[10]; + netlink_socket_t *s; + int i; + + s = netlink_socket_create(NETLINK_ROUTE, NULL); + for (i = 0; i < countof(threads); i++) + { + threads[i] = thread_create(stress_dump, s); + } + for (i = 0; i < countof(threads); i++) + { + threads[i]->join(threads[i]); + } + s->destroy(s); +} +END_TEST + START_TEST(test_retransmit_success) { netlink_socket_t *s; @@ -203,10 +285,12 @@ Suite *socket_suite_create() tc = tcase_create("echo"); tcase_add_test(tc, test_echo); + tcase_add_test(tc, test_echo_dump); suite_add_tcase(s, tc); tc = tcase_create("stress"); tcase_add_test(tc, test_stress); + tcase_add_test(tc, test_stress_dump); suite_add_tcase(s, tc); tc = tcase_create("retransmit"); |