libosmocore  1.5.1
Osmocom core library
Socket convenience functions

Files

file  socket.h
 
file  socket.c
 

Data Structures

struct  osmo_sockaddr
 

Macros

#define OSMO_SOCK_NAME_MAXLEN   (2 + INET6_ADDRSTRLEN + 1 + 5 + 3 + 2 + INET6_ADDRSTRLEN + 1 + 5 + 1)
 maximum length of a socket name ("r=1.2.3.4:123<->l=5.6.7.8:987") More...
 
#define OSMO_SOCK_F_CONNECT   (1 << 0)
 connect the socket to a remote peer More...
 
#define OSMO_SOCK_F_BIND   (1 << 1)
 bind the socket to a local address/port More...
 
#define OSMO_SOCK_F_NONBLOCK   (1 << 2)
 switch socket to non-blocking mode More...
 
#define OSMO_SOCK_F_NO_MCAST_LOOP   (1 << 3)
 disable multiast loop (IP_MULTICAST_LOOP) More...
 
#define OSMO_SOCK_F_NO_MCAST_ALL   (1 << 4)
 disable receiving all multiast even for non-subscribed groups More...
 
#define OSMO_SOCK_F_UDP_REUSEADDR   (1 << 5)
 use SO_REUSEADDR on UDP ports (required for multicast) More...
 
#define OSMO_SOCK_MAX_ADDRS   32
 maximum number of local or remote addresses supported by an osmo_sock instance More...
 
#define _SOCKADDR_TO_STR(dest, sockaddr)
 

Functions

int osmo_sock_init (uint16_t family, uint16_t type, uint8_t proto, const char *host, uint16_t port, unsigned int flags)
 Initialize a socket (including bind/connect) More...
 
int osmo_sock_init2 (uint16_t family, uint16_t type, uint8_t proto, const char *local_host, uint16_t local_port, const char *remote_host, uint16_t remote_port, unsigned int flags)
 Initialize a socket (including bind and/or connect) More...
 
int osmo_sock_init2_multiaddr (uint16_t family, uint16_t type, uint8_t proto, const char **local_hosts, size_t local_hosts_cnt, uint16_t local_port, const char **remote_hosts, size_t remote_hosts_cnt, uint16_t remote_port, unsigned int flags)
 Initialize a socket (including bind and/or connect) with multiple local or remote addresses. More...
 
int osmo_sock_init_osa (uint16_t type, uint8_t proto, const struct osmo_sockaddr *local, const struct osmo_sockaddr *remote, unsigned int flags)
 Initialize a socket (including bind and/or connect) More...
 
int osmo_sock_init_ofd (struct osmo_fd *ofd, int family, int type, int proto, const char *host, uint16_t port, unsigned int flags)
 Initialize a socket and fill osmo_fd. More...
 
int osmo_sock_init2_ofd (struct osmo_fd *ofd, int family, int type, int proto, const char *local_host, uint16_t local_port, const char *remote_host, uint16_t remote_port, unsigned int flags)
 Initialize a socket and fill osmo_fd. More...
 
int osmo_sock_init_osa_ofd (struct osmo_fd *ofd, int type, int proto, const struct osmo_sockaddr *local, const struct osmo_sockaddr *remote, unsigned int flags)
 
int osmo_sock_init_sa (struct sockaddr *ss, uint16_t type, uint8_t proto, unsigned int flags)
 Initialize a socket and fill sockaddr. More...
 
int osmo_sockaddr_is_local (struct sockaddr *addr, unsigned int addrlen)
 Determine if the given address is a local address. More...
 
unsigned int osmo_sockaddr_to_str_and_uint (char *addr, unsigned int addr_len, uint16_t *port, const struct sockaddr *sa)
 Convert sockaddr to IP address as char string and port as uint16_t. More...
 
size_t osmo_sockaddr_in_to_str_and_uint (char *addr, unsigned int addr_len, uint16_t *port, const struct sockaddr_in *sin)
 Convert sockaddr_in to IP address as char string and port as uint16_t. More...
 
const char * osmo_sockaddr_ntop (const struct sockaddr *sa, char *dst)
 inet_ntop() wrapper for a struct sockaddr. More...
 
uint16_t osmo_sockaddr_port (const struct sockaddr *sa)
 Get sockaddr port content (in host byte order) More...
 
int osmo_sock_unix_init (uint16_t type, uint8_t proto, const char *socket_path, unsigned int flags)
 Initialize a unix domain socket (including bind/connect) More...
 
int osmo_sock_unix_init_ofd (struct osmo_fd *ofd, uint16_t type, uint8_t proto, const char *socket_path, unsigned int flags)
 Initialize a unix domain socket and fill osmo_fd. More...
 
