Stop using rt_ifp.  While here put some NCARP... ok?

Index: net/pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.950
diff -u -p -r1.950 pf.c
--- net/pf.c    12 Nov 2015 10:07:14 -0000      1.950
+++ net/pf.c    19 Nov 2015 11:05:37 -0000
@@ -36,6 +36,7 @@
  */
 
 #include "bpfilter.h"
+#include "carp.h"
 #include "pflog.h"
 #include "pfsync.h"
 #include "pflow.h"
@@ -2595,9 +2596,11 @@ pf_match_rcvif(struct mbuf *m, struct pf
        if (ifp == NULL)
                return (0);
 
+#if NCARP > 0
        if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
                kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
        else
+#endif
                kif = (struct pfi_kif *)ifp->if_pf_kif;
 
        if_put(ifp);
@@ -5347,7 +5350,6 @@ pf_routable(struct pf_addr *addr, sa_fam
        struct sockaddr_in6     *dst6;
 #endif /* INET6 */
        struct rtentry          *rt, *rt0 = NULL;
-       struct ifnet            *ifp;
 
        check_mpath = 0;
        memset(&ss, 0, sizeof(ss));
@@ -5397,13 +5399,20 @@ pf_routable(struct pf_addr *addr, sa_fam
                ret = 0;
                rt = rt0;
                do {
-                       if (rt->rt_ifp->if_type == IFT_CARP)
-                               ifp = rt->rt_ifp->if_carpdev;
-                       else
-                               ifp = rt->rt_ifp;
-
-                       if (kif->pfik_ifp == ifp)
+                       if (rt->rt_ifidx == kif->pfik_ifp->if_index) {
                                ret = 1;
+#if NCARP > 0
+                       } else {
+                               struct ifnet    *ifp;
+
+                               ifp = if_get(rt->rt_ifidx);
+                               if (ifp != NULL && ifp->if_type == IFT_CARP &&
+                                   ifp->if_carpdev == kif->pfik_ifp)
+                                       ret = 1;
+                               if_put(ifp);
+#endif
+                       }
+
 #ifndef SMALL_KERNEL
                        rt = rtable_mpath_next(rt);
 #else
@@ -5512,7 +5521,7 @@ pf_route(struct mbuf **m, struct pf_rule
                        goto bad;
                }
 
-               ifp = rt->rt_ifp;
+               ifp = if_get(rt->rt_ifidx);
 
                if (rt->rt_flags & RTF_GATEWAY)
                        dst = satosin(rt->rt_gateway);
@@ -5607,6 +5616,8 @@ pf_route(struct mbuf **m, struct pf_rule
 done:
        if (r->rt != PF_DUPTO)
                *m = NULL;
+       if (!r->rt)
+               if_put(ifp);
        rtfree(rt);
        return;
 
@@ -6312,9 +6323,11 @@ pf_test(sa_family_t af, int fwdir, struc
        if (!pf_status.running)
                return (PF_PASS);
 
+#if NCARP > 0
        if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
                kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
        else
+#endif
                kif = (struct pfi_kif *)ifp->if_pf_kif;
 
        if (kif == NULL) {

Reply via email to