#include "lwip/opt.h"
#include "lwip/api.h"
#include "lwip/arch.h"
#include "lwip/sys.h"
#include "lwip/sockets.h"
Include dependency graph for sockets.c:
Go to the source code of this file.
Data Structures | |
struct | lwip_select_cb |
struct | lwip_socket |
Defines | |
#define | htons HTONS |
#define | htonl HTONL |
#define | NUM_SOCKETS MEMP_NUM_NETCONN |
#define | err_to_errno(err) |
#define | set_errno(err) |
#define | sock_set_errno(sk, e) |
Functions | |
void | event_callback (struct netconn *conn, enum netconn_evt evt, u16_t len) |
lwip_socket * | get_socket (int s) |
int | alloc_socket (struct netconn *newconn) |
int | lwip_accept (int s, struct sockaddr *addr, socklen_t *addrlen) |
int | lwip_bind (int s, struct sockaddr *name, socklen_t namelen) |
int | lwip_close (int s) |
int | lwip_connect (int s, struct sockaddr *name, socklen_t namelen) |
int | lwip_listen (int s, int backlog) |
int | lwip_recvfrom (int s, void *mem, int len, unsigned int flags, struct sockaddr *from, socklen_t *fromlen) |
int | lwip_read (int s, void *mem, int len) |
int | lwip_recv (int s, void *mem, int len, unsigned int flags) |
int | lwip_send (int s, void *data, int size, unsigned int flags) |
int | lwip_sendto (int s, void *data, int size, unsigned int flags, struct sockaddr *to, socklen_t tolen) |
int | lwip_socket (int domain, int type, int protocol) |
int | lwip_write (int s, void *data, int size) |
int | lwip_selscan (int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset) |
int | lwip_select (int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout) |
int | lwip_shutdown (int s, int how) |
int | lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen) |
int | lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen) |
int | lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen) |
int | lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen) |
int | lwip_ioctl (int s, long cmd, void *argp) |
Variables | |
lwip_socket | sockets [NUM_SOCKETS] |
lwip_select_cb * | select_cb_list = 0 |
sys_sem_t | socksem = 0 |
sys_sem_t | selectsem = 0 |
int | err_to_errno_table [11] |
|
Value: ((err) < (sizeof(err_to_errno_table)/sizeof(int))) ? \ err_to_errno_table[-(err)] : EIO Definition at line 96 of file sockets.c. Referenced by lwip_bind(), lwip_connect(), lwip_listen(), and lwip_send(). |
|
|
|
|
|
Definition at line 51 of file sockets.c. Referenced by alloc_socket(), and get_socket(). |
|
Definition at line 103 of file sockets.c. Referenced by get_socket(), lwip_select(), and lwip_socket(). |
|
Value: do { \ sk->err = (e); \ set_errno(sk->err); \ } while(0) Definition at line 106 of file sockets.c. Referenced by lwip_accept(), lwip_bind(), lwip_close(), lwip_connect(), lwip_getpeername(), lwip_getsockname(), lwip_getsockopt(), lwip_ioctl(), lwip_listen(), lwip_recvfrom(), lwip_send(), and lwip_setsockopt(). |
|
Definition at line 135 of file sockets.c. References lwip_socket::conn, lwip_socket::err, lwip_socket::flags, lwip_socket::lastdata, lwip_socket::lastoffset, newconn, NULL, NUM_SOCKETS, lwip_socket::rcvevent, lwip_socket::sendevent, sockets, socksem, sys_sem_new(), sys_sem_signal(), and sys_sem_wait(). Referenced by lwip_accept(), and lwip_socket().
00136 { 00137 int i; 00138 00139 if (!socksem) 00140 socksem = sys_sem_new(1); 00141 00142 /* Protect socket array */ 00143 sys_sem_wait(socksem); 00144 00145 /* allocate a new socket identifier */ 00146 for(i = 0; i < NUM_SOCKETS; ++i) { 00147 if(!sockets[i].conn) { 00148 sockets[i].conn = newconn; 00149 sockets[i].lastdata = NULL; 00150 sockets[i].lastoffset = 0; 00151 sockets[i].rcvevent = 0; 00152 sockets[i].sendevent = 1; /* TCP send buf is empty */ 00153 sockets[i].flags = 0; 00154 sockets[i].err = 0; 00155 sys_sem_signal(socksem); 00156 return i; 00157 } 00158 } 00159 sys_sem_signal(socksem); 00160 return -1; 00161 } |
Here is the call graph for this function:
|
Definition at line 797 of file sockets.c. References conn, FD_ISSET, get_socket(), lwip_socket(), NETCONN_EVT_RCVMINUS, NETCONN_EVT_RCVPLUS, NETCONN_EVT_SENDMINUS, NETCONN_EVT_SENDPLUS, lwip_select_cb::next, select_cb_list, selectsem, netconn::socket, sys_sem_new(), sys_sem_signal(), sys_sem_wait(), and u16_t. Referenced by lwip_accept(), and lwip_socket().
00798 { 00799 int s; 00800 struct lwip_socket *sock; 00801 struct lwip_select_cb *scb; 00802 00803 /* Get socket */ 00804 if (conn) 00805 { 00806 s = conn->socket; 00807 if (s < 0) 00808 { 00809 /* Data comes in right away after an accept, even though 00810 * the server task might not have created a new socket yet. 00811 * Just count down (or up) if that's the case and we 00812 * will use the data later. Note that only receive events 00813 * can happen before the new socket is set up. */ 00814 if (evt == NETCONN_EVT_RCVPLUS) 00815 conn->socket--; 00816 return; 00817 } 00818 00819 sock = get_socket(s); 00820 if (!sock) 00821 return; 00822 } 00823 else 00824 return; 00825 00826 if (!selectsem) 00827 selectsem = sys_sem_new(1); 00828 00829 sys_sem_wait(selectsem); 00830 /* Set event as required */ 00831 switch (evt) 00832 { 00833 case NETCONN_EVT_RCVPLUS: 00834 sock->rcvevent++; 00835 break; 00836 case NETCONN_EVT_RCVMINUS: 00837 sock->rcvevent--; 00838 break; 00839 case NETCONN_EVT_SENDPLUS: 00840 sock->sendevent = 1; 00841 break; 00842 case NETCONN_EVT_SENDMINUS: 00843 sock->sendevent = 0; 00844 break; 00845 } 00846 sys_sem_signal(selectsem); 00847 00848 /* Now decide if anyone is waiting for this socket */ 00849 /* NOTE: This code is written this way to protect the select link list 00850 but to avoid a deadlock situation by releasing socksem before 00851 signalling for the select. This means we need to go through the list 00852 multiple times ONLY IF a select was actually waiting. We go through 00853 the list the number of waiting select calls + 1. This list is 00854 expected to be small. */ 00855 while (1) 00856 { 00857 sys_sem_wait(selectsem); 00858 for (scb = select_cb_list; scb; scb = scb->next) 00859 { 00860 if (scb->sem_signalled == 0) 00861 { 00862 /* Test this select call for our socket */ 00863 if (scb->readset && FD_ISSET(s, scb->readset)) 00864 if (sock->rcvevent) 00865 break; 00866 if (scb->writeset && FD_ISSET(s, scb->writeset)) 00867 if (sock->sendevent) 00868 break; 00869 } 00870 } 00871 if (scb) 00872 { 00873 scb->sem_signalled = 1; 00874 sys_sem_signal(selectsem); 00875 sys_sem_signal(scb->sem); 00876 } else { 00877 sys_sem_signal(selectsem); 00878 break; 00879 } 00880 } 00881 00882 } |
Here is the call graph for this function:
|
Definition at line 113 of file sockets.c. References DEBUGF, NULL, NUM_SOCKETS, set_errno, sockets, and SOCKETS_DEBUG. Referenced by event_callback(), lwip_accept(), lwip_bind(), lwip_close(), lwip_connect(), lwip_getpeername(), lwip_getsockname(), lwip_getsockopt(), lwip_ioctl(), lwip_listen(), lwip_recvfrom(), lwip_selscan(), lwip_send(), lwip_sendto(), and lwip_setsockopt().
00114 { 00115 struct lwip_socket *sock; 00116 00117 if((s < 0) || (s > NUM_SOCKETS)) { 00118 DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s)); 00119 set_errno(EBADF); 00120 return NULL; 00121 } 00122 00123 sock = &sockets[s]; 00124 00125 if(!sock->conn) { 00126 DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): not active\n", s)); 00127 set_errno(EBADF); 00128 return NULL; 00129 } 00130 00131 return sock; 00132 } |
|
Definition at line 164 of file sockets.c. References ip_addr::addr, AF_INET, alloc_socket(), netconn::callback, DEBUGF, event_callback(), get_socket(), htons, ip_addr_debug_print, netconn_accept(), netconn_delete(), netconn_peer(), newconn, in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_len, sockaddr_in::sin_port, sock_set_errno, netconn::socket, SOCKETS_DEBUG, socksem, sys_sem_signal(), sys_sem_wait(), and u16_t.
00165 { 00166 struct lwip_socket *sock; 00167 struct netconn *newconn; 00168 struct ip_addr naddr; 00169 u16_t port; 00170 int newsock; 00171 struct sockaddr_in sin; 00172 00173 DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s)); 00174 sock = get_socket(s); 00175 if(!sock) { 00176 return -1; 00177 } 00178 00179 newconn = netconn_accept(sock->conn); 00180 00181 /* get the IP address and port of the remote host */ 00182 netconn_peer(newconn, &naddr, &port); 00183 00184 memset(&sin, 0, sizeof(sin)); 00185 sin.sin_len = sizeof(sin); 00186 sin.sin_family = AF_INET; 00187 sin.sin_port = htons(port); 00188 sin.sin_addr.s_addr = naddr.addr; 00189 00190 if(*addrlen > sizeof(sin)) 00191 *addrlen = sizeof(sin); 00192 00193 memcpy(addr, &sin, *addrlen); 00194 00195 newsock = alloc_socket(newconn); 00196 if(newsock == -1) { 00197 netconn_delete(newconn); 00198 sock_set_errno(sock, ENOBUFS); 00199 return -1; 00200 } 00201 newconn->callback = event_callback; 00202 sock = get_socket(newsock); 00203 00204 sys_sem_wait(socksem); 00205 sock->rcvevent += -1 - newconn->socket; 00206 newconn->socket = newsock; 00207 sys_sem_signal(socksem); 00208 00209 #if SOCKETS_DEBUG 00210 DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock)); 00211 ip_addr_debug_print(&naddr); 00212 DEBUGF(SOCKETS_DEBUG, (" port=%u\n", port)); 00213 #endif 00214 00215 sock_set_errno(sock, 0); 00216 return newsock; 00217 } |
Here is the call graph for this function:
|
Definition at line 220 of file sockets.c. References ip_addr::addr, DEBUGF, ERR_OK, err_t, err_to_errno, get_socket(), ip_addr_debug_print, name, netconn_bind(), ntohs, sock_set_errno, SOCKETS_DEBUG, and u16_t.
00221 { 00222 struct lwip_socket *sock; 00223 struct ip_addr local_addr; 00224 u16_t local_port; 00225 err_t err; 00226 00227 sock = get_socket(s); 00228 if(!sock) { 00229 return -1; 00230 } 00231 00232 local_addr.addr = ((struct sockaddr_in *)name)->sin_addr.s_addr; 00233 local_port = ((struct sockaddr_in *)name)->sin_port; 00234 00235 #if SOCKETS_DEBUG 00236 DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s)); 00237 ip_addr_debug_print(&local_addr); 00238 DEBUGF(SOCKETS_DEBUG, (" port=%u)\n", ntohs(local_port))); 00239 #endif 00240 00241 err = netconn_bind(sock->conn, &local_addr, ntohs(local_port)); 00242 00243 if(err != ERR_OK) { 00244 DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err)); 00245 sock_set_errno(sock, err_to_errno(err)); 00246 return -1; 00247 } 00248 00249 DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s)); 00250 sock_set_errno(sock, 0); 00251 return 0; 00252 } |
Here is the call graph for this function:
|
Definition at line 255 of file sockets.c. References DEBUGF, get_socket(), netbuf_delete(), netconn_delete(), NULL, sock_set_errno, SOCKETS_DEBUG, socksem, sys_sem_new(), sys_sem_signal(), and sys_sem_wait(). Referenced by lwip_shutdown().
00256 { 00257 struct lwip_socket *sock; 00258 00259 DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s)); 00260 if (!socksem) 00261 socksem = sys_sem_new(1); 00262 00263 /* We cannot allow multiple closes of the same socket. */ 00264 sys_sem_wait(socksem); 00265 00266 sock = get_socket(s); 00267 if(!sock) { 00268 sys_sem_signal(socksem); 00269 return -1; 00270 } 00271 00272 netconn_delete(sock->conn); 00273 if(sock->lastdata) { 00274 netbuf_delete(sock->lastdata); 00275 } 00276 sock->lastdata = NULL; 00277 sock->lastoffset = 0; 00278 sock->conn = NULL; 00279 sys_sem_signal(socksem); 00280 sock_set_errno(sock, 0); 00281 return 0; 00282 } |
Here is the call graph for this function:
|
Definition at line 285 of file sockets.c. References ip_addr::addr, AF_UNSPEC, DEBUGF, ERR_OK, err_t, err_to_errno, get_socket(), ip_addr_debug_print, name, netconn_connect(), netconn_disconnect(), ntohs, sock_set_errno, SOCKETS_DEBUG, and u16_t.
00286 { 00287 struct lwip_socket *sock; 00288 err_t err; 00289 00290 sock = get_socket(s); 00291 if(!sock) { 00292 return -1; 00293 } 00294 00295 if (((struct sockaddr_in *)name)->sin_family == AF_UNSPEC) { 00296 DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s)); 00297 err = netconn_disconnect(sock->conn); 00298 } else { 00299 struct ip_addr remote_addr; 00300 u16_t remote_port; 00301 00302 remote_addr.addr = ((struct sockaddr_in *)name)->sin_addr.s_addr; 00303 remote_port = ((struct sockaddr_in *)name)->sin_port; 00304 00305 #if SOCKETS_DEBUG 00306 DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s)); 00307 ip_addr_debug_print(&remote_addr); 00308 DEBUGF(SOCKETS_DEBUG, (" port=%u)\n", ntohs(remote_port))); 00309 #endif 00310 00311 err = netconn_connect(sock->conn, &remote_addr, ntohs(remote_port)); 00312 } 00313 00314 if(err != ERR_OK) { 00315 DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err)); 00316 sock_set_errno(sock, err_to_errno(err)); 00317 return -1; 00318 } 00319 00320 DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s)); 00321 sock_set_errno(sock, 0); 00322 return 0; 00323 } |
Here is the call graph for this function:
|
Definition at line 893 of file sockets.c. References ip_addr::addr, AF_INET, DEBUGF, get_socket(), htons, ip_addr_debug_print, lwip_socket(), name, netconn_peer(), in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_len, sockaddr_in::sin_port, sock_set_errno, and SOCKETS_DEBUG.
00894 { 00895 struct lwip_socket *sock; 00896 struct sockaddr_in sin; 00897 struct ip_addr naddr; 00898 00899 sock = get_socket(s); 00900 if(!sock) { 00901 return -1; 00902 } 00903 00904 memset(&sin, 0, sizeof(sin)); 00905 sin.sin_len = sizeof(sin); 00906 sin.sin_family = AF_INET; 00907 00908 /* get the IP address and port of the remote host */ 00909 netconn_peer(sock->conn, &naddr, &sin.sin_port); 00910 00911 #if SOCKETS_DEBUG 00912 DEBUGF(SOCKETS_DEBUG, ("lwip_getpeername(%d, addr=", s)); 00913 ip_addr_debug_print(&naddr); 00914 DEBUGF(SOCKETS_DEBUG, (" port=%d)\n", sin.sin_port)); 00915 #endif 00916 00917 sin.sin_port = htons(sin.sin_port); 00918 sin.sin_addr.s_addr = naddr.addr; 00919 00920 if(*namelen > sizeof(sin)) 00921 *namelen = sizeof(sin); 00922 00923 memcpy(name, &sin, *namelen); 00924 sock_set_errno(sock, 0); 00925 return 0; 00926 } |
Here is the call graph for this function:
|
Definition at line 928 of file sockets.c. References AF_INET, DEBUGF, get_socket(), htons, ip_addr_debug_print, lwip_socket(), name, netconn_addr(), in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_len, sockaddr_in::sin_port, sock_set_errno, and SOCKETS_DEBUG.
00929 { 00930 struct lwip_socket *sock; 00931 struct sockaddr_in sin; 00932 struct ip_addr *naddr; 00933 00934 sock = get_socket(s); 00935 if(!sock) { 00936 return -1; 00937 } 00938 00939 memset(&sin, 0, sizeof(sin)); 00940 sin.sin_len = sizeof(sin); 00941 sin.sin_family = AF_INET; 00942 00943 /* get the IP address and port of the remote host */ 00944 netconn_addr(sock->conn, &naddr, &sin.sin_port); 00945 00946 #if SOCKETS_DEBUG 00947 DEBUGF(SOCKETS_DEBUG, ("lwip_getsockname(%d, addr=", s)); 00948 ip_addr_debug_print(naddr); 00949 DEBUGF(SOCKETS_DEBUG, (" port=%d)\n", sin.sin_port)); 00950 #endif 00951 00952 sin.sin_port = htons(sin.sin_port); 00953 sin.sin_addr.s_addr = naddr->addr; 00954 00955 if(*namelen > sizeof(sin)) 00956 *namelen = sizeof(sin); 00957 00958 memcpy(name, &sin, *namelen); 00959 sock_set_errno(sock, 0); 00960 return 0; 00961 } |
Here is the call graph for this function:
|
Definition at line 963 of file sockets.c. References DEBUGF, get_socket(), lwip_socket(), SO_ERROR, sock_set_errno, SOCKETS_DEBUG, and SOL_SOCKET.
00964 { 00965 int err = ENOSYS; 00966 struct lwip_socket *sock = get_socket(s); 00967 00968 if(!sock) { 00969 return -1; 00970 } 00971 00972 if(level == SOL_SOCKET) { 00973 switch(optname) { 00974 case SO_ERROR: 00975 if(!optval || !optlen || (*optlen != sizeof(int))) { 00976 err = EINVAL; 00977 break; 00978 } 00979 *(int *)optval = sock->err; 00980 sock->err = 0; 00981 DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", s, *(int *)optval)); 00982 err = 0; 00983 break; 00984 default: 00985 DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname)); 00986 break; 00987 } 00988 } else { 00989 DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname)); 00990 } 00991 sock_set_errno(sock, err); 00992 return err ? -1 : 0; 00993 } |
Here is the call graph for this function:
|
Definition at line 1023 of file sockets.c. References DEBUGF, FIONBIO, FIONREAD, get_socket(), lwip_socket(), O_NONBLOCK, sock_set_errno, SOCKETS_DEBUG, u16_t, and u32_t. Referenced by open_tcp_socket().
01024 { 01025 struct lwip_socket *sock = get_socket(s); 01026 01027 if(!sock) { 01028 return -1; 01029 } 01030 01031 switch(cmd) { 01032 case FIONREAD: 01033 if(!argp) { 01034 sock_set_errno(sock, EINVAL); 01035 return -1; 01036 } 01037 01038 *((u16_t*)argp) = sock->conn->recv_avail; 01039 01040 DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %u\n", s, argp, *((u16_t*)argp))); 01041 sock_set_errno(sock, 0); 01042 return 0; 01043 01044 case FIONBIO: 01045 if(argp && *(u32_t*)argp) 01046 sock->flags |= O_NONBLOCK; 01047 else 01048 sock->flags &= ~O_NONBLOCK; 01049 DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, !!(sock->flags & O_NONBLOCK))); 01050 sock_set_errno(sock, 0); 01051 return 0; 01052 01053 default: 01054 DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp)); 01055 sock_set_errno(sock, ENOSYS); /* not yet implemented */ 01056 return -1; 01057 } 01058 } |
Here is the call graph for this function:
|
Definition at line 326 of file sockets.c. References DEBUGF, ERR_OK, err_t, err_to_errno, get_socket(), netconn_listen(), sock_set_errno, and SOCKETS_DEBUG.
00327 { 00328 struct lwip_socket *sock; 00329 err_t err; 00330 00331 DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog)); 00332 sock = get_socket(s); 00333 if(!sock) { 00334 return -1; 00335 } 00336 00337 err = netconn_listen(sock->conn); 00338 00339 if(err != ERR_OK) { 00340 DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err)); 00341 sock_set_errno(sock, err_to_errno(err)); 00342 return -1; 00343 } 00344 00345 sock_set_errno(sock, 0); 00346 return 0; 00347 } |
Here is the call graph for this function:
|
Definition at line 458 of file sockets.c. References len, lwip_recvfrom(), and NULL.
00459 { 00460 return lwip_recvfrom(s, mem, len, 0, NULL, NULL); 00461 } |
Here is the call graph for this function:
|
Definition at line 464 of file sockets.c. References len, lwip_recvfrom(), and NULL.
00465 { 00466 return lwip_recvfrom(s, mem, len, flags, NULL, NULL); 00467 } |
Here is the call graph for this function:
|
Definition at line 350 of file sockets.c. References AF_INET, DEBUGF, get_socket(), htons, ip_addr_debug_print, len, MSG_DONTWAIT, netbuf_copy_partial(), netbuf_delete(), netbuf_fromaddr(), netbuf_fromport(), netbuf_len(), netconn_recv(), NETCONN_TCP, netconn_type, NULL, O_NONBLOCK, in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, sockaddr_in::sin_len, sockaddr_in::sin_port, sock_set_errno, SOCKETS_DEBUG, and u16_t. Referenced by lwip_read(), and lwip_recv().
00352 { 00353 struct lwip_socket *sock; 00354 struct netbuf *buf; 00355 u16_t buflen, copylen; 00356 struct ip_addr *addr; 00357 u16_t port; 00358 00359 00360 DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %d, 0x%x, ..)\n", s, mem, len, flags)); 00361 sock = get_socket(s); 00362 if(!sock) { 00363 return -1; 00364 } 00365 00366 /* Check if there is data left from the last recv operation. */ 00367 if(sock->lastdata) { 00368 buf = sock->lastdata; 00369 } else { 00370 /* If this is non-blocking call, then check first */ 00371 if (((flags & MSG_DONTWAIT) || (sock->flags & O_NONBLOCK)) 00372 && !sock->rcvevent) 00373 { 00374 DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): returning EWOULDBLOCK\n", s)); 00375 sock_set_errno(sock, EWOULDBLOCK); 00376 return -1; 00377 } 00378 00379 /* No data was left from the previous operation, so we try to get 00380 some from the network. */ 00381 buf = netconn_recv(sock->conn); 00382 00383 if(!buf) { 00384 /* We should really do some error checking here. */ 00385 DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL!\n", s)); 00386 sock_set_errno(sock, 0); 00387 return 0; 00388 } 00389 } 00390 00391 buflen = netbuf_len(buf); 00392 00393 buflen -= sock->lastoffset; 00394 00395 if(len > buflen) { 00396 copylen = buflen; 00397 } else { 00398 copylen = len; 00399 } 00400 00401 /* copy the contents of the received buffer into 00402 the supplied memory pointer mem */ 00403 netbuf_copy_partial(buf, mem, copylen, sock->lastoffset); 00404 00405 /* Check to see from where the data was. */ 00406 if(from && fromlen) { 00407 struct sockaddr_in sin; 00408 00409 addr = netbuf_fromaddr(buf); 00410 port = netbuf_fromport(buf); 00411 00412 memset(&sin, 0, sizeof(sin)); 00413 sin.sin_len = sizeof(sin); 00414 sin.sin_family = AF_INET; 00415 sin.sin_port = htons(port); 00416 sin.sin_addr.s_addr = addr->addr; 00417 00418 if(*fromlen > sizeof(sin)) 00419 *fromlen = sizeof(sin); 00420 00421 memcpy(from, &sin, *fromlen); 00422 00423 #if SOCKETS_DEBUG 00424 DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s)); 00425 ip_addr_debug_print(addr); 00426 DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, copylen)); 00427 #endif 00428 } else { 00429 #if SOCKETS_DEBUG > 0 00430 addr = netbuf_fromaddr(buf); 00431 port = netbuf_fromport(buf); 00432 00433 DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s)); 00434 ip_addr_debug_print(addr); 00435 DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, copylen)); 00436 #endif 00437 00438 } 00439 00440 /* If this is a TCP socket, check if there is data left in the 00441 buffer. If so, it should be saved in the sock structure for next 00442 time around. */ 00443 if(netconn_type(sock->conn) == NETCONN_TCP && buflen - copylen > 0) { 00444 sock->lastdata = buf; 00445 sock->lastoffset += copylen; 00446 } else { 00447 sock->lastdata = NULL; 00448 sock->lastoffset = 0; 00449 netbuf_delete(buf); 00450 } 00451 00452 00453 sock_set_errno(sock, 0); 00454 return copylen; 00455 } |
Here is the call graph for this function:
|
Definition at line 657 of file sockets.c. References DEBUGF, lwip_select_cb::exceptset, FD_ZERO, lwip_selscan(), lwip_select_cb::next, lwip_select_cb::readset, select_cb_list, selectsem, lwip_select_cb::sem, lwip_select_cb::sem_signalled, set_errno, SOCKETS_DEBUG, sys_sem_free(), sys_sem_new(), sys_sem_signal(), sys_sem_wait(), sys_sem_wait_timeout(), timeval::tv_sec, timeval::tv_usec, u32_t, and lwip_select_cb::writeset.
00659 { 00660 int i; 00661 int nready; 00662 fd_set lreadset, lwriteset, lexceptset; 00663 u32_t msectimeout; 00664 struct lwip_select_cb select_cb; 00665 struct lwip_select_cb *p_selcb; 00666 00667 DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%ld tvusec=%ld)\n", maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset, timeout ? timeout->tv_sec : -1L, timeout ? timeout->tv_usec : -1L)); 00668 select_cb.next = 0; 00669 select_cb.readset = readset; 00670 select_cb.writeset = writeset; 00671 select_cb.exceptset = exceptset; 00672 select_cb.sem_signalled = 0; 00673 00674 /* Protect ourselves searching through the list */ 00675 if (!selectsem) 00676 selectsem = sys_sem_new(1); 00677 sys_sem_wait(selectsem); 00678 00679 if (readset) 00680 lreadset = *readset; 00681 else 00682 FD_ZERO(&lreadset); 00683 if (writeset) 00684 lwriteset = *writeset; 00685 else 00686 FD_ZERO(&lwriteset); 00687 if (exceptset) 00688 lexceptset = *exceptset; 00689 else 00690 FD_ZERO(&lexceptset); 00691 00692 /* Go through each socket in each list to count number of sockets which 00693 currently match */ 00694 nready = lwip_selscan(maxfdp1, &lreadset, &lwriteset, &lexceptset); 00695 00696 /* If we don't have any current events, then suspend if we are supposed to */ 00697 if (!nready) 00698 { 00699 if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) 00700 { 00701 sys_sem_signal(selectsem); 00702 if (readset) 00703 FD_ZERO(readset); 00704 if (writeset) 00705 FD_ZERO(writeset); 00706 if (exceptset) 00707 FD_ZERO(exceptset); 00708 00709 DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n")); 00710 set_errno(0); 00711 return 0; 00712 } 00713 00714 /* add our semaphore to list */ 00715 /* We don't actually need any dynamic memory. Our entry on the 00716 * list is only valid while we are in this function, so it's ok 00717 * to use local variables */ 00718 00719 select_cb.sem = sys_sem_new(0); 00720 /* Note that we are still protected */ 00721 /* Put this select_cb on top of list */ 00722 select_cb.next = select_cb_list; 00723 select_cb_list = &select_cb; 00724 00725 /* Now we can safely unprotect */ 00726 sys_sem_signal(selectsem); 00727 00728 /* Now just wait to be woken */ 00729 if (timeout == 0) 00730 /* Wait forever */ 00731 msectimeout = 0; 00732 else 00733 msectimeout = ((timeout->tv_sec * 1000) + (timeout->tv_usec /1000)); 00734 00735 i = sys_sem_wait_timeout(select_cb.sem, msectimeout); 00736 00737 /* Take us off the list */ 00738 sys_sem_wait(selectsem); 00739 if (select_cb_list == &select_cb) 00740 select_cb_list = select_cb.next; 00741 else 00742 for (p_selcb = select_cb_list; p_selcb; p_selcb = p_selcb->next) 00743 if (p_selcb->next == &select_cb) 00744 { 00745 p_selcb->next = select_cb.next; 00746 break; 00747 } 00748 00749 sys_sem_signal(selectsem); 00750 00751 sys_sem_free(select_cb.sem); 00752 if (i == 0) /* Timeout */ 00753 { 00754 if (readset) 00755 FD_ZERO(readset); 00756 if (writeset) 00757 FD_ZERO(writeset); 00758 if (exceptset) 00759 FD_ZERO(exceptset); 00760 DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n")); 00761 set_errno(0); 00762 return 0; 00763 } 00764 00765 if (readset) 00766 lreadset = *readset; 00767 else 00768 FD_ZERO(&lreadset); 00769 if (writeset) 00770 lwriteset = *writeset; 00771 else 00772 FD_ZERO(&lwriteset); 00773 if (exceptset) 00774 lexceptset = *exceptset; 00775 else 00776 FD_ZERO(&lexceptset); 00777 00778 /* See what's set */ 00779 nready = lwip_selscan(maxfdp1, &lreadset, &lwriteset, &lexceptset); 00780 } 00781 else 00782 sys_sem_signal(selectsem); 00783 00784 if (readset) 00785 *readset = lreadset; 00786 if (writeset) 00787 *writeset = lwriteset; 00788 if (exceptset) 00789 *exceptset = lexceptset; 00790 DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready)); 00791 set_errno(0); 00792 return nready; 00793 } |
Here is the call graph for this function:
|
Definition at line 610 of file sockets.c. References DEBUGF, FD_ISSET, FD_SET, FD_ZERO, get_socket(), lwip_socket(), and SOCKETS_DEBUG. Referenced by lwip_select().
00611 { 00612 int i, nready = 0; 00613 fd_set lreadset, lwriteset, lexceptset; 00614 struct lwip_socket *p_sock; 00615 00616 FD_ZERO(&lreadset); 00617 FD_ZERO(&lwriteset); 00618 FD_ZERO(&lexceptset); 00619 00620 /* Go through each socket in each list to count number of sockets which 00621 currently match */ 00622 for(i = 0; i < maxfdp1; i++) 00623 { 00624 if(FD_ISSET(i, readset)) 00625 { 00626 /* See if netconn of this socket is ready for read */ 00627 p_sock = get_socket(i); 00628 if (p_sock && (p_sock->lastdata || p_sock->rcvevent)) 00629 { 00630 FD_SET(i, &lreadset); 00631 DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i)); 00632 nready++; 00633 } 00634 } 00635 if(FD_ISSET(i, writeset)) 00636 { 00637 /* See if netconn of this socket is ready for write */ 00638 p_sock = get_socket(i); 00639 if (p_sock && p_sock->sendevent) 00640 { 00641 FD_SET(i, &lwriteset); 00642 DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i)); 00643 nready++; 00644 } 00645 } 00646 } 00647 *readset = lreadset; 00648 *writeset = lwriteset; 00649 FD_ZERO(exceptset); 00650 00651 return nready; 00652 } |
Here is the call graph for this function:
|
Definition at line 470 of file sockets.c. References data, DEBUGF, ERR_ARG, ERR_OK, err_t, err_to_errno, get_socket(), netbuf_delete(), netbuf_new(), netbuf_ref(), NETCONN_COPY, netconn_send(), NETCONN_TCP, netconn_type, NETCONN_UDP, netconn_write(), sock_set_errno, and SOCKETS_DEBUG. Referenced by lwip_sendto(), and lwip_write().
00471 { 00472 struct lwip_socket *sock; 00473 struct netbuf *buf; 00474 err_t err; 00475 00476 DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%d, flags=0x%x)\n", s, data, size, flags)); 00477 00478 sock = get_socket(s); 00479 if(!sock) { 00480 return -1; 00481 } 00482 00483 switch(netconn_type(sock->conn)) { 00484 case NETCONN_UDP: 00485 /* create a buffer */ 00486 buf = netbuf_new(); 00487 00488 if(!buf) { 00489 DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) ENOBUFS\n", s)); 00490 sock_set_errno(sock, ENOBUFS); 00491 return -1; 00492 } 00493 00494 /* make the buffer point to the data that should 00495 be sent */ 00496 netbuf_ref(buf, data, size); 00497 00498 /* send the data */ 00499 err = netconn_send(sock->conn, buf); 00500 00501 /* deallocated the buffer */ 00502 netbuf_delete(buf); 00503 break; 00504 case NETCONN_TCP: 00505 err = netconn_write(sock->conn, data, size, NETCONN_COPY); 00506 break; 00507 default: 00508 err = ERR_ARG; 00509 break; 00510 } 00511 if(err != ERR_OK) { 00512 DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d\n", s, err)); 00513 sock_set_errno(sock, err_to_errno(err)); 00514 return -1; 00515 } 00516 00517 DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) ok size=%d\n", s, size)); 00518 sock_set_errno(sock, 0); 00519 return size; 00520 } |
Here is the call graph for this function:
|
Definition at line 523 of file sockets.c. References ip_addr::addr, data, DEBUGF, ERR_OK, get_socket(), ip_addr_debug_print, lwip_send(), netconn_connect(), netconn_disconnect(), netconn_peer(), ntohs, SOCKETS_DEBUG, and u16_t.
00525 { 00526 struct lwip_socket *sock; 00527 struct ip_addr remote_addr, addr; 00528 u16_t remote_port, port; 00529 int ret,connected; 00530 00531 sock = get_socket(s); 00532 if(!sock) { 00533 return -1; 00534 } 00535 00536 /* get the peer if currently connected */ 00537 connected = (netconn_peer(sock->conn, &addr, &port) == ERR_OK); 00538 00539 remote_addr.addr = ((struct sockaddr_in *)to)->sin_addr.s_addr; 00540 remote_port = ((struct sockaddr_in *)to)->sin_port; 00541 00542 #if SOCKETS_DEBUG 00543 DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, size=%d, flags=0x%x to=", s, data, size, flags)); 00544 ip_addr_debug_print(&remote_addr); 00545 DEBUGF(SOCKETS_DEBUG, (" port=%u\n", ntohs(remote_port))); 00546 #endif 00547 00548 netconn_connect(sock->conn, &remote_addr, ntohs(remote_port)); 00549 00550 ret = lwip_send(s, data, size, flags); 00551 00552 /* reset the remote address and port number 00553 of the connection */ 00554 if(connected) 00555 netconn_connect(sock->conn, &addr, port); 00556 else 00557 netconn_disconnect(sock->conn); 00558 return ret; 00559 } |
Here is the call graph for this function:
|
Definition at line 995 of file sockets.c. References DEBUGF, get_socket(), lwip_socket(), SO_REUSEADDR, sock_set_errno, SOCKETS_DEBUG, and SOL_SOCKET.
00996 { 00997 struct lwip_socket *sock = get_socket(s); 00998 int err = ENOSYS; 00999 01000 if(!sock) { 01001 return -1; 01002 } 01003 01004 if(level == SOL_SOCKET) { 01005 switch(optname) { 01006 case SO_REUSEADDR: 01007 DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, SO_REUSEADDR, ..)\n", s)); 01008 /* XXX just pretend we support this for now */ 01009 err = 0; 01010 break; 01011 default: 01012 DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname)); 01013 break; 01014 } 01015 } else { 01016 DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname)); 01017 } 01018 01019 sock_set_errno(sock, err); 01020 return err ? -1 : 0; 01021 } |
Here is the call graph for this function:
|
Definition at line 887 of file sockets.c. References DEBUGF, lwip_close(), and SOCKETS_DEBUG.
00888 { 00889 DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how)); 00890 return lwip_close(s); /* XXX temporary hack until proper implementation */ 00891 } |
Here is the call graph for this function:
|
Definition at line 562 of file sockets.c. References alloc_socket(), conn, DEBUGF, event_callback(), netconn_delete(), netconn_new_with_callback(), NETCONN_TCP, NETCONN_UDP, PF_INET, set_errno, SOCK_DGRAM, SOCK_STREAM, netconn::socket, and SOCKETS_DEBUG. Referenced by event_callback(), lwip_getpeername(), lwip_getsockname(), lwip_getsockopt(), lwip_ioctl(), lwip_selscan(), and lwip_setsockopt().
00563 { 00564 struct netconn *conn; 00565 int i; 00566 00567 /* create a netconn */ 00568 switch(type) { 00569 case SOCK_DGRAM: 00570 conn = netconn_new_with_callback(NETCONN_UDP, event_callback); 00571 DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); 00572 break; 00573 case SOCK_STREAM: 00574 conn = netconn_new_with_callback(NETCONN_TCP, event_callback); 00575 DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); 00576 break; 00577 default: 00578 DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", domain, type, protocol)); 00579 set_errno(EINVAL); 00580 return -1; 00581 } 00582 00583 if(!conn) { 00584 DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n")); 00585 set_errno(ENOBUFS); 00586 return -1; 00587 } 00588 00589 i = alloc_socket(conn); 00590 00591 if(i == -1) { 00592 netconn_delete(conn); 00593 set_errno(ENOBUFS); 00594 return -1; 00595 } 00596 conn->socket = i; 00597 DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); 00598 set_errno(0); 00599 return i; 00600 } |
Here is the call graph for this function:
|
Definition at line 603 of file sockets.c. References data, and lwip_send().
00604 { 00605 return lwip_send(s, data, size, 0); 00606 } |
Here is the call graph for this function:
|
Initial value: { 0, ENOMEM, ENOBUFS, ECONNABORTED, ECONNRESET, ESHUTDOWN, ENOTCONN, EINVAL, EIO, EHOSTUNREACH, EADDRINUSE } |
|
Definition at line 74 of file sockets.c. Referenced by event_callback(), and lwip_select(). |
|
Definition at line 77 of file sockets.c. Referenced by event_callback(), and lwip_select(). |
|
Definition at line 73 of file sockets.c. Referenced by alloc_socket(), and get_socket(). |
|
Definition at line 76 of file sockets.c. Referenced by alloc_socket(), lwip_accept(), and lwip_close(). |