SimpleLink API Reference Manual  1.11
 All Data Structures Files Functions Variables Typedefs Macros Groups
socket.h
Go to the documentation of this file.
1 /*****************************************************************************
2 *
3 * socket.h - CC3000 Host Driver Implementation.
4 * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com/
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the
16 * distribution.
17 *
18 * Neither the name of Texas Instruments Incorporated nor the names of
19 * its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 *****************************************************************************/
35 #ifndef __SOCKET_H__
36 #define __SOCKET_H__
37 
38 
39 //*****************************************************************************
40 //
43 //
44 //*****************************************************************************
45 
46 
47 //*****************************************************************************
48 //
49 // If building with a C++ compiler, make all of the definitions in this header
50 // have a C binding.
51 //
52 //*****************************************************************************
53 #ifdef __cplusplus
54 extern "C" {
55 #endif
56 
57 #define HOSTNAME_MAX_LENGTH (230) // 230 bytes + header shouldn't exceed 8 bit value
58 
59 //--------- Address Families --------
60 
61 #define AF_INET 2
62 #define AF_INET6 23
63 
64 //------------ Socket Types ------------
65 
66 #define SOCK_STREAM 1
67 #define SOCK_DGRAM 2
68 #define SOCK_RAW 3 // Raw sockets allow new IPv4 protocols to be implemented in user space. A raw socket receives or sends the raw datagram not including link level headers
69 #define SOCK_RDM 4
70 #define SOCK_SEQPACKET 5
71 
72 //----------- Socket Protocol ----------
73 
74 #define IPPROTO_IP 0 // dummy for IP
75 #define IPPROTO_ICMP 1 // control message protocol
76 #define IPPROTO_IPV4 IPPROTO_IP // IP inside IP
77 #define IPPROTO_TCP 6 // tcp
78 #define IPPROTO_UDP 17 // user datagram protocol
79 #define IPPROTO_IPV6 41 // IPv6 in IPv6
80 #define IPPROTO_NONE 59 // No next header
81 #define IPPROTO_RAW 255 // raw IP packet
82 #define IPPROTO_MAX 256
83 
84 //----------- Socket retunr codes -----------
85 
86 #define SOC_ERROR (-1) // error
87 #define SOC_IN_PROGRESS (-2) // socket in progress
88 
89 //----------- Socket Options -----------
90 #define SOL_SOCKET 0xffff // socket level
91 #define SOCKOPT_RECV_NONBLOCK 0 // recv non block mode, set SOCK_ON or SOCK_OFF (default block mode)
92 #define SOCKOPT_RECV_TIMEOUT 1 // optname to configure recv and recvfromtimeout
93 #define SOCKOPT_ACCEPT_NONBLOCK 2 // accept non block mode, set SOCK_ON or SOCK_OFF (default block mode)
94 #define SOCK_ON 0 // socket non-blocking mode is enabled
95 #define SOCK_OFF 1 // socket blocking mode is enabled
96 
97 #define TCP_NODELAY 0x0001
98 #define TCP_BSDURGENT 0x7000
99 
100 #define MAX_PACKET_SIZE 1500
101 #define MAX_LISTEN_QUEUE 4
102 
103 #define IOCTL_SOCKET_EVENTMASK
104 
105 #define ENOBUFS 55 // No buffer space available
106 
107 #define __FD_SETSIZE 32
108 
109 #define ASIC_ADDR_LEN 8
110 
111 #define NO_QUERY_RECIVED -3
112 
113 
114 typedef struct _in_addr_t
115 {
116  unsigned long s_addr; // load with inet_aton()
117 } in_addr;
118 
119 typedef struct _sockaddr_t
120 {
121  unsigned short int sa_family;
122  unsigned char sa_data[14];
123 } sockaddr;
124 
125 typedef struct _sockaddr_in_t
126 {
127  short sin_family; // e.g. AF_INET
128  unsigned short sin_port; // e.g. htons(3490)
129  in_addr sin_addr; // see struct in_addr, below
130  char sin_zero[8]; // zero this if you want to
131 } sockaddr_in;
132 
133 typedef unsigned long socklen_t;
134 
135 // The fd_set member is required to be an array of longs.
136 typedef long int __fd_mask;
137 
138 // It's easier to assume 8-bit bytes than to get CHAR_BIT.
139 #define __NFDBITS (8 * sizeof (__fd_mask))
140 #define __FDELT(d) ((d) / __NFDBITS)
141 #define __FDMASK(d) ((__fd_mask) 1 << ((d) % __NFDBITS))
142 
143 // fd_set for select and pselect.
144 typedef struct
145 {
146  __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
147 #define __FDS_BITS(set) ((set)->fds_bits)
148 } fd_set;
149 
150 // We don't use `memset' because this would require a prototype and
151 // the array isn't too big.
152 #define __FD_ZERO(set) \
153  do { \
154  unsigned int __i; \
155  fd_set *__arr = (set); \
156  for (__i = 0; __i < sizeof (fd_set) / sizeof (__fd_mask); ++__i) \
157  __FDS_BITS (__arr)[__i] = 0; \
158  } while (0)
159 #define __FD_SET(d, set) (__FDS_BITS (set)[__FDELT (d)] |= __FDMASK (d))
160 #define __FD_CLR(d, set) (__FDS_BITS (set)[__FDELT (d)] &= ~__FDMASK (d))
161 #define __FD_ISSET(d, set) (__FDS_BITS (set)[__FDELT (d)] & __FDMASK (d))
162 
163 // Access macros for 'fd_set'.
164 #define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp)
165 #define FD_CLR(fd, fdsetp) __FD_CLR (fd, fdsetp)
166 #define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp)
167 #define FD_ZERO(fdsetp) __FD_ZERO (fdsetp)
168 
169 //Use in case of Big Endian only
170 
171 #define htonl(A) ((((unsigned long)(A) & 0xff000000) >> 24) | \
172  (((unsigned long)(A) & 0x00ff0000) >> 8) | \
173  (((unsigned long)(A) & 0x0000ff00) << 8) | \
174  (((unsigned long)(A) & 0x000000ff) << 24))
175 
176 #define ntohl htonl
177 
178 //Use in case of Big Endian only
179 #define htons(A) ((((unsigned long)(A) & 0xff00) >> 8) | \
180  (((unsigned long)(A) & 0x00ff) << 8))
181 
182 
183 #define ntohs htons
184 
185 // mDNS port - 5353 mDNS multicast address - 224.0.0.251
186 #define SET_mDNS_ADD(sockaddr) sockaddr.sa_data[0] = 0x14; \
187  sockaddr.sa_data[1] = 0xe9; \
188  sockaddr.sa_data[2] = 0xe0; \
189  sockaddr.sa_data[3] = 0x0; \
190  sockaddr.sa_data[4] = 0x0; \
191  sockaddr.sa_data[5] = 0xfb;
192 
193 
194 //*****************************************************************************
195 //
196 // Prototypes for the APIs.
197 //
198 //*****************************************************************************
199 
200 //*****************************************************************************
201 //
219 //
220 //*****************************************************************************
221 extern int socket(long domain, long type, long protocol);
222 
223 //*****************************************************************************
224 //
232 //
233 //*****************************************************************************
234 extern long closesocket(long sd);
235 
236 //*****************************************************************************
237 //
278 //
279 //*****************************************************************************
280 extern long accept(long sd, sockaddr *addr, socklen_t *addrlen);
281 
282 //*****************************************************************************
283 //
302 //
303 //*****************************************************************************
304 extern long bind(long sd, const sockaddr *addr, long addrlen);
305 
306 //*****************************************************************************
307 //
326 //
327 //*****************************************************************************
328 extern long listen(long sd, long backlog);
329 
330 //*****************************************************************************
331 //
346 //
347 //*****************************************************************************
348 #ifndef CC3000_TINY_DRIVER
349 extern int gethostbyname(char * hostname, unsigned short usNameLen, unsigned long* out_ip_addr);
350 #endif
351 
352 
353 //*****************************************************************************
354 //
379 //
380 //*****************************************************************************
381 extern long connect(long sd, const sockaddr *addr, long addrlen);
382 
383 //*****************************************************************************
384 //
418 //
419 //*****************************************************************************
420 extern int select(long nfds, fd_set *readsds, fd_set *writesds,
421  fd_set *exceptsds, struct timeval *timeout);
422 
423 //*****************************************************************************
424 //
467 //
468 //*****************************************************************************
469 #ifndef CC3000_TINY_DRIVER
470 extern int setsockopt(long sd, long level, long optname, const void *optval,
471  socklen_t optlen);
472 #endif
473 //*****************************************************************************
474 //
517 //
518 //*****************************************************************************
519 extern int getsockopt(long sd, long level, long optname, void *optval,
520  socklen_t *optlen);
521 
522 //*****************************************************************************
523 //
541 //
542 //*****************************************************************************
543 extern int recv(long sd, void *buf, long len, long flags);
544 
545 //*****************************************************************************
546 //
571 //
572 //*****************************************************************************
573 extern int recvfrom(long sd, void *buf, long len, long flags, sockaddr *from,
574  socklen_t *fromlen);
575 
576 //*****************************************************************************
577 //
595 //
596 //*****************************************************************************
597 
598 extern int send(long sd, const void *buf, long len, long flags);
599 
600 //*****************************************************************************
601 //
623 //
624 //*****************************************************************************
625 
626 extern int sendto(long sd, const void *buf, long len, long flags,
627  const sockaddr *to, socklen_t tolen);
628 
629 //*****************************************************************************
630 //
643 //
644 //*****************************************************************************
645 extern int mdnsAdvertiser(unsigned short mdnsEnabled, char * deviceServiceName, unsigned short deviceServiceNameLength);
646 
647 //*****************************************************************************
648 //
649 // Close the Doxygen group.
651 //
652 //*****************************************************************************
653 
654 
655 //*****************************************************************************
656 //
657 // Mark the end of the C bindings section for C++ compilers.
658 //
659 //*****************************************************************************
660 #ifdef __cplusplus
661 }
662 #endif // __cplusplus
663 
664 #endif // __SOCKET_H__