1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2018-05-24 ChenYong First version 9 */ 10 11 #ifndef SAL_SOCKET_H__ 12 #define SAL_SOCKET_H__ 13 14 #include "sal_ipaddr.h" 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif 19 20 #if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) 21 typedef uint32_t socklen_t; 22 #endif 23 24 #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED) 25 typedef uint8_t sa_family_t; 26 #endif 27 28 /* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED 29 to prevent this code from redefining it. */ 30 #if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED) 31 typedef uint16_t in_port_t; 32 #endif 33 34 /* Socket protocol types (TCP/UDP/RAW) */ 35 #define SOCK_STREAM 1 36 #define SOCK_DGRAM 2 37 #define SOCK_RAW 3 38 39 #define SOCK_MAX (SOCK_RAW + 1) 40 41 /* Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) */ 42 #define SO_REUSEADDR 0x0004 /* Allow local address reuse */ 43 #define SO_KEEPALIVE 0x0008 /* keep connections alive */ 44 #define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ 45 46 /* Additional options, not kept in so_options */ 47 #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ 48 #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 49 #define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ 50 #define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ 51 #define SO_LINGER 0x0080 /* linger on close if data present */ 52 #define SO_DONTLINGER ((int)(~SO_LINGER)) 53 #define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ 54 #define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ 55 #define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ 56 #define SO_RCVBUF 0x1002 /* receive buffer size */ 57 #define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ 58 #define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ 59 #define SO_SNDTIMEO 0x1005 /* send timeout */ 60 #define SO_RCVTIMEO 0x1006 /* receive timeout */ 61 #define SO_ERROR 0x1007 /* get error status and clear */ 62 #define SO_TYPE 0x1008 /* get socket type */ 63 #define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ 64 #define SO_NO_CHECK 0x100a /* don't create UDP checksum */ 65 66 /* Level number for (get/set)sockopt() to apply to socket itself */ 67 #define SOL_SOCKET 0xfff /* options for socket level */ 68 69 #define AF_UNSPEC 0 70 #define AF_INET 2 71 #define AF_INET6 10 72 #define AF_CAN 29 /* Controller Area Network */ 73 #define AF_AT 45 /* AT socket */ 74 #define AF_WIZ 46 /* WIZnet socket */ 75 #define PF_INET AF_INET 76 #define PF_INET6 AF_INET6 77 #define PF_UNSPEC AF_UNSPEC 78 #define PF_CAN AF_CAN 79 #define PF_AT AF_AT 80 #define PF_WIZ AF_WIZ 81 82 #define AF_MAX (AF_WIZ + 1) /* For now.. */ 83 84 #define IPPROTO_IP 0 85 #define IPPROTO_ICMP 1 86 #define IPPROTO_TCP 6 87 #define IPPROTO_UDP 17 88 #define IPPROTO_IPV6 41 89 #define IPPROTO_ICMPV6 58 90 #define IPPROTO_UDPLITE 136 91 #define IPPROTO_RAW 255 92 93 /* Flags we can use with send and recv */ 94 #define MSG_PEEK 0x01 /* Peeks at an incoming message */ 95 #define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ 96 #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ 97 #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ 98 #define MSG_MORE 0x10 /* Sender will send more */ 99 100 /* Options for level IPPROTO_TCP */ 101 #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ 102 #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ 103 #define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ 104 #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ 105 #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ 106 107 /* Options and types related to multicast membership */ 108 #define IP_ADD_MEMBERSHIP 3 109 #define IP_DROP_MEMBERSHIP 4 110 111 typedef struct ip_mreq 112 { 113 struct in_addr imr_multiaddr; /* IP multicast address of group */ 114 struct in_addr imr_interface; /* local IP address of interface */ 115 } ip_mreq; 116 117 /* Options for shatdown type */ 118 #ifndef SHUT_RD 119 #define SHUT_RD 0 120 #define SHUT_WR 1 121 #define SHUT_RDWR 2 122 #endif 123 124 struct sockaddr 125 { 126 uint8_t sa_len; 127 sa_family_t sa_family; 128 char sa_data[14]; 129 }; 130 131 /* members are in network byte order */ 132 struct sockaddr_in 133 { 134 uint8_t sin_len; 135 sa_family_t sin_family; 136 in_port_t sin_port; 137 struct in_addr sin_addr; 138 #define SIN_ZERO_LEN 8 139 char sin_zero[SIN_ZERO_LEN]; 140 }; 141 142 struct sockaddr_storage 143 { 144 uint8_t s2_len; 145 sa_family_t ss_family; 146 char s2_data1[2]; 147 uint32_t s2_data2[3]; 148 #if SAL_IPV6 149 u32_t s2_data3[3]; 150 #endif /* SAL_IPV6 */ 151 }; 152 153 int sal_accept(int socket, struct sockaddr *addr, socklen_t *addrlen); 154 int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen); 155 int sal_shutdown(int socket, int how); 156 int sal_getpeername (int socket, struct sockaddr *name, socklen_t *namelen); 157 int sal_getsockname (int socket, struct sockaddr *name, socklen_t *namelen); 158 int sal_getsockopt (int socket, int level, int optname, void *optval, socklen_t *optlen); 159 int sal_setsockopt (int socket, int level, int optname, const void *optval, socklen_t optlen); 160 int sal_connect(int socket, const struct sockaddr *name, socklen_t namelen); 161 int sal_listen(int socket, int backlog); 162 int sal_recvfrom(int socket, void *mem, size_t len, int flags, 163 struct sockaddr *from, socklen_t *fromlen); 164 int sal_sendto(int socket, const void *dataptr, size_t size, int flags, 165 const struct sockaddr *to, socklen_t tolen); 166 int sal_socket(int domain, int type, int protocol); 167 int sal_closesocket(int socket); 168 int sal_ioctlsocket(int socket, long cmd, void *arg); 169 170 #ifdef __cplusplus 171 } 172 #endif 173 174 #endif /* SAL_SOCKET_H__ */ 175