diff options
author | ume <ume@FreeBSD.org> | 2003-10-17 15:46:31 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2003-10-17 15:46:31 +0000 |
commit | babf2c3ec01f429fc11fe95261ac8db6488c3788 (patch) | |
tree | 7b94f0bf6e27699cee5534d28881bd0e62278adb /sys/netinet6/in6.c | |
parent | 81586929f375fc23eb8749aebf4eba5c6582b35a (diff) | |
download | FreeBSD-src-babf2c3ec01f429fc11fe95261ac8db6488c3788.zip FreeBSD-src-babf2c3ec01f429fc11fe95261ac8db6488c3788.tar.gz |
- add dom_if{attach,detach} framework.
- transition to use ifp->if_afdata.
Obtained from: KAME
Diffstat (limited to 'sys/netinet6/in6.c')
-rw-r--r-- | sys/netinet6/in6.c | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index b3b6feb..9faa341 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -420,14 +420,14 @@ in6_control(so, cmd, data, ifp, td) case SIOCSSCOPE6: if (!privileged) return (EPERM); - return (scope6_set(ifp, ifr->ifr_ifru.ifru_scope_id)); - break; + return (scope6_set(ifp, + (struct scope6_id *)ifr->ifr_ifru.ifru_scope_id)); case SIOCGSCOPE6: - return (scope6_get(ifp, ifr->ifr_ifru.ifru_scope_id)); - break; + return (scope6_get(ifp, + (struct scope6_id *)ifr->ifr_ifru.ifru_scope_id)); case SIOCGSCOPE6DEF: - return (scope6_get_default(ifr->ifr_ifru.ifru_scope_id)); - break; + return (scope6_get_default((struct scope6_id *) + ifr->ifr_ifru.ifru_scope_id)); } switch (cmd) { @@ -560,28 +560,19 @@ in6_control(so, cmd, data, ifp, td) break; case SIOCGIFSTAT_IN6: - if (ifp == NULL) - return EINVAL; - if (in6_ifstat == NULL || ifp->if_index >= in6_ifstatmax - || in6_ifstat[ifp->if_index] == NULL) { - /* return EAFNOSUPPORT? */ - bzero(&ifr->ifr_ifru.ifru_stat, - sizeof(ifr->ifr_ifru.ifru_stat)); - } else - ifr->ifr_ifru.ifru_stat = *in6_ifstat[ifp->if_index]; + bzero(&ifr->ifr_ifru.ifru_stat, + sizeof(ifr->ifr_ifru.ifru_stat)); + ifr->ifr_ifru.ifru_stat = + *((struct in6_ifextra *)ifp->if_afdata[AF_INET6])->in6_ifstat; break; case SIOCGIFSTAT_ICMP6: if (ifp == NULL) return EINVAL; - if (icmp6_ifstat == NULL || ifp->if_index >= icmp6_ifstatmax || - icmp6_ifstat[ifp->if_index] == NULL) { - /* return EAFNOSUPPORT? */ - bzero(&ifr->ifr_ifru.ifru_stat, - sizeof(ifr->ifr_ifru.ifru_icmp6stat)); - } else - ifr->ifr_ifru.ifru_icmp6stat = - *icmp6_ifstat[ifp->if_index]; + bzero(&ifr->ifr_ifru.ifru_stat, + sizeof(ifr->ifr_ifru.ifru_icmp6stat)); + ifr->ifr_ifru.ifru_icmp6stat = + *((struct in6_ifextra *)ifp->if_afdata[AF_INET6])->icmp6_ifstat; break; case SIOCGIFALIFETIME_IN6: @@ -1110,13 +1101,6 @@ in6_update_ifa(ifp, ifra, ia) ia->ia6_lifetime.ia6t_preferred = 0; /* - * make sure to initialize ND6 information. this is to workaround - * issues with interfaces with IPv6 addresses, which have never brought - * up. We are assuming that it is safe to nd6_ifattach multiple times. - */ - nd6_ifattach(ifp); - - /* * Perform DAD, if needed. * XXX It may be of use, if we can administratively * disable DAD. @@ -2341,14 +2325,51 @@ in6_setmaxmtu() IFNET_RLOCK(); for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) { if ((ifp->if_flags & IFF_LOOPBACK) == 0 && - nd_ifinfo[ifp->if_index].linkmtu > maxmtu) - maxmtu = nd_ifinfo[ifp->if_index].linkmtu; + ND_IFINFO(ifp)->linkmtu > maxmtu) + maxmtu = ND_IFINFO(ifp)->linkmtu; } IFNET_RUNLOCK(); if (maxmtu) /* update only when maxmtu is positive */ in6_maxmtu = maxmtu; } +void * +in6_domifattach(ifp) + struct ifnet *ifp; +{ + struct in6_ifextra *ext; + + ext = (struct in6_ifextra *)malloc(sizeof(*ext), M_IFADDR, M_WAITOK); + bzero(ext, sizeof(*ext)); + + ext->in6_ifstat = (struct in6_ifstat *)malloc(sizeof(struct in6_ifstat), + M_IFADDR, M_WAITOK); + bzero(ext->in6_ifstat, sizeof(*ext->in6_ifstat)); + + ext->icmp6_ifstat = + (struct icmp6_ifstat *)malloc(sizeof(struct icmp6_ifstat), + M_IFADDR, M_WAITOK); + bzero(ext->icmp6_ifstat, sizeof(*ext->icmp6_ifstat)); + + ext->nd_ifinfo = nd6_ifattach(ifp); + ext->scope6_id = scope6_ifattach(ifp); + return ext; +} + +void +in6_domifdetach(ifp, aux) + struct ifnet *ifp; + void *aux; +{ + struct in6_ifextra *ext = (struct in6_ifextra *)aux; + + scope6_ifdetach(ext->scope6_id); + nd6_ifdetach(ext->nd_ifinfo); + free(ext->in6_ifstat, M_IFADDR); + free(ext->icmp6_ifstat, M_IFADDR); + free(ext, M_IFADDR); +} + /* * Convert sockaddr_in6 to sockaddr_in. Original sockaddr_in6 must be * v4 mapped addr or v4 compat addr |