Centralize if queue handling.
authorJeffrey Hsu <hsu@dragonflybsd.org>
Mon, 15 Sep 2003 23:38:15 +0000 (23:38 +0000)
committerJeffrey Hsu <hsu@dragonflybsd.org>
Mon, 15 Sep 2003 23:38:15 +0000 (23:38 +0000)
Original patch against FreeBSD submitted by Jonathan Lemon.
Reviewed by Matt Dillon.

53 files changed:
sys/bus/usb/usb_ethersubr.c
sys/bus/usb/usb_ethersubr.h
sys/conf/files
sys/contrib/ipfilter/netinet/ip_auth.c
sys/dev/atm/en/midway.c
sys/dev/atm/hea/eni_receive.c
sys/dev/atm/hfa/fore_receive.c
sys/dev/netif/ic/if_ic.c
sys/dev/netif/plip/if_plip.c
sys/kern/kern_poll.c
sys/net/ef/if_ef.c
sys/net/faith/if_faith.c
sys/net/gif/if_gif.c
sys/net/i4b/driver/i4b_ipr.c
sys/net/if_arcsubr.c
sys/net/if_atmsubr.c
sys/net/if_ethersubr.c
sys/net/if_fddisubr.c
sys/net/if_iso88025subr.c
sys/net/if_loop.c
sys/net/if_var.h
sys/net/intrq.c
sys/net/ip_mroute/ip_mroute.c
sys/net/netisr.c
sys/net/netisr.h
sys/net/ppp/if_ppp.c
sys/net/sl/if_sl.c
sys/net/sppp/if_spppsubr.c
sys/net/tun/Makefile
sys/net/tun/if_tun.c
sys/netgraph/netgraph/ng_base.c
sys/netinet/if_ether.c
sys/netinet/if_ether.h
sys/netinet/in_var.h
sys/netinet/ip_gre.c
sys/netinet/ip_input.c
sys/netinet6/ah_input.c
sys/netinet6/esp_input.c
sys/netinet6/ip6_input.c
sys/netproto/atalk/ddp_input.c
sys/netproto/atm/atm_subr.c
sys/netproto/atm/atm_var.h
sys/netproto/atm/ipatm/ipatm_input.c
sys/netproto/ipx/ipx_if.h
sys/netproto/ipx/ipx_input.c
sys/netproto/ipx/ipx_ip.c
sys/netproto/ipx/ipx_var.h
sys/netproto/natm/natm.c
sys/netproto/natm/natm.h
sys/netproto/natm/natm_proto.c
sys/netproto/ns/ns_if.h
sys/netproto/ns/ns_input.c
sys/netproto/ns/ns_ip.c

index 60d2e9a..a27ed7d 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/usb_ethersubr.c,v 1.4.2.4 2002/11/06 14:23:20 joe Exp $
- * $DragonFly: src/sys/bus/usb/usb_ethersubr.c,v 1.3 2003/08/07 21:16:47 dillon Exp $
+ * $DragonFly: src/sys/bus/usb/usb_ethersubr.c,v 1.4 2003/09/15 23:38:12 hsu Exp $
  *
  * $FreeBSD: src/sys/dev/usb/usb_ethersubr.c,v 1.4.2.4 2002/11/06 14:23:20 joe Exp $
  */
 Static struct ifqueue usbq_rx;
 Static struct ifqueue usbq_tx;
 
-Static void usbintr            (void);
+Static void usbintr(struct mbuf *m);
 
-Static void usbintr()
+Static void usbintr(struct mbuf *m)
 {
        struct ether_header     *eh;
-       struct mbuf             *m;
        struct usb_qdat         *q;
        struct ifnet            *ifp;
        int                     s;
@@ -121,12 +120,12 @@ Static void usbintr()
 
 void usb_register_netisr()
 {
-       register_netisr(NETISR_USB, usbintr);
+       netisr_register(NETISR_USB, usbintr, NULL);
        return;
 }
 
 /*
- * Must be called at splusp() (actually splbio()). This should be
+ * Must be called at splusb() (actually splbio()). This should be
  * the case when called from a transfer callback routine.
  */
 void usb_ether_input(m)
index ca708d9..518a925 100644 (file)
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/usb_ethersubr.h,v 1.4.2.1 2002/11/06 14:23:20 joe Exp $
- * $DragonFly: src/sys/bus/usb/usb_ethersubr.h,v 1.2 2003/06/17 04:28:32 dillon Exp $
+ * $DragonFly: src/sys/bus/usb/usb_ethersubr.h,v 1.3 2003/09/15 23:38:12 hsu Exp $
  */
 
 #ifndef _USB_ETHERSUBR_H_
 #define _USB_ETHERSUBR_H_
 
-#ifndef NETISR_USB
-#define NETISR_USB     25
-#endif
-
 struct usb_qdat {
        struct ifnet            *ifp;
        void (*if_rxstart)      (struct ifnet *);
index 9ad7fb9..29ddb10 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $
-# $DragonFly: src/sys/conf/files,v 1.13 2003/09/12 00:43:30 daver Exp $
+# $DragonFly: src/sys/conf/files,v 1.14 2003/09/15 23:38:12 hsu Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -769,7 +769,6 @@ net/tap/if_tap.c            optional tap
 net/vlan/if_vlan.c             optional vlan
 net/net_osdep.c                standard
 net/netisr.c           standard
-net/intrq.c            standard
 net/radix.c            standard
 net/raw_cb.c           standard
 net/raw_usrreq.c       standard
index 980287a..c471d62 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @(#)$Id: ip_auth.c,v 2.11.2.20 2002/06/04 14:40:42 darrenr Exp $
  * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_auth.c,v 1.21.2.7 2003/03/01 03:55:54 darrenr Exp $
- * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_auth.c,v 1.4 2003/08/07 21:16:48 dillon Exp $
+ * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_auth.c,v 1.5 2003/09/15 23:38:12 hsu Exp $
  */
 #if defined(__sgi) && (IRIX > 602)
 # include <sys/ptimers.h>
@@ -314,7 +314,9 @@ int cmd;
 {
        mb_t *m;
 #if defined(_KERNEL) && !SOLARIS
+#if !defined(__FreeBSD__)
        struct ifqueue *ifq;
+#endif
        int s;
 #endif
        frauth_t auth, *au = &auth, *fra;
@@ -436,6 +438,9 @@ fr_authioctlloop:
 # if SOLARIS
                        error = (fr_qin(fra->fra_q, m) == 0) ? EINVAL : 0;
 # else /* SOLARIS */
+# ifdef __FreeBSD__
+                       error = netisr_queue(NETISR_IP, m);
+# else
                        ifq = &ipintrq;
                        if (IF_QFULL(ifq)) {
                                IF_DROP(ifq);
@@ -447,7 +452,8 @@ fr_authioctlloop:
                                schednetisr(NETISR_IP);
 #  endif
                        }
-# endif /* SOLARIS */
+# endif
+# endif /* !SOLARIS */
                        if (error)
                                fr_authstats.fas_quefail++;
                        else
index cffc388..f00b8f0 100644 (file)
@@ -33,7 +33,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/en/midway.c,v 1.19.2.1 2003/01/23 21:06:42 sam Exp $
- * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.5 2003/08/27 10:35:15 rob Exp $
+ * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.6 2003/09/15 23:38:12 hsu Exp $
  */
 
 /*
@@ -3298,12 +3298,9 @@ int unit, level;
       printf("    %d cells trashed due to totally full buffer\n", sc->otrash);
       printf("    %d cells trashed due almost full buffer\n", sc->ttrash);
       printf("    %d rx mbuf allocation failures\n", sc->rxmbufout);
-#ifdef NATM
-      printf("    %d drops at natmintrq\n", natmintrq.ifq_drops);
-#ifdef NATM_STAT
+#if defined(NATM) && defined(NATM_STAT)
       printf("    natmintr so_rcv: ok/drop cnt: %d/%d, ok/drop bytes: %d/%d\n",
        natm_sookcnt, natm_sodropcnt, natm_sookbytes, natm_sodropbytes);
-#endif
 #endif
     }
 
index bd7b10d..cca2faa 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hea/eni_receive.c,v 1.5 1999/08/28 00:41:45 peter Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hea/eni_receive.c,v 1.5 2003/08/27 10:35:15 rob Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hea/eni_receive.c,v 1.6 2003/09/15 23:38:12 hsu Exp $
  */
 
 /*
@@ -779,10 +779,7 @@ eni_recv_drain ( eup )
                        /*
                         * Schedule callback
                         */
-                       if ( !IF_QFULL ( &atm_intrq ) ) {
-                               que++;
-                               IF_ENQUEUE ( &atm_intrq, m );
-                       } else {
+                       if (netisr_queue(NETISR_ATM, m)) {
                                eup->eu_stats.eni_st_drv.drv_rv_intrq++;
                                eup->eu_pif.pif_ierrors++;
 #ifdef DO_LOG
@@ -807,15 +804,7 @@ next_buffer:
 finish:
        (void) splx(s);
 
-       /*
-        * If we found any completed buffers, schedule a call into
-        * the kernel to process the atm_intrq.
-        */
-       if ( que )
-               SCHED_ATM;
-
        return;
-
 }
 
 /*
index 7acfdd0..ce094c4 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hfa/fore_receive.c,v 1.5.2.2 2003/01/23 21:06:43 sam Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_receive.c,v 1.4 2003/08/27 10:35:16 rob Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_receive.c,v 1.5 2003/09/15 23:38:12 hsu Exp $
  */
 
 /*
@@ -452,10 +452,7 @@ retry:
                /*
                 * Schedule callback
                 */
-               if (!IF_QFULL(&atm_intrq)) {
-                       IF_ENQUEUE(&atm_intrq, mhead);
-                       SCHED_ATM;
-               } else {
+               if (netisr_queue(NETISR_ATM, mhead)) {
                        fup->fu_stats->st_drv.drv_rv_ifull++;
                        KB_FREEALL(mhead);
                        goto free_ent;
index 9ab5825..d93ded8 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/iicbus/if_ic.c,v 1.8 1999/12/29 04:35:39 peter Exp $
- * $DragonFly: src/sys/dev/netif/ic/if_ic.c,v 1.3 2003/08/07 21:17:02 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ic/if_ic.c,v 1.4 2003/09/15 23:38:12 hsu Exp $
  */
 
 /*
@@ -308,11 +308,6 @@ icintr (device_t dev, int event, char *ptr)
          if (len <= ICHDRLEN)
            goto err;
 
-         if (IF_QFULL(&ipintrq)) {
-           IF_DROP(&ipintrq);
-           break;
-         }
-
          len -= ICHDRLEN;
          sc->ic_if.if_ipackets ++;
          sc->ic_if.if_ibytes += len;
@@ -322,10 +317,8 @@ icintr (device_t dev, int event, char *ptr)
 
          top = m_devget(sc->ic_ifbuf + ICHDRLEN, len, 0, &sc->ic_if, 0);
 
-         if (top) {
-           IF_ENQUEUE(&ipintrq, top);
-           schednetisr(NETISR_IP);
-         }
+         if (top)
+           netisr_dispatch(NETISR_IP, top);
          break;
 
        err:
index 07823eb..eb2beef 100644 (file)
@@ -25,7 +25,7 @@
  *
  *     From Id: lpt.c,v 1.55.2.1 1996/11/12 09:08:38 phk Exp
  * $FreeBSD: src/sys/dev/ppbus/if_plip.c,v 1.19.2.1 2000/05/24 00:20:57 n_hibma Exp $
- * $DragonFly: src/sys/dev/netif/plip/if_plip.c,v 1.3 2003/08/07 21:17:04 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/plip/if_plip.c,v 1.4 2003/09/15 23:38:13 hsu Exp $
  */
 
 /*
@@ -515,11 +515,6 @@ lp_intr (void *arg)
 
            sc->sc_iferrs = 0;
 
-           if (IF_QFULL(&ipintrq)) {
-               lprintf("DROP");
-               IF_DROP(&ipintrq);
-               goto done;
-           }
            len -= CLPIPHDRLEN;
            sc->sc_if.if_ipackets++;
            sc->sc_if.if_ibytes += len;
@@ -527,8 +522,7 @@ lp_intr (void *arg)
            if (top) {
                if (sc->sc_if.if_bpf)
                    lptap(&sc->sc_if, top);
-               IF_ENQUEUE(&ipintrq, top);
-               schednetisr(NETISR_IP);
+               netisr_queue(NETISR_IP, top);
            }
            goto done;
        }
@@ -566,11 +560,6 @@ lp_intr (void *arg)
 
            sc->sc_iferrs = 0;
 
-           if (IF_QFULL(&ipintrq)) {
-               lprintf("DROP");
-               IF_DROP(&ipintrq);
-               goto done;
-           }
            len -= LPIPHDRLEN;
            sc->sc_if.if_ipackets++;
            sc->sc_if.if_ibytes += len;
@@ -578,8 +567,7 @@ lp_intr (void *arg)
            if (top) {
                if (sc->sc_if.if_bpf)
                    lptap(&sc->sc_if, top);
-               IF_ENQUEUE(&ipintrq, top);
-               schednetisr(NETISR_IP);
+               netisr_queue(NETISR_IP, top);
            }
        }
        goto done;
index 1d9a7f3..1284723 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_poll.c,v 1.2.2.4 2002/06/27 23:26:33 luigi Exp $
- * $DragonFly: src/sys/kern/kern_poll.c,v 1.4 2003/07/22 22:10:51 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_poll.c,v 1.5 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -185,8 +185,8 @@ static struct pollrec pr[POLL_LIST_LEN];
 void
 init_device_poll(void)
 {
-       register_netisr(NETISR_POLL, netisr_poll);
-       register_netisr(NETISR_POLLMORE, netisr_pollmore);
+       netisr_register(NETISR_POLL, (netisr_fn_t)netisr_poll, NULL);
+       netisr_register(NETISR_POLLMORE, (netisr_fn_t)netisr_pollmore, NULL);
 }
 
 /*
index 1a4d643..05aa1c0 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.4 2003/08/07 21:54:30 dillon Exp $
+ * $DragonFly: src/sys/net/ef/if_ef.c,v 1.5 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include "opt_inet.h"
@@ -256,69 +256,73 @@ ef_start(struct ifnet *ifp)
  */
 static int __inline
 ef_inputEII(struct mbuf *m, struct ether_header *eh, struct llc* l,
-       u_short ether_type, struct ifqueue **inq)
+       u_short ether_type)
 {
+       int isr;
+
        switch(ether_type) {
 #ifdef IPX
-           case ETHERTYPE_IPX:
-               schednetisr(NETISR_IPX);
-               *inq = &ipxintrq;
+       case ETHERTYPE_IPX:
+               isr = NETISR_IPX;
                break;
 #endif
 #ifdef INET
-           case ETHERTYPE_IP:
+       case ETHERTYPE_IP:
                if (ipflow_fastforward(m))
-                       return 1;
-               schednetisr(NETISR_IP);
-               *inq = &ipintrq;
+                       return (0);
+               isr = NETISR_IP;
                break;
-
-           case ETHERTYPE_ARP:
-               schednetisr(NETISR_ARP);
-               *inq = &arpintrq;
+       case ETHERTYPE_ARP:
+               isr = NETISR_ARP;
                break;
 #endif
-           default:
-               return EPROTONOSUPPORT;
+       default:
+               return (EPROTONOSUPPORT);
        }
-       return 0;
+       netisr_dispatch(isr, m);
+       return (0);
 }
 
 static int __inline
 ef_inputSNAP(struct mbuf *m, struct ether_header *eh, struct llc* l,
-       u_short ether_type, struct ifqueue **inq)
+       u_short ether_type)
 {
+       int isr;
+
        switch(ether_type) {
 #ifdef IPX
-           case ETHERTYPE_IPX:
+       case ETHERTYPE_IPX:
                m_adj(m, 8);
-               schednetisr(NETISR_IPX);
-               *inq = &ipxintrq;
+               isr = NETISR_IPX;
                break;
 #endif
-           default:
-               return EPROTONOSUPPORT;
+       default:
+               return (EPROTONOSUPPORT);
        }
-       return 0;
+       netisr_dispatch(isr, m);
+       return (0);
 }
 
 static int __inline
 ef_input8022(struct mbuf *m, struct ether_header *eh, struct llc* l,
-       u_short ether_type, struct ifqueue **inq)
+       u_short ether_type)
 {
+       int isr;
+
        switch(ether_type) {
 #ifdef IPX
-           case 0xe0:
+       case 0xe0:
                m_adj(m, 3);
-               schednetisr(NETISR_IPX);
-               *inq = &ipxintrq;
+               isr = NETISR_IPX;
                break;
 #endif
-           default:
-               return EPROTONOSUPPORT;
+       default:
+               return (EPROTONOSUPPORT);
        }
-       return 0;
+       netisr_dispatch(isr, m);
+       return (0);
 }
+
 /*
  * Called from ether_input()
  */
@@ -327,11 +331,11 @@ ef_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
 {
        u_short ether_type;
        int s, ft = -1;
-       struct ifqueue *inq;
        struct efnet *efp;
        struct ifnet *eifp;
        struct llc *l;
        struct ef_link *efl;
+       int isr;
 
        ether_type = ntohs(eh->ether_type);
        if (ether_type < ETHERMTU) {
@@ -392,41 +396,28 @@ ef_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
        /*
         * Now we ready to adjust mbufs and pass them to protocol intr's
         */
-       inq = NULL;
        switch(ft) {
-           case ETHER_FT_EII:
-               if (ef_inputEII(m, eh, l, ether_type, &inq) != 0)
-                       return EPROTONOSUPPORT;
+       case ETHER_FT_EII:
+               return (ef_inputEII(m, eh, l, ether_type));
                break;
 #ifdef IPX
-           case ETHER_FT_8023:         /* only IPX can be here */
-               schednetisr(NETISR_IPX);
-               inq = &ipxintrq;
+       case ETHER_FT_8023:             /* only IPX can be here */
+               isr = NETISR_IPX;
                break;
 #endif
-           case ETHER_FT_SNAP:
-               if (ef_inputSNAP(m, eh, l, ether_type, &inq) != 0)
-                       return EPROTONOSUPPORT;
+       case ETHER_FT_SNAP:
+               return (ef_inputSNAP(m, eh, l, ether_type));
                break;
-           case ETHER_FT_8022:
-               if (ef_input8022(m, eh, l, ether_type, &inq) != 0)
-                       return EPROTONOSUPPORT;
+       case ETHER_FT_8022:
+               return (ef_input8022(m, eh, l, ether_type));
                break;
-       }
-
-       if (inq == NULL) {
+       default:
                EFDEBUG("No support for frame %d and proto %04x\n",
                        ft, ether_type);
-               return EPROTONOSUPPORT;
+               return (EPROTONOSUPPORT);
        }
-       s = splimp();
-       if (IF_QFULL(inq)) {
-               IF_DROP(inq);
-               m_freem(m);
-       } else
-               IF_ENQUEUE(inq, m);
-       splx(s);
-       return 0;
+       netisr_dispatch(isr, m);
+       return (0);
 }
 
 static int
index 10f0c8e..b637a33 100644 (file)
@@ -33,7 +33,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_faith.c,v 1.3.2.6 2002/04/28 05:40:25 suz Exp $
- * $DragonFly: src/sys/net/faith/if_faith.c,v 1.4 2003/08/26 20:49:47 rob Exp $
+ * $DragonFly: src/sys/net/faith/if_faith.c,v 1.5 2003/09/15 23:38:13 hsu Exp $
  */
 /*
  * derived from
@@ -253,8 +253,7 @@ faithoutput(ifp, m, dst, rt)
        struct sockaddr *dst;
        struct rtentry *rt;
 {
-       int s, isr;
-       struct ifqueue *ifq = 0;
+       int isr;
 
        if ((m->m_flags & M_PKTHDR) == 0)
                panic("faithoutput no HDR");
@@ -295,13 +294,11 @@ faithoutput(ifp, m, dst, rt)
        switch (dst->sa_family) {
 #ifdef INET
        case AF_INET:
-               ifq = &ipintrq;
                isr = NETISR_IP;
                break;
 #endif
 #ifdef INET6
        case AF_INET6:
-               ifq = &ip6intrq;
                isr = NETISR_IPV6;
                break;
 #endif
@@ -313,18 +310,9 @@ faithoutput(ifp, m, dst, rt)
        /* XXX do we need more sanity checks? */
 
        m->m_pkthdr.rcvif = ifp;
-       s = splimp();
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-               splx(s);
-               return (ENOBUFS);
-       }
-       IF_ENQUEUE(ifq, m);
-       schednetisr(isr);
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
-       splx(s);
+       netisr_dispatch(isr, m);
        return (0);
 }
 
index 1927ee0..47d4410 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/net/if_gif.c,v 1.4.2.15 2002/11/08 16:57:13 ume Exp $ */
-/*     $DragonFly: src/sys/net/gif/if_gif.c,v 1.5 2003/08/26 20:49:48 rob Exp $        */
+/*     $DragonFly: src/sys/net/gif/if_gif.c,v 1.6 2003/09/15 23:38:13 hsu Exp $        */
 /*     $KAME: if_gif.c,v 1.87 2001/10/19 08:50:27 itojun Exp $ */
 
 /*
@@ -428,8 +428,7 @@ gif_input(m, af, ifp)
        int af;
        struct ifnet *ifp;
 {
-       int s, isr;
-       struct ifqueue *ifq = NULL;
+       int isr;
 
        if (ifp == NULL) {
                /* just in case */
@@ -471,13 +470,11 @@ gif_input(m, af, ifp)
        switch (af) {
 #ifdef INET
        case AF_INET:
-               ifq = &ipintrq;
                isr = NETISR_IP;
                break;
 #endif
 #ifdef INET6
        case AF_INET6:
-               ifq = &ip6intrq;
                isr = NETISR_IPV6;
                break;
 #endif
@@ -486,19 +483,9 @@ gif_input(m, af, ifp)
                return;
        }
 
-       s = splimp();
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);   /* update statistics */
-               m_freem(m);
-               splx(s);
-               return;
-       }
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
-       IF_ENQUEUE(ifq, m);
-       /* we need schednetisr since the address family may change */
-       schednetisr(isr);
-       splx(s);
+       netisr_dispatch(isr, m);
 
        return;
 }
