diff options
-rw-r--r-- | interface-ip.c | 10 | ||||
-rw-r--r-- | proto.c | 4 |
2 files changed, 10 insertions, 4 deletions
diff --git a/interface-ip.c b/interface-ip.c index f1ed8d3..6efc3c5 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -516,8 +516,14 @@ error: static int addr_cmp(const void *k1, const void *k2, void *ptr) { - return memcmp(k1, k2, sizeof(struct device_addr) - - offsetof(struct device_addr, flags)); + const struct device_addr *a1 = k1; + const struct device_addr *a2 = k2; + const int cmp_offset = offsetof(struct device_addr, flags); + const int cmp_size = sizeof(struct device_addr) - cmp_offset; + + if (a1->index != a2->index) + return a1->index - a2->index; + return memcmp(k1+cmp_offset, k2+cmp_offset, cmp_size); } static int @@ -174,7 +174,7 @@ parse_static_address_option(struct interface *iface, struct blob_attr *attr, } addr->index = n_addr; n_addr++; - vlist_add(&iface->proto_ip.addr, &addr->node, &addr->flags); + vlist_add(&iface->proto_ip.addr, &addr->node, addr); } return n_addr; @@ -275,7 +275,7 @@ parse_address_list(struct interface *iface, struct blob_attr *attr, bool v6, addr->index = n_addr; n_addr++; - vlist_add(&iface->proto_ip.addr, &addr->node, &addr->flags); + vlist_add(&iface->proto_ip.addr, &addr->node, addr); } return n_addr; |