char * osmo_sock_get_name (const void *ctx, int fd)
 Get address/port information on socket in dyn-alloc string like "(r=1.2.3.4:5<->l=6.7.8.9:10)". More...
 
const char * osmo_sock_get_name2 (int fd)
 Get address/port information on socket in static string, like "r=1.2.3.4:5<->l=6.7.8.9:10". More...
 
char * osmo_sock_get_name2_c (const void *ctx, int fd)
 Get address/port information on socket in static string, like "r=1.2.3.4:5<->l=6.7.8.9:10". More...
 
int osmo_sock_get_name_buf (char *str, size_t str_len, int fd)
 Get address/port information on socket in provided string buffer, like "r=1.2.3.4:5<->l=6.7.8.9:10". More...
 
int osmo_sock_get_ip_and_port (int fd, char *ip, size_t ip_len, char *port, size_t port_len, bool local)
 Get the IP and/or port number on socket in separate string buffers. More...
 
int osmo_sock_get_local_ip (int fd, char *ip, size_t len)
 Get local IP address on socket. More...
 
int osmo_sock_get_local_ip_port (int fd, char *port, size_t len)
 Get local port on socket. More...
 
int osmo_sock_get_remote_ip (int fd, char *ip, size_t len)
 Get remote IP address on socket. More...
 
int osmo_sock_get_remote_ip_port (int fd, char *port, size_t len)
 Get remote port on socket. More...
 
int osmo_sock_mcast_loop_set (int fd, bool enable)
 Activate or de-activate local loop-back of transmitted multicast packets. More...
 
int osmo_sock_mcast_ttl_set (int fd, uint8_t ttl)
 Set the TTL of outbound multicast packets. More...
 
int osmo_sock_mcast_all_set (int fd, bool enable)
 Enable/disable receiving all multicast packets, even for non-subscribed groups. More...
 
int osmo_sock_mcast_iface_set (int fd, const char *ifname)
 Set the network device to which we should bind the multicast socket. More...
 
int osmo_sock_mcast_subscribe (int fd, const char *grp_addr)
 Subscribe to the given IP multicast group. More...
 
int osmo_sock_local_ip (char *local_ip, const char *remote_ip)
 Determine the matching local IP-address for a given remote IP-Address. More...
 
int osmo_sockaddr_local_ip (struct osmo_sockaddr *local_ip, const struct osmo_sockaddr *remote_ip)
 Determine the matching local address for a given remote address. More...
 
int osmo_sockaddr_cmp (const struct osmo_sockaddr *a, const struct osmo_sockaddr *b)
 Compare two osmo_sockaddr. More...
 
const char * osmo_sockaddr_to_str (const struct osmo_sockaddr *sockaddr)
 string-format a given osmo_sockaddr address More...
 
char * osmo_sockaddr_to_str_buf (char *buf, size_t buf_len, const struct osmo_sockaddr *sockaddr)
 string-format a given osmo_sockaddr address into a user-supplied buffer More...
 
static struct addrinfo * addrinfo_helper (uint16_t family, uint16_t type, uint8_t proto, const char *host, uint16_t port, bool passive)
 
static int addrinfo_helper_multi (struct addrinfo **addrinfo, uint16_t family, uint16_t type, uint8_t proto, const char **hosts, size_t host_cnt, uint16_t port, bool passive)
 Retrieve an array of addrinfo with specified hints, one for each host in the hosts array. More...
 
static int socket_helper (const struct addrinfo *rp, unsigned int flags)
 
static int socket_helper_osa (const struct osmo_sockaddr *addr, uint16_t type, uint8_t proto, unsigned int flags)
 
static int multiaddr_snprintf (char *buf, size_t buf_len, const char **hosts, size_t host_cnt)
 
static int osmo_sock_init_tail (int fd, uint16_t type, unsigned int flags)
 
static void addrinfo_has_v4v6addr (const struct addrinfo **result, size_t result_count, bool *has_v4, bool *has_v6)
 
static bool addrinfo_has_in6addr_any (const struct addrinfo **result, size_t result_count)
 
static int socket_helper_multiaddr (uint16_t family, uint16_t type, uint8_t proto, unsigned int flags)
 
static int addrinfo_to_sockaddr (uint16_t family, const struct addrinfo **result, const char **hosts, int host_cont, uint8_t *addrs_buf, size_t addrs_buf_len)
 
static int osmo_fd_init_ofd (struct osmo_fd *ofd, int sfd)
 fill osmo_fd for a give sfd More...
 