index f6559ec..bccffb2 100644 (file)
@@ -28,7 +28,7 @@
  *     ---------------------------------------------------------
  *
  * $FreeBSD: src/sys/i4b/driver/i4b_ipr.c,v 1.8.2.3 2001/10/27 15:48:17 hm Exp $
- * $DragonFly: src/sys/net/i4b/driver/i4b_ipr.c,v 1.7 2003/08/26 20:49:48 rob Exp $
+ * $DragonFly: src/sys/net/i4b/driver/i4b_ipr.c,v 1.8 2003/09/15 23:38:13 hsu Exp $
  *
  *     last edit-date: [Fri Oct 26 19:32:38 2001]
  *
@@ -498,26 +498,14 @@ i4biproutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 
        /* check for space in choosen send queue */
        
-#if defined (__FreeBSD__) && __FreeBSD__ > 4
-       if(! IF_HANDOFF(ifq, m, NULL))
+#if defined (__FreeBSD__)
+       if (netisr_queue(NETISR_IP, m))
        {
                NDBGL4(L4_IPRDBG, "ipr%d: send queue full!", unit);
                splx(s);
                sc->sc_if.if_oerrors++;
                return(ENOBUFS);
        }
-#else
-        if(IF_QFULL(ifq))
-        {
-               NDBGL4(L4_IPRDBG, "ipr%d: send queue full!", unit);
-                IF_DROP(ifq);
-                m_freem(m);
-                splx(s);
-                sc->sc_if.if_oerrors++;
-                return(ENOBUFS);
-        }      
-
-        IF_ENQUEUE(ifq, m);
 #endif
        
        NDBGL4(L4_IPRDBG, "ipr%d: add packet to send queue!", unit);
@@ -1071,32 +1059,13 @@ error:
        }
 #endif /* NBPFILTER > 0  || NBPF > 0 */
 
-#if defined (__FreeBSD__) && __FreeBSD__ > 4
-       if(! IF_HANDOFF(&ipintrq, m, NULL))
-       {
+#if defined (__FreeBSD__)
+       if (netisr_queue(NETISR_IP, m)) {
                NDBGL4(L4_IPRDBG, "ipr%d: ipintrq full!", unit);
                sc->sc_if.if_ierrors++;
                sc->sc_if.if_iqdrops++;         
        }
-       else
-       {
-               schednetisr(NETISR_IP);
-       }
-#else
-        if(IF_QFULL(&ipintrq))
-        {
-               NDBGL4(L4_IPRDBG, "ipr%d: ipintrq full!", unit);
-                IF_DROP(&ipintrq);
-                sc->sc_if.if_ierrors++;
-                sc->sc_if.if_iqdrops++;
-                m_freem(m);
-        }
-        else
-        {
-                IF_ENQUEUE(&ipintrq, m);
-                schednetisr(NETISR_IP);
-        }
-#endif 
+#endif
 }
 
 /*---------------------------------------------------------------------------*
index a4cd238..34c9a06 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_arcsubr.c,v 1.36 2001/06/14 05:44:23 itojun Exp $   */
 /*     $FreeBSD: src/sys/net/if_arcsubr.c,v 1.1.2.5 2003/02/05 18:42:15 fjoe Exp $ */
-/*     $DragonFly: src/sys/net/Attic/if_arcsubr.c,v 1.4 2003/08/26 20:49:47 rob Exp $ */
+/*     $DragonFly: src/sys/net/Attic/if_arcsubr.c,v 1.5 2003/09/15 23:38:13 hsu Exp $ */
 
 /*
  * Copyright (c) 1994, 1995 Ignatios Souvatzis
@@ -528,7 +528,7 @@ arc_input(ifp, m)
        struct mbuf *m;
 {
        struct arc_header *ah;
-       struct ifqueue *inq;
+       int isr;
        u_int8_t atype;
 
        if ((ifp->if_flags & IFF_UP) == 0) {
@@ -567,16 +567,14 @@ arc_input(ifp, m)
                m_adj(m, ARC_HDRNEWLEN);
                if (ipflow_fastforward(m))
                        return;
-               schednetisr(NETISR_IP);
-               inq = &ipintrq;
+               isr = NETISR_IP;
                break;
 
        case ARCTYPE_IP_OLD:
                m_adj(m, ARC_HDRLEN);
                if (ipflow_fastforward(m))
                        return;
-               schednetisr(NETISR_IP);
-               inq = &ipintrq;
+               isr = NETISR_IP;
                break;
 
        case ARCTYPE_ARP:
@@ -586,8 +584,7 @@ arc_input(ifp, m)
                        return;
                }
                m_adj(m, ARC_HDRNEWLEN);
-               schednetisr(NETISR_ARP);
-               inq = &arpintrq;
+               isr = NETISR_ARP;
 #ifdef ARCNET_ALLOW_BROKEN_ARP
                mtod(m, struct arphdr *)->ar_pro = htons(ETHERTYPE_IP);
 #endif
@@ -600,8 +597,7 @@ arc_input(ifp, m)
                        return;
                }
                m_adj(m, ARC_HDRLEN);
-               schednetisr(NETISR_ARP);
-               inq = &arpintrq;
+               isr = NETISR_ARP;
 #ifdef ARCNET_ALLOW_BROKEN_ARP
                mtod(m, struct arphdr *)->ar_pro = htons(ETHERTYPE_IP);
 #endif
@@ -610,15 +606,13 @@ arc_input(ifp, m)
 #ifdef INET6
        case ARCTYPE_INET6:
                m_adj(m, ARC_HDRNEWLEN);
-               schednetisr(NETISR_IPV6);
-               inq = &ip6intrq;
+               isr = NETISR_IPV6;
                break;
 #endif
 #ifdef IPX
        case ARCTYPE_IPX:
                m_adj(m, ARC_HDRNEWLEN);
-               schednetisr(NETISR_IPX);
-               inq = &ipxintrq;
+               isr = NETISR_IPX;
                break;
 #endif
        default:
@@ -626,7 +620,7 @@ arc_input(ifp, m)
                return;
        }
 
-       IF_HANDOFF(inq, m, NULL);
+       netisr_dispatch(isr, m);
 }
 
 /*
index f3aaacd..cd93184 100644 (file)
@@ -32,7 +32,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_atmsubr.c,v 1.10.2.1 2001/03/06 00:29:26 obrien Exp $
- * $DragonFly: src/sys/net/if_atmsubr.c,v 1.4 2003/08/07 21:54:30 dillon Exp $
+ * $DragonFly: src/sys/net/if_atmsubr.c,v 1.5 2003/09/15 23:38:13 hsu Exp $
  */
 
 /*
@@ -234,8 +234,8 @@ atm_input(ifp, ah, m, rxhand)
        struct mbuf *m;
        void *rxhand;
 {
-       struct ifqueue *inq;
        u_int16_t etype = ETHERTYPE_IP; /* default */
