libosmo-netif  1.4.0.19-26cd.202401052026
Osmocom network interface library
Osmocom Stream Socket

Files

file  stream.c
 Osmocom stream socket helpers.
 
file  stream_cli.c
 Osmocom stream socket helpers (client side)
 
file  stream_srv.c
 Osmocom stream socket helpers (server side)
 

Data Structures

struct  osmo_stream_cli
 
struct  osmo_stream_srv_link
 
struct  osmo_stream_srv
 

Macros

#define OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION   0x80 /* sctp_recvmsg() flags=MSG_NOTIFICATION, msgb_data() contains "union sctp_notification*" */
 Access SCTP flags from the msgb control buffer.
 
#define msgb_sctp_msg_flags(msg)   (msg)->cb[2]
 
#define msgb_sctp_ppid(msg)   (msg)->cb[3]
 Access the SCTP PPID from the msgb control buffer.
 
#define msgb_sctp_stream(msg)   (msg)->cb[4]
 Access the SCTP Stream ID from the msgb control buffer.
 
#define LOGSCLI(cli, level, fmt, args...)
 
#define OSMO_STREAM_CLI_F_RECONF   (1 << 0)
 
#define OSMO_STREAM_CLI_F_NODELAY   (1 << 1)
 
#define LOGSLNK(link, level, fmt, args...)
 
#define LOGSSRV(srv, level, fmt, args...)
 
#define OSMO_STREAM_SRV_F_RECONF   (1 << 0)
 
#define OSMO_STREAM_SRV_F_NODELAY   (1 << 1)
 
#define OSMO_STREAM_SRV_F_FLUSH_DESTROY   (1 << 0)
 

Enumerations

enum  osmo_stream_srv_link_param { OSMO_STREAM_SRV_LINK_PAR_SCTP_SOCKOPT_AUTH_SUPPORTED , OSMO_STREAM_SRV_LINK_PAR_SCTP_SOCKOPT_ASCONF_SUPPORTED , OSMO_STREAM_SRV_LINK_PAR_SCTP_INIT_NUM_OSTREAMS , OSMO_STREAM_SRV_LINK_PAR_SCTP_INIT_MAX_INSTREAMS }
 
enum  osmo_stream_cli_param {
  OSMO_STREAM_CLI_PAR_SCTP_SOCKOPT_AUTH_SUPPORTED , OSMO_STREAM_CLI_PAR_SCTP_SOCKOPT_ASCONF_SUPPORTED , OSMO_STREAM_CLI_PAR_SCTP_INIT_NUM_OSTREAMS , OSMO_STREAM_CLI_PAR_SCTP_INIT_MAX_INSTREAMS ,
  OSMO_STREAM_CLI_PAR_SCTP_INIT_MAX_ATTEMPTS , OSMO_STREAM_CLI_PAR_SCTP_INIT_TIMEOUT
}
 
enum  osmo_stream_mode { OSMO_STREAM_MODE_UNKNOWN , OSMO_STREAM_MODE_OSMO_FD , OSMO_STREAM_MODE_OSMO_IO }
 
enum  osmo_stream_cli_state {
  STREAM_CLI_STATE_CLOSED , STREAM_CLI_STATE_WAIT_RECONNECT , STREAM_CLI_STATE_CONNECTING , STREAM_CLI_STATE_CONNECTED ,
  STREAM_CLI_STATE_MAX
}
 

Functions

struct osmo_stream_srv_linkosmo_stream_srv_link_create (void *ctx)
 Create an Osmocom Stream Server Link A Stream Server Link is the listen()+accept() "parent" to individual Stream Servers. More...
 
void osmo_stream_srv_link_destroy (struct osmo_stream_srv_link *link)
 Destroy the stream server link. Closes + Releases Memory. More...
 
void osmo_stream_srv_link_set_name (struct osmo_stream_srv_link *link, const char *name)
 Set a name on the srv_link object (used during logging) More...
 
void osmo_stream_srv_link_set_nodelay (struct osmo_stream_srv_link *link, bool nodelay)
 Set the NODELAY socket option to avoid Nagle-like behavior Setting this to nodelay=true will automatically set the NODELAY socket option on any socket established via this server link, before calling the accept_cb() More...
 
void osmo_stream_srv_link_set_addr (struct osmo_stream_srv_link *link, const char *addr)
 Set the local address to which we bind. More...
 
int osmo_stream_srv_link_set_addrs (struct osmo_stream_srv_link *link, const char **addr, size_t addrcnt)
 Set the local address set to which we bind. Useful for protocols allowing bind on more than one address (such as SCTP) More...
 
void osmo_stream_srv_link_set_port (struct osmo_stream_srv_link *link, uint16_t port)
 Set the local port number to which we bind. More...
 
void osmo_stream_srv_link_set_proto (struct osmo_stream_srv_link *link, uint16_t proto)
 Set the protocol for the stream server link. More...
 
int osmo_stream_srv_link_set_type (struct osmo_stream_srv_link *link, int type)
 Set the socket type for the stream server link. More...
 
int osmo_stream_srv_link_set_domain (struct osmo_stream_srv_link *link, int domain)
 Set the socket type for the stream server link. More...
 
void osmo_stream_srv_link_set_accept_cb (struct osmo_stream_srv_link *link, int(*accept_cb)(struct osmo_stream_srv_link *link, int fd))
 Set the accept() call-back of the stream server link. More...
 
void osmo_stream_srv_link_set_data (struct osmo_stream_srv_link *link, void *data)
 Set application private data of the stream server link. More...
 
