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
This commit is contained in:
Alexander Couzens 2020-06-07 18:10:13 +02:00
parent eb6882fa52
commit 8419bb2e9e
1 changed files with 11 additions and 2 deletions

View File

@ -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) */
/*! @} */