+       int isr;
        int s;
 
        if ((ifp->if_flags & IFF_UP) == 0) {
@@ -250,8 +250,7 @@ atm_input(ifp, ah, m, rxhand)
                s = splimp();           /* in case 2 atm cards @ diff lvls */
                npcb->npcb_inq++;       /* count # in queue */
                splx(s);
-               schednetisr(NETISR_NATM);
-               inq = &natmintrq;
+               isr = NETISR_NATM;
                m->m_pkthdr.rcvif = rxhand; /* XXX: overload */
 #else
                printf("atm_input: NATM detected but not configured in kernel\n");
@@ -286,14 +285,12 @@ atm_input(ifp, ah, m, rxhand)
                switch (etype) {
 #ifdef INET
                case ETHERTYPE_IP:
-                       schednetisr(NETISR_IP);
-                       inq = &ipintrq;
+                       isr = NETISR_IP;
                        break;
 #endif
 #ifdef INET6
                case ETHERTYPE_IPV6:
-                       schednetisr(NETISR_IPV6);
-                       inq = &ip6intrq;
+                       isr = NETISR_IPV6;
                        break;
 #endif
                default:
@@ -302,13 +299,7 @@ atm_input(ifp, ah, m, rxhand)
                }
        }
 
-       s = splimp();
-       if (IF_QFULL(inq)) {
-               IF_DROP(inq);
-               m_freem(m);
-       } else
-               IF_ENQUEUE(inq, m);
-       splx(s);
+       netisr_dipatch(isr, m);
 }
 
 /*
index bc64c4a..2dfc23e 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.6 2003/08/07 21:54:30 dillon Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.7 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include "opt_atalk.h"
@@ -272,9 +272,7 @@ ether_output(ifp, m, dst, rt0)
                 */
                if (!bcmp((caddr_t)edst, (caddr_t)&ns_thishost, sizeof(edst))){
                        m->m_pkthdr.rcvif = ifp;
-                       inq = &nsintrq;
-                       if (IF_HANDOFF(inq, m, NULL))
-                               schednetisr(NETISR_NS);
+                       netisr_dispatch(NETISR_NS, m);
                        return (error);
                }
                if (!bcmp((caddr_t)edst, (caddr_t)&ns_broadhost, sizeof(edst))){
@@ -639,7 +637,7 @@ ether_demux(ifp, eh, m)
        struct ether_header *eh;
        struct mbuf *m;
 {
-       struct ifqueue *inq;
+       int isr;
        u_short ether_type;
 #if defined(NETATALK)
        struct llc *l;
@@ -701,8 +699,7 @@ post_stats:
        case ETHERTYPE_IP:
                if (ipflow_fastforward(m))
                        return;
-               schednetisr(NETISR_IP);
-               inq = &ipintrq;
+               isr = NETISR_IP;
                break;
 
        case ETHERTYPE_ARP:
@@ -711,40 +708,34 @@ post_stats:
                        m_freem(m);
                        return;
                }
-               schednetisr(NETISR_ARP);
-               inq = &arpintrq;
+               isr = NETISR_ARP;
                break;
 #endif
 #ifdef IPX
        case ETHERTYPE_IPX:
                if (ef_inputp && ef_inputp(ifp, eh, m) == 0)
                        return;
-               schednetisr(NETISR_IPX);
-               inq = &ipxintrq;
+               isr = NETISR_IPX;
                break;
 #endif
 #ifdef INET6
        case ETHERTYPE_IPV6:
-               schednetisr(NETISR_IPV6);
-               inq = &ip6intrq;
+               isr = NETISR_IPV6;
                break;
 #endif
 #ifdef NS
        case 0x8137: /* Novell Ethernet_II Ethernet TYPE II */
-               schednetisr(NETISR_NS);
-               inq = &nsintrq;
+               isr = NETISR_NS;
                break;
 
 #endif /* NS */
 #ifdef NETATALK
         case ETHERTYPE_AT:
-                schednetisr(NETISR_ATALK);
-                inq = &atintrq1;
+               isr = NETISR_ATALK1;
                 break;
         case ETHERTYPE_AARP:
-               /* probably this should be done with a NETISR as well */
-                aarpinput(IFP2AC(ifp), m); /* XXX */
-                return;
+               isr = NETISR_AARP;
+                break;
 #endif /* NETATALK */
        case ETHERTYPE_VLAN:
                /* XXX lock ? */
@@ -765,67 +756,47 @@ post_stats:
                checksum = mtod(m, ushort *);
                /* Novell 802.3 */
                if ((ether_type <= ETHERMTU) &&
-                       ((*checksum == 0xffff) || (*checksum == 0xE0E0))){
-                       if(*checksum == 0xE0E0) {
+                   ((*checksum == 0xffff) || (*checksum == 0xE0E0))) {
+                       if (*checksum == 0xE0E0) {
                                m->m_pkthdr.len -= 3;
                                m->m_len -= 3;
                                m->m_data += 3;
                        }
-                               schednetisr(NETISR_NS);
-                               inq = &nsintrq;
-                               break;
+                       isr = NETISR_NS;
+                       break;
                }
 #endif /* NS */
-#if defined(NETATALK)
+#ifdef NETATALK
                if (ether_type > ETHERMTU)
                        goto dropanyway;
                l = mtod(m, struct llc *);
-               switch (l->llc_dsap) {
-               case LLC_SNAP_LSAP:
-                   switch (l->llc_control) {
-                   case LLC_UI:
-                       if (l->llc_ssap != LLC_SNAP_LSAP)
-                           goto dropanyway;
-       
-                       if (Bcmp(&(l->llc_snap_org_code)[0], at_org_code,
-                                  sizeof(at_org_code)) == 0 &&
-                            ntohs(l->llc_snap_ether_type) == ETHERTYPE_AT) {
-                           inq = &atintrq2;
-                           m_adj( m, sizeof( struct llc ));
-                           schednetisr(NETISR_ATALK);
-                           break;
+               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 ));
-                           aarpinput(IFP2AC(ifp), m); /* XXX */
-                           return;
+                           sizeof(aarp_org_code)) == 0 &&
+                           ntohs(l->llc_snap_ether_type) == ETHERTYPE_AARP) {
+                               m_adj(m, sizeof(struct llc));
+                               isr = NETISR_AARP;
+                               break;
                        }
-               
-                   default:
-                       goto dropanyway;
-                   }
-                   break;
-               dropanyway:
-               default:
-                       if (ng_ether_input_orphan_p != NULL)
-                               (*ng_ether_input_orphan_p)(ifp, m, eh);
-                       else
-                               m_freem(m);
-                       return;
                }
-#else /* NETATALK */
+dropanyway:
+#endif /* NETATALK */
                if (ng_ether_input_orphan_p != NULL)
                        (*ng_ether_input_orphan_p)(ifp, m, eh);
                else
                        m_freem(m);
                return;
-#endif /* NETATALK */
        }
-
-       (void) IF_HANDOFF(inq, m, NULL);
+       netisr_dispatch(isr, m);
 }
 
 /*
index 5eac7b1..1dd32c1 100644 (file)
@@ -34,7 +34,7 @@
  *
  *     from: if_ethersubr.c,v 1.5 1994/12/13 22:31:45 wollman Exp
  * $FreeBSD: src/sys/net/if_fddisubr.c,v 1.41.2.8 2002/02/20 23:34:09 fjoe Exp $
- * $DragonFly: src/sys/net/Attic/if_fddisubr.c,v 1.5 2003/08/26 20:49:47 rob Exp $
+ * $DragonFly: src/sys/net/Attic/if_fddisubr.c,v 1.6 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include "opt_atalk.h"
@@ -367,6 +367,7 @@ fddi_output(ifp, m, dst, rt0)
        if ((ifp->if_flags & IFF_OACTIVE) == 0)
                (*ifp->if_start)(ifp);
        splx(s);
+
        return (error);
 
 bad:
@@ -386,9 +387,8 @@ fddi_input(ifp, fh, m)
        struct fddi_header *fh;
        struct mbuf *m;
 {
-       struct ifqueue *inq;
+       int isr;
        struct llc *l;
-       int s;
 
        if ((ifp->if_flags & IFF_UP) == 0) {
                m_freem(m);
@@ -403,8 +403,8 @@ fddi_input(ifp, fh, m)
                else
                        m->m_flags |= M_MCAST;
                ifp->if_imcasts++;
-       } else if ((ifp->if_flags & IFF_PROMISC)
-           && bcmp(((struct arpcom *)ifp)->ac_enaddr, (caddr_t)fh->fddi_dhost,
+       } else if ((ifp->if_flags & IFF_PROMISC) &&
+           bcmp(((struct arpcom *)ifp)->ac_enaddr, (caddr_t)fh->fddi_dhost,
                    sizeof(fh->fddi_dhost)) != 0) {
                m_freem(m);
                return;
@@ -431,19 +431,19 @@ fddi_input(ifp, fh, m)
 #ifdef NETATALK
                if (Bcmp(&(l->llc_snap_org_code)[0], at_org_code,
                         sizeof(at_org_code)) == 0 &&
-                       ntohs(l->llc_snap_ether_type) == ETHERTYPE_AT) {
-                   inq = &atintrq2;
-                   m_adj( m, sizeof( struct llc ));
-                   schednetisr(NETISR_ATALK);
-                   break;
+                   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 ));
-                   aarpinput((struct arpcom *)ifp, m); /* XXX */
-                   return;
+                   isr = NETISR_AARP;
+                   break;
                }
 #endif /* NETATALK */
                if (l->llc_snap.org_code[0] != 0 || l->llc_snap.org_code[1] != 0|| l->llc_snap.org_code[2] != 0)
@@ -455,50 +455,42 @@ fddi_input(ifp, fh, m)
                case ETHERTYPE_IP:
                        if (ipflow_fastforward(m))
                                return;
-                       schednetisr(NETISR_IP);
-                       inq = &ipintrq;
+                       isr = NETISR_IP;
                        break;
 
                case ETHERTYPE_ARP:
                        if (ifp->if_flags & IFF_NOARP)
                                goto dropanyway;
-                       schednetisr(NETISR_ARP);
-                       inq = &arpintrq;
+                       isr = NETISR_ARP;
                        break;
 #endif
 #ifdef INET6
                case ETHERTYPE_IPV6:
-                       schednetisr(NETISR_IPV6);
-                       inq = &ip6intrq;
+                       isr = NETISR_IPV6;
                        break;
 #endif
 #ifdef IPX      
                case ETHERTYPE_IPX: 
-                       schednetisr(NETISR_IPX);
-                       inq = &ipxintrq;
+                       isr = NETISR_IPX;
                        break;  
 #endif   
 #ifdef NS
                case ETHERTYPE_NS:
-                       schednetisr(NETISR_NS);
-                       inq = &nsintrq;
+                       isr = NETISR_NS;
                        break;
 #endif
 #ifdef DECNET
                case ETHERTYPE_DECNET:
-                       schednetisr(NETISR_DECNET);
-                       inq = &decnetintrq;
+                       isr = NETISR_DECNET;
                        break;
 #endif
 #ifdef NETATALK 
                case ETHERTYPE_AT:
-                       schednetisr(NETISR_ATALK);
-                       inq = &atintrq1;
+                       isr = NETISR_ATALK1;
                        break;
                case ETHERTYPE_AARP:
-                       /* probably this should be done with a NETISR as well */
-                       aarpinput((struct arpcom *)ifp, m); /* XXX */
-                       return;
+                       isr = NETISR_AARP;
+                       break;
 #endif /* NETATALK */
                default:
                        /* printf("fddi_input: unknown protocol 0x%x\n", type); */
@@ -517,14 +509,9 @@ fddi_input(ifp, fh, m)
                return;
        }
 
-       s = splimp();
-       if (IF_QFULL(inq)) {
-               IF_DROP(inq);
-               m_freem(m);
-       } else
-               IF_ENQUEUE(inq, m);
-       splx(s);
+       netisr_dispatch(isr, m);
 }
+
 /*
  * Perform common duties while attaching to interface list
  */
index 4b674f7..32b5501 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_iso88025subr.c,v 1.7.2.7 2002/06/18 00:15:31 kbyanc Exp $
- * $DragonFly: src/sys/net/Attic/if_iso88025subr.c,v 1.4 2003/08/07 21:17:24 dillon Exp $
+ * $DragonFly: src/sys/net/Attic/if_iso88025subr.c,v 1.5 2003/09/15 23:38:13 hsu Exp $
  *
  */
 
@@ -331,9 +331,8 @@ bad:
 void
 iso88025_input(struct ifnet *ifp, struct iso88025_header *th, struct mbuf *m)
 {
-       struct ifqueue *inq;
        u_short ether_type;
-       int s;
+       int isr;
        struct llc *l = mtod(m, struct llc *);
 
        if ((ifp->if_flags & IFF_UP) == 0) {
@@ -404,8 +403,7 @@ iso88025_input(struct ifnet *ifp, struct iso88025_header *th, struct mbuf *m)
                th->iso88025_shost[0] &= ~(TR_RII); 
                if (ipflow_fastforward(m))
                        return;
-               schednetisr(NETISR_IP);
-               inq = &ipintrq;
+               isr = NETISR_IP;
                break;
 
        case ETHERTYPE_ARP:
@@ -413,8 +411,7 @@ iso88025_input(struct ifnet *ifp, struct iso88025_header *th, struct mbuf *m)
                        m_freem(m);
                        return;
                }
-               schednetisr(NETISR_ARP);
-               inq = &arpintrq;
+               isr = NETISR_ARP;
                 break;
 #endif
        default:
@@ -422,12 +419,5 @@ iso88025_input(struct ifnet *ifp, struct iso88025_header *th, struct mbuf *m)
            return;
        }
 
-       s = splimp();
-       if (IF_QFULL(inq)) {
-               IF_DROP(inq);
-               m_freem(m);
-                printf("iso88025_input: Packet dropped (Queue full).\n");
-       } else
-               IF_ENQUEUE(inq, m);
-       splx(s);
+       netisr_dispatch(isr, m);
 }
index ebfc55c..8f311e0 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_loop.c   8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_loop.c,v 1.47.2.8 2003/06/01 01:46:11 silby Exp $
- * $DragonFly: src/sys/net/if_loop.c,v 1.6 2003/08/26 20:49:47 rob Exp $
+ * $DragonFly: src/sys/net/if_loop.c,v 1.7 2003/09/15 23:38:13 hsu Exp $
  */
 
 /*
@@ -203,8 +203,7 @@ if_simloop(ifp, m, af, hlen)
        int af;
        int hlen;
 {
-       int s, isr;
-       struct ifqueue *ifq = 0;
+       int isr;
 
        KASSERT((m->m_flags & M_PKTHDR) != 0, ("if_simloop: no HDR"));
        m->m_pkthdr.rcvif = ifp;
@@ -259,33 +258,28 @@ if_simloop(ifp, m, af, hlen)
        switch (af) {
 #ifdef INET
        case AF_INET:
-               ifq = &ipintrq;
                isr = NETISR_IP;
                break;
 #endif
 #ifdef INET6
        case AF_INET6:
                m->m_flags |= M_LOOP;
-               ifq = &ip6intrq;
                isr = NETISR_IPV6;
                break;
 #endif
 #ifdef IPX
        case AF_IPX:
-               ifq = &ipxintrq;
                isr = NETISR_IPX;
                break;
 #endif
 #ifdef NS
        case AF_NS:
-               ifq = &nsintrq;
                isr = NETISR_NS;
                break;
 #endif
 #ifdef NETATALK
        case AF_APPLETALK:
-               ifq = &atintrq2;
-               isr = NETISR_ATALK;
+               isr = NETISR_ATALK2;
                break;
 #endif NETATALK
        default:
@@ -293,18 +287,10 @@ if_simloop(ifp, m, af, hlen)
                m_freem(m);
                return (EAFNOSUPPORT);
        }
-       s = splimp();
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-               splx(s);
-               return (ENOBUFS);
-       }
-       IF_ENQUEUE(ifq, m);
-       schednetisr(isr);
+
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
-       splx(s);
+       netisr_queue(isr, m);
        return (0);
 }
 
index 6768438..f4048b4 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.3 2003/06/25 03:56:02 dillon Exp $
+ * $DragonFly: src/sys/net/if_var.h,v 1.4 2003/09/15 23:38:13 hsu Exp $
  */
 
 #ifndef        _NET_IF_VAR_H_
