Switch to ETHER_INPUT2 on ethernet input path by default:
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 27 Jul 2008 10:06:57 +0000 (10:06 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 27 Jul 2008 10:06:57 +0000 (10:06 +0000)
- Nuke old ether_input_chain and ether_demux_chain
- Nuke old vlan_input
- Nuke ETHER_INPUT2 kernel option
- Adjust comment about functions on old ether input path
- Adjust NIC drivers which aware ETHER_INPUT2

vlan(4):
Clearing of ifnet.if_vlantrunks is now protected in the following way
    trunks = ifp->if_vlantrunks;
    ifp->if_vlantrunks = NULL;
    netmsg_service_sync();
    kfree(trunks);
Users of ifnet.if_vlantrunks have already been adjusted to aware of this.

bridge(4):
Clearing of ifnet.if_bridge is now protected in the following way
    ifp->if_bridge = NULL;
    netmsg_service_sync();
Users of ifnet.if_bridge have already been adjusted to aware of this.

carp(4):
Remove the LK_NOWAIT lockmgr lock flags; using LK_NOWAIT was actually a
workaround for that lockmgr lock was used in NIC's interrupt routine
(i.e. old ether_input)
Dragonfly-bug: <http://bugs.dragonflybsd.org/issue957>

ipflow:
- Now per-cpu ipflow hash table installs its own ipflow entry instead of
  having ipflow entry duplicated onto each cpu
- Remove the serializer parameter to ipflow_fastforward()
- Comment out ipflow_fastforward() in ef(4) and ppp(4), they need to be
  changed to fit the current ipflow cpu localization model

25 files changed:
sys/conf/options
sys/config/LINT
sys/dev/netif/bce/if_bce.c
sys/dev/netif/bfe/if_bfe.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/em/if_em.c
sys/dev/netif/et/if_et.c
sys/dev/netif/fxp/if_fxp.c
sys/dev/netif/msk/if_msk.c
sys/dev/netif/nfe/if_nfe.c
sys/dev/netif/re/if_re.c
sys/dev/netif/xl/if_xl.c
sys/net/bridge/if_bridge.c
sys/net/dummynet/ip_dummynet_glue.c
sys/net/ef/if_ef.c
sys/net/ethernet.h
sys/net/if_ethersubr.c
sys/net/if_var.h
sys/net/ppp/if_ppp.c
sys/net/vlan/if_vlan.c
sys/netgraph/ether/ng_ether.c
sys/netinet/in_var.h
sys/netinet/ip_carp.c
sys/netinet/ip_flow.c
sys/netinet/ip_input.c

index b364013..4a2a837 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/options,v 1.191.2.53 2003/06/04 17:56:58 sam Exp $
-# $DragonFly: src/sys/conf/options,v 1.91 2008/07/07 22:02:09 nant Exp $
+# $DragonFly: src/sys/conf/options,v 1.92 2008/07/27 10:06:55 sephe Exp $
 #
 #        On the handling of kernel options
 #
@@ -641,4 +641,3 @@ PROFILE_SERIALIZER  opt_serializer.h
 
 # ethernet options
 ETHER_INPUT_CHAIN      opt_ethernet.h
-ETHER_INPUT2           opt_ethernet.h
index 75708a7..5f736e1 100644 (file)
@@ -3,7 +3,7 @@
 #      as much of the source tree as it can.
 #
 # $FreeBSD: src/sys/i386/conf/LINT,v 1.749.2.144 2003/06/04 17:56:59 sam Exp $
-# $DragonFly: src/sys/config/LINT,v 1.169 2008/07/26 14:26:30 sephe Exp $
+# $DragonFly: src/sys/config/LINT,v 1.170 2008/07/27 10:06:55 sephe Exp $
 #
 # See the kernconf(5) manual page for more information on the format of
 # this file.
@@ -2787,5 +2787,3 @@ options           PROFILE_SERIALIZER
 
 # Chain ethernet inputs
 options                ETHER_INPUT_CHAIN
-# New ethernet input (dispatch ethernet operation to protocol threads)
-options                ETHER_INPUT2
index 7cffe3b..562d0e1 100644 (file)
@@ -28,7 +28,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bce/if_bce.c,v 1.31 2007/05/16 23:34:11 davidch Exp $
- * $DragonFly: src/sys/dev/netif/bce/if_bce.c,v 1.15 2008/07/22 11:49:22 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bce/if_bce.c,v 1.16 2008/07/27 10:06:55 sephe Exp $
  */
 
 /*
@@ -3988,11 +3988,7 @@ bce_rx_int_next_rx:
                                        l2fhdr->l2_fhdr_vlan_tag;
                        }
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                        ether_input_chain2(ifp, m, chain);
-#else
-                       ether_input_chain(ifp, m, chain);
-#endif
 #else
                        ifp->if_input(ifp, m);
 #endif
index dba8b57..9a24e68 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bfe/if_bfe.c 1.4.4.7 2004/03/02 08:41:33 julian Exp  v
- * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.35 2008/06/26 12:05:19 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.36 2008/07/27 10:06:55 sephe Exp $
  */
 #include "opt_ethernet.h"
 
@@ -1156,11 +1156,7 @@ bfe_rxeof(struct bfe_softc *sc)
                m->m_pkthdr.rcvif = ifp;
 
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                ether_input_chain2(ifp, m, chain);
-#else
-               ether_input_chain(ifp, m, chain);
-#endif
 #else
                ifp->if_input(ifp, m);
 #endif
index b2fd81e..292908a 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.39 2005/07/03 03:41:18 silby Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.103 2008/07/22 11:55:01 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.104 2008/07/27 10:06:55 sephe Exp $
  *
  */
 
@@ -2356,11 +2356,7 @@ bge_rxeof(struct bge_softc *sc)
                        have_tag = vlan_tag = 0;
                }
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                ether_input_chain2(ifp, m, chain);
-#else
-               ether_input_chain(ifp, m, chain);
-#endif
 #else
                ifp->if_input(ifp, m);
 #endif
