Save 'ipfw forward' information in mtag, use m_pkthdr.fw_flags to indicate
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 22 Aug 2008 09:14:17 +0000 (09:14 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 22 Aug 2008 09:14:17 +0000 (09:14 +0000)
that this mtag exists (mainly to avoid unnecessary mtag locating).  This
actually eliminates the last reference to MT_TAG mbuf; nuke it completely.

sys/net/bridge/if_bridge.c
sys/net/dummynet/ip_dummynet_glue.c
sys/net/if_ethersubr.c
sys/net/ipfw/ip_fw2.c
sys/net/ipfw/ip_fw2.h
sys/netinet/ip_input.c
sys/netinet/ip_output.c
sys/netinet/tcp_input.c
sys/sys/mbuf.h

index b9da296..e5ae711 100644 (file)
@@ -66,7 +66,7 @@
  * $OpenBSD: if_bridge.c,v 1.60 2001/06/15 03:38:33 itojun Exp $
  * $NetBSD: if_bridge.c,v 1.31 2005/06/01 19:45:34 jdc Exp $
  * $FreeBSD: src/sys/net/if_bridge.c,v 1.26 2005/10/13 23:05:55 thompsa Exp $
- * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.42 2008/07/27 10:06:57 sephe Exp $
+ * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.43 2008/08/22 09:14:17 sephe Exp $
  */
 
 /*
@@ -1452,11 +1452,6 @@ bridge_enqueue_internal(struct ifnet *dst_ifp, struct mbuf *m,
        lwkt_port_t port;
        int cpu = mycpu->gd_cpuid;
 
-       while (m->m_type == MT_TAG) {
-               /* XXX see ether_output_frame for full rules check */
-               m = m->m_next;
-       }
-
        nmp = &m->m_hdr.mh_netmsg;
        netmsg_init(&nmp->nm_netmsg, &netisr_apanic_rport, 0, handler);
        nmp->nm_packet = m;
@@ -2962,10 +2957,6 @@ bridge_pfil_enqueue_handler(struct netmsg *nmsg)
 static void
 bridge_handoff(struct ifnet *dst_ifp, struct mbuf *m)
 {
-       while (m->m_type == MT_TAG) {
-               /* XXX see ether_output_frame for full rules check */
-               m = m->m_next;
-       }
        bridge_handoff_notags(dst_ifp, m);
 }
 
@@ -2974,8 +2965,6 @@ bridge_handoff_notags(struct ifnet *dst_ifp, struct mbuf *m)
 {
        struct mbuf *m0;
 
-       KKASSERT(m->m_type != MT_TAG);
-
        lwkt_serialize_enter(dst_ifp->if_serializer);
 
        /* We may be sending a fragment so traverse the mbuf */
index a398521..c58ace9 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/net/dummynet/ip_dummynet_glue.c,v 1.7 2008/07/27 10:06:57 sephe Exp $
+ * $DragonFly: src/sys/net/dummynet/ip_dummynet_glue.c,v 1.8 2008/08/22 09:14:17 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -85,7 +85,6 @@ ip_dn_queue(struct mbuf *m)
        struct netmsg_packet *nmp;
        lwkt_port_t port;
 
-       KASSERT(m->m_type != MT_TAG, ("mbuf contains old style tag!\n"));
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
                ("mbuf is not tagged for dummynet!\n"));
@@ -106,7 +105,6 @@ ip_dn_packet_free(struct dn_pkt *pkt)
        lwkt_port_t port;
        struct mbuf *m = pkt->dn_m;
 
-       KASSERT(m->m_type != MT_TAG, ("mbuf contains old style tag!\n"));
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
                ("mbuf is not tagged for dummynet!\n"));
@@ -150,7 +148,6 @@ ip_dn_packet_redispatch(struct dn_pkt *pkt)
                ("unsupported dummynet redispatch dir %d\n", dir));
 
        m = pkt->dn_m;
