25RCSIDH(types_h,
"$Id: 0c9dadd2d22167a59e0729c9d13579a6edba8a8b $")
31#include <freeradius-devel/util/table.h>
32#include <freeradius-devel/util/talloc.h>
105#define FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_beg, _mid, _end) \
106 _beg(FR_TYPE_UINT8) \
107 _mid(FR_TYPE_UINT16) \
108 _mid(FR_TYPE_UINT32) \
109 _mid(FR_TYPE_UINT64) \
111 _mid(FR_TYPE_INT16) \
112 _mid(FR_TYPE_INT32) \
113 _mid(FR_TYPE_INT64) \
115 _mid(FR_TYPE_TIME_DELTA) \
125#define FR_TYPE_INTEGER_DEF(_beg, _mid, _end) \
127 FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(_mid, _mid, _end)
135#define FR_TYPE_SIGNED_DEF(_beg, _mid, _end) \
137 _mid(FR_TYPE_INT16) \
138 _mid(FR_TYPE_INT32) \
139 _mid(FR_TYPE_INT64) \
140 _mid(FR_TYPE_TIME_DELTA) \
141 _mid(FR_TYPE_FLOAT32) \
142 _end(FR_TYPE_FLOAT64)
152#define FR_TYPE_NUMERIC_DEF(_beg, _mid, _end) \
153 _beg(FR_TYPE_FLOAT32) \
154 _mid(FR_TYPE_FLOAT64) \
155 FR_TYPE_INTEGER_DEF(_mid, _mid, _end)
166#define FR_TYPE_IP_DEF(_beg, _mid, _end) \
167 _beg(FR_TYPE_COMBO_IP_ADDR) \
168 _mid(FR_TYPE_COMBO_IP_PREFIX) \
169 _mid(FR_TYPE_IPV4_ADDR) \
170 _mid(FR_TYPE_IPV4_PREFIX) \
171 _mid(FR_TYPE_IPV6_ADDR) \
172 _end(FR_TYPE_IPV6_PREFIX)
180#define FR_TYPE_FIXED_SIZE_DEF(_beg, _mid, _end) \
181 _beg(FR_TYPE_ETHERNET) \
183 _mid(FR_TYPE_IPV4_ADDR) \
184 _mid(FR_TYPE_IPV4_PREFIX) \
185 _mid(FR_TYPE_IPV6_ADDR) \
186 _mid(FR_TYPE_IPV6_PREFIX) \
187 FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
198#define FR_TYPE_VARIABLE_SIZE_DEF(_beg, _mid, _end) \
199 _beg(FR_TYPE_STRING) \
207#define FR_TYPE_QUOTED_DEF(_beg, _mid, _end) \
208 _beg(FR_TYPE_STRING) \
218#define FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_beg, _mid, _end) \
219 _beg(FR_TYPE_GROUP) \
220 _mid(FR_TYPE_STRUCT) \
231#define FR_TYPE_STRUCTURAL_EXCEPT_GROUP_DEF(_beg, _mid, _end) \
233 _mid(FR_TYPE_STRUCT) \
245#define FR_TYPE_STRUCTURAL_DEF(_beg, _mid, _end) \
247 FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(_mid, _mid, _end)
256#define FR_TYPE_LEAF_DEF(_beg, _mid, _end) \
257 _beg(FR_TYPE_ETHERNET) \
259 FR_TYPE_IP_DEF(_mid, _mid, _mid) \
260 FR_TYPE_VARIABLE_SIZE_DEF(_mid, _mid, _mid) \
261 FR_TYPE_NUMERIC_DEF(_mid, _mid, _end)
269#define FR_TYPE_INTERNAL_DEF(_beg, _mid, _end) \
270 _beg(FR_TYPE_VALUE_BOX) \
272 _mid(FR_TYPE_VALUE_BOX_CURSOR) \
273 _mid(FR_TYPE_PAIR_CURSOR) \
284#define FR_TYPE_NON_LEAF_DEF(_beg, _mid, _end) \
286 FR_TYPE_INTERNAL_DEF(_mid, _mid, _mid) \
287 FR_TYPE_STRUCTURAL_DEF(_mid, _mid, _end)
295#define CASE_BEG(_type) _type:
296#define CASE_MID(_type) case _type:
297#define CASE_END(_type) case _type
299#define FR_TYPE_INTEGER_EXCEPT_BOOL FR_TYPE_INTEGER_EXCEPT_BOOL_DEF(CASE_BEG, CASE_MID, CASE_END)
300#define FR_TYPE_INTEGER FR_TYPE_INTEGER_DEF(CASE_BEG, CASE_MID, CASE_END)
301#define FR_TYPE_SIGNED FR_TYPE_SIGNED_DEF(CASE_BEG, CASE_MID, CASE_END)
302#define FR_TYPE_NUMERIC FR_TYPE_NUMERIC_DEF(CASE_BEG, CASE_MID, CASE_END)
304#define FR_TYPE_IP FR_TYPE_IP_DEF(CASE_BEG, CASE_MID, CASE_END)
306#define FR_TYPE_FIXED_SIZE FR_TYPE_FIXED_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
307#define FR_TYPE_VARIABLE_SIZE FR_TYPE_VARIABLE_SIZE_DEF(CASE_BEG, CASE_MID, CASE_END)
308#define FR_TYPE_QUOTED FR_TYPE_QUOTED_DEF(CASE_BEG, CASE_MID, CASE_END)
310#define FR_TYPE_STRUCTURAL_EXCEPT_VSA FR_TYPE_STRUCTURAL_EXCEPT_VSA_DEF(CASE_BEG, CASE_MID, CASE_END)
311#define FR_TYPE_STRUCTURAL_EXCEPT_GROUP FR_TYPE_STRUCTURAL_EXCEPT_GROUP_DEF(CASE_BEG, CASE_MID, CASE_END)
312#define FR_TYPE_STRUCTURAL FR_TYPE_STRUCTURAL_DEF(CASE_BEG, CASE_MID, CASE_END)
313#define FR_TYPE_LEAF FR_TYPE_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
314#define FR_TYPE_NON_LEAF FR_TYPE_NON_LEAF_DEF(CASE_BEG, CASE_MID, CASE_END)
315#define FR_TYPE_INTERNAL FR_TYPE_INTERNAL_DEF(CASE_BEG, CASE_MID, CASE_END)
343#define fr_type_is_null(_x) ((_x) == FR_TYPE_NULL)
344#define fr_type_is_string(_x) ((_x) == FR_TYPE_STRING)
345#define fr_type_is_octets(_x) ((_x) == FR_TYPE_OCTETS)
346#define fr_type_is_ipv4addr(_x) ((_x) == FR_TYPE_IPV4_ADDR)
347#define fr_type_is_ipv4prefix(_x) ((_x) == FR_TYPE_IPV4_PREFIX)
348#define fr_type_is_ipv6addr(_x) ((_x) == FR_TYPE_IPV6_ADDR)
349#define fr_type_is_ipv6prefix(_x) ((_x) == FR_TYPE_IPV6_PREFIX)
350#define fr_type_is_ifid(_x) ((_x) == FR_TYPE_IFID)
351#define fr_type_is_combo_ipaddr(_x) ((_x) == FR_TYPE_COMBO_IP_ADDR)
352#define fr_type_is_combo_ipprefix(_x) ((_x) == FR_TYPE_COMBO_IP_PREFIX)
353#define fr_type_is_ethernet(_x) ((_x) == FR_TYPE_ETHERNET)
354#define fr_type_is_bool(_x) ((_x) == FR_TYPE_BOOL)
355#define fr_type_is_uint8(_x) ((_x) == FR_TYPE_UINT8)
356#define fr_type_is_uint16(_x) ((_x) == FR_TYPE_UINT16)
357#define fr_type_is_uint32(_x) ((_x) == FR_TYPE_UINT32)
358#define fr_type_is_uint64(_x) ((_x) == FR_TYPE_UINT64)
359#define fr_type_is_int8(_x) ((_x) == FR_TYPE_INT8)
360#define fr_type_is_int16(_x) ((_x) == FR_TYPE_INT16)
361#define fr_type_is_int32(_x) ((_x) == FR_TYPE_INT32)
362#define fr_type_is_int64(_x) ((_x) == FR_TYPE_INT64)
363#define fr_type_is_float32(_x) ((_x) == FR_TYPE_FLOAT32)
364#define fr_type_is_float64(_x) ((_x) == FR_TYPE_FLOAT64)
365#define fr_type_is_date(_x) ((_x) == FR_TYPE_DATE)
366#define fr_type_is_time_delta(_x) ((_x) == FR_TYPE_TIME_DELTA)
367#define fr_type_is_size(_x) ((_x) == FR_TYPE_SIZE)
368#define fr_type_is_tlv(_x) ((_x) == FR_TYPE_TLV)
369#define fr_type_is_struct(_x) ((_x) == FR_TYPE_STRUCT)
370#define fr_type_is_vsa(_x) ((_x) == FR_TYPE_VSA)
371#define fr_type_is_vendor(_x) ((_x) == FR_TYPE_VENDOR)
372#define fr_type_is_group(_x) ((_x) == FR_TYPE_GROUP)
373#define fr_type_is_value_box(_x) ((_x) == FR_TYPE_VALUE_BOX)
374#define fr_type_is_void(_x) ((_x) == FR_TYPE_VOID)
376#define fr_type_is_integer_except_bool(_x) (fr_type_integer_except_bool[_x])
377#define fr_type_is_integer(_x) (fr_type_integer[_x])
378#define fr_type_is_numeric(_x) (fr_type_numeric[_x])
379#define fr_type_is_signed(_x) (fr_type_signed[_x])
381#define fr_type_is_ip(_x) (fr_type_ip[_x])
383#define fr_type_is_fixed_size(_x) (fr_type_fixed_size[_x])
384#define fr_type_is_variable_size(_x) (fr_type_variable_size[_x])
385#define fr_type_is_quoted(_x) (fr_type_quoted[_x])
387#define fr_type_is_structural_except_vsa(_x) (fr_type_structural_except_vsa[_x])
388#define fr_type_is_structural(_x) (fr_type_structural[_x])
389#define fr_type_is_leaf(_x) (fr_type_leaf[_x])
390#define fr_type_is_non_leaf(_x) (fr_type_non_leaf[_x])
402# define FR_CTYPE_TO_TYPE(_ct) \
404 fr_ethernet_t * : FR_TYPE_ETHERNET, \
405 fr_ethernet_t ** : FR_TYPE_ETHERNET, \
406 fr_ifid_t * : FR_TYPE_IFID, \
407 fr_ifid_t ** : FR_TYPE_IFID, \
408 fr_time_t * : FR_TYPE_DATE, \
409 fr_time_t ** : FR_TYPE_DATE, \
410 fr_time_delta_t * : FR_TYPE_TIME_DELTA, \
411 fr_time_delta_t ** : FR_TYPE_TIME_DELTA, \
412 char const ** : FR_TYPE_STRING, \
413 char const *** : FR_TYPE_STRING, \
414 bool * : FR_TYPE_BOOL, \
415 bool ** : FR_TYPE_BOOL, \
416 uint8_t const ** : FR_TYPE_OCTETS, \
417 uint8_t const *** : FR_TYPE_OCTETS, \
418 uint8_t * : FR_TYPE_UINT8, \
419 uint8_t ** : FR_TYPE_UINT8, \
420 uint16_t * : FR_TYPE_UINT16, \
421 uint16_t ** : FR_TYPE_UINT16, \
422 uint32_t * : FR_TYPE_UINT32, \
423 uint32_t ** : FR_TYPE_UINT32, \
424 uint64_t * : FR_TYPE_UINT64, \
425 uint64_t ** : FR_TYPE_UINT64, \
426 int8_t * : FR_TYPE_INT8, \
427 int8_t ** : FR_TYPE_INT8, \
428 int16_t * : FR_TYPE_INT16, \
429 int16_t ** : FR_TYPE_INT16, \
430 int32_t * : FR_TYPE_INT32, \
431 int32_t ** : FR_TYPE_INT32, \
432 int64_t * : FR_TYPE_INT64, \
433 int64_t ** : FR_TYPE_INT64, \
434 float * : FR_TYPE_FLOAT32, \
435 float ** : FR_TYPE_FLOAT32, \
436 double * : FR_TYPE_FLOAT64, \
437 double ** : FR_TYPE_FLOAT64, \
438 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_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_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.