static int ipv6_route_compare(void *ka, void *kb) { struct pico_ipv6_route *a = ka, *b = kb; int ret; /* Routes are sorted by (host side) netmask len, then by addr, then by metric. */ ret = pico_ipv6_compare(&a->netmask, &b->netmask); if (ret) return ret; ret = pico_ipv6_compare(&a->dest, &b->dest); if (ret) return ret; return ipv6_compare_metric(a, b); }
int pico_address_compare(union pico_address *a, union pico_address *b, uint16_t proto) { #ifdef PICO_SUPPORT_IPV6 if (proto == PICO_PROTO_IPV6) { return pico_ipv6_compare(&a->ip6, &b->ip6); } #endif #ifdef PICO_SUPPORT_IPV4 if (proto == PICO_PROTO_IPV4) { return pico_ipv4_compare(&a->ip4, &b->ip4); } #endif return 0; }
static int ipv6_link_compare(void *ka, void *kb) { struct pico_ipv6_link *a = ka, *b = kb; struct pico_ip6 *a_addr, *b_addr; int ret; a_addr = &a->address; b_addr = &b->address; ret = pico_ipv6_compare(a_addr, b_addr); if (ret) return ret; /* zero can be assigned multiple times (e.g. for DHCP) */ if (a->dev != NULL && b->dev != NULL && !memcmp(a->address.addr, PICO_IP6_ANY, PICO_SIZE_IP6) && !memcmp(b->address.addr, PICO_IP6_ANY, PICO_SIZE_IP6)) { /* XXX change PICO_IP6_ANY */ if (a->dev < b->dev) return -1; if (a->dev > b->dev) return 1; } return 0; }