1 /*------------------------------------------------------------------------------
2  *
3  * File:        so.h
4  * Description: socket api public header file
5  *
6  * Copyright (C) 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 unacknowledged 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