Interface-specific routes created in in6_update_ifa() should
be removed when the interface detaches from IPv6. However,
in6_ifdetach() forgets to remove the ff01::1 route. It only
deletes the f02::1 route.

Index: in6_ifattach.c
===================================================================
RCS file: /cvs/src/sys/netinet6/in6_ifattach.c,v
retrieving revision 1.64
diff -u -p -r1.64 in6_ifattach.c
--- in6_ifattach.c      28 Nov 2013 10:16:44 -0000      1.64
+++ in6_ifattach.c      17 Dec 2013 14:31:27 -0000
@@ -688,6 +688,26 @@ in6_ifdetach(struct ifnet *ifp)
         */
        nd6_purge(ifp);
 
+       /* remove route to interface local allnodes multicast (ff01::1) */
+       bzero(&sin6, sizeof(sin6));
+       sin6.sin6_len = sizeof(struct sockaddr_in6);
+       sin6.sin6_family = AF_INET6;
+       sin6.sin6_addr = in6addr_intfacelocal_allnodes;
+       sin6.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
+       rt = rtalloc1(sin6tosa(&sin6), 0, ifp->if_rdomain);
+       if (rt && rt->rt_ifp == ifp) {
+               struct rt_addrinfo info;
+
+               bzero(&info, sizeof(info));
+               info.rti_flags = rt->rt_flags;
+               info.rti_info[RTAX_DST] = rt_key(rt);
+               info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+               info.rti_info[RTAX_NETMASK] = rt_mask(rt);
+               rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL,
+                   ifp->if_rdomain);
+               rtfree(rt);
+       }
+
        /* remove route to link-local allnodes multicast (ff02::1) */
        bzero(&sin6, sizeof(sin6));
        sin6.sin6_len = sizeof(struct sockaddr_in6);

Reply via email to