Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <darwintest.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/event.h> #include <sys/time.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <stdio.h> #include <unistd.h> T_GLOBAL_META( T_META_RUN_CONCURRENTLY(true), T_META_NAMESPACE("xnu.net"), T_META_RADAR_COMPONENT_NAME("xnu"), T_META_RADAR_COMPONENT_VERSION("networking")); #define TEST_ADDR "127.0.0.1" #define TEST_PORT 4242 static struct { int fd; struct sockaddr_in addr; } server; static void server_listen(void) { int r; server.fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); T_ASSERT_POSIX_SUCCESS(server.fd, "socket"); memset(&server.addr, 0, sizeof(server.addr)); server.addr.sin_family = AF_INET; server.addr.sin_port = htons(TEST_PORT); inet_pton(AF_INET, TEST_ADDR, &server.addr.sin_addr); r = bind(server.fd, (struct sockaddr*) &server.addr, sizeof(server.addr)); T_ASSERT_POSIX_SUCCESS(r, "bind"); } static void send_message(void) { int fd; struct msghdr msg; struct iovec iov; fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); T_ASSERT_POSIX_SUCCESS(fd, "socket"); memset(&msg, 0, sizeof(msg)); msg.msg_name = &server.addr; msg.msg_namelen = sizeof(server.addr); iov.iov_base = ""; iov.iov_len = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; ssize_t r = sendmsg(fd, &msg, 0); T_ASSERT_EQ(r, (ssize_t)iov.iov_len, "sendmsg"); close(fd); } static void server_poll(void) { int kq; struct kevent event = { .flags = EV_ADD, .filter = EVFILT_READ, .ident = (unsigned long)server.fd, }; int r; kq = kqueue(); T_ASSERT_POSIX_SUCCESS(kq, "kqueue"); /* Add and poll */ r = kevent(kq, &event, 1, &event, 1, NULL); T_EXPECT_EQ(r, 1, "should return an event"); close(kq); } T_DECL(socket_0byte_udp_poll_58140856, "Tests that 0-sized UDP packets wake up kevent") { T_LOG("Starting...\n"); /* Listen on UDP port */ server_listen(); T_LOG("Server bound to [%s]:%d\n", TEST_ADDR, TEST_PORT); /* Send 0-UDP packet to that port */ send_message(); T_LOG("Sent message to server\n"); /* Poll kqueue events */ server_poll(); T_LOG("Got kqueue event\n"); close(server.fd); } |