dhcpv6-ia: reconfigure message length bug fix

follow-up to ae16476bca

Now, the lengths are actual encoded size, resulting in:

DHCPv6
    Message type: Reconfigure (10)
    Transaction ID: 0x000000
    Server Identifier
        Option: Server Identifier (2)
        Length: 10
        DUID: 00030001xx
        DUID Type: link-layer address (3)
        Hardware type: Ethernet (1)
        Link-layer address: xx
        Link-layer address (Ethernet): xx
    Client Identifier
        Option: Client Identifier (1)
        Length: 10
        DUID: 00030001xx
        DUID Type: link-layer address (3)
        Hardware type: Ethernet (1)
        Link-layer address: xx
        Link-layer address (Ethernet): xx
    Reconfigure Message
        Option: Reconfigure Message (19)
        Length: 1
        Reconfigure message type: Renew (5)

The previous calculation would count a full DUID buffer
length, but the buffer size was not adjusted based on
the used size, resulting in DHCPv6 RECONF messages like:

DHCPv6
    Message type: Reconfigure (10)
    Transaction ID: 0x000000
    Server Identifier
        Option: Server Identifier (2)
        Length: 10
        DUID: 0003XXX
        DUID Type: link-layer address (3)
        Hardware type: Ethernet (1)
        Link-layer address: XXX
        Link-layer address (Ethernet): XXX
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    Client Identifier
        Option: Client Identifier (1)
        Length: 18
        DUID: 0004xxx
        DUID Type: Universally Unique IDentifier (UUID) (4)
        UUID: xxx
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    Reconfigure Message
        Option: Reconfigure Message (19)
        Length: 1
        Reconfigure message type: Renew (5)

Signed-off-by: Paul Donald <newtwen+github@gmail.com>
Link: https://github.com/openwrt/odhcpd/pull/361
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
Paul Donald
2025-12-18 05:01:14 +01:00
committed by Álvaro Fernández Rojas
parent 6152cf5dab
commit 3fda5f8b12

View File

@@ -215,10 +215,14 @@ static int send_reconf(struct dhcpv6_lease *assign)
memcpy(clientid.data, assign->duid, assign->duid_len);
size_t serverid_len, clientid_len;
serverid_len = sizeof(serverid.code) + sizeof(serverid.len) + ntohs(serverid.len);
clientid_len = sizeof(clientid.code) + sizeof(clientid.len) + ntohs(clientid.len);
struct iovec iov[IOV_TOTAL] = {
[IOV_HDR] = { &hdr, sizeof(hdr) },
[IOV_SERVERID] = { &serverid, sizeof(serverid) },
[IOV_CLIENTID] = { &clientid, sizeof(clientid) },
[IOV_SERVERID] = { &serverid, serverid_len },
[IOV_CLIENTID] = { &clientid, clientid_len },
[IOV_MESSAGE] = { &message, sizeof(message) },
[IOV_AUTH] = { &auth, sizeof(auth) },
};