The FreeRADIUS server $Id: f3670dba8951ca10eb4948feb3dc3db9423a334f $
Loading...
Searching...
No Matches
dict.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/** Multi-protocol AVP dictionary API
19 *
20 * @file src/lib/util/dict.h
21 *
22 * @copyright 2015 The FreeRADIUS server project
23 */
24
25RCSIDH(dict_h, "$Id: 34431ec4925348b1967390477984d0597c7355c1 $")
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31#include <freeradius-devel/build.h>
32#include <freeradius-devel/missing.h>
33#include <freeradius-devel/util/dl.h>
34#include <freeradius-devel/util/ext.h>
35#include <freeradius-devel/util/hash.h>
36#include <freeradius-devel/util/rb.h>
37#include <freeradius-devel/util/sbuff.h>
38#include <freeradius-devel/util/table.h>
39#include <freeradius-devel/util/talloc.h>
40#include <freeradius-devel/util/types.h>
41
42
43/*
44 * Avoid circular type references.
45 */
47typedef struct fr_dict_s fr_dict_t;
48
50
51/*
52 * Allow public and private versions of the same structures
53 */
54#ifdef _CONST
55# error _CONST can only be defined in the local header
56#endif
57#ifndef _DICT_PRIVATE
58# define _CONST const
59#else
60# define _CONST
61#endif
62
63#ifdef WITH_VERIFY_PTR
64# define DA_VERIFY(_x) fr_dict_attr_verify(__FILE__, __LINE__, _x)
65#else
66# define DA_VERIFY(_x) fr_cond_assert(_x)
67#endif
68
71
72/** Values of the encryption flags
73 */
74typedef struct {
75 unsigned int is_root : 1; //!< Is root of a dictionary.
76
77 unsigned int is_unknown : 1; //!< This dictionary attribute is ephemeral
78 ///< and not part of the main dictionary.
79
80 unsigned int is_raw : 1; //!< This dictionary attribute was constructed
81 ///< from a known attribute to allow the user
82 ///< to assign octets values directly.
83 ///< See .is_unknown to determine if it is
84 ///< ephemeral.
85 unsigned int is_alias : 1; //!< This isn't a real attribute, it's a reference to
86 ///< to one.
87 unsigned int has_alias : 1; //!< this attribute has an alias.
88 unsigned int internal : 1; //!< Internal attribute, should not be received
89 ///< in protocol packets, should not be encoded.
90 unsigned int array : 1; //!< Pack multiples into 1 attr.
91
92 unsigned int is_known_width : 1; //!< is treated as if it has a known width for structs
93
94 unsigned int has_value : 1; //!< Has a value.
95
96 unsigned int is_unsigned : 1; //!< hackity hack for dates and time deltas
97
98 unsigned int counter : 1; //!< integer attribute is actually an impulse / counter
99
100 unsigned int name_only : 1; //!< this attribute should always be referred to by name.
101 ///< A number will be allocated, but the allocation scheme
102 ///< will depend on the parent, and definition type, and
103 ///< may not be stable in all instances.
104
105 unsigned int secret : 1; //!< this attribute should be omitted in debug mode
106
107 unsigned int unsafe : 1; //!< e.g. Cleartext-Password
108
109 unsigned int is_ref_target : 1; //!< is the target of a ref, and cannot be moved.
110
111 /*
112 * @todo - if we want to clean these fields up, make
113 * "subtype" and "type_size" both 4-bit bitfields. That
114 * gives us an extra 8 bits for adding new flags, and we
115 * can likely get rid of "extra", in order to save one
116 * more bit.
117 */
118 unsigned int extra : 1; //!< really "subtype is used by dict, not by protocol"
119
120 unsigned int local : 1; //!< is a local variable
121
122 unsigned int allow_flat : 1; //!< only for FR_TYPE_GROUP, can contain "flat" lists.
123
124 unsigned int has_fixup : 1; //! needs a fixup during dictionary parsing
125
126 /*
127 * main: extra is set, then this field is is key, bit, or a uint16 length field.
128 * radius: is one of 9 options for flags
129 * dhcp v4/v6: DNS label, or partial DNS label
130 */
131 uint8_t subtype; //!< protocol-specific values, OR key fields
132
133 /*
134 * TLVs: Number of bytes in the "type" field for TLVs (typically 1, 2, or 4)
135 *
136 * da_is_bit_field(da): offset in the byte where this bit
137 * field ends. This is only used as a caching mechanism
138 * during parsing of the dictionaries.
139 *
140 * time/time_delta: fr_time_res_t, which has 4 possible values.
141 *
142 * otherwise: unused.
143 */
144 uint8_t type_size; //!< Type size for TLVs
145
146 /*
147 * da_is_bit_field(da): Length of the field in bits.
148 *
149 * TLV: Number of bytes in the "length" field
150 *
151 * otherwise: Length in bytes
152 */
153 uint16_t length; //!< length of the attribute
155
156#define flag_time_res type_size
157#define flag_byte_offset type_size
158
159/** subtype values for the dictionary when extra=1
160 *
161 */
162enum {
163 FLAG_EXTRA_NONE = 0, //!< no extra meaning, should be invalid
164 FLAG_KEY_FIELD, //!< this is a key field for a subsequent struct
165 FLAG_BIT_FIELD, //!< bit field inside of a struct
166 FLAG_LENGTH_UINT8, //!< string / octets type is prefixed by uint8 of length
167 FLAG_LENGTH_UINT16, //!< string / octets type is prefixed by uint16 of length
168};
169
170#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
171#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
172#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
173#define da_is_length_field8(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT8))
174#define da_is_length_field16(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_LENGTH_UINT16))
175#define da_length_offset(_da) ((_da)->flags.type_size)
176
177/** Extension identifier
178 *
179 * @note New extension structures should also be added to the to the appropriate table in dict_ext.c
180 */
181typedef enum {
182 FR_DICT_ATTR_EXT_NAME = 0, //!< Name of the attribute.
183 FR_DICT_ATTR_EXT_CHILDREN, //!< Attribute has children.
184 FR_DICT_ATTR_EXT_REF, //!< Attribute references another
185 ///< attribute and/or dictionary.
186 FR_DICT_ATTR_EXT_KEY, //!< UNION attribute references a key
187 FR_DICT_ATTR_EXT_VENDOR, //!< Cached vendor pointer.
188 FR_DICT_ATTR_EXT_ENUMV, //!< Enumeration values.
189 FR_DICT_ATTR_EXT_NAMESPACE, //!< Attribute has its own namespace.
190 FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC, //!< Protocol specific extensions
193
194/** Dictionary attribute
195 */
197 /** @name Tree topology
198 *
199 * How the attribute connects to the rest of the dictionary.
200 * @{
201 */
202 fr_dict_t _CONST* _CONST dict; //!< Dict attribute belongs to.
203 fr_dict_attr_t const *parent; //!< Immediate parent of this attribute.
204 fr_dict_attr_t const *next; //!< Next child in bin.
205 /** @} */
206
207 /** @name Identity
208 *
209 * What the attribute is.
210 * @{
211 */
212 char const *name; //!< Attribute name.
213 unsigned int attr; //!< Attribute number.
214 fr_type_t type; //!< Value type.
215 uint8_t name_len; //!< Length of the name.
216 uint8_t depth; //!< Depth of nesting for this attribute.
217 /** @} */
218
219 /** @name Definition state
220 * @{
221 */
222 struct {
223 bool attr_set : 1; //!< Attribute number has been set.
224 //!< We need the full range of values 0-UINT32_MAX
225 ///< so we can't use any attr values to indicate
226 ///< "unsetness".
227
228 bool finalised : 1; //!< Attribute definition is complete and modifications
229 ///< that would change the address of the memory chunk
230 ///< of the attribute are no longer permitted.
232 /** @} */
233
234 /** @name Behaviour
235 * @{
236 */
238 /** @} */
239
240 /** @name Extensions
241 * @{
242 */
243 uint8_t ext[FR_DICT_ATTR_EXT_MAX]; //!< Extensions to the dictionary attribute.
244 /** @} */
245
246 /** @name Location
247 *
248 * Where the definition came from.
249 * @{
250 */
251 uint16_t file; //!< Id of the file where the attribute was defined.
252 ///< Resolve with fr_dict_attr_filename().
253 uint16_t line; //!< Line number where the attribute was defined.
254 /** @} */
255} CC_HINT(aligned(FR_EXT_ALIGNMENT));
256
257/** Extension identifier
258 *
259 * @note New extension structures should also be added to the appropriate table in dict_ext.c
260 */
261typedef enum {
262 FR_DICT_ENUM_EXT_ATTR_REF = 0, //!< Reference to a child attribute associated with this key value
265
266/** Enum extension - Sub-struct or union pointer
267 *
268 */
269typedef struct {
270 fr_dict_attr_t const *da; //!< the child structure referenced by this value of key
272
273/** Value of an enumerated attribute
274 *
275 * Maps one of more string values to integers and vice versa.
276 */
277typedef struct {
278 char const *name; //!< Enum name.
279 size_t name_len; //!< Allows for efficient name lookups when operating
280 ///< on partial buffers.
281 fr_value_box_t const *value; //!< Enum value (what name maps to).
282
283 uint8_t ext[FR_DICT_ENUM_EXT_MAX]; //!< Extensions to the dictionary attribute.
284} fr_dict_enum_value_t CC_HINT(aligned(FR_EXT_ALIGNMENT));
285
286/** Private enterprise
287 *
288 * Represents an IANA private enterprise allocation.
289 *
290 * The width of the private enterprise number must be the same for all protocols
291 * so we can represent a vendor with a single struct.
292 */
293typedef struct {
294 uint32_t pen; //!< Private enterprise number.
295 bool continuation; //!< we only have one flag for now, for WiMAX
296 size_t type; //!< Length of type data
297 size_t length; //!< Length of length data
298 char const *name; //!< Vendor name.
300
301/** Specifies a value which must be present for the module to function
302 *
303 */
304typedef struct {
305 fr_value_box_t const **out; //!< Enumeration value.
306 fr_dict_attr_t const **attr; //!< The protocol dictionary the attribute should
307 ///< be resolved in. ** so it's a compile time
308 ///< constant.
309 char const *name; //!< of the attribute.
311
312/** Specifies an attribute which must be present for the module to function
313 *
314 */
315typedef struct {
316 fr_dict_attr_t const **out; //!< Where to write a pointer to the resolved
317 //!< #fr_dict_attr_t.
318 fr_dict_t const **dict; //!< The protocol dictionary the attribute should
319 ///< be resolved in. ** so it's a compile time
320 ///< constant.
321 char const *name; //!< of the attribute.
322 fr_type_t type; //!< of the attribute. Mismatch is a fatal error.
324
325/** Specifies a dictionary which must be loaded/loadable for the module to function
326 *
327 */
328typedef struct {
329 fr_dict_t const **out; //!< Where to write a pointer to the loaded/resolved
330 //!< #fr_dict_t.
331 char const *base_dir; //!< Directory structure beneath share.
332 char const *proto; //!< The protocol dictionary name.
334
335#define DICT_AUTOLOAD_TERMINATOR { .out = NULL }
336
337
338/** Errors returned by attribute lookup functions
339 *
340 */
341typedef enum {
342 FR_DICT_ATTR_OK = 0, //!< No error.
343 FR_DICT_ATTR_NOTFOUND = -1, //!< Attribute couldn't be found.
344 FR_DICT_ATTR_PROTOCOL_NOTFOUND = -2, //!< Protocol couldn't be found.
345 FR_DICT_ATTR_PARSE_ERROR = -3, //!< Attribute string couldn't be parsed
346 FR_DICT_ATTR_INTERNAL_ERROR = -4, //!< Internal error occurred.
347 FR_DICT_ATTR_OOM = -5, //!< Memory allocation error.
348 FR_DICT_ATTR_NOT_DESCENDENT = -6, //!< Attribute is not a descendent of the parent
349 ///< attribute.
350 FR_DICT_ATTR_NOT_ANCESTOR = -7, //!< Attribute is not an ancestor of the child
351 ///< attribute.
352 FR_DICT_ATTR_NO_CHILDREN = -8, //!< Child lookup in attribute with no children.
353 FR_DICT_ATTR_EINVAL = -9 //!< Invalid arguments.
354
356
359
360/*
361 * Forward declarations to avoid circular references.
362 */
364typedef struct fr_dbuff_s fr_dbuff_t;
365
366/** A generic interface for decoding packets to fr_pair_ts
367 *
368 * A decoding function should decode a single top level packet from wire format.
369 *
370 * Note that unlike #fr_tp_proto_decode_t, this function is NOT passed an encode_ctx. That is because when we
371 * do cross-protocol encoding, the "outer" protocol has no information it can share with the "inner" protocol.
372 *
373 * @param[in] ctx to allocate new pairs in.
374 * @param[in] vps where new VPs will be added
375 * @param[in] data to decode.
376 * @param[in] data_len The length of the incoming data.
377 * @return
378 * - <= 0 on error. May be the offset (as a negative value) where the error occurred.
379 * - > 0 on success. How many bytes were decoded.
380 */
381typedef ssize_t (*fr_dict_attr_decode_func_t)(TALLOC_CTX *ctx, fr_pair_list_t *vps,
382 uint8_t const *data, size_t data_len);
383
384/** A generic interface for encoding fr_pair_ts to packets
385 *
386 * An encoding function should encode multiple VPs to a wire format packet
387 *
388 * Note that unlike #fr_tp_proto_encode_t, this function is NOT passed an encode_ctx. That is because when we
389 * do cross-protocol encoding, the "outer" protocol has no information it can share with the "inner" protocol.
390 *
391 * @param[in] vps vps to encode
392 * @param[in] dbuff buffer where data can be written
393 * @return
394 * - <= 0 on error. May be the offset (as a negative value) where the error occurred.
395 * - > 0 on success. How many bytes were encoded
396 */
398
399/** Init / free callbacks
400 *
401 * Only for "autoref" usage.
402 */
403typedef int (*fr_dict_protocol_init_t)(void);
404typedef void (*fr_dict_protocol_free_t)(void);
405
407
408/** Custom protocol-specific flag parsing function
409 *
410 * @note This function should be used to implement table based flag parsing.
411 *
412 * @param[in] da_p we're currently populating
413 * @param[in] value flag value to parse.
414 * @param[in] rule How to parse the flag.
415 */
417
419 fr_dict_flag_parse_func_t func; //!< Custom parsing function to convert a flag value string to a C type value.
420 void *uctx; //!< Use context to pass to the custom parsing function.
421 bool needs_value; //!< This parsing flag must have a value. Else we error.
422};
423
424/** Copy custom flags from one attribute to another
425 *
426 * @param[out] da_to attribute to copy to. Use for the talloc_ctx for any heap allocated flag values.
427 * @param[out] flags_to protocol specific flags struct to copy to.
428 * @param[in] flags_from protocol specific flags struct to copy from.
429 * @return
430 * - 0 on success.
431 * - -1 on error.
432 */
433typedef int (*fr_dict_flags_copy_func_t)(fr_dict_attr_t *da_to, void *flags_to, void *flags_from);
434
435/** Compare the protocol specific flags struct from two attributes
436 *
437 * @param[in] da_a first attribute to compare.
438 * @param[in] da_b second attribute to compare.
439 * @return
440 * - 0 if the flags are equal.
441 * - < 0 if da_a < da_b.
442 * - > 0 if da_a > da_b.
443 */
444 typedef int (*fr_dict_flags_cmp_func_t)(fr_dict_attr_t const *da_a, fr_dict_attr_t const *da_b);
445
446/** Protocol specific custom flag definitnion
447 *
448 */
449typedef struct {
450 fr_table_elem_name_t name; //!< Name of the flag
451 fr_dict_flag_parser_rule_t value; //!< Function and context to parse the flag.
453
454/** Define a flag setting function, which sets one bit in a fr_dict_attr_flags_t
455 *
456 * This is here, because AFAIK there's no completely portable way to get the bit
457 * offset of a bit field in a structure.
458 */
459#define FR_DICT_ATTR_FLAG_FUNC(_struct, _name) \
460static int dict_flag_##_name(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)\
461{ \
462 _struct *flags = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC); \
463 flags->_name = 1; \
464 return 0; \
465}
466
467/** conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
468 *
469 * @param[in] _struct containing the field to write the result to.
470 * @param[in] _field to write the flag to
471 */
472# define FR_DICT_PROTOCOL_FLAG(_struct, _field) \
473 .type = FR_CTYPE_TO_TYPE((((_struct *)NULL)->_field)), \
474 .offset = offsetof(_struct, _field)
475
476/** Protocol-specific callbacks in libfreeradius-PROTOCOL
477 *
478 */
479typedef struct {
480 char const *name; //!< name of this protocol
481
482 int default_type_size; //!< how many octets are in "type" field
483 int default_type_length; //!< how many octets are in "length" field
484
485 struct {
486 /** Custom flags for this protocol
487 */
488 struct {
489 fr_dict_flag_parser_t const *table; //!< Flags for this protocol, an array of fr_dict_flag_parser_t
490 size_t table_len; //!< Length of protocol_flags table.
491
492 size_t len; //!< Length of the protocol specific flags structure.
493 ///< This is used to allocate a FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC
494 ///< extension of the specified length.
495
496 fr_dict_flags_copy_func_t copy; //!< Copy protocol-specific flags from one attribute to another.
497 ///< Called when copying attributes.
498
499 fr_dict_flags_cmp_func_t cmp; //!< Compare protocol-specific flags from two attributes.
500 ///< Called when comparing attributes by their fields.
501 } flags;
502
503 fr_dict_attr_type_parse_t type_parse; //!< parse unknown type names
504 fr_dict_attr_valid_func_t valid; //!< Validation function to ensure that
505 ///< new attributes are valid.
507
508 fr_dict_protocol_init_t init; //!< initialize the library
509 fr_dict_protocol_free_t free; //!< free the library
510
511 fr_dict_attr_decode_func_t decode; //!< for decoding attributes. Used for implementing foreign
512 ///< protocol attributes.
513 fr_dict_attr_encode_func_t encode; //!< for encoding attributes. Used for implementing foreign
514 ///< protocol attributes.
516
518
519/*
520 * Dictionary constants
521 */
522#define FR_DICT_PROTO_MAX_NAME_LEN (128) //!< Maximum length of a protocol name.
523#define FR_DICT_ENUM_MAX_NAME_LEN (128) //!< Maximum length of a enum value.
524#define FR_DICT_VENDOR_MAX_NAME_LEN (128) //!< Maximum length of a vendor name.
525#define FR_DICT_ATTR_MAX_NAME_LEN (128) //!< Maximum length of a attribute name.
526
527/** Maximum level of TLV nesting allowed
528 */
529#define FR_DICT_TLV_NEST_MAX (24)
530
531/** Maximum TLV stack size
532 *
533 * The additional attributes are to account for
534 *
535 * Root + Vendor + NULL (top frame).
536 * Root + Embedded protocol + Root + Vendor + NULL.
537 *
538 * Code should ensure that it doesn't run off the end of the stack,
539 * as this could be remotely exploitable, using odd nesting.
540 */
541#define FR_DICT_MAX_TLV_STACK (FR_DICT_TLV_NEST_MAX + 5)
542
543/** Characters allowed in a single dictionary attribute name
544 *
545 */
547
548/** Characters allowed in a nested dictionary attribute name
549 *
550 */
552
553/** Characters that are allowed in dictionary enumeration value names
554 *
555 */
557
558/** @name Dictionary structure extensions
559 *
560 * @{
561 */
562#include <freeradius-devel/util/dict_ext.h>
563/** @} */
564
565/** @name Programmatically create dictionary attributes and values
566 *
567 * @{
568 */
570
571int fr_dict_attr_add(fr_dict_t *dict, fr_dict_attr_t const *parent, char const *name, unsigned int attr,
572 fr_type_t type, fr_dict_attr_flags_t const *flags) CC_HINT(nonnull(1,2,3));
573
575 char const *name, fr_type_t type, fr_dict_attr_flags_t const *flags) CC_HINT(nonnull(1,2,3));
576
577int fr_dict_enum_add_name(fr_dict_attr_t *da, char const *name,
578 fr_value_box_t const *value, bool coerce, bool replace);
579
580int fr_dict_enum_add_name_next(fr_dict_attr_t *da, char const *name) CC_HINT(nonnull);
581
582int fr_dict_str_to_argv(char *str, char **argv, int max_argc);
583
584int fr_dict_attr_acopy_local(fr_dict_attr_t const *dst, fr_dict_attr_t const *src) CC_HINT(nonnull);
585
586int fr_dict_attr_set_group(fr_dict_attr_t **da_p, fr_dict_attr_t const *ref) CC_HINT(nonnull);
587/** @} */
588
589/** @name Dict accessors
590 *
591 * @{
592 */
594/** @} */
595
596/** @name Unknown ephemeral attributes
597 *
598 * @{
599 */
600fr_dict_attr_t *fr_dict_attr_unknown_alloc(TALLOC_CTX *ctx, fr_dict_attr_t const *da, fr_type_t type) CC_HINT(nonnull(2));
601
603
605
606fr_dict_attr_t *fr_dict_attr_unknown_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da) CC_HINT(nonnull(2));
607
608static inline fr_dict_attr_t *fr_dict_attr_unknown_copy(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
609{
610 fr_assert(da->flags.is_unknown);
611
612 return fr_dict_attr_unknown_afrom_da(ctx, da);
613}
614
616 fr_dict_attr_t const *parent,
617 unsigned int num, fr_type_t type, bool raw)
618 CC_HINT(nonnull(2));
619
620static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_typed_afrom_num(TALLOC_CTX *ctx,
621 fr_dict_attr_t const *parent,
622 unsigned int num, fr_type_t type)
623{
624 return fr_dict_attr_unknown_typed_afrom_num_raw(ctx, parent, num, type, false);
625}
626
627
628static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_vendor_afrom_num(TALLOC_CTX *ctx,
629 fr_dict_attr_t const *parent,
630 unsigned int vendor)
631{
633}
634
635static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_raw_afrom_num(TALLOC_CTX *ctx,
636 fr_dict_attr_t const *parent,
637 unsigned int attr)
638{
640}
641
642static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_afrom_oid(TALLOC_CTX *ctx,
643 fr_dict_attr_t const *parent,
645{
646 uint32_t num;
648
649 fr_sbuff_out(&sberr, &num, in);
650 if (sberr != FR_SBUFF_PARSE_OK) return NULL;
651
653}
654
655static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_raw_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
656{
658}
659
660
662 fr_dict_attr_t const **out,
663 fr_dict_attr_t const *parent,
665 CC_HINT(nonnull(2,3,4));
666
668
670/** @} */
671
672/** @name Attribute comparisons
673 *
674 * @{
675 */
677
678static inline CC_HINT(nonnull) int8_t fr_dict_attr_cmp(fr_dict_attr_t const *a, fr_dict_attr_t const *b)
679{
680 int8_t ret;
681
682 /*
683 * Comparing unknowns or raws is expensive
684 * because we need to check the lineage.
685 */
686 if (a->flags.is_unknown | a->flags.is_raw | b->flags.is_unknown | b->flags.is_raw) {
687 ret = CMP(a->depth, b->depth);
688 if (ret != 0) return ret;
689
690 ret = CMP(a->attr, b->attr);
691 if (ret != 0) return ret;
692
693 ret = (a->parent == NULL) - (b->parent == NULL);
694 if ((ret != 0) || !a->parent) return ret;
695
696 return fr_dict_attr_cmp(a->parent, b->parent);
697 }
698
699 /*
700 * Comparing knowns is cheap because the
701 * DAs are unique.
702 */
703 return CMP(a, b);
704}
705
706/** Compare two dictionary attributes by their contents
707 *
708 * @param[in] a First attribute to compare.
709 * @param[in] b Second attribute to compare.
710 * @return
711 * - 0 if the attributes are equal.
712 * - -1 if a < b.
713 * - +1 if a > b.
714 */
715static inline CC_HINT(nonnull) int8_t fr_dict_attr_cmp_fields(const fr_dict_attr_t *a, const fr_dict_attr_t *b)
716{
717 int8_t ret;
718 fr_dict_protocol_t const *a_proto = fr_dict_protocol(a->dict);
719
720 /*
721 * Technically this isn't a property of the attribute
722 * but we need them to be the same to be able to
723 * compare protocol specific flags successfully.
724 */
725 ret = CMP(a_proto, fr_dict_protocol(b->dict));
726 if (ret != 0) return ret;
727
728 ret = CMP(a->attr, b->attr);
729 if (ret != 0) return ret;
730
731 ret = CMP(a->parent, b->parent);
732 if (ret != 0) return ret;
733
735 if (ret != 0) return ret;
736
737 /*
738 * Compare protocol specific flags
739 */
740 if (a_proto->attr.flags.cmp && (ret = a_proto->attr.flags.cmp(a, b))) return ret;
741
742 return CMP(memcmp(&a->flags, &b->flags, sizeof(a->flags)), 0);
743}
744/** @} */
745
746/** @name Debugging functions
747 *
748 * @{
749 */
750void fr_dict_namespace_debug(FILE *fp, fr_dict_attr_t const *da);
751
752void fr_dict_attr_debug(FILE *fp, fr_dict_attr_t const *da);
753
754void fr_dict_debug(FILE *fp, fr_dict_t const *dict);
755
756void fr_dict_export(FILE *fp, fr_dict_t const *dict);
757
758void fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent);
759/** @} */
760
761/** @name Attribute lineage
762 *
763 * @{
764 */
765fr_dict_attr_t const *fr_dict_attr_common_parent(fr_dict_attr_t const *a, fr_dict_attr_t const *b, bool is_ancestor);
766
767int fr_dict_oid_component_legacy(unsigned int *out, char const **oid);
768
770 fr_type_t type, fr_dict_attr_flags_t const *flags);
771
773 fr_dict_attr_t const *ancestor, fr_dict_attr_t const *da, bool numeric);
774#define FR_DICT_ATTR_OID_PRINT_RETURN(...) FR_SBUFF_RETURN(fr_dict_attr_oid_print, ##__VA_ARGS__)
775
777 unsigned int *attr, char const *oid) CC_HINT(nonnull);
778
780 fr_dict_attr_t const **out, fr_dict_attr_t const *parent,
781 fr_sbuff_t *in, fr_sbuff_term_t const *tt)
782 CC_HINT(nonnull(2,3,4));
783
785 fr_dict_attr_t const **out, fr_dict_attr_t const *parent,
786 fr_sbuff_t *in, fr_sbuff_term_t const *tt)
787 CC_HINT(nonnull(2,3,4));
788
790 fr_dict_attr_t const *parent, char const *oid)
791 CC_HINT(nonnull(2,3));
792
793bool fr_dict_attr_can_contain(fr_dict_attr_t const *parent, fr_dict_attr_t const *child) CC_HINT(nonnull);
794
795/** @} */
796
797/** @name Attribute, vendor and dictionary lookup
798 *
799 * @{
800 */
801
802/** @hidecallergraph */
803fr_dict_attr_t const *fr_dict_root(fr_dict_t const *dict) CC_HINT(nonnull);
804
805bool fr_dict_is_read_only(fr_dict_t const *dict);
806
807dl_t *fr_dict_dl(fr_dict_t const *dict);
808
810 fr_dict_t const **out, fr_sbuff_t *name, fr_dict_t const *dict_def);
811
812fr_dict_t const *fr_dict_by_protocol_name(char const *name);
813
814fr_dict_t const *fr_dict_by_protocol_num(unsigned int num);
815
816fr_dict_attr_t const *fr_dict_unlocal(fr_dict_attr_t const *da) CC_HINT(nonnull);
817
818fr_dict_t const *fr_dict_proto_dict(fr_dict_t const *dict) CC_HINT(nonnull);
819
820fr_dict_t const *fr_dict_by_da(fr_dict_attr_t const *da) CC_HINT(nonnull);
821
822fr_dict_t const *fr_dict_by_attr_name(fr_dict_attr_t const **found, char const *name);
823
824bool fr_dict_compatible(fr_dict_t const *dict1, fr_dict_t const *dict2) CC_HINT(nonnull);
825
826/** Return true if this attribute is parented directly off the dictionary root
827 *
828 * @param[in] da to check.
829 * @return
830 * - true if attribute is top level.
831 * - false if attribute is not top level.
832 */
833static inline bool fr_dict_attr_is_top_level(fr_dict_attr_t const *da)
834{
835 if (unlikely(!da) || unlikely(!da->parent)) return false;
836 return da->parent->flags.is_root;
837}
838
840
841fr_dict_vendor_t const *fr_dict_vendor_by_name(fr_dict_t const *dict, char const *name);
842
843fr_dict_vendor_t const *fr_dict_vendor_by_num(fr_dict_t const *dict, uint32_t vendor_pen);
844
845fr_dict_attr_t const *fr_dict_vendor_da_by_num(fr_dict_attr_t const *vendor_root, uint32_t vendor_pen);
846
848 fr_dict_t const *dict_def,
849 fr_sbuff_t *name, fr_sbuff_term_t const *tt,
850 bool internal, bool foreign)
851 CC_HINT(nonnull(2, 4));
852
854 fr_dict_t const *dict_def,
855 fr_sbuff_t *name, fr_sbuff_term_t const *tt,
856 bool internal, bool foreign)
857 CC_HINT(nonnull(2, 4));
858
860 fr_dict_t const *dict_def,
861 fr_sbuff_t *in, fr_sbuff_term_t const *tt,
862 bool internal, bool foreign)
863 CC_HINT(nonnull(2, 4));
864
866 fr_dict_t const *dict_def, char const *attr,
867 bool internal, bool foreign)
868 CC_HINT(nonnull(3));
869
871 fr_dict_t const *dict_def,
872 fr_sbuff_t *in, fr_sbuff_term_t const *tt,
873 bool internal, bool foreign)
874 CC_HINT(nonnull(2, 4));
875
877 fr_dict_attr_t const *parent,
878 fr_sbuff_t *name, fr_sbuff_term_t const *tt)
879 CC_HINT(nonnull(2,3,4));
880
882 char const *attr)
883 CC_HINT(nonnull(2,3));
884
886
887typedef fr_hash_iter_t fr_dict_enum_iter_t; /* Alias this in case we want to change it in future */
888
890
892
894
896
897fr_dict_enum_value_t const *fr_dict_enum_by_name(fr_dict_attr_t const *da, char const *name, ssize_t len);
898
900
902 fr_sbuff_t *in, fr_sbuff_term_t const *tt);
903
905 fr_sbuff_t *in, fr_sbuff_term_t const *tt)
907/** @} */
908
909/** @name Dictionary and protocol loading
910 *
911 * @{
912 */
913int fr_dict_internal_afrom_file(fr_dict_t **out, char const *dict_subdir,
914 char const *dependent) CC_HINT(nonnull(1,3));
915
916int fr_dict_protocol_afrom_file(fr_dict_t **out, char const *proto_name, char const *proto_dir,
917 char const *dependent) CC_HINT(nonnull(1,2,4));
918
920
921int fr_dict_protocol_reference(fr_dict_attr_t const **da_p, fr_dict_attr_t const *root, fr_sbuff_t *in) CC_HINT(nonnull);
922
923int fr_dict_read(fr_dict_t *dict, char const *dict_dir, char const *filename) CC_HINT(nonnull(3));
924
925bool fr_dict_filename_loaded(fr_dict_t const *dict, char const *dict_dir, char const *filename) CC_HINT(nonnull(2,3));
926/** @} */
927
928/** @name Autoloader interface
929 *
930 * @{
931 */
932int fr_dict_enum_autoload(fr_dict_enum_autoload_t const *to_load) CC_HINT(nonnull);
933
934int fr_dict_attr_autoload(fr_dict_attr_autoload_t const *to_load) CC_HINT(nonnull);
935
936#define fr_dict_autoload(_to_load) _fr_dict_autoload(_to_load, __FILE__)
937int _fr_dict_autoload(fr_dict_autoload_t const *to_load, char const *dependent);
938
939#define fr_dict_autofree(_to_free) _fr_dict_autofree(_to_free, __FILE__)
940int _fr_dict_autofree(fr_dict_autoload_t const *to_free, char const *dependent);
941
942#define fr_dict_autoload_talloc(_ctx, _dict_out, _proto) _fr_dict_autoload_talloc(_ctx, _dict_out, _proto, __FILE__)
943fr_dict_autoload_talloc_t *_fr_dict_autoload_talloc(TALLOC_CTX *ctx, fr_dict_t const **out, char const *proto, char const *dependent);
944
945int fr_dl_dict_enum_autoload(dl_t const *module, void *symbol, void *uctx) CC_HINT(nonnull(1,2));
946
947int fr_dl_dict_attr_autoload(dl_t const *module, void *symbol, void *uctx) CC_HINT(nonnull(1,2));
948
949int fr_dl_dict_autoload(dl_t const *module, void *symbol, void *uctx) CC_HINT(nonnull(1,2));
950
951void fr_dl_dict_autofree(dl_t const *module, void *symbol, void *uctx) CC_HINT(nonnull(1,2));
952/** @} */
953
954/** @name Allocating and freeing
955 *
956 * @{
957 */
958fr_dict_t *fr_dict_alloc(char const *proto_name, unsigned int proto_number) CC_HINT(nonnull);
959
960int fr_dict_dependent_add(fr_dict_t const *dict, char const *dependent) CC_HINT(nonnull);
961
962int fr_dict_free(fr_dict_t **dict, char const *dependent) CC_HINT(nonnull);
963
964int fr_dict_const_free(fr_dict_t const **dict, char const *dependent) CC_HINT(nonnull);
965/** @} */
966
967/** @name Global dictionary management
968 *
969 * @{
970 */
971fr_dict_gctx_t *fr_dict_global_ctx_init(TALLOC_CTX *ctx, bool free_at_exit, char const *dict_dir) CC_HINT(nonnull(3));
972
973void fr_dict_global_ctx_perm_check(fr_dict_gctx_t *gctx, bool enable) CC_HINT(nonnull);
974
975void fr_dict_global_ctx_set(fr_dict_gctx_t const *gctx) CC_HINT(nonnull);
976
977int fr_dict_global_ctx_free(fr_dict_gctx_t const *gctx) CC_HINT(nonnull);
978
979int fr_dict_global_ctx_dir_set(char const *dict_dir) CC_HINT(nonnull);
980
982
983void fr_dict_gctx_debug(FILE *fp, fr_dict_gctx_t const *gctx) CC_HINT(nonnull(1));
984
985char const *fr_dict_global_ctx_dir(void);
986
988
990
992
993fr_dict_t *fr_dict_unconst(fr_dict_t const *dict) CC_HINT(nonnull);
994
996
997fr_dict_t const *fr_dict_internal(void);
998
999/** @} */
1000
1001/** @name Dictionary testing and validation
1002 *
1003 * @{
1004 */
1005void dict_dctx_debug(dict_tokenize_ctx_t *dctx) CC_HINT(nonnull);
1006
1007int fr_dict_parse_str(fr_dict_t *dict, char const *str,
1008 fr_dict_attr_t const *parent) CC_HINT(nonnull(2,3));
1009
1010ssize_t fr_dict_valid_name(char const *name, ssize_t len) CC_HINT(nonnull);
1011
1012ssize_t fr_dict_valid_oid_str(char const *name, ssize_t len) CC_HINT(nonnull);
1013
1015 fr_dict_attr_t const **prev) CC_HINT(nonnull);
1016
1017typedef int (*fr_dict_walk_t)(fr_dict_attr_t const *da, void *uctx);
1018
1019int fr_dict_walk(fr_dict_attr_t const *da, fr_dict_walk_t callback, void *uctx) CC_HINT(nonnull(1,2));
1020
1021void fr_dict_attr_verify(char const *file, int line, fr_dict_attr_t const *da) CC_HINT(nonnull);
1022char const *fr_dict_attr_filename(fr_dict_attr_t const *da) CC_HINT(nonnull);
1023/** @} */
1024
1025static_assert(FR_DICT_MAX_TLV_STACK <= UINT8_MAX, "FR_DICT_MAX_TLV_STACK is too large");
1026static_assert(sizeof(fr_dict_attr_t) <= 64, "fr_dict_attr_t grew past one 64 byte x86 cache line");
1027static_assert(FR_DICT_ATTR_MAX_NAME_LEN <= UINT8_MAX, "FR_DICT_ATTR_MAX_NAME_LEN is too large");
1028
1029#undef _CONST
1030
1031#ifdef __cplusplus
1032}
1033#endif
#define RCSIDH(h, id)
Definition build.h:561
#define CMP(_a, _b)
Same as CMP_PREFER_SMALLER use when you don't really care about ordering, you just want an ordering.
Definition build.h:113
#define unlikely(_x)
Definition build.h:455
#define UNUSED
Definition build.h:384
fr_table_elem_name_t name
Name of the flag.
Definition dict.h:450
fr_dict_t * fr_dict_global_ctx_iter_next(fr_dict_global_ctx_iter_t *iter)
Definition dict_util.c:5000
bool continuation
we only have one flag for now, for WiMAX
Definition dict.h:295
size_t type
Length of type data.
Definition dict.h:296
fr_dict_t const * fr_dict_by_attr_name(fr_dict_attr_t const **found, char const *name)
int fr_dict_attr_set_group(fr_dict_attr_t **da_p, fr_dict_attr_t const *ref)
Definition dict_util.c:5391
fr_dict_protocol_free_t free
free the library
Definition dict.h:509
void fr_dict_namespace_debug(FILE *fp, fr_dict_attr_t const *da)
Definition dict_print.c:240
size_t name_len
Allows for efficient name lookups when operating on partial buffers.
Definition dict.h:279
fr_dict_attr_flags_t flags
Flags.
Definition dict.h:237
fr_dict_attr_decode_func_t decode
for decoding attributes.
Definition dict.h:511
int(* fr_dict_flag_parse_func_t)(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule)
Custom protocol-specific flag parsing function.
Definition dict.h:416
fr_slen_t fr_dict_attr_by_name_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_attr_t const *parent, fr_sbuff_t *name, fr_sbuff_term_t const *tt))
int fr_dict_attr_add_initialised(fr_dict_attr_t *da)
A variant of fr_dict_attr_t that allows a pre-allocated, populated fr_dict_attr_t to be added.
Definition dict_util.c:1897
char const * name
of the attribute.
Definition dict.h:321
unsigned int name_only
this attribute should always be referred to by name.
Definition dict.h:100
ssize_t fr_dict_valid_oid_str(char const *name, ssize_t len)
Definition dict_util.c:5089
int fr_dict_global_ctx_dir_set(char const *dict_dir)
Allow the default dict dir to be changed after initialisation.
Definition dict_util.c:4907
fr_slen_t fr_dict_enum_name_from_substr(fr_sbuff_t *out, fr_sbuff_parse_error_t *err, fr_sbuff_t *in, fr_sbuff_term_t const *tt)
Extract an enumeration name from a string.
Definition dict_util.c:3902
int fr_dict_enum_add_name(fr_dict_attr_t *da, char const *name, fr_value_box_t const *value, bool coerce, bool replace)
Add a value name.
Definition dict_util.c:2272
fr_dict_attr_t const * fr_dict_attr_search_by_qualified_oid(fr_dict_attr_err_t *err, fr_dict_t const *dict_def, char const *attr, bool internal, bool foreign))
Locate a qualified fr_dict_attr_t by its name and a dictionary qualifier.
Definition dict_util.c:3419
fr_dict_attr_t const * fr_dict_attr_unknown_resolve(fr_dict_t const *dict, fr_dict_attr_t const *da)
Check to see if we can convert a nested TLV structure to known attributes.
unsigned int has_value
Has a value.
Definition dict.h:94
fr_dict_enum_ext_t
Extension identifier.
Definition dict.h:261
@ FR_DICT_ENUM_EXT_MAX
Definition dict.h:263
@ FR_DICT_ENUM_EXT_ATTR_REF
Reference to a child attribute associated with this key value.
Definition dict.h:262
fr_slen_t fr_dict_attr_oid_print(fr_sbuff_t *out, fr_dict_attr_t const *ancestor, fr_dict_attr_t const *da, bool numeric)
Build the da_stack for the specified DA and encode the path by name in OID form.
int fr_dict_attr_add_name_only(fr_dict_t *dict, fr_dict_attr_t const *parent, char const *name, fr_type_t type, fr_dict_attr_flags_t const *flags))
Add an attribute to the dictionary.
Definition dict_util.c:2062
char const * name
Vendor name.
Definition dict.h:298
unsigned int is_ref_target
is the target of a ref, and cannot be moved.
Definition dict.h:109
fr_dict_t * fr_dict_unconst(fr_dict_t const *dict)
Coerce to non-const.
Definition dict_util.c:5011
void * uctx
Use context to pass to the custom parsing function.
Definition dict.h:420
fr_dict_attr_t const ** attr
The protocol dictionary the attribute should be resolved in.
Definition dict.h:306
fr_dict_t const * fr_dict_by_da(fr_dict_attr_t const *da)
Attempt to locate the protocol dictionary containing an attribute.
Definition dict_util.c:2937
int fr_dl_dict_enum_autoload(dl_t const *module, void *symbol, void *uctx))
unsigned int is_root
Is root of a dictionary.
Definition dict.h:75
int fr_dict_enum_autoload(fr_dict_enum_autoload_t const *to_load)
Process a dict_attr_autoload element to load/verify a dictionary attribute.
Definition dict_util.c:4464
fr_dict_enum_value_t const * fr_dict_enum_iter_init(fr_dict_attr_t const *da, fr_dict_enum_iter_t *iter)
Iterate over all enumeration values for an attribute.
Definition dict_util.c:3689
int _fr_dict_autofree(fr_dict_autoload_t const *to_free, char const *dependent)
Decrement the reference count on a previously loaded dictionary.
Definition dict_util.c:4601
fr_dict_attr_t const * fr_dict_unlocal(fr_dict_attr_t const *da)
Definition dict_util.c:5368
bool const fr_dict_attr_nested_allowed_chars[SBUFF_CHAR_CLASS]
Characters allowed in a nested dictionary attribute name.
Definition dict_util.c:63
fr_dict_attr_t const * fr_dict_attr_common_parent(fr_dict_attr_t const *a, fr_dict_attr_t const *b, bool is_ancestor)
Find a common ancestor that two TLV type attributes share.
Definition dict_util.c:2368
bool const fr_dict_attr_allowed_chars[SBUFF_CHAR_CLASS]
Characters allowed in a single dictionary attribute name.
Definition dict_util.c:56
bool(* fr_dict_attr_valid_func_t)(fr_dict_attr_t *da)
Definition dict.h:357
static fr_slen_t err
Definition dict.h:906
fr_dict_t * fr_dict_alloc(char const *proto_name, unsigned int proto_number)
fr_dict_t const * fr_dict_proto_dict(fr_dict_t const *dict)
Definition dict_util.c:5384
@ FLAG_EXTRA_NONE
no extra meaning, should be invalid
Definition dict.h:163
@ FLAG_LENGTH_UINT8
string / octets type is prefixed by uint8 of length
Definition dict.h:166
@ FLAG_LENGTH_UINT16
string / octets type is prefixed by uint16 of length
Definition dict.h:167
@ FLAG_KEY_FIELD
this is a key field for a subsequent struct
Definition dict.h:164
@ FLAG_BIT_FIELD
bit field inside of a struct
Definition dict.h:165
unsigned int has_fixup
Definition dict.h:124
static fr_dict_attr_t * fr_dict_attr_unknown_vendor_afrom_num(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, unsigned int vendor)
Definition dict.h:628
void fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent)
Definition dict_print.c:324
static fr_dict_attr_t * fr_dict_attr_unknown_raw_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
Definition dict.h:655
static fr_dict_attr_t * fr_dict_attr_unknown_afrom_oid(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, fr_sbuff_t *in, fr_type_t type)
Definition dict.h:642
uint8_t name_len
Length of the name.
Definition dict.h:215
static fr_dict_attr_t * fr_dict_attr_unknown_copy(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
Definition dict.h:608
int8_t fr_dict_attr_ordered_cmp(fr_dict_attr_t const *a, fr_dict_attr_t const *b)
Compare two attributes by total order.
Definition dict_util.c:203
fr_dict_protocol_t const * fr_dict_protocol(fr_dict_t const *dict)
Return the protocol descriptor for the dictionary.
Definition dict_util.c:5360
int fr_dict_protocol_reference(fr_dict_attr_t const **da_p, fr_dict_attr_t const *root, fr_sbuff_t *in)
Resolve a reference string to a dictionary attribute.
Definition dict_fixup.c:135
ssize_t(* fr_dict_attr_encode_func_t)(fr_dbuff_t *dbuff, fr_pair_list_t const *vps)
A generic interface for encoding fr_pair_ts to packets.
Definition dict.h:397
fr_dict_attr_t const * fr_dict_attr_unknown_add(fr_dict_t *dict, fr_dict_attr_t const *old)
Converts an unknown to a known by adding it to the internal dictionaries.
uint16_t file
Id of the file where the attribute was defined.
Definition dict.h:251
int fr_dict_attr_acopy_local(fr_dict_attr_t const *dst, fr_dict_attr_t const *src)
Definition dict_util.c:1181
fr_dict_attr_t const * fr_dict_attr_by_name(fr_dict_attr_err_t *err, fr_dict_attr_t const *parent, char const *attr))
Locate a fr_dict_attr_t by its name.
Definition dict_util.c:3601
int fr_dict_internal_afrom_file(fr_dict_t **out, char const *dict_subdir, char const *dependent))
(Re-)Initialize the special internal dictionary
fr_dict_autoload_talloc_t * _fr_dict_autoload_talloc(TALLOC_CTX *ctx, fr_dict_t const **out, char const *proto, char const *dependent)
Autoload a dictionary and bind the lifetime to a talloc chunk.
Definition dict_util.c:4652
bool const fr_dict_enum_allowed_chars[SBUFF_CHAR_CLASS]
Characters that are allowed in dictionary enumeration value names.
Definition dict_util.c:71
bool fr_dict_compatible(fr_dict_t const *dict1, fr_dict_t const *dict2)
See if two dictionaries have the same end parent.
Definition dict_util.c:2950
int(* fr_dict_flags_cmp_func_t)(fr_dict_attr_t const *da_a, fr_dict_attr_t const *da_b)
Compare the protocol specific flags struct from two attributes.
Definition dict.h:444
void fr_dict_debug(FILE *fp, fr_dict_t const *dict)
Definition dict_print.c:278
fr_value_box_t const ** out
Enumeration value.
Definition dict.h:305
fr_dict_attr_t * fr_dict_attr_unconst(fr_dict_attr_t const *da)
Coerce to non-const.
Definition dict_util.c:5023
fr_dict_attr_t * fr_dict_attr_unknown_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da))
Copy a known or unknown attribute to produce an unknown attribute with the specified name.
fr_dict_t const ** dict
The protocol dictionary the attribute should be resolved in.
Definition dict.h:318
fr_slen_t fr_dict_attr_by_oid_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_attr_t const *parent, fr_sbuff_t *in, fr_sbuff_term_t const *tt))
Resolve an attribute using an OID string.
Definition dict_util.c:2644
fr_dict_attr_t * fr_dict_attr_unknown_alloc(TALLOC_CTX *ctx, fr_dict_attr_t const *da, fr_type_t type))
Allocate an unknown DA.
void fr_dict_gctx_debug(FILE *fp, fr_dict_gctx_t const *gctx))
Dump information about currently loaded dictionaries.
Definition dict_util.c:4954
static fr_dict_attr_t * fr_dict_attr_unknown_raw_afrom_num(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, unsigned int attr)
Definition dict.h:635
void fr_dict_attr_verify(char const *file, int line, fr_dict_attr_t const *da)
Definition dict_util.c:5207
int fr_dict_str_to_argv(char *str, char **argv, int max_argc)
bool fr_dict_attr_can_contain(fr_dict_attr_t const *parent, fr_dict_attr_t const *child)
See if a structural da is allowed to contain another da.
Definition dict_util.c:5297
fr_slen_t fr_dict_attr_by_oid_legacy(fr_dict_attr_t const **parent, unsigned int *attr, char const *oid)
Get the leaf attribute of an OID string.
Definition dict_util.c:2454
fr_slen_t fr_dict_attr_flags_print(fr_sbuff_t *out, fr_dict_t const *dict, fr_type_t type, fr_dict_attr_flags_t const *flags)
fr_dict_t * fr_dict_global_ctx_iter_init(fr_dict_global_ctx_iter_t *iter)
Iterate protocols by name.
Definition dict_util.c:4993
struct dict_attr_s::@130 state
int(* fr_dict_walk_t)(fr_dict_attr_t const *da, void *uctx)
Definition dict.h:1017
void fr_dl_dict_autofree(dl_t const *module, void *symbol, void *uctx))
unsigned int array
Pack multiples into 1 attr.
Definition dict.h:90
unsigned int secret
this attribute should be omitted in debug mode
Definition dict.h:105
fr_dict_attr_t const * fr_dict_root(fr_dict_t const *dict)
Return the root attribute of a dictionary.
Definition dict_util.c:2720
fr_dict_flag_parse_func_t func
Custom parsing function to convert a flag value string to a C type value.
Definition dict.h:419
int fr_dict_walk(fr_dict_attr_t const *da, fr_dict_walk_t callback, void *uctx))
Definition dict_util.c:5201
fr_dict_attr_t const * fr_dict_vendor_da_by_num(fr_dict_attr_t const *vendor_root, uint32_t vendor_pen)
Return vendor attribute for the specified dictionary and pen.
Definition dict_util.c:3033
unsigned int extra
really "subtype is used by dict, not by protocol"
Definition dict.h:118
unsigned int internal
Internal attribute, should not be received in protocol packets, should not be encoded.
Definition dict.h:88
fr_dict_attr_t const ** out
Where to write a pointer to the resolved fr_dict_attr_t.
Definition dict.h:316
fr_dict_t const ** out
Where to write a pointer to the loaded/resolved fr_dict_t.
Definition dict.h:329
void fr_dict_global_ctx_set(fr_dict_gctx_t const *gctx)
Set a new, active, global dictionary context.
Definition dict_util.c:4877
fr_dict_attr_t const * next
Next child in bin.
Definition dict.h:204
fr_dict_t _CONST *_CONST dict
Dict attribute belongs to.
Definition dict.h:202
fr_slen_t fr_dict_attr_search_by_oid_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_t const *dict_def, fr_sbuff_t *in, fr_sbuff_term_t const *tt, bool internal, bool foreign))
Locate a qualified fr_dict_attr_t by a dictionary using a non-qualified OID string.
Definition dict_util.c:3400
char const * name
Attribute name.
Definition dict.h:212
unsigned int unsafe
e.g. Cleartext-Password
Definition dict.h:107
fr_dict_protocol_init_t init
initialize the library
Definition dict.h:508
unsigned int is_raw
This dictionary attribute was constructed from a known attribute to allow the user to assign octets v...
Definition dict.h:80
struct fr_dict_protocol_t::@131 attr
int fr_dict_attr_unknown_parent_to_known(fr_dict_attr_t *da, fr_dict_attr_t const *parent)
Fixup the parent of an unknown attribute using an equivalent known attribute.
char const * name
of the attribute.
Definition dict.h:309
dl_t * fr_dict_dl(fr_dict_t const *dict)
Definition dict_util.c:2730
fr_value_box_t const * value
Enum value (what name maps to).
Definition dict.h:281
void fr_dict_attr_debug(FILE *fp, fr_dict_attr_t const *da)
Definition dict_print.c:264
unsigned int attr
Attribute number.
Definition dict.h:213
int fr_dict_read(fr_dict_t *dict, char const *dict_dir, char const *filename))
Read supplementary attribute definitions into an existing dictionary.
char const * fr_dict_enum_name_by_value(fr_dict_attr_t const *da, fr_value_box_t const *value)
Lookup the name of an enum value in a fr_dict_attr_t.
Definition dict_util.c:3766
fr_dict_enum_value_t const * fr_dict_enum_iter_next(fr_dict_attr_t const *da, fr_dict_enum_iter_t *iter)
Definition dict_util.c:3710
int fr_dict_enum_add_name_next(fr_dict_attr_t *da, char const *name)
Add an name to an integer attribute hashing the name for the integer value.
Definition dict_util.c:2284
uint8_t ext[FR_DICT_ATTR_EXT_MAX]
Extensions to the dictionary attribute.
Definition dict.h:243
int(* fr_dict_flags_copy_func_t)(fr_dict_attr_t *da_to, void *flags_to, void *flags_from)
Copy custom flags from one attribute to another.
Definition dict.h:433
int default_type_size
how many octets are in "type" field
Definition dict.h:482
uint32_t pen
Private enterprise number.
Definition dict.h:294
int fr_dl_dict_attr_autoload(dl_t const *module, void *symbol, void *uctx))
int fr_dict_free(fr_dict_t **dict, char const *dependent)
Decrement the reference count on a previously loaded dictionary.
Definition dict_util.c:4437
void fr_dict_attr_unknown_free(fr_dict_attr_t const **da)
Free dynamically allocated (unknown attributes)
fr_dict_enum_value_t const * fr_dict_enum_by_value(fr_dict_attr_t const *da, fr_value_box_t const *value)
Lookup the structure representing an enum value in a fr_dict_attr_t.
Definition dict_util.c:3730
fr_type_t type
of the attribute. Mismatch is a fatal error.
Definition dict.h:322
fr_dict_flag_parser_rule_t value
Function and context to parse the flag.
Definition dict.h:451
#define _CONST
Definition dict.h:58
int fr_dict_oid_component_legacy(unsigned int *out, char const **oid)
Process a single OID component.
Definition dict_util.c:2411
fr_slen_t fr_dict_enum_by_name_substr(fr_dict_enum_value_t **out, fr_dict_attr_t const *da, fr_sbuff_t *in)
Definition dict_util.c:3808
void fr_dict_global_ctx_perm_check(fr_dict_gctx_t *gctx, bool enable)
Set whether we check dictionary file permissions.
Definition dict_util.c:4868
void fr_dict_global_ctx_read_only(void)
Mark all dictionaries and the global dictionary ctx as read only.
Definition dict_util.c:4927
uint8_t type_size
Type size for TLVs.
Definition dict.h:144
int fr_dict_const_free(fr_dict_t const **dict, char const *dependent)
Decrement the reference count on a previously loaded dictionary.
Definition dict_util.c:4421
int fr_dict_attr_autoload(fr_dict_attr_autoload_t const *to_load)
Process a dict_attr_autoload element to load/verify a dictionary attribute.
Definition dict_util.c:4503
fr_dict_t const * fr_dict_internal(void)
Definition dict_util.c:5036
bool(* fr_dict_attr_type_parse_t)(fr_type_t *type, fr_dict_attr_t **da_p, char const *name)
Definition dict.h:358
fr_slen_t fr_dict_by_protocol_substr(fr_dict_attr_err_t *err, fr_dict_t const **out, fr_sbuff_t *name, fr_dict_t const *dict_def)
Look up a protocol name embedded in another string.
Definition dict_util.c:2820
int fr_dict_dependent_add(fr_dict_t const *dict, char const *dependent)
Manually increase the reference count for a dictionary.
Definition dict_util.c:4077
fr_slen_t fr_dict_attr_search_by_qualified_name_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_t const *dict_def, fr_sbuff_t *name, fr_sbuff_term_t const *tt, bool internal, bool foreign))
Locate a qualified fr_dict_attr_t by its name and a dictionary qualifier.
Definition dict_util.c:3313
int fr_dict_protocol_afrom_file(fr_dict_t **out, char const *proto_name, char const *proto_dir, char const *dependent))
(Re)-initialize a protocol dictionary
bool fr_dict_filename_loaded(fr_dict_t const *dict, char const *dict_dir, char const *filename))
size_t length
Length of length data.
Definition dict.h:297
char const * fr_dict_attr_filename(fr_dict_attr_t const *da)
Resolve an attribute's location file id to the filename.
Definition dict_util.c:795
fr_dict_t const * fr_dict_by_protocol_name(char const *name)
Lookup a protocol by its name.
Definition dict_util.c:2908
bool fr_dict_is_read_only(fr_dict_t const *dict)
Definition dict_util.c:2725
char const * base_dir
Directory structure beneath share.
Definition dict.h:331
fr_dict_attr_t const * parent
Immediate parent of this attribute.
Definition dict.h:203
fr_slen_t fr_dict_attr_unknown_afrom_oid_substr(TALLOC_CTX *ctx, fr_dict_attr_t const **out, fr_dict_attr_t const *parent, fr_sbuff_t *in, fr_type_t type))
Create a fr_dict_attr_t from an ASCII attribute and value.
fr_slen_t fr_dict_attr_search_by_name_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_t const *dict_def, fr_sbuff_t *name, fr_sbuff_term_t const *tt, bool internal, bool foreign))
Locate a fr_dict_attr_t by its name in the top level namespace of a dictionary.
Definition dict_util.c:3342
static bool fr_dict_attr_is_top_level(fr_dict_attr_t const *da)
Return true if this attribute is parented directly off the dictionary root.
Definition dict.h:833
void(* fr_dict_protocol_free_t)(void)
Definition dict.h:404
uint16_t length
length of the attribute
Definition dict.h:153
fr_dict_attr_encode_func_t encode
for encoding attributes.
Definition dict.h:513
char const * fr_dict_global_ctx_dir(void)
Definition dict_util.c:4918
unsigned int local
is a local variable
Definition dict.h:120
fr_dict_attr_ext_t
Extension identifier.
Definition dict.h:181
@ FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC
Protocol specific extensions.
Definition dict.h:190
@ FR_DICT_ATTR_EXT_MAX
Definition dict.h:191
@ FR_DICT_ATTR_EXT_ENUMV
Enumeration values.
Definition dict.h:188
@ FR_DICT_ATTR_EXT_NAMESPACE
Attribute has its own namespace.
Definition dict.h:189
@ FR_DICT_ATTR_EXT_REF
Attribute references another attribute and/or dictionary.
Definition dict.h:184
@ FR_DICT_ATTR_EXT_KEY
UNION attribute references a key.
Definition dict.h:186
@ FR_DICT_ATTR_EXT_VENDOR
Cached vendor pointer.
Definition dict.h:187
@ FR_DICT_ATTR_EXT_NAME
Name of the attribute.
Definition dict.h:182
@ FR_DICT_ATTR_EXT_CHILDREN
Attribute has children.
Definition dict.h:183
static fr_slen_t fr_dict_enum_name_afrom_substr(TALLOC_CTX *ctx, char **out, fr_sbuff_parse_error_t *err, fr_sbuff_t *in, fr_sbuff_term_t const *tt) 1(fr_dict_enum_name_from_substr
int fr_dict_global_ctx_free(fr_dict_gctx_t const *gctx)
Explicitly free all data associated with a global dictionary context.
Definition dict_util.c:4893
unsigned int is_known_width
is treated as if it has a known width for structs
Definition dict.h:92
uint16_t line
Line number where the attribute was defined.
Definition dict.h:253
uint8_t depth
Depth of nesting for this attribute.
Definition dict.h:216
#define FR_DICT_MAX_TLV_STACK
Maximum TLV stack size.
Definition dict.h:541
int default_type_length
how many octets are in "length" field
Definition dict.h:483
fr_dict_attr_err_t
Errors returned by attribute lookup functions.
Definition dict.h:341
@ FR_DICT_ATTR_OK
No error.
Definition dict.h:342
@ FR_DICT_ATTR_NOT_ANCESTOR
Attribute is not an ancestor of the child attribute.
Definition dict.h:350
@ FR_DICT_ATTR_NOT_DESCENDENT
Attribute is not a descendent of the parent attribute.
Definition dict.h:348
@ FR_DICT_ATTR_NOTFOUND
Attribute couldn't be found.
Definition dict.h:343
@ FR_DICT_ATTR_EINVAL
Invalid arguments.
Definition dict.h:353
@ FR_DICT_ATTR_PROTOCOL_NOTFOUND
Protocol couldn't be found.
Definition dict.h:344
@ FR_DICT_ATTR_NO_CHILDREN
Child lookup in attribute with no children.
Definition dict.h:352
@ FR_DICT_ATTR_OOM
Memory allocation error.
Definition dict.h:347
@ FR_DICT_ATTR_PARSE_ERROR
Attribute string couldn't be parsed.
Definition dict.h:345
@ FR_DICT_ATTR_INTERNAL_ERROR
Internal error occurred.
Definition dict.h:346
fr_slen_t fr_dict_attr_search_by_qualified_oid_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_t const *dict_def, fr_sbuff_t *in, fr_sbuff_term_t const *tt, bool internal, bool foreign))
Locate a qualified fr_dict_attr_t by a dictionary qualified OID string.
Definition dict_util.c:3371
fr_dict_vendor_t const * fr_dict_vendor_by_name(fr_dict_t const *dict, char const *name)
Look up a vendor by its name.
Definition dict_util.c:2991
int(* fr_dict_protocol_init_t)(void)
Init / free callbacks.
Definition dict.h:403
bool needs_value
This parsing flag must have a value. Else we error.
Definition dict.h:421
fr_dict_attr_t const * fr_dict_attr_iterate_children(fr_dict_attr_t const *parent, fr_dict_attr_t const **prev)
Iterate over children of a DA.
Definition dict_util.c:5122
int fr_dict_attr_add(fr_dict_t *dict, fr_dict_attr_t const *parent, char const *name, unsigned int attr, fr_type_t type, fr_dict_attr_flags_t const *flags))
Add an attribute to the dictionary.
Definition dict_util.c:2023
int fr_dict_parse_str(fr_dict_t *dict, char const *str, fr_dict_attr_t const *parent))
fr_dict_attr_t const * fr_dict_attr_by_oid(fr_dict_attr_err_t *err, fr_dict_attr_t const *parent, char const *oid))
Resolve an attribute using an OID string.
Definition dict_util.c:2693
int _fr_dict_autoload(fr_dict_autoload_t const *to_load, char const *dependent)
Process a dict_autoload element to load a protocol.
Definition dict_util.c:4568
unsigned int is_unsigned
hackity hack for dates and time deltas
Definition dict.h:96
static fr_dict_attr_t * fr_dict_attr_unknown_typed_afrom_num(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, unsigned int num, fr_type_t type)
Definition dict.h:620
fr_dict_vendor_t const * fr_dict_vendor_by_num(fr_dict_t const *dict, uint32_t vendor_pen)
Look up a vendor by its PEN.
Definition dict_util.c:3014
fr_hash_iter_t fr_dict_enum_iter_t
Definition dict.h:887
ssize_t fr_dict_valid_name(char const *name, ssize_t len)
Definition dict_util.c:5046
int fr_dl_dict_autoload(dl_t const *module, void *symbol, void *uctx))
fr_dict_t * fr_dict_protocol_alloc(fr_dict_t const *parent)
Allocate a new local dictionary.
Definition dict_util.c:4367
fr_slen_t fr_dict_oid_component(fr_dict_attr_err_t *err, fr_dict_attr_t const **out, fr_dict_attr_t const *parent, fr_sbuff_t *in, fr_sbuff_term_t const *tt))
Parse an OID component, resolving it to a defined attribute.
Definition dict_util.c:2545
ssize_t(* fr_dict_attr_decode_func_t)(TALLOC_CTX *ctx, fr_pair_list_t *vps, uint8_t const *data, size_t data_len)
A generic interface for decoding packets to fr_pair_ts.
Definition dict.h:381
fr_dict_attr_t const * fr_dict_attr_child_by_num(fr_dict_attr_t const *parent, unsigned int attr)
Check if a child attribute exists in a parent using an attribute number.
Definition dict_util.c:3668
char const * proto
The protocol dictionary name.
Definition dict.h:332
fr_dict_gctx_t * fr_dict_global_ctx_init(TALLOC_CTX *ctx, bool free_at_exit, char const *dict_dir))
Initialise the global protocol hashes.
Definition dict_util.c:4821
fr_dict_attr_t * fr_dict_attr_unknown_typed_afrom_num_raw(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, unsigned int num, fr_type_t type, bool raw))
Initialise a fr_dict_attr_t from a number and a data type.
fr_dict_enum_value_t const * fr_dict_enum_by_name(fr_dict_attr_t const *da, char const *name, ssize_t len)
Definition dict_util.c:3779
char const * name
Enum name.
Definition dict.h:278
static fr_slen_t in
Definition dict.h:906
fr_type_t type
Value type.
Definition dict.h:214
char const * name
name of this protocol
Definition dict.h:480
#define FR_DICT_ATTR_MAX_NAME_LEN
Maximum length of a attribute name.
Definition dict.h:525
struct dict_attr_s fr_dict_attr_t
Definition dict.h:46
unsigned int has_alias
this attribute has an alias.
Definition dict.h:87
fr_dict_t const * fr_dict_by_protocol_num(unsigned int num)
Lookup a protocol by its number.
Definition dict_util.c:2921
uint8_t subtype
needs a fixup during dictionary parsing
Definition dict.h:131
static int8_t fr_dict_attr_cmp_fields(const fr_dict_attr_t *a, const fr_dict_attr_t *b)
Compare two dictionary attributes by their contents.
Definition dict.h:715
unsigned int is_alias
This isn't a real attribute, it's a reference to to one.
Definition dict.h:85
fr_dict_vendor_t const * fr_dict_vendor_by_da(fr_dict_attr_t const *da)
Look up a vendor by one of its child attributes.
Definition dict_util.c:2966
unsigned int counter
integer attribute is actually an impulse / counter
Definition dict.h:98
unsigned int is_unknown
This dictionary attribute is ephemeral and not part of the main dictionary.
Definition dict.h:77
fr_dict_attr_t const * da
the child structure referenced by this value of key
Definition dict.h:270
unsigned int allow_flat
only for FR_TYPE_GROUP, can contain "flat" lists.
Definition dict.h:122
void dict_dctx_debug(dict_tokenize_ctx_t *dctx)
void fr_dict_export(FILE *fp, fr_dict_t const *dict)
Export in the standard form: ATTRIBUTE name oid flags.
Definition dict_print.c:319
static int8_t fr_dict_attr_cmp(fr_dict_attr_t const *a, fr_dict_attr_t const *b)
Definition dict.h:678
Dictionary attribute.
Definition dict.h:196
Specifies an attribute which must be present for the module to function.
Definition dict.h:315
Values of the encryption flags.
Specifies a dictionary which must be loaded/loadable for the module to function.
Definition dict.h:328
Specifies a value which must be present for the module to function.
Definition dict.h:304
Enum extension - Sub-struct or union pointer.
Definition dict.h:269
Value of an enumerated attribute.
Definition dict.h:277
Protocol specific custom flag definitnion.
Definition dict.h:449
Protocol-specific callbacks in libfreeradius-PROTOCOL.
Definition dict.h:479
Private enterprise.
Definition dict.h:293
static uint32_t fr_dict_vendor_num_by_da(fr_dict_attr_t const *da)
Return the vendor number for an attribute.
Definition dict_ext.h:177
fr_dict_t * internal
Magic internal dictionary.
Definition dict_priv.h:172
bool free_at_exit
This gctx will be freed on exit.
Definition dict_priv.h:147
Vendors and attribute names.
Definition dict_priv.h:98
Test enumeration values.
Definition dict_test.h:92
Structure used to managed the lifetime of a dictionary.
Definition dict_util.c:4625
Module handle.
Definition dl.h:57
Definition dwarf.c:424
Definition dwarf.c:563
#define FR_EXT_ALIGNMENT
The alignment of object extension structures.
Definition ext.h:54
Stores the state of the current iteration operation.
Definition hash.h:41
unsigned short uint16_t
fr_type_t
@ FR_TYPE_VENDOR
Attribute that represents a vendor in the attribute tree.
@ FR_TYPE_OCTETS
Raw octets.
unsigned int uint32_t
long int ssize_t
unsigned char bool
unsigned char uint8_t
ssize_t fr_slen_t
#define UINT8_MAX
fr_sbuff_parse_error_t
@ FR_SBUFF_PARSE_OK
No error.
static int type_parse(TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
#define fr_assert(_expr)
Definition rad_assert.h:37
static char const * name
#define SBUFF_CHAR_CLASS
Definition sbuff.h:203
#define fr_sbuff_out(_err, _out, _in)
#define SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(_func,...)
Set of terminal elements.
fr_aka_sim_id_type_t type
static fr_slen_t parent
Definition pair.h:860
static fr_slen_t data
Definition value.h:1367
int nonnull(2, 5))
static size_t char ** out
Definition value.h:1062
Union containing all data types supported by the server.
Definition value.h:204