The FreeRADIUS server $Id: f3670dba8951ca10eb4948feb3dc3db9423a334f $
Loading...
Searching...
No Matches
fd_config.c
Go to the documentation of this file.
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or (at
5 * your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17/**
18 * $Id: caa8797f81bebcbf09a4bee8f860da6ef666cebe $
19 * @file lib/bio/fd_config.c
20 * @brief BIO abstractions for configuring file descriptors.
21 *
22 * @copyright 2024 Network RADIUS SAS (legal@networkradius.com)
23 */
24
25#include <freeradius-devel/server/cf_parse.h>
26#include <freeradius-devel/server/tmpl.h>
27#include <freeradius-devel/util/perm.h>
28
29#include <freeradius-devel/bio/fd_priv.h>
30
32 { L("read-only"), O_RDONLY },
33 { L("read-write"), O_RDWR },
34 { L("ro"), O_RDONLY },
35 { L("rw"), O_RDWR },
36 { L("wo"), O_WRONLY },
37 { L("write-only"), O_WRONLY },
38};
40
41static int mode_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
42{
43 int mode;
44 char const *name = cf_pair_value(cf_item_to_pair(ci));
45
47 if (mode < 0) {
48 cf_log_err(ci, "Invalid mode name \"%s\"", name);
49 return -1;
50 }
51
52 *(int *) out = mode;
53
54 return 0;
55}
56
57static int send_recv_buf_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
58{
59 uint32_t size;
60
61 if (cf_table_parse_uint32(ctx, out, parent, ci, rule) < 0) {
62 return -1;
63 }
64
65 size = *(uint32_t *) out;
66 if (size > INT_MAX) {
67 cf_log_err(ci, "Invalid value - it is too large");
68 return -1;
69 }
70
71 return 0;
72}
73
74/** Parse "transport" and then set the subconfig
75 *
76 */
77static int common_transport_parse(UNUSED TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule, fr_table_ptr_sorted_t const *transport_table, size_t transport_table_len)
78{
79 int socket_type = SOCK_STREAM;
80 conf_parser_t const *rules;
81 char const *name = cf_pair_value(cf_item_to_pair(ci));
83 CONF_SECTION *cs, *subcs;
84
85 rules = fr_table_value_by_str(transport_table, name, NULL);
86 if (!rules) {
87 cf_log_err(ci, "Invalid transport name \"%s\"", name);
88 return -1;
89 }
90
92
93 /*
94 * Find the relevant subsection. Note that we don't do anything with it, as we push a parse
95 * rule in the parent which then points to the subsection.
96 */
97 subcs = cf_section_find(cs, name, NULL);
98 if (!subcs) {
99 cf_log_perr(ci, "Failed finding transport configuration section %s { ... }", name);
100 return -1;
101 }
102
103 /*
104 * Note that these offsets will get interpreted as being offsets from base of the subsection.
105 * i.e. the parent section and the subsection have to be parsed with the same base pointer.
106 */
107 if (cf_section_rules_push(cs, rules) < 0) {
108 cf_log_perr(ci, "Failed updating parse rules");
109 return -1;
110 }
111
112 if (strcmp(name, "udp") == 0) socket_type = SOCK_DGRAM;
113
114 /*
115 * Client sockets are always connected.
116 */
117 fd_config->socket_type = socket_type;
118 *(char const **) out = name;
119
120 return 0;
121}
122
125 { FR_CONF_OFFSET_TYPE_FLAGS("ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, dst_ipaddr) },
126 { FR_CONF_OFFSET_TYPE_FLAGS("ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, dst_ipaddr) },
127
128 { FR_CONF_OFFSET("port", fr_bio_fd_config_t, dst_port) },
129
130 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipaddr", FR_TYPE_COMBO_IP_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
131 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
132 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
133
134 { FR_CONF_OFFSET("src_port", fr_bio_fd_config_t, src_port) },
135 { FR_CONF_OFFSET("src_port_start", fr_bio_fd_config_t, src_port_start) },
136 { FR_CONF_OFFSET("src_port_end", fr_bio_fd_config_t, src_port_end) },
137
138 { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
139
140#if (defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)) || defined(IP_DONTFRAG)
141 { FR_CONF_OFFSET("exceed_mtu", fr_bio_fd_config_t, exceed_mtu), .dflt = "yes" },
142#endif
143
145 { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
146
148};
149
151 { FR_CONF_POINTER("udp", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) client_udp_sub_config },
152
154};
155
156
158 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipaddr", FR_TYPE_COMBO_IP_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
159 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
160 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
161
162 { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
163
164 { FR_CONF_OFFSET("src_port_start", fr_bio_fd_config_t, src_port_start) },
165 { FR_CONF_OFFSET("src_port_end", fr_bio_fd_config_t, src_port_end) },
166
167#if (defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)) || defined(IP_DONTFRAG)
168 { FR_CONF_OFFSET("exceed_mtu", fr_bio_fd_config_t, exceed_mtu), .dflt = "yes" },
169#endif
170
172 { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
173
175};
176
182
183
186 { FR_CONF_OFFSET_TYPE_FLAGS("ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, dst_ipaddr) },
187 { FR_CONF_OFFSET_TYPE_FLAGS("ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, dst_ipaddr) },
188
189 { FR_CONF_OFFSET("port", fr_bio_fd_config_t, dst_port) },
190
191 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipaddr", FR_TYPE_COMBO_IP_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
192 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
193 { FR_CONF_OFFSET_TYPE_FLAGS("src_ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
194
195 { FR_CONF_OFFSET("src_port", fr_bio_fd_config_t, src_port) },
196 { FR_CONF_OFFSET("src_port_start", fr_bio_fd_config_t, src_port_start) },
197 { FR_CONF_OFFSET("src_port_end", fr_bio_fd_config_t, src_port_end) },
198
199 { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
200
202 { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
203
204 { FR_CONF_OFFSET("delay_tcp_writes", fr_bio_fd_config_t, tcp_delay) },
205
207};
208
210 { FR_CONF_POINTER("tcp", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) client_tcp_sub_config },
211
213};
214
217
218 { FR_CONF_OFFSET("permissions", fr_bio_fd_config_t, perm), .dflt = "0600", .func = cf_parse_permissions },
219
220 { FR_CONF_OFFSET("mode", fr_bio_fd_config_t, flags), .dflt = "read-write", .func = mode_parse },
221
223};
224
226 { FR_CONF_POINTER("file", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) client_file_sub_config },
227
229};
230
236
238 { FR_CONF_POINTER("unix", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) client_unix_sub_config },
239
241};
242
244 { L("file"), client_file_config },
245 { L("tcp"), client_tcp_config },
246 { L("udp"), client_udp_config },
247 { L("unix"), client_unix_config },
248};
250
251/** Parse "transport" and then set the subconfig
252 *
253 */
254static int client_transport_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
255{
257
258 /*
259 * Unconnected UDP sockets can only take src_ipaddr, but not port, and not dst_ipaddr.
260 */
262 char const *name = cf_pair_value(cf_item_to_pair(ci));
264
265 if (strcmp(name, "udp") != 0) {
266 cf_log_err(ci, "Invalid transport for unconnected UDP socket");
267 return -1;
268 }
269
271 cf_log_perr(ci, "Failed updating parse rules");
272 return -1;
273 }
274
275 fd_config->socket_type = SOCK_DGRAM;
276 *(char const **) out = name;
277
278 return 0;
279 }
280
282
283 return common_transport_parse(ctx, out, parent, ci, rule,
285}
286
287/*
288 * Client uses src_ipaddr for our address, and ipaddr for their address.
289 */
291 { FR_CONF_OFFSET("transport", fr_bio_fd_config_t, transport), .func = client_transport_parse },
292
293 { FR_CONF_OFFSET("async", fr_bio_fd_config_t, async), .dflt = "true" },
294
296};
297
298/*
299 * Server configuration
300 *
301 * "ipaddr" is src_ipaddr
302 * There's no "dst_ipaddr" or "src_ipaddr" in the config.
303 *
304 * Files have permissions which can be set.
305 */
306
309 { FR_CONF_OFFSET_TYPE_FLAGS("ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
310 { FR_CONF_OFFSET_TYPE_FLAGS("ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
311
312 { FR_CONF_OFFSET("port", fr_bio_fd_config_t, src_port) },
313
314 { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
315
317 { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
318
319#if (defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)) || defined(IP_DONTFRAG)
320 { FR_CONF_OFFSET("exceed_mtu", fr_bio_fd_config_t, exceed_mtu), .dflt = "yes" },
321#endif
322
324};
325
327 { FR_CONF_POINTER("udp", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) server_udp_sub_config },
328
330};
331
334 { FR_CONF_OFFSET_TYPE_FLAGS("ipv4addr", FR_TYPE_IPV4_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
335 { FR_CONF_OFFSET_TYPE_FLAGS("ipv6addr", FR_TYPE_IPV6_ADDR, 0, fr_bio_fd_config_t, src_ipaddr) },
336
337 { FR_CONF_OFFSET("port", fr_bio_fd_config_t, src_port) },
338
339 { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
340
341 { FR_CONF_OFFSET_IS_SET("backlog", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, backlog) },
342
344 { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
345
346 { FR_CONF_OFFSET("delay_tcp_writes", fr_bio_fd_config_t, tcp_delay) },
347
349};
350
352 { FR_CONF_POINTER("tcp", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) server_tcp_sub_config },
353
355};
356
359
360 { FR_CONF_OFFSET("permissions", fr_bio_fd_config_t, perm), .dflt = "0600", .func = cf_parse_permissions },
361
362 { FR_CONF_OFFSET("mkdir", fr_bio_fd_config_t, mkdir) },
363
365};
366
368 { FR_CONF_POINTER("file", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) server_file_sub_config },
369
371};
372
379
382
383 { FR_CONF_OFFSET("permissions", fr_bio_fd_config_t, perm), .dflt = "0600", .func = cf_parse_permissions },
384
385 { FR_CONF_OFFSET("mode", fr_bio_fd_config_t, flags), .dflt = "read-only", .func = mode_parse },
386
387 { FR_CONF_OFFSET("mkdir", fr_bio_fd_config_t, mkdir) },
388
389 { FR_CONF_POINTER("peercred", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) server_peercred_config },
390
392};
393
395 { FR_CONF_POINTER("unix", 0, CONF_FLAG_SUBSECTION, NULL), .subcs = (void const *) server_unix_sub_config },
396
398};
399
400/*
401 * @todo - move this to client/server config in the same struct?
402 */
404 { L("file"), server_file_config },
405 { L("tcp"), server_tcp_config },
406 { L("udp"), server_udp_config },
407 { L("unix"), server_unix_config },
408};
410
411/** Parse "transport" and then set the subconfig
412 *
413 */
414static int server_transport_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
415{
416 int rcode;
418
419 fd_config->server = true;
420
421 rcode = common_transport_parse(ctx, out, parent, ci, rule,
423 if (rcode < 0) return rcode;
424
425 /*
426 * Automatically set the BIO type, too.
427 */
428 if (fd_config->socket_type == SOCK_DGRAM) {
430 } else {
432 }
433
434 return 0;
435}
436
437/*
438 * Server uses ipaddr for our address, and doesn't use src_ipaddr.
439 */
441 { FR_CONF_OFFSET("transport", fr_bio_fd_config_t, transport), .func = server_transport_parse },
442
443 { FR_CONF_OFFSET("async", fr_bio_fd_config_t, async), .dflt = "true" },
444
446};
#define L(_str)
Helper for initialising arrays of string literals.
Definition build.h:228
#define UNUSED
Definition build.h:336
#define NUM_ELEMENTS(_t)
Definition build.h:358
int cf_table_parse_uint32(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
Generic function for parsing conf pair values as int32_t (FR_TYPE_UINT32)
Definition cf_parse.c:1752
int cf_parse_gid(TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
Generic function for resolving GID strings to uid_t values.
Definition cf_parse.c:1787
int cf_parse_permissions(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
Generic function for resolving permissions to a mode-t.
Definition cf_parse.c:1802
int cf_parse_uid(TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
Generic function for resolving UID strings to uid_t values.
Definition cf_parse.c:1772
#define CONF_PARSER_TERMINATOR
Definition cf_parse.h:669
cf_parse_t func
Override default parsing behaviour for the specified type with a custom parsing function.
Definition cf_parse.h:623
#define FR_CONF_OFFSET(_name, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
Definition cf_parse.h:280
#define cf_section_rules_push(_cs, _rule)
Definition cf_parse.h:701
#define FR_CONF_POINTER(_name, _type, _flags, _res_p)
conf_parser_t which parses a single CONF_PAIR producing a single global result
Definition cf_parse.h:334
#define FR_CONF_OFFSET_IS_SET(_name, _type, _flags, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct,...
Definition cf_parse.h:294
#define FR_CONF_OFFSET_FLAGS(_name, _flags, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
Definition cf_parse.h:268
@ CONF_FLAG_REQUIRED
Error out if no matching CONF_PAIR is found, and no dflt value is set.
Definition cf_parse.h:429
@ CONF_FLAG_SUBSECTION
Instead of putting the information into a configuration structure, the configuration file routines MA...
Definition cf_parse.h:423
#define FR_CONF_OFFSET_TYPE_FLAGS(_name, _type, _flags, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
Definition cf_parse.h:238
Defines a CONF_PAIR to C data type mapping.
Definition cf_parse.h:606
Common header for all CONF_* types.
Definition cf_priv.h:54
A section grouping multiple CONF_PAIR.
Definition cf_priv.h:106
CONF_SECTION * cf_section_find(CONF_SECTION const *cs, char const *name1, char const *name2)
Find a CONF_SECTION with name1 and optionally name2.
Definition cf_util.c:1194
CONF_SECTION * cf_item_to_section(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_SECTION.
Definition cf_util.c:692
CONF_PAIR * cf_item_to_pair(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_PAIR.
Definition cf_util.c:672
char const * cf_pair_value(CONF_PAIR const *pair)
Return the value of a CONF_PAIR.
Definition cf_util.c:1746
#define cf_log_err(_cf, _fmt,...)
Definition cf_util.h:345
#define cf_parent(_cf)
Definition cf_util.h:118
#define cf_log_perr(_cf, _fmt,...)
Definition cf_util.h:352
@ FR_BIO_FD_CONNECTED
connected client sockets (UDP or TCP)
Definition fd.h:68
@ FR_BIO_FD_INVALID
not set
Definition fd.h:64
@ FR_BIO_FD_UNCONNECTED
unconnected UDP / datagram only
Definition fd.h:65
@ FR_BIO_FD_LISTEN
returns new fd in buffer on fr_bio_read() or fr_bio_fd_accept()
Definition fd.h:69
fr_bio_fd_type_t type
accept, connected, unconnected, etc.
Definition fd.h:81
bool server
is this a client or a server?
Definition fd.h:85
int socket_type
SOCK_STREAM or SOCK_DGRAM.
Definition fd.h:83
Configuration for sockets.
Definition fd.h:80
static int send_recv_buf_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
Definition fd_config.c:57
const conf_parser_t fr_bio_fd_server_config[]
Definition fd_config.c:440
static conf_parser_t const client_udp_unconnected_config[]
Definition fd_config.c:177
static conf_parser_t const client_file_config[]
Definition fd_config.c:225
static const conf_parser_t server_unix_sub_config[]
Definition fd_config.c:380
static size_t server_transport_names_len
Definition fd_config.c:409
static conf_parser_t const server_unix_config[]
Definition fd_config.c:394
static const conf_parser_t server_udp_sub_config[]
Definition fd_config.c:307
static int mode_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
Definition fd_config.c:41
static const conf_parser_t client_udp_sub_config[]
Definition fd_config.c:123
static const conf_parser_t server_file_sub_config[]
Definition fd_config.c:357
static const conf_parser_t client_unix_sub_config[]
Definition fd_config.c:231
static int common_transport_parse(UNUSED TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule, fr_table_ptr_sorted_t const *transport_table, size_t transport_table_len)
Parse "transport" and then set the subconfig.
Definition fd_config.c:77
static const conf_parser_t client_udp_unconnected_sub_config[]
Definition fd_config.c:157
const conf_parser_t fr_bio_fd_client_config[]
Definition fd_config.c:290
static conf_parser_t const client_udp_config[]
Definition fd_config.c:150
static int server_transport_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
Parse "transport" and then set the subconfig.
Definition fd_config.c:414
static fr_table_ptr_sorted_t client_transport_names[]
Definition fd_config.c:243
static size_t client_transport_names_len
Definition fd_config.c:249
static const conf_parser_t client_file_sub_config[]
Definition fd_config.c:215
static int client_transport_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
Parse "transport" and then set the subconfig.
Definition fd_config.c:254
static conf_parser_t const client_unix_config[]
Definition fd_config.c:237
static const conf_parser_t client_tcp_sub_config[]
Definition fd_config.c:184
static conf_parser_t const server_file_config[]
Definition fd_config.c:367
static conf_parser_t const server_udp_config[]
Definition fd_config.c:326
static const conf_parser_t server_peercred_config[]
Definition fd_config.c:373
static const conf_parser_t server_tcp_sub_config[]
Definition fd_config.c:332
static size_t mode_names_len
Definition fd_config.c:39
static fr_table_num_sorted_t mode_names[]
Definition fd_config.c:31
static conf_parser_t const server_tcp_config[]
Definition fd_config.c:351
static fr_table_ptr_sorted_t server_transport_names[]
Definition fd_config.c:403
static conf_parser_t const client_tcp_config[]
Definition fd_config.c:209
@ FR_TYPE_IPV4_ADDR
32 Bit IPv4 Address.
@ FR_TYPE_UINT32
32 Bit unsigned integer.
@ FR_TYPE_IPV6_ADDR
128 Bit IPv6 Address.
@ FR_TYPE_COMBO_IP_ADDR
IPv4 or IPv6 address depending on length.
unsigned int uint32_t
static fr_bio_fd_config_t fd_config
static char const * name
#define fr_table_value_by_str(_table, _name, _def)
Convert a string to a value using a sorted or ordered table.
Definition table.h:685
An element in a lexicographically sorted array of name to num mappings.
Definition table.h:49
An element in a lexicographically sorted array of name to ptr mappings.
Definition table.h:65
static fr_slen_t parent
Definition pair.h:858
static size_t char ** out
Definition value.h:1030