diff options
author | Alexander Couzens <lynxis@fe80.eu> | 2020-06-07 18:10:13 +0200 |
---|---|---|
committer | Alexander Couzens <lynxis@fe80.eu> | 2020-08-10 23:29:21 +0200 |
commit | 8419bb2e9e7b24e21b9dd71352f4490e572ba4ee (patch) | |
tree | 4758c10ffdd7eed1b164955dba81181ab9dd52c0 | |
parent | eb6882fa5249c1f4fd764f4339ff7d749e1cfb99 (diff) |
socket.h: introduce osmo_sockaddr to hold v4 and v6 endpoints
When dealing with IPv4 and IPv6 address, the struct sockaddr
allows to hold IPv4 and IPv6.
However even when struct sockaddr is being used, a cast to the
IPv4 or IPv6 family must happen. To work around this additional code,
use a union for the most common types.
Change-Id: If80172373735193401af872b18e1ff00c93880e7
-rw-r--r-- | include/osmocom/core/socket.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index 129612c6..9cb8d6ba 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -2,6 +2,7 @@ * Osmocom socket convenience functions. */ #pragma once +#if (!EMBEDDED) /*! \defgroup socket Socket convenience functions * @{ @@ -11,17 +12,24 @@ #include <stdbool.h> #include <stddef.h> -#if (!EMBEDDED) #include <arpa/inet.h> /*! maximum length of a socket name ("r=1.2.3.4:123<->l=5.6.7.8:987") */ #define OSMO_SOCK_NAME_MAXLEN (2 + INET6_ADDRSTRLEN + 1 + 5 + 3 + 2 + INET6_ADDRSTRLEN + 1 + 5 + 1) -#endif struct sockaddr_in; struct sockaddr; struct osmo_fd; +struct osmo_sockaddr { + union { + struct sockaddr sa; + struct sockaddr_storage sas; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + } u; +}; + /* flags for osmo_sock_init. */ /*! connect the socket to a remote peer */ #define OSMO_SOCK_F_CONNECT (1 << 0) @@ -92,4 +100,5 @@ int osmo_sock_mcast_subscribe(int fd, const char *grp_addr); int osmo_sock_local_ip(char *local_ip, const char *remote_ip); +#endif /* (!EMBEDDED) */ /*! @} */ |