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.
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 "lwip/ip_addr.h" 00042 #include "lwip/inet.h" 00043 00044 #ifdef __cplusplus 00045 extern "C" { 00046 #endif 00047 00048 /* members are in network byte order */ 00049 struct sockaddr_in { 00050 u8_t sin_len; 00051 u8_t sin_family; 00052 u16_t sin_port; 00053 struct in_addr sin_addr; 00054 char sin_zero[8]; 00055 }; 00056 00057 struct sockaddr { 00058 u8_t sa_len; 00059 u8_t sa_family; 00060 char sa_data[14]; 00061 }; 00062 00063 #ifndef socklen_t 00064 # define socklen_t u32_t 00065 #endif 00066 00067 /* Socket protocol types (TCP/UDP/RAW) */ 00068 #define SOCK_STREAM 1 00069 #define SOCK_DGRAM 2 00070 #define SOCK_RAW 3 00071 00072 /* 00073 * Option flags per-socket. These must match the SOF_ flags in ip.h! 00074 */ 00075 #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ 00076 #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 00077 #define SO_REUSEADDR 0x0004 /* Unimplemented: allow local address reuse */ 00078 #define SO_KEEPALIVE 0x0008 /* keep connections alive */ 00079 #define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ 00080 #define SO_BROADCAST 0x0020 /* Unimplemented: permit sending of broadcast msgs */ 00081 #define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ 00082 #define SO_LINGER 0x0080 /* linger on close if data present */ 00083 #define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ 00084 #define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ 00085 00086 #define SO_DONTLINGER ((int)(~SO_LINGER)) 00087 00088 /* 00089 * Additional options, not kept in so_options. 00090 */ 00091 #define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ 00092 #define SO_RCVBUF 0x1002 /* receive buffer size */ 00093 #define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ 00094 #define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ 00095 #define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */ 00096 #define SO_RCVTIMEO 0x1006 /* receive timeout */ 00097 #define SO_ERROR 0x1007 /* get error status and clear */ 00098 #define SO_TYPE 0x1008 /* get socket type */ 00099 #define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ 00100 #define SO_NO_CHECK 0x100a /* don't create UDP checksum */ 00101 00102 00103 /* 00104 * Structure used for manipulating linger option. 00105 */ 00106 struct linger { 00107 int l_onoff; /* option on/off */ 00108 int l_linger; /* linger time */ 00109 }; 00110 00111 /* 00112 * Level number for (get/set)sockopt() to apply to socket itself. 00113 */ 00114 #define SOL_SOCKET 0xfff /* options for socket level */ 00115 00116 00117 #define AF_UNSPEC 0 00118 #define AF_INET 2 00119 #define PF_INET AF_INET 00120 #define PF_UNSPEC AF_UNSPEC 00121 00122 #define IPPROTO_IP 0 00123 #define IPPROTO_TCP 6 00124 #define IPPROTO_UDP 17 00125 #define IPPROTO_UDPLITE 136 00126 00127 /* Flags we can use with send and recv. */ 00128 #define MSG_PEEK 0x01 /* Peeks at an incoming message */ 00129 #define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ 00130 #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ 00131 #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ 00132 #define MSG_MORE 0x10 /* Sender will send more */ 00133 00134 00135 /* 00136 * Options for level IPPROTO_IP 00137 */ 00138 #define IP_TOS 1 00139 #define IP_TTL 2 00140 00141 #if LWIP_TCP 00142 /* 00143 * Options for level IPPROTO_TCP 00144 */ 00145 #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ 00146 #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ 00147 #define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ 00148 #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ 00149 #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ 00150 #endif /* LWIP_TCP */ 00151 00152 #if LWIP_UDP && LWIP_UDPLITE 00153 /* 00154 * Options for level IPPROTO_UDPLITE 00155 */ 00156 #define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ 00157 #define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ 00158 #endif /* LWIP_UDP && LWIP_UDPLITE*/ 00159 00160 00161 #if LWIP_IGMP 00162 /* 00163 * Options and types for UDP multicast traffic handling 00164 */ 00165 #define IP_ADD_MEMBERSHIP 3 00166 #define IP_DROP_MEMBERSHIP 4 00167 #define IP_MULTICAST_TTL 5 00168 #define IP_MULTICAST_IF 6 00169 #define IP_MULTICAST_LOOP 7 00170 00171 typedef struct ip_mreq { 00172 struct in_addr imr_multiaddr; /* IP multicast address of group */ 00173 struct in_addr imr_interface; /* local IP address of interface */ 00174 } ip_mreq; 00175 #endif /* LWIP_IGMP */ 00176 00177 /* 00178 * The Type of Service provides an indication of the abstract 00179 * parameters of the quality of service desired. These parameters are 00180 * to be used to guide the selection of the actual service parameters 00181 * when transmitting a datagram through a particular network. Several 00182 * networks offer service precedence, which somehow treats high 00183 * precedence traffic as more important than other traffic (generally 00184 * by accepting only traffic above a certain precedence at time of high 00185 * load). The major choice is a three way tradeoff between low-delay, 00186 * high-reliability, and high-throughput. 00187 * The use of the Delay, Throughput, and Reliability indications may 00188 * increase the cost (in some sense) of the service. In many networks 00189 * better performance for one of these parameters is coupled with worse 00190 * performance on another. Except for very unusual cases at most two 00191 * of these three indications should be set. 00192 */ 00193 #define IPTOS_TOS_MASK 0x1E 00194 #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) 00195 #define IPTOS_LOWDELAY 0x10 00196 #define IPTOS_THROUGHPUT 0x08 00197 #define IPTOS_RELIABILITY 0x04 00198 #define IPTOS_LOWCOST 0x02 00199 #define IPTOS_MINCOST IPTOS_LOWCOST 00200 00201 /* 00202 * The Network Control precedence designation is intended to be used 00203 * within a network only. The actual use and control of that 00204 * designation is up to each network. The Internetwork Control 00205 * designation is intended for use by gateway control originators only. 00206 * If the actual use of these precedence designations is of concern to 00207 * a particular network, it is the responsibility of that network to 00208 * control the access to, and use of, those precedence designations. 00209 */ 00210 #define IPTOS_PREC_MASK 0xe0 00211 #define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) 00212 #define IPTOS_PREC_NETCONTROL 0xe0 00213 #define IPTOS_PREC_INTERNETCONTROL 0xc0 00214 #define IPTOS_PREC_CRITIC_ECP 0xa0 00215 #define IPTOS_PREC_FLASHOVERRIDE 0x80 00216 #define IPTOS_PREC_FLASH 0x60 00217 #define IPTOS_PREC_IMMEDIATE 0x40 00218 #define IPTOS_PREC_PRIORITY 0x20 00219 #define IPTOS_PREC_ROUTINE 0x00 00220 00221 00222 /* 00223 * Commands for ioctlsocket(), taken from the BSD file fcntl.h. 00224 * lwip_ioctl only supports FIONREAD and FIONBIO, for now 00225 * 00226 * Ioctl's have the command encoded in the lower word, 00227 * and the size of any in or out parameters in the upper 00228 * word. The high 2 bits of the upper word are used 00229 * to encode the in/out status of the parameter; for now 00230 * we restrict parameters to at most 128 bytes. 00231 */ 00232 #if !defined(FIONREAD) || !defined(FIONBIO) 00233 #define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ 00234 #define IOC_VOID 0x20000000UL /* no parameters */ 00235 #define IOC_OUT 0x40000000UL /* copy out parameters */ 00236 #define IOC_IN 0x80000000UL /* copy in parameters */ 00237 #define IOC_INOUT (IOC_IN|IOC_OUT) 00238 /* 0x20000000 distinguishes new & 00239 old ioctl's */ 00240 #define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) 00241 00242 #define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) 00243 00244 #define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) 00245 #endif /* !defined(FIONREAD) || !defined(FIONBIO) */ 00246 00247 #ifndef FIONREAD 00248 #define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ 00249 #endif 00250 #ifndef FIONBIO 00251 #define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ 00252 #endif 00253 00254 /* Socket I/O Controls: unimplemented */ 00255 #ifndef SIOCSHIWAT 00256 #define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ 00257 #define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ 00258 #define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ 00259 #define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ 00260 #define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ 00261 #endif 00262 00263 /* Socket flags: */ 00264 #ifndef O_NONBLOCK 00265 #define O_NONBLOCK 04000U 00266 #endif 00267 00268 /* FD_SET used for lwip_select */ 00269 #ifndef FD_SET 00270 #undef FD_SETSIZE 00271 /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ 00272 #define FD_SETSIZE MEMP_NUM_NETCONN 00273 #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) 00274 #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) 00275 #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) 00276 #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) 00277 00278 typedef struct fd_set { 00279 unsigned char fd_bits [(FD_SETSIZE+7)/8]; 00280 } fd_set; 00281 00282 #endif /* FD_SET */ 00283 00284 /** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided 00285 * by your system, set this to 0 and include <sys/time.h> in cc.h */ 00286 #ifndef LWIP_TIMEVAL_PRIVATE 00287 #define LWIP_TIMEVAL_PRIVATE 1 00288 #endif 00289 00290 #if LWIP_TIMEVAL_PRIVATE 00291 struct timeval { 00292 long tv_sec; /* seconds */ 00293 long tv_usec; /* and microseconds */ 00294 }; 00295 #endif /* LWIP_TIMEVAL_PRIVATE */ 00296 00297 void lwip_socket_init(void); 00298 00299 int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); 00300 int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); 00301 int lwip_shutdown(int s, int how); 00302 int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); 00303 int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); 00304 int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); 00305 int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); 00306 int lwip_close(int s); 00307 int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); 00308 int lwip_listen(int s, int backlog); 00309 int lwip_recv(int s, void *mem, size_t len, int flags); 00310 int lwip_read(int s, void *mem, size_t len); 00311 int lwip_recvfrom(int s, void *mem, size_t len, int flags, 00312 struct sockaddr *from, socklen_t *fromlen); 00313 int lwip_send(int s, const void *dataptr, size_t size, int flags); 00314 int lwip_sendto(int s, const void *dataptr, size_t size, int flags, 00315 const struct sockaddr *to, socklen_t tolen); 00316 int lwip_socket(int domain, int type, int protocol); 00317 int lwip_write(int s, const void *dataptr, size_t size); 00318 int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, 00319 struct timeval *timeout); 00320 int lwip_ioctl(int s, long cmd, void *argp); 00321 00322 #if LWIP_COMPAT_SOCKETS 00323 #define accept(a,b,c) lwip_accept(a,b,c) 00324 #define bind(a,b,c) lwip_bind(a,b,c) 00325 #define shutdown(a,b) lwip_shutdown(a,b) 00326 #define closesocket(s) lwip_close(s) 00327 #define connect(a,b,c) lwip_connect(a,b,c) 00328 #define getsockname(a,b,c) lwip_getsockname(a,b,c) 00329 #define getpeername(a,b,c) lwip_getpeername(a,b,c) 00330 #define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e) 00331 #define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e) 00332 #define listen(a,b) lwip_listen(a,b) 00333 #define recv(a,b,c,d) lwip_recv(a,b,c,d) 00334 #define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f) 00335 #define send(a,b,c,d) lwip_send(a,b,c,d) 00336 #define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f) 00337 #define socket(a,b,c) lwip_socket(a,b,c) 00338 #define select(a,b,c,d,e) lwip_select(a,b,c,d,e) 00339 #define ioctlsocket(a,b,c) lwip_ioctl(a,b,c) 00340 00341 #if LWIP_POSIX_SOCKETS_IO_NAMES 00342 #define read(a,b,c) lwip_read(a,b,c) 00343 #define write(a,b,c) lwip_write(a,b,c) 00344 #define close(s) lwip_close(s) 00345 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ 00346 00347 #endif /* LWIP_COMPAT_SOCKETS */ 00348 00349 #ifdef __cplusplus 00350 } 00351 #endif 00352 00353 #endif /* LWIP_SOCKET */ 00354 00355 #endif /* __LWIP_SOCKETS_H__ */
Generated on Tue Jul 12 2022 19:24:06 by
1.7.2