The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
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#include "lib/util/hash.h"
25RCSIDH(dict_h, "$Id: a78710efa40806acb6cf01243c2f9cd44c88c74b $")
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/rb.h>
36#include <freeradius-devel/util/sbuff.h>
37#include <freeradius-devel/util/table.h>
38#include <freeradius-devel/util/talloc.h>
39#include <freeradius-devel/util/types.h>
40
41#include <stdbool.h>
42#include <stdint.h>
43
44/*
45 * Avoid circular type references.
46 */
48typedef struct fr_dict_s fr_dict_t;
49
51
52/*
53 * Allow public and private versions of the same structures
54 */
55#ifdef _CONST
56# error _CONST can only be defined in the local header
57#endif
58#ifndef _DICT_PRIVATE
59# define _CONST const
60#else
61# define _CONST
62#endif
63
64#ifdef WITH_VERIFY_PTR
65# define DA_VERIFY(_x) fr_dict_attr_verify(__FILE__, __LINE__, _x)
66#else
67# define DA_VERIFY(_x) fr_cond_assert(_x)
68#endif
69
72
73/** Values of the encryption flags
74 */
75typedef struct {
76 unsigned int is_root : 1; //!< Is root of a dictionary.
77
78 unsigned int is_unknown : 1; //!< This dictionary attribute is ephemeral
79 ///< and not part of the main dictionary.
80
81 unsigned int is_raw : 1; //!< This dictionary attribute was constructed
82 ///< from a known attribute to allow the user
83 ///< to assign octets values directly.
84 ///< See .is_unknown to determine if it is
85 ///< ephemeral.
86 unsigned int is_alias : 1; //!< This isn't a real attribute, it's a reference to
87 ///< to one.
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 /*
110 * @todo - if we want to clean these fields up, make
111 * "subtype" and "type_size" both 4-bit bitfields. That
112 * gives us an extra 8 bits for adding new flags, and we
113 * can likely get rid of "extra", in order to save one
114 * more bit.
115 */
116 unsigned int extra : 1; //!< really "subtype is used by dict, not by protocol"
117
118 unsigned int local : 1; //!< is a local variable
119
120 unsigned int has_fixup : 1;
121
122 /*
123 * main: extra is set, then this field is is key, bit, or a uint16 length field.
124 * radius: is one of 9 options for flags
125 * dhcp v4/v6: DNS label, or partial DNS label
126 */
127 uint8_t subtype; //!< protocol-specific values, OR key fields
128
129 /*
130 * Length in bytes for most attributes.
131 * Length in bits for da_is_bit_field(da)
132 */
133 uint8_t length; //!< length of the attribute
134
135 /*
136 * TLVs: 1, 2, or 4.
137 * date / time types: fr_time_res_t, which has 4 possible values.
138 * bit fields: offset in the byte where this bit field ends, which is only
139 * used as a caching mechanism during parsing of the dictionaries.
140 */
141 uint8_t type_size; //!< For TLV2 and root attributes.
143
144#define flag_time_res type_size
145#define flag_byte_offset type_size
146
147/** subtype values for the dictionary when extra=1
148 *
149 */
150enum {
151 FLAG_EXTRA_NONE = 0, //!< no extra meaning, should be invalid
152 FLAG_KEY_FIELD, //!< this is a key field for a subsequent struct
153 FLAG_BIT_FIELD, //!< bit field inside of a struct
154 FLAG_LENGTH_UINT8, //!< string / octets type is prefixed by uint8 of length
155 FLAG_LENGTH_UINT16, //!< string / octets type is prefixed by uint16 of length
156};
157
158#define fr_dict_attr_is_key_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_KEY_FIELD))
159#define da_is_bit_field(_da) ((_da)->flags.extra && ((_da)->flags.subtype == FLAG_BIT_FIELD))
160#define da_is_length_field(_da) ((_da)->flags.extra && (((_da)->flags.subtype == FLAG_LENGTH_UINT8) || ((_da)->flags.subtype == FLAG_LENGTH_UINT16)))
161#define da_length_offset(_da) ((_da)->flags.type_size)
162
163/** Extension identifier
164 *
165 * @note New extension structures should also be added to the to the appropriate table in dict_ext.c
166 */
167typedef enum {
168 FR_DICT_ATTR_EXT_NAME = 0, //!< Name of the attribute.
169 FR_DICT_ATTR_EXT_CHILDREN, //!< Attribute has children.
170 FR_DICT_ATTR_EXT_REF, //!< Attribute references another
171 ///< attribute and/or dictionary.
172 FR_DICT_ATTR_EXT_VENDOR, //!< Cached vendor pointer.
173 FR_DICT_ATTR_EXT_DA_STACK, //!< Cached da stack.
174 FR_DICT_ATTR_EXT_ENUMV, //!< Enumeration values.
175 FR_DICT_ATTR_EXT_NAMESPACE, //!< Attribute has its own namespace.
176 FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC, //!< Protocol specific extensions
179
180/** Dictionary attribute
181 */
183 fr_dict_t _CONST* _CONST dict; //!< Dict attribute belongs to.
184
185 char const *name; //!< Attribute name.
186 size_t name_len; //!< Length of the name.
187
188 unsigned int attr; //!< Attribute number.
189 unsigned int depth; //!< Depth of nesting for this attribute.
190
191 unsigned int last_child_attr; //!< highest value of last child attribute.
192
193 fr_type_t type; //!< Value type.
194
195 fr_dict_attr_t const *parent; //!< Immediate parent of this attribute.
196 fr_dict_attr_t const *next; //!< Next child in bin.
197
199
200 struct {
201 bool attr_set : 1; //!< Attribute number has been set.
202 //!< We need the full range of values 0-UINT32_MAX
203 ///< so we can't use any attr values to indicate
204 ///< "unsetness".
205
206 bool finalised : 1; //!< Attribute definition is complete and modifications
207 ///< that would change the address of the memory chunk
208 ///< of the attribute are no longer permitted.
210
211 char const *filename; //!< Where the attribute was defined.
212 ///< this buffer's lifetime is bound to the
213 ///< fr_dict_t.
214 int line; //!< Line number where the attribute was defined.
215
216 uint8_t ext[FR_DICT_ATTR_EXT_MAX]; //!< Extensions to the dictionary attribute.
217} CC_HINT(aligned(FR_EXT_ALIGNMENT));
218
219/** Extension identifier
220 *
221 * @note New extension structures should also be added to the appropriate table in dict_ext.c
222 */
223typedef enum {
224 FR_DICT_ENUM_EXT_UNION_REF = 0, //!< Reference to a union/subs-struct.
227
228/** Value of an enumerated attribute
229 *
230 * Maps one of more string values to integers and vice versa.
231 */
232typedef struct {
233 char const *name; //!< Enum name.
234 size_t name_len; //!< Allows for efficient name lookups when operating
235 ///< on partial buffers.
236 fr_value_box_t const *value; //!< Enum value (what name maps to).
237
238 uint8_t ext[FR_DICT_ENUM_EXT_MAX]; //!< Extensions to the dictionary attribute.
239
240 fr_dict_attr_t const *child_struct[]; //!< for key fields
241} fr_dict_enum_value_t CC_HINT(aligned(FR_EXT_ALIGNMENT));
242
243/** Private enterprise
244 *
245 * Represents an IANA private enterprise allocation.
246 *
247 * The width of the private enterprise number must be the same for all protocols
248 * so we can represent a vendor with a single struct.
249 */
250typedef struct {
251 uint32_t pen; //!< Private enterprise number.
252 bool continuation; //!< we only have one flag for now, for WiMAX
253 size_t type; //!< Length of type data
254 size_t length; //!< Length of length data
255 char const *name; //!< Vendor name.
257
258/** Specifies a value which must be present for the module to function
259 *
260 */
261typedef struct {
262 fr_value_box_t const **out; //!< Enumeration value.
263 fr_dict_attr_t const **attr; //!< The protocol dictionary the attribute should
264 ///< be resolved in. ** so it's a compile time
265 ///< constant.
266 char const *name; //!< of the attribute.
268
269/** Specifies an attribute which must be present for the module to function
270 *
271 */
272typedef struct {
273 fr_dict_attr_t const **out; //!< Where to write a pointer to the resolved
274 //!< #fr_dict_attr_t.
275 fr_dict_t const **dict; //!< The protocol dictionary the attribute should
276 ///< be resolved in. ** so it's a compile time
277 ///< constant.
278 char const *name; //!< of the attribute.
279 fr_type_t type; //!< of the attribute. Mismatch is a fatal error.
281
282/** Specifies a dictionary which must be loaded/loadable for the module to function
283 *
284 */
285typedef struct {
286 fr_dict_t const **out; //!< Where to write a pointer to the loaded/resolved
287 //!< #fr_dict_t.
288 char const *base_dir; //!< Directory structure beneath share.
289 char const *proto; //!< The protocol dictionary name.
291
292/** Errors returned by attribute lookup functions
293 *
294 */
295typedef enum {
296 FR_DICT_ATTR_OK = 0, //!< No error.
297 FR_DICT_ATTR_NOTFOUND = -1, //!< Attribute couldn't be found.
298 FR_DICT_ATTR_PROTOCOL_NOTFOUND = -2, //!< Protocol couldn't be found.
299 FR_DICT_ATTR_PARSE_ERROR = -3, //!< Attribute string couldn't be parsed
300 FR_DICT_ATTR_INTERNAL_ERROR = -4, //!< Internal error occurred.
301 FR_DICT_ATTR_OOM = -5, //!< Memory allocation error.
302 FR_DICT_ATTR_NOT_DESCENDENT = -6, //!< Attribute is not a descendent of the parent
303 ///< attribute.
304 FR_DICT_ATTR_NOT_ANCESTOR = -7, //!< Attribute is not an ancestor of the child
305 ///< attribute.
306 FR_DICT_ATTR_NO_CHILDREN = -8, //!< Child lookup in attribute with no children.
307 FR_DICT_ATTR_EINVAL = -9 //!< Invalid arguments.
308
310
313
314/*
315 * Forward declarations to avoid circular references.
316 */
318typedef struct fr_dbuff_s fr_dbuff_t;
319
320/** A generic interface for decoding packets to fr_pair_ts
321 *
322 * A decoding function should decode a single top level packet from wire format.
323 *
324 * Note that unlike #fr_tp_proto_decode_t, this function is NOT passed an encode_ctx. That is because when we
325 * do cross-protocol encoding, the "outer" protocol has no information it can share with the "inner" protocol.
326 *
327 * @param[in] ctx to allocate new pairs in.
328 * @param[in] vps where new VPs will be added
329 * @param[in] data to decode.
330 * @param[in] data_len The length of the incoming data.
331 * @return
332 * - <= 0 on error. May be the offset (as a negative value) where the error occurred.
333 * - > 0 on success. How many bytes were decoded.
334 */
335typedef ssize_t (*fr_dict_attr_decode_func_t)(TALLOC_CTX *ctx, fr_pair_list_t *vps,
336 uint8_t const *data, size_t data_len);
337
338/** A generic interface for encoding fr_pair_ts to packets
339 *
340 * An encoding function should encode multiple VPs to a wire format packet
341 *
342 * Note that unlike #fr_tp_proto_encode_t, this function is NOT passed an encode_ctx. That is because when we
343 * do cross-protocol encoding, the "outer" protocol has no information it can share with the "inner" protocol.
344 *
345 * @param[in] vps vps to encode
346 * @param[in] dbuff buffer where data can be written
347 * @return
348 * - <= 0 on error. May be the offset (as a negative value) where the error occurred.
349 * - > 0 on success. How many bytes were encoded
350 */
352
353/** Init / free callbacks
354 *
355 * Only for "autoref" usage.
356 */
357typedef int (*fr_dict_protocol_init_t)(void);
358typedef void (*fr_dict_protocol_free_t)(void);
359
361
362/** Custom protocol-specific flag parsing function
363 *
364 * @note This function should be used to implement table based flag parsing.
365 *
366 * @param[in] da_p we're currently populating
367 * @param[in] value flag value to parse.
368 * @param[in] rule How to parse the flag.
369 */
371
373 fr_dict_flag_parse_func_t func; //!< Custom parsing function to convert a flag value string to a C type value.
374 void *uctx; //!< Use context to pass to the custom parsing function.
375 bool needs_value; //!< This parsing flag must have a value. Else we error.
376};
377
378/** Copy custom flags from one attribute to another
379 *
380 * @param[out] da_to attribute to copy to. Use for the talloc_ctx for any heap allocated flag values.
381 * @param[out] flags_to protocol specific flags struct to copy to.
382 * @param[in] flags_from protocol specific flags struct to copy from.
383 * @return
384 * - 0 on success.
385 * - -1 on error.
386 */
387typedef int (*fr_dict_flags_copy_func_t)(fr_dict_attr_t *da_to, void *flags_to, void *flags_from);
388
389/** Compare the protocol specific flags struct from two attributes
390 *
391 * @param[in] da_a first attribute to compare.
392 * @param[in] da_b second attribute to compare.
393 * @return
394 * - 0 if the flags are equal.
395 * - < 0 if da_a < da_b.
396 * - > 0 if da_a > da_b.
397 */
398 typedef int (*fr_dict_flags_cmp_func_t)(fr_dict_attr_t const *da_a, fr_dict_attr_t const *da_b);
399
400/** Protocol specific custom flag definitnion
401 *
402 */
403typedef struct {
404 fr_table_elem_name_t name; //!< Name of the flag
405 fr_dict_flag_parser_rule_t value; //!< Function and context to parse the flag.
407
408/** Define a flag setting function, which sets one bit in a fr_dict_attr_flags_t
409 *
410 * This is here, because AFAIK there's no completely portable way to get the bit
411 * offset of a bit field in a structure.
412 */
413#define FR_DICT_ATTR_FLAG_FUNC(_struct, _name) \
414static int dict_flag_##_name(fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules)\
415{ \
416 _struct *flags = fr_dict_attr_ext(*da_p, FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC); \
417 flags->_name = 1; \
418 return 0; \
419}
420
421/** conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
422 *
423 * @param[in] _struct containing the field to write the result to.
424 * @param[in] _field to write the flag to
425 */
426# define FR_DICT_PROTOCOL_FLAG(_struct, _field) \
427 .type = FR_CTYPE_TO_TYPE((((_struct *)NULL)->_field)), \
428 .offset = offsetof(_struct, _field)
429
430/** Protocol-specific callbacks in libfreeradius-PROTOCOL
431 *
432 */
433typedef struct {
434 char const *name; //!< name of this protocol
435
436 int default_type_size; //!< how many octets are in "type" field
437 int default_type_length; //!< how many octets are in "length" field
438
439 struct {
440 /** Custom flags for this protocol
441 */
442 struct {
443 fr_dict_flag_parser_t const *table; //!< Flags for this protocol, an array of fr_dict_flag_parser_t
444 size_t table_len; //!< Length of protocol_flags table.
445
446 size_t len; //!< Length of the protocol specific flags structure.
447 ///< This is used to allocate a FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC
448 ///< extension of the specified length.
449
450 fr_dict_flags_copy_func_t copy; //!< Copy protocol-specific flags from one attribute to another.
451 ///< Called when copying attributes.
452
453 fr_dict_flags_cmp_func_t cmp; //!< Compare protocol-specific flags from two attributes.
454 ///< Called when comparing attributes by their fields.
455 } flags;
456
457 fr_dict_attr_type_parse_t type_parse; //!< parse unknown type names
458 fr_dict_attr_valid_func_t valid; //!< Validation function to ensure that
459 ///< new attributes are valid.
460 } attr;
461
462 fr_dict_protocol_init_t init; //!< initialize the library
463 fr_dict_protocol_free_t free; //!< free the library
464
465 fr_dict_attr_decode_func_t decode; //!< for decoding attributes. Used for implementing foreign
466 ///< protocol attributes.
467 fr_dict_attr_encode_func_t encode; //!< for encoding attributes. Used for implementing foreign
468 ///< protocol attributes.
470
472
473/*
474 * Dictionary constants
475 */
476#define FR_DICT_PROTO_MAX_NAME_LEN (128) //!< Maximum length of a protocol name.
477#define FR_DICT_ENUM_MAX_NAME_LEN (128) //!< Maximum length of a enum value.
478#define FR_DICT_VENDOR_MAX_NAME_LEN (128) //!< Maximum length of a vendor name.
479#define FR_DICT_ATTR_MAX_NAME_LEN (128) //!< Maximum length of a attribute name.
480
481/** Maximum level of TLV nesting allowed
482 */
483#define FR_DICT_TLV_NEST_MAX (24)
484
485/** Maximum level of da stack caching
486 */
487#define FR_DICT_DA_STACK_CACHE_MAX (5)
488
489/** Maximum TLV stack size
490 *
491 * The additional attributes are to account for
492 *
493 * Root + Vendor + NULL (top frame).
494 * Root + Embedded protocol + Root + Vendor + NULL.
495 *
496 * Code should ensure that it doesn't run off the end of the stack,
497 * as this could be remotely exploitable, using odd nesting.
498 */
499#define FR_DICT_MAX_TLV_STACK (FR_DICT_TLV_NEST_MAX + 5)
500
501/** Characters that are allowed in dictionary attribute names
502 *
503 */
504extern bool const fr_dict_attr_allowed_chars[UINT8_MAX + 1];
505
506/** Characters that are allowed in dictionary enumeration value names
507 *
508 */
509extern bool const fr_dict_enum_allowed_chars[UINT8_MAX + 1];
510
511/** @name Dictionary structure extensions
512 *
513 * @{
514 */
515#include <freeradius-devel/util/dict_ext.h>
516/** @} */
517
518/** @name Programmatically create dictionary attributes and values
519 *
520 * @{
521 */
523
524int fr_dict_attr_add(fr_dict_t *dict, fr_dict_attr_t const *parent, char const *name, unsigned int attr,
525 fr_type_t type, fr_dict_attr_flags_t const *flags) CC_HINT(nonnull(1,2,3));
526
528 char const *name, fr_type_t type, fr_dict_attr_flags_t const *flags) CC_HINT(nonnull(1,2,3));
529
530int fr_dict_enum_add_name(fr_dict_attr_t *da, char const *name,
531 fr_value_box_t const *value, bool coerce, bool replace);
532
533int fr_dict_enum_add_name_next(fr_dict_attr_t *da, char const *name) CC_HINT(nonnull);
534
535int fr_dict_str_to_argv(char *str, char **argv, int max_argc);
536
537int fr_dict_attr_acopy_local(fr_dict_attr_t const *dst, fr_dict_attr_t const *src) CC_HINT(nonnull);
538
540/** @} */
541
542/** @name Dict accessors
543 *
544 * @{
545 */
547/** @} */
548
549/** @name Unknown ephemeral attributes
550 *
551 * @{
552 */
554
556
557fr_dict_attr_t *fr_dict_attr_unknown_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da) CC_HINT(nonnull(2));
558
559static inline fr_dict_attr_t *fr_dict_attr_unknown_copy(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
560{
561 fr_assert(da->flags.is_unknown);
562
563 return fr_dict_attr_unknown_afrom_da(ctx, da);
564}
565
567 fr_dict_attr_t const *parent,
568 unsigned int num, fr_type_t type, bool raw)
569 CC_HINT(nonnull(2));
570
571static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_typed_afrom_num(TALLOC_CTX *ctx,
572 fr_dict_attr_t const *parent,
573 unsigned int num, fr_type_t type)
574{
575 return fr_dict_attr_unknown_typed_afrom_num_raw(ctx, parent, num, type, false);
576}
577
578
579static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_vendor_afrom_num(TALLOC_CTX *ctx,
580 fr_dict_attr_t const *parent,
581 unsigned int vendor)
582{
584}
585
586static inline CC_HINT(nonnull(2)) fr_dict_attr_t *fr_dict_attr_unknown_raw_afrom_num(TALLOC_CTX *ctx,
587 fr_dict_attr_t const *parent,
588 unsigned int attr)
589{
591}
592
594 CC_HINT(nonnull(2));
595
596
598 fr_dict_attr_t const **out,
599 fr_dict_attr_t const *parent,
601 CC_HINT(nonnull(2,3,4));
602
604
606/** @} */
607
608/** @name Attribute comparisons
609 *
610 * @{
611 */
612static inline CC_HINT(nonnull) int8_t fr_dict_attr_cmp(fr_dict_attr_t const *a, fr_dict_attr_t const *b)
613{
614 int8_t ret;
615
616 /*
617 * Comparing unknowns or raws is expensive
618 * because we need to check the lineage.
619 */
620 if (a->flags.is_unknown | a->flags.is_raw | b->flags.is_unknown | b->flags.is_raw) {
621 ret = CMP(a->depth, b->depth);
622 if (ret != 0) return ret;
623
624 ret = CMP(a->attr, b->attr);
625 if (ret != 0) return ret;
626
627 ret = (a->parent == NULL) - (b->parent == NULL);
628 if ((ret != 0) || !a->parent) return ret;
629
630 return fr_dict_attr_cmp(a->parent, b->parent);
631 }
632
633 /*
634 * Comparing knowns is cheap because the
635 * DAs are unique.
636 */
637 return CMP(a, b);
638}
639
640/** Compare two dictionary attributes by their contents
641 *
642 * @param[in] a First attribute to compare.
643 * @param[in] b Second attribute to compare.
644 * @return
645 * - 0 if the attributes are equal.
646 * - -1 if a < b.
647 * - +1 if a > b.
648 */
649static inline CC_HINT(nonnull) int8_t fr_dict_attr_cmp_fields(const fr_dict_attr_t *a, const fr_dict_attr_t *b)
650{
651 int8_t ret;
652 fr_dict_protocol_t const *a_proto = fr_dict_protocol(a->dict);
653
654 /*
655 * Technically this isn't a property of the attribute
656 * but we need them to be the same to be able to
657 * compare protocol specific flags successfully.
658 */
659 ret = CMP(a_proto, fr_dict_protocol(b->dict));
660 if (ret != 0) return ret;
661
662 ret = CMP(a->attr, b->attr);
663 if (ret != 0) return ret;
664
665 ret = CMP(a->parent, b->parent);
666 if (ret != 0) return ret;
667
669 if (ret != 0) return ret;
670
671 /*
672 * Compare protocol specific flags
673 */
674 if (a_proto->attr.flags.cmp && (ret = a_proto->attr.flags.cmp(a, b))) return ret;
675
676 return CMP(memcmp(&a->flags, &b->flags, sizeof(a->flags)), 0);
677}
678/** @} */
679
680/** @name Debugging functions
681 *
682 * @{
683 */
684void fr_dict_namespace_debug(FILE *fp, fr_dict_attr_t const *da);
685
686void fr_dict_attr_debug(FILE *fp, fr_dict_attr_t const *da);
687
688void fr_dict_debug(FILE *fp, fr_dict_t const *dict);
689
690void fr_dict_export(FILE *fp, fr_dict_t const *dict);
691
692void fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent);
693/** @} */
694
695/** @name Attribute lineage
696 *
697 * @{
698 */
699fr_dict_attr_t const *fr_dict_attr_common_parent(fr_dict_attr_t const *a, fr_dict_attr_t const *b, bool is_ancestor);
700
701int fr_dict_oid_component_legacy(unsigned int *out, char const **oid);
702
704 fr_type_t type, fr_dict_attr_flags_t const *flags);
705
707 fr_dict_attr_t const *ancestor, fr_dict_attr_t const *da, bool numeric);
708#define FR_DICT_ATTR_OID_PRINT_RETURN(...) FR_SBUFF_RETURN(fr_dict_attr_oid_print, ##__VA_ARGS__)
709
711 unsigned int *attr, char const *oid) CC_HINT(nonnull);
712
714 fr_dict_attr_t const **out, fr_dict_attr_t const *parent,
715 fr_sbuff_t *in, fr_sbuff_term_t const *tt)
716 CC_HINT(nonnull(2,3,4));
717
719 fr_dict_attr_t const **out, fr_dict_attr_t const *parent,
720 fr_sbuff_t *in, fr_sbuff_term_t const *tt)
721 CC_HINT(nonnull(2,3,4));
722
724 fr_dict_attr_t const *parent, char const *oid)
725 CC_HINT(nonnull(2,3));
726
727bool fr_dict_attr_can_contain(fr_dict_attr_t const *parent, fr_dict_attr_t const *child) CC_HINT(nonnull);
728
729/** @} */
730
731/** @name Attribute, vendor and dictionary lookup
732 *
733 * @{
734 */
735
736/** @hidecallergraph */
737fr_dict_attr_t const *fr_dict_root(fr_dict_t const *dict) CC_HINT(nonnull);
738
739bool fr_dict_is_read_only(fr_dict_t const *dict);
740
741dl_t *fr_dict_dl(fr_dict_t const *dict);
742
744 fr_dict_t const **out, fr_sbuff_t *name, fr_dict_t const *dict_def);
745
746fr_dict_t const *fr_dict_by_protocol_name(char const *name);
747
748fr_dict_t const *fr_dict_by_protocol_num(unsigned int num);
749
750fr_dict_attr_t const *fr_dict_unlocal(fr_dict_attr_t const *da) CC_HINT(nonnull);
751
752fr_dict_t const *fr_dict_proto_dict(fr_dict_t const *dict) CC_HINT(nonnull);
753
754fr_dict_t const *fr_dict_by_da(fr_dict_attr_t const *da) CC_HINT(nonnull);
755
756fr_dict_t const *fr_dict_by_attr_name(fr_dict_attr_t const **found, char const *name);
757
758bool fr_dict_compatible(fr_dict_t const *dict1, fr_dict_t const *dict2) CC_HINT(nonnull);
759
760/** Return true if this attribute is parented directly off the dictionary root
761 *
762 * @param[in] da to check.
763 * @return
764 * - true if attribute is top level.
765 * - false if attribute is not top level.
766 */
767static inline bool fr_dict_attr_is_top_level(fr_dict_attr_t const *da)
768{
769 if (unlikely(!da) || unlikely(!da->parent)) return false;
770 return da->parent->flags.is_root;
771}
772
774
775fr_dict_vendor_t const *fr_dict_vendor_by_name(fr_dict_t const *dict, char const *name);
776
777fr_dict_vendor_t const *fr_dict_vendor_by_num(fr_dict_t const *dict, uint32_t vendor_pen);
778
779fr_dict_attr_t const *fr_dict_vendor_da_by_num(fr_dict_attr_t const *vendor_root, uint32_t vendor_pen);
780
782 fr_dict_t const *dict_def,
783 fr_sbuff_t *name, fr_sbuff_term_t const *tt,
784 bool internal, bool foreign)
785 CC_HINT(nonnull(2, 4));
786
788 fr_dict_t const *dict_def,
789 fr_sbuff_t *name, fr_sbuff_term_t const *tt,
790 bool internal, bool foreign)
791 CC_HINT(nonnull(2, 4));
792
794 fr_dict_t const *dict_def,
795 fr_sbuff_t *in, fr_sbuff_term_t const *tt,
796 bool internal, bool foreign)
797 CC_HINT(nonnull(2, 4));
798
800 fr_dict_t const *dict_def, char const *attr,
801 bool internal, bool foreign)
802 CC_HINT(nonnull(3));
803
805 fr_dict_t const *dict_def,
806 fr_sbuff_t *in, fr_sbuff_term_t const *tt,
807 bool internal, bool foreign)
808 CC_HINT(nonnull(2, 4));
809
811 fr_dict_attr_t const *parent,
812 fr_sbuff_t *name, fr_sbuff_term_t const *tt)
813 CC_HINT(nonnull(2,3,4));
814
816 char const *attr)
817 CC_HINT(nonnull(2,3));
818
819fr_dict_attr_t const *fr_dict_attr_child_by_num(fr_dict_attr_t const *parent, unsigned int attr);
820
821typedef fr_hash_iter_t fr_dict_enum_iter_t; /* Alias this in case we want to change it in future */
822
824
826
828
830
831fr_dict_enum_value_t const *fr_dict_enum_by_name(fr_dict_attr_t const *da, char const *name, ssize_t len);
832
834
836 fr_sbuff_t *in, fr_sbuff_term_t const *tt);
837
839 fr_sbuff_t *in, fr_sbuff_term_t const *tt)
841/** @} */
842
843/** @name Dictionary and protocol loading
844 *
845 * @{
846 */
847int fr_dict_internal_afrom_file(fr_dict_t **out, char const *internal_name,
848 char const *dependent);
849
850int fr_dict_protocol_afrom_file(fr_dict_t **out, char const *proto_name, char const *proto_dir,
851 char const *dependent);
852
854
855int fr_dict_read(fr_dict_t *dict, char const *dict_dir, char const *filename);
856/** @} */
857
858/** @name Autoloader interface
859 *
860 * @{
861 */
863
865
866#define fr_dict_autoload(_to_load) _fr_dict_autoload(_to_load, __FILE__)
867int _fr_dict_autoload(fr_dict_autoload_t const *to_load, char const *dependent);
868
869#define fr_dict_autofree(_to_free) _fr_dict_autofree(_to_free, __FILE__)
870int _fr_dict_autofree(fr_dict_autoload_t const *to_free, char const *dependent);
871
872#define fr_dict_autoload_talloc(_ctx, _dict_out, _proto) _fr_dict_autoload_talloc(_ctx, _dict_out, _proto, __FILE__)
873fr_dict_autoload_talloc_t *_fr_dict_autoload_talloc(TALLOC_CTX *ctx, fr_dict_t const **out, char const *proto, char const *dependent);
874
875int fr_dl_dict_enum_autoload(dl_t const *module, void *symbol, void *user_ctx);
876
877int fr_dl_dict_attr_autoload(dl_t const *module, void *symbol, void *user_ctx);
878
879int fr_dl_dict_autoload(dl_t const *module, void *symbol, void *user_ctx);
880
881void fr_dl_dict_autofree(dl_t const *module, void *symbol, void *user_ctx);
882/** @} */
883
884/** @name Allocating and freeing
885 *
886 * @{
887 */
888fr_dict_t *fr_dict_alloc(char const *proto_name, unsigned int proto_number) CC_HINT(nonnull);
889
890int fr_dict_dependent_add(fr_dict_t const *dict, char const *dependent) CC_HINT(nonnull);
891
892int fr_dict_free(fr_dict_t **dict, char const *dependent) CC_HINT(nonnull);
893
894int fr_dict_const_free(fr_dict_t const **dict, char const *dependent) CC_HINT(nonnull);
895/** @} */
896
897/** @name Global dictionary management
898 *
899 * @{
900 */
901fr_dict_gctx_t *fr_dict_global_ctx_init(TALLOC_CTX *ctx, bool free_at_exit, char const *dict_dir);
902
903void fr_dict_global_ctx_perm_check(fr_dict_gctx_t *gctx, bool enable);
904
905void fr_dict_global_ctx_set(fr_dict_gctx_t const *gctx);
906
908
909int fr_dict_global_ctx_dir_set(char const *dict_dir);
910
912
914
915char const *fr_dict_global_ctx_dir(void);
916
918
920
922
924
926
927fr_dict_t const *fr_dict_internal(void);
928
929/** @} */
930
931/** @name Dictionary testing and validation
932 *
933 * @{
934 */
936
937int fr_dict_parse_str(fr_dict_t *dict, char *buf,
938 fr_dict_attr_t const *parent);
939
940ssize_t fr_dict_valid_name(char const *name, ssize_t len);
941
942ssize_t fr_dict_valid_oid_str(char const *name, ssize_t len);
943
945
946typedef int (*fr_dict_walk_t)(fr_dict_attr_t const *da, void *uctx);
947
948int fr_dict_walk(fr_dict_attr_t const *da, fr_dict_walk_t callback, void *uctx);
949
950void fr_dict_attr_verify(char const *file, int line, fr_dict_attr_t const *da);
951/** @} */
952
953#undef _CONST
954
955#ifdef __cplusplus
956}
957#endif
int const char * file
Definition acutest.h:702
int const char int line
Definition acutest.h:702
#define RCSIDH(h, id)
Definition build.h:486
#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:112
#define unlikely(_x)
Definition build.h:383
#define UNUSED
Definition build.h:317
static int type_parse(TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
fr_table_elem_name_t name
Name of the flag.
Definition dict.h:404
fr_dict_t * fr_dict_global_ctx_iter_next(fr_dict_global_ctx_iter_t *iter)
Definition dict_util.c:4618
bool continuation
we only have one flag for now, for WiMAX
Definition dict.h:252
size_t type
Length of type data.
Definition dict.h:253
fr_dict_t const * fr_dict_by_attr_name(fr_dict_attr_t const **found, char const *name)
void fr_dict_global_ctx_debug(fr_dict_gctx_t const *gctx)
Dump information about currently loaded dictionaries.
Definition dict_util.c:4574
fr_dict_protocol_free_t free
free the library
Definition dict.h:463
void fr_dict_namespace_debug(FILE *fp, fr_dict_attr_t const *da)
Definition dict_print.c:230
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:4436
size_t name_len
Allows for efficient name lookups when operating on partial buffers.
Definition dict.h:234
fr_dict_attr_flags_t flags
Flags.
Definition dict.h:198
fr_dict_attr_decode_func_t decode
for decoding attributes.
Definition dict.h:465
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:370
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:1593
char const * name
of the attribute.
Definition dict.h:278
int fr_dict_internal_afrom_file(fr_dict_t **out, char const *internal_name, char const *dependent)
(Re-)Initialize the special internal dictionary
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:4707
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:4527
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:3559
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:1944
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:3084
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:223
@ FR_DICT_ENUM_EXT_MAX
Definition dict.h:225
@ FR_DICT_ENUM_EXT_UNION_REF
Reference to a union/subs-struct.
Definition dict.h:224
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:1741
char const * name
Vendor name.
Definition dict.h:255
char const * filename
Where the attribute was defined.
Definition dict.h:211
fr_dict_t * fr_dict_unconst(fr_dict_t const *dict)
Coerce to non-const.
Definition dict_util.c:4629
void * uctx
Use context to pass to the custom parsing function.
Definition dict.h:374
fr_dict_attr_t const ** attr
The protocol dictionary the attribute should be resolved in.
Definition dict.h:263
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:2609
unsigned int is_root
Is root of a dictionary.
Definition dict.h:76
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:4095
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:3352
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:4216
int fr_dict_walk(fr_dict_attr_t const *da, fr_dict_walk_t callback, void *uctx)
Definition dict_util.c:4821
fr_dict_attr_t const * fr_dict_unlocal(fr_dict_attr_t const *da)
Definition dict_util.c:5000
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:2040
size_t name_len
Length of the name.
Definition dict.h:186
int line
Line number where the attribute was defined.
Definition dict.h:214
bool(* fr_dict_attr_valid_func_t)(fr_dict_attr_t *da)
Definition dict.h:311
int fr_dl_dict_enum_autoload(dl_t const *module, void *symbol, void *user_ctx)
static fr_slen_t err
Definition dict.h:840
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:5016
unsigned int has_fixup
Definition dict.h:120
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:579
void fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent)
Definition dict_print.c:312
bool const fr_dict_attr_allowed_chars[UINT8_MAX+1]
Characters that are allowed in dictionary attribute names.
Definition dict_util.c:47
static fr_dict_attr_t * fr_dict_attr_unknown_copy(TALLOC_CTX *ctx, fr_dict_attr_t const *da)
Definition dict.h:559
int fr_dict_attr_set_group(fr_dict_attr_t **da_p)
Definition dict_util.c:5023
fr_dict_protocol_t const * fr_dict_protocol(fr_dict_t const *dict)
Return the protocol descriptor for the dictionary.
Definition dict_util.c:4992
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:351
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.
int fr_dict_attr_acopy_local(fr_dict_attr_t const *dst, fr_dict_attr_t const *src)
Definition dict_util.c:1072
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:3266
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:4267
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:2622
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:398
void fr_dict_debug(FILE *fp, fr_dict_t const *dict)
Definition dict_print.c:266
fr_value_box_t const ** out
Enumeration value.
Definition dict.h:262
fr_dict_attr_t * fr_dict_attr_unconst(fr_dict_attr_t const *da)
Coerce to non-const.
Definition dict_util.c:4641
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:275
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:2327
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:586
void fr_dict_attr_verify(char const *file, int line, fr_dict_attr_t const *da)
Definition dict_util.c:4827
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
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:4919
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:4611
int(* fr_dict_walk_t)(fr_dict_attr_t const *da, void *uctx)
Definition dict.h:946
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:2403
fr_dict_flag_parse_func_t func
Custom parsing function to convert a flag value string to a C type value.
Definition dict.h:373
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:2698
unsigned int extra
really "subtype is used by dict, not by protocol"
Definition dict.h:116
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:273
fr_dict_t const ** out
Where to write a pointer to the loaded/resolved fr_dict_t.
Definition dict.h:286
void fr_dict_global_ctx_set(fr_dict_gctx_t const *gctx)
Set a new, active, global dictionary context.
Definition dict_util.c:4497
fr_dict_attr_t const * next
Next child in bin.
Definition dict.h:196
fr_dict_t _CONST *_CONST dict
Dict attribute belongs to.
Definition dict.h:183
fr_dict_attr_t * fr_dict_attr_unknown_raw_afrom_da(TALLOC_CTX *ctx, fr_dict_attr_t const *da))
Initialise an octets type attribute from a da.
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:3065
char const * name
Attribute name.
Definition dict.h:185
unsigned int unsafe
e.g. Cleartext-Password
Definition dict.h:107
fr_dict_protocol_init_t init
initialize the library
Definition dict.h:462
unsigned int is_raw
This dictionary attribute was constructed from a known attribute to allow the user to assign octets v...
Definition dict.h:81
fr_slen_t fr_dict_attr_by_oid_legacy(fr_dict_t const *dict, fr_dict_attr_t const **parent, unsigned int *attr, char const *oid)
Get the leaf attribute of an OID string.
Definition dict_util.c:2128
bool const fr_dict_enum_allowed_chars[UINT8_MAX+1]
Characters that are allowed in dictionary enumeration value names.
Definition dict_util.c:68
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:266
dl_t * fr_dict_dl(fr_dict_t const *dict)
Definition dict_util.c:2413
fr_value_box_t const * value
Enum value (what name maps to).
Definition dict.h:236
void fr_dict_attr_debug(FILE *fp, fr_dict_attr_t const *da)
Definition dict_print.c:254
unsigned int attr
Attribute number.
Definition dict.h:188
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:3426
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:3373
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:1956
uint8_t ext[FR_DICT_ATTR_EXT_MAX]
Extensions to the dictionary attribute.
Definition dict.h:216
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:387
int default_type_size
how many octets are in "type" field
Definition dict.h:436
uint32_t pen
Private enterprise number.
Definition dict.h:251
int fr_dict_free(fr_dict_t **dict, char const *dependent)
Decrement the reference count on a previously loaded dictionary.
Definition dict_util.c:4068
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:3393
fr_type_t type
of the attribute. Mismatch is a fatal error.
Definition dict.h:279
fr_dict_flag_parser_rule_t value
Function and context to parse the flag.
Definition dict.h:405
#define _CONST
Definition dict.h:59
int fr_dict_oid_component_legacy(unsigned int *out, char const **oid)
Process a single OID component.
Definition dict_util.c:2083
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:3465
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:4488
void fr_dict_global_ctx_read_only(void)
Mark all dictionaries and the global dictionary ctx as read only.
Definition dict_util.c:4547
uint8_t type_size
For TLV2 and root attributes.
Definition dict.h:141
unsigned int depth
Depth of nesting for this attribute.
Definition dict.h:189
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:4052
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:4134
fr_dict_t const * fr_dict_internal(void)
Definition dict_util.c:4654
bool(* fr_dict_attr_type_parse_t)(fr_type_t *type, fr_dict_attr_t **da_p, char const *name)
Definition dict.h:312
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:2500
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:3735
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:2978
size_t length
Length of length data.
Definition dict.h:254
fr_dict_t const * fr_dict_by_protocol_name(char const *name)
Lookup a protocol by its name.
Definition dict_util.c:2580
bool fr_dict_is_read_only(fr_dict_t const *dict)
Definition dict_util.c:2408
char const * base_dir
Directory structure beneath share.
Definition dict.h:288
fr_dict_attr_t const * parent
Immediate parent of this attribute.
Definition dict.h:195
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:3007
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:767
void(* fr_dict_protocol_free_t)(void)
Definition dict.h:358
fr_dict_attr_encode_func_t encode
for encoding attributes.
Definition dict.h:467
char const * fr_dict_global_ctx_dir(void)
Definition dict_util.c:4538
unsigned int local
is a local variable
Definition dict.h:118
fr_dict_attr_ext_t
Extension identifier.
Definition dict.h:167
@ FR_DICT_ATTR_EXT_PROTOCOL_SPECIFIC
Protocol specific extensions.
Definition dict.h:176
@ FR_DICT_ATTR_EXT_MAX
Definition dict.h:177
@ FR_DICT_ATTR_EXT_ENUMV
Enumeration values.
Definition dict.h:174
@ FR_DICT_ATTR_EXT_NAMESPACE
Attribute has its own namespace.
Definition dict.h:175
@ FR_DICT_ATTR_EXT_DA_STACK
Cached da stack.
Definition dict.h:173
@ FR_DICT_ATTR_EXT_REF
Attribute references another attribute and/or dictionary.
Definition dict.h:170
@ FR_DICT_ATTR_EXT_VENDOR
Cached vendor pointer.
Definition dict.h:172
@ FR_DICT_ATTR_EXT_NAME
Name of the attribute.
Definition dict.h:168
@ FR_DICT_ATTR_EXT_CHILDREN
Attribute has children.
Definition dict.h:169
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
unsigned int last_child_attr
highest value of last child attribute.
Definition dict.h:191
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:4513
unsigned int is_known_width
is treated as if it has a known width for structs
Definition dict.h:92
struct fr_dict_protocol_t::@126 attr
int fr_dict_parse_str(fr_dict_t *dict, char *buf, fr_dict_attr_t const *parent)
int fr_dict_read(fr_dict_t *dict, char const *dict_dir, char const *filename)
Read supplementary attribute definitions into an existing dictionary.
void fr_dl_dict_autofree(dl_t const *module, void *symbol, void *user_ctx)
int default_type_length
how many octets are in "length" field
Definition dict.h:437
fr_dict_attr_err_t
Errors returned by attribute lookup functions.
Definition dict.h:295
@ FR_DICT_ATTR_OK
No error.
Definition dict.h:296
@ FR_DICT_ATTR_NOT_ANCESTOR
Attribute is not an ancestor of the child attribute.
Definition dict.h:304
@ FR_DICT_ATTR_NOT_DESCENDENT
Attribute is not a descendent of the parent attribute.
Definition dict.h:302
@ FR_DICT_ATTR_NOTFOUND
Attribute couldn't be found.
Definition dict.h:297
@ FR_DICT_ATTR_EINVAL
Invalid arguments.
Definition dict.h:307
@ FR_DICT_ATTR_PROTOCOL_NOTFOUND
Protocol couldn't be found.
Definition dict.h:298
@ FR_DICT_ATTR_NO_CHILDREN
Child lookup in attribute with no children.
Definition dict.h:306
@ FR_DICT_ATTR_OOM
Memory allocation error.
Definition dict.h:301
@ FR_DICT_ATTR_PARSE_ERROR
Attribute string couldn't be parsed.
Definition dict.h:299
@ FR_DICT_ATTR_INTERNAL_ERROR
Internal error occurred.
Definition dict.h:300
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:3036
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:2660
int(* fr_dict_protocol_init_t)(void)
Init / free callbacks.
Definition dict.h:357
bool needs_value
This parsing flag must have a value. Else we error.
Definition dict.h:375
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:4740
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:1715
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:2376
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:4183
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:571
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:2683
int fr_dl_dict_autoload(dl_t const *module, void *symbol, void *user_ctx)
fr_hash_iter_t fr_dict_enum_iter_t
Definition dict.h:821
ssize_t fr_dict_valid_name(char const *name, ssize_t len)
Definition dict_util.c:4664
fr_dict_t * fr_dict_protocol_alloc(fr_dict_t const *parent)
Allocate a new local dictionary.
Definition dict_util.c:4005
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:2232
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:335
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:3331
char const * proto
The protocol dictionary name.
Definition dict.h:289
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:3439
char const * name
Enum name.
Definition dict.h:233
static fr_slen_t in
Definition dict.h:840
fr_type_t type
Value type.
Definition dict.h:193
char const * name
name of this protocol
Definition dict.h:434
struct dict_attr_s::@125 state
@ FLAG_EXTRA_NONE
no extra meaning, should be invalid
Definition dict.h:151
@ FLAG_LENGTH_UINT8
string / octets type is prefixed by uint8 of length
Definition dict.h:154
@ FLAG_LENGTH_UINT16
string / octets type is prefixed by uint16 of length
Definition dict.h:155
@ FLAG_KEY_FIELD
this is a key field for a subsequent struct
Definition dict.h:152
@ FLAG_BIT_FIELD
bit field inside of a struct
Definition dict.h:153
fr_dict_t const * fr_dict_by_protocol_num(unsigned int num)
Lookup a protocol by its number.
Definition dict_util.c:2593
uint8_t subtype
protocol-specific values, OR key fields
Definition dict.h:127
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:649
uint8_t length
length of the attribute
Definition dict.h:133
unsigned int is_alias
This isn't a real attribute, it's a reference to to one.
Definition dict.h:86
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:2638
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:78
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:307
int fr_dl_dict_attr_autoload(dl_t const *module, void *symbol, void *user_ctx)
static int8_t fr_dict_attr_cmp(fr_dict_attr_t const *a, fr_dict_attr_t const *b)
Definition dict.h:612
Dictionary attribute.
Definition dict.h:182
Specifies an attribute which must be present for the module to function.
Definition dict.h:272
Values of the encryption flags.
Specifies a dictionary which must be loaded/loadable for the module to function.
Definition dict.h:285
Specifies a value which must be present for the module to function.
Definition dict.h:261
Value of an enumerated attribute.
Definition dict.h:232
Protocol specific custom flag definitnion.
Definition dict.h:403
Protocol-specific callbacks in libfreeradius-PROTOCOL.
Definition dict.h:433
Private enterprise.
Definition dict.h:250
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:212
fr_dict_t * internal
Magic internal dictionary.
Definition dict_priv.h:155
bool free_at_exit
This gctx will be freed on exit.
Definition dict_priv.h:130
Vendors and attribute names.
Definition dict_priv.h:85
Test enumeration values.
Definition dict_test.h:92
Structure used to managed the lifetime of a dictionary.
Definition dict_util.c:4240
Module handle.
Definition dl.h:58
#define FR_EXT_ALIGNMENT
The alignment of object extension structures.
Definition ext.h:54
Structures and prototypes for resizable hash tables.
Stores the state of the current iteration operation.
Definition hash.h:41
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
#define fr_assert(_expr)
Definition rad_assert.h:38
static char const * name
#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:845
static fr_slen_t data
Definition value.h:1288
int nonnull(2, 5))
static size_t char ** out
Definition value.h:1020
Union containing all data types supported by the server.
Definition value.h:186