libosmocore
1.9.0.186-fab9.202403172026
Osmocom core library
|
#include <unistd.h>
#include <stdbool.h>
#include <netinet/sctp.h>
#include <osmocom/core/osmo_io.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/select.h>
#include <osmocom/core/socket.h>
#include "../config.h"
Go to the source code of this file.
Data Structures | |
struct | iofd_backend_ops |
struct | osmo_io_fd |
struct | iofd_msghdr |
serialized version of 'struct msghdr' employed by sendmsg/recvmsg More... | |
Macros | |
#define | OSMO_IO_DEFAULT_MSGB_SIZE 1024 |
#define | OSMO_IO_DEFAULT_MSGB_HEADROOM 128 |
#define | OSMO_IO_BACKEND_DEFAULT "POLL" |
#define | IOFD_FLAG_CLOSED (1<<0) |
#define | IOFD_FLAG_IN_CALLBACK (1<<1) |
#define | IOFD_FLAG_TO_FREE (1<<2) |
#define | IOFD_FLAG_NOTIFY_CONNECTED (1<<3) |
#define | IOFD_FLAG_FD_REGISTERED (1<<4) |
#define | IOFD_FLAG_SET(iofd, flag) (iofd)->flags |= (flag) |
#define | IOFD_FLAG_UNSET(iofd, flag) (iofd)->flags &= ~(flag) |
#define | IOFD_FLAG_ISSET(iofd, flag) ((iofd)->flags & (flag)) |
Enumerations | |
enum | iofd_msg_action { IOFD_ACT_READ , IOFD_ACT_WRITE , IOFD_ACT_RECVFROM , IOFD_ACT_SENDTO , IOFD_ACT_RECVMSG , IOFD_ACT_SENDMSG } |
enum | iofd_seg_act { IOFD_SEG_ACT_HANDLE_ONE , IOFD_SEG_ACT_HANDLE_MORE , IOFD_SEG_ACT_DEFER } |
Functions | |
struct iofd_msghdr * | iofd_msghdr_alloc (struct osmo_io_fd *iofd, enum iofd_msg_action action, struct msgb *msg, size_t cmsg_size) |
Allocate the msghdr. More... | |
void | iofd_msghdr_free (struct iofd_msghdr *msghdr) |
Free the msghdr. More... | |
struct msgb * | iofd_msgb_alloc (struct osmo_io_fd *iofd) |
convenience wrapper to call msgb_alloc with parameters from osmo_io_fd More... | |
struct msgb * | iofd_msgb_pending (struct osmo_io_fd *iofd) |
return the pending msgb in iofd or NULL if there is none More... | |
struct msgb * | iofd_msgb_pending_or_alloc (struct osmo_io_fd *iofd) |
Return the pending msgb or allocate and return a new one. More... | |
void | iofd_handle_recv (struct osmo_io_fd *iofd, struct msgb *msg, int rc, struct iofd_msghdr *msghdr) |
completion handler: Called by osmo_io backend after a given I/O operation has completed More... | |
void | iofd_handle_send_completion (struct osmo_io_fd *iofd, int rc, struct iofd_msghdr *msghdr) |
completion handler: Calld by osmo_io backend after a given I/O operation has completed More... | |
void | iofd_handle_segmented_read (struct osmo_io_fd *iofd, struct msgb *msg, int rc) |
Restore message boundaries on read() and pass individual messages to the read callback. More... | |
int | iofd_txqueue_enqueue (struct osmo_io_fd *iofd, struct iofd_msghdr *msghdr) |
Enqueue a message to be sent. More... | |
void | iofd_txqueue_enqueue_front (struct osmo_io_fd *iofd, struct iofd_msghdr *msghdr) |
Enqueue a message at the front. More... | |
struct iofd_msghdr * | iofd_txqueue_dequeue (struct osmo_io_fd *iofd) |
Dequeue a message from the front. More... | |
Variables | |
const struct iofd_backend_ops | iofd_poll_ops |
#define IOFD_FLAG_CLOSED (1<<0) |
#define IOFD_FLAG_FD_REGISTERED (1<<4) |
#define IOFD_FLAG_IN_CALLBACK (1<<1) |
#define IOFD_FLAG_ISSET | ( | iofd, | |
flag | |||
) | ((iofd)->flags & (flag)) |
#define IOFD_FLAG_NOTIFY_CONNECTED (1<<3) |
#define IOFD_FLAG_SET | ( | iofd, | |
flag | |||
) | (iofd)->flags |= (flag) |
#define IOFD_FLAG_TO_FREE (1<<2) |
#define IOFD_FLAG_UNSET | ( | iofd, | |
flag | |||
) | (iofd)->flags &= ~(flag) |
#define OSMO_IO_BACKEND_DEFAULT "POLL" |
#define OSMO_IO_DEFAULT_MSGB_HEADROOM 128 |
#define OSMO_IO_DEFAULT_MSGB_SIZE 1024 |
enum iofd_msg_action |
enum iofd_seg_act |
void iofd_handle_recv | ( | struct osmo_io_fd * | iofd, |
struct msgb * | msg, | ||
int | rc, | ||
struct iofd_msghdr * | hdr | ||
) |
completion handler: Called by osmo_io backend after a given I/O operation has completed
[in] | iofd | I/O file-descriptor on which I/O has completed |
[in] | msg | message buffer containing data related to completed I/O |
[in] | rc | result code with read size or error (-errno) |
[in] | hdr | serialized msghdr containing state of completed I/O |
References osmo_io_fd::ctx, hdr, osmo_io_fd::io_ops, iofd_handle_segmented_read(), osmo_io_fd::mode, msg, osmo_io_fd::msgb_alloc, OSMO_ASSERT, OSMO_IO_FD_MODE_READ_WRITE, OSMO_IO_FD_MODE_RECVFROM_SENDTO, OSMO_IO_FD_MODE_RECVMSG_SENDMSG, osmo_io_ops::recvfrom_cb, and osmo_io_ops::recvmsg_cb.
Referenced by iofd_poll_ofd_cb_recvmsg_sendmsg().
void iofd_handle_segmented_read | ( | struct osmo_io_fd * | iofd, |
struct msgb * | msg, | ||
int | rc | ||
) |
Restore message boundaries on read() and pass individual messages to the read callback.
References osmo_io_fd::io_ops, iofd_handle_segmentation(), IOFD_SEG_ACT_DEFER, IOFD_SEG_ACT_HANDLE_MORE, osmo_io_fd::mode, msg, OSMO_ASSERT, OSMO_IO_FD_MODE_READ_WRITE, osmo_io_fd::pending, osmo_io_ops::read_cb, and res.
Referenced by iofd_handle_recv().
void iofd_handle_send_completion | ( | struct osmo_io_fd * | iofd, |
int | rc, | ||
struct iofd_msghdr * | msghdr | ||
) |
completion handler: Calld by osmo_io backend after a given I/O operation has completed
[in] | iofd | I/O file-descriptor on which I/O has completed |
[in] | rc | return value of the I/O operation |
[in] | msghdr | serialized msghdr containing state of completed I/O |
References iofd_msghdr::action, osmo_io_fd::io_ops, IOFD_ACT_SENDMSG, IOFD_ACT_SENDTO, IOFD_ACT_WRITE, iofd_msghdr_free(), iofd_txqueue_enqueue_front(), iofd_msghdr::iov, msg, iofd_msghdr::msg, msgb_free(), msgb_length(), msgb_pull(), iofd_msghdr::osa, OSMO_ASSERT, osmo_io_ops::sendmsg_cb, osmo_io_ops::sendto_cb, and osmo_io_ops::write_cb.
Referenced by iofd_poll_ofd_cb_recvmsg_sendmsg().
struct msgb* iofd_msgb_alloc | ( | struct osmo_io_fd * | iofd | ) |
convenience wrapper to call msgb_alloc with parameters from osmo_io_fd
References osmo_io_fd::headroom, osmo_io_fd::msgb_alloc, msgb_alloc_headroom_c(), OSMO_ASSERT, and osmo_io_fd::size.
Referenced by iofd_msgb_pending_or_alloc(), and iofd_msghdr_alloc().
struct msgb* iofd_msgb_pending | ( | struct osmo_io_fd * | iofd | ) |
return the pending msgb in iofd or NULL if there is none
References msg, and osmo_io_fd::pending.
Referenced by iofd_msgb_pending_or_alloc().
struct msgb* iofd_msgb_pending_or_alloc | ( | struct osmo_io_fd * | iofd | ) |
Return the pending msgb or allocate and return a new one.
References iofd_msgb_alloc(), iofd_msgb_pending(), and msg.
Referenced by iofd_poll_ofd_cb_recvmsg_sendmsg().
struct iofd_msghdr* iofd_msghdr_alloc | ( | struct osmo_io_fd * | iofd, |
enum iofd_msg_action | action, | ||
struct msgb * | msg, | ||
size_t | cmsg_size | ||
) |
Allocate the msghdr.
[in] | iofd | the osmo_io file structure |
[in] | action | the action this msg(hdr) is for (read, write, ..) |
[in] | msg | the msg buffer to use. Will allocate a new one if NULL |
[in] | cmsg_size | size (in bytes) of iofd_msghdr.cmsg buffer. Can be 0 if cmsg is not used. |
References iofd_msghdr::action, iofd_msghdr::hdr, iofd_msghdr::iofd, iofd_msgb_alloc(), and iofd_msghdr::msg.
Referenced by osmo_iofd_sendmsg_msgb(), osmo_iofd_sendto_msgb(), and osmo_iofd_write_msgb().
void iofd_msghdr_free | ( | struct iofd_msghdr * | msghdr | ) |
Free the msghdr.
[in] | msghdr | the msghdr to free |
Referenced by iofd_handle_send_completion(), osmo_iofd_sendmsg_msgb(), osmo_iofd_sendto_msgb(), osmo_iofd_txqueue_clear(), and osmo_iofd_write_msgb().
struct iofd_msghdr* iofd_txqueue_dequeue | ( | struct osmo_io_fd * | iofd | ) |
Dequeue a message from the front.
[in] | iofd | the file descriptor |
Referenced by iofd_poll_ofd_cb_recvmsg_sendmsg(), and osmo_iofd_txqueue_clear().
int iofd_txqueue_enqueue | ( | struct osmo_io_fd * | iofd, |
struct iofd_msghdr * | msghdr | ||
) |
Enqueue a message to be sent.
Enqueues the message at the back of the queue provided there is enough space.
[in] | iofd | the file descriptor |
[in] | msghdr | the message to enqueue |
References osmo_io_fd::current_length, IOFD_FLAG_CLOSED, IOFD_FLAG_ISSET, iofd_msghdr::list, llist_add_tail(), osmo_io_fd::max_length, osmo_io_fd::msg_queue, osmo_iofd_ops, osmo_io_fd::tx_queue, and iofd_backend_ops::write_enable.
Referenced by osmo_iofd_sendmsg_msgb(), osmo_iofd_sendto_msgb(), and osmo_iofd_write_msgb().
void iofd_txqueue_enqueue_front | ( | struct osmo_io_fd * | iofd, |
struct iofd_msghdr * | msghdr | ||
) |
Enqueue a message at the front.
Used to enqueue a msgb from a partial send again. This function will always enqueue the message, even if the maximum number of messages is reached.
[in] | iofd | the file descriptor |
[in] | msghdr | the message to enqueue |
References osmo_io_fd::current_length, IOFD_FLAG_CLOSED, IOFD_FLAG_ISSET, iofd_msghdr::list, llist_add(), osmo_io_fd::msg_queue, osmo_iofd_ops, osmo_io_fd::tx_queue, and iofd_backend_ops::write_enable.
Referenced by iofd_handle_send_completion().
|
extern |
Referenced by __attribute__(), and iofd_poll_ofd_cb_recvmsg_sendmsg().