static int sockaddr_equal (const struct sockaddr *a, const struct sockaddr *b, unsigned int len)
 
static int sock_get_domain (int fd)
 

Detailed Description

Osmocom socket convenience functions.

Macro Definition Documentation

◆ _SOCKADDR_TO_STR

#define _SOCKADDR_TO_STR (   dest,
  sockaddr 
)
Value:
do { \
if (osmo_sockaddr_str_from_sockaddr(&dest, &sockaddr->u.sas)) \
osmo_strlcpy(dest.ip, "Invalid IP", 11); \
} while (0)

◆ OSMO_SOCK_F_BIND

#define OSMO_SOCK_F_BIND   (1 << 1)

bind the socket to a local address/port

◆ OSMO_SOCK_F_CONNECT

#define OSMO_SOCK_F_CONNECT   (1 << 0)

connect the socket to a remote peer

◆ OSMO_SOCK_F_NO_MCAST_ALL

#define OSMO_SOCK_F_NO_MCAST_ALL   (1 << 4)

disable receiving all multiast even for non-subscribed groups

◆ OSMO_SOCK_F_NO_MCAST_LOOP

#define OSMO_SOCK_F_NO_MCAST_LOOP   (1 << 3)

disable multiast loop (IP_MULTICAST_LOOP)

◆ OSMO_SOCK_F_NONBLOCK

#define OSMO_SOCK_F_NONBLOCK   (1 << 2)

switch socket to non-blocking mode

◆ OSMO_SOCK_F_UDP_REUSEADDR

#define OSMO_SOCK_F_UDP_REUSEADDR   (1 << 5)

use SO_REUSEADDR on UDP ports (required for multicast)

◆ OSMO_SOCK_MAX_ADDRS

#define OSMO_SOCK_MAX_ADDRS   32

maximum number of local or remote addresses supported by an osmo_sock instance

◆ OSMO_SOCK_NAME_MAXLEN

#define OSMO_SOCK_NAME_MAXLEN   (2 + INET6_ADDRSTRLEN + 1 + 5 + 3 + 2 + INET6_ADDRSTRLEN + 1 + 5 + 1)

maximum length of a socket name ("r=1.2.3.4:123<->l=5.6.7.8:987")

Function Documentation

◆ addrinfo_has_in6addr_any()

static bool addrinfo_has_in6addr_any ( const struct addrinfo **  result,
size_t  result_count 
)
static

◆ addrinfo_has_v4v6addr()

static void addrinfo_has_v4v6addr ( const struct addrinfo **  result,
size_t  result_count,
bool *  has_v4,
bool *  has_v6 
)
static

◆ addrinfo_helper()

static struct addrinfo* addrinfo_helper ( uint16_t  family,
uint16_t  type,
uint8_t  proto,
const char *  host,
uint16_t  port,
bool  passive 
)
static

◆ addrinfo_helper_multi()

static int addrinfo_helper_multi ( struct addrinfo **  addrinfo,
uint16_t  family,
uint16_t  type,
uint8_t  proto,
const char **  hosts,
size_t  host_cnt,
uint16_t  port,
bool  passive 
)
static

Retrieve an array of addrinfo with specified hints, one for each host in the hosts array.

Parameters
[out]addrinfoarray of addrinfo pointers, will be filled by the function on success. Its size must be at least the one of hosts.
[in]familySocket family like AF_INET, AF_INET6.
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM.
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP.
[in]hostsarray of char pointers (strings) containing the addresses to query.
[in]host_cntlength of the hosts array (in items).
[in]portport number in host byte order.
[in]passivewhether to include the AI_PASSIVE flag in getaddrinfo() hints.
Returns
0 is returned on success together with a filled addrinfo array; negative on error

References addrinfo_helper(), proto, and type.

Referenced by osmo_sock_init2_multiaddr().

◆ addrinfo_to_sockaddr()

static int addrinfo_to_sockaddr ( uint16_t  family,
const struct addrinfo **  result,
const char **  hosts,
int  host_cont,
uint8_t *  addrs_buf,
size_t  addrs_buf_len 
)
static

References DLGLOBAL, LOGL_ERROR, and LOGP.

Referenced by osmo_sock_init2_multiaddr().

◆ multiaddr_snprintf()

static int multiaddr_snprintf ( char *  buf,
size_t  buf_len,
const char **  hosts,
size_t  host_cnt 
)
static

References len(), and OSMO_SNPRINTF_RET.

Referenced by osmo_sock_init2_multiaddr().

◆ osmo_fd_init_ofd()

static int osmo_fd_init_ofd ( struct osmo_fd ofd,
int  sfd 
)
inlinestatic

