2 * Test sw_bind "syscall".
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
15 #include "swift_raw.h"
16 #include "swift_types.h"
24 static void bind_dummy(void);
25 static void bind_invalid_descriptor(void);
26 static void bind_descriptor_not_a_socket(void);
27 static void bind_invalid_ip_address(void);
28 static void bind_ok(void);
29 static void bind_address_in_use(void);
30 static void bind_socket_already_bound(void);
32 void bind_test_suite(void)
36 bind_invalid_descriptor();
37 bind_descriptor_not_a_socket();
38 bind_invalid_ip_address();
40 bind_address_in_use();
41 bind_socket_already_bound();
44 static void bind_dummy(void)
49 static void bind_invalid_descriptor(void)
51 struct sockaddr_sw addr;
54 rc = sw_bind(-2, (struct sockaddr *) &addr, sizeof(addr));
56 test(rc < 0 && errno == EBADF);
59 static void bind_descriptor_not_a_socket(void)
61 struct sockaddr_sw addr;
62 int fd = dup(STDOUT_FILENO);
65 rc = sw_bind(fd, (struct sockaddr *) &addr, sizeof(addr));
68 * We are unable to properly handle checking whether the file
69 * descriptor is a socket in the raw socket based implementation.
70 * To be updated when porting to the kernel.
72 test(rc < 0 && errno == ENOTSOCK);
75 static void bind_invalid_ip_address(void)
77 struct sockaddr_sw addr;
81 sockfd = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
82 memset(&addr, 0, sizeof(addr));
83 addr.sin_family = AF_INET;
84 inet_pton(AF_INET, "254.254.254.254", &addr.sin_addr.s_addr);
85 rc = sw_bind(sockfd, (struct sockaddr *) &addr, sizeof(addr));
88 * We are unable to properly handle address validation in the raw
89 * socket based implementation.
90 * To be updated when porting to the kernel.
92 test(rc < 0 && errno == EADDRNOTAVAIL);
97 static void bind_ok(void)
99 struct sockaddr_sw addr;
103 sockfd = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
104 memset(&addr, 0, sizeof(addr));
105 addr.sin_family = AF_INET;
106 addr.sin_addr.s_addr = INADDR_ANY;
107 rc = sw_bind(sockfd, (struct sockaddr *) &addr, sizeof(addr));
114 static void bind_address_in_use(void)
116 struct sockaddr_sw addr1, addr2;
117 int sockfd1, sockfd2;
120 sockfd1 = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
121 memset(&addr1, 0, sizeof(addr1));
122 addr1.sin_family = AF_INET;
123 addr1.sin_addr.s_addr = INADDR_ANY;
124 rc = sw_bind(sockfd1, (struct sockaddr *) &addr1, sizeof(addr1));
125 dprintf("after first sw_bind rc = %d\n", rc);
127 sockfd2 = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
128 memset(&addr2, 0, sizeof(addr2));
129 addr2.sin_family = AF_INET;
130 addr2.sin_addr.s_addr = INADDR_ANY;
131 rc = sw_bind(sockfd2, (struct sockaddr *) &addr2, sizeof(addr2));
132 dprintf("after second sw_bind rc = %d\n", rc);
134 test(rc < 0 && errno == EADDRINUSE);
140 static void bind_socket_already_bound(void)
142 struct sockaddr_sw addr1, addr2;
146 sockfd = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
147 memset(&addr1, 0, sizeof(addr1));
148 addr1.sin_family = AF_INET;
149 addr1.sin_addr.s_addr = INADDR_ANY;
150 rc = sw_bind(sockfd, (struct sockaddr *) &addr1, sizeof(addr1));
152 memset(&addr2, 0, sizeof(addr2));
153 addr2.sin_family = AF_INET;
154 addr2.sin_addr.s_addr = INADDR_ANY;
155 addr2.sw_hash.h_array[0] = 0xFF; /* chage hash ("port") */
156 rc = sw_bind(sockfd, (struct sockaddr *) &addr2, sizeof(addr2));
158 test(rc < 0 && errno == EINVAL);