#include "lwip/opt.h"Include dependency graph for sockets.h:
This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
Data Structures | |
| struct | fd_set |
| struct | linger |
| struct | sockaddr |
| struct | sockaddr_in |
| struct | timeval |
Defines | |
| #define | socklen_t int |
| #define | SOCK_STREAM 1 |
| #define | SOCK_DGRAM 2 |
| #define | SOCK_RAW 3 |
| #define | SO_DEBUG 0x0001 |
| #define | SO_ACCEPTCONN 0x0002 |
| #define | SO_REUSEADDR 0x0004 |
| #define | SO_KEEPALIVE 0x0008 |
| #define | SO_DONTROUTE 0x0010 |
| #define | SO_BROADCAST 0x0020 |
| #define | SO_USELOOPBACK 0x0040 |
| #define | SO_LINGER 0x0080 |
| #define | SO_OOBINLINE 0x0100 |
| #define | SO_DONTLINGER (int)(~SO_LINGER) |
| #define | SO_SNDBUF 0x1001 |
| #define | SO_RCVBUF 0x1002 |
| #define | SO_SNDLOWAT 0x1003 |
| #define | SO_RCVLOWAT 0x1004 |
| #define | SO_SNDTIMEO 0x1005 |
| #define | SO_RCVTIMEO 0x1006 |
| #define | SO_ERROR 0x1007 |
| #define | SO_TYPE 0x1008 |
| #define | SOL_SOCKET 0xfff |
| #define | AF_UNSPEC 0 |
| #define | AF_INET 2 |
| #define | PF_INET AF_INET |
| #define | IPPROTO_TCP 6 |
| #define | IPPROTO_UDP 17 |
| #define | INADDR_ANY 0 |
| #define | INADDR_BROADCAST 0xffffffff |
| #define | MSG_DONTWAIT 0x40 |
| #define | IOCPARM_MASK 0x7f |
| #define | IOC_VOID 0x20000000 |
| #define | IOC_OUT 0x40000000 |
| #define | IOC_IN 0x80000000 |
| #define | IOC_INOUT (IOC_IN|IOC_OUT) |
| #define | _IO(x, y) (IOC_VOID|((x)<<8)|(y)) |
| #define | _IOR(x, y, t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) |
| #define | _IOW(x, y, t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) |
| #define | FIONREAD _IOR('f', 127, unsigned long) |
| #define | FIONBIO _IOW('f', 126, unsigned long) |
| #define | SIOCSHIWAT _IOW('s', 0, unsigned long) |
| #define | SIOCGHIWAT _IOR('s', 1, unsigned long) |
| #define | SIOCSLOWAT _IOW('s', 2, unsigned long) |
| #define | SIOCGLOWAT _IOR('s', 3, unsigned long) |
| #define | SIOCATMARK _IOR('s', 7, unsigned long) |
| #define | O_NONBLOCK 04000 |
| #define | FD_SETSIZE 16 |
| #define | FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) |
| #define | FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) |
| #define | FD_ISSET(n, p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) |
| #define | FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) |
Typedefs | |
| typedef fd_set | fd_set |
Functions | |
| int | lwip_accept (int s, struct sockaddr *addr, socklen_t *addrlen) |
| int | lwip_bind (int s, struct sockaddr *name, socklen_t namelen) |
| 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_close (int s) |
| int | lwip_connect (int s, struct sockaddr *name, socklen_t namelen) |
| int | lwip_listen (int s, int backlog) |
| int | lwip_recv (int s, void *mem, int len, unsigned int flags) |
| int | lwip_read (int s, void *mem, int len) |
| int | lwip_recvfrom (int s, void *mem, int len, unsigned int flags, struct sockaddr *from, socklen_t *fromlen) |
| int | lwip_send (int s, void *dataptr, int size, unsigned int flags) |
| int | lwip_sendto (int s, void *dataptr, 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 *dataptr, int size) |
| int | lwip_select (int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout) |
| int | lwip_ioctl (int s, long cmd, void *argp) |
|
|
|
|
|
|
|
|
|
|
|
Definition at line 106 of file sockets.h. Referenced by addr_callback(), ares_gethostbyaddr(), ares_gethostbyname(), ares_parse_a_reply(), dns_client(), fake_hostent(), gethostbyaddr(), gethostbynameaddr(), lwip_accept(), lwip_getpeername(), lwip_getsockname(), lwip_recvfrom(), main(), open_tcp_socket(), open_udp_socket(), and sock_udpclient(). |
|
|
Definition at line 105 of file sockets.h. Referenced by lwip_connect(). |
|
|
|
|
|
Definition at line 169 of file sockets.h. Referenced by event_callback(), lwip_selscan(), read_tcp_data(), read_udp_packets(), and write_tcp_data(). |
|
|
Definition at line 167 of file sockets.h. Referenced by ares_fds(), and lwip_selscan(). |
|
|
|
|
|
Definition at line 170 of file sockets.h. Referenced by dns_client(), gethostbynameaddr(), lwip_select(), and lwip_selscan(). |
|
|
Definition at line 148 of file sockets.h. Referenced by lwip_ioctl(), and open_tcp_socket(). |
|
|
Definition at line 145 of file sockets.h. Referenced by lwip_ioctl(). |
|
|
Definition at line 112 of file sockets.h. Referenced by main(), and sock_udpclient(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 116 of file sockets.h. Referenced by lwip_recvfrom(). |
|
|
Definition at line 161 of file sockets.h. Referenced by lwip_ioctl(), lwip_recvfrom(), and open_tcp_socket(). |
|
|
Definition at line 107 of file sockets.h. Referenced by lwip_socket(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 86 of file sockets.h. Referenced by lwip_getsockopt(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 67 of file sockets.h. Referenced by lwip_setsockopt(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 59 of file sockets.h. Referenced by lwip_socket(), main(), and open_udp_socket(). |
|
|
|
|
|
Definition at line 58 of file sockets.h. Referenced by lwip_socket(), main(), open_tcp_socket(), and sock_udpclient(). |
|
|
|
|
|
Definition at line 102 of file sockets.h. Referenced by lwip_getsockopt(), and lwip_setsockopt(). |
|
|
|
|
||||||||||||||||
|
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 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:
1.3.4