-// Event handler for incoming ICMPv6 packets
-static void handle_icmpv6(void *addr, void *data, size_t len,
- struct interface *iface)
-{
- struct icmp6_hdr *hdr = data;
-
- if (!router_icmpv6_valid(addr, data, len))
- return;
-
- if ((iface->ra == RELAYD_SERVER && !iface->master)) { // Server mode
- if (hdr->icmp6_type == ND_ROUTER_SOLICIT)
- send_router_advert(&iface->timer_rs);
- } else if (iface->ra == RELAYD_RELAY) { // Relay mode
- if (hdr->icmp6_type == ND_ROUTER_ADVERT && iface->master)
- forward_router_advertisement(data, len);
- else if (hdr->icmp6_type == ND_ROUTER_SOLICIT && !iface->master)
- forward_router_solicitation(odhcpd_get_master_interface());
- }
-}
-
-
-static bool match_route(const struct odhcpd_ipaddr *n, const struct in6_addr *addr)
-{
- if (n->prefix <= 32)
- return ntohl(n->addr.s6_addr32[0]) >> (32 - n->prefix) ==
- ntohl(addr->s6_addr32[0]) >> (32 - n->prefix);
-
- if (n->addr.s6_addr32[0] != addr->s6_addr32[0])
- return false;
-
- return ntohl(n->addr.s6_addr32[1]) >> (64 - n->prefix) ==
- ntohl(addr->s6_addr32[1]) >> (64 - n->prefix);
-}
-