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