blob: d7402d6f5b8286493da2602462f54846e5157bd6 [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,
24 /*! emulate sctp_recvmsg() and sctp_sendmsg() */
25 OSMO_IO_FD_MODE_SCTP_RECVMSG_SENDMSG,
26};
27
28enum osmo_io_backend {
29 OSMO_IO_BACKEND_POLL,
30};
31
32extern const struct value_string osmo_io_backend_names[];
33static inline const char *osmo_io_backend_name(enum osmo_io_backend val)
34{ return get_value_string(osmo_io_backend_names, val); }
35
36struct osmo_io_ops {
37 union {
38 /* mode OSMO_IO_FD_MODE_READ_WRITE: */
39 struct {
40 /*! call-back function when something was read from fd */
41 void (*read_cb)(struct osmo_io_fd *iofd, int res, struct msgb *msg);
42 /*! call-back function when write has completed on fd */
43 void (*write_cb)(struct osmo_io_fd *iofd, int res,
44 const struct msgb *msg);
Daniel Willmannd4d03702023-05-17 12:38:14 +020045 /*! call-back function to segment the data at message boundaries.
46 * Needs to return the size of the next message. If it returns
47 * -EAGAIN or a value larger than msgb_length() (message is incomplete)
48 * osmo_io will wait for more data to be read. Other negative values
49 * cause the msg to be discarded. */
50 int (*segmentation_cb)(struct msgb *msg);
Harald Welte8857f3b2022-11-18 13:54:44 +010051 };
52
53 /* mode OSMO_IO_FD_MODE_RECVFROM_SENDTO: */
54 struct {
55 /*! call-back function emulating sendto */
56 void (*sendto_cb)(struct osmo_io_fd *iofd, int res,
57 const struct msgb *msg,
58 const struct osmo_sockaddr *daddr);
59 /*! call-back function emulating recvfrom */
60 void (*recvfrom_cb)(struct osmo_io_fd *iofd, int res,
61 struct msgb *msg,
62 const struct osmo_sockaddr *saddr);
63 };
64 };
65};
66
67void osmo_io_init(void);
68
69struct osmo_io_fd *osmo_iofd_setup(const void *ctx, int fd, const char *name,
70 enum osmo_io_fd_mode mode, const struct osmo_io_ops *ioops, void *data);
71int osmo_iofd_register(struct osmo_io_fd *iofd, int fd);
72int osmo_iofd_unregister(struct osmo_io_fd *iofd);
73unsigned int osmo_iofd_txqueue_len(struct osmo_io_fd *iofd);
74void osmo_iofd_txqueue_clear(struct osmo_io_fd *iofd);
75int osmo_iofd_close(struct osmo_io_fd *iofd);
76void osmo_iofd_free(struct osmo_io_fd *iofd);
77void osmo_iofd_read_enable(struct osmo_io_fd *iofd);
78void osmo_iofd_read_disable(struct osmo_io_fd *iofd);
79void osmo_iofd_write_enable(struct osmo_io_fd *iofd);
80void osmo_iofd_write_disable(struct osmo_io_fd *iofd);
81
82int osmo_iofd_write_msgb(struct osmo_io_fd *iofd, struct msgb *msg);
83int osmo_iofd_sendto_msgb(struct osmo_io_fd *iofd, struct msgb *msg, int sendto_flags,
84 const struct osmo_sockaddr *dest);
85
86void osmo_iofd_set_alloc_info(struct osmo_io_fd *iofd, unsigned int size, unsigned int headroom);
87void *osmo_iofd_get_data(const struct osmo_io_fd *iofd);
88void osmo_iofd_set_data(struct osmo_io_fd *iofd, void *data);
89
90unsigned int osmo_iofd_get_priv_nr(const struct osmo_io_fd *iofd);
91void osmo_iofd_set_priv_nr(struct osmo_io_fd *iofd, unsigned int priv_nr);
92
93int osmo_iofd_get_fd(const struct osmo_io_fd *iofd);
94const char *osmo_iofd_get_name(const struct osmo_io_fd *iofd);
arehbein0c374c62023-05-14 21:43:11 +020095
96void osmo_iofd_set_ioops(struct osmo_io_fd *iofd, const struct osmo_io_ops *ioops);