-       KASSERT(m->m_type != MT_TAG, ("mbuf contains old style tag!\n"));
        M_ASSERTPKTHDR(m);
        KASSERT(m->m_pkthdr.fw_flags & DUMMYNET_MBUF_TAGGED,
                ("mbuf is not tagged for dummynet!\n"));
index 2730377..1d26299 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $
- * $DragonFly: src/sys/net/if_ethersubr.c,v 1.82 2008/08/05 15:11:32 nant Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.83 2008/08/22 09:14:16 sephe Exp $
  */
 
 #include "opt_atalk.h"
@@ -484,12 +484,21 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, struct ip_fw **rule,
                        return FALSE;
        }
 
-       args.m = *m0;           /* the packet we are looking at         */
-       args.oif = dst;         /* destination, if any                  */
+       /*
+        * Clean up tags
+        */
        if ((mtag = m_tag_find(*m0, PACKET_TAG_IPFW_DIVERT, NULL)) != NULL)
                m_tag_delete(*m0, mtag);
+       if ((*m0)->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
+               mtag = m_tag_find(*m0, PACKET_TAG_IPFORWARD, NULL);
+               KKASSERT(mtag != NULL);
+               m_tag_delete(*m0, mtag);
+               (*m0)->m_pkthdr.fw_flags &= ~IPFORWARD_MBUF_TAGGED;
+       }
+
+       args.m = *m0;           /* the packet we are looking at         */
+       args.oif = dst;         /* destination, if any                  */
        args.rule = *rule;      /* matching rule to restart             */
-       args.next_hop = NULL;   /* we do not support forward yet        */
        args.eh = &save_eh;     /* MAC header for bridged/MAC packets   */
        i = ip_fw_chk_ptr(&args);
        *m0 = args.m;
index a85ab61..a58de15 100644 (file)
@@ -23,7 +23,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_fw2.c,v 1.6.2.12 2003/04/08 10:42:32 maxim Exp $
- * $DragonFly: src/sys/net/ipfw/ip_fw2.c,v 1.74 2008/08/21 12:11:34 sephe Exp $
+ * $DragonFly: src/sys/net/ipfw/ip_fw2.c,v 1.75 2008/08/22 09:14:16 sephe Exp $
  */
 
 #define        DEB(x)
@@ -1572,7 +1572,6 @@ lookup_next_rule(struct ip_fw *me)
  *             The incoming interface is in the mbuf. (in)
  *
  *     args->rule      Pointer to the last matching rule (in/out)
- *     args->next_hop  Socket we are forwarding to (out).
  *     args->f_id      Addresses grabbed from the packet (out)
  *
  * Return value:
@@ -2344,8 +2343,22 @@ check_body:
                                if (args->eh)   /* not valid on layer2 pkts */
                                        break;
                                if (!dyn_f || dyn_dir == MATCH_FORWARD) {
-                                       args->next_hop =
-                                           &((ipfw_insn_sa *)cmd)->sa;
+                                       struct sockaddr_in *sin;
+
+                                       mtag = m_tag_get(PACKET_TAG_IPFORWARD,
+                                              sizeof(*sin), MB_DONTWAIT);
+                                       if (mtag == NULL) {
+                                               retval = IP_FW_PORT_DENY_FLAG;
+                                               goto done;
+                                       }
+                                       sin = m_tag_data(mtag);
+
+                                       /* Structure copy */
+                                       *sin = ((ipfw_insn_sa *)cmd)->sa;
+
+                                       m_tag_prepend(m, mtag);
+                                       m->m_pkthdr.fw_flags |=
+                                               IPFORWARD_MBUF_TAGGED;
                                }
                                retval = 0;
                                goto done;