index ce1490e..b9e89db 100644 (file)
@@ -64,7 +64,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.76 2008/07/22 12:08:41 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.77 2008/07/27 10:06:55 sephe Exp $
  * $FreeBSD$
  */
 /*
@@ -3100,11 +3100,7 @@ em_rxeof(struct adapter *adapter, int count)
                                                 E1000_RXD_SPC_VLAN_MASK);
                                }
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                                ether_input_chain2(ifp, adapter->fmp, chain);
-#else
-                               ether_input_chain(ifp, adapter->fmp, chain);
-#endif
 #else
                                ifp->if_input(ifp, adapter->fmp);
 #endif
index 89434e1..a4ab314 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/et/if_et.c,v 1.14 2008/07/09 15:42:12 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/et/if_et.c,v 1.15 2008/07/27 10:06:56 sephe Exp $
  */
 
 #include "opt_ethernet.h"
@@ -1981,11 +1981,7 @@ et_rxeof(struct et_softc *sc)
 
                                ifp->if_ipackets++;
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                                ether_input_chain2(ifp, m, chain);
-#else
-                               ether_input_chain(ifp, m, chain);
-#endif
 #else
                                ifp->if_input(ifp, m);
 #endif
index 28a0801..3a3c8b3 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.110.2.30 2003/06/12 16:47:05 mux Exp $
- * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.55 2008/06/27 10:55:23 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.56 2008/07/27 10:06:56 sephe Exp $
  */
 
 /*
@@ -1403,11 +1403,7 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
                        }
                        m->m_pkthdr.len = m->m_len = total_len;
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                        ether_input_chain2(ifp, m, chain);
-#else
-                       ether_input_chain(ifp, m, chain);
-#endif
 #else
                        ifp->if_input(ifp, m);
 #endif
index 692709e..a6e974b 100644 (file)
@@ -93,7 +93,7 @@
  */
 
 /* $FreeBSD: src/sys/dev/msk/if_msk.c,v 1.26 2007/12/05 09:41:58 remko Exp $ */
-/* $DragonFly: src/sys/dev/netif/msk/if_msk.c,v 1.5 2008/06/26 13:08:55 sephe Exp $ */
+/* $DragonFly: src/sys/dev/netif/msk/if_msk.c,v 1.6 2008/07/27 10:06:56 sephe Exp $ */
 
 /*
  * Device driver for the Marvell Yukon II Ethernet controller.
@@ -2856,11 +2856,7 @@ msk_rxeof(struct msk_if_softc *sc_if, uint32_t status, int len,
 #endif
 
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                ether_input_chain2(ifp, m, chain);
-#else
-               ether_input_chain(ifp, m, chain);
-#endif
 #else
                ifp->if_input(ifp, m);
 #endif
index c47f934..d8a2498 100644 (file)
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_nfe.c,v 1.63 2006/06/17 18:00:43 brad Exp $        */
-/*     $DragonFly: src/sys/dev/netif/nfe/if_nfe.c,v 1.42 2008/07/26 07:41:45 sephe Exp $       */
+/*     $DragonFly: src/sys/dev/netif/nfe/if_nfe.c,v 1.43 2008/07/27 10:06:56 sephe Exp $       */
 
 /*
  * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
@@ -1081,11 +1081,7 @@ nfe_rxeof(struct nfe_softc *sc)
 
                ifp->if_ipackets++;
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                ether_input_chain2(ifp, m, chain);
-#else
-               ether_input_chain(ifp, m, chain);
-#endif
 #else
                ifp->if_input(ifp, m);
 #endif
index 35ccec1..7bf42d2 100644 (file)
@@ -33,7 +33,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $
- * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.45 2008/07/26 16:12:06 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.46 2008/07/27 10:06:56 sephe Exp $
  */
 
 /*
@@ -1626,11 +1626,7 @@ re_rxeof(struct re_softc *sc)
                                be16toh((rxvlan & RE_RDESC_VLANCTL_DATA));
                }
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                ether_input_chain2(ifp, m, chain);
-#else
-               ether_input_chain(ifp, m, chain);
-#endif
 #else
                ifp->if_input(ifp, m);
 #endif
index 2c6ce4d..a316b20 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_xl.c,v 1.72.2.28 2003/10/08 06:01:57 murray Exp $
- * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.51 2008/06/25 11:46:03 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.52 2008/07/27 10:06:56 sephe Exp $
  */
 
 /*
@@ -2142,11 +2142,7 @@ again:
                }
 
 #ifdef ETHER_INPUT_CHAIN
-#ifdef ETHER_INPUT2
                ether_input_chain2(ifp, m, chain);
-#else
-               ether_input_chain(ifp, m, chain);
-#endif
 #else
                ifp->if_input(ifp, m);
 #endif
index 4bd4a3f..b9da296 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.41 2008/06/19 15:51:57 sephe Exp $
+ * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.42 2008/07/27 10:06:57 sephe Exp $
  */
 
 /*
@@ -738,27 +738,28 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif,
        ASSERT_SERIALIZED(bifp->if_serializer);
 
        ifs->if_bridge = NULL;
-#ifdef notyet
+
+       /*
+        * Release bridge interface's serializer:
+        * - To avoid possible dead lock.
+        * - netmsg_service_sync will block current thread.
+        */
+       lwkt_serialize_exit(bifp->if_serializer);
+
+       /*
+        * Make sure that all protocol threads see 'ifs' if_bridge change.
+        */
        netmsg_service_sync();
-#endif
 
        if (!gone) {
                switch (ifs->if_type) {
                case IFT_ETHER:
                case IFT_L2VLAN:
-                       /*
-                        * Release bridge interface's serializer to
-                        * avoid possible dead lock.
-                        */
-                       lwkt_serialize_exit(bifp->if_serializer);
-
                        /*
                         * Take the interface out of promiscuous mode.
                         */
                        ifpromisc(ifs, 0);
                        bridge_mutecaps(bif, 0);
-
-                       lwkt_serialize_enter(bifp->if_serializer);
                        break;
 
                case IFT_GIF:
@@ -770,6 +771,8 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif,
                }
        }
 
