1 2int pico_aodv_init(void) 3{ 4 return 0; 5} 6START_TEST (test_socket) 7{ 8 int ret = 0; 9 uint16_t port_be = 0, porta, proto, port_got; 10 char buf[] = "test"; 11 struct pico_socket *sk_tcp, *sk_udp, *s, *sl, *sa; 12 struct pico_device *dev; 13 struct pico_ip4 inaddr_dst, inaddr_link, inaddr_incorrect, inaddr_uni, inaddr_null, netmask, orig, inaddr_got; 14 15 int getnodelay = -1; 16 int nodelay = -1; 17 int count = 0; 18 19 uint32_t getsocket_buffer = 0; 20 uint32_t socket_buffer = 0; 21 22 pico_stack_init(); 23 24 printf("START SOCKET TEST\n"); 25 26 pico_string_to_ipv4("224.7.7.7", &inaddr_dst.addr); 27 pico_string_to_ipv4("10.40.0.2", &inaddr_link.addr); 28 pico_string_to_ipv4("224.8.8.8", &inaddr_incorrect.addr); 29 pico_string_to_ipv4("0.0.0.0", &inaddr_null.addr); 30 pico_string_to_ipv4("10.40.0.3", &inaddr_uni.addr); 31 32 dev = pico_null_create("dummy"); 33 netmask.addr = long_be(0xFFFF0000); 34 ret = pico_ipv4_link_add(dev, inaddr_link, netmask); 35 fail_if(ret < 0, "socket> error adding link"); 36 37 38 /* socket_open passing wrong parameters */ 39 s = pico_socket_open(PICO_PROTO_IPV4, 99, NULL); 40 fail_if(s != NULL, "Error got socket wrong parameters"); 41 42 s = pico_socket_open(PICO_PROTO_IPV4, 0xFFFF, NULL); 43 fail_if(s != NULL, "Error got socket"); 44 45 s = pico_socket_open(99, PICO_PROTO_UDP, NULL); 46 fail_if(s != NULL, "Error got socket"); 47 48 s = pico_socket_open(0xFFFF, PICO_PROTO_UDP, NULL); 49 fail_if(s != NULL, "Error got socket"); 50 51 52 sk_tcp = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, NULL); 53 fail_if(sk_tcp == NULL, "socket> tcp socket open failed"); 54 55 56 port_be = short_be(5555); 57 /* socket_bind passing wrong parameters */ 58 ret = pico_socket_bind(NULL, &inaddr_link, &port_be); 59 fail_if(ret == 0, "socket> tcp socket bound wrong parameter"); 60 ret = pico_socket_bind(sk_tcp, NULL, &port_be); 61 fail_if(ret == 0, "socket> tcp socket bound wrong parameter"); 62 ret = pico_socket_bind(sk_tcp, &inaddr_link, NULL); 63 fail_if(ret == 0, "socket> tcp socket bound wrong parameter"); 64 /* socket_getname passing wrong parameters */ 65 ret = pico_socket_getname(NULL, &inaddr_link, &port_be, &proto); 66 fail_if(ret == 0, "socket> tcp socket getname with wrong parameter"); 67 ret = pico_socket_getname(sk_tcp, NULL, &port_be, &proto); 68 fail_if(ret == 0, "socket> tcp socket getname with wrong parameter"); 69 ret = pico_socket_getname(sk_tcp, &inaddr_link, NULL, &proto); 70 fail_if(ret == 0, "socket> tcp socket getname with wrong parameter"); 71 ret = pico_socket_getname(sk_tcp, &inaddr_link, &port_be, NULL); 72 fail_if(ret == 0, "socket> tcp socket getname with wrong parameter"); 73 /* socket_bind passing correct parameters */ 74 ret = pico_socket_bind(sk_tcp, &inaddr_link, &port_be); 75 fail_if(ret < 0, "socket> tcp socket bind failed"); 76 count = pico_count_sockets(PICO_PROTO_TCP); 77 printf("Count: %d\n", count); 78 fail_unless(count == 1); 79 count = pico_count_sockets(0); 80 printf("Count: %d\n", count); 81 fail_unless(count == 1); 82 83 sk_udp = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_UDP, NULL); 84 fail_if(sk_udp == NULL, "socket> udp socket open failed"); 85 86 port_be = short_be(5555); 87 ret = pico_socket_bind(sk_udp, &inaddr_link, &port_be); 88 fail_if(ret < 0, "socket> udp socket bind failed"); 89 90 fail_if (pico_count_sockets(PICO_PROTO_UDP) != 1); 91 fail_if (pico_count_sockets(0) != 2); 92 93 94 ret = pico_socket_getname(sk_udp, &inaddr_got, &port_got, &proto); 95 fail_if(ret < 0, "socket> udp socket getname failed"); 96 fail_if(inaddr_got.addr != inaddr_link.addr, "Getname: Address is different"); 97 fail_if(port_be != port_got, "Getname: Port is different"); 98 fail_if(proto != PICO_PROTO_IPV4, "Getname: proto is wrong"); 99 100 /* socket_close passing wrong parameter */ 101 ret = pico_socket_close(NULL); 102 fail_if(ret == 0, "Error socket close with wrong parameters"); 103 104 105 /* socket_connect passing wrong parameters */ 106 ret = pico_socket_connect(sk_udp, NULL, port_be); 107 fail_if(ret == 0, "Error socket connect with wrong parameters"); 108 ret = pico_socket_connect(NULL, &inaddr_dst, port_be); 109 fail_if(ret == 0, "Error socket connect with wrong parameters"); 110 111 /* socket_connect passing correct parameters */ 112 ret = pico_socket_connect(sk_udp, &inaddr_dst, port_be); 113 fail_if(ret < 0, "Error socket connect"); 114 ret = pico_socket_connect(sk_tcp, &inaddr_dst, port_be); 115 fail_if(ret < 0, "Error socket connect"); 116 117 118 /* testing listening socket */ 119 sl = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, NULL); 120 fail_if(sl == NULL, "socket> tcp socket open failed"); 121 port_be = short_be(6666); 122 ret = pico_socket_bind(sl, &inaddr_link, &port_be); 123 fail_if(ret < 0, "socket> tcp socket bind failed"); 124 /* socket_listen passing wrong parameters */ 125 ret = pico_socket_listen(sl, 0); 126 fail_if(ret == 0, "Error socket tcp socket listen done, wrong parameter"); 127 ret = pico_socket_listen(NULL, 10); 128 fail_if(ret == 0, "Error socket tcp socket listen done, wrong parameter"); 129 /* socket_listen passing correct parameters */ 130 ret = pico_socket_listen(sl, 10); 131 fail_if(ret < 0, "socket> tcp socket listen failed: %s", strerror(pico_err)); 132 133 /* socket_accept passing wrong parameters */ 134 sa = pico_socket_accept(sl, &orig, NULL); 135 fail_if(sa != NULL, "Error socket tcp socket accept wrong argument"); 136 sa = pico_socket_accept(sl, NULL, &porta); 137 fail_if(sa != NULL, "Error socket tcp socket accept wrong argument"); 138 /* socket_accept passing correct parameters */ 139 sa = pico_socket_accept(sl, &orig, &porta); 140 fail_if(sa == NULL && pico_err != PICO_ERR_EAGAIN, "socket> tcp socket accept failed: %s", strerror(pico_err)); 141 142 ret = pico_socket_close(sl); 143 fail_if(ret < 0, "socket> tcp socket close failed: %s\n", strerror(pico_err)); 144 145 146 /* testing socket read/write */ 147 /* socket_write passing wrong parameters */ 148 ret = pico_socket_write(NULL, (void *)buf, sizeof(buf)); 149 fail_if(ret == 0, "Error socket write succeeded, wrong argument\n"); 150 ret = pico_socket_write(sk_tcp, NULL, sizeof(buf)); 151 fail_if(ret == 0, "Error socket write succeeded, wrong argument\n"); 152 ret = pico_socket_write(sk_tcp, (void *)buf, 0); 153 fail_if(ret > 0, "Error socket write succeeded, wrong argument\n"); 154 /* socket_write passing correct parameters */ 155 ret = pico_socket_write(sk_tcp, (void *)buf, sizeof(buf)); 156 fail_if(ret < 0, "socket> tcp socket write failed: %s\n", strerror(pico_err)); 157 /* socket_read passing wrong parameters */ 158 ret = pico_socket_read(NULL, (void *)buf, sizeof(buf)); 159 fail_if(ret == 0, "Error socket read succeeded, wrong argument\n"); 160 ret = pico_socket_read(sk_tcp, NULL, sizeof(buf)); 161 fail_if(ret == 0, "Error socket read succeeded, wrong argument\n"); 162 ret = pico_socket_read(sk_tcp, (void *)buf, 0); 163 fail_if(ret > 0, "Error socket read succeeded, wrong argument\n"); 164 /* socket_read passing correct parameters */ 165 ret = pico_socket_read(sk_tcp, (void *)buf, sizeof(buf)); 166 fail_if(ret < 0, "socket> tcp socket read failed, ret = %d: %s\n", ret, strerror(pico_err)); /* tcp_recv returns 0 when no frame !? */ 167 168 169 /* send/recv */ 170 /* socket_send passing wrong parameters */ 171 ret = pico_socket_send(NULL, (void *)buf, sizeof(buf)); 172 fail_if(ret == 0, "Error socket send succeeded, wrong argument\n"); 173 ret = pico_socket_send(sk_tcp, NULL, sizeof(buf)); 174 fail_if(ret == 0, "Error socket send succeeded, wrong argument\n"); 175 ret = pico_socket_send(sk_tcp, (void *)buf, 0); 176 fail_if(ret > 0, "Error socket send succeeded, wrong argument\n"); 177 /* socket_write passing correct parameters */ 178 ret = pico_socket_send(sk_tcp, (void *)buf, sizeof(buf)); 179 fail_if(ret <= 0, "socket> tcp socket send failed: %s\n", strerror(pico_err)); 180 /* socket_recv passing wrong parameters */ 181 ret = pico_socket_recv(NULL, (void *)buf, sizeof(buf)); 182 fail_if(ret == 0, "Error socket recv succeeded, wrong argument\n"); 183 ret = pico_socket_recv(sk_tcp, NULL, sizeof(buf)); 184 fail_if(ret == 0, "Error socket recv succeeded, wrong argument\n"); 185 ret = pico_socket_recv(sk_tcp, (void *)buf, 0); 186 fail_if(ret > 0, "Error socket recv succeeded, wrong argument\n"); 187 /* socket_recv passing correct parameters */ 188 ret = pico_socket_recv(sk_tcp, (void *)buf, sizeof(buf)); 189 fail_if(ret < 0, "socket> tcp socket recv failed, ret = %d: %s\n", ret, strerror(pico_err)); /* tcp_recv returns 0 when no frame !? */ 190 191 192 /* sendto/recvfrom */ 193 /* socket_sendto passing wrong parameters */ 194 ret = pico_socket_sendto(NULL, (void *)buf, sizeof(buf), &inaddr_dst, port_be); 195 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 196 ret = pico_socket_sendto(sk_tcp, NULL, sizeof(buf), &inaddr_dst, port_be); 197 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 198 ret = pico_socket_sendto(sk_tcp, (void *)buf, 0, &inaddr_dst, port_be); 199 fail_if(ret > 0, "Error socket sendto succeeded, wrong argument\n"); 200 ret = pico_socket_sendto(sk_tcp, (void *)buf, sizeof(buf), NULL, port_be); 201 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 202 ret = pico_socket_sendto(sk_tcp, (void *)buf, sizeof(buf), &inaddr_dst, 0xFFFF); 203 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 204 /* socket_write passing correct parameters */ 205 ret = pico_socket_sendto(sk_tcp, (void *)buf, sizeof(buf), &inaddr_dst, short_be(5555)); 206 fail_if(ret <= 0, "socket> udp socket sendto failed, ret = %d: %s\n", ret, strerror(pico_err)); 207 /* socket_recvfrom passing wrong parameters */ 208 ret = pico_socket_recvfrom(NULL, (void *)buf, sizeof(buf), &orig, &porta); 209 fail_if(ret >= 0, "Error socket recvfrom succeeded, wrong argument\n"); 210 ret = pico_socket_recvfrom(sk_tcp, NULL, sizeof(buf), &orig, &porta); 211 fail_if(ret >= 0, "Error socket recvfrom succeeded, wrong argument\n"); 212 ret = pico_socket_recvfrom(sk_tcp, (void *)buf, 0, &orig, &porta); 213 fail_if(ret > 0, "Error socket recvfrom succeeded, wrong argument\n"); 214 ret = pico_socket_recvfrom(sk_tcp, (void *)buf, sizeof(buf), NULL, &porta); 215 fail_if(ret > 0, "Error socket recvfrom succeeded, wrong argument\n"); 216 ret = pico_socket_recvfrom(sk_tcp, (void *)buf, sizeof(buf), &orig, NULL); 217 fail_if(ret > 0, "Error socket recvfrom succeeded, wrong argument\n"); 218 /* socket_recvfrom passing correct parameters */ 219 ret = pico_socket_recvfrom(sk_tcp, (void *)buf, sizeof(buf), &orig, &porta); 220 fail_if(ret != 0, "socket> tcp socket recvfrom failed, ret = %d: %s\n", ret, strerror(pico_err)); /* tcp_recv returns -1 when no frame !? */ 221 222 223 /* testing socket read/write */ 224 /* socket_write passing wrong parameters */ 225 ret = pico_socket_write(NULL, (void *)buf, sizeof(buf)); 226 fail_if(ret == 0, "Error socket write succeeded, wrong argument\n"); 227 ret = pico_socket_write(sk_udp, NULL, sizeof(buf)); 228 fail_if(ret == 0, "Error socket write succeeded, wrong argument\n"); 229 ret = pico_socket_write(sk_udp, (void *)buf, 0); 230 fail_if(ret > 0, "Error socket write succeeded, wrong argument\n"); 231 /* socket_write passing correct parameters */ 232 ret = pico_socket_write(sk_udp, (void *)buf, sizeof(buf)); 233 fail_if(ret < 0, "socket> tcp socket write failed: %s\n", strerror(pico_err)); 234 /* socket_read passing wrong parameters */ 235 ret = pico_socket_read(NULL, (void *)buf, sizeof(buf)); 236 fail_if(ret == 0, "Error socket read succeeded, wrong argument\n"); 237 ret = pico_socket_read(sk_udp, NULL, sizeof(buf)); 238 fail_if(ret == 0, "Error socket read succeeded, wrong argument\n"); 239 ret = pico_socket_read(sk_udp, (void *)buf, 0); 240 fail_if(ret > 0, "Error socket read succeeded, wrong argument\n"); 241 ret = pico_socket_read(sk_udp, (void *)buf, 0xFFFF + 1); 242 fail_if(ret >= 0, "Error socket read succeeded while len was > 0xFFFF"); 243 /* socket_read passing correct parameters */ 244 ret = pico_socket_read(sk_udp, (void *)buf, sizeof(buf)); 245 fail_if(ret != 0, "socket> udp socket read failed, ret = %d: %s\n", ret, strerror(pico_err)); 246 247 248 /* send/recv */ 249 /* socket_send passing wrong parameters */ 250 ret = pico_socket_send(NULL, (void *)buf, sizeof(buf)); 251 fail_if(ret == 0, "Error socket send succeeded, wrong argument\n"); 252 ret = pico_socket_send(sk_udp, NULL, sizeof(buf)); 253 fail_if(ret == 0, "Error socket send succeeded, wrong argument\n"); 254 ret = pico_socket_send(sk_udp, (void *)buf, 0); 255 fail_if(ret > 0, "Error socket send succeeded, wrong argument\n"); 256 /* socket_write passing correct parameters */ 257 ret = pico_socket_send(sk_udp, (void *)buf, sizeof(buf)); 258 fail_if(ret <= 0, "socket> tcp socket send failed: %s\n", strerror(pico_err)); 259 /* socket_recv passing wrong parameters */ 260 ret = pico_socket_recv(NULL, (void *)buf, sizeof(buf)); 261 fail_if(ret == 0, "Error socket recv succeeded, wrong argument\n"); 262 ret = pico_socket_recv(sk_udp, NULL, sizeof(buf)); 263 fail_if(ret == 0, "Error socket recv succeeded, wrong argument\n"); 264 ret = pico_socket_recv(sk_udp, (void *)buf, 0); 265 fail_if(ret > 0, "Error socket recv succeeded, wrong argument\n"); 266 ret = pico_socket_recv(sk_udp, (void *)buf, 0xFFFF + 1); 267 fail_if(ret >= 0, "Error socket recv succeeded while len was > 0xFFFF"); 268 /* socket_recv passing correct parameters */ 269 ret = pico_socket_recv(sk_udp, (void *)buf, sizeof(buf)); 270 fail_if(ret != 0, "socket> udp socket recv failed, ret = %d: %s\n", ret, strerror(pico_err)); 271 272 273 /* sendto/recvfrom */ 274 /* socket_sendto passing wrong parameters */ 275 ret = pico_socket_sendto(NULL, (void *)buf, sizeof(buf), &inaddr_dst, port_be); 276 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 277 ret = pico_socket_sendto(sk_udp, NULL, sizeof(buf), &inaddr_dst, port_be); 278 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 279 ret = pico_socket_sendto(sk_udp, (void *)buf, 0, &inaddr_dst, port_be); 280 fail_if(ret > 0, "Error socket sendto succeeded, wrong argument\n"); 281 ret = pico_socket_sendto(sk_udp, (void *)buf, sizeof(buf), NULL, port_be); 282 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 283 ret = pico_socket_sendto(sk_udp, (void *)buf, sizeof(buf), &inaddr_dst, 0xFFFF); 284 fail_if(ret >= 0, "Error socket sendto succeeded, wrong argument\n"); 285 /* socket_write passing correct parameters */ 286 ret = pico_socket_sendto(sk_udp, (void *)buf, sizeof(buf), &inaddr_dst, short_be(5555)); 287 fail_if(ret <= 0, "socket> udp socket sendto failed, ret = %d: %s\n", ret, strerror(pico_err)); 288 /* socket_recvfrom passing wrong parameters */ 289 ret = pico_socket_recvfrom(NULL, (void *)buf, sizeof(buf), &orig, &porta); 290 fail_if(ret >= 0, "Error socket recvfrom succeeded, wrong argument\n"); 291 ret = pico_socket_recvfrom(sk_udp, NULL, sizeof(buf), &orig, &porta); 292 fail_if(ret >= 0, "Error socket recvfrom succeeded, wrong argument\n"); 293 ret = pico_socket_recvfrom(sk_udp, (void *)buf, 0xFFFF + 1, &orig, &porta); 294 fail_if(ret >= 0, "Error socket recvfrom succeeded while len was > 0xFFFF"); 295 /* socket_recvfrom passing correct parameters */ 296 ret = pico_socket_recvfrom(sk_udp, (void *)buf, 0, &orig, &porta); 297 fail_if(ret != 0, "socket> udp socket recvfrom failed, ret = %d: %s\n", ret, strerror(pico_err)); 298 ret = pico_socket_recvfrom(sk_udp, (void *)buf, sizeof(buf), &orig, &porta); 299 fail_if(ret != 0, "socket> udp socket recvfrom failed, ret = %d: %s\n", ret, strerror(pico_err)); 300 301 /* temporary fix, until Nagle problems are analyzed and fixed */ 302 { 303 nodelay = 0; 304 ret = pico_socket_setoption(sk_tcp, PICO_TCP_NODELAY, &nodelay); 305 } 306 307 /* setoption/getoption */ 308 ret = pico_socket_getoption(sk_tcp, PICO_TCP_NODELAY, &getnodelay); 309 fail_if(ret < 0, "socket> socket_getoption: supported PICO_TCP_NODELAY failed (err = %s)\n", strerror(pico_err)); 310 fail_if(getnodelay != 0, "socket> socket_setoption: default PICO_TCP_NODELAY != 0 (nagle disabled by default)\n"); 311 312 nodelay = 1; 313 ret = pico_socket_setoption(sk_tcp, PICO_TCP_NODELAY, &nodelay); 314 fail_if(ret < 0, "socket> socket_setoption: supported PICO_TCP_NODELAY failed\n"); 315 ret = pico_socket_getoption(sk_tcp, PICO_TCP_NODELAY, &getnodelay); 316 fail_if(ret < 0, "socket> socket_getoption: supported PICO_TCP_NODELAY failed\n"); 317 fail_if(getnodelay == 0, "socket> socket_setoption: PICO_TCP_NODELAY is off (expected: on!)\n"); 318 319 nodelay = 0; 320 ret = pico_socket_setoption(sk_tcp, PICO_TCP_NODELAY, &nodelay); 321 fail_if(ret < 0, "socket> socket_setoption: supported PICO_TCP_NODELAY failed\n"); 322 ret = pico_socket_getoption(sk_tcp, PICO_TCP_NODELAY, &getnodelay); 323 fail_if(ret < 0, "socket> socket_getoption: supported PICO_TCP_NODELAY failed\n"); 324 fail_if(getnodelay != 0, "socket> socket_setoption: PICO_TCP_NODELAY is on (expected: off!)\n"); 325 326 327 /* Set/get recv buffer (TCP) */ 328 ret = pico_socket_getoption(sk_tcp, PICO_SOCKET_OPT_RCVBUF, &getsocket_buffer); 329 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 330 fail_if(getsocket_buffer != PICO_DEFAULT_SOCKETQ, 331 "socket> socket_setoption: default PICO_SOCKET_OPT_SNDBUF != DEFAULT\n"); 332 333 socket_buffer = PICO_DEFAULT_SOCKETQ; 334 ret = pico_socket_setoption(sk_tcp, PICO_SOCKET_OPT_RCVBUF, &socket_buffer); 335 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 336 ret = pico_socket_getoption(sk_tcp, PICO_SOCKET_OPT_RCVBUF, &getsocket_buffer); 337 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 338 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_RCVBUF is != than expected\n"); 339 340 socket_buffer = 2 * PICO_DEFAULT_SOCKETQ; 341 ret = pico_socket_setoption(sk_tcp, PICO_SOCKET_OPT_RCVBUF, &socket_buffer); 342 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 343 ret = pico_socket_getoption(sk_tcp, PICO_SOCKET_OPT_RCVBUF, &getsocket_buffer); 344 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 345 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_RCVBUF is != than expected\n"); 346 347 /* Set/get send buffer (TCP) */ 348 ret = pico_socket_getoption(sk_tcp, PICO_SOCKET_OPT_SNDBUF, &getsocket_buffer); 349 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 350 fail_if(getsocket_buffer != PICO_DEFAULT_SOCKETQ, 351 "socket> socket_setoption: default PICO_SOCKET_OPT_SNDBUF != DEFAULT got: %d exp: %d\n", getsocket_buffer, PICO_DEFAULT_SOCKETQ); 352 353 socket_buffer = PICO_DEFAULT_SOCKETQ; 354 ret = pico_socket_setoption(sk_tcp, PICO_SOCKET_OPT_SNDBUF, &socket_buffer); 355 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 356 ret = pico_socket_getoption(sk_tcp, PICO_SOCKET_OPT_SNDBUF, &getsocket_buffer); 357 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 358 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_SNDBUF is != than expected\n"); 359 360 socket_buffer = 2 * PICO_DEFAULT_SOCKETQ; 361 ret = pico_socket_setoption(sk_tcp, PICO_SOCKET_OPT_SNDBUF, &socket_buffer); 362 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 363 ret = pico_socket_getoption(sk_tcp, PICO_SOCKET_OPT_SNDBUF, &getsocket_buffer); 364 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 365 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_SNDBUF is != than expected\n"); 366 367 /* Set/get recv buffer (UDP) */ 368 ret = pico_socket_getoption(sk_udp, PICO_SOCKET_OPT_RCVBUF, &getsocket_buffer); 369 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 370 fail_if(getsocket_buffer != PICO_DEFAULT_SOCKETQ, 371 "socket> socket_setoption: default PICO_SOCKET_OPT_SNDBUF != DEFAULT\n"); 372 373 socket_buffer = PICO_DEFAULT_SOCKETQ; 374 ret = pico_socket_setoption(sk_udp, PICO_SOCKET_OPT_RCVBUF, &socket_buffer); 375 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 376 ret = pico_socket_getoption(sk_udp, PICO_SOCKET_OPT_RCVBUF, &getsocket_buffer); 377 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 378 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_RCVBUF is != than expected\n"); 379 380 socket_buffer = 2 * PICO_DEFAULT_SOCKETQ; 381 ret = pico_socket_setoption(sk_udp, PICO_SOCKET_OPT_RCVBUF, &socket_buffer); 382 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 383 ret = pico_socket_getoption(sk_udp, PICO_SOCKET_OPT_RCVBUF, &getsocket_buffer); 384 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_RCVBUF failed\n"); 385 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_RCVBUF is != than expected\n"); 386 387 /* Set/get send buffer (UDP) */ 388 ret = pico_socket_getoption(sk_udp, PICO_SOCKET_OPT_SNDBUF, &getsocket_buffer); 389 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 390 fail_if(getsocket_buffer != PICO_DEFAULT_SOCKETQ, 391 "socket> socket_setoption: default PICO_SOCKET_OPT_SNDBUF != DEFAULT\n"); 392 393 socket_buffer = PICO_DEFAULT_SOCKETQ; 394 ret = pico_socket_setoption(sk_udp, PICO_SOCKET_OPT_SNDBUF, &socket_buffer); 395 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 396 ret = pico_socket_getoption(sk_udp, PICO_SOCKET_OPT_SNDBUF, &getsocket_buffer); 397 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 398 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_SNDBUF is != than expected\n"); 399 400 socket_buffer = 2 * PICO_DEFAULT_SOCKETQ; 401 ret = pico_socket_setoption(sk_udp, PICO_SOCKET_OPT_SNDBUF, &socket_buffer); 402 fail_if(ret < 0, "socket> socket_setoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 403 ret = pico_socket_getoption(sk_udp, PICO_SOCKET_OPT_SNDBUF, &getsocket_buffer); 404 fail_if(ret < 0, "socket> socket_getoption: supported PICO_SOCKET_OPT_SNDBUF failed\n"); 405 fail_if(getsocket_buffer != socket_buffer, "UDP socket> socket_setoption: PICO_SOCKET_OPT_SNDBUF is != than expected\n"); 406 407 /* Close sockets, eventually. */ 408 ret = pico_socket_close(sk_tcp); 409 fail_if(ret < 0, "socket> tcp socket close failed: %s\n", strerror(pico_err)); 410 ret = pico_socket_close(sk_udp); 411 fail_if(ret < 0, "socket> udp socket close failed: %s\n", strerror(pico_err)); 412} 413END_TEST 414 415#ifdef PICO_SUPPORT_CRC_FAULTY_UNIT_TEST 416START_TEST (test_crc_check) 417{ 418 uint8_t buffer[64] = { 419 0x45, 0x00, 0x00, 0x40, /* start of IP hdr */ 420 0x91, 0xc3, 0x40, 0x00, 421 0x40, 0x11, 0x24, 0xcf, /* last 2 bytes are CRC */ 422 0xc0, 0xa8, 0x01, 0x66, 423 0xc0, 0xa8, 0x01, 0x64, /* end of IP hdr */ 424 0x15, 0xb3, 0x1F, 0x90, /* start of UDP/TCP hdr */ 425 0x00, 0x2c, 0x27, 0x22, /* end of UDP hdr */ 426 0x00, 0x00, 0x00, 0x00, 427 0x00, 0x00, 0x00, 0x00, 428 0x00, 0x0b, 0x00, 0x00, 429 0x00, 0x00, 0x00, 0x00, 430 0x00, 0x00, 0x00, 0x00, 431 0x00, 0x00, 0x00, 0x00, /* end of TCP hdr */ 432 0x01, 0x23, 0x45, 0x67, /* start of data */ 433 0x89, 0xab, 0xcd, 0xef, 434 0xc0, 0xca, 0xc0, 0x1a 435 }; 436 struct pico_frame *f = NULL; 437 struct pico_ipv4_hdr *hdr = (struct pico_ipv4_hdr *) buffer; 438 struct pico_udp_hdr *udp_hdr = NULL; 439 struct pico_tcp_hdr *tcp_hdr = NULL; 440 uint32_t *f_usage_count = NULL; 441 uint8_t *f_buffer = NULL; 442 int ret = -1; 443 444 printf("START CRC TEST\n"); 445 pico_stack_init(); 446 447 /* IPv4 CRC unit tests */ 448 /* Allocated memory will not be freed when pico_ipv4_crc_check fails */ 449 f = calloc(1, sizeof(struct pico_frame)); 450 f_usage_count = calloc(1, sizeof(uint32_t)); 451 f_buffer = calloc(1, sizeof(uint8_t)); 452 f->net_hdr = buffer; 453 f->net_len = PICO_SIZE_IP4HDR; 454 f->transport_hdr = buffer + PICO_SIZE_IP4HDR; 455 f->transport_len = sizeof(buffer) - PICO_SIZE_IP4HDR; 456 f->usage_count = f_usage_count; 457 f->buffer = f_buffer; 458 *(f->usage_count) = 512; 459 460 hdr->crc = 0; 461 printf(">>>>>>>>>>>>>>>>>>>>> CRC VALUE = %X\n", pico_checksum(hdr, PICO_SIZE_IP4HDR)); 462 hdr->crc = short_be(0x24CF); /* Make check pass */ 463 ret = pico_ipv4_crc_check(f); 464 fail_if(ret == 0, "correct IPv4 checksum got rejected\n"); 465 hdr->crc = short_be(0x8899); /* Make check fail */ 466 ret = pico_ipv4_crc_check(f); 467 fail_if(ret == 1, "incorrect IPv4 checksum got accepted\n"); 468 469 /* UDP CRC unit tests */ 470 /* Allocated memory will be freed when pico_transport_crc_check fails */ 471 f = calloc(1, sizeof(struct pico_frame)); 472 f_usage_count = calloc(1, sizeof(uint32_t)); 473 f_buffer = calloc(1, sizeof(uint8_t)); 474 f->net_hdr = buffer; 475 f->transport_hdr = buffer + PICO_SIZE_IP4HDR; 476 f->transport_len = sizeof(buffer) - PICO_SIZE_IP4HDR; 477 f->usage_count = f_usage_count; 478 f->buffer = f_buffer; 479 *(f->usage_count) = 1; 480 hdr->proto = 0x11; /* UDP */ 481 hdr->crc = short_be(0x24cf); /* Set IPv4 CRC correct */ 482 udp_hdr = (struct pico_udp_hdr *) f->transport_hdr; 483 484 /* udp_hdr->crc = 0; */ 485 /* printf(">>>>>>>>>>>>>>>>>>>>> UDP CRC VALUE = %X\n", pico_udp_checksum_ipv4(f)); */ 486 ret = pico_transport_crc_check(f); 487 fail_if(ret == 0, "correct UDP checksum got rejected\n"); 488 udp_hdr->crc = 0; 489 ret = pico_transport_crc_check(f); 490 fail_if(ret == 0, "UDP checksum of 0 did not get ignored\n"); 491 udp_hdr->crc = short_be(0x8899); /* Make check fail */ 492 ret = pico_transport_crc_check(f); 493 fail_if(ret == 1, "incorrect UDP checksum got accepted\n"); 494 495 /* TCP CRC unit tests */ 496 /* Allocated memory will be freed when pico_transport_crc_check fails */ 497 f = calloc(1, sizeof(struct pico_frame)); 498 f_usage_count = calloc(1, sizeof(uint32_t)); 499 f_buffer = calloc(1, sizeof(uint8_t)); 500 f->net_hdr = buffer; 501 f->transport_hdr = buffer + PICO_SIZE_IP4HDR; 502 f->transport_len = sizeof(buffer) - PICO_SIZE_IP4HDR; 503 f->usage_count = f_usage_count; 504 f->buffer = f_buffer; 505 *(f->usage_count) = 1; 506 hdr->proto = 0x06; /* TCP */ 507 hdr->crc = short_be(0x24cf); /* Set IPv4 CRC correct */ 508 tcp_hdr = (struct pico_tcp_hdr *) f->transport_hdr; 509 tcp_hdr->seq = long_be(0x002c2722); /* Set sequence number correct */ 510 511 /* tcp_hdr = 0; */ 512 /* printf(">>>>>>>>>>>>>>>>>>>>> TCP CRC VALUE = %X\n", pico_tcp_checksum_ipv4(f)); */ 513 tcp_hdr->crc = short_be(0x0016); /* Set correct TCP CRC */ 514 ret = pico_transport_crc_check(f); 515 fail_if(ret == 0, "correct TCP checksum got rejected\n"); 516 tcp_hdr->crc = short_be(0x8899); /* Make check fail */ 517 ret = pico_transport_crc_check(f); 518 fail_if(ret == 1, "incorrect TCP checksum got accepted\n"); 519} 520END_TEST 521#endif 522