From 8419bb2e9e7b24e21b9dd71352f4490e572ba4ee Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Sun, 7 Jun 2020 18:10:13 +0200 Subject: 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 --- include/osmocom/core/socket.h | 13 +++++++++++-- 1 file 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 #include -#if (!EMBEDDED) #include /*! 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) */ /*! @} */ -- cgit v1.2.3