+       lwkt_serialize_enter(bifp->if_serializer);
+
        LIST_REMOVE(bif, bif_next);
 
        bridge_rtdelete(sc, ifs, IFBF_FLUSHALL);
index f8d2ca2..a398521 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.6 2008/06/17 20:50:11 aggelos Exp $
+ * $DragonFly: src/sys/net/dummynet/ip_dummynet_glue.c,v 1.7 2008/07/27 10:06:57 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -413,7 +413,7 @@ ip_dn_ether_demux(struct netmsg *nmsg)
                kprintf("%s: pullup fail, dropping pkt\n", __func__);
                goto back;
        }
-       ether_demux(NULL, m);
+       ether_demux_oncpu(NULL, m);
 back:
        if (unref_priv)
                unref_priv(priv);
index 70bde26..3f6ead0 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_ef.c,v 1.2.2.4 2001/02/22 09:27:04 bp Exp $
- * $DragonFly: src/sys/net/ef/if_ef.c,v 1.26 2008/03/07 11:34:19 sephe Exp $
+ * $DragonFly: src/sys/net/ef/if_ef.c,v 1.27 2008/07/27 10:06:57 sephe Exp $
  */
 
 #include "opt_inet.h"
@@ -240,8 +240,10 @@ ef_inputEII(struct mbuf *m, struct llc* l, u_short ether_type)
 #endif
 #ifdef INET
        case ETHERTYPE_IP:
-               if (ipflow_fastforward(m, NULL))
+#ifdef notyet
+               if (ipflow_fastforward(m))
                        return (0);
+#endif
                isr = NETISR_IP;
                break;
        case ETHERTYPE_ARP:
index 6f18d2f..65911c5 100644 (file)
@@ -2,7 +2,7 @@
  * Fundamental constants relating to ethernet.
  *
  * $FreeBSD: src/sys/net/ethernet.h,v 1.12.2.8 2002/12/01 14:03:09 sobomax Exp $
- * $DragonFly: src/sys/net/ethernet.h,v 1.19 2008/06/24 11:40:56 sephe Exp $
+ * $DragonFly: src/sys/net/ethernet.h,v 1.20 2008/07/27 10:06:56 sephe Exp $
  *
  */
 
@@ -367,7 +367,6 @@ extern      int  (*ng_ether_output_p)(struct ifnet *ifp, struct mbuf **mp);
 extern void (*ng_ether_attach_p)(struct ifnet *ifp);
 extern void (*ng_ether_detach_p)(struct ifnet *ifp);
 
-extern int (*vlan_input_p)(struct mbuf *m, struct mbuf_chain *chain);
 extern void (*vlan_input2_p)(struct mbuf *m);
 
 /*
index 7389714..4dd688e 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.80 2008/07/27 03:49:30 sephe Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.81 2008/07/27 10:06:56 sephe Exp $
  */
 
 #include "opt_atalk.h"
@@ -124,15 +124,12 @@ int       (*ng_ether_output_p)(struct ifnet *ifp, struct mbuf **mp);
 void   (*ng_ether_attach_p)(struct ifnet *ifp);
 void   (*ng_ether_detach_p)(struct ifnet *ifp);
 
-int    (*vlan_input_p)(struct mbuf *, struct mbuf_chain *);
 void   (*vlan_input2_p)(struct mbuf *);
 
 static int ether_output(struct ifnet *, struct mbuf *, struct sockaddr *,
                        struct rtentry *);
 static void ether_restore_header(struct mbuf **, const struct ether_header *,
                                 const struct ether_header *);
