while im shining this turd...

ok?

Index: if_ppp.c
===================================================================
RCS file: /cvs/src/sys/net/if_ppp.c,v
retrieving revision 1.92
diff -u -p -r1.92 if_ppp.c
--- if_ppp.c    2 Nov 2015 23:39:20 -0000       1.92
+++ if_ppp.c    3 Nov 2015 06:28:46 -0000
@@ -293,8 +293,7 @@ pppalloc(pid_t pid)
 #endif /* PPP_COMPRESS */
     for (i = 0; i < NUM_NP; ++i)
        sc->sc_npmode[i] = NPMODE_ERROR;
-    sc->sc_npqueue = NULL;
-    sc->sc_npqtail = &sc->sc_npqueue;
+    ml_init(&sc->sc_npqueue);
     sc->sc_last_sent = sc->sc_last_recv = time_second;
 
     return sc;
@@ -319,10 +318,7 @@ pppdealloc(struct ppp_softc *sc)
        ppp_pkt_free(pkt);
     while ((m = mq_dequeue(&sc->sc_inq)) != NULL)
        m_freem(m);
-    while ((m = sc->sc_npqueue) != NULL) {
-       sc->sc_npqueue = m->m_nextpkt;
-       m_freem(m);
-    }
+    ml_purge(&sc->sc_npqueue);
     m_freem(sc->sc_togo);
     sc->sc_togo = NULL;
 
@@ -769,9 +765,7 @@ pppoutput(struct ifnet *ifp, struct mbuf
     s = splsoftnet();
     if (mode == NPMODE_QUEUE) {
        /* XXX we should limit the number of packets on this queue */
-       *sc->sc_npqtail = m0;
-       m0->m_nextpkt = NULL;
-       sc->sc_npqtail = &m0->m_nextpkt;
+        ml_enqueue(&sc->sc_npqueue, m0);
     } else {
        IFQ_ENQUEUE(&sc->sc_if.if_snd, m0, error);
        if (error) {
@@ -801,13 +797,14 @@ bad:
 static void
 ppp_requeue(struct ppp_softc *sc)
 {
-    struct mbuf *m, **mpp;
+    struct mbuf_list ml = MBUF_LIST_INITIALIZER();
+    struct mbuf *m;
     enum NPmode mode;
     int error;
 
     splsoftassert(IPL_SOFTNET);
 
-    for (mpp = &sc->sc_npqueue; (m = *mpp) != NULL; ) {
+    while ((m = ml_dequeue(&sc->sc_npqueue)) != NULL) {
        switch (PPP_PROTOCOL(mtod(m, u_char *))) {
        case PPP_IP:
            mode = sc->sc_npmode[NP_IP];
@@ -818,11 +815,6 @@ ppp_requeue(struct ppp_softc *sc)
 
        switch (mode) {
        case NPMODE_PASS:
-           /*
-            * This packet can now go on one of the queues to be sent.
-            */
-           *mpp = m->m_nextpkt;
-           m->m_nextpkt = NULL;
            IFQ_ENQUEUE(&sc->sc_if.if_snd, m, error);
            if (error) {
                sc->sc_if.if_oerrors++;
@@ -832,16 +824,15 @@ ppp_requeue(struct ppp_softc *sc)
 
        case NPMODE_DROP:
        case NPMODE_ERROR:
-           *mpp = m->m_nextpkt;
            m_freem(m);
            break;
 
        case NPMODE_QUEUE:
-           mpp = &m->m_nextpkt;
+           ml_enqueue(&ml, m);
            break;
        }
     }
-    sc->sc_npqtail = mpp;
+    sc->sc_npqueue = ml;
 }
 
 /*
Index: if_pppvar.h
===================================================================
RCS file: /cvs/src/sys/net/if_pppvar.h,v
retrieving revision 1.17
diff -u -p -r1.17 if_pppvar.h
--- if_pppvar.h 3 Jun 2015 00:50:09 -0000       1.17
+++ if_pppvar.h 3 Nov 2015 06:28:46 -0000
@@ -111,8 +111,7 @@ struct ppp_softc {
        struct  mbuf_queue sc_inq;      /* queue of input packets for daemon */
        struct  ifqueue sc_fastq;       /* interactive output packet q */
        struct  mbuf *sc_togo;          /* output packet ready to go */
-       struct  mbuf *sc_npqueue;       /* output packets not to be sent yet */
-       struct  mbuf **sc_npqtail;      /* ptr to last next ptr in npqueue */
+       struct  mbuf_list sc_npqueue;   /* output packets not to be sent yet */
        struct  pppstat sc_stats;       /* count of bytes/pkts sent/rcvd */
        caddr_t sc_bpf;                 /* hook for BPF */
        enum    NPmode sc_npmode[NUM_NP]; /* what to do with each NP */

Reply via email to