1 #ifndef __NETWORK_H__
2 #define __NETWORK_H__
3 
4 #include <gctypes.h>
5 #include <sys/time.h>
6 #include <sys/types.h>
7 
8 #define INVALID_SOCKET	(~0)
9 #define SOCKET_ERROR	(-1)
10 
11 #define SOCK_STREAM     1
12 #define SOCK_DGRAM      2
13 #define SOCK_RAW        3
14 
15 /*
16  * Option flags per-socket.
17  */
18 #define  SO_DEBUG			0x0001    /* turn on debugging info recording */
19 #define  SO_ACCEPTCONN		0x0002    /* socket has had listen() */
20 #define  SO_REUSEADDR		0x0004    /* allow local address reuse */
21 #define  SO_KEEPALIVE		0x0008    /* keep connections alive */
22 #define  SO_DONTROUTE		0x0010    /* just use interface addresses */
23 #define  SO_BROADCAST		0x0020    /* permit sending of broadcast msgs */
24 #define  SO_USELOOPBACK		0x0040    /* bypass hardware when possible */
25 #define  SO_LINGER			0x0080    /* linger on close if data present */
26 #define  SO_OOBINLINE		0x0100    /* leave received OOB data in line */
27 #define	 SO_REUSEPORT		0x0200		/* allow local address & port reuse */
28 
29 #define SO_DONTLINGER		(int)(~SO_LINGER)
30 
31 /*
32  * Additional options, not kept in so_options.
33  */
34 #define SO_SNDBUF			0x1001    /* send buffer size */
35 #define SO_RCVBUF			0x1002    /* receive buffer size */
36 #define SO_SNDLOWAT			0x1003    /* send low-water mark */
37 #define SO_RCVLOWAT			0x1004    /* receive low-water mark */
38 #define SO_SNDTIMEO			0x1005    /* send timeout */
39 #define SO_RCVTIMEO			0x1006    /* receive timeout */
40 #define  SO_ERROR			0x1007    /* get error status and clear */
41 #define  SO_TYPE			0x1008    /* get socket type */
42 
43 /*
44  * Structure used for manipulating linger option.
45  */
46 struct linger {
47        int l_onoff;                /* option on/off */
48        int l_linger;               /* linger time */
49 };
50 
51 /*
52  * Level number for (get/set)sockopt() to apply to socket itself.
53  */
54 #define  SOL_SOCKET			0xffff    /* options for socket level */
55 
56 #define AF_UNSPEC			0
57 #define AF_INET				2
58 #define PF_INET				AF_INET
59 #define PF_UNSPEC			AF_UNSPEC
60 
61 #define IPPROTO_IP			0
62 #define IPPROTO_TCP			6
63 #define IPPROTO_UDP			17
64 
65 #define INADDR_ANY			0
66 #define INADDR_BROADCAST	0xffffffff
67 
68 /* Flags we can use with send and recv. */
69 #define MSG_DONTWAIT		0x40            /* Nonblocking i/o for this operation only */
70 
71 /*
72  * Options for level IPPROTO_IP
73  */
74 #define IP_TOS				1
75 #define IP_TTL				2
76 
77 #define IPTOS_TOS_MASK      0x1E
78 #define IPTOS_TOS(tos)      ((tos) & IPTOS_TOS_MASK)
79 #define IPTOS_LOWDELAY      0x10
80 #define IPTOS_THROUGHPUT    0x08
81 #define IPTOS_RELIABILITY   0x04
82 #define IPTOS_LOWCOST       0x02
83 #define IPTOS_MINCOST       IPTOS_LOWCOST
84 
85 /*
86  * Definitions for IP precedence (also in ip_tos) (hopefully unused)
87  */
88 #define IPTOS_PREC_MASK                 0xe0
89 #define IPTOS_PREC(tos)                 ((tos) & IPTOS_PREC_MASK)
90 #define IPTOS_PREC_NETCONTROL           0xe0
91 #define IPTOS_PREC_INTERNETCONTROL      0xc0
92 #define IPTOS_PREC_CRITIC_ECP           0xa0
93 #define IPTOS_PREC_FLASHOVERRIDE        0x80
94 #define IPTOS_PREC_FLASH                0x60
95 #define IPTOS_PREC_IMMEDIATE            0x40
96 #define IPTOS_PREC_PRIORITY             0x20
97 #define IPTOS_PREC_ROUTINE              0x00
98 
99 /*
100  * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
101  *
102  *
103  * Ioctl's have the command encoded in the lower word,
104  * and the size of any in or out parameters in the upper
105  * word.  The high 2 bits of the upper word are used
106  * to encode the in/out status of the parameter; for now
107  * we restrict parameters to at most 128 bytes.
108  */
109 #if !defined(FIONREAD) || !defined(FIONBIO)
110 #define IOCPARM_MASK    0x7f            /* parameters must be < 128 bytes */
111 #define IOC_VOID        0x20000000      /* no parameters */
112 #define IOC_OUT         0x40000000      /* copy out parameters */
113 #define IOC_IN          0x80000000      /* copy in parameters */
114 #define IOC_INOUT       (IOC_IN|IOC_OUT)
115                                         /* 0x20000000 distinguishes new &
116                                            old ioctl's */
117 #define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
118 
119 #define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
120 
121 #define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
122 #endif
123 
124 #ifndef FIONREAD
125 #define FIONREAD    _IOR('f', 127, unsigned long) /* get # bytes to read */
126 #endif
127 #ifndef FIONBIO
128 #define FIONBIO     _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
129 #endif
130 
131 /* Socket I/O Controls */
132 #ifndef SIOCSHIWAT
133 #define SIOCSHIWAT  _IOW('s',  0, unsigned long)  /* set high watermark */
134 #define SIOCGHIWAT  _IOR('s',  1, unsigned long)  /* get high watermark */
135 #define SIOCSLOWAT  _IOW('s',  2, unsigned long)  /* set low watermark */
136 #define SIOCGLOWAT  _IOR('s',  3, unsigned long)  /* get low watermark */
137 #define SIOCATMARK  _IOR('s',  7, unsigned long)  /* at oob mark? */
138 #endif
139 
140 #ifndef O_NONBLOCK
141 #define O_NONBLOCK			04000U
142 #endif
143 
144 #ifndef FD_SET
145   #undef  FD_SETSIZE
146   #define FD_SETSIZE		16
147   #define FD_SET(n, p)		((p)->fd_bits[(n)/8] |=  (1 << ((n) & 7)))
148   #define FD_CLR(n, p)		((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
149   #define FD_ISSET(n,p)		((p)->fd_bits[(n)/8] &   (1 << ((n) & 7)))
150   #define FD_ZERO(p)		memset((void*)(p),0,sizeof(*(p)))
151 
152   typedef struct fd_set {
153 	u8 fd_bits [(FD_SETSIZE+7)/8];
154   } fd_set;
155 
156 #endif
157 
158 #ifndef TCP_NODELAY
159 #define	TCP_NODELAY	   0x01	   /* don't delay send to coalesce packets */
160 #endif
161 #ifndef TCP_KEEPALIVE
162 #define TCP_KEEPALIVE  0x02    /* send KEEPALIVE probes when idle for pcb->keepalive miliseconds */
163 #endif
164 
165 #ifndef socklen_t
166 #define socklen_t u32
167 #endif
168 
169 #ifndef htons
170 #define htons(x) (x)
171 #endif
172 #ifndef ntohs
173 #define ntohs(x) (x)
174 #endif
175 #ifndef htonl
176 #define htonl(x) (x)
177 #endif
178 #ifndef ntohl
179 #define ntohl(x) (x)
180 #endif
181 
182 #ifndef h_addr
183 #define h_addr h_addr_list[0]
184 #endif
185 
186 #ifndef IP4_ADDR
187 #define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->s_addr = htonl(((u32)(a&0xff)<<24)|((u32)(b&0xff)<<16)|((u32)(c&0xff)<<8)|(u32)(d&0xff))
188 #define ip4_addr1(ipaddr) ((u32)(ntohl((ipaddr)->s_addr) >> 24) & 0xff)
189 #define ip4_addr2(ipaddr) ((u32)(ntohl((ipaddr)->s_addr) >> 16) & 0xff)
190 #define ip4_addr3(ipaddr) ((u32)(ntohl((ipaddr)->s_addr) >> 8) & 0xff)
191 #define ip4_addr4(ipaddr) ((u32)(ntohl((ipaddr)->s_addr)) & 0xff)
192 #endif
193 
194 #define POLLIN				0x0001
195 #define POLLPRI				0x0002
196 #define POLLOUT				0x0004
197 #define POLLERR				0x0008
198 #define POLLHUP				0x0010
199 #define POLLNVAL			0x0020
200 
201 #ifdef __cplusplus
202 extern "C" {
203 #endif
204 
205 #ifndef HAVE_IN_ADDR
206 #define HAVE_IN_ADDR
207 struct in_addr {
208   u32 s_addr;
209 };
210 #endif
211 
212 struct sockaddr_in {
213   u8 sin_len;
214   u8 sin_family;
215   u16 sin_port;
216   struct in_addr sin_addr;
217   s8 sin_zero[8];
218 };
219 
220 struct sockaddr {
221   u8 sa_len;
222   u8 sa_family;
223   s8 sa_data[14];
224 };
225 
226 struct hostent {
227   char    *h_name;        /* official name of host */
228   char    **h_aliases;    /* alias list */
229   u16     h_addrtype;     /* host address type */
230   u16     h_length;       /* length of address */
231   char    **h_addr_list;  /* list of addresses from name server */
232 };
233 
234 struct pollsd {
235 	s32 socket;
236 	u32 events;
237 	u32 revents;
238 };
239 
240 u32 inet_addr(const char *cp);
241 s8 inet_aton(const char *cp, struct in_addr *addr);
242 char *inet_ntoa(struct in_addr addr); /* returns ptr to static buffer; not reentrant! */
243 
244 s32 if_config( char *local_ip, char *netmask, char *gateway,bool use_dhcp, int max_retries);
245 s32 if_configex(struct in_addr *local_ip, struct in_addr *netmask, struct in_addr *gateway, bool use_dhcp, int max_retries);
246 
247 s32 net_init();
248 #ifdef HW_RVL
249 typedef s32 (*netcallback)(s32 result, void *usrdata);
250 s32 net_init_async(netcallback cb, void *usrdata);
251 s32 net_get_status(void);
252 void net_wc24cleanup();
253 s32 net_get_mac_address(void *mac_buf);
254 #endif
255 void net_deinit();
256 
257 u32 net_gethostip();
258 s32 net_socket(u32 domain,u32 type,u32 protocol);
259 s32 net_bind(s32 s,struct sockaddr *name,socklen_t namelen);
260 s32 net_listen(s32 s,u32 backlog);
261 s32 net_accept(s32 s,struct sockaddr *addr,socklen_t *addrlen);
262 s32 net_connect(s32 s,struct sockaddr *,socklen_t);
263 s32 net_write(s32 s,const void *data,s32 size);
264 s32 net_send(s32 s,const void *data,s32 size,u32 flags);
265 s32 net_sendto(s32 s,const void *data,s32 len,u32 flags,struct sockaddr *to,socklen_t tolen);
266 s32 net_recv(s32 s,void *mem,s32 len,u32 flags);
267 s32 net_recvfrom(s32 s,void *mem,s32 len,u32 flags,struct sockaddr *from,socklen_t *fromlen);
268 s32 net_read(s32 s,void *mem,s32 len);
269 s32 net_close(s32 s);
270 s32 net_select(s32 maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,struct timeval *timeout);
271 s32 net_setsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optlen);
272 s32 net_ioctl(s32 s, u32 cmd, void *argp);
273 s32 net_fcntl(s32 s, u32 cmd, u32 flags);
274 s32 net_poll(struct pollsd *sds,s32 nsds,s32 timeout);
275 s32 net_shutdown(s32 s, u32 how);
276 
277 struct hostent * net_gethostbyname(const char *addrString);
278 
279 #ifdef __cplusplus
280 	}
281 #endif
282 
283 #endif
284