@@ -256,6 +256,15 @@ typedef void if_init_f_t (void *);
                (ifq)->ifq_len--; \
        } \
 }
+#define IF_DRAIN(ifq) do {                                             \
+       struct mbuf *m;                                                 \
+       while (1) {                                                     \
+               IF_DEQUEUE(ifq, m);                                     \
+               if (m == NULL)                                          \
+                       break;                                          \
+               m_freem(m);                                             \
+       }                                                               \
+} while (0)
 
 #ifdef _KERNEL
 
index 2ddb6b1..1083c22 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/intrq.c,v 1.3 2000/01/29 16:13:08 peter Exp $
- * $DragonFly: src/sys/net/Attic/intrq.c,v 1.3 2003/08/07 21:17:24 dillon Exp $
+ * $DragonFly: src/sys/net/Attic/intrq.c,v 1.4 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -84,7 +84,7 @@ static const struct {
        { AF_INET6, &ip6intrq, &ip6intrq_present, NETISR_IPV6 },
        { AF_IPX, &ipxintrq, &ipxintrq_present, NETISR_IPX },
        { AF_NATM, &natmintrq, &natmintrq_present, NETISR_NATM },
-       { AF_APPLETALK, &atintrq2, &atintrq2_present, NETISR_ATALK },
+       { AF_APPLETALK, &atintrq2, &atintrq2_present, NETISR_ATALK2 },
        { AF_NS, &nsintrq, &nsintrq_present, NETISR_NS }
 };
 
index 6661fc1..178b74c 100644 (file)
@@ -18,7 +18,7 @@
  * bandwidth metering and signaling
  *
  * $FreeBSD: src/sys/netinet/ip_mroute.c,v 1.56.2.10 2003/08/24 21:37:34 hsu Exp $
- * $DragonFly: src/sys/net/ip_mroute/ip_mroute.c,v 1.4 2003/08/24 23:07:07 hsu Exp $
+ * $DragonFly: src/sys/net/ip_mroute/ip_mroute.c,v 1.5 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include "opt_mrouting.h"
@@ -41,6 +41,7 @@
 #include <sys/systm.h>
 #include <sys/time.h>
 #include <net/if.h>
+#include <net/netisr.h>
 #include <net/route.h>
 #include <netinet/in.h>
 #include <netinet/igmp.h>
