odhcp6c_find_entry: exclude priority from the list of fields that must match
authorAlin Nastac <alin.nastac@gmail.com>
Thu, 15 Oct 2020 15:12:15 +0000 (17:12 +0200)
committerHans Dedecker <dedeckeh@gmail.com>
Sat, 17 Oct 2020 19:17:17 +0000 (21:17 +0200)
Priority of an entry can vary from one RA to another, but the entry
identity should be the same regardless of the priority declared in the
RA message handled in ra_process() at a time.

CDRouter for instance tests compliance of the device  to requirement
G-5 of RFC 7084 by provisioning initially the CPE with a valid default
route that has a medium preference after which it sends a low preference
RA with lifetime 0 to check that CPE will start sending RAs with
lifetime 0 on the LAN side. Because odhcp6c didn't matched the low
precedence default router entry with the odhcp6c_entry that was
previously stored with medium precedence, it will fail to remove the
existing STATE_RA_ROUTE default route, hence preventing odhcpd from
advertising RAs with lifetime 0 to LAN.

Signed-off-by: Alin Nastac <alin.nastac@gmail.com>
src/dhcpv6.c
src/odhcp6c.h

index bd8a2dcf4b0af3214878abbbb4fad797dec26c22..858cd5edd72a7acf3c5d4ea46d9b970d739bbfd1 100644 (file)
@@ -1229,8 +1229,8 @@ static unsigned int dhcpv6_parse_ia(void *opt, void *end)
 
        // Update address IA
        dhcpv6_for_each_option(&ia_hdr[1], end, otype, olen, odata) {
-               struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0, 0,
-                               IN6ADDR_ANY_INIT, 0, 0, 0, 0, 0};
+               struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0,
+                               IN6ADDR_ANY_INIT, 0, 0, 0, 0, 0, 0};
 
                entry.iaid = ia_hdr->iaid;
 
index 40ce098496eb420d56d9e616eaf971d7b663b58c..14d001760bbcbece1c61d04ade19ff24115dc1a2 100644 (file)
@@ -348,8 +348,8 @@ struct odhcp6c_entry {
        struct in6_addr router;
        uint8_t auxlen;
        uint8_t length;
-       int16_t priority;
        struct in6_addr target;
+       int16_t priority;
        uint32_t valid;
        uint32_t preferred;
        uint32_t t1;