]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
switch dhcpv4 to use FR_TYPE_ATTR for Parameter-Request-List
authorAlan T. DeKok <aland@freeradius.org>
Tue, 29 Jul 2025 13:04:30 +0000 (09:04 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 29 Jul 2025 13:04:30 +0000 (09:04 -0400)
the underlying data type / length of the encoding is defined by
the size of the attribute number, and not by the dictionaries

share/dictionary/dhcpv4/dictionary.rfc2131
src/protocols/dhcpv4/base.c
src/protocols/dhcpv4/decode.c
src/protocols/dhcpv4/encode.c
src/tests/unit/protocols/dhcpv4/PRIV_bootp-both_overload.txt
src/tests/unit/protocols/dhcpv4/PRIV_bootp-both_overload_empty-no_end.txt
src/tests/unit/protocols/dhcpv4/base.txt

index 3b053eefc81bffb9226e14b3431fd130bab7e85b..12d41192c358d44a610f9b67e8d5caf1ed2be6d5 100644 (file)
@@ -109,7 +109,7 @@ ATTRIBUTE   Server-Identifier                       54      ipaddr
 
 # Array of 1-uint8 numbers indicating which options the client
 # would like to see in the response.
-ATTRIBUTE      Parameter-Request-List                  55      uint8 array
+ATTRIBUTE      Parameter-Request-List                  55      attribute array
 ATTRIBUTE      Error-Message                           56      string
 ATTRIBUTE      Maximum-Msg-Size                        57      uint16
 ATTRIBUTE      Renewal-Time                            58      uint32
@@ -179,121 +179,3 @@ ATTRIBUTE Site-specific-29                        253     octets
 ATTRIBUTE      Site-specific-30                        254     octets
 
 ATTRIBUTE      End-Of-Options                          255     uint8
-
-VALUE  Parameter-Request-List          Subnet-Mask             1
-VALUE  Parameter-Request-List          Time-Offset             2
-VALUE  Parameter-Request-List          Router-Address          3
-VALUE  Parameter-Request-List          Time-Server             4
-VALUE  Parameter-Request-List          IEN-116-Name-Server     5
-VALUE  Parameter-Request-List          Domain-Name-Server      6
-VALUE  Parameter-Request-List          Log-Server              7
-VALUE  Parameter-Request-List          Quotes-Server           8
-VALUE  Parameter-Request-List          LPR-Server              9
-VALUE  Parameter-Request-List          Impress-Server          10
-VALUE  Parameter-Request-List          RLP-Server              11
-VALUE  Parameter-Request-List          Hostname                12
-VALUE  Parameter-Request-List          Boot-File-Size          13
-VALUE  Parameter-Request-List          Merit-Dump-File         14
-VALUE  Parameter-Request-List          Domain-Name             15
-VALUE  Parameter-Request-List          Swap-Server             16
-VALUE  Parameter-Request-List          Root-Path               17
-VALUE  Parameter-Request-List          Bootp-Extensions-Path   18
-VALUE  Parameter-Request-List          IP-Forward-Enable       19
-VALUE  Parameter-Request-List          Source-Route-Enable     20
-VALUE  Parameter-Request-List          Policy-Filter           21
-VALUE  Parameter-Request-List          Max-Datagram-Reassembly-Sz 22
-VALUE  Parameter-Request-List          Default-IP-TTL          23
-VALUE  Parameter-Request-List          Path-MTU-Aging-Timeout  24
-VALUE  Parameter-Request-List          Path-MTU-Plateau-Table  25
-VALUE  Parameter-Request-List          Interface-MTU-Size      26
-VALUE  Parameter-Request-List          All-Subnets-Are-Local   27
-VALUE  Parameter-Request-List          Broadcast-Address       28
-VALUE  Parameter-Request-List          Perform-Mask-Discovery  29
-VALUE  Parameter-Request-List          Provide-Mask-To-Others  30
-VALUE  Parameter-Request-List          Perform-Router-Discovery 31
-VALUE  Parameter-Request-List          Router-Solicitation-Address 32
-VALUE  Parameter-Request-List          Static-Routes           33
-VALUE  Parameter-Request-List          Trailer-Encapsulation   34
-VALUE  Parameter-Request-List          ARP-Cache-Timeout       35
-VALUE  Parameter-Request-List          Ethernet-Encapsulation  36
-VALUE  Parameter-Request-List          Default-TCP-TTL         37
-VALUE  Parameter-Request-List          Keep-Alive-Interval     38
-VALUE  Parameter-Request-List          Keep-Alive-Garbage      39
-VALUE  Parameter-Request-List          NIS-Domain-Name         40
-VALUE  Parameter-Request-List          NIS-Servers             41
-VALUE  Parameter-Request-List          NTP-Servers             42
-VALUE  Parameter-Request-List          Vendor                  43
-VALUE  Parameter-Request-List          NETBIOS-Name-Servers    44
-VALUE  Parameter-Request-List          NETBIOS-Dgm-Dist-Servers 45
-VALUE  Parameter-Request-List          NETBIOS-Node-Type       46
-VALUE  Parameter-Request-List          NETBIOS                 47
-VALUE  Parameter-Request-List          X-Window-Font-Server    48
-VALUE  Parameter-Request-List          X-Window-Display-Mgr    49
-VALUE  Parameter-Request-List          Requested-IP-Address    50
-VALUE  Parameter-Request-List          IP-Address-Lease-Time   51
-VALUE  Parameter-Request-List          Overload                52
-VALUE  Parameter-Request-List          Message-Type            53
-VALUE  Parameter-Request-List          Server-Identifier       54
-VALUE  Parameter-Request-List          Parameter-Request-List  55
-VALUE  Parameter-Request-List          Error-Message           56
-VALUE  Parameter-Request-List          Maximum-Msg-Size        57
-VALUE  Parameter-Request-List          Renewal-Time            58
-VALUE  Parameter-Request-List          Rebinding-Time          59
-VALUE  Parameter-Request-List          Class-Identifier        60
-VALUE  Parameter-Request-List          Client-Identifier       61
-VALUE  Parameter-Request-List          Netware-Domain-Name     62
-VALUE  Parameter-Request-List          Netware-Sub-Options     63
-VALUE  Parameter-Request-List          NIS-Client-Domain-Name  64
-VALUE  Parameter-Request-List          NIS-Server-Address      65
-VALUE  Parameter-Request-List          TFTP-Server-Name        66
-VALUE  Parameter-Request-List          Boot-File-Name          67
-VALUE  Parameter-Request-List          Home-Agent-Address      68
-VALUE  Parameter-Request-List          SMTP-Server-Address     69
-VALUE  Parameter-Request-List          POP3-Server-Address     70
-VALUE  Parameter-Request-List          NNTP-Server-Address     71
-VALUE  Parameter-Request-List          WWW-Server-Address      72
-VALUE  Parameter-Request-List          Finger-Server-Address   73
-VALUE  Parameter-Request-List          IRC-Server-Address      74
-VALUE  Parameter-Request-List          StreetTalk-Server-Address 75
-VALUE  Parameter-Request-List          STDA-Server-Address     76
-VALUE  Parameter-Request-List          User-Class              77
-VALUE  Parameter-Request-List          Directory-Agent         78
-VALUE  Parameter-Request-List          Service-Scope           79
-VALUE  Parameter-Request-List          Rapid-Commit            80
-VALUE  Parameter-Request-List          Client-FQDN             81
-VALUE  Parameter-Request-List          Relay-Agent-Information 82
-VALUE  Parameter-Request-List          iSNS                    83
-VALUE  Parameter-Request-List          NDS-Servers             85
-VALUE  Parameter-Request-List          NDS-Tree-Name           86
-VALUE  Parameter-Request-List          NDS-Context             87
-VALUE  Parameter-Request-List          Authentication          90
-VALUE  Parameter-Request-List          Client-Last-Transaction-Time 91
-VALUE  Parameter-Request-List          associated-ip           92
-VALUE  Parameter-Request-List          Client-System           93
-VALUE  Parameter-Request-List          Client-NDI              94
-VALUE  Parameter-Request-List          LDAP                    95
-VALUE  Parameter-Request-List          UUID/GUID               97
-VALUE  Parameter-Request-List          User-Auth               98
-VALUE  Parameter-Request-List          Netinfo-Address         112
-VALUE  Parameter-Request-List          Netinfo-Tag             113
-VALUE  Parameter-Request-List          URL                     114
-VALUE  Parameter-Request-List          Auto-Config             116
-VALUE  Parameter-Request-List          Name-Service-Search     117
-VALUE  Parameter-Request-List          Subnet-Selection-Option 118
-VALUE  Parameter-Request-List          Domain-Search           119
-VALUE  Parameter-Request-List          SIP-Servers-Option      120
-VALUE  Parameter-Request-List          Classless-Static-Route  121
-VALUE  Parameter-Request-List          CCC                     122
-VALUE  Parameter-Request-List          GeoConf-Option          123
-VALUE  Parameter-Request-List          V-I-Vendor-Class        124
-VALUE  Parameter-Request-List          V-I-Vendor-Specific     125
-VALUE  Parameter-Request-List          Etherboot               128
-VALUE  Parameter-Request-List          TFTP-Server-IP-Address  128
-VALUE  Parameter-Request-List          Call-Server-IP-address  129
-VALUE  Parameter-Request-List          Ethernet-Interface      130
-VALUE  Parameter-Request-List          Vendor-Discrimination-Str 130
-VALUE  Parameter-Request-List          Remote-Stats-Svr-IP-Address 131
-VALUE  Parameter-Request-List          IEEE-802dot1P-VLAN-ID   132
-VALUE  Parameter-Request-List          IEEE-802dot1Q-L2-Priority 133
-VALUE  Parameter-Request-List          Diffserv-Code-Point     134
-VALUE  Parameter-Request-List          HTTP-Proxy              135
index 02b9ba46ec4bd33ee398b3ba3a7067e3ec20c931..cfb70263fe041fa7c1b5d2e2d102b0f7af1e1e77 100644 (file)
@@ -90,7 +90,7 @@ fr_dict_attr_autoload_t dhcpv4_dict_attr[] = {
        { .out = &attr_dhcp_dhcp_maximum_msg_size, .name = "Maximum-Msg-Size", .type = FR_TYPE_UINT16, .dict = &dict_dhcpv4 },
        { .out = &attr_dhcp_interface_mtu_size, .name = "Interface-MTU-Size", .type = FR_TYPE_UINT16, .dict = &dict_dhcpv4 },
        { .out = &attr_dhcp_message_type, .name = "Message-Type", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
-       { .out = &attr_dhcp_parameter_request_list, .name = "Parameter-Request-List", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
+       { .out = &attr_dhcp_parameter_request_list, .name = "Parameter-Request-List", .type = FR_TYPE_ATTR, .dict = &dict_dhcpv4 },
        { .out = &attr_dhcp_overload, .name = "Overload", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
        { .out = &attr_dhcp_vendor_class_identifier, .name = "Vendor-Class-Identifier", .type = FR_TYPE_OCTETS, .dict = &dict_dhcpv4 },
        { .out = &attr_dhcp_relay_link_selection, .name = "Relay-Agent-Information.Relay-Link-Selection", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
@@ -584,9 +584,6 @@ ssize_t fr_dhcpv4_encode_dbuff(fr_dbuff_t *dbuff, dhcp_packet_t *original, int c
  */
 int fr_dhcpv4_global_init(void)
 {
-       fr_value_box_t          value = *fr_box_uint8(0);
-       uint8_t                 i;
-
        if (instance_count > 0) {
                instance_count++;
                return 0;
@@ -605,24 +602,6 @@ int fr_dhcpv4_global_init(void)
                goto fail;
        }
 
-       /*
-        *      Fixup dictionary entry for Paramter-Request-List adding all the options
-        */
-       for (i = 1; i < 255; i++) {
-               fr_dict_attr_t const *attr;
-
-               attr = fr_dict_attr_child_by_num(fr_dict_root(dict_dhcpv4), i);
-               if (!attr) {
-                       continue;
-               }
-               value.vb_uint8 = i;
-
-               if (fr_dict_enum_add_name(fr_dict_attr_unconst(attr_dhcp_parameter_request_list),
-                                         attr->name, &value, true, false) < 0) {
-                       goto fail;
-               }
-       }
-
        instantiated = true;
        return 0;
 }
@@ -752,6 +731,11 @@ static bool attr_valid(fr_dict_attr_t *da)
                return false;
        }
 
+       if ((da->type == FR_TYPE_ATTR) && !da->parent->flags.is_root) {
+               fr_strerror_const("Data type 'attr' can only exist at the dictionary root");
+               return false;
+       }
+
        return true;
 }
 
index 2b1da445986e08f1de2618b250c4f15aa3ba2cb4..9f798a0484cadc63100c17a927924ab1c02db083 100644 (file)
@@ -140,6 +140,25 @@ static ssize_t decode_value(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t
        }
 
        switch (vp->vp_type) {
+       case FR_TYPE_ATTR:
+               /*
+                *      Force the length of the data to be one,
+                *      otherwise the "from network" call complains.
+                *      Because we pass in the enumv as the _parent_
+                *      and not the da.  The da is marked as "array",
+                *      but the parent is not.
+                */
+               end = p + 1;
+
+               fr_assert(da->parent->flags.is_root);
+
+               slen = fr_value_box_from_network(vp, &vp->data, vp->vp_type, da->parent,
+                                                &FR_DBUFF_TMP(p, end - p), end - p, true);
+               if (slen <= 0) goto raw;
+
+               p++;
+               break;
+
        /*
         *      Doesn't include scope, whereas the generic format can
         */
index 8df8f68d6751ca2d2d73413b08b06ee8be8e3268..529b9bec99702e96ad0e185a2d87a4d54714faf0 100644 (file)
@@ -84,6 +84,10 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
        }
 
        switch (da_stack->da[depth]->type) {
+       case FR_TYPE_ATTR:
+               FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, (uint8_t) vp->vp_attr->attr);
+               break;
+
        case FR_TYPE_IPV6_PREFIX:
                FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, vp->vp_ip.prefix);
                FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, (uint8_t const *)&vp->vp_ipv6addr, sizeof(vp->vp_ipv6addr));
index a3ec29017c8179838cc5ecfaca84e860f3956d93..daf3a2f28c4c0a3c445d974f749a7a329dd4f116 100644 (file)
@@ -32,7 +32,7 @@ proto-dictionary dhcpv4
 #    options   = [message-type=discover max_dhcp_size=590 param_req_list=[1, 28, 3, 43] lease_time=3600 dhcp-option-overload=3 error_message=b'Padding' pad client_id='\x01\x00\x00l\\x82\\xdcN' end]
 #
 decode-proto 01 01 06 00 ac 2e ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6c 82 dc 4e 00 00 00 00 00 00 00 00 00 00 38 14 73 6e 61 6d 65 20 66 69 65 6c 64 20 6f 76 65 72 6c 6f 61 64 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 18 66 69 6c 65 20 6e 61 6d 65 20 66 69 65 6c 64 20 6f 76 65 72 6c 6f 61 64 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 39 02 02 4e 37 04 01 1c 03 2b 33 04 00 00 0e 10 34 01 03 38 07 50 61 64 64 69 6e 67 00 3d 07 01 00 00 6c 82 dc 4e ff
-match Opcode = ::Client-Message, Hardware-Type = ::Ethernet, Hardware-Address-Length = 6, Hop-Count = 0, Transaction-Id = 2888761343, Number-of-Seconds = 0, Flags = 0, Client-IP-Address = 0.0.0.0, Your-IP-Address = 0.0.0.0, Server-IP-Address = 0.0.0.0, Gateway-IP-Address = 0.0.0.0, Client-Hardware-Address = 00:00:6c:82:dc:4e, Message-Type = ::Discover, Maximum-Msg-Size = 590, Parameter-Request-List = ::Subnet-Mask, Parameter-Request-List = ::Broadcast-Address, Parameter-Request-List = ::Router-Address, Parameter-Request-List = ::Vendor, IP-Address-Lease-Time = 3600, Overload = 3, Error-Message = "Padding", Client-Identifier = 0x0100006c82dc4e, Error-Message = "sname field overload", Error-Message = "file name field overload", Network-Subnet = 0.0.0.0/32
+match Opcode = ::Client-Message, Hardware-Type = ::Ethernet, Hardware-Address-Length = 6, Hop-Count = 0, Transaction-Id = 2888761343, Number-of-Seconds = 0, Flags = 0, Client-IP-Address = 0.0.0.0, Your-IP-Address = 0.0.0.0, Server-IP-Address = 0.0.0.0, Gateway-IP-Address = 0.0.0.0, Client-Hardware-Address = 00:00:6c:82:dc:4e, Message-Type = ::Discover, Maximum-Msg-Size = 590, Parameter-Request-List = ::Subnet-Mask, Parameter-Request-List = ::Broadcast-Address, Parameter-Request-List = ::Router-Address, Parameter-Request-List = ::Vendor-Specific-Options, IP-Address-Lease-Time = 3600, Overload = 3, Error-Message = "Padding", Client-Identifier = 0x0100006c82dc4e, Error-Message = "sname field overload", Error-Message = "file name field overload", Network-Subnet = 0.0.0.0/32
 
 count
 match 4
index 4a892a75525718e6d4e522f3223d32aac88cf8a2..4191c54c50ce894493cc6aa7f23ed1ae3a753215 100644 (file)
@@ -32,7 +32,7 @@ proto-dictionary dhcpv4
 #    options   = [message-type=discover max_dhcp_size=590 param_req_list=[1, 28, 3, 43] lease_time=3600 dhcp-option-overload=3 error_message=b'Padding' pad client_id='\x01\x00\x00l\\x82\\xdcN' pad]
 #
 decode-proto 01 01 06 00 ac 2e ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6c 82 dc 4e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 39 02 02 4e 37 04 01 1c 03 2b 33 04 00 00 0e 10 34 01 03 38 07 50 61 64 64 69 6e 67 00 3d 07 01 00 00 6c 82 dc 4e 00
-match Opcode = ::Client-Message, Hardware-Type = ::Ethernet, Hardware-Address-Length = 6, Hop-Count = 0, Transaction-Id = 2888761343, Number-of-Seconds = 0, Flags = 0, Client-IP-Address = 0.0.0.0, Your-IP-Address = 0.0.0.0, Server-IP-Address = 0.0.0.0, Gateway-IP-Address = 0.0.0.0, Client-Hardware-Address = 00:00:6c:82:dc:4e, Message-Type = ::Discover, Maximum-Msg-Size = 590, Parameter-Request-List = ::Subnet-Mask, Parameter-Request-List = ::Broadcast-Address, Parameter-Request-List = ::Router-Address, Parameter-Request-List = ::Vendor, IP-Address-Lease-Time = 3600, Overload = 3, Error-Message = "Padding", Client-Identifier = 0x0100006c82dc4e, Network-Subnet = 0.0.0.0/32
+match Opcode = ::Client-Message, Hardware-Type = ::Ethernet, Hardware-Address-Length = 6, Hop-Count = 0, Transaction-Id = 2888761343, Number-of-Seconds = 0, Flags = 0, Client-IP-Address = 0.0.0.0, Your-IP-Address = 0.0.0.0, Server-IP-Address = 0.0.0.0, Gateway-IP-Address = 0.0.0.0, Client-Hardware-Address = 00:00:6c:82:dc:4e, Message-Type = ::Discover, Maximum-Msg-Size = 590, Parameter-Request-List = ::Subnet-Mask, Parameter-Request-List = ::Broadcast-Address, Parameter-Request-List = ::Router-Address, Parameter-Request-List = ::Vendor-Specific-Options, IP-Address-Lease-Time = 3600, Overload = 3, Error-Message = "Padding", Client-Identifier = 0x0100006c82dc4e, Network-Subnet = 0.0.0.0/32
 
 count
 match 4
index a20a65f73ce61a13444d0d0fbfd8734c17fa6e47..d1d78adf19510f04bbf83f36a77608adfae645f1 100644 (file)
@@ -118,5 +118,14 @@ match Relay-Agent-Information = { Circuit-Id = 0x3132333435363738396131323334353
 decode-pair 52 0d 01 03 ab cd ef 02 06 01 02 03 04 05 06
 match Relay-Agent-Information = { Circuit-Id = 0xabcdef, Remote-Id = 0x010203040506 }
 
+#
+#  FR_TYPE_ATTR
+#
+decode-pair 37 04 01 1c 03 2b
+match Parameter-Request-List = ::Subnet-Mask, Parameter-Request-List = ::Broadcast-Address, Parameter-Request-List = ::Router-Address, Parameter-Request-List = ::Vendor-Specific-Options
+
+encode-pair -
+match 37 04 01 1c 03 2b
+
 count
-match 49
+match 53