/src/freeradius-server/src/freeradius-devel/util/dict_ext.h
Line | Count | Source (jump to first uncovered line) |
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_ext.h |
21 | | * |
22 | | * @copyright 2020 The FreeRADIUS server project |
23 | | * @copyright 2020 Arran Cudbard-Bell <a.cudbardb@freeradius.org> |
24 | | */ |
25 | | RCSIDH(dict_ext_h, "$Id: 7ab2e4e7e3bc8020de1e9603b7d265d563b639cf $") |
26 | | |
27 | | #include <freeradius-devel/util/dict.h> |
28 | | #include <freeradius-devel/util/ext.h> |
29 | | #include <freeradius-devel/util/hash.h> |
30 | | |
31 | | #include <limits.h> |
32 | | |
33 | | #ifdef __cplusplus |
34 | | extern "C" { |
35 | | #endif |
36 | | |
37 | | extern fr_ext_t const fr_dict_attr_ext_def; |
38 | | extern fr_ext_t const fr_dict_enum_ext_def; |
39 | | |
40 | | /** Attribute extension - Holds children for an attribute |
41 | | * |
42 | | * Children are possible for: |
43 | | * |
44 | | * #FR_TYPE_TLV, #FR_TYPE_VENDOR, #FR_TYPE_VSA, #FR_TYPE_STRUCT |
45 | | * |
46 | | * *or* where the parent->parent->type is |
47 | | * #FR_TYPE_STRUCT, and "parent" is a "key" |
48 | | * field. Note that these attributes therefore |
49 | | * cannot have VALUEs, as the child defines their |
50 | | * VALUE. See dict_attr_can_have_children() for details. |
51 | | */ |
52 | | typedef struct { |
53 | | fr_hash_table_t *child_by_name; //!< Namespace at this level in the hierarchy. |
54 | | fr_dict_attr_t const **children; //!< Children of this attribute. |
55 | | } fr_dict_attr_ext_children_t; |
56 | | |
57 | | /** Attribute extension - Holds a reference to an attribute in another dictionary |
58 | | * |
59 | | */ |
60 | | typedef struct { |
61 | | fr_dict_attr_t const *ref; //!< reference, only for #FR_TYPE_GROUP |
62 | | } fr_dict_attr_ext_ref_t; |
63 | | |
64 | | /** Attribute extension - Cached vendor pointer |
65 | | * |
66 | | */ |
67 | | typedef struct { |
68 | | fr_dict_attr_t const *vendor; //!< ancestor which has type #FR_TYPE_VENDOR |
69 | | } fr_dict_attr_ext_vendor_t; |
70 | | |
71 | | /** Attribute extension - Stack of dictionary attributes that describe the path back to the root of the dictionary |
72 | | * |
73 | | */ |
74 | | typedef struct { |
75 | | bool unused; //!< Zero length arrays are apparently GNU extensions |
76 | | ///< and we're not allowed to have structs with a |
77 | | ///< single variable array as its member. |
78 | | ///< We'll likely want to store something else here |
79 | | ///< at some point, so we just have a dummy field to |
80 | | ///< avoid changing all the code. |
81 | | fr_dict_attr_t const *da_stack[]; //!< Stack of dictionary attributes |
82 | | } fr_dict_attr_ext_da_stack_t; |
83 | | |
84 | | /** Attribute extension - Holds enumeration values |
85 | | * |
86 | | */ |
87 | | typedef struct { |
88 | | size_t max_name_len; //!< maximum length of a name |
89 | | fr_hash_table_t *value_by_name; //!< Lookup an enumeration value by name |
90 | | fr_hash_table_t *name_by_value; //!< Lookup a name by value |
91 | | } fr_dict_attr_ext_enumv_t; |
92 | | |
93 | | /** Attribute extension - Holds a hash table with the names of all children of this attribute |
94 | | * |
95 | | */ |
96 | | typedef struct { |
97 | | fr_hash_table_t *namespace; //!< Lookup a child by name |
98 | | } fr_dict_attr_ext_namespace_t; |
99 | | |
100 | | /** Enum extension - Sub-struct or union pointer |
101 | | * |
102 | | */ |
103 | | typedef struct { |
104 | | fr_dict_attr_t const *union_ref; //!< The union da this value points into. |
105 | | } fr_dict_enum_ext_union_ref_t; |
106 | | |
107 | | /** @name Add extension structures to attributes |
108 | | * |
109 | | * @{ |
110 | | */ |
111 | | |
112 | | /* Retrieve an extension structure for a dictionary attribute |
113 | | * |
114 | | * @param[in] da to retrieve structure from. |
115 | | * @param[in] ext to retrieve. |
116 | | * @return |
117 | | * - NULL if the extension wasn't found. |
118 | | * - A pointer to the start of the extension. |
119 | | */ |
120 | | static inline void *fr_dict_attr_ext(fr_dict_attr_t const *da, fr_dict_attr_ext_t ext) |
121 | 16.9M | { |
122 | 16.9M | if (!da->ext[ext]) return NULL; |
123 | | |
124 | 7.31M | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); |
125 | 16.9M | } Unexecuted instantiation: fuzzer_tacacs.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_vmps.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_tftp.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_dns.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_dhcpv6.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_radius.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_util.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_dhcpv4.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer_bfd.c:fr_dict_attr_ext Unexecuted instantiation: base32.c:fr_dict_attr_ext Unexecuted instantiation: base64.c:fr_dict_attr_ext Unexecuted instantiation: calc.c:fr_dict_attr_ext dict_ext.c:fr_dict_attr_ext Line | Count | Source | 121 | 62.7k | { | 122 | 62.7k | if (!da->ext[ext]) return NULL; | 123 | | | 124 | 72 | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); | 125 | 62.7k | } |
dict_fixup.c:fr_dict_attr_ext Line | Count | Source | 121 | 252 | { | 122 | 252 | if (!da->ext[ext]) return NULL; | 123 | | | 124 | 152 | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); | 125 | 252 | } |
Unexecuted instantiation: dict_print.c:fr_dict_attr_ext Unexecuted instantiation: dict_test.c:fr_dict_attr_ext dict_tokenize.c:fr_dict_attr_ext Line | Count | Source | 121 | 2.58k | { | 122 | 2.58k | if (!da->ext[ext]) return NULL; | 123 | | | 124 | 1.87k | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); | 125 | 2.58k | } |
Unexecuted instantiation: dict_unknown.c:fr_dict_attr_ext dict_util.c:fr_dict_attr_ext Line | Count | Source | 121 | 16.8M | { | 122 | 16.8M | if (!da->ext[ext]) return NULL; | 123 | | | 124 | 7.29M | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); | 125 | 16.8M | } |
Unexecuted instantiation: dict_validate.c:fr_dict_attr_ext Unexecuted instantiation: dl.c:fr_dict_attr_ext Unexecuted instantiation: dns.c:fr_dict_attr_ext Unexecuted instantiation: edit.c:fr_dict_attr_ext Unexecuted instantiation: encode.c:fr_dict_attr_ext Unexecuted instantiation: file.c:fr_dict_attr_ext Unexecuted instantiation: inet.c:fr_dict_attr_ext Unexecuted instantiation: log.c:fr_dict_attr_ext Unexecuted instantiation: packet.c:fr_dict_attr_ext Unexecuted instantiation: pair.c:fr_dict_attr_ext Unexecuted instantiation: pair_inline.c:fr_dict_attr_ext Unexecuted instantiation: pair_legacy.c:fr_dict_attr_ext Unexecuted instantiation: pair_print.c:fr_dict_attr_ext Unexecuted instantiation: pair_tokenize.c:fr_dict_attr_ext Unexecuted instantiation: print.c:fr_dict_attr_ext Line | Count | Source | 121 | 2.78k | { | 122 | 2.78k | if (!da->ext[ext]) return NULL; | 123 | | | 124 | 0 | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); | 125 | 2.78k | } |
Unexecuted instantiation: regex.c:fr_dict_attr_ext Unexecuted instantiation: socket.c:fr_dict_attr_ext Unexecuted instantiation: stats.c:fr_dict_attr_ext Unexecuted instantiation: struct.c:fr_dict_attr_ext Unexecuted instantiation: trie.c:fr_dict_attr_ext Unexecuted instantiation: types.c:fr_dict_attr_ext Unexecuted instantiation: uri.c:fr_dict_attr_ext Unexecuted instantiation: value.c:fr_dict_attr_ext Unexecuted instantiation: fuzzer.c:fr_dict_attr_ext Unexecuted instantiation: base.c:fr_dict_attr_ext Unexecuted instantiation: vmps.c:fr_dict_attr_ext decode.c:fr_dict_attr_ext Line | Count | Source | 121 | 11.2k | { | 122 | 11.2k | if (!da->ext[ext]) return NULL; | 123 | | | 124 | 11.2k | return fr_ext_ptr(da, da->ext[ext], fr_dict_attr_ext_def.info[ext].has_hdr); | 125 | 11.2k | } |
Unexecuted instantiation: list.c:fr_dict_attr_ext Unexecuted instantiation: tcp.c:fr_dict_attr_ext Unexecuted instantiation: abinary.c:fr_dict_attr_ext Unexecuted instantiation: raw.c:fr_dict_attr_ext Unexecuted instantiation: udp.c:fr_dict_attr_ext |
126 | | |
127 | | /** Return whether a da has a given extension or not |
128 | | * |
129 | | * @param[in] da to check for extensions. |
130 | | * @param[in] ext to check. |
131 | | * @return |
132 | | * - true if the da has the specified extension. |
133 | | * - false if the da does not have the specified extension |
134 | | */ |
135 | | static inline bool fr_dict_attr_has_ext(fr_dict_attr_t const *da, fr_dict_attr_ext_t ext) |
136 | 5.50M | { |
137 | 5.50M | return (da->ext[ext] > 0); |
138 | 5.50M | } Unexecuted instantiation: fuzzer_tacacs.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_vmps.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_tftp.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_dns.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_dhcpv6.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_radius.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_util.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_dhcpv4.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer_bfd.c:fr_dict_attr_has_ext Unexecuted instantiation: base32.c:fr_dict_attr_has_ext Unexecuted instantiation: base64.c:fr_dict_attr_has_ext Unexecuted instantiation: calc.c:fr_dict_attr_has_ext Unexecuted instantiation: decode.c:fr_dict_attr_has_ext Unexecuted instantiation: dict_ext.c:fr_dict_attr_has_ext Unexecuted instantiation: dict_fixup.c:fr_dict_attr_has_ext Unexecuted instantiation: dict_print.c:fr_dict_attr_has_ext Unexecuted instantiation: dict_test.c:fr_dict_attr_has_ext Unexecuted instantiation: dict_tokenize.c:fr_dict_attr_has_ext Unexecuted instantiation: dict_unknown.c:fr_dict_attr_has_ext dict_util.c:fr_dict_attr_has_ext Line | Count | Source | 136 | 5.50M | { | 137 | 5.50M | return (da->ext[ext] > 0); | 138 | 5.50M | } |
Unexecuted instantiation: dict_validate.c:fr_dict_attr_has_ext Unexecuted instantiation: dl.c:fr_dict_attr_has_ext Unexecuted instantiation: dns.c:fr_dict_attr_has_ext Unexecuted instantiation: edit.c:fr_dict_attr_has_ext Unexecuted instantiation: encode.c:fr_dict_attr_has_ext Unexecuted instantiation: file.c:fr_dict_attr_has_ext Unexecuted instantiation: inet.c:fr_dict_attr_has_ext Unexecuted instantiation: log.c:fr_dict_attr_has_ext Unexecuted instantiation: packet.c:fr_dict_attr_has_ext Unexecuted instantiation: pair.c:fr_dict_attr_has_ext Unexecuted instantiation: pair_inline.c:fr_dict_attr_has_ext Unexecuted instantiation: pair_legacy.c:fr_dict_attr_has_ext Unexecuted instantiation: pair_print.c:fr_dict_attr_has_ext Unexecuted instantiation: pair_tokenize.c:fr_dict_attr_has_ext Unexecuted instantiation: print.c:fr_dict_attr_has_ext Unexecuted instantiation: proto.c:fr_dict_attr_has_ext Unexecuted instantiation: regex.c:fr_dict_attr_has_ext Unexecuted instantiation: socket.c:fr_dict_attr_has_ext Unexecuted instantiation: stats.c:fr_dict_attr_has_ext Unexecuted instantiation: struct.c:fr_dict_attr_has_ext Unexecuted instantiation: trie.c:fr_dict_attr_has_ext Unexecuted instantiation: types.c:fr_dict_attr_has_ext Unexecuted instantiation: uri.c:fr_dict_attr_has_ext Unexecuted instantiation: value.c:fr_dict_attr_has_ext Unexecuted instantiation: fuzzer.c:fr_dict_attr_has_ext Unexecuted instantiation: base.c:fr_dict_attr_has_ext Unexecuted instantiation: vmps.c:fr_dict_attr_has_ext Unexecuted instantiation: list.c:fr_dict_attr_has_ext Unexecuted instantiation: tcp.c:fr_dict_attr_has_ext Unexecuted instantiation: abinary.c:fr_dict_attr_has_ext Unexecuted instantiation: raw.c:fr_dict_attr_has_ext Unexecuted instantiation: udp.c:fr_dict_attr_has_ext |
139 | | |
140 | | /** Return the cached da stack (if any) associated with an attribute |
141 | | * |
142 | | * @param[in] da to return cached da stack for. |
143 | | * @return |
144 | | * - NULL if no da stack available. |
145 | | * - The cached da stack on success. |
146 | | */ |
147 | | static inline fr_dict_attr_t const **fr_dict_attr_da_stack(fr_dict_attr_t const *da) |
148 | 65.4k | { |
149 | 65.4k | fr_dict_attr_ext_da_stack_t *ext; |
150 | | |
151 | 65.4k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_DA_STACK); |
152 | 65.4k | if (!ext) return NULL; |
153 | | |
154 | 0 | return ext->da_stack; |
155 | 65.4k | } Unexecuted instantiation: fuzzer_tacacs.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_vmps.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_tftp.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_dns.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_dhcpv6.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_radius.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_util.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_dhcpv4.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer_bfd.c:fr_dict_attr_da_stack Unexecuted instantiation: base32.c:fr_dict_attr_da_stack Unexecuted instantiation: base64.c:fr_dict_attr_da_stack Unexecuted instantiation: calc.c:fr_dict_attr_da_stack Unexecuted instantiation: decode.c:fr_dict_attr_da_stack dict_ext.c:fr_dict_attr_da_stack Line | Count | Source | 148 | 62.7k | { | 149 | 62.7k | fr_dict_attr_ext_da_stack_t *ext; | 150 | | | 151 | 62.7k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_DA_STACK); | 152 | 62.7k | if (!ext) return NULL; | 153 | | | 154 | 0 | return ext->da_stack; | 155 | 62.7k | } |
Unexecuted instantiation: dict_fixup.c:fr_dict_attr_da_stack Unexecuted instantiation: dict_print.c:fr_dict_attr_da_stack Unexecuted instantiation: dict_test.c:fr_dict_attr_da_stack Unexecuted instantiation: dict_tokenize.c:fr_dict_attr_da_stack Unexecuted instantiation: dict_unknown.c:fr_dict_attr_da_stack Unexecuted instantiation: dict_util.c:fr_dict_attr_da_stack Unexecuted instantiation: dict_validate.c:fr_dict_attr_da_stack Unexecuted instantiation: dl.c:fr_dict_attr_da_stack Unexecuted instantiation: dns.c:fr_dict_attr_da_stack Unexecuted instantiation: edit.c:fr_dict_attr_da_stack Unexecuted instantiation: encode.c:fr_dict_attr_da_stack Unexecuted instantiation: file.c:fr_dict_attr_da_stack Unexecuted instantiation: inet.c:fr_dict_attr_da_stack Unexecuted instantiation: log.c:fr_dict_attr_da_stack Unexecuted instantiation: packet.c:fr_dict_attr_da_stack Unexecuted instantiation: pair.c:fr_dict_attr_da_stack Unexecuted instantiation: pair_inline.c:fr_dict_attr_da_stack Unexecuted instantiation: pair_legacy.c:fr_dict_attr_da_stack Unexecuted instantiation: pair_print.c:fr_dict_attr_da_stack Unexecuted instantiation: pair_tokenize.c:fr_dict_attr_da_stack Unexecuted instantiation: print.c:fr_dict_attr_da_stack proto.c:fr_dict_attr_da_stack Line | Count | Source | 148 | 2.78k | { | 149 | 2.78k | fr_dict_attr_ext_da_stack_t *ext; | 150 | | | 151 | 2.78k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_DA_STACK); | 152 | 2.78k | if (!ext) return NULL; | 153 | | | 154 | 0 | return ext->da_stack; | 155 | 2.78k | } |
Unexecuted instantiation: regex.c:fr_dict_attr_da_stack Unexecuted instantiation: socket.c:fr_dict_attr_da_stack Unexecuted instantiation: stats.c:fr_dict_attr_da_stack Unexecuted instantiation: struct.c:fr_dict_attr_da_stack Unexecuted instantiation: trie.c:fr_dict_attr_da_stack Unexecuted instantiation: types.c:fr_dict_attr_da_stack Unexecuted instantiation: uri.c:fr_dict_attr_da_stack Unexecuted instantiation: value.c:fr_dict_attr_da_stack Unexecuted instantiation: fuzzer.c:fr_dict_attr_da_stack Unexecuted instantiation: base.c:fr_dict_attr_da_stack Unexecuted instantiation: vmps.c:fr_dict_attr_da_stack Unexecuted instantiation: list.c:fr_dict_attr_da_stack Unexecuted instantiation: tcp.c:fr_dict_attr_da_stack Unexecuted instantiation: abinary.c:fr_dict_attr_da_stack Unexecuted instantiation: raw.c:fr_dict_attr_da_stack Unexecuted instantiation: udp.c:fr_dict_attr_da_stack |
156 | | |
157 | | /** Return the reference associated with a group type attribute |
158 | | * |
159 | | * @param[in] da to return the reference for. |
160 | | * @return |
161 | | * - NULL if no reference available. |
162 | | * - A pointer to the attribute being referenced. |
163 | | */ |
164 | | static inline fr_dict_attr_t const *fr_dict_attr_ref(fr_dict_attr_t const *da) |
165 | 5.40M | { |
166 | 5.40M | fr_dict_attr_ext_ref_t *ext; |
167 | | |
168 | 5.40M | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF); |
169 | 5.40M | if (!ext) return NULL; |
170 | | |
171 | 36.0k | return ext->ref; |
172 | 5.40M | } Unexecuted instantiation: fuzzer_tacacs.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_vmps.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_tftp.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_dns.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_dhcpv6.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_radius.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_util.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_dhcpv4.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer_bfd.c:fr_dict_attr_ref Unexecuted instantiation: base32.c:fr_dict_attr_ref Unexecuted instantiation: base64.c:fr_dict_attr_ref Unexecuted instantiation: calc.c:fr_dict_attr_ref Unexecuted instantiation: dict_ext.c:fr_dict_attr_ref dict_fixup.c:fr_dict_attr_ref Line | Count | Source | 165 | 98 | { | 166 | 98 | fr_dict_attr_ext_ref_t *ext; | 167 | | | 168 | 98 | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF); | 169 | 98 | if (!ext) return NULL; | 170 | | | 171 | 0 | return ext->ref; | 172 | 98 | } |
Unexecuted instantiation: dict_print.c:fr_dict_attr_ref Unexecuted instantiation: dict_test.c:fr_dict_attr_ref dict_tokenize.c:fr_dict_attr_ref Line | Count | Source | 165 | 1.42k | { | 166 | 1.42k | fr_dict_attr_ext_ref_t *ext; | 167 | | | 168 | 1.42k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF); | 169 | 1.42k | if (!ext) return NULL; | 170 | | | 171 | 712 | return ext->ref; | 172 | 1.42k | } |
Unexecuted instantiation: dict_unknown.c:fr_dict_attr_ref dict_util.c:fr_dict_attr_ref Line | Count | Source | 165 | 5.39M | { | 166 | 5.39M | fr_dict_attr_ext_ref_t *ext; | 167 | | | 168 | 5.39M | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF); | 169 | 5.39M | if (!ext) return NULL; | 170 | | | 171 | 24.0k | return ext->ref; | 172 | 5.39M | } |
Unexecuted instantiation: dict_validate.c:fr_dict_attr_ref Unexecuted instantiation: dl.c:fr_dict_attr_ref Unexecuted instantiation: dns.c:fr_dict_attr_ref Unexecuted instantiation: edit.c:fr_dict_attr_ref Unexecuted instantiation: encode.c:fr_dict_attr_ref Unexecuted instantiation: file.c:fr_dict_attr_ref Unexecuted instantiation: inet.c:fr_dict_attr_ref Unexecuted instantiation: log.c:fr_dict_attr_ref Unexecuted instantiation: packet.c:fr_dict_attr_ref Unexecuted instantiation: pair.c:fr_dict_attr_ref Unexecuted instantiation: pair_inline.c:fr_dict_attr_ref Unexecuted instantiation: pair_legacy.c:fr_dict_attr_ref Unexecuted instantiation: pair_print.c:fr_dict_attr_ref Unexecuted instantiation: pair_tokenize.c:fr_dict_attr_ref Unexecuted instantiation: print.c:fr_dict_attr_ref Unexecuted instantiation: proto.c:fr_dict_attr_ref Unexecuted instantiation: regex.c:fr_dict_attr_ref Unexecuted instantiation: socket.c:fr_dict_attr_ref Unexecuted instantiation: stats.c:fr_dict_attr_ref Unexecuted instantiation: struct.c:fr_dict_attr_ref Unexecuted instantiation: trie.c:fr_dict_attr_ref Unexecuted instantiation: types.c:fr_dict_attr_ref Unexecuted instantiation: uri.c:fr_dict_attr_ref Unexecuted instantiation: value.c:fr_dict_attr_ref Unexecuted instantiation: fuzzer.c:fr_dict_attr_ref Unexecuted instantiation: base.c:fr_dict_attr_ref Unexecuted instantiation: vmps.c:fr_dict_attr_ref decode.c:fr_dict_attr_ref Line | Count | Source | 165 | 11.2k | { | 166 | 11.2k | fr_dict_attr_ext_ref_t *ext; | 167 | | | 168 | 11.2k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_REF); | 169 | 11.2k | if (!ext) return NULL; | 170 | | | 171 | 11.2k | return ext->ref; | 172 | 11.2k | } |
Unexecuted instantiation: list.c:fr_dict_attr_ref Unexecuted instantiation: tcp.c:fr_dict_attr_ref Unexecuted instantiation: abinary.c:fr_dict_attr_ref Unexecuted instantiation: raw.c:fr_dict_attr_ref Unexecuted instantiation: udp.c:fr_dict_attr_ref |
173 | | |
174 | | /** Return the vendor number for an attribute |
175 | | * |
176 | | * @param[in] da The dictionary attribute to find the |
177 | | * vendor for. |
178 | | * @return |
179 | | * - 0 this isn't a vendor specific attribute. |
180 | | * - The vendor PEN. |
181 | | */ |
182 | | static inline uint32_t fr_dict_vendor_num_by_da(fr_dict_attr_t const *da) |
183 | 59.0k | { |
184 | 59.0k | fr_dict_attr_ext_vendor_t *ext; |
185 | | |
186 | 59.0k | if (da->type == FR_TYPE_VENDOR) return da->attr; |
187 | | |
188 | 50.4k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_VENDOR); |
189 | 50.4k | if (!ext || !ext->vendor) return 0; |
190 | | |
191 | 32.5k | return ext->vendor->attr; |
192 | 50.4k | } Unexecuted instantiation: fuzzer_tacacs.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_vmps.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_tftp.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_dns.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_dhcpv6.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_radius.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_util.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_dhcpv4.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer_bfd.c:fr_dict_vendor_num_by_da Unexecuted instantiation: base32.c:fr_dict_vendor_num_by_da Unexecuted instantiation: base64.c:fr_dict_vendor_num_by_da Unexecuted instantiation: calc.c:fr_dict_vendor_num_by_da Unexecuted instantiation: decode.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dict_ext.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dict_fixup.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dict_print.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dict_test.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dict_tokenize.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dict_unknown.c:fr_dict_vendor_num_by_da dict_util.c:fr_dict_vendor_num_by_da Line | Count | Source | 183 | 59.0k | { | 184 | 59.0k | fr_dict_attr_ext_vendor_t *ext; | 185 | | | 186 | 59.0k | if (da->type == FR_TYPE_VENDOR) return da->attr; | 187 | | | 188 | 50.4k | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_VENDOR); | 189 | 50.4k | if (!ext || !ext->vendor) return 0; | 190 | | | 191 | 32.5k | return ext->vendor->attr; | 192 | 50.4k | } |
Unexecuted instantiation: dict_validate.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dl.c:fr_dict_vendor_num_by_da Unexecuted instantiation: dns.c:fr_dict_vendor_num_by_da Unexecuted instantiation: edit.c:fr_dict_vendor_num_by_da Unexecuted instantiation: encode.c:fr_dict_vendor_num_by_da Unexecuted instantiation: file.c:fr_dict_vendor_num_by_da Unexecuted instantiation: inet.c:fr_dict_vendor_num_by_da Unexecuted instantiation: log.c:fr_dict_vendor_num_by_da Unexecuted instantiation: packet.c:fr_dict_vendor_num_by_da Unexecuted instantiation: pair.c:fr_dict_vendor_num_by_da Unexecuted instantiation: pair_inline.c:fr_dict_vendor_num_by_da Unexecuted instantiation: pair_legacy.c:fr_dict_vendor_num_by_da Unexecuted instantiation: pair_print.c:fr_dict_vendor_num_by_da Unexecuted instantiation: pair_tokenize.c:fr_dict_vendor_num_by_da Unexecuted instantiation: print.c:fr_dict_vendor_num_by_da Unexecuted instantiation: proto.c:fr_dict_vendor_num_by_da Unexecuted instantiation: regex.c:fr_dict_vendor_num_by_da Unexecuted instantiation: socket.c:fr_dict_vendor_num_by_da Unexecuted instantiation: stats.c:fr_dict_vendor_num_by_da Unexecuted instantiation: struct.c:fr_dict_vendor_num_by_da Unexecuted instantiation: trie.c:fr_dict_vendor_num_by_da Unexecuted instantiation: types.c:fr_dict_vendor_num_by_da Unexecuted instantiation: uri.c:fr_dict_vendor_num_by_da Unexecuted instantiation: value.c:fr_dict_vendor_num_by_da Unexecuted instantiation: fuzzer.c:fr_dict_vendor_num_by_da Unexecuted instantiation: base.c:fr_dict_vendor_num_by_da Unexecuted instantiation: vmps.c:fr_dict_vendor_num_by_da Unexecuted instantiation: list.c:fr_dict_vendor_num_by_da Unexecuted instantiation: tcp.c:fr_dict_vendor_num_by_da Unexecuted instantiation: abinary.c:fr_dict_vendor_num_by_da Unexecuted instantiation: raw.c:fr_dict_vendor_num_by_da Unexecuted instantiation: udp.c:fr_dict_vendor_num_by_da |
193 | | |
194 | | /** Return the vendor da for an attribute |
195 | | * |
196 | | * @param[in] da The dictionary attribute to find the |
197 | | * vendor for. |
198 | | * @return |
199 | | * - 0 this isn't a vendor specific attribute. |
200 | | * - The vendor PEN. |
201 | | */ |
202 | | static inline fr_dict_attr_t const *fr_dict_vendor_da_by_da(fr_dict_attr_t const *da) |
203 | 0 | { |
204 | 0 | fr_dict_attr_ext_vendor_t *ext; |
205 | 0 |
|
206 | 0 | if (da->type == FR_TYPE_VENDOR) return da; |
207 | 0 |
|
208 | 0 | ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_VENDOR); |
209 | 0 | if (!ext) return NULL; |
210 | 0 |
|
211 | 0 | return ext->vendor; |
212 | 0 | } Unexecuted instantiation: fuzzer_tacacs.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_vmps.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_tftp.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_dns.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_dhcpv6.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_radius.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_util.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_dhcpv4.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer_bfd.c:fr_dict_vendor_da_by_da Unexecuted instantiation: base32.c:fr_dict_vendor_da_by_da Unexecuted instantiation: base64.c:fr_dict_vendor_da_by_da Unexecuted instantiation: calc.c:fr_dict_vendor_da_by_da Unexecuted instantiation: decode.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_ext.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_fixup.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_print.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_test.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_tokenize.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_unknown.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_util.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dict_validate.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dl.c:fr_dict_vendor_da_by_da Unexecuted instantiation: dns.c:fr_dict_vendor_da_by_da Unexecuted instantiation: edit.c:fr_dict_vendor_da_by_da Unexecuted instantiation: encode.c:fr_dict_vendor_da_by_da Unexecuted instantiation: file.c:fr_dict_vendor_da_by_da Unexecuted instantiation: inet.c:fr_dict_vendor_da_by_da Unexecuted instantiation: log.c:fr_dict_vendor_da_by_da Unexecuted instantiation: packet.c:fr_dict_vendor_da_by_da Unexecuted instantiation: pair.c:fr_dict_vendor_da_by_da Unexecuted instantiation: pair_inline.c:fr_dict_vendor_da_by_da Unexecuted instantiation: pair_legacy.c:fr_dict_vendor_da_by_da Unexecuted instantiation: pair_print.c:fr_dict_vendor_da_by_da Unexecuted instantiation: pair_tokenize.c:fr_dict_vendor_da_by_da Unexecuted instantiation: print.c:fr_dict_vendor_da_by_da Unexecuted instantiation: proto.c:fr_dict_vendor_da_by_da Unexecuted instantiation: regex.c:fr_dict_vendor_da_by_da Unexecuted instantiation: socket.c:fr_dict_vendor_da_by_da Unexecuted instantiation: stats.c:fr_dict_vendor_da_by_da Unexecuted instantiation: struct.c:fr_dict_vendor_da_by_da Unexecuted instantiation: trie.c:fr_dict_vendor_da_by_da Unexecuted instantiation: types.c:fr_dict_vendor_da_by_da Unexecuted instantiation: uri.c:fr_dict_vendor_da_by_da Unexecuted instantiation: value.c:fr_dict_vendor_da_by_da Unexecuted instantiation: fuzzer.c:fr_dict_vendor_da_by_da Unexecuted instantiation: base.c:fr_dict_vendor_da_by_da Unexecuted instantiation: vmps.c:fr_dict_vendor_da_by_da Unexecuted instantiation: list.c:fr_dict_vendor_da_by_da Unexecuted instantiation: tcp.c:fr_dict_vendor_da_by_da Unexecuted instantiation: abinary.c:fr_dict_vendor_da_by_da Unexecuted instantiation: raw.c:fr_dict_vendor_da_by_da Unexecuted instantiation: udp.c:fr_dict_vendor_da_by_da |
213 | | |
214 | | /** @} */ |
215 | | |
216 | | void fr_dict_attr_ext_debug(fr_dict_attr_t const *da); |
217 | | |
218 | | #ifdef __cplusplus |
219 | | } |
220 | | #endif |