void * osmo_stream_srv_link_get_data (struct osmo_stream_srv_link *link)
 Get application private data of the stream server link. More...
 
char * osmo_stream_srv_link_get_sockname (const struct osmo_stream_srv_link *link)
 Get description of the stream server link e. g. 127.0.0.1:1234. More...
 
struct osmo_fd * osmo_stream_srv_link_get_ofd (struct osmo_stream_srv_link *link)
 Get Osmocom File Descriptor of the stream server link. More...
 
int osmo_stream_srv_link_get_fd (const struct osmo_stream_srv_link *link)
 Get File Descriptor of the stream server link. More...
 
bool osmo_stream_srv_link_is_opened (const struct osmo_stream_srv_link *link)
 Check whether the stream server link is opened. More...
 
int osmo_stream_srv_link_open (struct osmo_stream_srv_link *link)
 Open the stream server link. This actually initializes the underlying socket and binds it to the configured ip/port. More...
 
void osmo_stream_srv_link_close (struct osmo_stream_srv_link *link)
 Close the stream server link and unregister from select loop Does not destroy the server link, merely closes it! More...
 
int osmo_stream_srv_link_set_param (struct osmo_stream_srv_link *link, enum osmo_stream_srv_link_param par, void *val, size_t val_len)
 
struct osmo_stream_srvosmo_stream_srv_create (void *ctx, struct osmo_stream_srv_link *link, int fd, int(*read_cb)(struct osmo_stream_srv *conn), int(*closed_cb)(struct osmo_stream_srv *conn), void *data)
 Create a Stream Server inside the specified link. More...
 
struct osmo_stream_srvosmo_stream_srv_create2 (void *ctx, struct osmo_stream_srv_link *link, int fd, void *data)
 Create a Stream Server inside the specified link. More...
 
void osmo_stream_srv_set_name (struct osmo_stream_srv *conn, const char *name)
 Set a name on the srv object (used during logging) More...
 
void osmo_stream_srv_set_read_cb (struct osmo_stream_srv *conn, int(*read_cb)(struct osmo_stream_srv *conn, struct msgb *msg))
 Set the call-back function when data was read from the stream server socket Only for osmo_stream_srv created with osmo_stream_srv_create2() More...
 
void osmo_stream_srv_set_closed_cb (struct osmo_stream_srv *conn, int(*closed_cb)(struct osmo_stream_srv *conn))
 Set the call-back function called when the stream server socket was closed. More...
 
void * osmo_stream_srv_get_data (struct osmo_stream_srv *conn)
 Get application private data of the stream server. More...
 
struct osmo_stream_srv_linkosmo_stream_srv_get_master (struct osmo_stream_srv *conn)
 Get the master (Link) from a Stream Server. More...
 
const char * osmo_stream_srv_get_sockname (const struct osmo_stream_srv *conn)
 Get the stream server socket description. More...
 
struct osmo_fd * osmo_stream_srv_get_ofd (struct osmo_stream_srv *conn)
 Get Osmocom File Descriptor of the stream server. More...
 
int osmo_stream_srv_get_fd (const struct osmo_stream_srv *conn)
 Get File Descriptor of the stream server. More...
 
void osmo_stream_srv_destroy (struct osmo_stream_srv *conn)
 Destroy given Stream Server This function closes the Stream Server socket, unregisters from select loop, invokes the connection's closed_cb() callback to allow API users to clean up any associated state they have for this connection, and then de-allocates associated memory. More...
 
void osmo_stream_srv_set_flush_and_destroy (struct osmo_stream_srv *conn)
 Prepare to send out all pending messages on the connection's Tx queue and then automatically destroy the stream with osmo_stream_srv_destroy(). This function disables queuing of new messages on the connection and also disables reception of new messages on the connection. More...
 
void osmo_stream_srv_set_data (struct osmo_stream_srv *conn, void *data)
 Set application private data of the stream server. More...
 
void osmo_stream_srv_set_segmentation_cb (struct osmo_stream_srv *conn, int(*segmentation_cb)(struct msgb *msg))
 Set the segmentation callback for target osmo_stream_srv structure. The connection has to have been established prior to calling this function. More...
 
void osmo_stream_srv_send (struct osmo_stream_srv *conn, struct msgb *msg)
 Enqueue data to be sent via an Osmocom stream server. More...
 
int osmo_stream_srv_recv (struct osmo_stream_srv *conn, struct msgb *msg)
 Receive data via Osmocom stream server. More...
 
void osmo_stream_srv_clear_tx_queue (struct osmo_stream_srv *conn)
 
void osmo_stream_cli_set_name (struct osmo_stream_cli *cli, const char *name)
 Set a name on the cli object (used during logging) More...
 
void osmo_stream_cli_set_nodelay (struct osmo_stream_cli *cli, bool nodelay)
 Set the NODELAY socket option to avoid Nagle-like behavior Setting this to nodelay=true will automatically set the NODELAY socket option on any socket established via osmo_stream_cli_open or any re-connect. You have to set this before opening the socket. More...
 
void osmo_stream_cli_set_addr (struct osmo_stream_cli *cli, const char *addr)
 Set the remote address to which we connect. More...
 
int osmo_stream_cli_set_addrs (struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)
 Set the remote address set to which we connect. Useful for protocols allowing connecting to more than one address (such as SCTP) More...
 
void osmo_stream_cli_set_port (struct osmo_stream_cli *cli, uint16_t port)
 Set the remote port number to which we connect. More...
 
