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