From: Alan T. DeKok Date: Thu, 17 Mar 2022 22:55:36 +0000 (-0400) Subject: allow "prefix=bits" X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00910a1a8c33daf18533739b56c66ce02070e2f2;p=thirdparty%2Ffreeradius-server.git allow "prefix=bits" for prefixes which are encoded as 8 bits of prefix, followed by 0..3 bytes of actual content --- diff --git a/src/protocols/dhcpv4/base.c b/src/protocols/dhcpv4/base.c index ae5e52c3dd0..c899a62214e 100644 --- a/src/protocols/dhcpv4/base.c +++ b/src/protocols/dhcpv4/base.c @@ -747,6 +747,7 @@ static fr_table_num_ordered_t const subtype_table[] = { { L("dns_label"), FLAG_ENCODE_DNS_LABEL }, { L("encode=dns_label"), FLAG_ENCODE_DNS_LABEL }, { L("prefix=split"), FLAG_ENCODE_SPLIT_PREFIX }, + { L("prefix=bits"), FLAG_ENCODE_BITS_PREFIX }, { L("encode=exists"), FLAG_ENCODE_BOOL_EXISTS }, }; @@ -764,7 +765,8 @@ static bool attr_valid(UNUSED fr_dict_t *dict, UNUSED fr_dict_attr_t const *pare fr_strerror_const("string/octets arrays require the 'length=uint8' flag"); return false; } - } else if (flags->array && !flags->length) { + + } else if (flags->array && !flags->length && !flags->is_known_width) { fr_strerror_const("Variable length attributes cannot be marked as 'array'"); return false; } @@ -780,8 +782,9 @@ static bool attr_valid(UNUSED fr_dict_t *dict, UNUSED fr_dict_attr_t const *pare return false; } - if ((type != FR_TYPE_IPV4_PREFIX) && (flags->subtype == FLAG_ENCODE_SPLIT_PREFIX)) { - fr_strerror_const("The 'split' flag can only be used with attributes of type 'ipv4prefix'"); + if ((type != FR_TYPE_IPV4_PREFIX) && + ((flags->subtype == FLAG_ENCODE_SPLIT_PREFIX) || (flags->subtype == FLAG_ENCODE_BITS_PREFIX))) { + fr_strerror_const("The 'prefix=...' flag can only be used with attributes of type 'ipv4prefix'"); return false; } diff --git a/src/protocols/dhcpv4/dhcpv4.h b/src/protocols/dhcpv4/dhcpv4.h index 31262f466f3..807953398db 100644 --- a/src/protocols/dhcpv4/dhcpv4.h +++ b/src/protocols/dhcpv4/dhcpv4.h @@ -72,11 +72,13 @@ enum { FLAG_ENCODE_NONE = 0, //!< no particular encoding for DHCPv6 strings FLAG_ENCODE_DNS_LABEL, //!< encode as DNS label FLAG_ENCODE_SPLIT_PREFIX, //!< encode IPv4 prefixes as Policy-Filter, split into IP/mask + FLAG_ENCODE_BITS_PREFIX, //!< encode IPv4 prefixes as prefix bits, followed by IP. FLAG_ENCODE_BOOL_EXISTS, //!< bool as existence checks }; #define da_is_dns_label(_da) (!(_da)->flags.extra && ((_da)->flags.subtype == FLAG_ENCODE_DNS_LABEL)) #define da_is_split_prefix(_da) (!(_da)->flags.extra && ((_da)->flags.subtype == FLAG_ENCODE_SPLIT_PREFIX)) +#define da_is_bits_prefix(_da) (!(_da)->flags.extra && ((_da)->flags.subtype == FLAG_ENCODE_BITS_PREFIX)) #define da_is_bool_exists(_da) (!(_da)->flags.extra && ((_da)->flags.subtype == FLAG_ENCODE_BOOL_EXISTS)) typedef struct {