index 37f971b..774b9a3 100644 (file)
@@ -23,7 +23,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_fw2.h,v 1.1.2.2 2002/08/16 11:03:11 luigi Exp $
- * $DragonFly: src/sys/net/ipfw/ip_fw2.h,v 1.13 2008/08/16 09:05:59 sephe Exp $
+ * $DragonFly: src/sys/net/ipfw/ip_fw2.h,v 1.14 2008/08/22 09:14:16 sephe Exp $
  */
 
 #ifndef _IPFW2_H
@@ -368,7 +368,6 @@ struct _ipfw_dyn_rule {
 struct ip_fw_args {
        struct mbuf     *m;             /* the mbuf chain               */
        struct ifnet    *oif;           /* output interface             */
-       struct sockaddr_in *next_hop;   /* forward address              */
        struct ip_fw    *rule;          /* matching rule                */
        struct ether_header *eh;        /* for bridged packets          */
 
index 71826e4..e129ff5 100644 (file)
@@ -65,7 +65,7 @@
  *
  *     @(#)ip_input.c  8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/netinet/ip_input.c,v 1.130.2.52 2003/03/07 07:01:28 silby Exp $
- * $DragonFly: src/sys/netinet/ip_input.c,v 1.84 2008/07/28 13:45:43 sephe Exp $
+ * $DragonFly: src/sys/netinet/ip_input.c,v 1.85 2008/08/22 09:14:16 sephe Exp $
  */
 
 #define        _IP_VHL
@@ -373,46 +373,28 @@ struct route ipforward_rt[MAXCPU];
 
 /* Do transport protocol processing. */
 static void
-transport_processing_oncpu(struct mbuf *m, int hlen, struct ip *ip,
-                          struct sockaddr_in *nexthop)
+transport_processing_oncpu(struct mbuf *m, int hlen, struct ip *ip)
 {
        /*
         * Switch out to protocol's input routine.
         */
-       if (nexthop && ip->ip_p == IPPROTO_TCP) {
-               /* TCP needs IPFORWARD info if available */
-               struct m_hdr tag;
-
-               tag.mh_type = MT_TAG;
-               tag.mh_flags = PACKET_TAG_IPFORWARD;
-               tag.mh_data = (caddr_t)nexthop;
-               tag.mh_next = m;
-
-               (*inetsw[ip_protox[ip->ip_p]].pr_input)
-                   ((struct mbuf *)&tag, hlen, ip->ip_p);
-       } else {
-               (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen, ip->ip_p);
-       }
+       (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen, ip->ip_p);
 }
 
 struct netmsg_transport_packet {
        struct netmsg           nm_netmsg;
        struct mbuf             *nm_mbuf;
        int                     nm_hlen;
-       boolean_t               nm_hasnexthop;
-       struct sockaddr_in      nm_nexthop;
 };
 
 static void
 transport_processing_handler(netmsg_t netmsg)
 {
        struct netmsg_transport_packet *msg = (void *)netmsg;
-       struct sockaddr_in *nexthop;
        struct ip *ip;
 
        ip = mtod(msg->nm_mbuf, struct ip *);
-       nexthop = msg->nm_hasnexthop ? &msg->nm_nexthop : NULL;
-       transport_processing_oncpu(msg->nm_mbuf, msg->nm_hlen, ip, nexthop);
+       transport_processing_oncpu(msg->nm_mbuf, msg->nm_hlen, ip);
        lwkt_replymsg(&msg->nm_netmsg.nm_lmsg, 0);
 }
 
@@ -445,6 +427,7 @@ ip_input(struct mbuf *m)
        boolean_t needredispatch = FALSE;
        struct in_addr odst;                    /* original dst address(NAT) */
        struct m_tag *mtag;
+       struct sockaddr_in *next_hop = NULL;
 #ifdef FAST_IPSEC
        struct tdb_ident *tdbi;
        struct secpolicy *sp;
@@ -454,30 +437,21 @@ ip_input(struct mbuf *m)
        args.eh = NULL;
        args.oif = NULL;
        args.rule = NULL;
-       args.next_hop = NULL;
 
-       /* Grab info from MT_TAG mbufs prepended to the chain. */
-       while (m != NULL && m->m_type == MT_TAG) {
-               switch(m->_m_tag_id) {
-               case PACKET_TAG_IPFORWARD:
-                       args.next_hop = (struct sockaddr_in *)m->m_hdr.mh_data;
-                       break;
-               default:
-                       kprintf("ip_input: unrecognised MT_TAG tag %d\n",
-                           m->_m_tag_id);
-                       break;
-               }
-               m = m->m_next;
-       }
        M_ASSERTPKTHDR(m);
 
+       if (m->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
+               /* Next hop */
+               mtag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL);
+               KKASSERT(mtag != NULL);
+               next_hop = m_tag_data(mtag);
+       }
+
        /* Extract info from dummynet tag */
        mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL);
        if (mtag != NULL) {
                args.rule = ((struct dn_pkt *)m_tag_data(mtag))->dn_priv;
-
                m_tag_delete(m, mtag);
-               mtag = NULL;
        }
 
        if (args.rule != NULL) {        /* dummynet already filtered us */
@@ -605,7 +579,7 @@ iphack:
                 * If we've been forwarded from the output side, then
                 * skip the firewall a second time
                 */
-               if (args.next_hop != NULL)
+               if (next_hop != NULL)
                        goto ours;
 
                args.m = m;
@@ -618,7 +592,14 @@ iphack:
                        return;
                }
                ip = mtod(m, struct ip *);      /* just in case m changed */
-               if (i == 0 && args.next_hop == NULL)    /* common case */
+
+               if (m->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
+                       mtag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL);
+                       KKASSERT(mtag != NULL);
+                       next_hop = m_tag_data(mtag);
+               }
+
+               if (i == 0 && next_hop == NULL) /* common case */
                        goto pass;
                if (i & IP_FW_PORT_DYNT_FLAG) {
                        /* Send packet to the appropriate pipe */
@@ -632,7 +613,7 @@ iphack:
                        goto ours;
                }
 #endif
