route: introduce rt_purgecloned
authorRoy Marples <roy@marples.name>
Tue, 10 Sep 2019 12:35:40 +0000 (13:35 +0100)
committerRoy Marples <roy@marples.name>
Tue, 10 Sep 2019 12:35:40 +0000 (13:35 +0100)
This function walks the route tree for the given address family
and deleted any cloned route for the given interface.

sys/net/route.c
sys/net/route.h

index 39246d4..be48fcc 100644 (file)
@@ -1303,6 +1303,37 @@ rt_llroute(struct sockaddr *dst, struct rtentry *rt0, struct rtentry **drt)
        return 0;
 }
 
+struct rt_purgecloned_arg {
+       struct ifnet    *ifp;
+       int             family;
+};
+
+static int
+rt_purgecloned_callback(struct radix_node *rn, void *xap)
+{
+       struct rtentry *rt = (struct rtentry *)rn;
+       struct rt_purgecloned_arg *arg = xap;
+
+       if (rt->rt_ifp == arg->ifp && rt->rt_flags & RTF_WASCLONED)
+               rtrequest(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt), 0, NULL);
+       return 0;
+}
+
+void
+rt_purgecloned(struct ifnet *ifp, int af)
+{
+       struct radix_node_head *rnh;
+       struct rt_purgecloned_arg arg = {
+               .ifp = ifp,
+               .family = af,
+       };
+
+       ASSERT_NETISR0;
+
+       if ((rnh = rt_tables[mycpuid][af]) != NULL)
+               rnh->rnh_walktree(rnh, rt_purgecloned_callback, &arg);
+}
+
 static int
 rt_setshims(struct rtentry *rt, struct sockaddr **rt_shim){
        int i;
index 27660f5..54a4be5 100644 (file)
@@ -353,6 +353,7 @@ int  rt_llroute (struct sockaddr *dst, struct rtentry *rt0,
 void    rt_missmsg (int, struct rt_addrinfo *, int, int);
 void    rt_newaddrmsg (int, struct ifaddr *, int, struct rtentry *);
 void    rt_newmaddrmsg (int, struct ifmultiaddr *);
+void    rt_purgecloned(struct ifnet *, int);
 void    rt_rtmsg(int cmd, struct rtentry *rt, struct ifnet *ifp, int error);
 int     rt_setgate (struct rtentry *, struct sockaddr *, struct sockaddr *);
 void    rtalloc (struct route *);