Rather than trying to keep this old routing table like function alive by
reimplementing rn_refines(), let's get rid of it.

ok?

Index: net/route.c
===================================================================
RCS file: /cvs/src/sys/net/route.c,v
retrieving revision 1.333
diff -u -p -r1.333 route.c
--- net/route.c 6 Oct 2016 19:09:08 -0000       1.333
+++ net/route.c 4 Nov 2016 10:51:55 -0000
@@ -550,11 +550,16 @@ rtredirect(struct sockaddr *dst, struct 
        splsoftassert(IPL_SOFTNET);
 
        /* verify the gateway is directly reachable */
-       if ((ifa = ifa_ifwithnet(gateway, rdomain)) == NULL) {
+       rt = rtalloc(gateway, 0, rdomain);
+       if (!rtisvalid(rt) || ISSET(rt->rt_flags, RTF_GATEWAY)) {
+               rtfree(rt);
                error = ENETUNREACH;
                goto out;
        }
-       ifidx = ifa->ifa_ifp->if_index;
+       ifidx = rt->rt_ifidx;
+       rtfree(rt);
+       rt = NULL;
+
        rt = rtable_lookup(rdomain, dst, NULL, NULL, RTP_ANY);
        /*
         * If the redirect isn't from our current router for this dst,
Index: net/if.c
===================================================================
RCS file: /cvs/src/sys/net/if.c,v
retrieving revision 1.456
diff -u -p -r1.456 if.c
--- net/if.c    19 Oct 2016 02:05:49 -0000      1.456
+++ net/if.c    4 Nov 2016 10:55:03 -0000
@@ -1282,47 +1282,6 @@ ifa_ifwithdstaddr(struct sockaddr *addr,
 }
 
 /*
- * Find an interface on a specific network.  If many, choice
- * is most specific found.
- */
-struct ifaddr *
-ifa_ifwithnet(struct sockaddr *sa, u_int rtableid)
-{
-       struct ifnet *ifp;
-       struct ifaddr *ifa, *ifa_maybe = NULL;
-       char *cplim, *addr_data = sa->sa_data;
-       u_int rdomain;
-
-       KERNEL_ASSERT_LOCKED();
-       rdomain = rtable_l2(rtableid);
-       TAILQ_FOREACH(ifp, &ifnet, if_list) {
-               if (ifp->if_rdomain != rdomain)
-                       continue;
-               TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
-                       char *cp, *cp2, *cp3;
-
-                       if (ifa->ifa_addr->sa_family != sa->sa_family ||
-                           ifa->ifa_netmask == 0)
-                               next: continue;
-                       cp = addr_data;
-                       cp2 = ifa->ifa_addr->sa_data;
-                       cp3 = ifa->ifa_netmask->sa_data;
-                       cplim = (char *)ifa->ifa_netmask +
-                               ifa->ifa_netmask->sa_len;
-                       while (cp3 < cplim)
-                               if ((*cp++ ^ *cp2++) & *cp3++)
-                                   /* want to continue for() loop */
-                                       goto next;
-                       if (ifa_maybe == 0 ||
-                           rn_refines((caddr_t)ifa->ifa_netmask,
-                           (caddr_t)ifa_maybe->ifa_netmask))
-                               ifa_maybe = ifa;
-               }
-       }
-       return (ifa_maybe);
-}
-
-/*
  * Find an interface address specific to an interface best matching
  * a given address.
  */
Index: net/if_var.h
===================================================================
RCS file: /cvs/src/sys/net/if_var.h,v
retrieving revision 1.75
diff -u -p -r1.75 if_var.h
--- net/if_var.h        4 Sep 2016 15:46:39 -0000       1.75
+++ net/if_var.h        4 Nov 2016 10:54:55 -0000
@@ -304,7 +304,6 @@ void        p2p_rtrequest(struct ifnet *, int, 
 
 struct ifaddr *ifa_ifwithaddr(struct sockaddr *, u_int);
 struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *, u_int);
-struct ifaddr *ifa_ifwithnet(struct sockaddr *, u_int);
 struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *);
 void   ifafree(struct ifaddr *);
 
Index: netinet/ip_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.282
diff -u -p -r1.282 ip_input.c
--- netinet/ip_input.c  22 Sep 2016 10:12:25 -0000      1.282
+++ netinet/ip_input.c  4 Nov 2016 10:54:49 -0000
@@ -1117,37 +1117,19 @@ ip_dooptions(struct mbuf *m, struct ifne
                        ipaddr.sin_len = sizeof(ipaddr);
                        memcpy(&ipaddr.sin_addr, cp + off,
                            sizeof(ipaddr.sin_addr));
-                       if (opt == IPOPT_SSRR) {
-                               if ((ia = ifatoia(ifa_ifwithdstaddr(
-                                   sintosa(&ipaddr),
-                                   m->m_pkthdr.ph_rtableid))) == NULL)
-                                       ia = ifatoia(ifa_ifwithnet(
-                                           sintosa(&ipaddr),
-                                           m->m_pkthdr.ph_rtableid));
-                               if (ia == NULL) {
-                                       type = ICMP_UNREACH;
-                                       code = ICMP_UNREACH_SRCFAIL;
-                                       goto bad;
-                               }
-                               memcpy(cp + off, &ia->ia_addr.sin_addr,
-                                   sizeof(struct in_addr));
-                               cp[IPOPT_OFFSET] += sizeof(struct in_addr);
-                       } else {
-                               /* keep packet in the virtual instance */
-                               rt = rtalloc(sintosa(&ipaddr), RT_RESOLVE,
-                                   rtableid);
-                               if (!rtisvalid(rt)) {
-                                       type = ICMP_UNREACH;
-                                       code = ICMP_UNREACH_SRCFAIL;
-                                       rtfree(rt);
-                                       goto bad;
-                               }
-                               ia = ifatoia(rt->rt_ifa);
-                               memcpy(cp + off, &ia->ia_addr.sin_addr,
-                                   sizeof(struct in_addr));
+                       /* keep packet in the virtual instance */
+                       rt = rtalloc(sintosa(&ipaddr), RT_RESOLVE, rtableid);
+                       if (!rtisvalid(rt)) {
+                               type = ICMP_UNREACH;
+                               code = ICMP_UNREACH_SRCFAIL;
                                rtfree(rt);
-                               cp[IPOPT_OFFSET] += sizeof(struct in_addr);
+                               goto bad;
                        }
+                       ia = ifatoia(rt->rt_ifa);
+                       memcpy(cp + off, &ia->ia_addr.sin_addr,
+                           sizeof(struct in_addr));
+                       rtfree(rt);
+                       cp[IPOPT_OFFSET] += sizeof(struct in_addr);
                        ip->ip_dst = ipaddr.sin_addr;
                        /*
                         * Let ip_intr's mcast routing check handle mcast pkts

Reply via email to