int osmo_stream_cli_set_type (struct osmo_stream_cli *cli, int type)
 Set the socket type for the stream server link. More...
 
int osmo_stream_cli_set_domain (struct osmo_stream_cli *cli, int domain)
 Set the socket type for the stream server link. More...
 
void osmo_stream_cli_set_proto (struct osmo_stream_cli *cli, uint16_t proto)
 Set the protocol for the stream client socket. More...
 
void osmo_stream_cli_set_local_addr (struct osmo_stream_cli *cli, const char *addr)
 Set the local address for the socket (to be bound to) More...
 
int osmo_stream_cli_set_local_addrs (struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)
 Set the local address set to which we connect. Useful for protocols allowing bind to more than one address (such as SCTP) More...
 
void osmo_stream_cli_set_local_port (struct osmo_stream_cli *cli, uint16_t port)
 Set the local port number for the socket (to be bound to) More...
 
void osmo_stream_cli_set_data (struct osmo_stream_cli *cli, void *data)
 Set application private data of the stream client socket. More...
 
void osmo_stream_cli_set_reconnect_timeout (struct osmo_stream_cli *cli, int timeout)
 Set the reconnect time of the stream client socket. More...
 
void * osmo_stream_cli_get_data (struct osmo_stream_cli *cli)
 Get application private data of the stream client socket. More...
 
char * osmo_stream_cli_get_sockname (const struct osmo_stream_cli *cli)
 Get the stream client socket description. More...
 
struct osmo_fd * osmo_stream_cli_get_ofd (struct osmo_stream_cli *cli)
 Get Osmocom File Descriptor of the stream client socket. More...
 
int osmo_stream_cli_get_fd (const struct osmo_stream_cli *cli)
 Get file descriptor of the stream client socket. More...
 
void osmo_stream_cli_set_connect_cb (struct osmo_stream_cli *cli, int(*connect_cb)(struct osmo_stream_cli *cli))
 Set the call-back function called on connect of the stream client socket. More...
 
void osmo_stream_cli_set_disconnect_cb (struct osmo_stream_cli *cli, int(*disconnect_cb)(struct osmo_stream_cli *cli))
 Set the call-back function called on disconnect of the stream client socket. More...
 
void osmo_stream_cli_set_read_cb (struct osmo_stream_cli *cli, int(*read_cb)(struct osmo_stream_cli *cli))
 Set the call-back function called to read from the stream client socket This function will configure osmo_stream_cli to use osmo_ofd internally. More...
 
void osmo_stream_cli_set_read_cb2 (struct osmo_stream_cli *cli, int(*read_cb)(struct osmo_stream_cli *cli, struct msgb *msg))
 Set the call-back function called to read from the stream client socket This function will configure osmo_stream_cli to use osmo_iofd internally. More...
 
void osmo_stream_cli_set_segmentation_cb (struct osmo_stream_cli *cli, int(*segmentation_cb)(struct msgb *msg))
 Set the segmentation callback for the client. More...
 
void osmo_stream_cli_reconnect (struct osmo_stream_cli *cli)
 Re-connect an Osmocom Stream Client If re-connection is enabled for this client (which is the case unless negative timeout was explicitly set via osmo_stream_cli_set_reconnect_timeout() call), we close any existing connection (if any) and schedule a re-connect timer.
 
bool osmo_stream_cli_is_connected (struct osmo_stream_cli *cli)
 Check if Osmocom Stream Client is in connected state. More...
 
struct osmo_stream_cliosmo_stream_cli_create (void *ctx)
 Create an Osmocom stream client. More...
 
void osmo_stream_cli_destroy (struct osmo_stream_cli *cli)
 Destroy a Osmocom stream client (includes close) More...
 
int osmo_stream_cli_open (struct osmo_stream_cli *cli)
 Open connection of an Osmocom stream client By default the client will automatically reconnect after default timeout. To disable this, use osmo_stream_cli_set_reconnect_timeout() before calling this function. More...
 
int osmo_stream_cli_open2 (struct osmo_stream_cli *cli, int reconnect)
 DEPRECATED: use osmo_stream_cli_set_reconnect_timeout() or osmo_stream_cli_reconnect() instead! Open connection of an Osmocom stream client. More...
 
void osmo_stream_cli_close (struct osmo_stream_cli *cli)
 Close an Osmocom Stream Client. More...
 
void osmo_stream_cli_send (struct osmo_stream_cli *cli, struct msgb *msg)
 Enqueue data to be sent via an Osmocom stream client. More...
 
int osmo_stream_cli_recv (struct osmo_stream_cli *cli, struct msgb *msg)
 Receive data via an Osmocom stream client. More...
 
void osmo_stream_cli_clear_tx_queue (struct osmo_stream_cli *cli)
 
int osmo_stream_cli_set_param (struct osmo_stream_cli *cli, enum osmo_stream_cli_param par, void *val, size_t val_len)
 
int stream_sctp_sock_activate_events (int fd)
 
int stream_setsockopt_nodelay (int fd, int proto, int on)
 
int stream_sctp_recvmsg_wrapper (int fd, struct msgb *msg, const char *log_pfx)
 
static void osmo_stream_cli_close_iofd (struct osmo_stream_cli *cli)
 
static void osmo_stream_cli_close_ofd (struct osmo_stream_cli *cli)
 
static void osmo_stream_cli_read (struct osmo_stream_cli *cli)
 
static int osmo_stream_cli_write (struct osmo_stream_cli *cli)
 
static int _setsockopt_nosigpipe (struct osmo_stream_cli *cli)
 
