The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
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: de40208e60fb7631c9c520dca58c311ecbeb4dd9 $
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  */
27 RCSIDH(lib_bio_fd_h, "$Id: de40208e60fb7631c9c520dca58c311ecbeb4dd9 $")
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 <fcntl.h>
34 
35 /*
36  * Local hack. AF_FILE is a synonym for AF_LOCAL on some platforms.
37  */
38 #define AF_FILE_BIO (INT_MAX)
39 
40 /** Per-packet context
41  *
42  * For reading packets src_ip is *their* IP, and dst_ip is *our* IP.
43  *
44  * For writing packets, src_ip is *our* IP, and dst_ip is *their* IP.
45  *
46  * This context is returned only for datagram sockets. For stream sockets (TCP and Unix domain), it
47  * isn't used. The caller can look at the socket information to determine src/dst ip/port.
48  */
49 typedef struct {
50  fr_socket_t socket; //!< socket information, including FD.
51  fr_time_t when; //!< when the packet was received
53 
54 typedef enum {
57  FR_BIO_FD_STATE_OPEN, //!< error states must be before this
60 
61 typedef enum {
62  FR_BIO_FD_UNCONNECTED, //!< unconnected UDP / datagram only
63  // updates #fr_bio_fd_packet_ctx_t for reads,
64  // uses #fr_bio_fd_packet_ctx_t for writes
65  FR_BIO_FD_CONNECTED, //!< connected client sockets (UDP or TCP)
66  FR_BIO_FD_LISTEN, //!< returns new fd in buffer on fr_bio_read() or fr_bio_fd_accept()
67  // updates #fr_bio_fd_packet_ctx_t on successful FD read.
68  FR_BIO_FD_ACCEPTED, //!< temporarily until it's connected.
70 
71 /** Configuration for sockets
72  *
73  * Each piece of information is broken out into a separate field, so that the configuration file parser can
74  * parse each field independently.
75  *
76  * We also include more information here than we need in an #fr_socket_t.
77  */
78 typedef struct {
79  fr_bio_fd_type_t type; //!< accept, connected, unconnected, etc.
80 
81  int socket_type; //!< SOCK_STREAM or SOCK_DGRAM
82 
83  fr_ipaddr_t src_ipaddr; //!< our IP address
84  fr_ipaddr_t dst_ipaddr; //!< their IP address
85 
86  uint16_t src_port; //!< our port
87  uint16_t dst_port; //!< their port
88 
89  char const *interface; //!< for binding to an interface
90 
91  uint32_t recv_buff; //!< How big the kernel's receive buffer should be.
92  uint32_t send_buff; //!< How big the kernel's send buffer should be.
93 
94  char const *path; //!< for Unix domain sockets
95  mode_t perm; //!< permissions for domain sockets
96  uid_t uid; //!< who owns the socket
97  gid_t gid; //!< who owns the socket
98  bool mkdir; //!< make intermediate directories
99 
100  char const *filename; //!< for files
101  int flags; //!< O_RDONLY, etc.
102 
103  bool async; //!< is it async
104  bool tcp_delay; //!< We do tcp_nodelay by default.
106 
107 /** Run-time status of the socket.
108  *
109  */
110 typedef struct {
111  fr_socket_t socket; //!< as connected socket
112 
113  fr_bio_fd_type_t type; //!< type of the socket
114 
115  fr_bio_fd_state_t state; //!< connecting, open, closed, etc.
116 
117  bool read_blocked; //!< did we block on read?
118  bool write_blocked; //!< did we block on write?
119  bool eof; //!< are we at EOF?
120 
121  int connect_errno; //!< from connect() or other APIs
122 
123  fr_bio_fd_config_t const *cfg; //!< so we know what was asked, vs what was granted.
125 
126 fr_bio_t *fr_bio_fd_alloc(TALLOC_CTX *ctx, fr_bio_fd_config_t const *cfg, size_t offset) CC_HINT(nonnull(1));
127 
128 int fr_bio_fd_close(fr_bio_t *bio) CC_HINT(nonnull);
129 
131  fr_bio_callback_t connected_cb, fr_bio_callback_t error_cb,
132  fr_time_delta_t *timeout, fr_bio_callback_t timeout_cb) CC_HINT(nonnull(1));
133 
134 #define fr_bio_fd_connect(_x) fr_bio_fd_connect_full(_x, NULL, NULL, NULL, NULL, NULL)
135 
136 fr_bio_fd_info_t const *fr_bio_fd_info(fr_bio_t *bio) CC_HINT(nonnull);
137 
138 int fr_bio_fd_open(fr_bio_t *bio, fr_bio_fd_config_t const *cfg) CC_HINT(nonnull);
139 
140 int fr_bio_fd_write_only(fr_bio_t *bio) CC_HINT(nonnull);
141 
142 int fr_bio_fd_reopen(fr_bio_t *bio) CC_HINT(nonnull);
143 
144 int 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:85
Definition: base.h:112
#define RCSIDH(h, id)
Definition: build.h:482
static fr_time_delta_t timeout
Definition: dhcpclient.c:54
fr_socket_t socket
as connected socket
Definition: fd.h:111
uint16_t src_port
our port
Definition: fd.h:86
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:1323
bool eof
are we at EOF?
Definition: fd.h:119
fr_bio_fd_type_t
Definition: fd.h:61
@ FR_BIO_FD_ACCEPTED
temporarily until it's connected.
Definition: fd.h:68
@ FR_BIO_FD_CONNECTED
connected client sockets (UDP or TCP)
Definition: fd.h:65
@ FR_BIO_FD_UNCONNECTED
unconnected UDP / datagram only
Definition: fd.h:62
@ FR_BIO_FD_LISTEN
returns new fd in buffer on fr_bio_read() or fr_bio_fd_accept()
Definition: fd.h:66
fr_bio_fd_type_t type
type of the socket
Definition: fd.h:113
fr_bio_fd_state_t state
connecting, open, closed, etc.
Definition: fd.h:115
uint32_t recv_buff
How big the kernel's receive buffer should be.
Definition: fd.h:91
bool mkdir
make intermediate directories
Definition: fd.h:98
int fr_bio_fd_reopen(fr_bio_t *bio)
Reopen a file BIO.
Definition: fd_open.c:1000
fr_bio_fd_state_t
Definition: fd.h:54
@ FR_BIO_FD_STATE_CLOSED
Definition: fd.h:56
@ FR_BIO_FD_STATE_INVALID
Definition: fd.h:55
@ FR_BIO_FD_STATE_CONNECTING
Definition: fd.h:58
@ FR_BIO_FD_STATE_OPEN
error states must be before this
Definition: fd.h:57
int connect_errno
from connect() or other APIs
Definition: fd.h:121
fr_ipaddr_t dst_ipaddr
their IP address
Definition: fd.h:84
fr_bio_fd_type_t type
accept, connected, unconnected, etc.
Definition: fd.h:79
char const * path
for Unix domain sockets
Definition: fd.h:94
uint32_t send_buff
How big the kernel's send buffer should be.
Definition: fd.h:92
char const * filename
for files
Definition: fd.h:100
uid_t uid
who owns the socket
Definition: fd.h:96
fr_bio_fd_config_t const * cfg
so we know what was asked, vs what was granted.
Definition: fd.h:123
bool read_blocked
did we block on read?
Definition: fd.h:117
gid_t gid
who owns the socket
Definition: fd.h:97
char const * interface
for binding to an interface
Definition: fd.h:89
mode_t perm
permissions for domain sockets
Definition: fd.h:95
int socket_type
SOCK_STREAM or SOCK_DGRAM.
Definition: fd.h:81
uint16_t dst_port
their port
Definition: fd.h:87
bool tcp_delay
We do tcp_nodelay by default.
Definition: fd.h:104
int fr_bio_fd_write_only(fr_bio_t *bio)
Mark up a bio as write-only.
Definition: fd.c:1353
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:715
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:1235
int fr_bio_fd_accept(TALLOC_CTX *ctx, fr_bio_t **out, fr_bio_t *bio)
Alternative to calling fr_bio_read() on new socket.
Definition: fd.c:1388
fr_socket_t socket
socket information, including FD.
Definition: fd.h:50
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:1012
int fr_bio_fd_close(fr_bio_t *bio)
Close the FD, but leave the bio allocated and alive.
Definition: fd.c:1058
bool async
is it async
Definition: fd.h:103
fr_time_t when
when the packet was received
Definition: fd.h:51
bool write_blocked
did we block on write?
Definition: fd.h:118
int flags
O_RDONLY, etc.
Definition: fd.h:101
fr_ipaddr_t src_ipaddr
our IP address
Definition: fd.h:83
Configuration for sockets.
Definition: fd.h:78
Run-time status of the socket.
Definition: fd.h:110
Per-packet context.
Definition: fd.h:49
IPv4/6 prefix.
Definition: merged_model.c:272
Stores all information relating to an event list.
Definition: event.c:411
unsigned short uint16_t
Definition: merged_model.c:31
unsigned int uint32_t
Definition: merged_model.c:33
unsigned int mode_t
Definition: merged_model.c:21
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:63
int nonnull(2, 5))
static size_t char ** out
Definition: value.h:997