fill osmo_fd for a give sfd

Parameters
[out]ofdfile descriptor (will be filled in)
[in]sfdsocket file descriptor
Returns
socket fd on success; negative on error

This function fills the ofd structure.

References osmo_fd::fd, OSMO_FD_READ, osmo_fd_register(), and osmo_fd::when.

Referenced by osmo_sock_init2_ofd(), osmo_sock_init_ofd(), osmo_sock_init_osa_ofd(), and osmo_sock_unix_init_ofd().

◆ osmo_sock_get_ip_and_port()

int osmo_sock_get_ip_and_port ( int  fd,
char *  ip,
size_t  ip_len,
char *  port,
size_t  port_len,
bool  local 
)

Get the IP and/or port number on socket in separate string buffers.

Parameters
[in]fdfile descriptor of socket
[out]ipIP address (will be filled in when not NULL)
[in]ip_lenlength of the ip buffer
[out]portnumber (will be filled in when not NULL)
[in]port_lenlength of the port buffer
[in]local(true) or remote (false) name will get looked at
Returns
0 on success; negative otherwise

References len().

Referenced by osmo_sock_get_local_ip(), osmo_sock_get_local_ip_port(), osmo_sock_get_name_buf(), osmo_sock_get_remote_ip(), and osmo_sock_get_remote_ip_port().

◆ osmo_sock_get_local_ip()

int osmo_sock_get_local_ip ( int  fd,
char *  ip,
size_t  len 
)

Get local IP address on socket.

Parameters
[in]fdfile descriptor of socket
[out]ipIP address (will be filled in)
[in]lenlength of the output buffer
Returns
0 on success; negative otherwise

References len(), and osmo_sock_get_ip_and_port().

◆ osmo_sock_get_local_ip_port()

int osmo_sock_get_local_ip_port ( int  fd,
char *  port,
size_t  len 
)

Get local port on socket.

Parameters
[in]fdfile descriptor of socket
[out]portnumber (will be filled in)
[in]lenlength of the output buffer
Returns
0 on success; negative otherwise

References len(), and osmo_sock_get_ip_and_port().

◆ osmo_sock_get_name()

char * osmo_sock_get_name ( const void *  ctx,
int  fd 
)

Get address/port information on socket in dyn-alloc string like "(r=1.2.3.4:5<->l=6.7.8.9:10)".

Usually, it is better to use osmo_sock_get_name2() for a static string buffer or osmo_sock_get_name_buf() for a caller provided string buffer, to avoid the dynamic talloc allocation.

Parameters
[in]ctxtalloc context from which to allocate string buffer
[in]fdfile descriptor of socket
Returns
string identifying the connection of this socket, talloc'd from ctx.

References osmo_sock_get_name_buf(), and OSMO_SOCK_NAME_MAXLEN.

◆ osmo_sock_get_name2()

const char * osmo_sock_get_name2 ( int  fd)

Get address/port information on socket in static string, like "r=1.2.3.4:5<->l=6.7.8.9:10".

This does not include braces like osmo_sock_get_name().

Parameters
[in]fdFile descriptor of socket.
Returns
Static string buffer containing the result.

References osmo_sock_get_name_buf(), and OSMO_SOCK_NAME_MAXLEN.

◆ osmo_sock_get_name2_c()

char * osmo_sock_get_name2_c ( const void *  ctx,
int  fd 
)

Get address/port information on socket in static string, like "r=1.2.3.4:5<->l=6.7.8.9:10".

This does not include braces like osmo_sock_get_name().

Parameters
[in]fdFile descriptor of socket.
Returns
Static string buffer containing the result.

References osmo_sock_get_name_buf(), and OSMO_SOCK_NAME_MAXLEN.

◆ osmo_sock_get_name_buf()

int osmo_sock_get_name_buf ( char *  str,
size_t  str_len,
int  fd 
)

Get address/port information on socket in provided string buffer, like "r=1.2.3.4:5<->l=6.7.8.9:10".

This does not include braces like osmo_sock_get_name().

Parameters
[out]strDestination string buffer.
[in]str_lensizeof(str).
[in]fdFile descriptor of socket.
Returns
String length as returned by snprintf(), or negative on error.

References osmo_sock_get_ip_and_port(), and osmo_strlcpy().

Referenced by osmo_sock_get_name(), osmo_sock_get_name2(), and osmo_sock_get_name2_c().

◆ osmo_sock_get_remote_ip()

int osmo_sock_get_remote_ip ( int  fd,
char *  ip,
size_t  len 
)

Get remote IP address on socket.