static void stream_cli_handle_connecting (struct osmo_stream_cli *cli, int res)
 
static int osmo_stream_cli_fd_cb (struct osmo_fd *ofd, unsigned int what)
 
static void cli_timer_cb (void *data)
 
static void stream_cli_iofd_read_cb (struct osmo_io_fd *iofd, int res, struct msgb *msg)
 
static void stream_cli_iofd_write_cb (struct osmo_io_fd *iofd, int res, struct msgb *msg)
 
static void configure_cli_segmentation_cb (struct osmo_io_fd *iofd, int(*segmentation_cb)(struct msgb *msg))
 
static int _setsockopt_nosigpipe (struct osmo_stream_srv_link *link, int new_fd)
 
static int osmo_stream_srv_link_ofd_cb (struct osmo_fd *ofd, unsigned int what)
 
static char * get_local_sockname_buf (char *buf, size_t buf_len, int fd, int proto)
 
static void stream_srv_iofd_read_cb (struct osmo_io_fd *iofd, int res, struct msgb *msg)
 
static void stream_srv_iofd_write_cb (struct osmo_io_fd *iofd, int res, struct msgb *msg)
 
static int osmo_stream_srv_read (struct osmo_stream_srv *conn)
 
static void osmo_stream_srv_write (struct osmo_stream_srv *conn)
 
static int osmo_stream_srv_cb (struct osmo_fd *ofd, unsigned int what)
 

Variables

static const struct value_string stream_cli_state_names []
 
static struct osmo_io_ops osmo_stream_cli_ioops
 
static struct osmo_io_ops srv_ioops
 

Detailed Description

This code is intended to abstract any use of stream-type sockets, such as TCP and SCTP. It offers both server and client side implementations, fully integrated with the libosmocore select loop abstraction.

This code is intended to abstract any use of stream-type sockets, such as TCP and SCTP. It offers client side implementation, fully integrated with the libosmocore select loop abstraction.

This code is intended to abstract any use of stream-type sockets, such as TCP and SCTP. It offers server side implementation, fully integrated with the libosmocore select loop abstraction.

Macro Definition Documentation

◆ LOGSCLI

