1 /*------------------------------------------------------------------------------ 2 * 3 * File: so.h 4 * Description: socket api public header file 5 * 6 * Copyright (C) 2010 Nintendo. All rights reserved. 7 * These coded instructions, statements, and computer programs contain 8 * proprietary information of Nintendo of America Inc. and/or Nintendo 9 * Company Ltd., and are protected by Federal copyright law. They may 10 * not be disclosed to third parties or copied or duplicated in any form, 11 * in whole or in part, without the prior written consent of Nintendo. 12 * 13 *------------------------------------------------------------------------------ 14 */ 15 #ifndef __SOCKET_PUB_H__ 16 #define __SOCKET_PUB_H__ 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 #include <types.h> 23 #include <cafe/net/so_init.h> 24 25 /* 26 * Protocol address families 27 */ 28 #define AF_UNSPEC 0 29 #define AF_INET 2 30 31 /* 32 * Type of socket 33 */ 34 #define SOCK_STREAM 1 35 #define SOCK_DGRAM 2 36 37 /* 38 * Protocol number 39 */ 40 #define IPPROTO_IP 0 41 #define IPPROTO_TCP 6 42 #define IPPROTO_UDP 17 43 44 #define MSG_OOB 0x1 /* process out-of-band data */ 45 #define MSG_PEEK 0x2 /* peek at incoming message */ 46 #define MSG_DONTROUTE 0x4 /* send without using routing tables */ 47 #define MSG_NEWPIPE 0x8 /* New pipe for recvfrom call */ 48 #define MSG_EOR 0x10 /* data completes record */ 49 #define MSG_DONTWAIT 0x20 /* this message should be nonblocking */ 50 #define MSG_IP_RECVTTL 0x40 /* retrieve packet TTL */ 51 52 /* 53 * "level" parameter to setsockopt() and getsockopt() call 54 */ 55 #define SOL_SOCKET -1 56 57 /* 58 * "optname" parameter to setsockopt() and getsockopt() call 59 */ 60 /* SOL_SOCKET level options */ 61 #define SO_REUSEADDR 0x00004 /* allow local address reuse */ 62 #define SO_KEEPALIVE 0x00008 /* keep connections alive */ 63 #define SO_DONTROUTE 0x00010 /* just use interface addresses */ 64 #define SO_BROADCAST 0x00020 /* permit sending of broadcast msgs */ 65 #define SO_LINGER 0x00080 /* linger on close if data present */ 66 #define SO_OOBINLINE 0x00100 /* leave received OOB data in line */ 67 #define SO_TCPSACK 0x00200 /* Allow TCP SACK (Selective acknowledgment) */ 68 #define SO_WINSCALE 0x00400 /* Window scale option for TCP sockets */ 69 #define SO_HDRINCL 0x02000 /* user access to IP hdr for SOCK_RAW */ 70 #define SO_RUSRBUF 0x10000 /* use user buffer for receive */ 71 #define SO_SNDBUF 0x1001 /* send buffer size */ 72 #define SO_RCVBUF 0x1002 /* receive buffer size */ 73 #define SO_LASTERROR 0x1007 /* get error status and clear */ 74 #define SO_TYPE 0x1008 /* get socket type */ 75 #define SO_HOPCNT 0x1009 /* Hop count to get to dst */ 76 #define SO_MAXMSG 0x1010 /* get TCP_MSS (max segment size) */ 77 #define SO_RXDATA 0x1011 /* get count of bytes in sb_rcv */ 78 #define SO_TXDATA 0x1012 /* get count of bytes in sb_snd */ 79 #define SO_MYADDR 0x1013 /* return my IP address */ 80 #define SO_NBIO 0x1014 /* set socket into NON-blocking mode */ 81 #define SO_BIO 0x1015 /* set socket into blocking mode */ 82 #define SO_NONBLOCK 0x1016 /* set/get blocking mode via optval param */ 83 #define SO_KEEPIDLE 0x1019 /* time before keepalive probes begin */ 84 #define SO_KEEPINTVL 0x101A /* probe interval */ 85 #define SO_KEEPCNT 0x101B /* max probes before drop */ 86 /* IPPROTO_IP level options */ 87 #define IP_TOS 3 /* IP type of service and preced. */ 88 #define IP_TTL_OPT 4 /* IP time to live */ 89 #define IP_TTL IP_TTL_OPT /* BSD compatible definition*/ 90 /* IPPROTO_TCP level options */ 91 #define TCP_ACKDELAYTIME 0x2001 /* Set time for delayed acks */ 92 #define TCP_NOACKDELAY 0x2002 /* suppress delayed ACKs */ 93 #define TCP_MAXSEG 0x2003 /* set maximum segment size */ 94 #define TCP_NODELAY 0x2004 /* Disable Nagle Algorithm */ 95 #define TCP_ACKFREQUENCY 0x2005 /* Number of outstanding un-acked segments 96 * after which an ACK will be sent (if 97 * delay ack timer hasn't fired). 98 */ 99 100 /* 101 * "liboptname" parameter to setsocklibopt() and getsocklibopt() call 102 */ 103 /* allow socketclose_all or not */ 104 #define SOLIB_OPT_AVOID_CLOSE_ALL 0x3000 105 /* the number of times allocation table of socket descriptor is initialized */ 106 #define SOLIB_OPT_SOCKFD_TBL_INIT_COUNT 0x3001 107 /* socket buffer consumption by the caller */ 108 #define SOLIB_OPT_SOCKBUF_CONSUMPTION 0x3002 109 110 #define SO_SOCKBUF_CONSUMPTTION_LOW 0x01 111 #define SO_SOCKBUF_CONSUMPTTION_MED 0x02 112 #define SO_SOCKBUF_CONSUMPTTION_HIGH 0x04 113 #define SO_SOCKBUF_CONSUMPTTION_MAX 0x08 114 115 /* 116 * SOMemOpt Reqs 117 */ 118 #define SO_MEMOPT_REQ_INIT 0x01 119 #define SO_MEMOPT_REQ_ASYNC_CHECK_INIT 0x02 120 #define SO_MEMOPT_REQ_SYNC_CHECK_INIT 0x03 121 #define SO_MEMOPT_REQ_ABORT_SYNC_CHECK_INIT 0x04 122 123 /* 124 * SOMemOpt flags 125 */ 126 #define SO_MEMOPT_FLAG_OPT_UDP 0x01 127 128 /* 129 * Max ICMP ping payload size used in SOIcmpPing() 130 */ 131 #define ICMP_MAX_PAYLOAD (1491) 132 133 /* 134 * Structure used for manipulating linger option. 135 */ 136 struct linger 137 { 138 int l_onoff; /* option on/off */ 139 int l_linger; /* linger time */ 140 }; 141 142 /* 143 * Select related macros 144 */ 145 146 /* 147 * Select uses a bit mask of socket descriptors. Following macros manipulate 148 * bit mask. At the max FD_SETSIZE number of descriptors can be selected. 149 */ 150 #define FD_SETSIZE (32) 151 152 #define FD_SET(n, p) \ 153 ((p)->fd_bits |= (1 << (n))) 154 #define FD_CLR(n, p) \ 155 ((p)->fd_bits &= ~(1 << (n))) 156 #define FD_ISSET(n, p) \ 157 ((p)->fd_bits & (1 << (n))) 158 #define FD_ZERO(p) \ 159 ((p)->fd_bits = 0) 160 #define FD_COPY(f, t) \ 161 ((t)->fd_bits = (f)->fd_bits) 162 163 /* 164 * SORecvFromMulti buffer length calculation macros 165 */ 166 #define ROUNDUP_RCVFMM_BUFF_LEN(len) \ 167 (((u32)(len) + (PPC_IO_BUFFER_ALIGN)-1) & ~((PPC_IO_BUFFER_ALIGN)-1)) 168 169 /* 170 * Structure used for manipulating SORecvFromMulti function 171 */ 172 struct recvfrom_multi_buffers 173 { 174 void *buffer; 175 unsigned int bufferlen; 176 struct sockaddr *froms; 177 unsigned int fromslen; 178 int *results; 179 unsigned int resultslen; 180 }; 181 182 /* 183 * SOSendToMultiEx buffer length calculation macros 184 */ 185 #define ROUNDUP_SNDTMEX_BUFF_LEN(len) \ 186 (((u32)(len) + (PPC_IO_BUFFER_ALIGN)-1) & ~((PPC_IO_BUFFER_ALIGN)-1)) 187 /* 188 * Structure used for manipulating SOSendToMultiEX function 189 */ 190 struct sendto_multi_ex_buffers 191 { 192 void *buffer; 193 unsigned int bufferlen; 194 int *datagram_lens; 195 unsigned int datagram_lens_len; 196 struct sockaddr *dests; 197 unsigned int destslen; 198 int *results; 199 unsigned int resultslen; 200 }; 201 202 /* For additional options with SORecvFromEx */ 203 typedef u8* amsg; 204 205 /* 206 * Socket API 207 */ 208 #define SOAccept accept 209 #define SOBind bind 210 #define SOConnect connect 211 #define SOListen listen 212 #define SORecv recv 213 #define SORecvFrom recvfrom 214 #define SORecvFromEx recvfrom_ex 215 #define SORecvFromMulti recvfrom_multi 216 #define SOSend send 217 #define SOSendTo sendto 218 #define SOSendToMulti sendto_multi 219 #define SOSendToMultiEx sendto_multi_ex 220 #define SOShutdown shutdown 221 #define SOSocket socket 222 #define SOClose socketclose 223 #define SOInetAtoN inet_aton 224 #define SOInetNtoA_r inet_ntoa_r 225 #define SOInetNtoP inet_ntop 226 #define SOInetPtoN inet_pton 227 #define SOGetPeerName getpeername 228 #define SOGetSockName getsockname 229 #define SOGetSockOpt getsockopt 230 #define SOSetSockOpt setsockopt 231 #define SOHtoNl htonl 232 #define SOHtoNs htons 233 #define SONtoHl ntohl 234 #define SONtoHs ntohs 235 #define SOSelect select 236 #define SOGetLibOpt getsocklibopt 237 #define SOSetLibOpt setsocklibopt 238 #define SOMemOpt somemopt 239 /* 240 * SOIcmp API 241 */ 242 #define SOIcmpLastCodeType icmp_last_code_type 243 #define SOIcmpCreateHandle icmp_create_handle 244 #define SOIcmpCloseHandle icmp_close_handle 245 #define SOIcmpPing icmp_ping 246 #define SOIcmpCancel icmp_cancel 247 248 /* 249 * Socket API (BSD-style) 250 */ 251 extern int accept(int fd, struct sockaddr *addr, int *addrlen); 252 extern int bind(int fd, struct sockaddr *addr, int addrlen); 253 extern int connect(int fd, struct sockaddr *addr, int addrlen); 254 extern int listen(int fd, int backlog); 255 extern int recv(int fd, void *buffer, int len, int flags); 256 extern int recvfrom(int fd, void *buffer, int len, int flags, 257 struct sockaddr *from, int *fromlen); 258 extern int recvfrom_ex(int fd, void *buffer, int len, int flags, 259 struct sockaddr *from, int *fromlen, 260 amsg msg, int msglen); 261 extern int recvfrom_multi (int fd, int flags, 262 struct recvfrom_multi_buffers *buffs, 263 int recv_datagram_len, int recv_datagram_count, 264 struct timeval *timeout); 265 extern int send(int fd, const void *buffer, int len, int flags); 266 extern int sendto(int fd, const void *buffer, int len, int flags, 267 const struct sockaddr *dest_addr, int dest_len); 268 extern int sendto_multi(int fd, const void *buffer, int len, int flags, 269 const struct sockaddr *dest_addrs, int dest_count); 270 extern int sendto_multi_ex (int fd, int flags, 271 struct sendto_multi_ex_buffers *buffs, 272 int send_datagram_count); 273 extern int shutdown(int fd, int how); 274 extern int socket(int family, int type, int proto); 275 extern int socketclose(int fd); 276 extern int inet_aton(const char *cp, struct in_addr *addr); 277 extern char *inet_ntoa_r(struct in_addr in, char *buf); 278 extern const char *inet_ntop(int af, const void *src, char *dst, 279 socklen_t size); 280 extern int inet_pton(int af, const char *src, void *dst); 281 extern int getpeername(int fd, struct sockaddr *name, int *addrlen); 282 extern int getsockname(int fd, struct sockaddr *name, int *addrlen); 283 extern int getsockopt(int fd, int level, int optname, void *optval, 284 socklen_t *optlen); 285 extern int setsockopt(int fd, int level, int optname, void *optval, 286 socklen_t optlen); 287 extern void setsocketlasterr(int err); 288 extern int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 289 struct timeval *timeout); 290 extern int setsocklibopt (int liboptname, int optval); 291 extern int getsocklibopt (int liboptname, int *optval); 292 extern int somemopt (int req_type, char* mem, unsigned int memlen, int flags); 293 294 extern u32 ntohl(u32 val); 295 extern u32 htonl(u32 val); 296 extern u16 ntohs(u16 val); 297 extern u16 htons(u16 val); 298 299 extern int icmp_create_handle(int family); 300 extern int icmp_close_handle(int handle); 301 extern int icmp_ping(int handle, const void* data, int len, const struct sockaddr *dest_addr, int dest_len, unsigned timeout, int flag); 302 extern int icmp_cancel(int handle); 303 extern int icmp_last_code_type(int handle); 304 305 #ifdef __cplusplus 306 } 307 #endif 308 309 #endif /* __SOCKET_PUB_H__ */ 310