-static void ether_demux_chain(struct ifnet *, struct mbuf *,
-                             struct mbuf_chain *);
 
 /*
  * if_bridge support
@@ -550,369 +547,15 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, struct ip_fw **rule,
        return FALSE;
 }
 
-/*
- * Process a received Ethernet packet.
- *
- * The ethernet header is assumed to be in the mbuf so the caller
- * MUST MAKE SURE that there are at least sizeof(struct ether_header)
- * bytes in the first mbuf.
- *
- * This allows us to concentrate in one place a bunch of code which
- * is replicated in all device drivers. Also, many functions called
- * from ether_input() try to put the eh back into the mbuf, so we
- * can later propagate the 'contiguous packet' interface to them.
- *
- * NOTA BENE: for all drivers "eh" is a pointer into the first mbuf or
- * cluster, right before m_data. So be very careful when working on m,
- * as you could destroy *eh !!
- *
- * First we perform any link layer operations, then continue to the
- * upper layers with ether_demux().
- */
-void
-ether_input_chain(struct ifnet *ifp, struct mbuf *m, struct mbuf_chain *chain)
-{
-       struct ether_header *eh;
-
-       ASSERT_SERIALIZED(ifp->if_serializer);
-       M_ASSERTPKTHDR(m);
-
-       /* Discard packet if interface is not up */
-       if (!(ifp->if_flags & IFF_UP)) {
-               m_freem(m);
-               return;
-       }
-
-       if (m->m_len < sizeof(struct ether_header)) {
-               /* XXX error in the caller. */
-               m_freem(m);
-               return;
-       }
-       eh = mtod(m, struct ether_header *);
-
-       if (ntohs(eh->ether_type) == ETHERTYPE_VLAN &&
-           (m->m_flags & M_VLANTAG) == 0) {
-               /*
-                * Extract vlan tag if hardware does not do it for us
-                */
-               vlan_ether_decap(&m);
-               if (m == NULL)
-                       return;
-               eh = mtod(m, struct ether_header *);
-       }
-
-       m->m_pkthdr.rcvif = ifp;
-
-       if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
-               if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost,
-                        ifp->if_addrlen) == 0)
-                       m->m_flags |= M_BCAST;
-               else
-                       m->m_flags |= M_MCAST;
-               ifp->if_imcasts++;
-       }
-
-       ETHER_BPF_MTAP(ifp, m);
-
-       ifp->if_ibytes += m->m_pkthdr.len;
-
-       if (ifp->if_flags & IFF_MONITOR) {
-               /*
-                * Interface marked for monitoring; discard packet.
-                */
-                m_freem(m);
-                return;
-       }
-
-       /*
-        * Tap the packet off here for a bridge.  bridge_input()
-        * will return NULL if it has consumed the packet, otherwise
-        * it gets processed as normal.  Note that bridge_input()
-        * will always return the original packet if we need to
-        * process it locally.
-        */
-       if (ifp->if_bridge) {
-               KASSERT(bridge_input_p != NULL,
-                       ("%s: if_bridge not loaded!", __func__));
-
-               if(m->m_flags & M_PROTO1) {
-                       m->m_flags &= ~M_PROTO1;
-               } else {
-                       /* clear M_PROMISC, in case the packets comes from a vlan */
-                       /* m->m_flags &= ~M_PROMISC; */
-                       lwkt_serialize_exit(ifp->if_serializer);
-                       m = bridge_input_p(ifp, m);
-                       lwkt_serialize_enter(ifp->if_serializer);
-                       if (m == NULL)
-                               return;
-
-                       KASSERT(ifp == m->m_pkthdr.rcvif,
-                               ("bridge_input_p changed rcvif\n"));
-
-                       /* 'm' may be changed by bridge_input_p() */
-                       eh = mtod(m, struct ether_header *);
-               }
-       }
-
-       /* Handle ng_ether(4) processing, if any */
-       if (ng_ether_input_p != NULL) {
-               ng_ether_input_p(ifp, &m);
-               if (m == NULL)
-                       return;
-
-               /* 'm' may be changed by ng_ether_input_p() */
-               eh = mtod(m, struct ether_header *);
-       }
-
-       /* Continue with upper layer processing */
-       ether_demux_chain(ifp, m, chain);
-}
-
 static void
 ether_input(struct ifnet *ifp, struct mbuf *m)
 {
-       ether_input_chain(ifp, m, NULL);
-}
-
-/*
- * Upper layer processing for a received Ethernet packet.
- */
-static void
-ether_demux_chain(struct ifnet *ifp, struct mbuf *m, struct mbuf_chain *chain)
-{
-       struct ether_header save_eh, *eh;
-       int isr;
-       u_short ether_type;
-       struct ip_fw *rule = NULL;
-       struct m_tag *mtag;
-#ifdef NETATALK
-       struct llc *l;
-#endif
-
-       M_ASSERTPKTHDR(m);
-       KASSERT(m->m_len >= ETHER_HDR_LEN,
-               ("ether header is no contiguous!\n"));
-
-       eh = mtod(m, struct ether_header *);
-       save_eh = *eh;
-
-       /* XXX old crufty stuff, needs to be removed */
-       m_adj(m, sizeof(struct ether_header));
-
-       /* Extract info from dummynet tag */
-       mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL);
-       if (mtag != NULL) {
-               rule = ((struct dn_pkt *)m_tag_data(mtag))->dn_priv;
-               KKASSERT(ifp == NULL);
-               ifp = m->m_pkthdr.rcvif;
-
-               m_tag_delete(m, mtag);
-               mtag = NULL;
-       }
-       if (rule)       /* packet is passing the second time */
-               goto post_stats;
-
-#ifdef CARP
-       /*
-        * XXX: Okay, we need to call carp_forus() and - if it is for
-        * us jump over code that does the normal check
-        * "ac_enaddr == ether_dhost". The check sequence is a bit
-        * different from OpenBSD, so we jump over as few code as
-        * possible, to catch _all_ sanity checks. This needs
-        * evaluation, to see if the carp ether_dhost values break any
-        * of these checks!
-        */
-       if (ifp->if_carp && carp_forus(ifp->if_carp, eh->ether_dhost))
-               goto post_stats;
-#endif
-
-       /*
-        * Discard packet if upper layers shouldn't see it because
-        * it was unicast to a different Ethernet address.  If the
-        * driver is working properly, then this situation can only
-        * happen when the interface is in promiscuous mode.
-        */
-       if (((ifp->if_flags & (IFF_PROMISC | IFF_PPROMISC)) == IFF_PROMISC) &&
-           (eh->ether_dhost[0] & 1) == 0 &&
-           bcmp(eh->ether_dhost, IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN)) {
-               m_freem(m);
-               return;
-       }
-
-post_stats:
-       if (IPFW_LOADED && ether_ipfw != 0) {
-               if (!ether_ipfw_chk(&m, NULL, &rule, eh)) {
-                       m_freem(m);
-                       return;
-               }
-       }
-
-       ether_type = ntohs(save_eh.ether_type);
-
-       if (m->m_flags & M_VLANTAG) {
-               if (ether_type == ETHERTYPE_VLAN) {
-                       /*
-                        * To prevent possible dangerous recursion,
-                        * we don't do vlan-in-vlan
-                        */
-                       m->m_pkthdr.rcvif->if_noproto++;
-                       m_freem(m);
-                       return;
-               }
-
-               if (vlan_input_p != NULL) {
-                       ether_restore_header(&m, eh, &save_eh);
-                       if (m != NULL)
-                               vlan_input_p(m, chain);
-               } else {
-                       m->m_pkthdr.rcvif->if_noproto++;
-                       m_freem(m);
-               }
-               return;
-       }
-       KKASSERT(ether_type != ETHERTYPE_VLAN);
-
-       switch (ether_type) {
-#ifdef INET
-       case ETHERTYPE_IP:
-               if (ipflow_fastforward(m, ifp->if_serializer))
-                       return;
-               isr = NETISR_IP;
-               break;
-
-       case ETHERTYPE_ARP:
-               if (ifp->if_flags & IFF_NOARP) {
-                       /* Discard packet if ARP is disabled on interface */
-                       m_freem(m);
-                       return;
-               }
-               isr = NETISR_ARP;
-               break;
-#endif
-
-#ifdef INET6
-       case ETHERTYPE_IPV6:
-               isr = NETISR_IPV6;
-               break;
-#endif
-
-#ifdef IPX
-       case ETHERTYPE_IPX:
-               if (ef_inputp && ef_inputp(ifp, &save_eh, m) == 0)
-                       return;
-               isr = NETISR_IPX;
-               break;
-#endif
-
-#ifdef NS
-       case 0x8137: /* Novell Ethernet_II Ethernet TYPE II */
-               isr = NETISR_NS;
-               break;
-
-#endif
-
-#ifdef NETATALK
-       case ETHERTYPE_AT:
-               isr = NETISR_ATALK1;
-               break;
-       case ETHERTYPE_AARP:
-               isr = NETISR_AARP;
-               break;
-#endif
-
-#ifdef MPLS
-       case ETHERTYPE_MPLS:
-       case ETHERTYPE_MPLS_MCAST:
-               isr = NETISR_MPLS;
-               break;
-#endif
-
-       default:
-#ifdef IPX
-               if (ef_inputp && ef_inputp(ifp, &save_eh, m) == 0)
-                       return;
-#endif
-#ifdef NS
-               checksum = mtod(m, ushort *);
-               /* Novell 802.3 */
-               if ((ether_type <= ETHERMTU) &&
-                   ((*checksum == 0xffff) || (*checksum == 0xE0E0))) {
-                       if (*checksum == 0xE0E0) {
-                               m->m_pkthdr.len -= 3;
-                               m->m_len -= 3;
-                               m->m_data += 3;
-                       }
-                       isr = NETISR_NS;
-                       break;
-               }
-#endif
-#ifdef NETATALK
-               if (ether_type > ETHERMTU)
-                       goto dropanyway;
-               l = mtod(m, struct llc *);
-               if (l->llc_dsap == LLC_SNAP_LSAP &&
-                   l->llc_ssap == LLC_SNAP_LSAP &&
-                   l->llc_control == LLC_UI) {
-                       if (bcmp(&(l->llc_snap_org_code)[0], at_org_code,
-                                sizeof at_org_code) == 0 &&
-                           ntohs(l->llc_snap_ether_type) == ETHERTYPE_AT) {
-                               m_adj(m, sizeof(struct llc));
-                               isr = NETISR_ATALK2;
-                               break;
-                       }
-                       if (bcmp(&(l->llc_snap_org_code)[0], aarp_org_code,
-                                sizeof aarp_org_code) == 0 &&
-                           ntohs(l->llc_snap_ether_type) == ETHERTYPE_AARP) {
-                               m_adj(m, sizeof(struct llc));
-                               isr = NETISR_AARP;
-                               break;
-                       }
-               }
-dropanyway:
-#endif
-               if (ng_ether_input_orphan_p != NULL)
-                       (*ng_ether_input_orphan_p)(ifp, m, &save_eh);
-               else
-                       m_freem(m);
-               return;
-       }
-
-#ifdef ETHER_INPUT_CHAIN
-       if (chain != NULL) {
-               struct mbuf_chain *c;
-               lwkt_port_t port;
-               int cpuid;
-
-               port = netisr_mport(isr, &m);
-               if (port == NULL)
-                       return;
-
-               m->m_pkthdr.header = port; /* XXX */
-               cpuid = port->mpu_td->td_gd->gd_cpuid;
-
-               c = &chain[cpuid];
-               if (c->mc_head == NULL) {
-                       c->mc_head = c->mc_tail = m;
-               } else {
-                       c->mc_tail->m_nextpkt = m;
-                       c->mc_tail = m;
-               }
-               m->m_nextpkt = NULL;
-       } else
-#endif /* ETHER_INPUT_CHAIN */
-               netisr_dispatch(isr, m);
-}
-
-void
-ether_demux(struct ifnet *ifp, struct mbuf *m)
-{
-       ether_demux_chain(ifp, m, NULL);
+       ether_input_chain2(ifp, m, NULL);
 }
 
 /*
  * Perform common duties while attaching to interface list
  */
