libosmocore  1.0.1
Osmocom core library
Socket convenience functions

Osmocom socket convenience functions. More...

Files

file  socket.h
 Osmocom socket convenience functions.
 
file  socket.c
 

Macros

#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_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...
 

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_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_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...
 
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 (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...
 
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_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...
 
static struct addrinfo * addrinfo_helper (uint16_t family, uint16_t type, uint8_t proto, const char *host, uint16_t port, bool passive)
 
static int socket_helper (const struct addrinfo *rp, unsigned int flags)
 
static int osmo_sock_init_tail (int fd, uint16_t type, unsigned int flags)
 
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

◆ OSMO_SOCK_F_BIND

#define OSMO_SOCK_F_BIND   (1 << 1)

bind the socket to a local address/port

Referenced by gsmtap_source_add_sink_fd(), osmo_sock_init(), osmo_sock_init2(), osmo_sock_init_tail(), and osmo_sock_unix_init().

◆ OSMO_SOCK_F_CONNECT

#define OSMO_SOCK_F_CONNECT   (1 << 0)

◆ OSMO_SOCK_F_NO_MCAST_ALL

#define OSMO_SOCK_F_NO_MCAST_ALL   (1 << 4)

disable receiving all multiast even for non-subscribed groups

Referenced by osmo_sock_init_tail().

◆ OSMO_SOCK_F_NO_MCAST_LOOP

#define OSMO_SOCK_F_NO_MCAST_LOOP   (1 << 3)

disable multiast loop (IP_MULTICAST_LOOP)

Referenced by osmo_sock_init_tail().

◆ OSMO_SOCK_F_NONBLOCK

#define OSMO_SOCK_F_NONBLOCK   (1 << 2)

switch socket to non-blocking mode

Referenced by osmo_sock_unix_init(), and socket_helper().

◆ OSMO_SOCK_F_UDP_REUSEADDR

#define OSMO_SOCK_F_UDP_REUSEADDR   (1 << 5)

use SO_REUSEADDR on UDP ports (required for multicast)

Referenced by gsmtap_source_add_sink_fd(), osmo_sock_init(), and osmo_sock_init2().

◆ 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")

Referenced by osmo_sock_get_name(), and osmo_sock_get_name2().

Function Documentation

◆ 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

References DLGLOBAL, LOGL_ERROR, LOGP, and type.

Referenced by osmo_sock_init(), and osmo_sock_init2().

◆ 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 BSC_FD_READ, osmo_fd::fd, osmo_fd_register(), and osmo_fd::when.

Referenced by osmo_sock_init2_ofd(), osmo_sock_init_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

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 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 osmo_sock_get_ip_and_port().

◆ osmo_sock_get_name()

char * osmo_sock_get_name ( 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_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().

Referenced by osmo_sock_get_name(), and osmo_sock_get_name2().

◆ 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 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 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, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_UDP_REUSEADDR, osmo_sock_init_tail(), and socket_helper().

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 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, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_UDP_REUSEADDR, osmo_sock_init_tail(), and socket_helper().

Referenced by osmo_sock_init2_ofd(), and osmo_sock_local_ip().

◆ 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 osmo_fd_init_ofd(), and osmo_sock_init2().

◆ 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 osmo_fd_init_ofd(), and osmo_sock_init().

◆ 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, LOGL_ERROR, LOGP, and osmo_sock_init().

Referenced by gsmtap_source_add_sink_fd().

◆ osmo_sock_init_tail()

static int osmo_sock_init_tail ( int  fd,
uint16_t  type,
unsigned int  flags 
)
static

◆ 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
[in]fdfile descriptor of related scoket
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_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, LOGL_ERROR, LOGP, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, OSMO_SOCK_F_NONBLOCK, osmo_sock_init_tail(), and osmo_strlcpy().

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 optionall binds/connects) a socket using osmo_sock_unix_init, but also fills the ofd structure.

References osmo_fd_init_ofd(), and osmo_sock_unix_init().

◆ 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_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().

◆ 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