Author: glebius
Date: Thu Oct 13 13:05:36 2011
New Revision: 226338
URL: http://svn.freebsd.org/changeset/base/226338

Log:
  Restore functions in6_ifaddloop() and in6_ifremloop() that were
  inlined by Qing Li in his big new-ARP commit. I am going to utilize
  them in my newcarp work, and also these functions left declared
  in in6_var.h for all the time they were absent.
  
  Reviewed by:  bz

Modified:
  head/sys/netinet6/in6.c

Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c     Thu Oct 13 09:21:49 2011        (r226337)
+++ head/sys/netinet6/in6.c     Thu Oct 13 13:05:36 2011        (r226338)
@@ -136,7 +136,89 @@ static void in6_unlink_ifa(struct in6_if
 
 int    (*faithprefix_p)(struct in6_addr *);
 
+#define ifa2ia6(ifa)   ((struct in6_ifaddr *)(ifa))
+#define ia62ifa(ia6)   (&((ia6)->ia_ifa))
+
+void
+in6_ifaddloop(struct ifaddr *ifa)
+{
+       struct sockaddr_dl gateway;
+       struct sockaddr_in6 mask, addr;
+       struct rtentry rt;
+       struct in6_ifaddr *ia;
+       struct ifnet *ifp;
+       struct llentry *ln;
+
+       ia = ifa2ia6(ifa);
+       ifp = ifa->ifa_ifp;
+       IF_AFDATA_LOCK(ifp);
+       ifa->ifa_rtrequest = NULL;
+
+       /* XXX QL
+        * we need to report rt_newaddrmsg
+        */
+       ln = lla_lookup(LLTABLE6(ifp), (LLE_CREATE | LLE_IFADDR |
+           LLE_EXCLUSIVE), (struct sockaddr *)&ia->ia_addr);
+       IF_AFDATA_UNLOCK(ifp);
+       if (ln != NULL) {
+               ln->la_expire = 0;  /* for IPv6 this means permanent */
+               ln->ln_state = ND6_LLINFO_REACHABLE;
+               /*
+                * initialize for rtmsg generation
+                */
+               bzero(&gateway, sizeof(gateway));
+               gateway.sdl_len = sizeof(gateway);
+               gateway.sdl_family = AF_LINK;
+               gateway.sdl_nlen = 0;
+               gateway.sdl_alen = 6;
+               memcpy(gateway.sdl_data, &ln->ll_addr.mac_aligned,
+                   sizeof(ln->ll_addr));
+               LLE_WUNLOCK(ln);
+       }
+
+       bzero(&rt, sizeof(rt));
+       rt.rt_gateway = (struct sockaddr *)&gateway;
+       memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
+       memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
+       rt_mask(&rt) = (struct sockaddr *)&mask;
+       rt_key(&rt) = (struct sockaddr *)&addr;
+       rt.rt_flags = RTF_UP | RTF_HOST | RTF_STATIC;
+       rt_newaddrmsg(RTM_ADD, ifa, 0, &rt);
+}
+
+void
+in6_ifremloop(struct ifaddr *ifa)
+{
+       struct sockaddr_dl gateway;
+       struct sockaddr_in6 mask, addr;
+       struct rtentry rt0;
+       struct in6_ifaddr *ia;
+       struct ifnet *ifp;
 
+       ia = ifa2ia6(ifa);
+       ifp = ifa->ifa_ifp;
+       IF_AFDATA_LOCK(ifp);
+       lla_lookup(LLTABLE6(ifp), (LLE_DELETE | LLE_IFADDR),
+           (struct sockaddr *)&ia->ia_addr);
+       IF_AFDATA_UNLOCK(ifp);
+
+       /*
+        * initialize for rtmsg generation
+        */
+       bzero(&gateway, sizeof(gateway));
+       gateway.sdl_len = sizeof(gateway);
+       gateway.sdl_family = AF_LINK;
+       gateway.sdl_nlen = 0;
+       gateway.sdl_alen = ifp->if_addrlen;
+       bzero(&rt0, sizeof(rt0));
+       rt0.rt_gateway = (struct sockaddr *)&gateway;
+       memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
+       memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
+       rt_mask(&rt0) = (struct sockaddr *)&mask;
+       rt_key(&rt0) = (struct sockaddr *)&addr;
+       rt0.rt_flags = RTF_HOST | RTF_STATIC;
+       rt_newaddrmsg(RTM_DELETE, ifa, 0, &rt0);
+}
 
 int
 in6_mask2len(struct in6_addr *mask, u_char *lim0)
@@ -174,9 +256,6 @@ in6_mask2len(struct in6_addr *mask, u_ch
        return x * 8 + y;
 }
 
-#define ifa2ia6(ifa)   ((struct in6_ifaddr *)(ifa))
-#define ia62ifa(ia6)   (&((ia6)->ia_ifa))
-
 #ifdef COMPAT_FREEBSD32
 struct in6_ndifreq32 {
         char ifname[IFNAMSIZ];
@@ -1218,9 +1297,6 @@ in6_purgeaddr(struct ifaddr *ifa)
        struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa;
        struct in6_multi_mship *imm;
        struct sockaddr_in6 mltaddr, mltmask;
-       struct rtentry rt0;
-       struct sockaddr_dl gateway;
-       struct sockaddr_in6 mask, addr;
        int plen, error;
        struct rtentry *rt;
        struct ifaddr *ifa0, *nifa;
@@ -1259,28 +1335,7 @@ in6_purgeaddr(struct ifaddr *ifa)
        /* stop DAD processing */
        nd6_dad_stop(ifa);
 
-       IF_AFDATA_LOCK(ifp);
-       lla_lookup(LLTABLE6(ifp), (LLE_DELETE | LLE_IFADDR),
-           (struct sockaddr *)&ia->ia_addr);
-       IF_AFDATA_UNLOCK(ifp);
-
-       /*
-        * initialize for rtmsg generation
-        */
-       bzero(&gateway, sizeof(gateway));
-       gateway.sdl_len = sizeof(gateway);
-       gateway.sdl_family = AF_LINK;
-       gateway.sdl_nlen = 0;
-       gateway.sdl_alen = ifp->if_addrlen;
-       /* */
-       bzero(&rt0, sizeof(rt0));
-       rt0.rt_gateway = (struct sockaddr *)&gateway;
-       memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
-       memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
-       rt_mask(&rt0) = (struct sockaddr *)&mask;
-       rt_key(&rt0) = (struct sockaddr *)&addr;
-       rt0.rt_flags = RTF_HOST | RTF_STATIC;
-       rt_newaddrmsg(RTM_DELETE, ifa, 0, &rt0);
+       in6_ifremloop(ifa);
 
        /*
         * leave from multicast groups we have joined for the interface
@@ -1820,46 +1875,8 @@ in6_ifinit(struct ifnet *ifp, struct in6
        }
 
        /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */
-       if (newhost) {
-               struct llentry *ln;
-               struct rtentry rt;
-               struct sockaddr_dl gateway;
-               struct sockaddr_in6 mask, addr;
-
-               IF_AFDATA_LOCK(ifp);
-               ia->ia_ifa.ifa_rtrequest = NULL;
-
-               /* XXX QL
-                * we need to report rt_newaddrmsg
-                */
-               ln = lla_lookup(LLTABLE6(ifp), (LLE_CREATE | LLE_IFADDR | 
LLE_EXCLUSIVE),
-                   (struct sockaddr *)&ia->ia_addr);
-               IF_AFDATA_UNLOCK(ifp);
-               if (ln != NULL) {
-                       ln->la_expire = 0;  /* for IPv6 this means permanent */
-                       ln->ln_state = ND6_LLINFO_REACHABLE;
-                       /*
-                        * initialize for rtmsg generation
-                        */
-                       bzero(&gateway, sizeof(gateway));
-                       gateway.sdl_len = sizeof(gateway);
-                       gateway.sdl_family = AF_LINK;
-                       gateway.sdl_nlen = 0;
-                       gateway.sdl_alen = 6;
-                       memcpy(gateway.sdl_data, &ln->ll_addr.mac_aligned, 
sizeof(ln->ll_addr));
-                       /* */
-                       LLE_WUNLOCK(ln);
-               }
-
-               bzero(&rt, sizeof(rt));
-               rt.rt_gateway = (struct sockaddr *)&gateway;
-               memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
-               memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
-               rt_mask(&rt) = (struct sockaddr *)&mask;
-               rt_key(&rt) = (struct sockaddr *)&addr;
-               rt.rt_flags = RTF_UP | RTF_HOST | RTF_STATIC;
-               rt_newaddrmsg(RTM_ADD, &ia->ia_ifa, 0, &rt);
-       }
+       if (newhost)
+               in6_ifaddloop(&(ia->ia_ifa));
 
        return (error);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to