Here's a corrected version of the previous diff that got backed out.

The idea is still to stop calling nd6_output() with a NULL ``rt''
argument in order to always use the same code path when inserting
routes.

ok?

Index: net/pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.973
diff -u -p -r1.973 pf.c
--- net/pf.c    28 May 2016 12:04:33 -0000      1.973
+++ net/pf.c    30 May 2016 12:42:46 -0000
@@ -5665,11 +5665,13 @@ pf_route6(struct mbuf **m, struct pf_rul
 {
        struct mbuf             *m0;
        struct sockaddr_in6     *dst, sin6;
+       struct rtentry          *rt = NULL;
        struct ip6_hdr          *ip6;
        struct ifnet            *ifp = NULL;
        struct pf_addr           naddr;
        struct pf_src_node      *sns[PF_SN_MAX];
        struct m_tag            *mtag;
+       unsigned int             rtableid;
 
        if (m == NULL || *m == NULL || r == NULL ||
            (dir != PF_IN && dir != PF_OUT) || oifp == NULL)
@@ -5702,6 +5704,7 @@ pf_route6(struct mbuf **m, struct pf_rul
        dst->sin6_family = AF_INET6;
        dst->sin6_len = sizeof(*dst);
        dst->sin6_addr = ip6->ip6_dst;
+       rtableid = m0->m_pkthdr.ph_rtableid;
 
        if (!r->rt) {
                m0->m_pkthdr.pf.flags |= PF_TAG_GENERATED;
@@ -5754,7 +5757,13 @@ pf_route6(struct mbuf **m, struct pf_rul
        if ((mtag = m_tag_find(m0, PACKET_TAG_PF_REASSEMBLED, NULL))) {
                (void) pf_refragment6(&m0, mtag, dst, ifp);
        } else if ((u_long)m0->m_pkthdr.len <= ifp->if_mtu) {
-               nd6_output(ifp, m0, dst, NULL);
+               rt = rtalloc(sin6tosa(dst), RT_RESOLVE, rtableid);
+               if (rt == NULL) {
+                       ip6stat.ip6s_noroute++;
+                       goto bad;
+               }
+               nd6_output(ifp, m0, dst, rt);
+               rtfree(rt);
        } else {
                icmp6_error(m0, ICMP6_PACKET_TOO_BIG, 0, ifp->if_mtu);
        }
Index: net/pf_norm.c
===================================================================
RCS file: /cvs/src/sys/net/pf_norm.c,v
retrieving revision 1.185
diff -u -p -r1.185 pf_norm.c
--- net/pf_norm.c       28 May 2016 12:04:33 -0000      1.185
+++ net/pf_norm.c       30 May 2016 04:33:01 -0000
@@ -687,6 +687,7 @@ pf_refragment6(struct mbuf **m0, struct 
 {
        struct mbuf             *m = *m0, *t;
        struct pf_fragment_tag  *ftag = (struct pf_fragment_tag *)(mtag + 1);
+       struct rtentry          *rt = NULL;
        u_int32_t                mtu;
        u_int16_t                hdrlen, extoff, maxlen;
        u_int8_t                 proto;
@@ -742,6 +743,16 @@ pf_refragment6(struct mbuf **m0, struct 
                DPFPRINTF(LOG_NOTICE, "refragment error %d", error);
                action = PF_DROP;
        }
+
+       if (ifp != NULL) {
+               rt = rtalloc(sin6tosa(dst), RT_RESOLVE,
+                   m->m_pkthdr.ph_rtableid);
+               if (rt == NULL) {
+                       ip6stat.ip6s_noroute++;
+                       error = -1;
+               }
+       }
+
        for (t = m; m; m = t) {
                t = m->m_nextpkt;
                m->m_nextpkt = NULL;
@@ -750,7 +761,7 @@ pf_refragment6(struct mbuf **m0, struct 
                        if (ifp == NULL) {
                                ip6_forward(m, 0);
                        } else if ((u_long)m->m_pkthdr.len <= ifp->if_mtu) {
-                               nd6_output(ifp, m, dst, NULL);
+                               nd6_output(ifp, m, dst, rt);
                        } else {
                                icmp6_error(m, ICMP6_PACKET_TOO_BIG, 0,
                                    ifp->if_mtu);
@@ -759,6 +770,7 @@ pf_refragment6(struct mbuf **m0, struct 
                        m_freem(m);
                }
        }
+       rtfree(rt);
 
        return (action);
 }

Reply via email to