Index: src/api/api_lib.c =================================================================== RCS file: /sources/lwip/lwip/src/api/api_lib.c,v retrieving revision 1.72 diff -w -b -u -2 -p -r1.72 api_lib.c --- src/api/api_lib.c 1 Nov 2007 17:37:51 -0000 1.72 +++ src/api/api_lib.c 1 Nov 2007 22:10:44 -0000 @@ -90,4 +90,7 @@ netconn *netconn_new_with_proto_and_call conn->recv_timeout = 0; #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + conn->recv_bufsize = INT_MAX; +#endif /* LWIP_SO_RCVBUF */ msg.function = do_newconn; Index: src/api/api_msg.c =================================================================== RCS file: /sources/lwip/lwip/src/api/api_msg.c,v retrieving revision 1.74 diff -w -b -u -2 -p -r1.74 api_msg.c --- src/api/api_msg.c 1 Nov 2007 17:37:51 -0000 1.74 +++ src/api/api_msg.c 1 Nov 2007 22:10:43 -0000 @@ -70,5 +70,10 @@ recv_raw(void *arg, struct raw_pcb *pcb, conn = arg; +#if LWIP_SO_RCVBUF + if ((conn != NULL) && (conn->recvmbox != SYS_MBOX_NULL) && + (((int)(conn->recv_avail) + (int)(p->tot_len)) <= conn->recv_bufsize)) { +#else /* LWIP_SO_RCVBUF */ if ((conn != NULL) && (conn->recvmbox != SYS_MBOX_NULL)) { +#endif /* LWIP_SO_RCVBUF */ buf = memp_malloc(MEMP_NETBUF); if (buf == NULL) { @@ -109,5 +114,10 @@ recv_udp(void *arg, struct udp_pcb *pcb, conn = arg; +#if LWIP_SO_RCVBUF + if ((conn == NULL) || (conn->recvmbox == SYS_MBOX_NULL) || + (((int)(conn->recv_avail) + (int)(p->tot_len)) > conn->recv_bufsize)) { +#else /* LWIP_SO_RCVBUF */ if ((conn == NULL) || (conn->recvmbox == SYS_MBOX_NULL)) { +#endif /* LWIP_SO_RCVBUF */ pbuf_free(p); return; @@ -341,4 +351,7 @@ accept_function(void *arg, struct tcp_pc newconn->recv_timeout = 0; #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + newconn->recv_bufsize = INT_MAX; +#endif /* LWIP_SO_RCVBUF */ sys_mbox_post(conn->acceptmbox, newconn); Index: src/api/sockets.c =================================================================== RCS file: /sources/lwip/lwip/src/api/sockets.c,v retrieving revision 1.94 diff -w -b -u -2 -p -r1.94 sockets.c --- src/api/sockets.c 1 Nov 2007 17:37:51 -0000 1.94 +++ src/api/sockets.c 1 Nov 2007 21:53:33 -0000 @@ -1045,6 +1045,8 @@ lwip_getsockopt(int s, int level, int op case SO_RCVTIMEO: #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: +#endif /* LWIP_SO_RCVBUF */ /* UNIMPL case SO_OOBINLINE: */ - /* UNIMPL case SO_RCVBUF: */ /* UNIMPL case SO_SNDBUF: */ /* UNIMPL case SO_RCVLOWAT: */ @@ -1276,4 +1278,9 @@ lwip_getsockopt_internal(void *arg) break; #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: + *(int *)optval = sock->conn->recv_bufsize; + break; +#endif /* LWIP_SO_RCVBUF */ #if LWIP_UDP case SO_NO_CHECK: @@ -1400,6 +1407,8 @@ lwip_setsockopt(int s, int level, int op case SO_RCVTIMEO: #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: +#endif /* LWIP_SO_RCVBUF */ /* UNIMPL case SO_OOBINLINE: */ - /* UNIMPL case SO_RCVBUF: */ /* UNIMPL case SO_SNDBUF: */ /* UNIMPL case SO_RCVLOWAT: */ @@ -1614,4 +1623,9 @@ lwip_setsockopt_internal(void *arg) break; #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: + sock->conn->recv_bufsize = ( *(int*)optval ); + break; +#endif /* LWIP_SO_RCVBUF */ #if LWIP_UDP case SO_NO_CHECK: Index: src/include/lwip/api.h =================================================================== RCS file: /sources/lwip/lwip/src/include/lwip/api.h,v retrieving revision 1.33 diff -w -b -u -2 -p -r1.33 api.h --- src/include/lwip/api.h 1 Nov 2007 17:37:51 -0000 1.33 +++ src/include/lwip/api.h 1 Nov 2007 21:57:38 -0000 @@ -115,4 +115,7 @@ struct netconn { int recv_timeout; #endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + int recv_bufsize; +#endif /* LWIP_SO_RCVBUF */ u16_t recv_avail; /** TCP: when data passed to netconn_write doesn't fit into the send buffer, Index: src/include/lwip/opt.h =================================================================== RCS file: /sources/lwip/lwip/src/include/lwip/opt.h,v retrieving revision 1.101 diff -w -b -u -2 -p -r1.101 opt.h --- src/include/lwip/opt.h 11 Oct 2007 19:24:59 -0000 1.101 +++ src/include/lwip/opt.h 1 Nov 2007 22:02:30 -0000 @@ -929,4 +929,11 @@ /** + * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. + */ +#ifndef LWIP_SO_RCVBUF +#define LWIP_SO_RCVBUF 0 +#endif + +/** * SO_REUSE==1: Enable SO_REUSEADDR and SO_REUSEPORT options. DO NOT USE! */