10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
15 #include "swift_types.h"
23 static void bind_dummy(void);
24 static void bind_invalid_descriptor(void);
25 static void bind_descriptor_not_a_socket(void);
26 static void bind_invalid_ip_address(void);
27 static void bind_ok(void);
28 static void bind_address_in_use(void);
29 static void bind_socket_already_bound(void);
31 void bind_test_suite(void)
35 bind_invalid_descriptor();
36 bind_descriptor_not_a_socket();
37 bind_invalid_ip_address();
39 bind_address_in_use();
40 bind_socket_already_bound();
43 static void bind_dummy(void)
48 static void bind_invalid_descriptor(void)
50 struct sockaddr_sw addr;
53 rc = bind(-2, (struct sockaddr *) &addr, sizeof(addr));
55 test(rc < 0 && errno == EBADF);
58 static void bind_descriptor_not_a_socket(void)
60 struct sockaddr_sw addr;
61 int fd = dup(STDOUT_FILENO);
64 rc = bind(fd, (struct sockaddr *) &addr, sizeof(addr));
67 * We are unable to properly handle checking whether the file
68 * descriptor is a socket in the raw socket based implementation.
69 * To be updated when porting to the kernel.
71 test(rc < 0 && errno == ENOTSOCK);
74 static void bind_invalid_ip_address(void)
76 struct sockaddr_sw addr;
80 sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
81 memset(&addr, 0, sizeof(addr));
82 addr.sin_family = AF_INET;
83 inet_pton(AF_INET, "254.254.254.254", &addr.sin_addr.s_addr);
84 rc = bind(sockfd, (struct sockaddr *) &addr, sizeof(addr));
87 * We are unable to properly handle address validation in the raw
88 * socket based implementation.
89 * To be updated when porting to the kernel.
91 test(rc < 0 && errno == EADDRNOTAVAIL);
96 static void bind_ok(void)
98 struct sockaddr_sw addr;
102 sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
103 memset(&addr, 0, sizeof(addr));
104 addr.sin_family = AF_INET;
105 addr.sin_addr.s_addr = INADDR_ANY;
106 rc = bind(sockfd, (struct sockaddr *) &addr, sizeof(addr));
113 static void bind_address_in_use(void)
115 struct sockaddr_sw addr1, addr2;
116 int sockfd1, sockfd2;
119 sockfd1 = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
120 memset(&addr1, 0, sizeof(addr1));
121 addr1.sin_family = AF_INET;
122 addr1.sin_addr.s_addr = INADDR_ANY;
123 rc = bind(sockfd1, (struct sockaddr *) &addr1, sizeof(addr1));
124 dprintf("after first bind rc = %d\n", rc);
126 sockfd2 = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
127 memset(&addr2, 0, sizeof(addr2));
128 addr2.sin_family = AF_INET;
129 addr2.sin_addr.s_addr = INADDR_ANY;
130 rc = bind(sockfd2, (struct sockaddr *) &addr2, sizeof(addr2));
131 dprintf("after second bind rc = %d\n", rc);
133 test(rc < 0 && errno == EADDRINUSE);
139 static void bind_socket_already_bound(void)
141 struct sockaddr_sw addr1, addr2;
145 sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
146 memset(&addr1, 0, sizeof(addr1));
147 addr1.sin_family = AF_INET;
148 addr1.sin_addr.s_addr = INADDR_ANY;
149 rc = bind(sockfd, (struct sockaddr *) &addr1, sizeof(addr1));
151 memset(&addr2, 0, sizeof(addr2));
152 addr2.sin_family = AF_INET;
153 addr2.sin_addr.s_addr = INADDR_ANY;
154 addr2.sw_hash.h_array[0] = 0xFF; /* chage hash ("port") */
155 rc = bind(sockfd, (struct sockaddr *) &addr2, sizeof(addr2));
157 test(rc < 0 && errno == EINVAL);