-               if (i == 0 && args.next_hop != NULL)
+               if (i == 0 && next_hop != NULL)
                        goto pass;
                /*
                 * if we get here, the packet must be dropped
@@ -649,7 +630,7 @@ pass:
         * to be sent and the original packet to be freed).
         */
        ip_nhops = 0;           /* for source routed packets */
-       if (hlen > sizeof(struct ip) && ip_dooptions(m, 0, args.next_hop))
+       if (hlen > sizeof(struct ip) && ip_dooptions(m, 0, next_hop))
                return;
 
        /* greedy RSVP, snatches any PATH packet of the RSVP protocol and no
@@ -675,7 +656,7 @@ pass:
         * Cache the destination address of the packet; this may be
         * changed by use of 'ipfw fwd'.
         */
-       pkt_dst = args.next_hop ? args.next_hop->sin_addr : ip->ip_dst;
+       pkt_dst = next_hop ? next_hop->sin_addr : ip->ip_dst;
 
        /*
         * Enable a consistency check between the destination address
@@ -695,7 +676,7 @@ pass:
                  !ipforwarding &&
                  m->m_pkthdr.rcvif != NULL &&
                  !(m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) &&
-                 (args.next_hop == NULL);
+                 next_hop == NULL;
 
        /*
         * Check for exact addresses in the hash bucket.
@@ -846,7 +827,7 @@ pass:
                        goto bad;
                }
 #endif
-               ip_forward(m, using_srcrt, args.next_hop);
+               ip_forward(m, using_srcrt, next_hop);
        }
        return;
 
@@ -858,7 +839,7 @@ ours:
         */
        if (ipstealth &&
            hlen > sizeof(struct ip) &&
-           ip_dooptions(m, 1, args.next_hop))
+           ip_dooptions(m, 1, next_hop))
                return;
 
        /* Count the packet in the ip address stats */
