]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Help users by copying DHCPv4 option 82 from request to reply
authorNick Porter <nick@portercomputing.co.uk>
Fri, 23 May 2025 16:22:09 +0000 (17:22 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Fri, 23 May 2025 16:27:03 +0000 (17:27 +0100)
To align with RFC3046

src/process/dhcpv4/base.c

index b85f54de10b69d1949d22767693d1b026f648a6c..11f213a6abf6b8dc9a3c6e57d64300d9ea264496 100644 (file)
@@ -42,12 +42,14 @@ fr_dict_autoload_t process_dhcpv4_dict[] = {
 static fr_dict_attr_t const *attr_message_type;
 static fr_dict_attr_t const *attr_yiaddr;
 static fr_dict_attr_t const *attr_packet_type;
+static fr_dict_attr_t const *attr_dhcp_option_82;
 
 extern fr_dict_attr_autoload_t process_dhcpv4_dict_attr[];
 fr_dict_attr_autoload_t process_dhcpv4_dict_attr[] = {
        { .out = &attr_message_type, .name = "Message-Type", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4},
        { .out = &attr_yiaddr, .name = "Your-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4},
        { .out = &attr_packet_type, .name = "Packet-Type", .type = FR_TYPE_UINT32, .dict = &dict_dhcpv4},
+       { .out = &attr_dhcp_option_82, .name = "Relay-Agent-Information", .type = FR_TYPE_TLV, .dict = &dict_dhcpv4 },
        { NULL }
 };
 
@@ -130,7 +132,7 @@ typedef struct {
 #define PROCESS_CODE_DYNAMIC_CLIENT    FR_DHCP_ACK
 #include <freeradius-devel/server/process.h>
 
-RESUME(check_yiaddr)
+RESUME(check_offer_ack_options)
 {
        fr_pair_t *vp;
 
@@ -140,6 +142,20 @@ RESUME(check_yiaddr)
                        dhcp_message_types[request->reply->code]);
        }
 
+       /*
+        *      RFC3046 says:
+        *      DHCP servers claiming to support the Relay Agent Information option
+        *      SHALL echo the entire contents of the Relay Agent Information option
+        *      in all replies.
+        */
+       vp = fr_pair_find_by_da(&request->request_pairs, NULL, attr_dhcp_option_82);
+       if (vp) {
+               fr_pair_t       *reply_vp;
+               int             ret;
+               MEM((ret = pair_update_reply(&reply_vp, attr_dhcp_option_82)) >= 0);
+               if (ret == 0) fr_pair_list_copy(reply_vp, &reply_vp->vp_group, &vp->vp_group);
+       }
+
        return CALL_RESUME(send_generic);
 }
 
@@ -179,7 +195,7 @@ static fr_process_state_t const process_state[] = {
                .rcode = RLM_MODULE_NOOP,
                .default_reply = FR_DHCP_DO_NOT_RESPOND,
                .send = send_generic,
-               .resume = resume_check_yiaddr,
+               .resume = resume_check_offer_ack_options,
                .section_offset = PROCESS_CONF_OFFSET(offer),
        },
 
@@ -238,7 +254,7 @@ static fr_process_state_t const process_state[] = {
                .rcode = RLM_MODULE_NOOP,
                .default_reply = FR_DHCP_DO_NOT_RESPOND,
                .send = send_generic,
-               .resume = resume_check_yiaddr,
+               .resume = resume_check_offer_ack_options,
                .section_offset = PROCESS_CONF_OFFSET(ack),
        },
        [FR_DHCP_NAK] = {