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);