The FreeRADIUS server $Id: a4e7f8c94e8038b7627bcf52356b7ed15955c1d7 $
Loading...
Searching...
No Matches
fd.h
Go to the documentation of this file.
1#pragma once
2/*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
16 */
17
18/**
19 * $Id: 1c2f3291b65ba43df120d120d934f0875234e9c4 $
20 * @file lib/bio/fd.h
21 * @brief Binary IO abstractions for file descriptors
22 *
23 * Allow reads and writes from file descriptors.
24 *
25 * @copyright 2024 Network RADIUS SAS (legal@networkradius.com)
26 */
27RCSIDH(lib_bio_fd_h, "$Id: 1c2f3291b65ba43df120d120d934f0875234e9c4 $")
28
29#include <freeradius-devel/bio/base.h>
30#include <freeradius-devel/util/socket.h>
31#include <freeradius-devel/util/event.h>
32
33#include <freeradius-devel/server/cf_parse.h>
34
35#include <fcntl.h>
36
37/** Per-packet context
38 *
39 * For reading packets src_ip is *their* IP, and dst_ip is *our* IP.
40 *
41 * For writing packets, src_ip is *our* IP, and dst_ip is *their* IP.
42 *
43 * This context is returned only for datagram sockets. For stream sockets (TCP and Unix domain), it
44 * isn't used. The caller can look at the socket information to determine src/dst ip/port.
45 */
46typedef struct {
47 fr_socket_t socket; //!< socket information, including FD.
48 fr_time_t when; //!< when the packet was received
50
57
58typedef enum : uint8_t {
59 FR_BIO_FD_INVALID, //!< not set
60 FR_BIO_FD_UNCONNECTED, //!< unconnected UDP / datagram only
61 // updates #fr_bio_fd_packet_ctx_t for reads,
62 // uses #fr_bio_fd_packet_ctx_t for writes
63 FR_BIO_FD_CONNECTED, //!< connected client sockets (UDP or TCP)
64 FR_BIO_FD_LISTEN, //!< call fr_bio_fd_accept() for each new connection
65 // fr_bio_read() and fr_bio_write() return an error.
67
68/** The type of transport used by a FD BIO.
69 *
70 * The transport defines where the data goes (files, socket, etc), not the format of the transport (datagram
71 * or stream). It also is largely independent of connected vs unconnected. A TCP socket can be connected or
72 * listening, and a UDP socket can be connected or unconnected.
73 *
74 * This field is set automatically when parsing the configuration.
75 */
76typedef enum : uint8_t {
78 FR_BIO_FD_TRANSPORT_FILE, //!< regular file, named by 'filename'
79 FR_BIO_FD_TRANSPORT_TCP, //!< TCP over IPv4 or IPv6
80 FR_BIO_FD_TRANSPORT_UDP, //!< UDP over IPv4 or IPv6
81 FR_BIO_FD_TRANSPORT_UNIX, //!< Unix domain socket, named by 'path'
83#define FR_BIO_FD_TRANSPORT_SIZE (FR_BIO_FD_TRANSPORT_UNIX + 1)
84
85/** Configuration for sockets
86 *
87 * Each piece of information is broken out into a separate field, so that the configuration file parser can
88 * parse each field independently.
89 *
90 * We also include more information here than we need in an #fr_socket_t.
91 */
92typedef struct {
93 fr_bio_fd_type_t type; //!< accept, connected, unconnected, etc.
94
95 int socket_type; //!< SOCK_STREAM or SOCK_DGRAM
96 char const *transport; //!< name of the transport protocol
97 fr_bio_fd_transport_t transport_type; //!< which transport, as a number instead of a name
98 bool server; //!< is this a client or a server?
99 bool reuse_port; //!< whether or not we re-use the same destination port for datagram sockets
100
101 fr_ipaddr_t src_ipaddr; //!< our IP address
102 fr_ipaddr_t dst_ipaddr; //!< their IP address
103
104 uint16_t src_port; //!< our port
105 uint16_t dst_port; //!< their port
106
107 uint16_t src_port_start; //!< limit source port ranges for client BIOs
108 uint16_t src_port_end; //!< limit source port ranges for client BIOs
109
110 char const *interface; //!< for binding to an interface
111
112 uint32_t backlog; //!< for listen()
113
114 uint32_t recv_buff; //!< How big the kernel's receive buffer should be.
115 uint32_t send_buff; //!< How big the kernel's send buffer should be.
116
117 char const *path; //!< for Unix domain sockets
118 mode_t perm; //!< permissions for domain sockets
119 uid_t uid; //!< who owns the socket
120 gid_t gid; //!< who owns the socket
121 bool mkdir; //!< make intermediate directories
122
123 char const *filename; //!< for files
124 int flags; //!< O_RDONLY, etc.
125
126 bool async; //!< is it async
127 bool tcp_delay; //!< We do tcp_nodelay by default.
128 bool exceed_mtu; //!< Whether we allow packets which exceed the local MTU
129
130 /*
131 * Extra fields for conf_parser_t
132 */
133 bool recv_buff_is_set; //!< Whether we were provided with a recv_buf
134 bool send_buff_is_set; //!< Whether we were provided with a send_buf
135 bool backlog_is_set; //!< Whether we were provided with a backlog
137
140
141/** Run-time status of the socket.
142 *
143 */
144typedef struct {
145 fr_socket_t socket; //!< as connected socket
146
147 fr_bio_fd_type_t type; //!< type of the socket
148 fr_bio_fd_state_t state; //!< connecting, open, closed, etc.
149
150 char const *name; //!< printable name of this BIO
151
152 bool read_blocked; //!< did we block on read?
153 bool write_blocked; //!< did we block on write?
154 bool eof; //!< are we at EOF?
155
156 int connect_errno; //!< from connect() or other APIs
157
158 fr_bio_fd_config_t const *cfg; //!< so we know what was asked, vs what was granted.
160
161fr_bio_t *fr_bio_fd_alloc(TALLOC_CTX *ctx, fr_bio_fd_config_t const *cfg, size_t offset) CC_HINT(nonnull(1));
162
163int fr_bio_fd_close(fr_bio_t *bio) CC_HINT(nonnull);
164
166 fr_bio_callback_t connected_cb, fr_bio_callback_t error_cb,
167 fr_time_delta_t *timeout, fr_bio_callback_t timeout_cb) CC_HINT(nonnull(1));
168
169#define fr_bio_fd_connect(_x) fr_bio_fd_connect_full(_x, NULL, NULL, NULL, NULL, NULL)
170
171fr_bio_fd_info_t const *fr_bio_fd_info(fr_bio_t *bio) CC_HINT(nonnull);
172
173int fr_bio_fd_check_config(fr_bio_fd_config_t const *cfg) CC_HINT(nonnull);
174
175int fr_bio_fd_open(fr_bio_t *bio, fr_bio_fd_config_t const *cfg) CC_HINT(nonnull);
176
177int fr_bio_fd_write_only(fr_bio_t *bio) CC_HINT(nonnull);
178
179int fr_bio_fd_reopen(fr_bio_t *bio) CC_HINT(nonnull);
180
181int fr_bio_fd_accept(TALLOC_CTX *ctx, fr_bio_t **out, fr_bio_t *bio) CC_HINT(nonnull);
void(* fr_bio_callback_t)(fr_bio_t *bio)
Definition base.h:86
#define RCSIDH(h, id)
Definition build.h:604
Defines a CONF_PAIR to C data type mapping.
Definition cf_parse.h:649
const conf_parser_t fr_bio_fd_server_config[]
Definition fd_config.c:485
char const * transport
name of the transport protocol
Definition fd.h:96
fr_socket_t socket
as connected socket
Definition fd.h:145
char const * name
printable name of this BIO
Definition fd.h:150
uint16_t src_port
our port
Definition fd.h:104
bool eof
are we at EOF?
Definition fd.h:154
fr_bio_fd_type_t type
type of the socket
Definition fd.h:147
fr_bio_fd_state_t state
connecting, open, closed, etc.
Definition fd.h:148
uint16_t src_port_start
limit source port ranges for client BIOs
Definition fd.h:107
uint32_t recv_buff
How big the kernel's receive buffer should be.
Definition fd.h:114
bool mkdir
make intermediate directories
Definition fd.h:121
int fr_bio_fd_reopen(fr_bio_t *bio)
Reopen a file BIO.
Definition fd_open.c:1500
int connect_errno
from connect() or other APIs
Definition fd.h:156
fr_ipaddr_t dst_ipaddr
their IP address
Definition fd.h:102
fr_bio_fd_type_t type
accept, connected, unconnected, etc.
Definition fd.h:93
const conf_parser_t fr_bio_fd_client_config[]
Definition fd_config.c:314
bool recv_buff_is_set
Whether we were provided with a recv_buf.
Definition fd.h:133
char const * path
for Unix domain sockets
Definition fd.h:117
uint32_t send_buff
How big the kernel's send buffer should be.
Definition fd.h:115
char const * filename
for files
Definition fd.h:123
uid_t uid
who owns the socket
Definition fd.h:119
fr_bio_fd_type_t
Definition fd.h:58
@ FR_BIO_FD_CONNECTED
connected client sockets (UDP or TCP)
Definition fd.h:63
@ FR_BIO_FD_INVALID
not set
Definition fd.h:59
@ FR_BIO_FD_UNCONNECTED
unconnected UDP / datagram only
Definition fd.h:60
@ FR_BIO_FD_LISTEN
call fr_bio_fd_accept() for each new connection
Definition fd.h:64
fr_bio_fd_config_t const * cfg
so we know what was asked, vs what was granted.
Definition fd.h:158
bool read_blocked
did we block on read?
Definition fd.h:152
fr_bio_fd_transport_t
The type of transport used by a FD BIO.
Definition fd.h:76
@ FR_BIO_FD_TRANSPORT_TCP
TCP over IPv4 or IPv6.
Definition fd.h:79
@ FR_BIO_FD_TRANSPORT_UDP
UDP over IPv4 or IPv6.
Definition fd.h:80
@ FR_BIO_FD_TRANSPORT_INVALID
not set
Definition fd.h:77
@ FR_BIO_FD_TRANSPORT_UNIX
Unix domain socket, named by 'path'.
Definition fd.h:81
@ FR_BIO_FD_TRANSPORT_FILE
regular file, named by 'filename'
Definition fd.h:78
bool server
is this a client or a server?
Definition fd.h:98
gid_t gid
who owns the socket
Definition fd.h:120
char const * interface
for binding to an interface
Definition fd.h:110
mode_t perm
permissions for domain sockets
Definition fd.h:118
fr_bio_fd_info_t const * fr_bio_fd_info(fr_bio_t *bio)
Returns a pointer to the bio-specific information.
Definition fd.c:1377
uint16_t src_port_end
limit source port ranges for client BIOs
Definition fd.h:108
int socket_type
SOCK_STREAM or SOCK_DGRAM.
Definition fd.h:95
uint32_t backlog
for listen()
Definition fd.h:112
uint16_t dst_port
their port
Definition fd.h:105
bool tcp_delay
We do tcp_nodelay by default.
Definition fd.h:127
fr_bio_fd_transport_t transport_type
which transport, as a number instead of a name
Definition fd.h:97
int fr_bio_fd_write_only(fr_bio_t *bio)
Mark up a bio as write-only.
Definition fd.c:1424
int fr_bio_fd_open(fr_bio_t *bio, fr_bio_fd_config_t const *cfg)
Opens a socket and updates sock->fd.
Definition fd_open.c:1293
fr_bio_fd_state_t
Definition fd.h:51
@ FR_BIO_FD_STATE_CLOSED
Definition fd.h:53
@ FR_BIO_FD_STATE_INVALID
Definition fd.h:52
@ FR_BIO_FD_STATE_CONNECTING
Definition fd.h:55
@ FR_BIO_FD_STATE_OPEN
error states must be before this
Definition fd.h:54
bool reuse_port
whether or not we re-use the same destination port for datagram sockets
Definition fd.h:99
bool backlog_is_set
Whether we were provided with a backlog.
Definition fd.h:135
int fr_bio_fd_connect_full(fr_bio_t *bio, fr_event_list_t *el, fr_bio_callback_t connected_cb, fr_bio_callback_t error_cb, fr_time_delta_t *timeout, fr_bio_callback_t timeout_cb))
Finalize a connect()
Definition fd.c:1280
int fr_bio_fd_accept(TALLOC_CTX *ctx, fr_bio_t **out, fr_bio_t *bio)
Accept a new connection on a socket.
Definition fd.c:1561
bool exceed_mtu
Whether we allow packets which exceed the local MTU.
Definition fd.h:128
int fr_bio_fd_check_config(fr_bio_fd_config_t const *cfg)
Checks the configuration without modifying anything.
Definition fd_open.c:996
fr_socket_t socket
socket information, including FD.
Definition fd.h:47
int fr_bio_fd_close(fr_bio_t *bio)
Close the FD, but leave the bio allocated and alive.
Definition fd.c:1095
bool async
is it async
Definition fd.h:126
fr_time_t when
when the packet was received
Definition fd.h:48
bool send_buff_is_set
Whether we were provided with a send_buf.
Definition fd.h:134
fr_bio_t * fr_bio_fd_alloc(TALLOC_CTX *ctx, fr_bio_fd_config_t const *cfg, size_t offset))
Allocate a FD bio.
Definition fd.c:1047
bool write_blocked
did we block on write?
Definition fd.h:153
int flags
O_RDONLY, etc.
Definition fd.h:124
fr_ipaddr_t src_ipaddr
our IP address
Definition fd.h:101
Configuration for sockets.
Definition fd.h:92
Run-time status of the socket.
Definition fd.h:144
Per-packet context.
Definition fd.h:46
IPv4/6 prefix.
Stores all information relating to an event list.
Definition event.c:375
unsigned short uint16_t
unsigned int uint32_t
unsigned char uint8_t
A time delta, a difference in time measured in nanoseconds.
Definition time.h:80
"server local" time.
Definition time.h:69
static fr_event_list_t * el
Holds information necessary for binding or connecting to a socket.
Definition socket.h:60
static fr_sbuff_err_t char ** out
Definition value.h:1061
int nonnull(2, 5))