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