Parameters
[in]fdfile descriptor of socket
[out]ipIP address (will be filled in)
[in]lenlength of the output buffer
Returns
0 on success; negative otherwise

References len(), and osmo_sock_get_ip_and_port().

◆ osmo_sock_get_remote_ip_port()

int osmo_sock_get_remote_ip_port ( int  fd,
char *  port,
size_t  len 
)

Get remote port on socket.

Parameters
[in]fdfile descriptor of socket
[out]portnumber (will be filled in)
[in]lenlength of the output buffer
Returns
0 on success; negative otherwise

References len(), and osmo_sock_get_ip_and_port().

◆ osmo_sock_init()

int osmo_sock_init ( uint16_t  family,
uint16_t  type,
uint8_t  proto,
const char *  host,
uint16_t  port,
unsigned int  flags 
)

Initialize a socket (including bind/connect)

Parameters
[in]familyAddress Family like AF_INET, AF_INET6, AF_UNSPEC
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]hostremote host name or IP address in string form
[in]portremote port number in host byte order
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket file descriptor on success; negative on error

This function creates a new socket of the designated family, type and proto and optionally binds or connects it, depending on the value of flags parameter.

References addrinfo_helper(), DLGLOBAL, flags, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_UDP_REUSEADDR, osmo_sock_init_tail(), proto, socket_helper(), and type.

Referenced by gsmtap_source_init_fd(), osmo_sock_init_ofd(), and osmo_sock_init_sa().

◆ osmo_sock_init2()

int osmo_sock_init2 ( uint16_t  family,
uint16_t  type,
uint8_t  proto,
const char *  local_host,
uint16_t  local_port,
const char *  remote_host,
uint16_t  remote_port,
unsigned int  flags 
)

Initialize a socket (including bind and/or connect)

Parameters
[in]familyAddress Family like AF_INET, AF_INET6, AF_UNSPEC
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]local_hostlocal host name or IP address in string form
[in]local_portlocal port number in host byte order
[in]remote_hostremote host name or IP address in string form
[in]remote_portremote port number in host byte order
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket file descriptor on success; negative on error

This function creates a new socket of the designated family, type and proto and optionally binds it to the local_host and local_port as well as optionally connects it to the remote_host and \q remote_port, depending on the value * of flags parameter.

As opposed to osmo_sock_init(), this function allows to combine the OSMO_SOCK_F_BIND and OSMO_SOCK_F_CONNECT flags. This is useful if you want to connect to a remote host/port, but still want to bind that socket to either a specific local alias IP and/or a specific local source port.

You must specify either OSMO_SOCK_F_BIND, or OSMO_SOCK_F_CONNECT, or both.

If OSMO_SOCK_F_NONBLOCK is specified, the socket will be set to non-blocking mode.

References addrinfo_helper(), DLGLOBAL, flags, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_UDP_REUSEADDR, osmo_sock_init_tail(), proto, socket_helper(), and type.

Referenced by osmo_sock_init2_ofd(), and osmo_sock_local_ip().

◆ osmo_sock_init2_multiaddr()

int osmo_sock_init2_multiaddr ( uint16_t  family,
uint16_t  type,
uint8_t  proto,
const char **  local_hosts,
size_t  local_hosts_cnt,
uint16_t  local_port,
const char **  remote_hosts,
size_t  remote_hosts_cnt,
uint16_t  remote_port,
unsigned int  flags 
)

Initialize a socket (including bind and/or connect) with multiple local or remote addresses.

Parameters
[in]familyAddress Family like AF_INET, AF_INET6, AF_UNSPEC
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]local_hostsarray of char pointers (strings), each containing local host name or IP address in string form
[in]local_hosts_cntlength of local_hosts (in items)
[in]local_portlocal port number in host byte order
[in]remote_hostarray of char pointers (strings), each containing remote host name or IP address in string form
[in]remote_hosts_cntlength of remote_hosts (in items)
[in]remote_portremote port number in host byte order
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket file descriptor on success; negative on error

This function is similar to osmo_sock_init2(), but can be passed an array of local or remote addresses for protocols supporting multiple addresses per socket, like SCTP (currently only one supported). This function should not be used by protocols not supporting this kind of features, but rather osmo_sock_init2() should be used instead. See osmo_sock_init2() for more information on flags and general behavior.

References addrinfo_has_in6addr_any(), addrinfo_has_v4v6addr(), addrinfo_helper_multi(), addrinfo_to_sockaddr(), DLGLOBAL, ENOTSUP, flags, LOGL_ERROR, LOGL_NOTICE, LOGP, multiaddr_snprintf(), OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, osmo_sock_init_tail(), OSMO_SOCK_MAX_ADDRS, proto, socket_helper_multiaddr(), and type.

