1 /*
2  * Copyright (C) 2015-2017 Alibaba Group Holding Limited
3  */
4 
5 #ifndef _SYS_SOCKET_H
6 #define _SYS_SOCKET_H
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 #ifdef WITH_LWIP
12 #include "lwip/opt.h"
13 #include "lwip/sockets.h"
14 #endif
15 #if defined(__ICCARM__) || defined(__CC_ARM)
16 #include <sys/errno.h>
17 #else
18 #include <errno.h>
19 #endif
20 
21 /*****************************************************************
22  *                                                               *
23  *standard io offset    af packet fd offset event offset         *
24  *   |    socket fd offset      |             |                  *
25  *   |         |                |             |                | *
26  *   |=========|================|=============|=============== | *
27  *    reserved    socket fd       af_packet fd     event fd      *
28  *                                                               *
29  *****************************************************************/
30 
31 /* reserved socketd for posix standard file descriptors */
32 #define POSIX_EVB_SOCKET_RESERVED_START 0
33 #define POSIX_EVB_SOCKET_RESERVED_END 2
34 #define LWIP_PACKET_NUM_SOCKETS  4
35 #define FD_AOS_SOCKET_OFFSET (LWIP_SOCKET_OFFSET+(POSIX_EVB_SOCKET_RESERVED_END-POSIX_EVB_SOCKET_RESERVED_START+1))
36 #define LWIP_NUM_SOCKETS (MEMP_NUM_NETCONN-(POSIX_EVB_SOCKET_RESERVED_END-POSIX_EVB_SOCKET_RESERVED_START+1))
37 #define LWIP_PACKET_SOCKET_OFFSET (FD_AOS_SOCKET_OFFSET + LWIP_NUM_SOCKETS)
38 #define LWIP_EVENT_OFFSET (LWIP_PACKET_SOCKET_OFFSET + LWIP_PACKET_NUM_SOCKETS)
39 #define LWIP_NUM_EVENTS   MEMP_NUM_NETCONN
40 #define FD_AOS_NUM_SOCKETS (LWIP_NUM_SOCKETS + LWIP_PACKET_NUM_SOCKETS)
41 #define FD_AOS_NUM_EVENTS  LWIP_NUM_EVENTS
42 #define FD_AOS_EVENT_OFFSET (FD_AOS_SOCKET_OFFSET + LWIP_NUM_SOCKETS + LWIP_PACKET_NUM_SOCKETS)
43 
44 #if LWIP_COMPAT_SOCKETS == 2
45 /* This helps code parsers/code completion by not having the COMPAT functions as defines */
46 #define lwip_accept       accept
47 #define lwip_bind         bind
48 #define lwip_shutdown     shutdown
49 #define lwip_getpeername  getpeername
50 #define lwip_getsockname  getsockname
51 #define lwip_setsockopt   setsockopt
52 #define lwip_getsockopt   getsockopt
53 #define lwip_close        closesocket
54 #define lwip_connect      connect
55 #define lwip_listen       listen
56 #define lwip_recv         recv
57 #define lwip_recvfrom     recvfrom
58 #define lwip_send         send
59 #define lwip_sendmsg      sendmsg
60 #define lwip_sendto       sendto
61 #define lwip_socket       socket
62 // #define lwip_select       select
63 #define lwip_select2      select2
64 #define lwip_ioctlsocket  ioctl
65 
66 #ifndef POSIX_DEVICE_IO_NEED
67 #if LWIP_POSIX_SOCKETS_IO_NAMES
68 #define lwip_read         read
69 #define lwip_write        write
70 #define lwip_writev       writev
71 #define lwip_eventfd      eventfd
72 #undef lwip_close
73 #define lwip_close        close
74 #define closesocket(s)    close(s)
75 #define lwip_fcntl        fcntl
76 #define lwip_ioctl        ioctl
77 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
78 #endif /* POSIX_DEVICE_IO_NEED */
79 #endif /* LWIP_COMPAT_SOCKETS == 2 */
80 
81 int net_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
82 int net_bind(int s, const struct sockaddr *name, socklen_t namelen);
83 int net_shutdown(int s, int how);
84 int net_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
85 int net_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
86 int net_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
87 int net_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
88 int net_close(int s);
89 int net_connect(int s, const struct sockaddr *name, socklen_t namelen);
90 int net_listen(int s, int backlog);
91 int net_recv(int s, void *mem, size_t len, int flags);
92 int net_read(int s, void *mem, size_t len);
93 int net_recvfrom(int s, void *mem, size_t len, int flags,
94     struct sockaddr *from, socklen_t *fromlen);
95 int net_send(int s, const void *dataptr, size_t size, int flags);
96 int net_sendmsg(int s, const struct msghdr *message, int flags);
97 int net_sendto(int s, const void *dataptr, size_t size, int flags,
98     const struct sockaddr *to, socklen_t tolen);
99 int net_socket(int domain, int type, int protocol);
100 int net_write(int s, const void *data, size_t size);
101 int net_writev(int s, const struct iovec *iov, int iovcnt);
102 int net_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
103                 struct timeval *timeout);
104 int net_ioctl(int s, long cmd, void *argp);
105 //int fcntl(int s, int cmd, int val);
106 int net_eventfd(unsigned int initval, int flags);
107 
108 #if LWIP_COMPAT_SOCKETS
109 #if LWIP_COMPAT_SOCKETS != 2
110 #ifdef POSIX_DEVICE_IO_NEED
accept(int s,struct sockaddr * addr,socklen_t * addrlen)111 static inline int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
112 {
113 	return net_accept(s, addr, addrlen);
114 }
115 
bind(int s,const struct sockaddr * name,socklen_t namelen)116 static inline int bind(int s, const struct sockaddr *name, socklen_t namelen)
117 {
118 	return net_bind(s, name, namelen);
119 }
120 
shutdown(int s,int how)121 static inline int shutdown(int s, int how)
122 {
123 	return net_shutdown(s, how);
124 }
125 
getpeername(int s,struct sockaddr * name,socklen_t * namelen)126 static inline int getpeername (int s, struct sockaddr *name, socklen_t *namelen)
127 {
128 	return net_getpeername(s, name, namelen);
129 }
getsockname(int s,struct sockaddr * name,socklen_t * namelen)130 static inline int getsockname (int s, struct sockaddr *name, socklen_t *namelen)
131 {
132 	return net_getsockname(s, name, namelen);
133 }
134 
getsockopt(int s,int level,int optname,void * optval,socklen_t * optlen)135 static inline int getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen)
136 {
137 	return net_getsockopt(s, level, optname, optval, optlen);
138 }
139 
setsockopt(int s,int level,int optname,const void * optval,socklen_t optlen)140 static inline int setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen)
141 {
142 	return net_setsockopt(s, level, optname, optval, optlen);
143 }
144 
connect(int s,const struct sockaddr * name,socklen_t namelen)145 static inline int connect(int s, const struct sockaddr *name, socklen_t namelen)
146 {
147 	return net_connect(s, name, namelen);
148 }
149 
listen(int s,int backlog)150 static inline int listen(int s, int backlog)
151 {
152 	return net_listen(s, backlog);
153 }
154 
recv(int s,void * mem,size_t len,int flags)155 static inline int recv(int s, void *mem, size_t len, int flags)
156 {
157 	return net_recv(s, mem, len, flags);
158 }
159 
recvfrom(int s,void * mem,size_t len,int flags,struct sockaddr * from,socklen_t * fromlen)160 static inline int recvfrom(int s, void *mem, size_t len, int flags,struct sockaddr *from, socklen_t *fromlen)
161 {
162 	return net_recvfrom(s, mem, len, flags, from, fromlen);
163 }
164 
send(int s,const void * dataptr,size_t size,int flags)165 static inline int send(int s, const void *dataptr, size_t size, int flags)
166 {
167 	return net_send(s, dataptr, size, flags);
168 }
169 
sendmsg(int s,const struct msghdr * message,int flags)170 static inline int sendmsg(int s, const struct msghdr *message, int flags)
171 {
172 	return net_sendmsg(s, message, flags);
173 }
174 
sendto(int s,const void * dataptr,size_t size,int flags,const struct sockaddr * to,socklen_t tolen)175 static inline int sendto(int s, const void *dataptr, size_t size, int flags,	const struct sockaddr *to, socklen_t tolen)
176 {
177 	return net_sendto(s, dataptr, size, flags, to, tolen);
178 }
179 
socket(int domain,int type,int protocol)180 static inline int socket(int domain, int type, int protocol)
181 {
182 	return net_socket(domain, type, protocol);
183 }
184 
writev(int s,const struct iovec * iov,int iovcnt)185 static inline int writev(int s, const struct iovec *iov, int iovcnt)
186 {
187 	return net_writev(s, iov, iovcnt);
188 }
189 
eventfd(unsigned int initval,int flags)190 static inline int eventfd(unsigned int initval, int flags)
191 {
192 	return net_eventfd(initval, flags);
193 }
194 
195 /** @ingroup socket */
196 #define select(maxfdp1,readset,writeset,exceptset,timeout)     net_select(maxfdp1,readset,writeset,exceptset,timeout)
197 /** @ingroup socket */
198 #define ioctlsocket(s,cmd,argp)                   net_ioctl(s,cmd,argp)
199 /** @ingroup socket */
200 /* This is a fix for newlibc does not define HAVE_FCNTL */
201 extern int _fcntl_r(struct _reent *ptr, int fd, int cmd, int arg);
202 #define fcntl(s,cmd,val)                          _fcntl_r(0, s,cmd,val)
203 
204 #else
205 /** @ingroup socket */
206 #define accept(s,addr,addrlen)                    net_accept(s,addr,addrlen)
207 /** @ingroup socket */
208 #define bind(s,name,namelen)                      net_bind(s,name,namelen)
209 /** @ingroup socket */
210 #define shutdown(s,how)                           net_shutdown(s,how)
211 /** @ingroup socket */
212 #define getpeername(s,name,namelen)               net_getpeername(s,name,namelen)
213 /** @ingroup socket */
214 #define getsockname(s,name,namelen)               net_getsockname(s,name,namelen)
215 /** @ingroup socket */
216 #define setsockopt(s,level,optname,opval,optlen)  net_setsockopt(s,level,optname,opval,optlen)
217 /** @ingroup socket */
218 #define getsockopt(s,level,optname,opval,optlen)  net_getsockopt(s,level,optname,opval,optlen)
219 /** @ingroup socket */
220 #define closesocket(s)                            net_close(s)
221 /** @ingroup socket */
222 #define connect(s,name,namelen)                   net_connect(s,name,namelen)
223 /** @ingroup socket */
224 #define listen(s,backlog)                         net_listen(s,backlog)
225 /** @ingroup socket */
226 #define recv(s,mem,len,flags)                     net_recv(s,mem,len,flags)
227 /** @ingroup socket */
228 #define recvfrom(s,mem,len,flags,from,fromlen)    net_recvfrom(s,mem,len,flags,from,fromlen)
229 /** @ingroup socket */
230 #define send(s,dataptr,size,flags)                net_send(s,dataptr,size,flags)
231 /** @ingroup socket */
232 #define sendmsg(s,message,flags)                  net_sendmsg(s,message,flags)
233 /** @ingroup socket */
234 #define sendto(s,dataptr,size,flags,to,tolen)     net_sendto(s,dataptr,size,flags,to,tolen)
235 /** @ingroup socket */
236 #define socket(domain,type,protocol)              net_socket(domain,type,protocol)
237 /** @ingroup socket */
238 #define select(maxfdp1,readset,writeset,exceptset,timeout)     net_select(maxfdp1,readset,writeset,exceptset,timeout)
239 /** @ingroup socket */
240 #define ioctlsocket(s,cmd,argp)                   net_ioctl(s,cmd,argp)
241 
242 #if LWIP_POSIX_SOCKETS_IO_NAMES
243 /** @ingroup socket */
244 #define read(s,mem,len)                           net_read(s,mem,len)
245 /** @ingroup socket */
246 #define write(s,dataptr,len)                      net_write(s,dataptr,len)
247 /** @ingroup socket */
248 /** @ingroup socket */
249 //#define ioctl(s,cmd,argp)                         net_ioctl(s,cmd,argp)
250 #define eventfd(v, f)                             net_eventfd(v, f)
251 #define writev(s,iov,iovcnt)                      net_writev(s,iov,iovcnt)
252 /** @ingroup socket */
253 #define close(s)                                  net_close(s)
254 /** @ingroup socket */
255 #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
256 #endif /* POSIX_DEVICE_IO_NEED */
257 #endif /* LWIP_COMPAT_SOCKETS != 2 */
258 #endif /* LWIP_COMPAT_SOCKETS */
259 
260 #ifdef __cplusplus
261 }
262 #endif
263 
264 #endif /* _SYS_SOCKET_H */
265 
266