-
 void
 ether_ifattach(struct ifnet *ifp, uint8_t *lla, lwkt_serialize_t serializer)
 {
@@ -1371,12 +1014,10 @@ ether_input_chain_init(struct mbuf_chain *chain)
 
 #endif /* ETHER_INPUT_CHAIN */
 
-#ifdef ETHER_INPUT2
-
 /*
  * Upper layer processing for a received Ethernet packet.
  */
-static void
+void
 ether_demux_oncpu(struct ifnet *ifp, struct mbuf *m)
 {
        struct ether_header *eh;
@@ -1471,10 +1112,8 @@ post_stats:
        switch (ether_type) {
 #ifdef INET
        case ETHERTYPE_IP:
-#ifdef notyet
-               if (ipflow_fastforward(m, ifp->if_serializer))
+               if (ipflow_fastforward(m))
                        return;
-#endif
                isr = NETISR_IP;
                break;
 
@@ -1896,5 +1535,3 @@ ether_input_chain2(struct ifnet *ifp, struct mbuf *m, struct mbuf_chain *chain)
 #endif /* ETHER_INPUT_CHAIN */
                lwkt_sendmsg(port, &m->m_hdr.mh_netmsg.nm_netmsg.nm_lmsg);
 }
-
-#endif /* ETHER_INPUT2 */
index bcce45f..17dd28c 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     From: @(#)if.h  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.16 2003/04/15 18:11:19 fjoe Exp $
- * $DragonFly: src/sys/net/if_var.h,v 1.62 2008/07/27 03:49:30 sephe Exp $
+ * $DragonFly: src/sys/net/if_var.h,v 1.63 2008/07/27 10:06:56 sephe Exp $
  */
 
 #ifndef        _NET_IF_VAR_H_
@@ -536,16 +536,13 @@ void      ether_ifattach(struct ifnet *, uint8_t *, struct lwkt_serialize *);
 void   ether_ifattach_bpf(struct ifnet *, uint8_t *, u_int, u_int,
                        struct lwkt_serialize *);
 void   ether_ifdetach(struct ifnet *);
-void   ether_input_chain(struct ifnet *, struct mbuf *, struct mbuf_chain *);
-#ifdef ETHER_INPUT2
+void   ether_demux_oncpu(struct ifnet *, struct mbuf *);
 void   ether_input_oncpu(struct ifnet *, struct mbuf *);
 void   ether_input_chain2(struct ifnet *, struct mbuf *, struct mbuf_chain *);
-#endif
 #ifdef ETHER_INPUT_CHAIN
 void   ether_input_chain_init(struct mbuf_chain *);
 void   ether_input_dispatch(struct mbuf_chain *);
 #endif
-void   ether_demux(struct ifnet *, struct mbuf *);
 int    ether_output_frame(struct ifnet *, struct mbuf *);
 int    ether_ioctl(struct ifnet *, int, caddr_t);
 uint32_t       ether_crc32_le(const uint8_t *, size_t);
index 90c2b89..d22d9a4 100644 (file)
@@ -70,7 +70,7 @@
  */
 
 /* $FreeBSD: src/sys/net/if_ppp.c,v 1.67.2.4 2002/04/14 21:41:48 luigi Exp $ */
-/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.38 2008/05/14 11:59:23 sephe Exp $ */
+/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.39 2008/07/27 10:06:57 sephe Exp $ */
 /* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */
 /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */
 
@@ -1487,8 +1487,10 @@ ppp_inproc(struct ppp_softc *sc, struct mbuf *m)
        m->m_pkthdr.len -= PPP_HDRLEN;
        m->m_data += PPP_HDRLEN;
        m->m_len -= PPP_HDRLEN;
-       if (ipflow_fastforward(m, ifp->if_serializer))
+#ifdef notyet
+       if (ipflow_fastforward(m))
            return;
+#endif
        isr = NETISR_IP;
        break;
 #endif
index 9e0f549..8e42608 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_vlan.c,v 1.15.2.13 2003/02/14 22:25:58 fenner Exp $
- * $DragonFly: src/sys/net/vlan/if_vlan.c,v 1.36 2008/06/24 11:40:56 sephe Exp $
+ * $DragonFly: src/sys/net/vlan/if_vlan.c,v 1.37 2008/07/27 10:06:57 sephe Exp $
  */
 
 /*
@@ -134,11 +134,7 @@ static void        vlan_ifdetach(void *, struct ifnet *);
 static void    vlan_init(void *);
 static void    vlan_start(struct ifnet *);
 static int     vlan_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
-
-static int     vlan_input(struct mbuf *m, struct mbuf_chain *);
-#ifdef ETHER_INPUT2
 static void    vlan_input2(struct mbuf *);
-#endif
 
 static void    vlan_clrmulti(struct ifvlan *, struct ifnet *);
 static int     vlan_setmulti(struct ifvlan *, struct ifnet *);
@@ -254,12 +250,7 @@ vlan_modevent(module_t mod, int type, void *data)
        switch (type) {
        case MOD_LOAD:
                LIST_INIT(&ifv_list);
-               vlan_input_p = vlan_input;
-#ifdef ETHER_INPUT2
                vlan_input2_p = vlan_input2;
-#else
-               vlan_input2_p = NULL;
-#endif
                vlan_ifdetach_cookie =
                EVENTHANDLER_REGISTER(ifnet_detach_event,
                                      vlan_ifdetach, NULL,
@@ -269,7 +260,6 @@ vlan_modevent(module_t mod, int type, void *data)
 
        case MOD_UNLOAD:
                if_clone_detach(&vlan_cloner);
-               vlan_input_p = NULL;
                vlan_input2_p = NULL;
                EVENTHANDLER_DEREGISTER(ifnet_detach_event,
                                        vlan_ifdetach_cookie);
@@ -453,66 +443,6 @@ vlan_start(struct ifnet *ifp)
        }
 }
 
-static int
-vlan_input(struct mbuf *m, struct mbuf_chain *chain)
-{
-       struct ifvlan *ifv = NULL;
-       struct ifnet *rcvif;
-       struct vlan_trunk *vlantrunks;
-       struct vlan_entry *entry;
-
-       rcvif = m->m_pkthdr.rcvif;
-       ASSERT_SERIALIZED(rcvif->if_serializer);
-       KKASSERT(m->m_flags & M_VLANTAG);
-
-       vlantrunks = rcvif->if_vlantrunks;
-       if (vlantrunks == NULL) {
-               rcvif->if_noproto++;
-               m_freem(m);
-               return -1;
-       }
-
-       crit_enter();
-       LIST_FOREACH(entry, &vlantrunks[mycpuid].vlan_list, ifv_link) {
-               if (entry->ifv->ifv_tag ==
-                   EVL_VLANOFTAG(m->m_pkthdr.ether_vlantag)) {
-                       ifv = entry->ifv;
-                       break;
-               }
-       }
-       crit_exit();
-
-       /*
-        * Packet is discarded if:
-        * - no corresponding vlan(4) interface
-        * - vlan(4) interface has not been completely set up yet,
-        *   or is being destroyed (ifv->ifv_p != rcvif)
-        * - vlan(4) interface is not brought up
-        */
-       if (ifv == NULL || ifv->ifv_p != rcvif ||
-           (ifv->ifv_if.if_flags & IFF_UP) == 0) {
-               rcvif->if_noproto++;
-               m_freem(m);
-               return -1;      /* so ether_input can take note */
-       }
-
-       /*
-        * Clear M_VLANTAG, before the packet is handed to
-        * vlan(4) interface
-        */
-       m->m_flags &= ~M_VLANTAG;
-
-       ifv->ifv_if.if_ipackets++;
-       lwkt_serialize_exit(rcvif->if_serializer);
-       lwkt_serialize_enter(ifv->ifv_if.if_serializer);
-       ether_input_chain(&ifv->ifv_if, m, chain);
-       lwkt_serialize_exit(ifv->ifv_if.if_serializer);
-       lwkt_serialize_enter(rcvif->if_serializer);
-       return 0;
-}
-
-#ifdef ETHER_INPUT2
-
 static void
 vlan_input2(struct mbuf *m)
 {
@@ -583,8 +513,6 @@ vlan_input2(struct mbuf *m)
        ether_input_oncpu(ifp, m);
 }
 
-#endif /* ETHER_INPUT2 */
-
 static void
 vlan_link_dispatch(struct netmsg *nmsg)
 {
@@ -783,16 +711,13 @@ vlan_unlink(struct ifvlan *ifv, struct ifnet *ifp_p)
 
        crit_enter();
        if (LIST_EMPTY(&vlantrunks[mycpuid].vlan_list)) {
-#ifdef notyet
                ifp_p->if_vlantrunks = NULL;
+
+               /*
+                * Make that all protocol threads see if_vlantrunks change.
+                */
                netmsg_service_sync();
                kfree(vlantrunks, M_VLAN);
-#else
-               lwkt_serialize_enter(ifp_p->if_serializer);
-               kfree(ifp_p->if_vlantrunks, M_VLAN);
-               ifp_p->if_vlantrunks = NULL;
-               lwkt_serialize_exit(ifp_p->if_serializer);
-#endif
        }
        crit_exit();
 }
index aac90e1..682c63b 100644 (file)
@@ -38,7 +38,7 @@
  *         Julian Elischer <julian@freebsd.org>
  *
  * $FreeBSD: src/sys/netgraph/ng_ether.c,v 1.2.2.13 2002/07/02 20:10:25 archie Exp $
- * $DragonFly: src/sys/netgraph/ether/ng_ether.c,v 1.16 2008/05/28 12:11:13 sephe Exp $
+ * $DragonFly: src/sys/netgraph/ether/ng_ether.c,v 1.17 2008/07/27 10:06:57 sephe Exp $
  */
 
 /*
@@ -204,8 +204,6 @@ NETGRAPH_INIT(ether, &ng_ether_typestruct);
 /*
  * Handle a packet that has come in on an interface. We get to
  * look at it here before any upper layer protocols do.
- *
- * NOTE: this function will get called with ifp's serializer being held
  */
 static void
 ng_ether_input(struct ifnet *ifp, struct mbuf **mp)
@@ -222,8 +220,6 @@ ng_ether_input(struct ifnet *ifp, struct mbuf **mp)
 /*
  * Handle a packet that has come in on an interface, and which
  * does not match any of our known protocols (an ``orphan'').
- *
- * NOTE: this function will get called at splimp()
  */
 static void
 ng_ether_input_orphan(struct ifnet *ifp,
@@ -634,10 +630,13 @@ ng_ether_rcv_upper(node_p node, struct mbuf *m, meta_p meta)
 
        m->m_pkthdr.rcvif = priv->ifp;
 
+       /*
+        * XXX
+        * Since frame processing is run in netisr0,
+        * 'm' may _not_ even on its target CPU.
+        */
        /* Route packet back in */
-       lwkt_serialize_enter(priv->ifp->if_serializer);
-       ether_demux(priv->ifp, m);
-       lwkt_serialize_exit(priv->ifp->if_serializer);
+       ether_demux_oncpu(priv->ifp, m);
        return (0);
 }
 
index 96b0091..e9f94ab 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)in_var.h    8.2 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/netinet/in_var.h,v 1.33.2.3 2001/12/14 20:09:34 jlemon Exp $
- * $DragonFly: src/sys/netinet/in_var.h,v 1.14 2008/07/03 08:22:36 corecode Exp $
+ * $DragonFly: src/sys/netinet/in_var.h,v 1.15 2008/07/27 10:06:57 sephe Exp $
  */
 
 #ifndef _NETINET_IN_VAR_H_
@@ -253,7 +253,7 @@ void        in_ifscrub (struct ifnet *, struct in_ifaddr *);
 void   in_iaunlink (struct in_ifaddr *);
 void   in_iahash_insert (struct in_ifaddr *);
 void   in_iahash_remove (struct in_ifaddr *);
-int    ipflow_fastforward (struct mbuf *, struct lwkt_serialize *);
+int    ipflow_fastforward (struct mbuf *);
 void   ipflow_create (const struct route *, struct mbuf *);
 void   ipflow_slowtimo (void);
 
index 7ab9546..8cd8cd9 100644 (file)
@@ -25,7 +25,7 @@
  */
 /*
  * $FreeBSD: src/sys/netinet/ip_carp.c,v 1.48 2007/02/02 09:39:09 glebius Exp $
- * $DragonFly: src/sys/netinet/ip_carp.c,v 1.9 2008/06/08 08:38:05 sephe Exp $
+ * $DragonFly: src/sys/netinet/ip_carp.c,v 1.10 2008/07/27 10:06:57 sephe Exp $
  */
 
 #include "opt_carp.h"
@@ -161,7 +161,7 @@ struct carp_if {
 /* Get carp_if from softc. Valid after carp_set_addr{,6}. */
 #define        SC2CIF(sc)              ((struct carp_if *)(sc)->sc_carpdev->if_carp)
 
-#define        CARP_LOCK_INIT(cif)     lockinit(&(cif)->vhif_lock, "carp_if", 0,  LK_NOWAIT);
+#define        CARP_LOCK_INIT(cif)     lockinit(&(cif)->vhif_lock, "carp_if", 0, 0);
 #define        CARP_LOCK_DESTROY(cif)  ;
 #define        CARP_LOCK_ASSERT(cif)   ;
 #define        CARP_LOCK(cif)          lockmgr(&(cif)->vhif_lock, LK_EXCLUSIVE);
index cd71e6b..0d58e53 100644 (file)
@@ -34,7 +34,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_flow.c,v 1.9.2.2 2001/11/04 17:35:31 luigi Exp $
- * $DragonFly: src/sys/netinet/ip_flow.c,v 1.14 2008/05/14 11:59:24 sephe Exp $
+ * $DragonFly: src/sys/netinet/ip_flow.c,v 1.15 2008/07/27 10:06:57 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -115,7 +115,7 @@ ipflow_lookup(const struct ip *ip)
 }
 
 int
-ipflow_fastforward(struct mbuf *m, lwkt_serialize_t serializer)
+ipflow_fastforward(struct mbuf *m)
 {
        struct ip *ip;
        struct ipflow *ipf;
@@ -180,9 +180,6 @@ ipflow_fastforward(struct mbuf *m, lwkt_serialize_t serializer)
        else
                dst = &ipf->ipf_ro.ro_dst;
 
-       if (serializer)
-               lwkt_serialize_exit(serializer);
-
        error = ifp->if_output(ifp, m, dst, rt);
        if (error) {
                if (error == ENOBUFS)
@@ -190,9 +187,6 @@ ipflow_fastforward(struct mbuf *m, lwkt_serialize_t serializer)
                else
                        ipf->ipf_errors++;
        }
-
-       if (serializer)
-               lwkt_serialize_enter(serializer);
        return 1;
 }
 
@@ -319,13 +313,19 @@ ipflow_slowtimo(void)
 #endif
 }
 