◆ osmo_sock_init2_ofd()

int osmo_sock_init2_ofd ( struct osmo_fd ofd,
int  family,
int  type,
int  proto,
const char *  local_host,
uint16_t  local_port,
const char *  remote_host,
uint16_t  remote_port,
unsigned int  flags 
)

Initialize a socket and fill osmo_fd.

Parameters
[out]ofdfile descriptor (will be filled in)
[in]familyAddress Family like AF_INET, AF_INET6, AF_UNSPEC
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]local_hostlocal host name or IP address in string form
[in]local_portlocal port number in host byte order
[in]remote_hostremote host name or IP address in string form
[in]remote_portremote port number in host byte order
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket fd on success; negative on error

This function creates (and optionall binds/connects) a socket using osmo_sock_init2, but also fills the ofd structure.

References flags, osmo_fd_init_ofd(), osmo_sock_init2(), proto, and type.

◆ osmo_sock_init_ofd()

int osmo_sock_init_ofd ( struct osmo_fd ofd,
int  family,
int  type,
int  proto,
const char *  host,
uint16_t  port,
unsigned int  flags 
)

Initialize a socket and fill osmo_fd.

Parameters
[out]ofdfile descriptor (will be filled in)
[in]familyAddress Family like AF_INET, AF_INET6, AF_UNSPEC
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]hostremote host name or IP address in string form
[in]portremote port number in host byte order
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket fd on success; negative on error

This function creates (and optionall binds/connects) a socket using osmo_sock_init, but also fills the ofd structure.

References flags, osmo_fd_init_ofd(), osmo_sock_init(), proto, and type.

◆ osmo_sock_init_osa()

int osmo_sock_init_osa ( uint16_t  type,
uint8_t  proto,
const struct osmo_sockaddr local,
const struct osmo_sockaddr remote,
unsigned int  flags 
)

Initialize a socket (including bind and/or connect)

Parameters
[in]familyAddress Family like AF_INET, AF_INET6, AF_UNSPEC
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]locallocal address
[in]remoteremote address
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket file descriptor on success; negative on error

This function creates a new socket of the type and proto and optionally binds it to the local as well as optionally connects it to the remote depending on the value * of flags parameter.

As opposed to osmo_sock_init(), this function allows to combine the OSMO_SOCK_F_BIND and OSMO_SOCK_F_CONNECT flags. This is useful if you want to connect to a remote host/port, but still want to bind that socket to either a specific local alias IP and/or a specific local source port.

You must specify either OSMO_SOCK_F_BIND, or OSMO_SOCK_F_CONNECT, or both.

If OSMO_SOCK_F_NONBLOCK is specified, the socket will be set to non-blocking mode.

References _SOCKADDR_TO_STR, DLGLOBAL, flags, osmo_sockaddr_str::ip, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_UDP_REUSEADDR, osmo_sock_init_tail(), osmo_sockaddr_str::port, proto, osmo_sockaddr::sa, socket_helper_osa(), type, and osmo_sockaddr::u.

Referenced by osmo_sock_init_osa_ofd(), and osmo_sockaddr_local_ip().

◆ osmo_sock_init_osa_ofd()

int osmo_sock_init_osa_ofd ( struct osmo_fd ofd,
int  type,
int  proto,
const struct osmo_sockaddr local,
const struct osmo_sockaddr remote,
unsigned int  flags 
)

◆ osmo_sock_init_sa()

int osmo_sock_init_sa ( struct sockaddr *  ss,
uint16_t  type,
uint8_t  proto,
unsigned int  flags 
)

Initialize a socket and fill sockaddr.

Parameters
[out]sssocket address (will be filled in)
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket fd on success; negative on error

This function creates (and optionall binds/connects) a socket using osmo_sock_init, but also fills the ss structure.

References DLGLOBAL, flags, LOGL_ERROR, LOGP, osmo_sock_init(), proto, and type.

Referenced by gsmtap_source_add_sink_fd().

◆ osmo_sock_init_tail()

◆ osmo_sock_local_ip()

int osmo_sock_local_ip ( char *  local_ip,
const char *  remote_ip 
)

Determine the matching local IP-address for a given remote IP-Address.

Parameters
[out]local_ipcaller provided memory for resulting local IP-address
[in]remote_ipremote IP-address
Returns
0 on success; negative otherwise

The function accepts IPv4 and IPv6 address strings. The caller must provide at least INET6_ADDRSTRLEN bytes for local_ip if an IPv6 is expected as as result. For IPv4 addresses the required amount is INET_ADDRSTRLEN.

