Zephyr Project API  3.3.0
A Scalable Open Source RTOS
socket.h
Go to the documentation of this file.
1
8/*
9 * Copyright (c) 2017-2018 Linaro Limited
10 * Copyright (c) 2021 Nordic Semiconductor
11 *
12 * SPDX-License-Identifier: Apache-2.0
13 */
14
15#ifndef ZEPHYR_INCLUDE_NET_SOCKET_H_
16#define ZEPHYR_INCLUDE_NET_SOCKET_H_
17
25#include <sys/types.h>
26#include <zephyr/types.h>
27#include <zephyr/net/net_ip.h>
30#include <stdlib.h>
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
37 int fd;
38 short events;
39 short revents;
40};
41
42/* ZSOCK_POLL* values are compatible with Linux */
44#define ZSOCK_POLLIN 1
46#define ZSOCK_POLLPRI 2
48#define ZSOCK_POLLOUT 4
50#define ZSOCK_POLLERR 8
52#define ZSOCK_POLLHUP 0x10
54#define ZSOCK_POLLNVAL 0x20
55
57#define ZSOCK_MSG_PEEK 0x02
61#define ZSOCK_MSG_TRUNC 0x20
63#define ZSOCK_MSG_DONTWAIT 0x40
65#define ZSOCK_MSG_WAITALL 0x100
66
67/* Well-known values, e.g. from Linux man 2 shutdown:
68 * "The constants SHUT_RD, SHUT_WR, SHUT_RDWR have the value 0, 1, 2,
69 * respectively". Some software uses numeric values.
70 */
72#define ZSOCK_SHUT_RD 0
74#define ZSOCK_SHUT_WR 1
76#define ZSOCK_SHUT_RDWR 2
77
81#define SOL_TLS 282
82
92#define TLS_SEC_TAG_LIST 1
97#define TLS_HOSTNAME 2
103#define TLS_CIPHERSUITE_LIST 3
108#define TLS_CIPHERSUITE_USED 4
119#define TLS_PEER_VERIFY 5
128#define TLS_DTLS_ROLE 6
134#define TLS_ALPN_LIST 7
139#define TLS_DTLS_HANDSHAKE_TIMEOUT_MIN 8
140#define TLS_DTLS_HANDSHAKE_TIMEOUT_MAX 9
145#define TLS_CERT_NOCOPY 10
156#define TLS_NATIVE 11
161#define TLS_SESSION_CACHE 12
165#define TLS_SESSION_CACHE_PURGE 13
166
169/* Valid values for TLS_PEER_VERIFY option */
170#define TLS_PEER_VERIFY_NONE 0
171#define TLS_PEER_VERIFY_OPTIONAL 1
172#define TLS_PEER_VERIFY_REQUIRED 2
174/* Valid values for TLS_DTLS_ROLE option */
175#define TLS_DTLS_ROLE_CLIENT 0
176#define TLS_DTLS_ROLE_SERVER 1
178/* Valid values for TLS_CERT_NOCOPY option */
179#define TLS_CERT_NOCOPY_NONE 0
180#define TLS_CERT_NOCOPY_OPTIONAL 1
182/* Valid values for TLS_SESSION_CACHE option */
183#define TLS_SESSION_CACHE_DISABLED 0
184#define TLS_SESSION_CACHE_ENABLED 1
195
196 struct sockaddr _ai_addr;
197 char _ai_canonname[DNS_MAX_NAME_SIZE + 1];
198};
199
236__syscall void *zsock_get_context_object(int sock);
237
255__syscall int zsock_socket(int family, int type, int proto);
256
269__syscall int zsock_socketpair(int family, int type, int proto, int *sv);
270
282__syscall int zsock_close(int sock);
283
297__syscall int zsock_shutdown(int sock, int how);
298
311__syscall int zsock_bind(int sock, const struct sockaddr *addr,
312 socklen_t addrlen);
313
326__syscall int zsock_connect(int sock, const struct sockaddr *addr,
327 socklen_t addrlen);
328
341__syscall int zsock_listen(int sock, int backlog);
342
355__syscall int zsock_accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
356
369__syscall ssize_t zsock_sendto(int sock, const void *buf, size_t len,
370 int flags, const struct sockaddr *dest_addr,
371 socklen_t addrlen);
372
385static inline ssize_t zsock_send(int sock, const void *buf, size_t len,
386 int flags)
387{
388 return zsock_sendto(sock, buf, len, flags, NULL, 0);
389}
390
403__syscall ssize_t zsock_sendmsg(int sock, const struct msghdr *msg,
404 int flags);
405
418__syscall ssize_t zsock_recvfrom(int sock, void *buf, size_t max_len,
419 int flags, struct sockaddr *src_addr,
420 socklen_t *addrlen);
421
434static inline ssize_t zsock_recv(int sock, void *buf, size_t max_len,
435 int flags)
436{
437 return zsock_recvfrom(sock, buf, max_len, flags, NULL, NULL);
438}
439
452__syscall int zsock_fcntl(int sock, int cmd, int flags);
453
468__syscall int zsock_poll(struct zsock_pollfd *fds, int nfds, int timeout);
469
485__syscall int zsock_getsockopt(int sock, int level, int optname,
486 void *optval, socklen_t *optlen);
487
503__syscall int zsock_setsockopt(int sock, int level, int optname,
504 const void *optval, socklen_t optlen);
505
518__syscall int zsock_getpeername(int sock, struct sockaddr *addr,
519 socklen_t *addrlen);
520
533__syscall int zsock_getsockname(int sock, struct sockaddr *addr,
534 socklen_t *addrlen);
535
548__syscall int zsock_gethostname(char *buf, size_t len);
549
562static inline char *zsock_inet_ntop(sa_family_t family, const void *src,
563 char *dst, size_t size)
564{
565 return net_addr_ntop(family, src, dst, size);
566}
567
580__syscall int zsock_inet_pton(sa_family_t family, const char *src, void *dst);
581
583__syscall int z_zsock_getaddrinfo_internal(const char *host,
584 const char *service,
585 const struct zsock_addrinfo *hints,
586 struct zsock_addrinfo *res);
589/* Flags for getaddrinfo() hints. */
590
592#define AI_PASSIVE 0x1
594#define AI_CANONNAME 0x2
596#define AI_NUMERICHOST 0x4
598#define AI_V4MAPPED 0x8
600#define AI_ALL 0x10
602#define AI_ADDRCONFIG 0x20
604#define AI_NUMERICSERV 0x400
605
618int zsock_getaddrinfo(const char *host, const char *service,
619 const struct zsock_addrinfo *hints,
620 struct zsock_addrinfo **res);
621
635
648const char *zsock_gai_strerror(int errcode);
649
651#define NI_NUMERICHOST 1
653#define NI_NUMERICSERV 2
655#define NI_NOFQDN 4
657#define NI_NAMEREQD 8
659#define NI_DGRAM 16
660
661/* POSIX extensions */
662
664#ifndef NI_MAXHOST
665#define NI_MAXHOST 64
666#endif
667
680int zsock_getnameinfo(const struct sockaddr *addr, socklen_t addrlen,
681 char *host, socklen_t hostlen,
682 char *serv, socklen_t servlen, int flags);
683
684#if defined(CONFIG_NET_SOCKETS_POSIX_NAMES)
685
686#define pollfd zsock_pollfd
687
689static inline int socket(int family, int type, int proto)
690{
691 return zsock_socket(family, type, proto);
692}
693
695static inline int socketpair(int family, int type, int proto, int sv[2])
696{
697 return zsock_socketpair(family, type, proto, sv);
698}
699
701static inline int close(int sock)
702{
703 return zsock_close(sock);
704}
705
707static inline int shutdown(int sock, int how)
708{
709 return zsock_shutdown(sock, how);
710}
711
713static inline int bind(int sock, const struct sockaddr *addr, socklen_t addrlen)
714{
715 return zsock_bind(sock, addr, addrlen);
716}
717
719static inline int connect(int sock, const struct sockaddr *addr,
720 socklen_t addrlen)
721{
722 return zsock_connect(sock, addr, addrlen);
723}
724
726static inline int listen(int sock, int backlog)
727{
728 return zsock_listen(sock, backlog);
729}
730
732static inline int accept(int sock, struct sockaddr *addr, socklen_t *addrlen)
733{
734 return zsock_accept(sock, addr, addrlen);
735}
736
738static inline ssize_t send(int sock, const void *buf, size_t len, int flags)
739{
740 return zsock_send(sock, buf, len, flags);
741}
742
744static inline ssize_t recv(int sock, void *buf, size_t max_len, int flags)
745{
746 return zsock_recv(sock, buf, max_len, flags);
747}
748
749/*
750 * Need this wrapper because newer GCC versions got too smart and "typecheck"
751 * even macros, so '#define fcntl zsock_fcntl' leads to error.
752 */
753static inline int zsock_fcntl_wrapper(int sock, int cmd, ...)
754{
755 va_list args;
756 int flags;
757
758 va_start(args, cmd);
759 flags = va_arg(args, int);
760 va_end(args);
761 return zsock_fcntl(sock, cmd, flags);
762}
763
764#define fcntl zsock_fcntl_wrapper
765
767static inline ssize_t sendto(int sock, const void *buf, size_t len, int flags,
768 const struct sockaddr *dest_addr,
769 socklen_t addrlen)
770{
771 return zsock_sendto(sock, buf, len, flags, dest_addr, addrlen);
772}
773
775static inline ssize_t sendmsg(int sock, const struct msghdr *message,
776 int flags)
777{
778 return zsock_sendmsg(sock, message, flags);
779}
780
782static inline ssize_t recvfrom(int sock, void *buf, size_t max_len, int flags,
783 struct sockaddr *src_addr, socklen_t *addrlen)
784{
785 return zsock_recvfrom(sock, buf, max_len, flags, src_addr, addrlen);
786}
787
789static inline int poll(struct zsock_pollfd *fds, int nfds, int timeout)
790{
791 return zsock_poll(fds, nfds, timeout);
792}
793
795static inline int getsockopt(int sock, int level, int optname,
796 void *optval, socklen_t *optlen)
797{
798 return zsock_getsockopt(sock, level, optname, optval, optlen);
799}
800
802static inline int setsockopt(int sock, int level, int optname,
803 const void *optval, socklen_t optlen)
804{
805 return zsock_setsockopt(sock, level, optname, optval, optlen);
806}
807
809static inline int getpeername(int sock, struct sockaddr *addr,
810 socklen_t *addrlen)
811{
812 return zsock_getpeername(sock, addr, addrlen);
813}
814
816static inline int getsockname(int sock, struct sockaddr *addr,
817 socklen_t *addrlen)
818{
819 return zsock_getsockname(sock, addr, addrlen);
820}
821
823static inline int getaddrinfo(const char *host, const char *service,
824 const struct zsock_addrinfo *hints,
825 struct zsock_addrinfo **res)
826{
827 return zsock_getaddrinfo(host, service, hints, res);
828}
829
831static inline void freeaddrinfo(struct zsock_addrinfo *ai)
832{
834}
835
837static inline const char *gai_strerror(int errcode)
838{
839 return zsock_gai_strerror(errcode);
840}
841
843static inline int getnameinfo(const struct sockaddr *addr, socklen_t addrlen,
844 char *host, socklen_t hostlen,
845 char *serv, socklen_t servlen, int flags)
846{
847 return zsock_getnameinfo(addr, addrlen, host, hostlen,
848 serv, servlen, flags);
849}
850
851#define addrinfo zsock_addrinfo
852
854static inline int gethostname(char *buf, size_t len)
855{
856 return zsock_gethostname(buf, len);
857}
858
860static inline int inet_pton(sa_family_t family, const char *src, void *dst)
861{
862 return zsock_inet_pton(family, src, dst);
863}
864
866static inline char *inet_ntop(sa_family_t family, const void *src, char *dst,
867 size_t size)
868{
869 return zsock_inet_ntop(family, src, dst, size);
870}
871
873#define POLLIN ZSOCK_POLLIN
875#define POLLOUT ZSOCK_POLLOUT
877#define POLLERR ZSOCK_POLLERR
879#define POLLHUP ZSOCK_POLLHUP
881#define POLLNVAL ZSOCK_POLLNVAL
882
884#define MSG_PEEK ZSOCK_MSG_PEEK
886#define MSG_TRUNC ZSOCK_MSG_TRUNC
888#define MSG_DONTWAIT ZSOCK_MSG_DONTWAIT
890#define MSG_WAITALL ZSOCK_MSG_WAITALL
891
893#define SHUT_RD ZSOCK_SHUT_RD
895#define SHUT_WR ZSOCK_SHUT_WR
897#define SHUT_RDWR ZSOCK_SHUT_RDWR
898
900#define EAI_BADFLAGS DNS_EAI_BADFLAGS
902#define EAI_NONAME DNS_EAI_NONAME
904#define EAI_AGAIN DNS_EAI_AGAIN
906#define EAI_FAIL DNS_EAI_FAIL
908#define EAI_NODATA DNS_EAI_NODATA
910#define EAI_MEMORY DNS_EAI_MEMORY
912#define EAI_SYSTEM DNS_EAI_SYSTEM
914#define EAI_SERVICE DNS_EAI_SERVICE
916#define EAI_SOCKTYPE DNS_EAI_SOCKTYPE
918#define EAI_FAMILY DNS_EAI_FAMILY
919#endif /* defined(CONFIG_NET_SOCKETS_POSIX_NAMES) */
920
921#define IFNAMSIZ Z_DEVICE_MAX_NAME_LEN
922
924struct ifreq {
925 char ifr_name[IFNAMSIZ]; /* Interface name */
926};
927
929#define SOL_SOCKET 1
930
931/* Socket options for SOL_SOCKET level */
932
934#define SO_DEBUG 1
936#define SO_REUSEADDR 2
938#define SO_TYPE 3
940#define SO_ERROR 4
942#define SO_DONTROUTE 5
944#define SO_BROADCAST 6
945
947#define SO_SNDBUF 7
949#define SO_RCVBUF 8
950
952#define SO_KEEPALIVE 9
954#define SO_OOBINLINE 10
956#define SO_LINGER 13
958#define SO_REUSEPORT 15
959
961#define SO_RCVLOWAT 18
963#define SO_SNDLOWAT 19
964
969#define SO_RCVTIMEO 20
971#define SO_SNDTIMEO 21
972
974#define SO_BINDTODEVICE 25
975
977#define SO_ACCEPTCONN 30
978
980#define SO_TIMESTAMPING 37
982#define SO_PROTOCOL 38
983
985#define SO_DOMAIN 39
986
989/* Socket options for IPPROTO_TCP level */
991#define TCP_NODELAY 1
992
993/* Socket options for IPPROTO_IP level */
995#define IP_TOS 1
996
997/* Socket options for IPPROTO_IPV6 level */
999#define IPV6_V6ONLY 26
1000
1002#define IPV6_TCLASS 67
1003
1005#define SO_PRIORITY 12
1006
1008#define SO_TXTIME 61
1009#define SCM_TXTIME SO_TXTIME
1010
1011/* Socket options for SOCKS5 proxy */
1013#define SO_SOCKS5 60
1014
1016#define SOMAXCONN 128
1017
1022struct net_socket_register {
1023 int family;
1024 bool is_offloaded;
1025 bool (*is_supported)(int family, int type, int proto);
1026 int (*handler)(int family, int type, int proto);
1027};
1028
1029#define NET_SOCKET_DEFAULT_PRIO CONFIG_NET_SOCKETS_PRIORITY_DEFAULT
1030
1031#define NET_SOCKET_GET_NAME(socket_name, prio) \
1032 __net_socket_register_##prio##_##socket_name
1033
1034#define _NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler, _is_offloaded) \
1035 static const STRUCT_SECTION_ITERABLE(net_socket_register, \
1036 NET_SOCKET_GET_NAME(socket_name, prio)) = { \
1037 .family = _family, \
1038 .is_offloaded = _is_offloaded, \
1039 .is_supported = _is_supported, \
1040 .handler = _handler, \
1041 }
1042
1043#define NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler) \
1044 _NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler, false)
1045
1046#define NET_SOCKET_OFFLOAD_REGISTER(socket_name, prio, _family, _is_supported, _handler) \
1047 _NET_SOCKET_REGISTER(socket_name, prio, _family, _is_supported, _handler, true)
1048
1051#ifdef __cplusplus
1052}
1053#endif
1054
1055#include <syscalls/socket.h>
1056
1061#endif /* ZEPHYR_INCLUDE_NET_SOCKET_H_ */
ZTEST_BMEM int timeout
Definition: main.c:31
DNS resolving library.
static int socket(int family, int type, int proto)
Definition: socket.h:689
static int getpeername(int sock, struct sockaddr *addr, socklen_t *addrlen)
Definition: socket.h:809
int zsock_getpeername(int sock, struct sockaddr *addr, socklen_t *addrlen)
Get peer name.
static int getaddrinfo(const char *host, const char *service, const struct zsock_addrinfo *hints, struct zsock_addrinfo **res)
Definition: socket.h:823
static int bind(int sock, const struct sockaddr *addr, socklen_t addrlen)
Definition: socket.h:713
int zsock_fcntl(int sock, int cmd, int flags)
Control blocking/non-blocking mode of a socket.
static int gethostname(char *buf, size_t len)
Definition: socket.h:854
ssize_t zsock_sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
Send data to an arbitrary network address.
int zsock_connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
Connect a socket to a peer network address.
static ssize_t sendmsg(int sock, const struct msghdr *message, int flags)
Definition: socket.h:775
int zsock_socketpair(int family, int type, int proto, int *sv)
Create an unnamed pair of connected sockets.
void * zsock_get_context_object(int sock)
Obtain a file descriptor's associated net context.
int zsock_accept(int sock, struct sockaddr *addr, socklen_t *addrlen)
Accept a connection on listening socket.
static int inet_pton(sa_family_t family, const char *src, void *dst)
Definition: socket.h:860
static ssize_t recvfrom(int sock, void *buf, size_t max_len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
Definition: socket.h:782
static ssize_t zsock_send(int sock, const void *buf, size_t len, int flags)
Send data to a connected peer.
Definition: socket.h:385
static int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen)
Definition: socket.h:795
static int zsock_fcntl_wrapper(int sock, int cmd,...)
Definition: socket.h:753
static int accept(int sock, struct sockaddr *addr, socklen_t *addrlen)
Definition: socket.h:732
static int listen(int sock, int backlog)
Definition: socket.h:726
static int close(int sock)
Definition: socket.h:701
int zsock_bind(int sock, const struct sockaddr *addr, socklen_t addrlen)
Bind a socket to a local network address.
int zsock_socket(int family, int type, int proto)
Create a network socket.
int zsock_getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen)
Get various socket options.
static int getnameinfo(const struct sockaddr *addr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
Definition: socket.h:843
void zsock_freeaddrinfo(struct zsock_addrinfo *ai)
Free results returned by zsock_getaddrinfo()
static ssize_t zsock_recv(int sock, void *buf, size_t max_len, int flags)
Receive data from a connected peer.
Definition: socket.h:434
int zsock_gethostname(char *buf, size_t len)
Get local host name.
static int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)
Definition: socket.h:802
int zsock_getsockname(int sock, struct sockaddr *addr, socklen_t *addrlen)
Get socket name.
static int getsockname(int sock, struct sockaddr *addr, socklen_t *addrlen)
Definition: socket.h:816
int zsock_poll(struct zsock_pollfd *fds, int nfds, int timeout)
Efficiently poll multiple sockets for events.
const char * zsock_gai_strerror(int errcode)
Convert zsock_getaddrinfo() error code to textual message.
static const char * gai_strerror(int errcode)
Definition: socket.h:837
int zsock_shutdown(int sock, int how)
Shutdown socket send/receive operations.
ssize_t zsock_recvfrom(int sock, void *buf, size_t max_len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
Receive data from an arbitrary network address.
#define IFNAMSIZ
Definition: socket.h:921
static ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
Definition: socket.h:767
int zsock_setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)
Set various socket options.
static ssize_t send(int sock, const void *buf, size_t len, int flags)
Definition: socket.h:738
static int socketpair(int family, int type, int proto, int sv[2])
Definition: socket.h:695
ssize_t zsock_sendmsg(int sock, const struct msghdr *msg, int flags)
Send data to an arbitrary network address.
static int connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
Definition: socket.h:719
static ssize_t recv(int sock, void *buf, size_t max_len, int flags)
Definition: socket.h:744
static int poll(struct zsock_pollfd *fds, int nfds, int timeout)
Definition: socket.h:789
static char * zsock_inet_ntop(sa_family_t family, const void *src, char *dst, size_t size)
Convert network address from internal to numeric ASCII form.
Definition: socket.h:562
int zsock_inet_pton(sa_family_t family, const char *src, void *dst)
Convert network address from numeric ASCII form to internal representation.
int zsock_close(int sock)
Close a network socket.
int zsock_listen(int sock, int backlog)
Set up a STREAM socket to accept peer connections.
int zsock_getnameinfo(const struct sockaddr *addr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
Resolve a network address to a domain name or ASCII address.
static char * inet_ntop(sa_family_t family, const void *src, char *dst, size_t size)
Definition: socket.h:866
int zsock_getaddrinfo(const char *host, const char *service, const struct zsock_addrinfo *hints, struct zsock_addrinfo **res)
Resolve a domain name to one or more network addresses.
static void freeaddrinfo(struct zsock_addrinfo *ai)
Definition: socket.h:831
static int shutdown(int sock, int how)
Definition: socket.h:707
#define DNS_MAX_NAME_SIZE
Definition: dns_resolve.h:42
static void cmd(uint32_t command)
Execute a display list command by co-processor engine.
Definition: ft8xx_reference_api.h:153
unsigned short int sa_family_t
Definition: net_ip.h:164
char * net_addr_ntop(sa_family_t family, const void *src, char *dst, size_t size)
Convert IP address to string form.
size_t socklen_t
Definition: net_ip.h:167
__SIZE_TYPE__ ssize_t
Definition: types.h:28
IPv6 and IPv4 definitions.
flags
Definition: parser.h:96
#define bool
Definition: stdbool.h:13
Definition: socket.h:924
char ifr_name[Z_DEVICE_MAX_NAME_LEN]
Definition: socket.h:925
Definition: net_ip.h:235
Definition: net_ip.h:344
Definition: socket.h:186
struct zsock_addrinfo * ai_next
Definition: socket.h:187
int ai_family
Definition: socket.h:189
int ai_flags
Definition: socket.h:188
char * ai_canonname
Definition: socket.h:194
int ai_protocol
Definition: socket.h:191
struct sockaddr * ai_addr
Definition: socket.h:193
int ai_socktype
Definition: socket.h:190
socklen_t ai_addrlen
Definition: socket.h:192
Definition: socket.h:36
short events
Definition: socket.h:38
int fd
Definition: socket.h:37
short revents
Definition: socket.h:39
static void msg(uint64_t c64)
Definition: main.c:17
static void handler(struct k_timer *timer)
Definition: main.c:19