#define LOGSCLI (   cli,
  level,
  fmt,
  args... 
)
Value:
LOGP(DLINP, level, "CLICONN(%s,%s){%s} " fmt, \
cli->name ? : "", \
cli->sockname, \
get_value_string(stream_cli_state_names, (cli)->state), \
## args)

◆ LOGSLNK

#define LOGSLNK (   link,
  level,
  fmt,
  args... 
)
Value:
LOGP(DLINP, level, "SRV(%s,%s) " fmt, \
link->name ? : "", \
link->sockname, \
## args)

◆ LOGSSRV

#define LOGSSRV (   srv,
  level,
  fmt,
  args... 
)
Value:
LOGP(DLINP, level, "SRVCONN(%s,%s) " fmt, \
srv->name ? : "", \
srv->sockname, \
## args)

Function Documentation

◆ osmo_stream_cli_close()

void osmo_stream_cli_close ( struct osmo_stream_cli cli)

Close an Osmocom Stream Client.

Parameters
[in]cliOsmocom Stream Client to be closed We unregister the socket fd from the osmocom select() loop abstraction and close the socket

Referenced by osmo_stream_cli_destroy(), and osmo_stream_cli_reconnect().

◆ osmo_stream_cli_create()

struct osmo_stream_cli * osmo_stream_cli_create ( void *  ctx)

Create an Osmocom stream client.

Parameters
[in]ctxtalloc context from which to allocate memory This function allocates a new osmo_stream_cli and initializes it with default values (5s reconnect timer, TCP protocol)
Returns
allocated stream client, or NULL in case of error

◆ osmo_stream_cli_destroy()

void osmo_stream_cli_destroy ( struct osmo_stream_cli cli)

Destroy a Osmocom stream client (includes close)

Parameters
[in]cliStream Client to destroy

References osmo_stream_cli_close().

◆ osmo_stream_cli_get_data()

void * osmo_stream_cli_get_data ( struct osmo_stream_cli cli)

Get application private data of the stream client socket.

Parameters
[in]cliStream Client to modify
Returns
Application private data, as set by osmo_stream_cli_set_data()

◆ osmo_stream_cli_get_fd()

int osmo_stream_cli_get_fd ( const struct osmo_stream_cli cli)

Get file descriptor of the stream client socket.

Parameters
[in]cliStream Client of which we want to obtain the file descriptor
Returns
File descriptor or negative in case of error

Referenced by osmo_stream_cli_get_sockname().

◆ osmo_stream_cli_get_ofd()

struct osmo_fd * osmo_stream_cli_get_ofd ( struct osmo_stream_cli cli)

Get Osmocom File Descriptor of the stream client socket.

Parameters
[in]cliStream Client to modify
Returns
Pointer to osmo_fd

◆ osmo_stream_cli_get_sockname()

char * osmo_stream_cli_get_sockname ( const struct osmo_stream_cli cli)

Get the stream client socket description.

Parameters
[in]cliStream Client to examine
Returns
Socket description or NULL in case of error

References osmo_stream_cli_get_fd().

◆ osmo_stream_cli_is_connected()

bool osmo_stream_cli_is_connected ( struct osmo_stream_cli cli)

Check if Osmocom Stream Client is in connected state.

Parameters
[in]cliOsmocom Stream Client
Returns
true if connected, false otherwise

◆ osmo_stream_cli_open()

int osmo_stream_cli_open ( struct osmo_stream_cli cli)

Open connection of an Osmocom stream client By default the client will automatically reconnect after default timeout. To disable this, use osmo_stream_cli_set_reconnect_timeout() before calling this function.

Parameters
[in]cliStream Client to connect
Returns
negative on error, 0 on success

◆ osmo_stream_cli_open2()

int osmo_stream_cli_open2 ( struct osmo_stream_cli cli,
int  reconnect 
)

DEPRECATED: use osmo_stream_cli_set_reconnect_timeout() or osmo_stream_cli_reconnect() instead! Open connection of an Osmocom stream client.

Parameters
[in]cliStream Client to connect
[in]reconect1 if we should not automatically reconnect
Returns
negative on error, 0 on success

◆ osmo_stream_cli_recv()

int osmo_stream_cli_recv ( struct osmo_stream_cli cli,
struct msgb *  msg 
)

Receive data via an Osmocom stream client.

Parameters
[in]cliStream Client through which we want to send
msgpre-allocate message buffer to which received data is appended
Returns
number of bytes read; <=0 in case of error

If conn is an SCTP connection, additional specific considerations shall be taken:

  • msg->cb is always filled with SCTP ppid, and SCTP stream values, see msgb_sctp_*() APIs.
  • If an SCTP notification was received when reading from the SCTP socket, msgb_sctp_msg_flags(msg) will contain bit flag OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION set, and the msgb will contain a "union sctp_notification" instead of user data. In this case the return code will be either 0 (if conn is considered dead after the notification) or -EAGAIN (if conn is considered still alive after the notification) resembling the standard recv() API.

◆ osmo_stream_cli_send()

void osmo_stream_cli_send ( struct osmo_stream_cli cli,
struct msgb *  msg 
)

Enqueue data to be sent via an Osmocom stream client.

Parameters
[in]cliStream Client through which we want to send
[in]msgMessage buffer to enqueue in transmit queue

◆ osmo_stream_cli_set_addr()

void osmo_stream_cli_set_addr ( struct osmo_stream_cli cli,
const char *  addr 
)

Set the remote address to which we connect.

Parameters
[in]cliStream Client to modify
[in]addrRemote IP address

References osmo_stream_cli_set_addrs().

◆ osmo_stream_cli_set_addrs()

int osmo_stream_cli_set_addrs ( struct osmo_stream_cli cli,
const char **  addr,
size_t  addrcnt 
)

Set the remote address set to which we connect. Useful for protocols allowing connecting to more than one address (such as SCTP)

Parameters
[in]cliStream Client to modify
[in]addrRemote IP address set
Returns
negative on error, 0 on success

Referenced by osmo_stream_cli_set_addr().

◆ osmo_stream_cli_set_connect_cb()

void osmo_stream_cli_set_connect_cb ( struct osmo_stream_cli cli,
int(*)(struct osmo_stream_cli *cli)  connect_cb 
)

Set the call-back function called on connect of the stream client socket.

Parameters
[in]cliStream Client to modify
[in]connect_cbCall-back function to be called upon connect

◆ osmo_stream_cli_set_data()

void osmo_stream_cli_set_data ( struct osmo_stream_cli cli,
void *  data 
)

Set application private data of the stream client socket.

Parameters
[in]cliStream Client to modify
[in]dataUser-specific data (available in call-back functions)

◆ osmo_stream_cli_set_disconnect_cb()

void osmo_stream_cli_set_disconnect_cb ( struct osmo_stream_cli cli,
int(*)(struct osmo_stream_cli *cli)  disconnect_cb 
)

Set the call-back function called on disconnect of the stream client socket.

Parameters
[in]cliStream Client to modify
[in]disconnect_cbCall-back function to be called upon disconnect

◆ osmo_stream_cli_set_domain()

int osmo_stream_cli_set_domain ( struct osmo_stream_cli cli,
int  domain 
)

Set the socket type for the stream server link.

Parameters
[in]cliStream Client to modify
[in]typeSocket Domain (like AF_UNSPEC (default for IP), AF_UNIX, AF_INET, ...)
Returns
zero on success, negative on error.

◆ osmo_stream_cli_set_local_addr()

void osmo_stream_cli_set_local_addr ( struct osmo_stream_cli cli,
const char *  addr 
)

Set the local address for the socket (to be bound to)

Parameters
[in]cliStream Client to modify
[in]portLocal host name

References osmo_stream_cli_set_local_addrs().

◆ osmo_stream_cli_set_local_addrs()

int osmo_stream_cli_set_local_addrs ( struct osmo_stream_cli cli,
const char **  addr,
size_t  addrcnt 
)

Set the local address set to which we connect. Useful for protocols allowing bind to more than one address (such as SCTP)

Parameters
[in]cliStream Client to modify
[in]addrLocal IP address set
Returns
negative on error, 0 on success

Referenced by osmo_stream_cli_set_local_addr().

◆ osmo_stream_cli_set_local_port()

void osmo_stream_cli_set_local_port ( struct osmo_stream_cli cli,
uint16_t  port 
)

Set the local port number for the socket (to be bound to)

Parameters
[in]cliStream Client to modify
[in]portLocal port number

◆ osmo_stream_cli_set_name()

void osmo_stream_cli_set_name ( struct osmo_stream_cli cli,
const char *  name 
)

Set a name on the cli object (used during logging)

Parameters
[in]clistream_cli whose name is to be set
[in]namethe name to be set on cli

◆ osmo_stream_cli_set_nodelay()

void osmo_stream_cli_set_nodelay ( struct osmo_stream_cli cli,
bool  nodelay 
)

Set the NODELAY socket option to avoid Nagle-like behavior Setting this to nodelay=true will automatically set the NODELAY socket option on any socket established via osmo_stream_cli_open or any re-connect. You have to set this before opening the socket.

Parameters
[in]cliStream client whose sockets are to be configured
[in]nodelaywhether to set (true) NODELAY before connect()

◆ osmo_stream_cli_set_port()

void osmo_stream_cli_set_port ( struct osmo_stream_cli cli,
uint16_t  port 
)

Set the remote port number to which we connect.

Parameters
[in]cliStream Client to modify
[in]portRemote port number

◆ osmo_stream_cli_set_proto()

void osmo_stream_cli_set_proto ( struct osmo_stream_cli cli,
uint16_t  proto 
)

Set the protocol for the stream client socket.

Parameters
[in]cliStream Client to modify
[in]protoProtocol (like IPPROTO_TCP (default), IPPROTO_SCTP, ...)

◆ osmo_stream_cli_set_read_cb()

void osmo_stream_cli_set_read_cb ( struct osmo_stream_cli cli,
int(*)(struct osmo_stream_cli *cli)  read_cb 
)

Set the call-back function called to read from the stream client socket This function will configure osmo_stream_cli to use osmo_ofd internally.

Parameters
[in]cliStream Client to modify
[in]read_cbCall-back function to be called when we want to read

◆ osmo_stream_cli_set_read_cb2()

void osmo_stream_cli_set_read_cb2 ( struct osmo_stream_cli cli,
int(*)(struct osmo_stream_cli *cli, struct msgb *msg)  read_cb 
)

Set the call-back function called to read from the stream client socket This function will configure osmo_stream_cli to use osmo_iofd internally.

Parameters
[in]cliStream Client to modify
[in]read_cbCall-back function to be called when data was read from the socket

◆ osmo_stream_cli_set_reconnect_timeout()

void osmo_stream_cli_set_reconnect_timeout ( struct osmo_stream_cli cli,
int  timeout 
)

Set the reconnect time of the stream client socket.

Parameters
[in]cliStream Client to modify
[in]timeoutRe-connect timeout in seconds or negative value to disable auto-reconnection

◆ osmo_stream_cli_set_segmentation_cb()

void osmo_stream_cli_set_segmentation_cb ( struct osmo_stream_cli cli,
int(*)(struct msgb *msg)  segmentation_cb 
)

Set the segmentation callback for the client.

Parameters
[in,out]cliStream Client to modify
[in]segmentation_cbTarget segmentation callback

◆ osmo_stream_cli_set_type()

int osmo_stream_cli_set_type ( struct osmo_stream_cli cli,
int  type 
)

Set the socket type for the stream server link.

Parameters
[in]cliStream Client to modify
[in]typeSocket Type (like SOCK_STREAM (default), SOCK_SEQPACKET, ...)
Returns
zero on success, negative on error.

◆ osmo_stream_srv_create()

struct osmo_stream_srv * osmo_stream_srv_create ( void *  ctx,
struct osmo_stream_srv_link link,
int  fd,
int(*)(struct osmo_stream_srv *conn)  read_cb,
int(*)(struct osmo_stream_srv *conn)  closed_cb,
void *  data 
)

Create a Stream Server inside the specified link.

Parameters
[in]ctxtalloc allocation context from which to allocate
[in]linkStream Server Link to which we belong
[in]fdsystem file descriptor of the new connection
[in]read_cbCall-back to call when the socket is readable
[in]closed_cbCall-back to call when the connection is closed
[in]dataUser data to save in the new Stream Server struct
Returns
Stream Server in case of success; NULL on error

◆ osmo_stream_srv_create2()

struct osmo_stream_srv * osmo_stream_srv_create2 ( void *  ctx,
struct osmo_stream_srv_link link,
int  fd,
void *  data 
)

Create a Stream Server inside the specified link.

Parameters
[in]ctxtalloc allocation context from which to allocate
[in]linkStream Server Link to which we belong
[in]fdsystem file descriptor of the new connection
[in]dataUser data to save in the new Stream Server struct
Returns
Stream Server in case of success; NULL on error

◆ osmo_stream_srv_destroy()

void osmo_stream_srv_destroy ( struct osmo_stream_srv conn)

Destroy given Stream Server This function closes the Stream Server socket, unregisters from select loop, invokes the connection's closed_cb() callback to allow API users to clean up any associated state they have for this connection, and then de-allocates associated memory.

Parameters
[in]connStream Server to be destroyed

◆ osmo_stream_srv_get_data()

void * osmo_stream_srv_get_data ( struct osmo_stream_srv conn)

Get application private data of the stream server.

Parameters
[in]connStream Server
Returns
Application private data, as set by osmo_stream_srv_set_data()

◆ osmo_stream_srv_get_fd()

int osmo_stream_srv_get_fd ( const struct osmo_stream_srv conn)

Get File Descriptor of the stream server.

Parameters
[in]connStream Server
Returns
file descriptor or negative on error

Referenced by osmo_stream_srv_get_sockname().

◆ osmo_stream_srv_get_master()

struct osmo_stream_srv_link * osmo_stream_srv_get_master ( struct osmo_stream_srv conn)

Get the master (Link) from a Stream Server.

Parameters
[in]connStream Server of which we want to know the Link
Returns
Link through which the given Stream Server is established

◆ osmo_stream_srv_get_ofd()

struct osmo_fd * osmo_stream_srv_get_ofd ( struct osmo_stream_srv conn)

Get Osmocom File Descriptor of the stream server.

Parameters
[in]connStream Server
Returns
Pointer to osmo_fd

◆ osmo_stream_srv_get_sockname()

const char * osmo_stream_srv_get_sockname ( const struct osmo_stream_srv conn)

Get the stream server socket description.

Parameters
[in]cliStream Server to examine
Returns
Socket description or NULL in case of error

References osmo_stream_srv_get_fd().

◆ osmo_stream_srv_link_close()

void osmo_stream_srv_link_close ( struct osmo_stream_srv_link link)

Close the stream server link and unregister from select loop Does not destroy the server link, merely closes it!

Parameters
[in]linkStream Server Link to close

References osmo_stream_srv_link_is_opened().

Referenced by osmo_stream_srv_link_destroy().

◆ osmo_stream_srv_link_create()

struct osmo_stream_srv_link * osmo_stream_srv_link_create ( void *  ctx)

Create an Osmocom Stream Server Link A Stream Server Link is the listen()+accept() "parent" to individual Stream Servers.

Parameters
[in]ctxtalloc allocation context
Returns
Stream Server Link with default values (TCP)

◆ osmo_stream_srv_link_destroy()

void osmo_stream_srv_link_destroy ( struct osmo_stream_srv_link link)

Destroy the stream server link. Closes + Releases Memory.

Parameters
[in]linkStream Server Link

References osmo_stream_srv_link_close().

◆ osmo_stream_srv_link_get_data()

void * osmo_stream_srv_link_get_data ( struct osmo_stream_srv_link link)

Get application private data of the stream server link.

Parameters
[in]linkStream Server Link to modify
Returns
Application private data, as set by osmo_stream_cli_set_data()

◆ osmo_stream_srv_link_get_fd()

int osmo_stream_srv_link_get_fd ( const struct osmo_stream_srv_link link)

Get File Descriptor of the stream server link.

Parameters
[in]connStream Server Link
Returns
file descriptor or negative on error

◆ osmo_stream_srv_link_get_ofd()

struct osmo_fd * osmo_stream_srv_link_get_ofd ( struct osmo_stream_srv_link link)

Get Osmocom File Descriptor of the stream server link.

Parameters
[in]linkStream Server Link
Returns
Pointer to osmo_fd

◆ osmo_stream_srv_link_get_sockname()

char * osmo_stream_srv_link_get_sockname ( const struct osmo_stream_srv_link link)

Get description of the stream server link e. g. 127.0.0.1:1234.

Parameters
[in]linkStream Server Link to examine
Returns
Link description or NULL in case of error

◆ osmo_stream_srv_link_is_opened()

bool osmo_stream_srv_link_is_opened ( const struct osmo_stream_srv_link link)

Check whether the stream server link is opened.

Parameters
[in]linkStream Server Link to check

Referenced by osmo_stream_srv_link_close().

◆ osmo_stream_srv_link_open()

int osmo_stream_srv_link_open ( struct osmo_stream_srv_link link)

Open the stream server link. This actually initializes the underlying socket and binds it to the configured ip/port.

Parameters
[in]linkStream Server Link to open
Returns
negative on error, 0 on success

◆ osmo_stream_srv_link_set_accept_cb()

void osmo_stream_srv_link_set_accept_cb ( struct osmo_stream_srv_link link,
int(*)(struct osmo_stream_srv_link *link, int fd)  accept_cb 
)

Set the accept() call-back of the stream server link.

Parameters
[in]linkStream Server Link
[in]accept_cbCall-back function executed upon accept()

◆ osmo_stream_srv_link_set_addr()

void osmo_stream_srv_link_set_addr ( struct osmo_stream_srv_link link,
const char *  addr 
)

Set the local address to which we bind.

Parameters
[in]linkStream Server Link to modify
[in]addrLocal IP address

References osmo_stream_srv_link_set_addrs().

◆ osmo_stream_srv_link_set_addrs()

int osmo_stream_srv_link_set_addrs ( struct osmo_stream_srv_link link,
const char **  addr,
size_t  addrcnt 
)

Set the local address set to which we bind. Useful for protocols allowing bind on more than one address (such as SCTP)

Parameters
[in]linkStream Server Link to modify
[in]addrLocal IP address
Returns
negative on error, 0 on success

Referenced by osmo_stream_srv_link_set_addr().

◆ osmo_stream_srv_link_set_data()

void osmo_stream_srv_link_set_data ( struct osmo_stream_srv_link link,
void *  data 
)

Set application private data of the stream server link.

Parameters
[in]linkStream Server Link to modify
[in]dataUser-specific data (available in call-back functions)

◆ osmo_stream_srv_link_set_domain()

int osmo_stream_srv_link_set_domain ( struct osmo_stream_srv_link link,
int  domain 
)

Set the socket type for the stream server link.

Parameters
[in]linkStream Server Link to modify
[in]typeSocket Domain (like AF_UNSPEC (default for IP), AF_UNIX, AF_INET, ...)
Returns
zero on success, negative on error.

◆ osmo_stream_srv_link_set_name()

void osmo_stream_srv_link_set_name ( struct osmo_stream_srv_link link,
const char *  name 
)

Set a name on the srv_link object (used during logging)

Parameters
[in]linkserver link whose name is to be set
[in]namethe name to be set on link

◆ osmo_stream_srv_link_set_nodelay()

void osmo_stream_srv_link_set_nodelay ( struct osmo_stream_srv_link link,
bool  nodelay 
)

Set the NODELAY socket option to avoid Nagle-like behavior Setting this to nodelay=true will automatically set the NODELAY socket option on any socket established via this server link, before calling the accept_cb()

Parameters
[in]linkserver link whose sockets are to be configured
[in]nodelaywhether to set (true) NODELAY after accept

◆ osmo_stream_srv_link_set_port()

void osmo_stream_srv_link_set_port ( struct osmo_stream_srv_link link,
uint16_t  port 
)

Set the local port number to which we bind.

Parameters
[in]linkStream Server Link to modify
[in]portLocal port number

◆ osmo_stream_srv_link_set_proto()

void osmo_stream_srv_link_set_proto ( struct osmo_stream_srv_link link,
uint16_t  proto 
)

Set the protocol for the stream server link.

Parameters
[in]linkStream Server Link to modify
[in]protoProtocol (like IPPROTO_TCP (default), IPPROTO_SCTP, ...)

◆ osmo_stream_srv_link_set_type()

int osmo_stream_srv_link_set_type ( struct osmo_stream_srv_link link,
int  type 
)

Set the socket type for the stream server link.

Parameters
[in]linkStream Server Link to modify
[in]typeSocket Type (like SOCK_STREAM (default), SOCK_SEQPACKET, ...)
Returns
zero on success, negative on error.

◆ osmo_stream_srv_recv()

int osmo_stream_srv_recv ( struct osmo_stream_srv conn,
struct msgb *  msg 
)

Receive data via Osmocom stream server.

Parameters
[in]connStream Server from which to receive
msgpre-allocate message buffer to which received data is appended
Returns
number of bytes read, negative on error.

If conn is an SCTP connection, additional specific considerations shall be taken:

  • msg->cb is always filled with SCTP ppid, and SCTP stream values, see msgb_sctp_*() APIs.
  • If an SCTP notification was received when reading from the SCTP socket, msgb_sctp_msg_flags(msg) will contain bit flag OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION set, and the msgb will contain a "union sctp_notification" instead of user data. In this case the return code will be either 0 (if conn is considered dead after the notification) or -EAGAIN (if conn is considered still alive after the notification) resembling the standard recv() API.

◆ osmo_stream_srv_send()

void osmo_stream_srv_send ( struct osmo_stream_srv conn,
struct msgb *  msg 
)

Enqueue data to be sent via an Osmocom stream server.

Parameters
[in]connStream Server through which we want to send
[in]msgMessage buffer to enqueue in transmit queue

◆ osmo_stream_srv_set_closed_cb()

void osmo_stream_srv_set_closed_cb ( struct osmo_stream_srv conn,
int(*)(struct osmo_stream_srv *conn)  closed_cb 
)

Set the call-back function called when the stream server socket was closed.

Parameters
[in]connStream Server to modify
[in]closed_cbCall-back function to be called when the connection was closed

◆ osmo_stream_srv_set_data()

void osmo_stream_srv_set_data ( struct osmo_stream_srv conn,
void *  data 
)

Set application private data of the stream server.

Parameters
[in]connStream Server to modify
[in]dataUser-specific data (available in call-back functions)

◆ osmo_stream_srv_set_flush_and_destroy()

void osmo_stream_srv_set_flush_and_destroy ( struct osmo_stream_srv conn)

Prepare to send out all pending messages on the connection's Tx queue and then automatically destroy the stream with osmo_stream_srv_destroy(). This function disables queuing of new messages on the connection and also disables reception of new messages on the connection.

Parameters
[in]connStream Server to modify

◆ osmo_stream_srv_set_name()

void osmo_stream_srv_set_name ( struct osmo_stream_srv conn,
const char *  name 
)

Set a name on the srv object (used during logging)

Parameters
[in]connserver whose name is to be set
[in]namethe name to be set on conn

◆ osmo_stream_srv_set_read_cb()

void osmo_stream_srv_set_read_cb ( struct osmo_stream_srv conn,
int(*)(struct osmo_stream_srv *conn, struct msgb *msg)  read_cb 
)

Set the call-back function when data was read from the stream server socket Only for osmo_stream_srv created with osmo_stream_srv_create2()

Parameters
[in]connStream Server to modify
[in]read_cbCall-back function to be called when data was read

◆ osmo_stream_srv_set_segmentation_cb()

void osmo_stream_srv_set_segmentation_cb ( struct osmo_stream_srv conn,
int(*)(struct msgb *msg)  segmentation_cb 
)

Set the segmentation callback for target osmo_stream_srv structure. The connection has to have been established prior to calling this function.

Parameters
[in,out]connTarget Stream Server to modify
[in]segmentation_cbSegmentation callback to be set

Variable Documentation

◆ osmo_stream_cli_ioops

struct osmo_io_ops osmo_stream_cli_ioops
static
Initial value:
= {
.read_cb = stream_cli_iofd_read_cb,
.write_cb = stream_cli_iofd_write_cb,
.segmentation_cb = NULL,
}

◆ srv_ioops

struct osmo_io_ops srv_ioops
static
Initial value:
= {
.read_cb = stream_srv_iofd_read_cb,
.write_cb = stream_srv_iofd_write_cb,
}

◆ stream_cli_state_names

const struct value_string stream_cli_state_names[]
static
Initial value:
= {
{ STREAM_CLI_STATE_CLOSED, "CLOSED" },
{ STREAM_CLI_STATE_WAIT_RECONNECT, "WAIT_RECONNECT" },
{ STREAM_CLI_STATE_CONNECTING, "CONNECTING" },
{ STREAM_CLI_STATE_CONNECTED, "CONNECTED" },
{ 0, NULL }
}