ALTQ support.
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Sun, 20 Feb 2005 04:41:46 +0000 (04:41 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Sun, 20 Feb 2005 04:41:46 +0000 (04:41 +0000)
sys/dev/netif/pdq_layer/pdq.c
sys/dev/netif/pdq_layer/pdq_ifsubr.c
sys/dev/netif/pdq_layer/pdqvar.h

index da96509..9b6769d 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pdq/pdq.c,v 1.5 1999/08/28 00:42:19 peter Exp $
- * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdq.c,v 1.4 2004/02/13 02:44:48 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdq.c,v 1.5 2005/02/20 04:41:46 joerg Exp $
  *
  */
 
 #include "pdqreg.h"
 #endif
 
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/ifq_var.h>
+
 #define        PDQ_ROUNDUP(n, x)       (((n) + ((x) - 1)) & ~((x) - 1))
 #define        PDQ_CMD_RX_ALIGNMENT    16
 
@@ -834,9 +838,7 @@ pdq_process_received_data(
 }
 \f
 pdq_boolean_t
-pdq_queue_transmit_data(
-    pdq_t *pdq,
-    PDQ_OS_DATABUF_T *pdu)
+pdq_queue_transmit_data(struct ifnet *ifp, pdq_t *pdq, PDQ_OS_DATABUF_T *pdu)
 {
     pdq_tx_info_t *tx = &pdq->pdq_tx_info;
     pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
@@ -892,6 +894,7 @@ pdq_queue_transmit_data(
     /*
      * Everything went fine.  Finish it up.
      */
+    ifq_dequeue(&ifp->if_snd);
     tx->tx_descriptor_count[tx->tx_producer] = tx->tx_free - freecnt;
     eop->txd_eop = 1;
     PDQ_OS_DATABUF_ENQUEUE(&tx->tx_txq, pdu);
index c2b4a88..f91a74c 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pdq/pdq_ifsubr.c,v 1.11.2.1 2000/08/02 22:39:30 peter Exp $
- * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdq_ifsubr.c,v 1.10 2005/02/11 22:25:56 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdq_ifsubr.c,v 1.11 2005/02/20 04:41:46 joerg Exp $
  *
  */
 
@@ -44,6 +44,7 @@
 #endif
 
 #include <net/if.h>
+#include <net/ifq_var.h>
 #include <net/if_dl.h>
 
 #include <net/bpf.h>
@@ -132,13 +133,7 @@ pdq_ifwatchdog(
 
     ifp->if_flags &= ~IFF_OACTIVE;
     ifp->if_timer = 0;
-    for (;;) {
-       struct mbuf *m;
-       IF_DEQUEUE(&ifp->if_snd, m);
-       if (m == NULL)
-           return;
-       m_freem(m);
-    }
+    ifq_purge(&ifp->if_snd);
 }
 
 ifnet_ret_t
@@ -160,13 +155,11 @@ pdq_ifstart(
        return;
     }
     for (;; tx = 1) {
-       IF_DEQUEUE(&ifp->if_snd, m);
+       m = ifq_poll(&ifp->if_snd);
        if (m == NULL)
            break;
 
-       if (pdq_queue_transmit_data(sc->sc_pdq, m) == PDQ_FALSE) {
-           ifp->if_flags |= IFF_OACTIVE;
-           IF_PREPEND(&ifp->if_snd, m);
+       if (pdq_queue_transmit_data(ifp, sc->sc_pdq, m) == PDQ_FALSE) {
            break;
        }
     }
@@ -200,9 +193,9 @@ pdq_os_restart_transmitter(
 {
     pdq_softc_t *sc = (pdq_softc_t *) pdq->pdq_os_ctx;
     sc->sc_if.if_flags &= ~IFF_OACTIVE;
-    if (sc->sc_if.if_snd.ifq_head != NULL) {
-       sc->sc_if.if_timer = PDQ_OS_TX_TIMEOUT;
+    if (ifq_is_empty(&sc->sc_if.if_snd)) {
        pdq_ifstart(&sc->sc_if);
+       sc->sc_if.if_timer = PDQ_OS_TX_TIMEOUT;
     } else {
        sc->sc_if.if_timer = 0;
     }
@@ -364,7 +357,8 @@ pdq_ifattach(
 
     ifp->if_ioctl = pdq_ifioctl;
     ifp->if_start = pdq_ifstart;
-    ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
+    ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
+    ifq_set_ready(&ifp->if_snd);
   
     fddi_ifattach(ifp);
 }
index 3934631..3560c5b 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pdq/pdqvar.h,v 1.3.2.1 2002/05/14 21:02:11 gallatin Exp $
- * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdqvar.h,v 1.7 2005/01/23 20:21:31 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdqvar.h,v 1.8 2005/02/20 04:41:46 joerg Exp $
  *
  */
 
@@ -324,7 +324,7 @@ extern void pdq_os_receive_pdu(pdq_t *, PDQ_OS_DATABUF_T *pdu, size_t pdulen);
 extern void pdq_os_restart_transmitter(pdq_t *pdq);
 extern void pdq_os_transmit_done(pdq_t *pdq, PDQ_OS_DATABUF_T *pdu);
 
-extern pdq_boolean_t pdq_queue_transmit_data(pdq_t *pdq, PDQ_OS_DATABUF_T *pdu);
+pdq_boolean_t pdq_queue_transmit_data(struct ifnet *, pdq_t *, PDQ_OS_DATABUF_T *);
 extern void pdq_flush_transmitter(pdq_t *pdq);
 
 extern void pdq_run(pdq_t *pdq);