summaryrefslogtreecommitdiff
path: root/sys/net/if_ppp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net/if_ppp.c')
-rw-r--r--sys/net/if_ppp.c33
1 files changed, 11 insertions, 22 deletions
diff --git a/sys/net/if_ppp.c b/sys/net/if_ppp.c
index fe076efe759..4f82e231fe6 100644
--- a/sys/net/if_ppp.c
+++ b/sys/net/if_ppp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ppp.c,v 1.94 2015/11/05 10:53:54 dlg Exp $ */
+/* $OpenBSD: if_ppp.c,v 1.95 2015/11/06 07:07:19 dlg Exp $ */
/* $NetBSD: if_ppp.c,v 1.39 1997/05/17 21:11:59 christos Exp $ */
/*
@@ -295,8 +295,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;
@@ -309,7 +308,6 @@ void
pppdealloc(struct ppp_softc *sc)
{
struct ppp_pkt *pkt;
- struct mbuf *m;
splsoftassert(IPL_SOFTNET);
@@ -320,10 +318,7 @@ pppdealloc(struct ppp_softc *sc)
while ((pkt = ppp_pkt_dequeue(&sc->sc_rawq)) != NULL)
ppp_pkt_free(pkt);
mq_purge(&sc->sc_inq);
- 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;
@@ -787,9 +782,7 @@ pppoutput(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst,
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) {
@@ -811,6 +804,8 @@ bad:
return (error);
}
+
+
/*
* After a change in the NPmode for some NP, move packets from the
* npqueue to the send queue or the fast queue as appropriate.
@@ -819,13 +814,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];
@@ -836,12 +832,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++;
@@ -851,16 +841,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;
}
/*