-static void
-ipflow_create_oncpu(const struct route *ro, struct mbuf *m)
+void
+ipflow_create(const struct route *ro, struct mbuf *m)
 {
        const struct ip *const ip = mtod(m, struct ip *);
        struct ipflow *ipf;
        unsigned hash;
 
+       /*
+        * Don't create cache entries for ICMP messages.
+        */
+       if (!ipflow_active || ip->ip_p == IPPROTO_ICMP)
+               return;
+
        /*
         * See if an existing flow struct exists.  If so remove it from it's
         * list and free the old route.  If not, try to malloc a new one
@@ -343,7 +343,7 @@ ipflow_create_oncpu(const struct route *ro, struct mbuf *m)
                        ipflow_inuse++;
                }
                bzero(ipf, sizeof(*ipf));
-       } else if (IPFLOW_RTENTRY_ISDOWN(ipf->ipf_ro.ro_rt)) {
+       } else {
                crit_enter();
                LIST_REMOVE(ipf, ipf_next);
                crit_exit();
@@ -352,14 +352,6 @@ ipflow_create_oncpu(const struct route *ro, struct mbuf *m)
                RTFREE(ipf->ipf_ro.ro_rt);
                ipf->ipf_uses = ipf->ipf_last_uses = 0;
                ipf->ipf_errors = ipf->ipf_dropped = 0;
-       } else {
-               /*
-                * The route entry cached in ipf is still up,
-                * this could happen while the ipf installation
-                * is in transition state.
-                * XXX should not happen on UP box
-                */
-               return;
        }
 
        /*
@@ -381,80 +373,6 @@ ipflow_create_oncpu(const struct route *ro, struct mbuf *m)
        crit_exit();
 }
 
-#ifdef SMP
-
-static void
-ipflow_create_dispatch(struct netmsg *nmsg)
-{
-       struct netmsg_packet *nmp = (struct netmsg_packet *)nmsg;
-       struct sockaddr_in *sin;
-       struct route ro;
-       int nextcpu;
-
-       bzero(&ro, sizeof(ro));
-       sin = (struct sockaddr_in *)&ro.ro_dst;
-       sin->sin_family = AF_INET;
-       sin->sin_len = sizeof(struct sockaddr_in);
-       sin->sin_addr.s_addr = (in_addr_t)nmsg->nm_lmsg.u.ms_result32;
-
-       rtalloc_ign(&ro, RTF_PRCLONING);
-       if (ro.ro_rt != NULL) {
-               ipflow_create_oncpu(&ro, nmp->nm_packet);
-               RTFREE(ro.ro_rt);
-       }
-
-       nextcpu = mycpuid + 1;
-       if (nextcpu < ncpus)
-               lwkt_forwardmsg(cpu_portfn(nextcpu), &nmsg->nm_lmsg);
-       else
-               m_freem(nmp->nm_packet);
-}
-
-#endif /* SMP */
-
-void
-ipflow_create(const struct route *ro, struct mbuf *m)
-{
-       const struct ip *const ip = mtod(m, struct ip *);
-#ifdef SMP
-       struct netmsg_packet *nmp;
-       struct netmsg *nmsg;
-       int nextcpu;
-#endif
-
-       /*
-        * Don't create cache entries for ICMP messages.
-        */
-       if (!ipflow_active || ip->ip_p == IPPROTO_ICMP) {
-               m_freem(m);
-               return;
-       }
-
-#ifdef SMP
-       nmp = &m->m_hdr.mh_netmsg;
-       nmsg = &nmp->nm_netmsg;
-
-       netmsg_init(nmsg, &netisr_apanic_rport, 0, ipflow_create_dispatch);
-       nmp->nm_packet = m;
-       nmsg->nm_lmsg.u.ms_result32 =
-               ((const struct sockaddr_in *)&ro->ro_dst)->sin_addr.s_addr;
-
-       if (mycpuid == 0) {
-               ipflow_create_oncpu(ro, m);
-               nextcpu = 1;
-       } else {
-               nextcpu = 0;
-       }
-       if (nextcpu < ncpus)
-               lwkt_sendmsg(cpu_portfn(nextcpu), &nmsg->nm_lmsg);
-       else
-               m_freem(m);
-#else
-       ipflow_create_oncpu(ro, m);
-       m_freem(m);
-#endif
-}
-
 static void
 ipflow_init(void)
 {
index 0ffdf36..88e3ef8 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.82 2008/07/03 08:22:36 corecode Exp $
+ * $DragonFly: src/sys/netinet/ip_input.c,v 1.83 2008/07/27 10:06:57 sephe Exp $
  */
 
 #define        _IP_VHL
@@ -2014,8 +2014,8 @@ ip_forward(struct mbuf *m, boolean_t using_srcrt, struct sockaddr_in *next_hop)
                ipstat.ips_forward++;
                if (type == 0) {
                        if (mcopy) {
-                               /* ipflow_create() will free mcopy */
                                ipflow_create(cache_rt, mcopy);
+                               m_freem(mcopy);
                        }
                        return;         /* most common case */
                } else {