Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / geekos / include / lwip / lwip / sockets.h
1 /*
2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
3  * All rights reserved. 
4  * 
5  * Redistribution and use in source and binary forms, with or without modification, 
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission. 
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
25  * OF SUCH DAMAGE.
26  *
27  * This file is part of the lwIP TCP/IP stack.
28  * 
29  * Author: Adam Dunkels <adam@sics.se>
30  *
31  */
32
33
34 #ifndef __LWIP_SOCKETS_H__
35 #define __LWIP_SOCKETS_H__
36
37 #include "lwip/opt.h"
38
39 #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
40
41 #include "lwip/ip_addr.h"
42 #include "lwip/inet.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /* members are in network byte order */
49 struct sockaddr_in {
50   u8_t sin_len;
51   u8_t sin_family;
52   u16_t sin_port;
53   struct in_addr sin_addr;
54   char sin_zero[8];
55 };
56
57 struct sockaddr {
58   u8_t sa_len;
59   u8_t sa_family;
60   char sa_data[14];
61 };
62
63 #ifndef socklen_t
64 #  define socklen_t u32_t
65 #endif
66
67 /* Socket protocol types (TCP/UDP/RAW) */
68 #define SOCK_STREAM     1
69 #define SOCK_DGRAM      2
70 #define SOCK_RAW        3
71         
72 #if 0  /* already defined in lwip/arch.h */
73 /* added by Lei */
74 #define ENOOK          0      /* No error, everything OK. */
75 #define ENOMEM        -1      /* Out of memory error.     */
76 #define ENOBUFS       -2      /* Buffer error.            */
77 #define EHOSTUNREACH  -3      /* Routing problem.         */
78 #define ECONNABORTED  -4      /* Connection aborted.      */
79 #define ECONNRESET    -5      /* Connection reset.        */
80 #define ESHUTDOWN     -6      /* Connection closed.       */
81 #define ENOTCONN      -7      /* Not connected.           */
82 #define EINVAL        -8      /* Illegal value.           */
83 #define EIO           -9      /* Illegal argument.        */
84 #define EADDRINUSE    -10     /* Address in use.          */
85 #define ETIMEDOUT     -13     /* Timeout                  */
86 #define EINPROGRESS   -14     /* Operation in progress    */
87 #endif
88         
89 /*
90  * Option flags per-socket. These must match the SOF_ flags in ip.h!
91  */
92 #define  SO_DEBUG       0x0001 /* Unimplemented: turn on debugging info recording */
93 #define  SO_ACCEPTCONN  0x0002 /* socket has had listen() */
94 #define  SO_REUSEADDR   0x0004 /* Unimplemented: allow local address reuse */
95 #define  SO_KEEPALIVE   0x0008 /* keep connections alive */
96 #define  SO_DONTROUTE   0x0010 /* Unimplemented: just use interface addresses */
97 #define  SO_BROADCAST   0x0020 /* Unimplemented: permit sending of broadcast msgs */
98 #define  SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
99 #define  SO_LINGER      0x0080 /* linger on close if data present */
100 #define  SO_OOBINLINE   0x0100 /* Unimplemented: leave received OOB data in line */
101 #define  SO_REUSEPORT   0x0200 /* Unimplemented: allow local address & port reuse */
102
103 #define SO_DONTLINGER   ((int)(~SO_LINGER))
104
105 /*
106  * Additional options, not kept in so_options.
107  */
108 #define SO_SNDBUF    0x1001    /* Unimplemented: send buffer size */
109 #define SO_RCVBUF    0x1002    /* receive buffer size */
110 #define SO_SNDLOWAT  0x1003    /* Unimplemented: send low-water mark */
111 #define SO_RCVLOWAT  0x1004    /* Unimplemented: receive low-water mark */
112 #define SO_SNDTIMEO  0x1005    /* Unimplemented: send timeout */
113 #define SO_RCVTIMEO  0x1006    /* receive timeout */
114 #define SO_ERROR     0x1007    /* get error status and clear */
115 #define SO_TYPE      0x1008    /* get socket type */
116 #define SO_CONTIMEO  0x1009    /* Unimplemented: connect timeout */
117 #define SO_NO_CHECK  0x100a    /* don't create UDP checksum */
118
119
120 /*
121  * Structure used for manipulating linger option.
122  */
123 struct linger {
124        int l_onoff;                /* option on/off */
125        int l_linger;               /* linger time */
126 };
127
128 /*
129  * Level number for (get/set)sockopt() to apply to socket itself.
130  */
131 #define  SOL_SOCKET  0xfff    /* options for socket level */
132
133
134 #define AF_UNSPEC       0
135 #define AF_INET         2
136 #define PF_INET         AF_INET
137 #define PF_UNSPEC       AF_UNSPEC
138
139 #define IPPROTO_IP      0
140 #define IPPROTO_TCP     6
141 #define IPPROTO_UDP     17
142 #define IPPROTO_UDPLITE 136
143
144 #define INADDR_ANY       0
145 #define INADDR_BROADCAST 0xffffffff
146
147 /* Flags we can use with send and recv. */
148 #define MSG_PEEK       0x01    /* Peeks at an incoming message */
149 #define MSG_WAITALL    0x02    /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
150 #define MSG_OOB        0x04    /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
151 #define MSG_DONTWAIT   0x08    /* Nonblocking i/o for this operation only */
152 #define MSG_MORE       0x10    /* Sender will send more */
153
154
155 /*
156  * Options for level IPPROTO_IP
157  */
158 #define IP_TOS             1
159 #define IP_TTL             2
160
161 #if LWIP_TCP
162 /*
163  * Options for level IPPROTO_TCP
164  */
165 #define TCP_NODELAY    0x01    /* don't delay send to coalesce packets */
166 #define TCP_KEEPALIVE  0x02    /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
167 #define TCP_KEEPIDLE   0x03    /* set pcb->keep_idle  - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
168 #define TCP_KEEPINTVL  0x04    /* set pcb->keep_intvl - Use seconds for get/setsockopt */
169 #define TCP_KEEPCNT    0x05    /* set pcb->keep_cnt   - Use number of probes sent for get/setsockopt */
170 #endif /* LWIP_TCP */
171
172 #if LWIP_UDP && LWIP_UDPLITE
173 /*
174  * Options for level IPPROTO_UDPLITE
175  */
176 #define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
177 #define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
178 #endif /* LWIP_UDP && LWIP_UDPLITE*/
179
180
181 #if LWIP_IGMP
182 /*
183  * Options and types for UDP multicast traffic handling
184  */
185 #define IP_ADD_MEMBERSHIP  3
186 #define IP_DROP_MEMBERSHIP 4
187 #define IP_MULTICAST_TTL   5
188 #define IP_MULTICAST_IF    6
189 #define IP_MULTICAST_LOOP  7
190
191 typedef struct ip_mreq {
192     struct in_addr imr_multiaddr; /* IP multicast address of group */
193     struct in_addr imr_interface; /* local IP address of interface */
194 } ip_mreq;
195 #endif /* LWIP_IGMP */
196
197 /* Unimplemented for now... */
198 #define IPTOS_TOS_MASK          0x1E
199 #define IPTOS_TOS(tos)          ((tos) & IPTOS_TOS_MASK)
200 #define IPTOS_LOWDELAY          0x10
201 #define IPTOS_THROUGHPUT        0x08
202 #define IPTOS_RELIABILITY       0x04
203 #define IPTOS_LOWCOST           0x02
204 #define IPTOS_MINCOST           IPTOS_LOWCOST
205
206 /*
207  * Definitions for IP precedence (also in ip_tos) (Unimplemented)
208  */
209 #define IPTOS_PREC_MASK                 0xe0
210 #define IPTOS_PREC(tos)                ((tos) & IPTOS_PREC_MASK)
211 #define IPTOS_PREC_NETCONTROL           0xe0
212 #define IPTOS_PREC_INTERNETCONTROL      0xc0
213 #define IPTOS_PREC_CRITIC_ECP           0xa0
214 #define IPTOS_PREC_FLASHOVERRIDE        0x80
215 #define IPTOS_PREC_FLASH                0x60
216 #define IPTOS_PREC_IMMEDIATE            0x40
217 #define IPTOS_PREC_PRIORITY             0x20
218 #define IPTOS_PREC_ROUTINE              0x00
219
220
221 /*
222  * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
223  * lwip_ioctl only supports FIONREAD and FIONBIO, for now
224  *
225  * Ioctl's have the command encoded in the lower word,
226  * and the size of any in or out parameters in the upper
227  * word.  The high 2 bits of the upper word are used
228  * to encode the in/out status of the parameter; for now
229  * we restrict parameters to at most 128 bytes.
230  */
231 #if !defined(FIONREAD) || !defined(FIONBIO)
232 #define IOCPARM_MASK    0x7fU           /* parameters must be < 128 bytes */
233 #define IOC_VOID        0x20000000UL    /* no parameters */
234 #define IOC_OUT         0x40000000UL    /* copy out parameters */
235 #define IOC_IN          0x80000000UL    /* copy in parameters */
236 #define IOC_INOUT       (IOC_IN|IOC_OUT)
237                                         /* 0x20000000 distinguishes new &
238                                            old ioctl's */
239 #define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
240
241 #define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
242
243 #define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
244 #endif /* !defined(FIONREAD) || !defined(FIONBIO) */
245
246 #ifndef FIONREAD
247 #define FIONREAD    _IOR('f', 127, unsigned long) /* get # bytes to read */
248 #endif
249 #ifndef FIONBIO
250 #define FIONBIO     _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
251 #endif
252
253 /* Socket I/O Controls: unimplemented */
254 #ifndef SIOCSHIWAT
255 #define SIOCSHIWAT  _IOW('s',  0, unsigned long)  /* set high watermark */
256 #define SIOCGHIWAT  _IOR('s',  1, unsigned long)  /* get high watermark */
257 #define SIOCSLOWAT  _IOW('s',  2, unsigned long)  /* set low watermark */
258 #define SIOCGLOWAT  _IOR('s',  3, unsigned long)  /* get low watermark */
259 #define SIOCATMARK  _IOR('s',  7, unsigned long)  /* at oob mark? */
260 #endif
261
262 /* Socket flags: */
263 #ifndef O_NONBLOCK
264 #define O_NONBLOCK    04000U
265 #endif
266
267 /* FD_SET used for lwip_select */
268 #ifndef FD_SET
269   #undef  FD_SETSIZE
270   /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
271   #define FD_SETSIZE    MEMP_NUM_NETCONN
272   #define FD_SET(n, p)  ((p)->fd_bits[(n)/8] |=  (1 << ((n) & 7)))
273   #define FD_CLR(n, p)  ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
274   #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] &   (1 << ((n) & 7)))
275   #define FD_ZERO(p)    memset((void*)(p),0,sizeof(*(p)))
276
277   typedef struct fd_set {
278           unsigned char fd_bits [(FD_SETSIZE+7)/8];
279         } fd_set;
280
281 #endif /* FD_SET */
282
283 /** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
284  * by your system, set this to 0 and include <sys/time.h> in cc.h */ 
285 #ifndef LWIP_TIMEVAL_PRIVATE
286 #define LWIP_TIMEVAL_PRIVATE 1
287 #endif
288
289 #if LWIP_TIMEVAL_PRIVATE
290 struct timeval {
291   long    tv_sec;         /* seconds */
292   long    tv_usec;        /* and microseconds */
293 };
294 #endif /* LWIP_TIMEVAL_PRIVATE */
295
296 void lwip_socket_init(void);
297
298 int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
299 int lwip_bind(int s, struct sockaddr *name, socklen_t namelen);
300 int lwip_shutdown(int s, int how);
301 int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
302 int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
303 int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
304 int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
305 int lwip_close(int s);
306 int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);
307 int lwip_listen(int s, int backlog);
308 int lwip_recv(int s, void *mem, int len, unsigned int flags);
309 int lwip_read(int s, void *mem, int len);
310 int lwip_recvfrom(int s, void *mem, int len, unsigned int flags,
311       struct sockaddr *from, socklen_t *fromlen);
312 int lwip_send(int s, const void *dataptr, int size, unsigned int flags);
313 int lwip_sendto(int s, const void *dataptr, int size, unsigned int flags,
314     struct sockaddr *to, socklen_t tolen);
315 int lwip_socket(int domain, int type, int protocol);
316 int lwip_write(int s, const void *dataptr, int size);
317 int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout);
318 int lwip_ioctl(int s, long cmd, void *argp);
319
320 #if LWIP_COMPAT_SOCKETS
321 #define accept(a,b,c)         lwip_accept(a,b,c)
322 #define bind(a,b,c)           lwip_bind(a,b,c)
323 #define shutdown(a,b)         lwip_shutdown(a,b)
324 #define closesocket(s)        lwip_close(s)
325 #define connect(a,b,c)        lwip_connect(a,b,c)
326 #define getsockname(a,b,c)    lwip_getsockname(a,b,c)
327 #define getpeername(a,b,c)    lwip_getpeername(a,b,c)
328 #define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e)
329 #define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e)
330 #define listen(a,b)           lwip_listen(a,b)
331 #define recv(a,b,c,d)         lwip_recv(a,b,c,d)
332 #define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f)
333 #define send(a,b,c,d)         lwip_send(a,b,c,d)
334 #define sendto(a,b,c,d,e,f)   lwip_sendto(a,b,c,d,e,f)
335 #define socket(a,b,c)         lwip_socket(a,b,c)
336 #define select(a,b,c,d,e)     lwip_select(a,b,c,d,e)
337 #define ioctlsocket(a,b,c)    lwip_ioctl(a,b,c)
338
339 #if LWIP_POSIX_SOCKETS_IO_NAMES
340 #define read(a,b,c)           lwip_read(a,b,c)
341 #define write(a,b,c)          lwip_write(a,b,c)
342 #define close(s)              lwip_close(s)
343 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
344
345 #endif /* LWIP_COMPAT_SOCKETS */
346
347 #ifdef __cplusplus
348 }
349 #endif
350
351 #endif /* LWIP_SOCKET */
352
353 #endif /* __LWIP_SOCKETS_H__ */