@@ -1007,8 +988,8 @@ found:
                 * Jump backwards to complete processing of the
                 * packet. But first clear divert_info to avoid
                 * entering this block again.
-                * We do not need to clear args.divert_rule
-                * or args.next_hop as they will not be used.
+                * We do not need to clear args.divert_rule as
+                * it will not be used.
                 *
                 * XXX Better safe than sorry, remove the DIVERT tag.
                 */
@@ -1092,9 +1073,6 @@ DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/
                netmsg_init(&msg->nm_netmsg, &netisr_afree_rport, 0,
                            transport_processing_handler);
                msg->nm_hlen = hlen;
-               msg->nm_hasnexthop = (args.next_hop != NULL);
-               if (msg->nm_hasnexthop)
-                       msg->nm_nexthop = *args.next_hop;  /* structure copy */
 
                msg->nm_mbuf = m;
                ip = mtod(m, struct ip *);
@@ -1102,7 +1080,7 @@ DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/
                ip->ip_off = ntohs(ip->ip_off);
                lwkt_sendmsg(port, &msg->nm_netmsg.nm_lmsg);
        } else {
-               transport_processing_oncpu(m, hlen, ip, args.next_hop);
+               transport_processing_oncpu(m, hlen, ip);
        }
        return;
 
@@ -1885,7 +1863,6 @@ ip_forward(struct mbuf *m, boolean_t using_srcrt, struct sockaddr_in *next_hop)
        struct mbuf *mcopy;
        n_long dest;
        struct in_addr pkt_dst;
-       struct m_hdr tag;
        struct route *cache_rt = &ipforward_rt[mycpuid];
 
        dest = INADDR_ANY;
@@ -2000,17 +1977,7 @@ ip_forward(struct mbuf *m, boolean_t using_srcrt, struct sockaddr_in *next_hop)
                }
        }
 
