| 587 | } |
| 588 | |
| 589 | static void udp_server_entry(void *parameter) |
| 590 | { |
| 591 | #define LWIP_UDP_RECV_BUF 16 |
| 592 | |
| 593 | fd_set fdread; |
| 594 | struct timeval timeout; |
| 595 | rt_bool_t fail_flag = RT_TRUE; |
| 596 | char recv_data[LWIP_UDP_RECV_BUF]; |
| 597 | int sock = -1, bytes_received, ret, port, maxsock; |
| 598 | socklen_t client_len, timeout_len; |
| 599 | struct sockaddr_in server_addr, client_addr; |
| 600 | |
| 601 | port = RT_UTEST_LWIP_UDP_PORT; |
| 602 | |
| 603 | /* create socket */ |
| 604 | if ((sock = lwip_socket(AF_INET, SOCK_DGRAM, 0)) == -1) |
| 605 | { |
| 606 | uassert_true(RT_FALSE); |
| 607 | goto __exit; |
| 608 | } |
| 609 | else |
| 610 | { |
| 611 | uassert_true(RT_TRUE); |
| 612 | } |
| 613 | |
| 614 | /* set timeout */ |
| 615 | timeout_len = sizeof(timeout); |
| 616 | timeout.tv_sec = 5; |
| 617 | timeout.tv_usec = 0; |
| 618 | ret = lwip_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *) &timeout, timeout_len); |
| 619 | uassert_true(ret == 0); |
| 620 | |
| 621 | server_addr.sin_family = AF_INET; |
| 622 | server_addr.sin_port = htons(port); |
| 623 | /* server addr:0.0.0.0 for UDP to work with external IP */ |
| 624 | server_addr.sin_addr.s_addr = htonl(IPADDR_ANY); |
| 625 | rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); |
| 626 | |
| 627 | /* bind socket */ |
| 628 | if (lwip_bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) |
| 629 | { |
| 630 | rt_kprintf("UDP server bind failed\n"); |
| 631 | uassert_true(RT_FALSE); |
| 632 | goto __exit; |
| 633 | } |
| 634 | else |
| 635 | { |
| 636 | rt_kprintf("UDP server bound to 0.0.0.0:%d\n", port); |
| 637 | uassert_true(RT_TRUE); |
| 638 | } |
| 639 | |
| 640 | maxsock = sock; |
| 641 | FD_ZERO(&fdread); |
| 642 | FD_SET(sock, &fdread); |
| 643 | /* wait for recv data */ |
| 644 | ret = lwip_select(maxsock + 1, &fdread, NULL, NULL, &timeout); |
| 645 | if (ret <= 0) |
| 646 | { |
nothing calls this directly
no test coverage detected