References OSMO_SOCK_F_CONNECT, and osmo_sock_init2().

◆ osmo_sock_mcast_all_set()

int osmo_sock_mcast_all_set ( int  fd,
bool  enable 
)

Enable/disable receiving all multicast packets, even for non-subscribed groups.

Parameters
[in]fdfile descriptor of related socket
[in]enableEnable or Disable receiving of all packets
Returns
0 on success; negative otherwise

References sock_get_domain().

Referenced by osmo_sock_init_tail().

◆ osmo_sock_mcast_iface_set()

int osmo_sock_mcast_iface_set ( int  fd,
const char *  ifname 
)

Set the network device to which we should bind the multicast socket.

Parameters
[in]fdfile descriptor of related socket
[in]ifnamename of network interface to user for multicast
Returns
0 on success; negative otherwise

◆ osmo_sock_mcast_loop_set()

int osmo_sock_mcast_loop_set ( int  fd,
bool  enable 
)

Activate or de-activate local loop-back of transmitted multicast packets.

Parameters
[in]fdfile descriptor of related socket
[in]enableEnable (true) or disable (false) loop-back
Returns
0 on success; negative otherwise

References sock_get_domain().

Referenced by osmo_sock_init_tail().

◆ osmo_sock_mcast_subscribe()

int osmo_sock_mcast_subscribe ( int  fd,
const char *  grp_addr 
)

Subscribe to the given IP multicast group.

Parameters
[in]fdfile descriptor of related scoket
[in]grp_addrASCII representation of the multicast group address
Returns
0 on success; negative otherwise

References sock_get_domain().

◆ osmo_sock_mcast_ttl_set()

int osmo_sock_mcast_ttl_set ( int  fd,
uint8_t  ttl 
)

Set the TTL of outbound multicast packets.

Parameters
[in]fdfile descriptor of related socket
[in]ttlTTL of to-be-sent multicast packets
Returns
0 on success; negative otherwise

References sock_get_domain().

◆ osmo_sock_unix_init()

int osmo_sock_unix_init ( uint16_t  type,
uint8_t  proto,
const char *  socket_path,
unsigned int  flags 
)

Initialize a unix domain socket (including bind/connect)

Parameters
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]socket_pathpath to identify the socket
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket fd on success; negative on error

This function creates a new unix domain socket, type and proto and optionally binds or connects it, depending on the value of flags parameter.

References DLGLOBAL, flags, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_NONBLOCK, osmo_sock_init_tail(), osmo_strlcpy(), proto, and type.

Referenced by osmo_sock_unix_init_ofd().

◆ osmo_sock_unix_init_ofd()

int osmo_sock_unix_init_ofd ( struct osmo_fd ofd,
uint16_t  type,
uint8_t  proto,
const char *  socket_path,
unsigned int  flags 
)

Initialize a unix domain socket and fill osmo_fd.

Parameters
[out]ofdfile descriptor (will be filled in)
[in]typeSocket type like SOCK_DGRAM, SOCK_STREAM
[in]protoProtocol like IPPROTO_TCP, IPPROTO_UDP
[in]socket_pathpath to identify the socket
[in]flagsflags like OSMO_SOCK_F_CONNECT
Returns
socket fd on success; negative on error

This function creates (and optionally binds/connects) a socket using osmo_sock_unix_init, but also fills the ofd structure.

References flags, osmo_fd_init_ofd(), osmo_sock_unix_init(), proto, and type.

◆ osmo_sockaddr_cmp()

int osmo_sockaddr_cmp ( const struct osmo_sockaddr a,
const struct osmo_sockaddr b 
)

Compare two osmo_sockaddr.

Parameters
[in]a
[in]b
Returns
0 if a and b are equal. Otherwise it follows memcmp()

References OSMO_CMP, osmo_sockaddr::sa, osmo_sockaddr::sin, osmo_sockaddr::sin6, and osmo_sockaddr::u.

◆ osmo_sockaddr_in_to_str_and_uint()

size_t osmo_sockaddr_in_to_str_and_uint ( char *  addr,
unsigned int  addr_len,
uint16_t *  port,
const struct sockaddr_in *  sin 
)

Convert sockaddr_in to IP address as char string and port as uint16_t.

Parameters
[out]addrString buffer to write IP address to, or NULL.
[out]addr_lenSize of addr.
[out]portPointer to uint16_t to write the port number to, or NULL.
[in]sinSockaddr to convert.
Returns
the required string buffer size, like osmo_strlcpy(), or 0 if addr is NULL.

