MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / lwip_ioctl

Function lwip_ioctl

components/net/lwip/lwip-2.1.2/src/api/sockets.c:3764–3850  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3762}
3763
3764int
3765lwip_ioctl(int s, long cmd, void *argp)
3766{
3767 struct lwip_sock *sock = get_socket(s);
3768 u8_t val;
3769#if LWIP_SO_RCVBUF
3770 int recv_avail;
3771#endif /* LWIP_SO_RCVBUF */
3772
3773 if (!sock) {
3774 return -1;
3775 }
3776
3777 switch (cmd) {
3778#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
3779 case FIONREAD:
3780 if (!argp) {
3781 sock_set_errno(sock, EINVAL);
3782 done_socket(sock);
3783 return -1;
3784 }
3785#if LWIP_FIONREAD_LINUXMODE
3786 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
3787 struct netbuf *nb;
3788 if (sock->lastdata.netbuf) {
3789 nb = sock->lastdata.netbuf;
3790 *((int *)argp) = nb->p->tot_len;
3791 } else {
3792 struct netbuf *rxbuf;
3793 err_t err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &rxbuf, NETCONN_DONTBLOCK);
3794 if (err != ERR_OK) {
3795 *((int *)argp) = 0;
3796 } else {
3797 sock->lastdata.netbuf = rxbuf;
3798 *((int *)argp) = rxbuf->p->tot_len;
3799 }
3800 }
3801 done_socket(sock);
3802 return 0;
3803 }
3804#endif /* LWIP_FIONREAD_LINUXMODE */
3805
3806#if LWIP_SO_RCVBUF
3807 /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */
3808 SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);
3809 if (recv_avail < 0) {
3810 recv_avail = 0;
3811 }
3812
3813 /* Check if there is data left from the last recv operation. /maq 041215 */
3814 if (sock->lastdata.netbuf) {
3815 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
3816 recv_avail += sock->lastdata.pbuf->tot_len;
3817 } else {
3818 recv_avail += sock->lastdata.netbuf->p->tot_len;
3819 }
3820 }
3821 *((int *)argp) = recv_avail;

Callers 3

START_TESTFunction · 0.50
inet_ioctlsocketFunction · 0.50
tcp_client_entryFunction · 0.50

Calls 4

done_socketFunction · 0.85
get_socketFunction · 0.70
netconn_typeEnum · 0.70

Tested by 1

START_TESTFunction · 0.40