Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of lwip by
sockets.h
00001 /* 00002 * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without modification, 00006 * are permitted provided that the following conditions are met: 00007 * 00008 * 1. Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright notice, 00011 * this list of conditions and the following disclaimer in the documentation 00012 * and/or other materials provided with the distribution. 00013 * 3. The name of the author may not be used to endorse or promote products 00014 * derived from this software without specific prior written permission. 00015 * 00016 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 00017 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00018 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 00019 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00020 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00021 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00022 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00023 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 00024 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 00025 * OF SUCH DAMAGE. 00026 * 00027 * This file is part of the lwIP TCP/IP stack. 00028 * 00029 * Author: Adam Dunkels <adam@sics.se> 00030 * 00031 */ 00032 00033 00034 #ifndef __LWIP_SOCKETS_H__ 00035 #define __LWIP_SOCKETS_H__ 00036 00037 #include "lwip/opt.h" 00038 00039 #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ 00040 00041 #include <stddef.h> /* for size_t */ 00042 00043 #include "lwip/ip_addr.h" 00044 #include "lwip/inet.h" 00045 00046 #ifdef __cplusplus 00047 extern "C" { 00048 #endif 00049 00050 /* members are in network byte order */ 00051 struct sockaddr_in { 00052 u8_t sin_len; 00053 u8_t sin_family; 00054 u16_t sin_port; 00055 struct in_addr sin_addr; 00056 char sin_zero[8]; 00057 }; 00058 00059 struct sockaddr { 00060 u8_t sa_len; 00061 u8_t sa_family; 00062 char sa_data[14]; 00063 }; 00064 00065 #ifndef socklen_t 00066 # define socklen_t u32_t 00067 #endif 00068 00069 /* Socket protocol types (TCP/UDP/RAW) */ 00070 #define SOCK_STREAM 1 00071 #define SOCK_DGRAM 2 00072 #define SOCK_RAW 3 00073 00074 /* 00075 * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) 00076 */ 00077 #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ 00078 #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 00079 #define SO_REUSEADDR 0x0004 /* Allow local address reuse */ 00080 #define SO_KEEPALIVE 0x0008 /* keep connections alive */ 00081 #define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ 00082 #define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ 00083 #define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ 00084 #define SO_LINGER 0x0080 /* linger on close if data present */ 00085 #define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ 00086 #define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ 00087 00088 #define SO_DONTLINGER ((int)(~SO_LINGER)) 00089 00090 /* 00091 * Additional options, not kept in so_options. 00092 */ 00093 #define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ 00094 #define SO_RCVBUF 0x1002 /* receive buffer size */ 00095 #define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ 00096 #define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ 00097 #define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */ 00098 #define SO_RCVTIMEO 0x1006 /* receive timeout */ 00099 #define SO_ERROR 0x1007 /* get error status and clear */ 00100 #define SO_TYPE 0x1008 /* get socket type */ 00101 #define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ 00102 #define SO_NO_CHECK 0x100a /* don't create UDP checksum */ 00103 00104 00105 /* 00106 * Structure used for manipulating linger option. 00107 */ 00108 struct linger { 00109 int l_onoff; /* option on/off */ 00110 int l_linger; /* linger time */ 00111 }; 00112 00113 /* 00114 * Level number for (get/set)sockopt() to apply to socket itself. 00115 */ 00116 #define SOL_SOCKET 0xfff /* options for socket level */ 00117 00118 00119 #define AF_UNSPEC 0 00120 #define AF_INET 2 00121 #define PF_INET AF_INET 00122 #define PF_UNSPEC AF_UNSPEC 00123 00124 #define IPPROTO_IP 0 00125 #define IPPROTO_TCP 6 00126 #define IPPROTO_UDP 17 00127 #define IPPROTO_UDPLITE 136 00128 00129 /* Flags we can use with send and recv. */ 00130 #define MSG_PEEK 0x01 /* Peeks at an incoming message */ 00131 #define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ 00132 #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ 00133 #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ 00134 #define MSG_MORE 0x10 /* Sender will send more */ 00135 00136 00137 /* 00138 * Options for level IPPROTO_IP 00139 */ 00140 #define IP_TOS 1 00141 #define IP_TTL 2 00142 00143 #if LWIP_TCP 00144 /* 00145 * Options for level IPPROTO_TCP 00146 */ 00147 #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ 00148 #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ 00149 #define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ 00150 #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ 00151 #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ 00152 #endif /* LWIP_TCP */ 00153 00154 #if LWIP_UDP && LWIP_UDPLITE 00155 /* 00156 * Options for level IPPROTO_UDPLITE 00157 */ 00158 #define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ 00159 #define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ 00160 #endif /* LWIP_UDP && LWIP_UDPLITE*/ 00161 00162 00163 #if LWIP_IGMP 00164 /* 00165 * Options and types for UDP multicast traffic handling 00166 */ 00167 #define IP_ADD_MEMBERSHIP 3 00168 #define IP_DROP_MEMBERSHIP 4 00169 #define IP_MULTICAST_TTL 5 00170 #define IP_MULTICAST_IF 6 00171 #define IP_MULTICAST_LOOP 7 00172 00173 typedef struct ip_mreq { 00174 struct in_addr imr_multiaddr; /* IP multicast address of group */ 00175 struct in_addr imr_interface; /* local IP address of interface */ 00176 } ip_mreq; 00177 #endif /* LWIP_IGMP */ 00178 00179 /* 00180 * The Type of Service provides an indication of the abstract 00181 * parameters of the quality of service desired. These parameters are 00182 * to be used to guide the selection of the actual service parameters 00183 * when transmitting a datagram through a particular network. Several 00184 * networks offer service precedence, which somehow treats high 00185 * precedence traffic as more important than other traffic (generally 00186 * by accepting only traffic above a certain precedence at time of high 00187 * load). The major choice is a three way tradeoff between low-delay, 00188 * high-reliability, and high-throughput. 00189 * The use of the Delay, Throughput, and Reliability indications may 00190 * increase the cost (in some sense) of the service. In many networks 00191 * better performance for one of these parameters is coupled with worse 00192 * performance on another. Except for very unusual cases at most two 00193 * of these three indications should be set. 00194 */ 00195 #define IPTOS_TOS_MASK 0x1E 00196 #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) 00197 #define IPTOS_LOWDELAY 0x10 00198 #define IPTOS_THROUGHPUT 0x08 00199 #define IPTOS_RELIABILITY 0x04 00200 #define IPTOS_LOWCOST 0x02 00201 #define IPTOS_MINCOST IPTOS_LOWCOST 00202 00203 /* 00204 * The Network Control precedence designation is intended to be used 00205 * within a network only. The actual use and control of that 00206 * designation is up to each network. The Internetwork Control 00207 * designation is intended for use by gateway control originators only. 00208 * If the actual use of these precedence designations is of concern to 00209 * a particular network, it is the responsibility of that network to 00210 * control the access to, and use of, those precedence designations. 00211 */ 00212 #define IPTOS_PREC_MASK 0xe0 00213 #define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) 00214 #define IPTOS_PREC_NETCONTROL 0xe0 00215 #define IPTOS_PREC_INTERNETCONTROL 0xc0 00216 #define IPTOS_PREC_CRITIC_ECP 0xa0 00217 #define IPTOS_PREC_FLASHOVERRIDE 0x80 00218 #define IPTOS_PREC_FLASH 0x60 00219 #define IPTOS_PREC_IMMEDIATE 0x40 00220 #define IPTOS_PREC_PRIORITY 0x20 00221 #define IPTOS_PREC_ROUTINE 0x00 00222 00223 00224 /* 00225 * Commands for ioctlsocket(), taken from the BSD file fcntl.h. 00226 * lwip_ioctl only supports FIONREAD and FIONBIO, for now 00227 * 00228 * Ioctl's have the command encoded in the lower word, 00229 * and the size of any in or out parameters in the upper 00230 * word. The high 2 bits of the upper word are used 00231 * to encode the in/out status of the parameter; for now 00232 * we restrict parameters to at most 128 bytes. 00233 */ 00234 #if !defined(FIONREAD) || !defined(FIONBIO) 00235 #define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ 00236 #define IOC_VOID 0x20000000UL /* no parameters */ 00237 #define IOC_OUT 0x40000000UL /* copy out parameters */ 00238 #define IOC_IN 0x80000000UL /* copy in parameters */ 00239 #define IOC_INOUT (IOC_IN|IOC_OUT) 00240 /* 0x20000000 distinguishes new & 00241 old ioctl's */ 00242 #define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) 00243 00244 #define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) 00245 00246 #define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) 00247 #endif /* !defined(FIONREAD) || !defined(FIONBIO) */ 00248 00249 #ifndef FIONREAD 00250 #define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ 00251 #endif 00252 #ifndef FIONBIO 00253 #define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ 00254 #endif 00255 00256 /* Socket I/O Controls: unimplemented */ 00257 #ifndef SIOCSHIWAT 00258 #define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ 00259 #define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ 00260 #define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ 00261 #define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ 00262 #define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ 00263 #endif 00264 00265 /* commands for fnctl */ 00266 #ifndef F_GETFL 00267 #define F_GETFL 3 00268 #endif 00269 #ifndef F_SETFL 00270 #define F_SETFL 4 00271 #endif 00272 00273 /* File status flags and file access modes for fnctl, 00274 these are bits in an int. */ 00275 #ifndef O_NONBLOCK 00276 #define O_NONBLOCK 1 /* nonblocking I/O */ 00277 #endif 00278 #ifndef O_NDELAY 00279 #define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */ 00280 #endif 00281 00282 #ifndef SHUT_RD 00283 #define SHUT_RD 0 00284 #define SHUT_WR 1 00285 #define SHUT_RDWR 2 00286 #endif 00287 00288 /* FD_SET used for lwip_select */ 00289 #ifndef FD_SET 00290 #undef FD_SETSIZE 00291 /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ 00292 #define FD_SETSIZE MEMP_NUM_NETCONN 00293 #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) 00294 #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) 00295 #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) 00296 #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) 00297 00298 typedef struct fd_set { 00299 unsigned char fd_bits [(FD_SETSIZE+7)/8]; 00300 } fd_set; 00301 00302 #endif /* FD_SET */ 00303 00304 /** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided 00305 * by your system, set this to 0 and include <sys/time.h> in cc.h */ 00306 #ifndef LWIP_TIMEVAL_PRIVATE 00307 #define LWIP_TIMEVAL_PRIVATE 1 00308 #endif 00309 00310 #if LWIP_TIMEVAL_PRIVATE 00311 struct timeval { 00312 long tv_sec; /* seconds */ 00313 long tv_usec; /* and microseconds */ 00314 }; 00315 #endif /* LWIP_TIMEVAL_PRIVATE */ 00316 00317 void lwip_socket_init(void); 00318 00319 int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); 00320 int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); 00321 int lwip_shutdown(int s, int how); 00322 int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); 00323 int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); 00324 int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); 00325 int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); 00326 int lwip_close(int s); 00327 int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); 00328 int lwip_listen(int s, int backlog); 00329 int lwip_recv(int s, void *mem, size_t len, int flags); 00330 int lwip_read(int s, void *mem, size_t len); 00331 int lwip_recvfrom(int s, void *mem, size_t len, int flags, 00332 struct sockaddr *from, socklen_t *fromlen); 00333 int lwip_send(int s, const void *dataptr, size_t size, int flags); 00334 int lwip_sendto (int s, const void *dataptr, size_t size, int flags, 00335 const struct sockaddr *to, socklen_t tolen); 00336 int lwip_socket(int domain, int type, int protocol); 00337 int lwip_write(int s, const void *dataptr, size_t size); 00338 int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, 00339 struct timeval *timeout); 00340 int lwip_ioctl(int s, long cmd, void *argp); 00341 int lwip_fcntl(int s, int cmd, int val); 00342 00343 #if LWIP_COMPAT_SOCKETS 00344 #define accept(a,b,c) lwip_accept(a,b,c) 00345 #define bind(a,b,c) lwip_bind(a,b,c) 00346 #define shutdown(a,b) lwip_shutdown(a,b) 00347 #define closesocket(s) lwip_close(s) 00348 #define connect(a,b,c) lwip_connect(a,b,c) 00349 #define getsockname(a,b,c) lwip_getsockname(a,b,c) 00350 #define getpeername(a,b,c) lwip_getpeername(a,b,c) 00351 #define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e) 00352 #define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e) 00353 #define listen(a,b) lwip_listen(a,b) 00354 #define recv(a,b,c,d) lwip_recv(a,b,c,d) 00355 #define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f) 00356 #define send(a,b,c,d) lwip_send(a,b,c,d) 00357 #define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f) 00358 #define socket(a,b,c) lwip_socket(a,b,c) 00359 #define select(a,b,c,d,e) lwip_select(a,b,c,d,e) 00360 #define ioctlsocket(a,b,c) lwip_ioctl(a,b,c) 00361 00362 #if LWIP_POSIX_SOCKETS_IO_NAMES 00363 #define read(a,b,c) lwip_read(a,b,c) 00364 #define write(a,b,c) lwip_write(a,b,c) 00365 #define close(s) lwip_close(s) 00366 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ 00367 00368 #endif /* LWIP_COMPAT_SOCKETS */ 00369 00370 #ifdef __cplusplus 00371 } 00372 #endif 00373 00374 #endif /* LWIP_SOCKET */ 00375 00376 #endif /* __LWIP_SOCKETS_H__ */
Generated on Tue Jul 12 2022 11:29:37 by
