After we stopped processing router advertisements in the kernel sppp_update_ip6_addr() became the last user of n6_are_prefix_equal(). Since it compares /128 prefixes it doesn't need all the bells and whistles and can be converted to a memcmp. Remove the new unused n6_are_prefix_equal().
OK? diff --git net/if_spppsubr.c net/if_spppsubr.c index 4b541535bda..89e3f1b5713 100644 --- net/if_spppsubr.c +++ net/if_spppsubr.c @@ -4355,7 +4355,6 @@ sppp_update_ip6_addr(void *arg) struct sppp *sp = arg; struct ifnet *ifp = &sp->pp_if; struct in6_aliasreq *ifra = &sp->ipv6cp.req_ifid; - struct in6_addr mask = in6mask128; struct in6_ifaddr *ia6; int error; @@ -4386,7 +4385,8 @@ sppp_update_ip6_addr(void *arg) */ /* Destination address can only be set for /128. */ - if (!in6_are_prefix_equal(&ia6->ia_prefixmask.sin6_addr, &mask, 128)) { + if (memcmp(&ia6->ia_prefixmask.sin6_addr, &in6mask128, + sizeof(in6mask128)) != 0) { ifra->ifra_dstaddr.sin6_len = 0; ifra->ifra_dstaddr.sin6_family = AF_UNSPEC; } diff --git netinet6/in6.c netinet6/in6.c index b83e6df6c66..f9596be629b 100644 --- netinet6/in6.c +++ netinet6/in6.c @@ -1519,32 +1519,6 @@ in6_matchlen(struct in6_addr *src, struct in6_addr *dst) return match; } -int -in6_are_prefix_equal(struct in6_addr *p1, struct in6_addr *p2, int len) -{ - int bytelen, bitlen; - - /* sanity check */ - if (0 > len || len > 128) { - log(LOG_ERR, "in6_are_prefix_equal: invalid prefix length(%d)\n", - len); - return (0); - } - - bytelen = len / 8; - bitlen = len % 8; - - if (bcmp(&p1->s6_addr, &p2->s6_addr, bytelen)) - return (0); - /* len == 128 is ok because bitlen == 0 then */ - if (bitlen != 0 && - p1->s6_addr[bytelen] >> (8 - bitlen) != - p2->s6_addr[bytelen] >> (8 - bitlen)) - return (0); - - return (1); -} - void in6_prefixlen2mask(struct in6_addr *maskp, int len) { diff --git netinet6/in6_var.h netinet6/in6_var.h index a023d12a1bf..e5a72e6f903 100644 --- netinet6/in6_var.h +++ netinet6/in6_var.h @@ -395,7 +395,6 @@ struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int); struct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *); int in6_addr2scopeid(unsigned int, struct in6_addr *); int in6_matchlen(struct in6_addr *, struct in6_addr *); -int in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int); void in6_prefixlen2mask(struct in6_addr *, int); void in6_purgeprefix(struct ifnet *); #endif /* _KERNEL */ -- I'm not entirely sure you are real.