-       if (next_hop != NULL) {
-               /* Pass IPFORWARD info if available */
-               tag.mh_type = MT_TAG;
-               tag.mh_flags = PACKET_TAG_IPFORWARD;
-               tag.mh_data = (caddr_t)next_hop;
-               tag.mh_next = m;
-               m = (struct mbuf *)&tag;
-       }
-
-       error = ip_output(m, NULL, cache_rt, IP_FORWARDING, NULL,
-                         NULL);
+       error = ip_output(m, NULL, cache_rt, IP_FORWARDING, NULL, NULL);
        if (error == 0) {
                ipstat.ips_forward++;
                if (type == 0) {
index 329ef37..cab77a7 100644 (file)
@@ -28,7 +28,7 @@
  *
  *     @(#)ip_output.c 8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/netinet/ip_output.c,v 1.99.2.37 2003/04/15 06:44:45 silby Exp $
- * $DragonFly: src/sys/netinet/ip_output.c,v 1.48 2008/08/21 11:57:49 sephe Exp $
+ * $DragonFly: src/sys/netinet/ip_output.c,v 1.49 2008/08/22 09:14:16 sephe Exp $
  */
 
 #define _IP_VHL
@@ -138,39 +138,31 @@ ip_output(struct mbuf *m0, struct mbuf *opt, struct route *ro,
        int isbroadcast, sw_csum;
        struct in_addr pkt_dst;
        struct route iproute;
-       struct m_tag *dn_mtag = NULL;
+       struct m_tag *dn_mtag, *mtag;
 #ifdef IPSEC
        struct secpolicy *sp = NULL;
        struct socket *so = inp ? inp->inp_socket : NULL;
 #endif
 #ifdef FAST_IPSEC
-       struct m_tag *mtag;
        struct secpolicy *sp = NULL;
        struct tdb_ident *tdbi;
 #endif /* FAST_IPSEC */
        struct ip_fw_args args;
+       struct sockaddr_in *next_hop = NULL;
        int src_was_INADDR_ANY = 0;     /* as the name says... */
 
        args.eh = NULL;
        args.rule = NULL;
-       args.next_hop = NULL;
 
-       /* Grab info from MT_TAG mbufs prepended to the chain. */
-       while (m0 != NULL && m0->m_type == MT_TAG) {
-               switch(m0->_m_tag_id) {
-               case PACKET_TAG_IPFORWARD:
-                       args.next_hop = (struct sockaddr_in *)m0->m_data;
-                       break;
-               default:
-                       kprintf("ip_output: unrecognised MT_TAG tag %d\n",
-                           m0->_m_tag_id);
-                       break;
-               }
-               m0 = m0->m_next;
-       }
        m = m0;
        M_ASSERTPKTHDR(m);
 
+       if (m->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
+               mtag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL);
+               KKASSERT(mtag != NULL);
+               next_hop = m_tag_data(mtag);
+       }
+
        /* Extract info from dummynet tag */
        dn_mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL);
        if (dn_mtag != NULL) {
@@ -219,7 +211,7 @@ ip_output(struct mbuf *m0, struct mbuf *opt, struct route *ro,
                        hlen = len;
        }
        ip = mtod(m, struct ip *);
-       pkt_dst = args.next_hop ? args.next_hop->sin_addr : ip->ip_dst;
+       pkt_dst = next_hop ? next_hop->sin_addr : ip->ip_dst;
 
        /*
         * Fill in IP header.
@@ -729,15 +721,20 @@ spd_done:
         * Check with the firewall...
         * but not if we are already being fwd'd from a firewall.
         */
-       if (fw_enable && IPFW_LOADED && !args.next_hop) {
+       if (fw_enable && IPFW_LOADED && !next_hop) {
                struct sockaddr_in *old = dst;
 
                args.m = m;
-               args.next_hop = dst;
                args.oif = ifp;
                off = ip_fw_chk_ptr(&args);
                m = args.m;
-               dst = args.next_hop;
+
+               if (m->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
+                       mtag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL);
+                       KKASSERT(mtag != NULL);
+                       next_hop = m_tag_data(mtag);
+                       dst = next_hop;
+               }
 
                /*
                 * On return we must do the following:
@@ -886,13 +883,6 @@ spd_done:
                                }
                        }
                        if (ia != NULL) {    /* tell ip_input "dont filter" */
-                               struct m_hdr tag;
-
-                               tag.mh_type = MT_TAG;
-                               tag.mh_flags = PACKET_TAG_IPFORWARD;
-                               tag.mh_data = (caddr_t)args.next_hop;
-                               tag.mh_next = m;
-
                                if (m->m_pkthdr.rcvif == NULL)
                                        m->m_pkthdr.rcvif = ifunit("lo0");
                                if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
@@ -904,7 +894,7 @@ spd_done:
                                    CSUM_IP_CHECKED | CSUM_IP_VALID;
                                ip->ip_len = htons(ip->ip_len);
                                ip->ip_off = htons(ip->ip_off);
-                               ip_input((struct mbuf *)&tag);
+                               ip_input(m);
                                goto done;
                        }
                        /* Some of the logic for this was nicked from above.
index d3f951c..d728f42 100644 (file)
@@ -65,7 +65,7 @@
  *
  *     @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.107.2.38 2003/05/21 04:46:41 cjc Exp $
- * $DragonFly: src/sys/netinet/tcp_input.c,v 1.67 2007/04/22 01:13:14 dillon Exp $
+ * $DragonFly: src/sys/netinet/tcp_input.c,v 1.68 2008/08/22 09:14:17 sephe Exp $
  */
 
 #include "opt_ipfw.h"          /* for ipfw_fwd         */
@@ -538,11 +538,12 @@ tcp_input(struct mbuf *m, ...)
 
        tcpstat.tcps_rcvtotal++;
 
-       /* Grab info from and strip MT_TAG mbufs prepended to the chain. */
-       while  (m->m_type == MT_TAG) {
-               if (m->_m_tag_id == PACKET_TAG_IPFORWARD)
-                       next_hop = (struct sockaddr_in *)m->m_hdr.mh_data;
-               m = m->m_next;
+       if (m->m_pkthdr.fw_flags & IPFORWARD_MBUF_TAGGED) {
+               struct m_tag *mtag;
+
+               mtag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL);
+               KKASSERT(mtag != NULL);
+               next_hop = m_tag_data(mtag);
        }
 
 #ifdef INET6
index c181adc..b9f2f6f 100644 (file)
@@ -34,7 +34,7 @@
  *
  *     @(#)mbuf.h      8.5 (Berkeley) 2/19/95
  * $FreeBSD: src/sys/sys/mbuf.h,v 1.44.2.17 2003/04/15 06:15:02 silby Exp $
- * $DragonFly: src/sys/sys/mbuf.h,v 1.49 2008/08/05 15:11:32 nant Exp $
+ * $DragonFly: src/sys/sys/mbuf.h,v 1.50 2008/08/22 09:14:16 sephe Exp $
  */
 
 #ifndef _SYS_MBUF_H_
@@ -245,10 +245,11 @@ struct mbuf {
                                0x00000008
 #define        PF_MBUF_FRAGCACHE       0x00000010
 #define        ALTQ_MBUF_TAGGED        0x00000020      /* altq_qid is valid */
-#define        PF_MBUF_GENERATED       FW_MBUF_GENERATED
-#define        IPFW_MBUF_GENERATED     FW_MBUF_GENERATED
+#define IPFORWARD_MBUF_TAGGED  0x00000040
 #define DUMMYNET_MBUF_TAGGED   0x00000080
 #define ALTQ_MBUF_STATE_HASHED 0x00000100
+#define        PF_MBUF_GENERATED       FW_MBUF_GENERATED
+#define        IPFW_MBUF_GENERATED     FW_MBUF_GENERATED
 
 /*
  * mbuf types.
@@ -257,7 +258,7 @@ struct mbuf {
 #define        MT_DATA         1       /* dynamic (data) allocation */
 #define        MT_HEADER       2       /* packet header */
 #define        MT_SONAME       3       /* socket name */
-#define        MT_TAG          4       /* volatile metadata associated to pkts */
+/* 4 was MT_TAG */
 #define        MT_CONTROL      5       /* extra-data protocol message */
 #define        MT_OOBDATA      6       /* expedited data  */
 #define        MT_NTYPES       7       /* number of mbuf types for mbtypes[] */
@@ -586,25 +587,9 @@ m_getb(int len, int how, int type, int flags)
 /* uint16_t */
 #define        PACKET_TAG_DUMMYNET                     15 /* dummynet info */
 /* struct dn_pkt */
-#define        PACKET_TAG_CARP                         28 /* CARP info */
-
-/*
- * As a temporary and low impact solution to replace the even uglier
- * approach used so far in some parts of the network stack (which relies
- * on global variables), packet tag-like annotations are stored in MT_TAG
- * mbufs (or lookalikes) prepended to the actual mbuf chain.
- *
- *     m_type  = MT_TAG
- *     m_flags = m_tag_id
- *     m_next  = next buffer in chain.
- *
- * BE VERY CAREFUL not to pass these blocks to the mbuf handling routines.
- */
-#define        _m_tag_id       m_hdr.mh_flags
-
-/* Packet tags used in the FreeBSD network stack */
 #define        PACKET_TAG_IPFORWARD                    18 /* ipforward info */
-/* struct sockaddr_in * as m_data */
+/* struct sockaddr_in */
+#define        PACKET_TAG_CARP                         28 /* CARP info */
 
 /* Packet tag routines */
 struct m_tag   *m_tag_alloc(u_int32_t, int, int, int);