References osmo_strlcpy().

Referenced by osmo_sockaddr_to_str_and_uint().

◆ osmo_sockaddr_is_local()

int osmo_sockaddr_is_local ( struct sockaddr *  addr,
unsigned int  addrlen 
)

Determine if the given address is a local address.

Parameters
[in]addrSocket Address
[in]addrlenLength of socket address in bytes
Returns
1 if address is local, 0 otherwise.

References DLGLOBAL, LOGL_ERROR, LOGP, and sockaddr_equal().

Referenced by gsmtap_source_add_sink_fd().

◆ osmo_sockaddr_local_ip()

int osmo_sockaddr_local_ip ( struct osmo_sockaddr local_ip,
const struct osmo_sockaddr remote_ip 
)

Determine the matching local address for a given remote address.

Parameters
[out]local_ipcaller provided memory for resulting local address
[in]remote_ipremote address
Returns
0 on success; negative otherwise

References OSMO_SOCK_F_CONNECT, and osmo_sock_init_osa().

◆ osmo_sockaddr_ntop()

const char * osmo_sockaddr_ntop ( const struct sockaddr *  sa,
char *  dst 
)

inet_ntop() wrapper for a struct sockaddr.

Parameters
[in]sasource sockaddr to get the address from.
[out]dststring buffer of at least INET6_ADDRSTRLEN size.
Returns
returns a non-null pointer to dst. NULL is returned if there was an error, with errno set to indicate the error.

References osmo_sockaddr::sa, osmo_sockaddr::sin, osmo_sockaddr::sin6, and osmo_sockaddr::u.

◆ osmo_sockaddr_port()

uint16_t osmo_sockaddr_port ( const struct sockaddr *  sa)

Get sockaddr port content (in host byte order)

Parameters
[in]sasource sockaddr to get the port from.
Returns
returns the sockaddr port in host byte order

References osmo_sockaddr::sa, osmo_sockaddr::sin, osmo_sockaddr::sin6, and osmo_sockaddr::u.

◆ osmo_sockaddr_to_str()

const char * osmo_sockaddr_to_str ( const struct osmo_sockaddr sockaddr)

string-format a given osmo_sockaddr address

Parameters
[in]sockaddrthe osmo_sockaddr to print
Returns
pointer to the string on success; NULL on error

References osmo_sockaddr_to_str_buf().

◆ osmo_sockaddr_to_str_and_uint()

unsigned int osmo_sockaddr_to_str_and_uint ( char *  addr,
unsigned int  addr_len,
uint16_t *  port,
const struct sockaddr *  sa 
)

Convert sockaddr to IP address as char string and port as uint16_t.

Parameters
[out]addrString buffer to write IP address to, or NULL.
[out]addr_lenSize of addr.
[out]portPointer to uint16_t to write the port number to, or NULL.
[in]saSockaddr to convert.
Returns
the required string buffer size, like osmo_strlcpy(), or 0 if addr is NULL.

References osmo_sockaddr_in_to_str_and_uint().

Referenced by osmo_sockaddr_to_str_buf().

◆ osmo_sockaddr_to_str_buf()

char * osmo_sockaddr_to_str_buf ( char *  buf,
size_t  buf_len,
const struct osmo_sockaddr sockaddr 
)

string-format a given osmo_sockaddr address into a user-supplied buffer

Parameters
[in]bufuser-supplied output buffer
[in]buf_lensize of the user-supplied output buffer in bytes
[in]sockaddrthe osmo_sockaddr to print
Returns
pointer to the string on success; NULL on error

References osmo_sockaddr_to_str_and_uint(), osmo_sockaddr::sa, and osmo_sockaddr::u.

Referenced by osmo_sockaddr_to_str().

◆ sock_get_domain()

static int sock_get_domain ( int  fd)
static

◆ sockaddr_equal()

static int sockaddr_equal ( const struct sockaddr *  a,
const struct sockaddr *  b,
unsigned int  len 
)
static

Referenced by osmo_sockaddr_is_local().

◆ socket_helper()

static int socket_helper ( const struct addrinfo *  rp,
unsigned int  flags 
)
static

◆ socket_helper_multiaddr()

static int socket_helper_multiaddr ( uint16_t  family,
uint16_t  type,
uint8_t  proto,
unsigned int  flags 
)
static

◆ socket_helper_osa()

static int socket_helper_osa ( const struct osmo_sockaddr addr,
uint16_t  type,
uint8_t  proto,
unsigned int  flags 
)
static
osmo_sockaddr_str_from_sockaddr
int osmo_sockaddr_str_from_sockaddr(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_storage *src)