@@ -1708,8 +1709,6 @@ X_ipip_input(struct mbuf *m, int off, int proto)
 {
     struct ip *ip = mtod(m, struct ip *);
     int hlen = ip->ip_hl << 2;
-    int s;
-    struct ifqueue *ifq;
 
     if (!have_encap_tunnel) {
        rip_input(m, off, proto);
@@ -1758,22 +1757,7 @@ X_ipip_input(struct mbuf *m, int off, int proto)
     m->m_pkthdr.len -= sizeof(struct ip);
     m->m_pkthdr.rcvif = last_encap_vif->v_ifp;
 
-    ifq = &ipintrq;
-    s = splimp();
-    if (IF_QFULL(ifq)) {
-       IF_DROP(ifq);
-       m_freem(m);
-    } else {
-       IF_ENQUEUE(ifq, m);
-       /*
-        * normally we would need a "schednetisr(NETISR_IP)"
-        * here but we were called by ip_input and it is going
-        * to loop back & try to dequeue the packet we just
-        * queued as soon as we return so we avoid the
-        * unnecessary software interrrupt.
-        */
-    }
-    splx(s);
+    netisr_queue(NETISR_IP, m);
 }
 
 /*
index a992e52..ad3282e 100644 (file)
 /*-
+ * Copyright (c) 2003 Jeffrey Hsu
+ * Copyright (c) 2003 Jonathan Lemon
  * Copyright (c) 2003 Matthew Dillon
  *
- * $DragonFly: src/sys/net/netisr.c,v 1.1 2003/06/29 03:28:45 dillon Exp $
+ * $DragonFly: src/sys/net/netisr.c,v 1.2 2003/09/15 23:38:13 hsu Exp $
  */
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
 #include <sys/interrupt.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+#include <net/if.h>
+#include <net/if_var.h>
 #include <net/netisr.h>
 #include <machine/cpufunc.h>
 #include <machine/ipl.h>
 
-static int isrmask;
+int isrmask;
 static int isrsoftint_installed;
-static netisr_t *netisrs[NETISR_MAX];
+static struct netisr netisrs[NETISR_MAX];
+
+/* SYSCTL_NODE(_net, OID_AUTO, isr, CTLFLAG_RW, 0, "netisr counters"); */
+
+static int netisr_directdispatch = 0;
+/*
+SYSCTL_INT(_net_isr, OID_AUTO, directdispatch, CTLFLAG_RW,
+    &netisr_directdispatch, 0, "enable direct dispatch");
+*/
 
 static void
 swi_net(void *arg)
 {
     int mask;
     int bit;
-    netisr_t *func;
        
     while ((mask = isrmask) != 0) {
        bit = bsfl(mask);
        if (btrl(&isrmask, bit)) {
-           if ((func = netisrs[bit]) != NULL)
-               func();
+           struct netisr *ni = &netisrs[bit];
+           netisr_fn_t func = ni->ni_handler;
+
+           if (ni->ni_queue) {
+               while (1) {
+                   struct mbuf *m;
+                   int s;
+
+                   s = splimp();
+                   IF_DEQUEUE(ni->ni_queue, m);
+                   splx(s);
+                   if (!m)
+                       break;
+                   func(m);
+               }
+           } else
+               func(NULL);
        }
     }
 }
 
+/*
+ * Call the netisr directly instead of queueing the packet, if possible.
+ */
+void
+netisr_dispatch(int num, struct mbuf *m)
+{
+    struct netisr *ni;
+
+    KASSERT((num > 0 && num <= (sizeof(netisrs)/sizeof(netisrs[0]))),
+       ("bad isr %d", num));
+
+    ni = &netisrs[num];
+
+    if (!ni->ni_queue) {
+       m_freem(m);
+       return;
+    }
+
+    if (netisr_directdispatch) {
+      /*
+       * missing check for concurrent execution from swi_net() XXX JH
+       * Address this after conversion to message ports.
+       */
+       ni->ni_handler(m);
+    } else {
+       if (IF_HANDOFF(ni->ni_queue, m, NULL))
+           schednetisr(num);
+    }
+}
+
+/*
+ * Same as netisr_dispatch(), but always queue.
+ * This is either used in places where we are not confident that
+ * direct dispatch is possible, or where queueing is required.
+ */
 int
-register_netisr(int num, netisr_t *handler)
+netisr_queue(int num, struct mbuf *m)
 {
-    if (num < 0 || num >= (sizeof(netisrs)/sizeof(*netisrs)) ) {
-       printf("register_netisr: bad isr number: %d\n", num);
-       return (EINVAL);
+    struct netisr *ni;
+
+    KASSERT((num > 0 && num <= (sizeof(netisrs)/sizeof(netisrs[0]))),
+       ("bad isr %d", num));
+
+    ni = &netisrs[num];
+
+    if (!ni->ni_queue) {
+       m_freem(m);
+       return (ENOBUFS);
     }
+
+    if (!IF_HANDOFF(ni->ni_queue, m, NULL))
+       return (ENOBUFS);
+
+    schednetisr(num);
+    return (0);
+}
+
+int
+netisr_register(int num, netisr_fn_t handler, struct ifqueue *ifq)
+{
+    KASSERT((num > 0 && num <= (sizeof(netisrs)/sizeof(netisrs[0]))),
+       ("bad isr %d", num));
+
     if (isrsoftint_installed == 0) {
        isrsoftint_installed = 1;
        register_swi(SWI_NET, swi_net, NULL, "swi_net");
     }
-    netisrs[num] = handler;
+    netisrs[num].ni_handler = handler;
+    netisrs[num].ni_queue = ifq;
     return (0);
 }
 
 int
-unregister_netisr(int num)
+netisr_unregister(int num)
 {
-    if (num < 0 || num >= (sizeof(netisrs)/sizeof(*netisrs)) ) {
-       printf("unregister_netisr: bad isr number: %d\n", num);
-       return (EINVAL);
+    KASSERT((num > 0 && num <= (sizeof(netisrs)/sizeof(netisrs[0]))),
+       ("unregister_netisr: bad isr number: %d\n", num));
+
+    if (netisrs[num].ni_queue != NULL) {
+       int s;
+
+       s = splimp();
+       IF_DRAIN(netisrs[num].ni_queue);
+       splx(s);
     }
-    netisrs[num] = NULL;
+    netisrs[num].ni_handler = NULL;
     return (0);
 }
-
-void
-schednetisr(int isrnum) 
-{
-    atomic_set_int(&isrmask, 1 << isrnum);
-    setsoftnet();
-}
-
index 2e69a7c..9d9b04d 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)netisr.h    8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/netisr.h,v 1.21.2.5 2002/02/09 23:02:39 luigi Exp $
- * $DragonFly: src/sys/net/netisr.h,v 1.4 2003/08/26 20:49:47 rob Exp $
+ * $DragonFly: src/sys/net/netisr.h,v 1.5 2003/09/15 23:38:13 hsu Exp $
  */
 
 #ifndef _NET_NETISR_H_
 #define        NETISR_POLL     0               /* polling callback */
 #define        NETISR_IP       2               /* same as AF_INET */
 #define        NETISR_NS       6               /* same as AF_NS */
-#define        NETISR_ATALK    16              /* same as AF_APPLETALK */
+#define        NETISR_AARP     15              /* Appletalk ARP */
+#define        NETISR_ATALK2   16              /* Appletalk phase 2 */
+#define        NETISR_ATALK1   17              /* Appletalk phase 1 */
 #define        NETISR_ARP      18              /* same as AF_LINK */
 #define        NETISR_IPX      23              /* same as AF_IPX */
-#define NETISR_USB     25              /* USB soft interrupt */
+#define        NETISR_USB      25              /* USB soft interrupt */
 #define        NETISR_PPP      27              /* PPP soft interrupt */
 #define        NETISR_IPV6     28              /* same as AF_INET6 */
 #define        NETISR_NATM     29              /* same as AF_NATM */
 #define        NETISR_NETGRAPH 30              /* same as AF_NETGRAPH */
 #define        NETISR_POLLMORE 31              /* check if we need more polling */
 
-#define NETISR_MAX     32
+#define        NETISR_MAX      32
 
 
 #ifndef LOCORE
 #ifdef _KERNEL
+extern int isrmask;
 
-typedef void netisr_t (void);
+static __inline void
+schednetisr(int isrnum) 
+{
+    atomic_set_int(&isrmask, 1 << isrnum);
+    setsoftnet();
+}
 
-int register_netisr (int, netisr_t *);
-int unregister_netisr (int);
-void schednetisr(int isrnum);
+struct mbuf;
+struct ifqueue;
 
+typedef void (*netisr_fn_t)(struct mbuf *);
+
+/*
+ * This structure will change to use message ports instead of struct ifqueue.
+ * XXX JH
+ */
+struct netisr {
+       netisr_fn_t     ni_handler;
+       struct ifqueue  *ni_queue;
+};
+
+void   netisr_dispatch(int, struct mbuf *);
+int    netisr_queue(int, struct mbuf *);
+int    netisr_register(int, netisr_fn_t, struct ifqueue *);
+int    netisr_unregister(int);
 
 #endif
 #endif
index e0c3061..1a80da1 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.8 2003/08/26 20:49:48 rob Exp $ */
+/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.9 2003/09/15 23:38:13 hsu 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 */
 
 #include <net/netisr.h>
 #include <net/bpf.h>
 
-#if INET
+#ifdef INET
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
 #endif
 
-#if IPX
+#ifdef IPX
 #include <netproto/ipx/ipx.h>
 #include <netproto/ipx/ipx_if.h>
 #endif
@@ -139,7 +139,7 @@ static void pppattach (void *);
 PSEUDO_SET(pppattach, if_ppp);
 
 static int     pppsioctl (struct ifnet *ifp, u_long cmd, caddr_t data);
-static void    pppintr (void);
+static void    pppintr (struct mbuf *m);
 
 static void    ppp_requeue (struct ppp_softc *);
 static void    ppp_ccp (struct ppp_softc *, struct mbuf *m, int rcvd);
@@ -215,7 +215,7 @@ pppattach(dummy)
        if_attach(&sc->sc_if);
        bpfattach(&sc->sc_if, DLT_PPP, PPP_HDRLEN);
     }
-    register_netisr(NETISR_PPP, pppintr);
+    netisr_register(NETISR_PPP, pppintr, NULL);
     /*
      * XXX layering violation - if_ppp can work over any lower level
      * transport that cares to attach to it.
@@ -1058,11 +1058,10 @@ ppp_dequeue(sc)
  * Software interrupt routine, called at spl[soft]net.
  */
 static void
-pppintr()
+pppintr(struct mbuf *m)
 {
     struct ppp_softc *sc;
     int i, s;
-    struct mbuf *m;
 
     sc = ppp_softc;
     for (i = 0; i < NPPP; ++i, ++sc) {
@@ -1236,7 +1235,7 @@ ppp_inproc(sc, m)
     struct mbuf *m;
 {
     struct ifnet *ifp = &sc->sc_if;
-    struct ifqueue *inq;
+    int isr;
     int s, ilen = 0, xlen, proto, rv;
     u_char *cp, adrs, ctrl;
     struct mbuf *mp, *dmp = NULL;
@@ -1452,7 +1451,7 @@ ppp_inproc(sc, m)
     if (sc->sc_if.if_bpf)
        bpf_mtap(&sc->sc_if, m);
 
-    rv = 0;
+    isr = -1;
     switch (proto) {
 #ifdef INET
     case PPP_IP:
@@ -1470,8 +1469,7 @@ ppp_inproc(sc, m)
        m->m_len -= PPP_HDRLEN;
        if (ipflow_fastforward(m))
            return;
-       schednetisr(NETISR_IP);
-       inq = &ipintrq;
+       isr = NETISR_IP;
        break;
 #endif
 #ifdef IPX
@@ -1488,8 +1486,7 @@ ppp_inproc(sc, m)
        m->m_pkthdr.len -= PPP_HDRLEN;
        m->m_data += PPP_HDRLEN;
        m->m_len -= PPP_HDRLEN;
-       schednetisr(NETISR_IPX);
-       inq = &ipxintrq;
+       isr = NETISR_IPX;
        sc->sc_last_recv = time_second; /* update time of last pkt rcvd */
        break;
 #endif
@@ -1498,25 +1495,20 @@ ppp_inproc(sc, m)
        /*
         * Some other protocol - place on input queue for read().
         */
-       inq = &sc->sc_inq;
-       rv = 1;
        break;
     }
 
-    /*
-     * Put the packet on the appropriate input queue.
-     */
-    s = splimp();
-    if (IF_QFULL(inq)) {
-       IF_DROP(inq);
-       splx(s);
+    if (isr == -1)
+       rv = IF_HANDOFF(&sc->sc_inq, m, NULL);
+    else
+       rv = (netisr_queue(isr, m) == 0);
+    if (!rv) {
        if (sc->sc_flags & SC_DEBUG)
            printf("ppp%d: input queue full\n", ifp->if_unit);
        ifp->if_iqdrops++;
        goto bad;
     }
-    IF_ENQUEUE(inq, m);
-    splx(s);
+
     ifp->if_ipackets++;
     ifp->if_ibytes += ilen;
     getmicrotime(&ifp->if_lastchange);
index c9f5705..310c59b 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_sl.c     8.6 (Berkeley) 2/1/94
  * $FreeBSD: src/sys/net/if_sl.c,v 1.84.2.2 2002/02/13 00:43:10 dillon Exp $
- * $DragonFly: src/sys/net/sl/if_sl.c,v 1.8 2003/08/26 20:49:49 rob Exp $
+ * $DragonFly: src/sys/net/sl/if_sl.c,v 1.9 2003/09/15 23:38:14 hsu Exp $
  */
 
 /*
@@ -771,7 +771,6 @@ slinput(c, tp)
        struct sl_softc *sc;
        struct mbuf *m;
        int len;
-       int s;
        u_char chdr[CHDR_LEN];
 
        tk_nin++;
@@ -902,17 +901,11 @@ slinput(c, tp)
                        goto newpack;
                }
 
-               s = splimp();
-               if (IF_QFULL(&ipintrq)) {
-                       IF_DROP(&ipintrq);
+               if (netisr_queue(NETISR_IP, m)) {
                        sc->sc_if.if_ierrors++;
                        sc->sc_if.if_iqdrops++;
-                       m_freem(m);
-               } else {
-                       IF_ENQUEUE(&ipintrq, m);
-                       schednetisr(NETISR_IP);
                }
-               splx(s);
+
                goto newpack;
        }
        if (sc->sc_mp < sc->sc_ep) {
index 6e8e19d..349c765 100644 (file)
@@ -18,7 +18,7 @@
  * From: Version 2.4, Thu Apr 30 17:17:21 MSD 1997
  *
  * $FreeBSD: src/sys/net/if_spppsubr.c,v 1.59.2.13 2002/07/03 15:44:41 joerg Exp $
- * $DragonFly: src/sys/net/sppp/if_spppsubr.c,v 1.4 2003/08/07 21:54:32 dillon Exp $
+ * $DragonFly: src/sys/net/sppp/if_spppsubr.c,v 1.5 2003/09/15 23:38:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -509,8 +509,7 @@ void
 sppp_input(struct ifnet *ifp, struct mbuf *m)
 {
        struct ppp_header *h;
-       struct ifqueue *inq = 0;
-       int s;
+       int isr = -1;
        struct sppp *sp = (struct sppp *)ifp;
        u_char *iphdr;
        int hlen, vjlen, do_account = 0;
@@ -587,8 +586,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                        return;
                case PPP_IP:
                        if (sp->state[IDX_IPCP] == STATE_OPENED) {
-                               schednetisr (NETISR_IP);
-                               inq = &ipintrq;
+                               isr = NETISR_IP;
                        }
                        do_account++;
                        break;
@@ -619,8 +617,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                                        goto drop2;
                                bcopy(iphdr, mtod(m, u_char *), hlen);
 
-                               schednetisr (NETISR_IP);
-                               inq = &ipintrq;
+                               isr = NETISR_IP;
                        }
                        do_account++;
                        break;
@@ -637,8 +634,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                                                    SPP_ARGS(ifp));
                                        goto drop;
                                }
-                               schednetisr (NETISR_IP);
-                               inq = &ipintrq;
+                               isr = NETISR_IP;
                        }
                        do_account++;
                        break;
@@ -652,8 +648,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
 
                case PPP_IPV6:
                        if (sp->state[IDX_IPV6CP] == STATE_OPENED) {
-                               schednetisr (NETISR_IPV6);
-                               inq = &ip6intrq;
+                               isr = NETISR_IPV6;
                        }
                        do_account++;
                        break;
@@ -662,8 +657,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                case PPP_IPX:
                        /* IPX IPXCP not implemented yet */
                        if (sp->pp_phase == PHASE_NETWORK) {
-                               schednetisr (NETISR_IPX);
-                               inq = &ipxintrq;
+                               isr = NETISR_IPX;
                        }
                        do_account++;
                        break;
@@ -672,8 +666,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                case PPP_XNS:
                        /* XNS IDPCP not implemented yet */
                        if (sp->pp_phase == PHASE_NETWORK) {
-                               schednetisr (NETISR_NS);
-                               inq = &nsintrq;
+                               isr = NETISR_NS;
                        }
                        do_account++;
                        break;
@@ -702,29 +695,25 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                        return;
 #ifdef INET
                case ETHERTYPE_IP:
-                       schednetisr (NETISR_IP);
-                       inq = &ipintrq;
+                       isr = NETISR_IP;
                        do_account++;
                        break;
 #endif
 #ifdef INET6
                case ETHERTYPE_IPV6:
-                       schednetisr (NETISR_IPV6);
-                       inq = &ip6intrq;
+                       isr = NETISR_IPV6;
                        do_account++;
                        break;
 #endif
 #ifdef IPX
                case ETHERTYPE_IPX:
-                       schednetisr (NETISR_IPX);
-                       inq = &ipxintrq;
+                       isr = NETISR_IPX;
                        do_account++;
                        break;
 #endif
 #ifdef NS
                case ETHERTYPE_NS:
-                       schednetisr (NETISR_NS);
-                       inq = &nsintrq;
+                       isr = NETISR_NS
                        do_account++;
                        break;
 #endif
@@ -741,22 +730,12 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
                goto drop;
        }
 
-       if (! (ifp->if_flags & IFF_UP) || ! inq)
+       if (! (ifp->if_flags & IFF_UP) || isr < 0)
                goto drop;
 
        /* Check queue. */
-       s = splimp();
-       if (IF_QFULL (inq)) {
-               /* Queue overflow. */
-               IF_DROP(inq);
-               splx(s);
-               if (debug)
-                       log(LOG_DEBUG, SPP_FMT "protocol queue overflow\n",
-                               SPP_ARGS(ifp));
-               goto drop;
-       }
-       IF_ENQUEUE(inq, m);
-       splx(s);
+
+       netisr_dispatch(isr, m);
        if (do_account)
                /*
                 * Do only account for network packets, not for control
index 891e6ac..28e36de 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/modules/if_tun/Makefile,v 1.19.2.1 2001/07/24 09:49:42 dd Exp $
-# $DragonFly: src/sys/net/tun/Makefile,v 1.2 2003/06/17 04:28:44 dillon Exp $
+# $DragonFly: src/sys/net/tun/Makefile,v 1.3 2003/09/15 23:38:14 hsu Exp $
 
 .PATH:  ${.CURDIR}/../../net
 KMOD=   if_tun
@@ -13,5 +13,8 @@ CFLAGS+= ${PROTOS}
 
 opt_inet.h:
        echo "#define INET 1" > opt_inet.h
+       echo "#define INET6 1" > opt_inet6.h
+       echo "#define NETATALK 1" > opt_atalk.h
+       echo "#define IPX 1" > opt_ipx.h
 
 .include <bsd.kmod.mk>
index 338bcde..915c733 100644 (file)
  * operation though.
  *
  * $FreeBSD: src/sys/net/if_tun.c,v 1.74.2.8 2002/02/13 00:43:11 dillon Exp $
- * $DragonFly: src/sys/net/tun/if_tun.c,v 1.9 2003/08/26 20:49:49 rob Exp $
+ * $DragonFly: src/sys/net/tun/if_tun.c,v 1.10 2003/09/15 23:38:14 hsu Exp $
  */
 
+#include "opt_atalk.h"
 #include "opt_inet.h"
+#include "opt_inet6.h"
+#include "opt_ipx.h"
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -39,8 +42,8 @@
 
 #include <net/if.h>
 #include <net/if_types.h>
+#include <net/netisr.h>
 #include <net/route.h>
-#include <net/intrq.h>
 
 #ifdef INET
 #include <netinet/in.h>
@@ -587,6 +590,7 @@ tunwrite(dev, uio, flag)
        struct mbuf     *top, **mp, *m;
        int             error=0, tlen, mlen;
        uint32_t        family;
+       int             isr;
 
        TUNDEBUG("%s%d: tunwrite\n", ifp->if_name, ifp->if_unit);
 
@@ -677,7 +681,34 @@ tunwrite(dev, uio, flag)
        ifp->if_ibytes += top->m_pkthdr.len;
        ifp->if_ipackets++;
 
-       return family_enqueue(family, top);
+       switch (family) {
+#ifdef INET
+       case AF_INET:
+               isr = NETISR_IP;
+               break;
+#endif
+#ifdef INET6
+       case AF_INET6:
+               isr = NETISR_IPV6;
+               break;
+#endif
+#ifdef IPX
+       case AF_IPX:
+               isr = NETISR_IPX;
+               break;
+#endif
+#ifdef NETATALK
+       case AF_APPLETALK:
+               isr = NETISR_ATALK2;
+               break;
+#endif
+       default:
+               m_freem(m);
+               return (EAFNOSUPPORT);
+       }
+
+       netisr_dispatch(isr, top);
+       return (0);
 }
 
 /*
index f799a74..2c655ab 100644 (file)
@@ -38,7 +38,7 @@
  *          Archie Cobbs <archie@freebsd.org>
  *
  * $FreeBSD: src/sys/netgraph/ng_base.c,v 1.11.2.17 2002/07/02 23:44:02 archie Exp $
- * $DragonFly: src/sys/netgraph/netgraph/ng_base.c,v 1.6 2003/08/07 21:54:32 dillon Exp $
+ * $DragonFly: src/sys/netgraph/netgraph/ng_base.c,v 1.7 2003/09/15 23:38:14 hsu Exp $
  * $Whistle: ng_base.c,v 1.39 1999/01/28 23:54:53 julian Exp $
  */
 
@@ -1783,7 +1783,7 @@ ngb_mod_event(module_t mod, int event, void *data)
        case MOD_LOAD:
                /* Register line discipline */
                s = splimp();
-               error = register_netisr(NETISR_NETGRAPH, ngintr);
+               error = netisr_register(NETISR_NETGRAPH, ngintr, NULL);
                splx(s);
                break;
        case MOD_UNLOAD:
index d317af6..6c7ae07 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ether.c  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netinet/if_ether.c,v 1.64.2.23 2003/04/11 07:23:15 fjoe Exp $
- * $DragonFly: src/sys/netinet/if_ether.c,v 1.5 2003/08/23 11:18:00 rob Exp $
+ * $DragonFly: src/sys/netinet/if_ether.c,v 1.6 2003/09/15 23:38:14 hsu Exp $
  */
 
 /*
@@ -103,7 +103,7 @@ struct llinfo_arp {
 
 static LIST_HEAD(, llinfo_arp) llinfo_arp;
 
-struct ifqueue arpintrq = {0, 0, 0, 50};
+static struct  ifqueue arpintrq = {0, 0, 0, 50};
 static int     arp_inuse, arp_allocated, arpinit_done;
 
 static int     arp_maxtries = 5;
@@ -120,7 +120,7 @@ SYSCTL_INT(_net_link_ether_inet, OID_AUTO, proxyall, CTLFLAG_RW,
 static void    arp_rtrequest (int, struct rtentry *, struct rt_addrinfo *);
 static void    arprequest (struct ifnet *,
                        struct in_addr *, struct in_addr *, u_char *);
-static void    arpintr (void);
+static void    arpintr(struct mbuf *);
 static void    arptfree (struct llinfo_arp *);
 static void    arptimer (void *);
 static struct llinfo_arp
@@ -493,52 +493,44 @@ arpresolve(ifp, rt, m, dst, desten, rt0)
  * then the protocol-specific routine is called.
  */
 static void
-arpintr()
+arpintr(struct mbuf *m)
 {
-       struct mbuf *m;
        struct arphdr *ar;
-       int s;
-
-       while (arpintrq.ifq_head) {
-               s = splimp();
-               IF_DEQUEUE(&arpintrq, m);
-               splx(s);
-               if (m == 0 || (m->m_flags & M_PKTHDR) == 0)
-                       panic("arpintr");
-       
-                if (m->m_len < sizeof(struct arphdr) &&
-                    ((m = m_pullup(m, sizeof(struct arphdr))) == NULL)) {
-                       log(LOG_ERR, "arp: runt packet -- m_pullup failed\n");
-                       continue;
-               }
-               ar = mtod(m, struct arphdr *);
-
-               if (ntohs(ar->ar_hrd) != ARPHRD_ETHER
-                   && ntohs(ar->ar_hrd) != ARPHRD_IEEE802
-                   && ntohs(ar->ar_hrd) != ARPHRD_ARCNET) {
-                       log(LOG_ERR,
-                           "arp: unknown hardware address format (0x%2D)\n",
-                           (unsigned char *)&ar->ar_hrd, "");
-                       m_freem(m);
-                       continue;
-               }
+       u_short ar_hrd;
 
-               if (m->m_pkthdr.len < arphdr_len(ar) &&
-                   (m = m_pullup(m, arphdr_len(ar))) == NULL) {
-                       log(LOG_ERR, "arp: runt packet\n");
-                       m_freem(m);
-                       continue;
-               }
+       if (m->m_len < sizeof(struct arphdr) &&
+           ((m = m_pullup(m, sizeof(struct arphdr))) == NULL)) {
+               log(LOG_ERR, "arp: runt packet -- m_pullup failed\n");
+               return;
+       }
+       ar = mtod(m, struct arphdr *);
+
+       ar_hrd = ntohs(ar->ar_hrd);
+       if (ar_hrd != ARPHRD_ETHER &&
+           ar_hrd != ARPHRD_IEEE802 &&
+           ar_hrd != ARPHRD_ARCNET) {
+               log(LOG_ERR,
+                   "arp: unknown hardware address format (0x%2D)\n",
+                   (unsigned char *)&ar->ar_hrd, "");
+               m_freem(m);
+               return;
+       }
 
-               switch (ntohs(ar->ar_pro)) {
+       if (m->m_pkthdr.len < arphdr_len(ar) &&
+           (m = m_pullup(m, arphdr_len(ar))) == NULL) {
+               log(LOG_ERR, "arp: runt packet\n");
+               m_freem(m);
+               return;
+       }
+
+       switch (ntohs(ar->ar_pro)) {
 #ifdef INET
-                       case ETHERTYPE_IP:
-                               in_arpinput(m);
-                               continue;
+               case ETHERTYPE_IP:
+                       in_arpinput(m);
+                       return;
 #endif
-               }
-               m_freem(m);
        }
+       m_freem(m);
 }
 
 #ifdef INET
@@ -917,7 +909,7 @@ static void
 arp_init(void)
 {
        LIST_INIT(&llinfo_arp);
-       register_netisr(NETISR_ARP, arpintr);
+       netisr_register(NETISR_ARP, arpintr, &arpintrq);
 }
 
 SYSINIT(arp, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY, arp_init, 0);
index f81529b..dd0f491 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ether.h  8.3 (Berkeley) 5/2/95
  * $FreeBSD: src/sys/netinet/if_ether.h,v 1.24.2.1 2002/02/13 21:38:56 fjoe Exp $
- * $DragonFly: src/sys/netinet/if_ether.h,v 1.3 2003/08/23 11:18:00 rob Exp $
+ * $DragonFly: src/sys/netinet/if_ether.h,v 1.4 2003/09/15 23:38:14 hsu Exp $
  */
 
 #ifndef _NETINET_IF_ETHER_H_
@@ -113,7 +113,6 @@ struct sockaddr_inarp {
 #ifdef _KERNEL
 extern u_char  ether_ipmulticast_min[ETHER_ADDR_LEN];
 extern u_char  ether_ipmulticast_max[ETHER_ADDR_LEN];
-extern struct  ifqueue arpintrq;
 
 int    arpresolve (struct ifnet *, struct rtentry *, struct mbuf *,
                        struct sockaddr *, u_char *, struct rtentry *);
index 09a4805..a9915b4 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.4 2003/08/23 11:18:00 rob Exp $
+ * $DragonFly: src/sys/netinet/in_var.h,v 1.5 2003/09/15 23:38:14 hsu Exp $
  */
 
 #ifndef _NETINET_IN_VAR_H_
@@ -84,7 +84,6 @@ struct        in_aliasreq {
 
 
 #ifdef _KERNEL
-extern struct  ifqueue ipintrq;                /* ip packet input queue */
 extern struct  in_addr zeroin_addr;
 extern u_char  inetctlerrmap[];
 
index feaee83..d5ad24b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $NetBSD: ip_gre.c,v 1.21 2002/08/14 00:23:30 itojun Exp $ 
- * $DragonFly: src/sys/netinet/ip_gre.c,v 1.4 2003/08/16 02:52:00 dillon Exp $
+ * $DragonFly: src/sys/netinet/ip_gre.c,v 1.5 2003/09/15 23:38:14 hsu Exp $
  *
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -136,8 +136,7 @@ static int
 gre_input2(struct mbuf *m ,int hlen, u_char proto)
 {
        struct greip *gip = mtod(m, struct greip *);
-       int s;
-       struct ifqueue *ifq;
+       int isr;
        struct gre_softc *sc;
        u_short flags;
 
@@ -168,20 +167,18 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
                        hlen +=4;
 
                switch (ntohs(gip->gi_ptype)) { /* ethertypes */
-               case ETHERTYPE_IP: /* shouldn't need a schednetisr(), as */
-               case WCCP_PROTOCOL_TYPE: /* we are in ip_input */
-                       ifq = &ipintrq;
+               case ETHERTYPE_IP:
+               case WCCP_PROTOCOL_TYPE:
+                       isr = NETISR_IP;
                        break;
 #ifdef NS
                case ETHERTYPE_NS:
-                       ifq = &nsintrq;
-                       schednetisr(NETISR_NS);
+                       isr = NETISR_NS;
                        break;
 #endif
 #ifdef NETATALK
                case ETHERTYPE_ATALK:
-                       ifq = &atintrq1;
-                       schednetisr(NETISR_ATALK);
+                       isr = NETISR_ATALK1;
                        break;
 #endif
                case ETHERTYPE_IPV6:
@@ -211,16 +208,7 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
        }
 
        m->m_pkthdr.rcvif = &sc->sc_if;
-
-       s = splnet();           /* possible */
-       if (_IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-       } else {
-               IF_ENQUEUE(ifq,m);
-       }
-       splx(s);
-
+       netisr_dispatch(isr, m);
        return(1);      /* packet is done, no further processing needed */
 }
 
@@ -236,9 +224,7 @@ gre_mobile_input(struct mbuf *m, int hlen)
 {
        struct ip *ip = mtod(m, struct ip *);
        struct mobip_h *mip = mtod(m, struct mobip_h *);
-       struct ifqueue *ifq;
        struct gre_softc *sc;
-       int s;
        u_char osrc = 0;
        int msiz;
 
@@ -296,15 +282,7 @@ gre_mobile_input(struct mbuf *m, int hlen)
 
        m->m_pkthdr.rcvif = &sc->sc_if;
 
-       ifq = &ipintrq;
-       s = splnet();       /* possible */
-       if (_IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-       } else {
-               IF_ENQUEUE(ifq,m);
-       }
-       splx(s);
+       netisr_dispatch(NETISR_IP, m);
 }
 
 /*
index 72a2f96..ab8f806 100644 (file)
@@ -32,7 +32,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.6 2003/08/23 11:18:00 rob Exp $
+ * $DragonFly: src/sys/netinet/ip_input.c,v 1.7 2003/09/15 23:38:14 hsu Exp $
  */
 
 #define        _IP_VHL
@@ -159,6 +159,7 @@ SYSCTL_INT(_net_inet_ip, OID_AUTO, check_interface, CTLFLAG_RW,
 static int     ipprintfs = 0;
 #endif
 
+static struct ifqueue ipintrq;
 static int     ipqmaxlen = IFQ_MAXLEN;
 
 extern struct domain inetdomain;
@@ -237,7 +238,6 @@ static void ip_forward(struct mbuf *m, int srcrt,
 static void    ip_freef(struct ipq *);
 static struct  mbuf *ip_reass(struct mbuf *, struct ipq *,
                struct ipq *, u_int32_t *, u_int16_t *);
-static void    ipintr(void);
 
 /*
  * IP initialization: fill in IP protocol switch table.
@@ -273,7 +273,7 @@ ip_init()
 #endif
        ipintrq.ifq_maxlen = ipqmaxlen;
 
-       register_netisr(NETISR_IP, ipintr);
+       netisr_register(NETISR_IP, ip_input, &ipintrq);
 }
 
 /*
@@ -931,25 +931,6 @@ bad:
        m_freem(m);
 }
 
-/*
- * IP software interrupt routine - to go away sometime soon
- */
-static void
-ipintr(void)
-{
-       int s;
-       struct mbuf *m;
-
-       while(1) {
-               s = splimp();
-               IF_DEQUEUE(&ipintrq, m);
-               splx(s);
-               if (m == 0)
-                       return;
-               ip_input(m);
-       }
-}
-
 /*
  * Take incoming datagram fragment and try to reassemble it into
  * whole datagram.  If a chain for reassembly of this datagram already
index b122407..ab085e1 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet6/ah_input.c,v 1.1.2.6 2002/04/28 05:40:26 suz Exp $   */
-/*     $DragonFly: src/sys/netinet6/ah_input.c,v 1.4 2003/08/07 21:54:33 dillon Exp $  */
+/*     $DragonFly: src/sys/netinet6/ah_input.c,v 1.5 2003/09/15 23:38:14 hsu Exp $     */
 /*     $KAME: ah_input.c,v 1.67 2002/01/07 11:39:56 kjc Exp $  */
 
 /*
@@ -111,7 +111,6 @@ ah4_input(struct mbuf *m, int off, int proto)
        struct secasvar *sav = NULL;
        u_int16_t nxt;
        size_t hlen;
-       int s;
        size_t stripsiz = 0;
 
 #ifndef PULLDOWN_TEST
@@ -451,16 +450,12 @@ ah4_input(struct mbuf *m, int off, int proto)
                        goto fail;
                }
 
-               s = splimp();
-               if (IF_QFULL(&ipintrq)) {
+               if (netisr_queue(NETISR_IP, m)) {
                        ipsecstat.in_inval++;
-                       splx(s);
+                       m = NULL;
                        goto fail;
                }
-               IF_ENQUEUE(&ipintrq, m);
-               m = NULL;
-               schednetisr(NETISR_IP); /* can be skipped but to make sure */
-               splx(s);
+
                nxt = IPPROTO_DONE;
        } else {
                /*
@@ -577,7 +572,6 @@ ah6_input(mp, offp, proto)
        u_char *cksum;
        struct secasvar *sav = NULL;
        u_int16_t nxt;
-       int s;
        size_t stripsiz = 0;
 
 #ifndef PULLDOWN_TEST
@@ -853,16 +847,12 @@ ah6_input(mp, offp, proto)
                        goto fail;
                }
 
-               s = splimp();
-               if (IF_QFULL(&ip6intrq)) {
-                       ipsec6stat.in_inval++;
-                       splx(s);
+               if (netisr_queue(NETISR_IPV6, m)) {
+                       ipsecstat.in_inval++;
+                       m = NULL;
                        goto fail;
                }
-               IF_ENQUEUE(&ip6intrq, m);
-               m = NULL;
-               schednetisr(NETISR_IPV6); /* can be skipped but to make sure */
-               splx(s);
+
                nxt = IPPROTO_DONE;
        } else {
                /*
index 6b7bea9..28a18cd 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet6/esp_input.c,v 1.1.2.8 2003/01/23 21:06:47 sam Exp $  */
-/*     $DragonFly: src/sys/netinet6/esp_input.c,v 1.4 2003/08/07 21:54:33 dillon Exp $ */
+/*     $DragonFly: src/sys/netinet6/esp_input.c,v 1.5 2003/09/15 23:38:14 hsu Exp $    */
 /*     $KAME: esp_input.c,v 1.62 2002/01/07 11:39:57 kjc Exp $ */
 
 /*
@@ -115,7 +115,6 @@ esp4_input(struct mbuf *m, int off, int proto)
        int ivlen;
        size_t hlen;
        size_t esplen;
-       int s;
 
        /* sanity check for alignment. */
        if (off % 4 != 0 || m->m_pkthdr.len % 4 != 0) {
@@ -386,16 +385,12 @@ noreplaycheck:
                        goto bad;
                }
 
-               s = splimp();
-               if (IF_QFULL(&ipintrq)) {
+               if (netisr_queue(NETISR_IP, m)) {
                        ipsecstat.in_inval++;
-                       splx(s);
+                       m = NULL;
                        goto bad;
                }
-               IF_ENQUEUE(&ipintrq, m);
-               m = NULL;
-               schednetisr(NETISR_IP); /* can be skipped but to make sure */
-               splx(s);
+
                nxt = IPPROTO_DONE;
        } else {
                /*
@@ -477,7 +472,6 @@ esp6_input(mp, offp, proto)
        const struct esp_algorithm *algo;
        int ivlen;
        size_t esplen;
-       int s;
 
        /* sanity check for alignment. */
        if (off % 4 != 0 || m->m_pkthdr.len % 4 != 0) {
@@ -752,16 +746,12 @@ noreplaycheck:
                        goto bad;
                }
 
-               s = splimp();
-               if (IF_QFULL(&ip6intrq)) {
+               if (netisr_queue(NETISR_IPV6, m)) {
                        ipsec6stat.in_inval++;
-                       splx(s);
+                       m = NULL;
                        goto bad;
                }
-               IF_ENQUEUE(&ip6intrq, m);
-               m = NULL;
-               schednetisr(NETISR_IPV6); /* can be skipped but to make sure */
-               splx(s);
+
                nxt = IPPROTO_DONE;
        } else {
                /*
index 6af8f0c..b67a981 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet6/ip6_input.c,v 1.11.2.15 2003/01/24 05:11:35 sam Exp $        */
-/*     $DragonFly: src/sys/netinet6/ip6_input.c,v 1.7 2003/08/23 11:02:45 rob Exp $    */
+/*     $DragonFly: src/sys/netinet6/ip6_input.c,v 1.8 2003/09/15 23:38:14 hsu Exp $    */
 /*     $KAME: ip6_input.c,v 1.259 2002/01/21 04:58:09 jinmei Exp $     */
 
 /*
@@ -189,7 +189,7 @@ ip6_init()
                    pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW)
                        ip6_protox[pr->pr_protocol] = pr - inet6sw;
        ip6intrq.ifq_maxlen = ip6qmaxlen;
-       register_netisr(NETISR_IPV6, ip6intr);
+       netisr_register(NETISR_IPV6, ip6_input, &ip6intrq);
        nd6_init();
        frag6_init();
        /*
@@ -232,25 +232,6 @@ ip6_init2(dummy)
 /* This must be after route_init(), which is now SI_ORDER_THIRD */
 SYSINIT(netinet6init2, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ip6_init2, NULL);
 
-/*
- * IP6 input interrupt handling. Just pass the packet to ip6_input.
- */
-void
-ip6intr()
-{
-       int s;
-       struct mbuf *m;
-
-       for (;;) {
-               s = splimp();
-               IF_DEQUEUE(&ip6intrq, m);
-               splx(s);
-               if (m == 0)
-                       return;
-               ip6_input(m);
-       }
-}
-
 extern struct  route_in6 ip6_forward_rt;
 
 void
index 83f7e55..d9e7785 100644 (file)
@@ -3,7 +3,7 @@
  * All Rights Reserved.  See COPYRIGHT.
  *
  * $FreeBSD: src/sys/netatalk/ddp_input.c,v 1.12 2000/02/13 03:31:58 peter Exp $
- * $DragonFly: src/sys/netproto/atalk/ddp_input.c,v 1.3 2003/08/07 21:17:33 dillon Exp $
+ * $DragonFly: src/sys/netproto/atalk/ddp_input.c,v 1.4 2003/09/15 23:38:14 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -36,74 +36,50 @@ static void     ddp_input(struct mbuf *, struct ifnet *, struct elaphdr *, int);
  * Could probably merge these two code segments a little better...
  */
 static void
-atintr( void )
+at2intr(struct mbuf *m)
 {
-    struct elaphdr     *elhp, elh;
-    struct ifnet       *ifp;
-    struct mbuf                *m;
-    int                        s;
-
-    /*
-     * First pull off all the phase 2 packets.
-     */
-    for (;;) {
-       s = splimp();
-
-       IF_DEQUEUE( &atintrq2, m );
-
-       splx( s );
-
-       if ( m == 0 ) {                 /* no more queued packets */
-           break;
-       }
-
-       ifp = m->m_pkthdr.rcvif;
-       ddp_input( m, ifp, (struct elaphdr *)NULL, 2 );
-    }
-
-    /*
-     * Then pull off all the phase 1 packets.
-     */
-    for (;;) {
-       s = splimp();
-
-       IF_DEQUEUE( &atintrq1, m );
 
-       splx( s );
-
-       if ( m == 0 ) {                 /* no more queued packets */
-           break;
-       }
+       /*
+        * Phase 2 packet handling 
+        */
+       ddp_input(m, m->m_pkthdr.rcvif, NULL, 2);
+       return;
+}
 
-       ifp = m->m_pkthdr.rcvif;
+static void
+at1intr(struct mbuf *m)
+{
+       struct elaphdr *elhp, elh;
 
-       if ( m->m_len < SZ_ELAPHDR &&
-               (( m = m_pullup( m, SZ_ELAPHDR )) == 0 )) {
-           ddpstat.ddps_tooshort++;
-           continue;
+       /*
+        * Phase 1 packet handling 
+        */
+       if (m->m_len < SZ_ELAPHDR && ((m = m_pullup(m, SZ_ELAPHDR)) == 0)) {
+               ddpstat.ddps_tooshort++;
+               return;
        }
 
        /*
-        * this seems a little dubios, but I don't know phase 1 so leave it.
+        * This seems a little dubious, but I don't know phase 1 so leave it.
         */
-       elhp = mtod( m, struct elaphdr *);
-       m_adj( m, SZ_ELAPHDR );
+       elhp = mtod(m, struct elaphdr *);
+       m_adj(m, SZ_ELAPHDR);
 
-       if ( elhp->el_type == ELAP_DDPEXTEND ) {
-           ddp_input( m, ifp, (struct elaphdr *)NULL, 1 );
+       if (elhp->el_type == ELAP_DDPEXTEND) {
+               ddp_input(m, m->m_pkthdr.rcvif, NULL, 1);
        } else {
-           bcopy((caddr_t)elhp, (caddr_t)&elh, SZ_ELAPHDR );
-           ddp_input( m, ifp, &elh, 1 );
+               bcopy((caddr_t)elhp, (caddr_t)&elh, SZ_ELAPHDR);
+               ddp_input(m, m->m_pkthdr.rcvif, &elh, 1);
        }
-    }
-    return;
+       return;
 }
 
 static void
 netisr_atalk_setup(void *dummy __unused)
 {
        
-       register_netisr(NETISR_ATALK, atintr);
+       netisr_register(NETISR_ATALK1, at1intr, &atintrq1);
+       netisr_register(NETISR_ATALK2, at2intr, &atintrq2);
 }
 SYSINIT(atalk_setup, SI_SUB_CPU, SI_ORDER_ANY, netisr_atalk_setup, NULL);
 
index 6ec68fb..cdd9f3e 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/netatm/atm_subr.c,v 1.7 2000/02/13 03:31:59 peter Exp $
- *     @(#) $DragonFly: src/sys/netproto/atm/atm_subr.c,v 1.4 2003/08/23 10:06:21 rob Exp $
+ *     @(#) $DragonFly: src/sys/netproto/atm/atm_subr.c,v 1.5 2003/09/15 23:38:14 hsu Exp $
  */
 
 /*
@@ -122,7 +122,7 @@ atm_initialize()
        atm_intr_index = register_isr(atm_intr);
 #endif
 #ifdef __FreeBSD__
-       register_netisr(NETISR_ATM, atm_intr);
+       netisr_register(NETISR_ATM, atm_intr, &atm_intrq);
 #endif
 
        /*
@@ -879,52 +879,38 @@ atm_stack_drain()
  *     none
  *
  */
-void
-atm_intr()
+static void
+atm_intr(struct mbuf *m)
 {
-       KBuffer         *m;
        caddr_t         cp;
        atm_intr_func_t func;
        void            *token;
-       int             s;
-
-       for (; ; ) {
-               /*
-                * Get next buffer from queue
-                */
-               s = splimp();
-               IF_DEQUEUE(&atm_intrq, m);
-               (void) splx(s);
-               if (m == NULL)
-                       break;
 
-               /*
-                * Get function to call and token value
-                */
-               KB_DATASTART(m, cp, caddr_t);
-               func = *(atm_intr_func_t *)cp;
-               cp += sizeof(func);
-               token = *(void **)cp;
-               KB_HEADADJ(m, -(sizeof(func) + sizeof(token)));
-               if (KB_LEN(m) == 0) {
-                       KBuffer         *m1;
-                       KB_UNLINKHEAD(m, m1);
-                       m = m1;
-               }
+       /*
+        * Get function to call and token value
+        */
+       KB_DATASTART(m, cp, caddr_t);
+       func = *(atm_intr_func_t *)cp;
+       cp += sizeof(func);
+       token = *(void **)cp;
+       KB_HEADADJ(m, -(sizeof(func) + sizeof(token)));
+       if (KB_LEN(m) == 0) {
+               KBuffer         *m1;
+               KB_UNLINKHEAD(m, m1);
+               m = m1;
+       }
 
-               /*
-                * Call processing function
-                */
-               (*func)(token, m);
+       /*
+        * Call processing function
+        */
+       (*func)(token, m);
 
-               /*
-                * Drain any deferred calls
-                */
-               STACK_DRAIN();
-       }
+       /*
+        * Drain any deferred calls
+        */
+       STACK_DRAIN();
 }
 
-
 /*
  * Print a pdu buffer chain
  * 
index 8c719a1..f642939 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/netatm/atm_var.h,v 1.2 1999/08/28 00:48:39 peter Exp $
- *     @(#) $DragonFly: src/sys/netproto/atm/atm_var.h,v 1.4 2003/08/23 10:06:21 rob Exp $
+ *     @(#) $DragonFly: src/sys/netproto/atm/atm_var.h,v 1.5 2003/09/15 23:38:14 hsu Exp $
  *
  */
 
@@ -195,7 +195,7 @@ int         atm_untimeout (struct atm_time *);
 int            atm_stack_enq (int, void (*) (int, void *, int, int), 
                        void *, Atm_connvc *, int, int);
 void           atm_stack_drain (void);
-void           atm_intr (void);
+void           atm_intr (struct mbuf *);
 void           atm_pdu_print (KBuffer *, char *);
 
        /* atm_usrreq.c */
index 270f378..225045b 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/netatm/ipatm/ipatm_input.c,v 1.4 2000/01/17 20:49:43 mks Exp $
- *     @(#) $DragonFly: src/sys/netproto/atm/ipatm/ipatm_input.c,v 1.4 2003/08/07 21:54:33 dillon Exp $
+ *     @(#) $DragonFly: src/sys/netproto/atm/ipatm/ipatm_input.c,v 1.5 2003/09/15 23:38:15 hsu Exp $
  */
 
 /*
@@ -104,7 +104,6 @@ ipatm_ipinput(inp, m)
        struct ip_nif   *inp;
        KBuffer         *m;
 {
-       int             s;
 #if    BSD < 199103
        int             space;
 #endif
@@ -184,23 +183,7 @@ ipatm_ipinput(inp, m)
         * just call IP directly to avoid the extra unnecessary 
         * kernel scheduling.
         */
-       s = splimp();
-       if (IF_QFULL(&ipintrq)) {
-               IF_DROP(&ipintrq);
-               (void) splx(s);
-               KB_FREEALL(m);
-               return (1);
-       }
-
-       IF_ENQUEUE(&ipintrq, m);
-       (void) splx(s);
-#if    BSD < 199506
-       ipintr();
-#else
-       schednetisr ( NETISR_IP );
-#endif /* BSD >= 199506 */
+       netisr_dispatch(NETISR_IP, m);
 #endif /* defined(BSD) */
-
        return (0);
 }
-
index d6d1820..0e1135b 100644 (file)
@@ -34,7 +34,7 @@
  *     @(#)ipx_if.h
  *
  * $FreeBSD: src/sys/netipx/ipx_if.h,v 1.11 1999/12/29 04:46:07 peter Exp $
- * $DragonFly: src/sys/netproto/ipx/ipx_if.h,v 1.3 2003/08/23 10:06:23 rob Exp $
+ * $DragonFly: src/sys/netproto/ipx/ipx_if.h,v 1.4 2003/09/15 23:38:15 hsu Exp $
  */
 
 #ifndef _NETIPX_IPX_IF_H_
@@ -89,7 +89,6 @@ struct ipxip_req {
 #endif
 
 #ifdef _KERNEL
-extern struct  ifqueue ipxintrq;       /* IPX input packet queue */
 extern struct  ipx_ifaddr *ipx_ifaddr;
 
 struct ipx_ifaddr *ipx_iaonnetof (struct ipx_addr *dst);
index 6149317..f0e3ea7 100644 (file)
@@ -34,7 +34,7 @@
  *     @(#)ipx_input.c
  *
  * $FreeBSD: src/sys/netipx/ipx_input.c,v 1.22.2.2 2001/02/22 09:44:18 bp Exp $
- * $DragonFly: src/sys/netproto/ipx/ipx_input.c,v 1.4 2003/08/07 21:17:37 dillon Exp $
+ * $DragonFly: src/sys/netproto/ipx/ipx_input.c,v 1.5 2003/09/15 23:38:15 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -88,10 +88,12 @@ struct      ipxpcb ipxpcb;
 struct ipxpcb ipxrawpcb;
 
 static int ipxqmaxlen = IFQ_MAXLEN;
+static struct ifqueue ipxintrq;
 
 long   ipx_pexseq;
 const int ipxintrq_present = 1;
 
+static void ipxintr(struct mbuf *);
 static int ipx_do_route(struct ipx_addr *src, struct route *ro);
 static void ipx_undo_route(struct route *ro);
 static void ipx_forward(struct mbuf *m);
@@ -118,31 +120,20 @@ ipx_init()
        ipx_hostmask.sipx_addr.x_net = ipx_broadnet;
        ipx_hostmask.sipx_addr.x_host = ipx_broadhost;
 
-       register_netisr(NETISR_IPX, ipxintr);
+       netisr_register(NETISR_IPX, ipxintr, &ipxintrq);
 }
 
 /*
  * IPX input routine.  Pass to next level.
  */
-void
-ipxintr()
+static void
+ipxintr(struct mbuf *m)
 {
        struct ipx *ipx;
-       struct mbuf *m;
        struct ipxpcb *ipxp;
        struct ipx_ifaddr *ia;
-       int len, s;
+       int len;
 
-next:
-       /*
-        * Get next datagram off input queue and get IPX header
-        * in first mbuf.
-        */
-       s = splimp();
-       IF_DEQUEUE(&ipxintrq, m);
-       splx(s);
-       if (m == NULL)
-               return;
        /*
         * If no IPX addresses have been set yet but the interfaces
         * are receiving, can't do anything with incoming packets yet.
@@ -155,7 +146,7 @@ next:
        if ((m->m_flags & M_EXT || m->m_len < sizeof(struct ipx)) &&
            (m = m_pullup(m, sizeof(struct ipx))) == 0) {
                ipxstat.ipxs_toosmall++;
-               goto next;
+               return;
        }
 
        /*
@@ -201,7 +192,7 @@ next:
        if (ipx->ipx_pt == IPXPROTO_NETBIOS) {
                if (ipxnetbios) {
                        ipx_output_type20(m);
-                       goto next;
+                       return;
                } else
                        goto bad;
        }
@@ -236,7 +227,7 @@ next:
                         */
                        if (ipx->ipx_tc < IPX_MAXHOPS) {
                                ipx_forward(m);
-                               goto next;
+                               return;
                        }
                }
        /*
@@ -251,7 +242,7 @@ next:
 
                if (ia == NULL) {
                        ipx_forward(m);
-                       goto next;
+                       return;
                }
        }
 ours:
@@ -266,20 +257,18 @@ ours:
                ipxstat.ipxs_delivered++;
                if ((ipxp->ipxp_flags & IPXP_ALL_PACKETS) == 0)
                        switch (ipx->ipx_pt) {
-
-                           case IPXPROTO_SPX:
-                                   spx_input(m, ipxp);
-                                   goto next;
+                       case IPXPROTO_SPX:
+                               spx_input(m, ipxp);
+                               return;
                        }
                ipx_input(m, ipxp);
        } else
                goto bad;
 
-       goto next;
+       return;
 
 bad:
        m_freem(m);
-       goto next;
 }
 
 void
index cd66888..c1e53d9 100644 (file)
@@ -34,7 +34,7 @@
  *     @(#)ipx_ip.c
  *
  * $FreeBSD: src/sys/netipx/ipx_ip.c,v 1.24.2.2 2003/01/23 21:06:48 sam Exp $
- * $DragonFly: src/sys/netproto/ipx/ipx_ip.c,v 1.6 2003/08/07 21:17:37 dillon Exp $
+ * $DragonFly: src/sys/netproto/ipx/ipx_ip.c,v 1.7 2003/09/15 23:38:15 hsu Exp $
  */
 
 /*
@@ -170,7 +170,6 @@ ipxip_input(m, hlen, dummy)
 {
        struct ip *ip;
        struct ipx *ipx;
-       struct ifqueue *ifq = &ipxintrq;
        int len, s;
 
        if (ipxip_hold_input) {
@@ -226,17 +225,7 @@ ipxip_input(m, hlen, dummy)
        /*
         * Deliver to IPX
         */
-       s = splimp();
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-               splx(s);
-               return;
-       }
-       IF_ENQUEUE(ifq, m);
-       schednetisr(NETISR_IPX);
-       splx(s);
-       return;
+       netisr_dispatch(NETISR_IPX, m);
 }
 
 static int
index 938e624..d2a6be0 100644 (file)
@@ -34,7 +34,7 @@
  *     @(#)ipx_var.h
  *
  * $FreeBSD: src/sys/netipx/ipx_var.h,v 1.14 1999/12/29 04:46:09 peter Exp $
- * $DragonFly: src/sys/netproto/ipx/ipx_var.h,v 1.4 2003/08/23 10:06:23 rob Exp $
+ * $DragonFly: src/sys/netproto/ipx/ipx_var.h,v 1.5 2003/09/15 23:38:15 hsu Exp $
  */
 
 #ifndef _NETIPX_IPX_VAR_H_
@@ -96,7 +96,6 @@ int   ipx_ctloutput (struct socket *so, struct sockopt *sopt);
 void   ipx_drop (struct ipxpcb *ipxp, int errno);
 void   ipx_init (void);
 void   ipx_input (struct mbuf *m, struct ipxpcb *ipxp);
-void   ipxintr (void);
 int    ipx_outputfl (struct mbuf *m0, struct route *ro, int flags);
 int    ipx_output_type20 (struct mbuf *);
 int    ipx_peeraddr (struct socket *so, struct sockaddr **nam);
index 872d580..97c8f43 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: natm.c,v 1.5 1996/11/09 03:26:26 chuck Exp $   */
 /* $FreeBSD: src/sys/netnatm/natm.c,v 1.12 2000/02/13 03:32:03 peter Exp $ */
-/* $DragonFly: src/sys/netproto/natm/natm.c,v 1.5 2003/08/23 10:06:24 rob Exp $ */
+/* $DragonFly: src/sys/netproto/natm/natm.c,v 1.6 2003/09/15 23:38:15 hsu Exp $ */
 
 /*
  *
@@ -689,6 +689,60 @@ done:
 
 #endif  /* !FREEBSD_USRREQS */
 
+/* 
+ * natm0_sysctl: not used, but here in case we want to add something
+ * later...
+ */
+
+int natm0_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
+    void *newp, size_t newlen)
+{
+  /* All sysctl names at this level are terminal. */
+  if (namelen != 1)
+    return (ENOTDIR);
+  return (ENOPROTOOPT);
+}
+
+/* 
+ * natm5_sysctl: not used, but here in case we want to add something
+ * later...
+ */
+
+int natm5_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
+    void *newp, size_t newlen)
+{
+  /* All sysctl names at this level are terminal. */
+  if (namelen != 1)
+    return (ENOTDIR);
+  return (ENOPROTOOPT);
+}
+
+static int natmqmaxlen = IFQ_MAXLEN;   /* max # of packets on queue */
+static void natmintr(struct mbuf *);
+static struct ifqueue natmintrq;
+
+const int natmintrq_present = 1;
+
+#if defined(__FreeBSD__)
+static void
+netisr_natm_setup(void *dummy __unused)
+{
+
+       netisr_register(NETISR_NATM, natmintr,  &natmintrq);
+}
+SYSINIT(natm_setup, SI_SUB_CPU, SI_ORDER_ANY, netisr_natm_setup, NULL);
+#endif
+
+void
+natm_init()
+{
+  LIST_INIT(&natm_pcbs);
+  bzero(&natmintrq, sizeof(natmintrq));
+  natmintrq.ifq_maxlen = natmqmaxlen;
+
+  netisr_register(NETISR_NATM, natmintr, &natmintrq);
+}
+
 /*
  * natmintr: splsoftnet interrupt
  *
@@ -696,23 +750,13 @@ done:
  * pointer.    we can get the interface pointer from the so's PCB if
  * we really need it.
  */
-
-void
-natmintr()
-
+static void
+natmintr(struct mbuf *m)
 {
   int s;
-  struct mbuf *m;
   struct socket *so;
   struct natmpcb *npcb;
 
-next:
-  s = splimp();
-  IF_DEQUEUE(&natmintrq, m);
-  splx(s);
-  if (m == NULL)
-    return;
-
 #ifdef DIAGNOSTIC
   if ((m->m_flags & M_PKTHDR) == 0)
     panic("natmintr no HDR");
@@ -729,12 +773,12 @@ next:
     m_freem(m);
     if (npcb->npcb_inq == 0)
       FREE(npcb, M_PCB);                       /* done! */
-    goto next;
+    return;
   }
 
   if (npcb->npcb_flags & NPCB_FREE) {
     m_freem(m);                                        /* drop */
-    goto next;
+    return;
   }
 
 #ifdef NEED_TO_RESTORE_IFP
@@ -760,59 +804,5 @@ m->m_pkthdr.rcvif = NULL;  /* null it out to be safe */
 #endif
     m_freem(m);
   }
-
-  goto next;
-}
-
-#if defined(__FreeBSD__)
-static void
-netisr_natm_setup(void *dummy __unused)
-{
-
-       register_netisr(NETISR_NATM, natmintr);
 }
-SYSINIT(natm_setup, SI_SUB_CPU, SI_ORDER_ANY, netisr_natm_setup, NULL);
-#endif
-
-
-/* 
- * natm0_sysctl: not used, but here in case we want to add something
- * later...
- */
-
-int natm0_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
 
-int *name;
-u_int namelen;
-void *oldp;
-size_t *oldlenp;
-void *newp;
-size_t newlen;
-
-{
-  /* All sysctl names at this level are terminal. */
-  if (namelen != 1)
-    return (ENOTDIR);
-  return (ENOPROTOOPT);
-}
-
-/* 
- * natm5_sysctl: not used, but here in case we want to add something
- * later...
- */
-
-int natm5_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
-
-int *name;
-u_int namelen;
-void *oldp;
-size_t *oldlenp;
-void *newp;
-size_t newlen;
-
-{
-  /* All sysctl names at this level are terminal. */
-  if (namelen != 1)
-    return (ENOTDIR);
-  return (ENOPROTOOPT);
-}
index 7971521..c19430d 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: natm.h,v 1.1 1996/07/04 03:20:12 chuck Exp $   */
 /* $FreeBSD: src/sys/netnatm/natm.h,v 1.3 1999/12/29 04:46:14 peter Exp $ */
-/* $DragonFly: src/sys/netproto/natm/natm.h,v 1.3 2003/08/23 10:06:24 rob Exp $ */
+/* $DragonFly: src/sys/netproto/natm/natm.h,v 1.4 2003/09/15 23:38:15 hsu Exp $ */
 
 /*
  *
@@ -112,7 +112,6 @@ LIST_HEAD(npcblist, natmpcb);
 /* global data structures */
 
 extern struct npcblist natm_pcbs;      /* global list of pcbs */
-extern struct ifqueue natmintrq;       /* natm packet input queue */
 #define        NATM_STAT
 #ifdef NATM_STAT
 extern u_int natm_sodropcnt,
@@ -152,8 +151,8 @@ int natm_usrreq (struct socket *, int, struct mbuf *,
                              struct mbuf *, struct mbuf *);
 #endif /* !( __FreeBSD__ > 2) */
 #endif
+void   natm_init (void);
 int    natm0_sysctl (int *, u_int, void *, size_t *, void *, size_t);
 int    natm5_sysctl (int *, u_int, void *, size_t *, void *, size_t);
-void   natmintr (void);
 
 #endif
index 2357d55..a10d48a 100644 (file)
@@ -32,7 +32,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netnatm/natm_proto.c,v 1.4.2.2 2000/08/03 18:56:28 peter Exp $
- * $DragonFly: src/sys/netproto/natm/natm_proto.c,v 1.4 2003/08/23 10:06:24 rob Exp $
+ * $DragonFly: src/sys/netproto/natm/natm_proto.c,v 1.5 2003/09/15 23:38:15 hsu Exp $
  */
 
 /*
@@ -47,7 +47,7 @@
 #include <sys/domain.h>
 
 #include <net/if.h>
-#include <net/intrq.h>
+#include <net/netisr.h>
 
 #include <netinet/in.h>
 
@@ -55,8 +55,6 @@
 
 extern struct domain natmdomain;
 
-static void natm_init (void);
-
 static struct protosw natmsw[] = {
 { SOCK_STREAM, &natmdomain,    PROTO_NATMAAL5, PR_CONNREQUIRED,
   0,   0,      0,      0,
@@ -107,7 +105,6 @@ static struct domain natmdomain =
       natmsw, &natmsw[sizeof(natmsw)/sizeof(natmsw[0])], 0,
       0, 0, 0};
 
-static int natmqmaxlen = IFQ_MAXLEN;   /* max # of packets on queue */
 #ifdef NATM_STAT
 u_int natm_sodropcnt = 0;              /* # mbufs dropped due to full sb */
 u_int natm_sodropbytes = 0;            /* # of bytes dropped */
@@ -115,17 +112,6 @@ u_int natm_sookcnt = 0;                    /* # mbufs ok */
 u_int natm_sookbytes = 0;              /* # of bytes ok */
 #endif
 
-const int natmintrq_present = 1;
-
-
-void natm_init()
-
-{
-  LIST_INIT(&natm_pcbs);
-  bzero(&natmintrq, sizeof(natmintrq));
-  natmintrq.ifq_maxlen = natmqmaxlen;
-}
-
 #if defined(__FreeBSD__)
 DOMAIN_SET(natm);
 #endif
index 2cb2b92..2d3ad23 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ns_if.h     8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netns/ns_if.h,v 1.12.2.1 2002/12/01 14:03:09 sobomax Exp $
- * $DragonFly: src/sys/netproto/ns/ns_if.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $
+ * $DragonFly: src/sys/netproto/ns/ns_if.h,v 1.4 2003/09/15 23:38:15 hsu Exp $
  */
 
 #ifndef _NETNS_NS_IF_H_
@@ -84,9 +84,6 @@ struct nsip_req {
 extern struct ns_ifaddr        *ns_ifaddr;
 
 struct ns_ifaddr *ns_iaonnetof (struct ns_addr *);
-void                   nsintr(void);
-
-extern struct ifqueue  nsintrq;        /* XNS input packet queue */
 #endif
 
 #endif
index 05c925b..31bf3f1 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ns_input.c  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netns/ns_input.c,v 1.13 2000/02/13 03:32:04 peter Exp $
- * $DragonFly: src/sys/netproto/ns/ns_input.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $
+ * $DragonFly: src/sys/netproto/ns/ns_input.c,v 1.6 2003/09/15 23:38:15 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -51,7 +51,6 @@
 #include <net/route.h>
 #include <net/raw_cb.h>
 #include <net/netisr.h>
-#include <net/intrq.h>
 
 #include "ns.h"
 #include "ns_if.h"
@@ -74,6 +73,7 @@ struct sockaddr_ns ns_netmask, ns_hostmask;
 
 static u_short allones[] = {-1, -1, -1};
 
+static struct ifqueue nsintrq;
 struct nspcb nsrawpcb;
 
 int    nsqmaxlen = IFQ_MAXLEN;
@@ -83,6 +83,8 @@ long  ns_pexseq;
 
 const int      nsintrq_present = 1;
 
+static void nsintr(struct mbuf *m);
+
 void
 ns_init()
 {
@@ -90,14 +92,14 @@ ns_init()
        ns_broadnet = * (union ns_net *) allones;
        nspcb.nsp_next = nspcb.nsp_prev = &nspcb;
        nsrawpcb.nsp_next = nsrawpcb.nsp_prev = &nsrawpcb;
-       nsintrq.ifq_maxlen = nsqmaxlen;
        ns_pexseq = tick;
        ns_netmask.sns_len = 6;
        ns_netmask.sns_addr.x_net = ns_broadnet;
        ns_hostmask.sns_len = 12;
        ns_hostmask.sns_addr.x_net = ns_broadnet;
        ns_hostmask.sns_addr.x_host = ns_broadhost;
-       register_netisr(NETISR_NS, nsintr);
+       nsintrq.ifq_maxlen = nsqmaxlen;
+       netisr_register(NETISR_NS, nsintr, &nsintrq);
 }
 
 /*
@@ -105,31 +107,25 @@ ns_init()
  */
 int nsintr_getpck = 0;
 int nsintr_swtch = 0;
-void
-nsintr(void)
+
+static void
+nsintr(struct mbuf *m)
 {
        struct idp *idp;
-       struct mbuf *m;
        struct nspcb *nsp;
        int i;
        int len, s, error;
        char oddpacketp;
 
-next:
        /*
-        * Get next datagram off input queue and get IDP header
-        * in first mbuf.
+        * Get IDP header in first mbuf.
         */
-       s = splimp();
-       IF_DEQUEUE(&nsintrq, m);
        splx(s);
        nsintr_getpck++;
-       if (m == 0)
-               return;
        if ((m->m_flags & M_EXT || m->m_len < sizeof (struct idp)) &&
            (m = m_pullup(m, sizeof (struct idp))) == 0) {
                idpstat.idps_toosmall++;
-               goto next;
+               return;
        }
 
        /*
@@ -174,7 +170,7 @@ next:
                        else
                                error = NS_ERR_BADSUM_T;
                        ns_error(m, error, 0);
-                       goto next;
+                       return;
                }
        }
        /*
@@ -197,7 +193,7 @@ next:
                         */
                        if (idp->idp_tc < NS_MAXHOPS) {
                                idp_forward(m);
-                               goto next;
+                               return;
                        }
                }
        /*
@@ -205,7 +201,7 @@ next:
         */
        } else if (!ns_hosteqnh(ns_thishost,idp->idp_dna.x_host)) {
                idp_forward(m);
-               goto next;
+               return;
        }
        /*
         * Locate pcb for datagram.
@@ -224,21 +220,21 @@ next:
 
                            case NSPROTO_SPP:
                                    spp_input(m, nsp);
-                                   goto next;
+                                   return;
 
                            case NSPROTO_ERROR:
                                    ns_err_input(m);
-                                   goto next;
+                                   return;
                        }
                idp_input(m, nsp);
        } else {
                ns_error(m, NS_ERR_NOSOCK, 0);
        }
-       goto next;
+       return;
 
 bad:
        m_freem(m);
-       goto next;
+       return;
 }
 
 u_char nsctlerrmap[PRC_NCMDS] = {
index 87196d4..53eb367 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ns_ip.c     8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netns/ns_ip.c,v 1.9 1999/08/28 00:49:50 peter Exp $
- * $DragonFly: src/sys/netproto/ns/ns_ip.c,v 1.4 2003/08/07 21:17:38 dillon Exp $
+ * $DragonFly: src/sys/netproto/ns/ns_ip.c,v 1.5 2003/09/15 23:38:15 hsu Exp $
  */
 
 /*
@@ -156,13 +156,13 @@ struct mbuf *nsip_badlen;
 struct mbuf *nsip_lastin;
 int nsip_hold_input;
 
+void
 idpip_input(m, ifp)
        struct mbuf *m;
        struct ifnet *ifp;
 {
        struct ip *ip;
        struct idp *idp;
-       struct ifqueue *ifq = &nsintrq;
        int len, s;
 
        if (nsip_hold_input) {
@@ -221,18 +221,7 @@ idpip_input(m, ifp)
        /*
         * Deliver to NS
         */
-       s = splimp();
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-bad:
-               m_freem(m);
-               splx(s);
-               return;
-       }
-       IF_ENQUEUE(ifq, m);
-       schednetisr(NETISR_NS);
-       splx(s);
-       return;
+       netisr_dispatch(NETISR_NS, m);
 }
 
 /* ARGSUSED */