blob: 46e1a5399f2e44c133bb625ae8820d9ce16fddb2 [file] [log] [blame]
Harald Welte8857f3b2022-11-18 13:54:44 +01001/*! \file osmo_io.h
2 * io(_uring) abstraction osmo fd compatibility
3 */
4
5#pragma once
6
7#include <osmocom/core/linuxlist.h>
8#include <osmocom/core/logging.h>
9#include <osmocom/core/msgb.h>
10#include <osmocom/core/socket.h>
11#include <osmocom/core/utils.h>
12
13
14#define LOGPIO(iofd, level, fmt, args...) \
15 LOGP(DLIO, level, "iofd(%s)" fmt, iofd->name, ## args)
16
17struct osmo_io_fd;
18
19enum osmo_io_fd_mode {
20 /*! use read() / write() calls */
21 OSMO_IO_FD_MODE_READ_WRITE,
22 /*! use recvfrom() / sendto() calls */
23 OSMO_IO_FD_MODE_RECVFROM_SENDTO,
Harald Welte38d81702023-11-18 19:52:09 +010024 /*! emulate sctp_recvmsg() and sctp_send() */
25 OSMO_IO_FD_MODE_SCTP_RECVMSG_SEND,
Harald Welte8857f3b2022-11-18 13:54:44 +010026};
27
28enum osmo_io_backend {
29 OSMO_IO_BACKEND_POLL,
Daniel Willmannf91d2aa2023-01-04 18:20:55 +010030 OSMO_IO_BACKEND_IO_URING,
Harald Welte8857f3b2022-11-18 13:54:44 +010031};
32
33extern const struct value_string osmo_io_backend_names[];
34static inline const char *osmo_io_backend_name(enum osmo_io_backend val)
35{ return get_value_string(osmo_io_backend_names, val); }
36
37struct osmo_io_ops {
38 union {
39 /* mode OSMO_IO_FD_MODE_READ_WRITE: */
40 struct {
41 /*! call-back function when something was read from fd */
42 void (*read_cb)(struct osmo_io_fd *iofd, int res, struct msgb *msg);
43 /*! call-back function when write has completed on fd */
44 void (*write_cb)(struct osmo_io_fd *iofd, int res,
Daniel Willmann3ed87722023-06-06 11:34:14 +020045 struct msgb *msg);
Daniel Willmannd4d03702023-05-17 12:38:14 +020046 /*! call-back function to segment the data at message boundaries.
47 * Needs to return the size of the next message. If it returns
48 * -EAGAIN or a value larger than msgb_length() (message is incomplete)
49 * osmo_io will wait for more data to be read. Other negative values
Daniel Willmann7b59bab2023-07-07 11:17:59 +020050 * cause the msg to be discarded.
51 * If a full message was received (segmentation_cb() returns a value <= msgb_length())
52 * the msgb will be trimmed to size by osmo_io and forwarded to the read call-back. Any
53 * parsing done to the msgb by segmentation_cb() will be preserved for the read_cb()
54 * (e.g. setting lxh or msgb->cb). */
Daniel Willmannd4d03702023-05-17 12:38:14 +020055 int (*segmentation_cb)(struct msgb *msg);
Harald Welte8857f3b2022-11-18 13:54:44 +010056 };
57
58 /* mode OSMO_IO_FD_MODE_RECVFROM_SENDTO: */
59 struct {
Harald Welte8857f3b2022-11-18 13:54:44 +010060 /*! call-back function emulating recvfrom */
61 void (*recvfrom_cb)(struct osmo_io_fd *iofd, int res,
62 struct msgb *msg,
63 const struct osmo_sockaddr *saddr);
Daniel Willmann2dd8da62023-06-06 11:34:51 +020064 /*! call-back function emulating sendto */
65 void (*sendto_cb)(struct osmo_io_fd *iofd, int res,
Daniel Willmann3ed87722023-06-06 11:34:14 +020066 struct msgb *msg,
Daniel Willmann2dd8da62023-06-06 11:34:51 +020067 const struct osmo_sockaddr *daddr);
Harald Welte8857f3b2022-11-18 13:54:44 +010068 };
69 };
70};
71
arehbein2a405d42023-09-25 22:03:41 +020072void osmo_iofd_init(void);
Harald Welte8857f3b2022-11-18 13:54:44 +010073
74struct osmo_io_fd *osmo_iofd_setup(const void *ctx, int fd, const char *name,
75 enum osmo_io_fd_mode mode, const struct osmo_io_ops *ioops, void *data);
76int osmo_iofd_register(struct osmo_io_fd *iofd, int fd);
77int osmo_iofd_unregister(struct osmo_io_fd *iofd);
78unsigned int osmo_iofd_txqueue_len(struct osmo_io_fd *iofd);
79void osmo_iofd_txqueue_clear(struct osmo_io_fd *iofd);
80int osmo_iofd_close(struct osmo_io_fd *iofd);
81void osmo_iofd_free(struct osmo_io_fd *iofd);
Harald Welte8857f3b2022-11-18 13:54:44 +010082
Daniel Willmanne2a8dc42023-06-30 10:51:53 +020083void osmo_iofd_notify_connected(struct osmo_io_fd *iofd);
84
Harald Welte8857f3b2022-11-18 13:54:44 +010085int osmo_iofd_write_msgb(struct osmo_io_fd *iofd, struct msgb *msg);
86int osmo_iofd_sendto_msgb(struct osmo_io_fd *iofd, struct msgb *msg, int sendto_flags,
87 const struct osmo_sockaddr *dest);
88
89void osmo_iofd_set_alloc_info(struct osmo_io_fd *iofd, unsigned int size, unsigned int headroom);
Daniel Willmanna9303f32023-07-07 11:20:48 +020090void osmo_iofd_set_txqueue_max_length(struct osmo_io_fd *iofd, unsigned int size);
Harald Welte8857f3b2022-11-18 13:54:44 +010091void *osmo_iofd_get_data(const struct osmo_io_fd *iofd);
92void osmo_iofd_set_data(struct osmo_io_fd *iofd, void *data);
93
94unsigned int osmo_iofd_get_priv_nr(const struct osmo_io_fd *iofd);
95void osmo_iofd_set_priv_nr(struct osmo_io_fd *iofd, unsigned int priv_nr);
96
97int osmo_iofd_get_fd(const struct osmo_io_fd *iofd);
98const char *osmo_iofd_get_name(const struct osmo_io_fd *iofd);
Pau Espin Pedrol63e45e62023-06-16 16:19:45 +020099void osmo_iofd_set_name(struct osmo_io_fd *iofd, const char *name);
arehbein0c374c62023-05-14 21:43:11 +0200100
101void osmo_iofd_set_ioops(struct osmo_io_fd *iofd, const struct osmo_io_ops *ioops);