25RCSIDH(types_h,
"$Id: a310f3ed4d2839eff56a7e525ee91414c30d2d15 $")
31#include <freeradius-devel/util/table.h>
32#include <freeradius-devel/util/talloc.h>
107#define FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_beg, _mid, _end) \
108 _beg(FR_TYPE_UINT8) \
109 _mid(FR_TYPE_UINT16) \
110 _mid(FR_TYPE_UINT32) \
111 _mid(FR_TYPE_UINT64) \
113 _mid(FR_TYPE_INT16) \
114 _mid(FR_TYPE_INT32) \
115 _mid(FR_TYPE_INT64) \
117 _mid(FR_TYPE_TIME_DELTA) \
127#define FR_TYPE_INTEGER_DEF(_beg, _mid, _end) \
129 FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
137#define FR_TYPE_SIGNED_DEF(_beg, _mid, _end) \
139 _mid(FR_TYPE_INT16) \
140 _mid(FR_TYPE_INT32) \
141 _mid(FR_TYPE_INT64) \
142 _mid(FR_TYPE_TIME_DELTA) \
143 _mid(FR_TYPE_FLOAT32) \
144 _end(FR_TYPE_FLOAT64)
154#define FR_TYPE_NUMERIC_DEF(_beg, _mid, _end) \
155 _beg(FR_TYPE_FLOAT32) \
156 _mid(FR_TYPE_FLOAT64) \
157 FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
168#define FR_TYPE_IP_DEF(_beg, _mid, _end) \
169 _beg(FR_TYPE_COMBO_IP_ADDR) \
170 _mid(FR_TYPE_COMBO_IP_PREFIX) \
171 _mid(FR_TYPE_IPV4_ADDR) \
172 _mid(FR_TYPE_IPV4_PREFIX) \
173 _mid(FR_TYPE_IPV6_ADDR) \
174 _end(FR_TYPE_IPV6_PREFIX)
182#define FR_TYPE_FIXED_SIZE_DEF(_beg, _mid, _end) \
183 _beg(FR_TYPE_ETHERNET) \
185 _mid(FR_TYPE_IPV4_ADDR) \
186 _mid(FR_TYPE_IPV4_PREFIX) \
187 _mid(FR_TYPE_IPV6_ADDR) \
188 _mid(FR_TYPE_IPV6_PREFIX) \
189 FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
200#define FR_TYPE_VARIABLE_SIZE_DEF(_beg, _mid, _end) \
201 _beg(FR_TYPE_STRING) \
209#define FR_TYPE_QUOTED_DEF(_beg, _mid, _end) \
210 _beg(FR_TYPE_STRING) \
220#define FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_beg, _mid, _end) \
221 _beg(FR_TYPE_GROUP) \
222 _mid(FR_TYPE_STRUCT) \
224 _mid(FR_TYPE_UNION) \
234#define FR_TYPE_STRUCTURAL_EXCEPT_GROUP_DEF(_beg, _mid, _end) \
236 _mid(FR_TYPE_STRUCT) \
238 _mid(FR_TYPE_UNION) \
249#define FR_TYPE_STRUCTURAL_DEF(_beg, _mid, _end) \
251 FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
260#define FR_TYPE_LEAF_DEF(_beg, _mid, _end) \
261 _beg(FR_TYPE_ETHERNET) \
264 FR_TYPE_IP_DEF(_mid, _mid, _mid) \
265 FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
266 FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
274#define FR_TYPE_INTERNAL_DEF(_beg, _mid, _end) \
275 _beg(FR_TYPE_VALUE_BOX) \
277 _mid(FR_TYPE_VALUE_BOX_CURSOR) \
278 _mid(FR_TYPE_PAIR_CURSOR) \
289#define FR_TYPE_NON_LEAF_DEF(_beg, _mid, _end) \
291 FR_TYPE_INTERNAL_DEF(_mid, _mid, _mid) \
292 FR_TYPE_STRUCTURAL_DEF(_mid, _mid, _end)
300#define CASE_BEG(_type) _type:
301#define CASE_MID(_type) case _type:
302#define CASE_END(_type) case _type
304#define FR_TYPE_INTEGER_EXCEPT_BOOL FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(CASE_BEG, CASE_MID, CASE_END)
305#define FR_TYPE_INTEGER FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
306#define FR_TYPE_SIGNED FR_TYPE_SIGNED_DEF(CASE_BEG, CASE_MID, CASE_END)
307#define FR_TYPE_NUMERIC FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
309#define FR_TYPE_IP FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
311#define FR_TYPE_FIXED_SIZE FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
312#define FR_TYPE_VARIABLE_SIZE FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
313#define FR_TYPE_QUOTED FR_TYPE_QUOTED_DEF(CASE_BEG, CASE_MID, CASE_END)
315#define FR_TYPE_STRUCTURAL_EXCEPT_VSA FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(CASE_BEG, CASE_MID, CASE_END)
316#define FR_TYPE_STRUCTURAL_EXCEPT_GROUP FR_TYPE_STRUCTURAL_EXCEPT_GROUP_DEF(CASE_BEG, CASE_MID, CASE_END)
317#define FR_TYPE_STRUCTURAL FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
318#define FR_TYPE_LEAF FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
319#define FR_TYPE_NON_LEAF FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
320#define FR_TYPE_INTERNAL FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
348#define fr_type_is_null(_x) ((_x) == FR_TYPE_NULL)
349#define fr_type_is_string(_x) ((_x) == FR_TYPE_STRING)
350#define fr_type_is_octets(_x) ((_x) == FR_TYPE_OCTETS)
351#define fr_type_is_ipv4addr(_x) ((_x) == FR_TYPE_IPV4_ADDR)
352#define fr_type_is_ipv4prefix(_x) ((_x) == FR_TYPE_IPV4_PREFIX)
353#define fr_type_is_ipv6addr(_x) ((_x) == FR_TYPE_IPV6_ADDR)
354#define fr_type_is_ipv6prefix(_x) ((_x) == FR_TYPE_IPV6_PREFIX)
355#define fr_type_is_ifid(_x) ((_x) == FR_TYPE_IFID)
356#define fr_type_is_combo_ipaddr(_x) ((_x) == FR_TYPE_COMBO_IP_ADDR)
357#define fr_type_is_combo_ipprefix(_x) ((_x) == FR_TYPE_COMBO_IP_PREFIX)
358#define fr_type_is_ethernet(_x) ((_x) == FR_TYPE_ETHERNET)
359#define fr_type_is_bool(_x) ((_x) == FR_TYPE_BOOL)
360#define fr_type_is_uint8(_x) ((_x) == FR_TYPE_UINT8)
361#define fr_type_is_uint16(_x) ((_x) == FR_TYPE_UINT16)
362#define fr_type_is_uint32(_x) ((_x) == FR_TYPE_UINT32)
363#define fr_type_is_uint64(_x) ((_x) == FR_TYPE_UINT64)
364#define fr_type_is_int8(_x) ((_x) == FR_TYPE_INT8)
365#define fr_type_is_int16(_x) ((_x) == FR_TYPE_INT16)
366#define fr_type_is_int32(_x) ((_x) == FR_TYPE_INT32)
367#define fr_type_is_int64(_x) ((_x) == FR_TYPE_INT64)
368#define fr_type_is_float32(_x) ((_x) == FR_TYPE_FLOAT32)
369#define fr_type_is_float64(_x) ((_x) == FR_TYPE_FLOAT64)
370#define fr_type_is_date(_x) ((_x) == FR_TYPE_DATE)
371#define fr_type_is_time_delta(_x) ((_x) == FR_TYPE_TIME_DELTA)
372#define fr_type_is_size(_x) ((_x) == FR_TYPE_SIZE)
373#define fr_type_is_tlv(_x) ((_x) == FR_TYPE_TLV)
374#define fr_type_is_struct(_x) ((_x) == FR_TYPE_STRUCT)
375#define fr_type_is_vsa(_x) ((_x) == FR_TYPE_VSA)
376#define fr_type_is_vendor(_x) ((_x) == FR_TYPE_VENDOR)
377#define fr_type_is_group(_x) ((_x) == FR_TYPE_GROUP)
378#define fr_type_is_value_box(_x) ((_x) == FR_TYPE_VALUE_BOX)
379#define fr_type_is_void(_x) ((_x) == FR_TYPE_VOID)
381#define fr_type_is_integer_except_bool(_x) (fr_type_integer_except_bool[_x])
382#define fr_type_is_integer(_x) (fr_type_integer[_x])
383#define fr_type_is_numeric(_x) (fr_type_numeric[_x])
384#define fr_type_is_signed(_x) (fr_type_signed[_x])
386#define fr_type_is_ip(_x) (fr_type_ip[_x])
388#define fr_type_is_fixed_size(_x) (fr_type_fixed_size[_x])
389#define fr_type_is_variable_size(_x) (fr_type_variable_size[_x])
390#define fr_type_is_quoted(_x) (fr_type_quoted[_x])
392#define fr_type_is_structural_except_vsa(_x) (fr_type_structural_except_vsa[_x])
393#define fr_type_is_structural(_x) (fr_type_structural[_x])
394#define fr_type_is_leaf(_x) (fr_type_leaf[_x])
395#define fr_type_is_non_leaf(_x) (fr_type_non_leaf[_x])
407# define FR_CTYPE_TO_TYPE(_ct) \
409 fr_ethernet_t * : FR_TYPE_ETHERNET, \
410 fr_ethernet_t ** : FR_TYPE_ETHERNET, \
411 fr_ifid_t * : FR_TYPE_IFID, \
412 fr_ifid_t ** : FR_TYPE_IFID, \
413 fr_time_t * : FR_TYPE_DATE, \
414 fr_time_t ** : FR_TYPE_DATE, \
415 fr_time_delta_t * : FR_TYPE_TIME_DELTA, \
416 fr_time_delta_t ** : FR_TYPE_TIME_DELTA, \
417 char const ** : FR_TYPE_STRING, \
418 char const *** : FR_TYPE_STRING, \
419 bool * : FR_TYPE_BOOL, \
420 bool ** : FR_TYPE_BOOL, \
421 uint8_t const ** : FR_TYPE_OCTETS, \
422 uint8_t const *** : FR_TYPE_OCTETS, \
423 uint8_t * : FR_TYPE_UINT8, \
424 uint8_t ** : FR_TYPE_UINT8, \
425 uint16_t * : FR_TYPE_UINT16, \
426 uint16_t ** : FR_TYPE_UINT16, \
427 uint32_t * : FR_TYPE_UINT32, \
428 uint32_t ** : FR_TYPE_UINT32, \
429 uint64_t * : FR_TYPE_UINT64, \
430 uint64_t ** : FR_TYPE_UINT64, \
431 int8_t * : FR_TYPE_INT8, \
432 int8_t ** : FR_TYPE_INT8, \
433 int16_t * : FR_TYPE_INT16, \
434 int16_t ** : FR_TYPE_INT16, \
435 int32_t * : FR_TYPE_INT32, \
436 int32_t ** : FR_TYPE_INT32, \
437 int64_t * : FR_TYPE_INT64, \
438 int64_t ** : FR_TYPE_INT64, \
439 float * : FR_TYPE_FLOAT32, \
440 float ** : FR_TYPE_FLOAT32, \
441 double * : FR_TYPE_FLOAT64, \
442 double ** : FR_TYPE_FLOAT64, \
443 default : FR_TYPE_VOID )
fr_aka_sim_id_type_t type
#define fr_table_value_by_str(_table, _name, _def)
Convert a string to a value using a sorted or ordered table.
#define fr_table_str_by_value(_table, _number, _def)
Convert an integer to a string.
An element in an arbitrarily ordered array of name to num mappings.
fr_table_num_ordered_t const fr_type_table[]
Map data types to names representing those types.
bool const fr_type_structural_except_vsa[FR_TYPE_MAX+1]
fr_type_t
Internal data types.
@ FR_TYPE_TIME_DELTA
A period of time measured in nanoseconds.
@ FR_TYPE_FLOAT32
Single precision floating point.
@ FR_TYPE_VALUE_BOX_CURSOR
cursor over a fr_value_box_t
@ FR_TYPE_IPV4_ADDR
32 Bit IPv4 Address.
@ FR_TYPE_INT8
8 Bit signed integer.
@ FR_TYPE_TLV
Contains nested attributes.
@ FR_TYPE_ETHERNET
48 Bit Mac-Address.
@ FR_TYPE_IPV6_PREFIX
IPv6 Prefix.
@ FR_TYPE_STRING
String of printable characters.
@ FR_TYPE_MAX
Number of defined data types.
@ FR_TYPE_NULL
Invalid (uninitialised) attribute type.
@ FR_TYPE_UINT16
16 Bit unsigned integer.
@ FR_TYPE_INT64
64 Bit signed integer.
@ FR_TYPE_INT16
16 Bit signed integer.
@ FR_TYPE_DATE
Unix time stamp, always has value >2^31.
@ FR_TYPE_UNION
A union of limited children.
@ FR_TYPE_COMBO_IP_PREFIX
IPv4 or IPv6 address prefix depending on length.
@ FR_TYPE_VALUE_BOX
A boxed value.
@ FR_TYPE_UINT8
8 Bit unsigned integer.
@ FR_TYPE_UINT32
32 Bit unsigned integer.
@ FR_TYPE_STRUCT
like TLV, but without T or L, and fixed-width children
@ FR_TYPE_ATTR
A contains an attribute reference.
@ FR_TYPE_INT32
32 Bit signed integer.
@ FR_TYPE_VENDOR
Attribute that represents a vendor in the attribute tree.
@ FR_TYPE_UINT64
64 Bit unsigned integer.
@ FR_TYPE_IPV6_ADDR
128 Bit IPv6 Address.
@ FR_TYPE_IPV4_PREFIX
IPv4 Prefix.
@ FR_TYPE_BOOL
A truth value.
@ FR_TYPE_SIZE
Unsigned integer capable of representing any memory address on the local system.
@ FR_TYPE_VSA
Vendor-Specific, for RADIUS attribute 26.
@ FR_TYPE_COMBO_IP_ADDR
IPv4 or IPv6 address depending on length.
@ FR_TYPE_IFID
Interface ID.
@ FR_TYPE_PAIR_CURSOR
cursor over a fr_pair_t
@ FR_TYPE_OCTETS
Raw octets.
@ FR_TYPE_GROUP
A grouping of other attributes.
@ FR_TYPE_FLOAT64
Double precision floating point.
bool const fr_type_non_leaf[FR_TYPE_MAX+1]
bool fr_type_cast(fr_type_t dst, fr_type_t src)
Return if we're allowed to cast the types.
bool const fr_type_signed[FR_TYPE_MAX+1]
bool const fr_type_integer[FR_TYPE_MAX+1]
bool const fr_type_variable_size[FR_TYPE_MAX+1]
bool const fr_type_numeric[FR_TYPE_MAX+1]
bool const fr_type_ip[FR_TYPE_MAX+1]
bool const fr_type_fixed_size[FR_TYPE_MAX+1]
bool const fr_type_integer_except_bool[FR_TYPE_MAX+1]
bool const fr_type_quoted[FR_TYPE_MAX+1]
void ** fr_type_array_alloc(TALLOC_CTX *ctx, fr_type_t type, size_t count)
Allocate an array of a given type.
bool const fr_type_leaf[FR_TYPE_MAX+1]
fr_type_t fr_type_promote(fr_type_t a, fr_type_t b)
Return the promoted type.
static char const * fr_type_to_str(fr_type_t type)
Return a static string containing the type name.
bool const fr_type_structural[FR_TYPE_MAX+1]
static fr_type_t fr_type_from_str(char const *type)
Return the constant value representing a type.