X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=netbsd-1.1%2Fif_ppp.c;h=7a32ab406f7ecd6e6b4aa134c185fca08cbb63cf;hp=f17a09d5a1dcf560fd4b8a68de4a0e4b1d8b8d31;hb=2e5bd580090480746b8193eb83f2cec41552d28f;hpb=7005827d79039deaac4646047fb08992e47d6b59 diff --git a/netbsd-1.1/if_ppp.c b/netbsd-1.1/if_ppp.c index f17a09d..7a32ab4 100644 --- a/netbsd-1.1/if_ppp.c +++ b/netbsd-1.1/if_ppp.c @@ -1,4 +1,4 @@ -/* $Id: if_ppp.c,v 1.1 1995/12/11 05:17:06 paulus Exp $ */ +/* $Id: if_ppp.c,v 1.6 1997/03/04 03:33:00 paulus Exp $ */ /* * if_ppp.c - Point-to-Point Protocol (PPP) Asynchronous driver. @@ -86,8 +86,11 @@ #include #include #include +#include +#include +#include -#ifdef i386 +#if NetBSD1_0 && defined(i386) #include #endif @@ -105,7 +108,6 @@ #include "bpfilter.h" #if NBPFILTER > 0 -#include #include #endif @@ -118,22 +120,21 @@ #include #include +#if NetBSD1_0 +#define splsoftnet splnet +#endif + #ifdef PPP_COMPRESS #define PACKETPTR struct mbuf * #include #endif -void pppattach __P((void)); -int pppioctl __P((struct ppp_softc *sc, u_long cmd, caddr_t data, int flag, - struct proc *)); -int pppoutput __P((struct ifnet *ifp, struct mbuf *m0, - struct sockaddr *dst, struct rtentry *rtp)); -int pppsioctl __P((struct ifnet *ifp, u_long cmd, caddr_t data)); -void pppintr __P((void)); - +static int pppsioctl __P((struct ifnet *, u_long, caddr_t)); +static int pppoutput __P((struct ifnet *, struct mbuf *, + struct sockaddr *, struct rtentry *)); static void ppp_requeue __P((struct ppp_softc *)); static void ppp_outpkt __P((struct ppp_softc *)); -static int ppp_ccp __P((struct ppp_softc *, struct mbuf *m, int rcvd)); +static void ppp_ccp __P((struct ppp_softc *, struct mbuf *m, int rcvd)); static void ppp_ccp_closed __P((struct ppp_softc *)); static void ppp_inproc __P((struct ppp_softc *, struct mbuf *)); static void pppdumpm __P((struct mbuf *m0)); @@ -166,15 +167,20 @@ static void pppdumpm __P((struct mbuf *m0)); */ extern struct compressor ppp_bsd_compress; +extern struct compressor ppp_deflate; struct compressor *ppp_compressors[8] = { #if DO_BSD_COMPRESS &ppp_bsd_compress, +#endif +#if DO_DEFLATE + &ppp_deflate, #endif NULL }; #endif /* PPP_COMPRESS */ + /* * Called from boot code to establish ppp interfaces. */ @@ -203,6 +209,17 @@ pppattach() #endif } +#if NetBSD1_0 && defined(i386) + /* + * XXX kludge to fix the bug in the i386 interrupt handling code, + * where software interrupts could be taken while hardware + * interrupts were blocked. + */ + if ((imask[IPL_TTY] & (1 << SIR_NET)) == 0) { + imask[IPL_TTY] |= (1 << SIR_NET); + intr_calculatemasks(); + } +#endif } /* @@ -229,8 +246,12 @@ pppalloc(pid) sc->sc_flags = 0; sc->sc_mru = PPP_MRU; sc->sc_relinq = NULL; + bzero((char *)&sc->sc_stats, sizeof(sc->sc_stats)); #ifdef VJC - sl_compress_init(&sc->sc_comp, -1); + MALLOC(sc->sc_comp, struct slcompress *, sizeof(struct slcompress), + M_DEVBUF, M_NOWAIT); + if (sc->sc_comp) + sl_compress_init(sc->sc_comp, -1); #endif #ifdef PPP_COMPRESS sc->sc_xc_state = NULL; @@ -289,6 +310,12 @@ pppdealloc(sc) sc->sc_xc_state = NULL; sc->sc_rc_state = NULL; #endif /* PPP_COMPRESS */ +#ifdef VJC + if (sc->sc_comp != 0) { + FREE(sc->sc_comp, M_DEVBUF); + sc->sc_comp = 0; + } +#endif } /* @@ -325,7 +352,7 @@ pppioctl(sc, cmd, data, flag, p) break; case PPPIOCSFLAGS: - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) return (error); flags = *(int *)data & SC_MASK; s = splsoftnet(); @@ -333,13 +360,13 @@ pppioctl(sc, cmd, data, flag, p) if (sc->sc_flags & SC_CCP_OPEN && !(flags & SC_CCP_OPEN)) ppp_ccp_closed(sc); #endif - splhigh(); + splimp(); sc->sc_flags = (sc->sc_flags & ~SC_MASK) | flags; splx(s); break; case PPPIOCSMRU: - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) return (error); mru = *(int *)data; if (mru >= PPP_MRU && mru <= PPP_MAXMRU) @@ -352,29 +379,31 @@ pppioctl(sc, cmd, data, flag, p) #ifdef VJC case PPPIOCSMAXCID: - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) return (error); - s = splsoftnet(); - sl_compress_init(&sc->sc_comp, *(int *)data); - splx(s); + if (sc->sc_comp) { + s = splsoftnet(); + sl_compress_init(sc->sc_comp, *(int *)data); + splx(s); + } break; #endif case PPPIOCXFERUNIT: - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) return (error); sc->sc_xfer = p->p_pid; break; #ifdef PPP_COMPRESS case PPPIOCSCOMPRESS: - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) return (error); odp = (struct ppp_option_data *) data; nb = odp->length; if (nb > sizeof(ccp_option)) nb = sizeof(ccp_option); - if (error = copyin(odp->ptr, ccp_option, nb)) + if ((error = copyin(odp->ptr, ccp_option, nb)) != 0) return (error); if (ccp_option[1] < 2) /* preliminary check on the length byte */ return (EINVAL); @@ -397,7 +426,7 @@ pppioctl(sc, cmd, data, flag, p) sc->sc_if.if_unit); error = ENOBUFS; } - splhigh(); + splimp(); sc->sc_flags &= ~SC_COMP_RUN; splx(s); } else { @@ -412,7 +441,7 @@ pppioctl(sc, cmd, data, flag, p) sc->sc_if.if_unit); error = ENOBUFS; } - splhigh(); + splimp(); sc->sc_flags &= ~SC_DECOMP_RUN; splx(s); } @@ -438,7 +467,7 @@ pppioctl(sc, cmd, data, flag, p) if (cmd == PPPIOCGNPMODE) { npi->mode = sc->sc_npmode[npx]; } else { - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) return (error); if (npi->mode != sc->sc_npmode[npx]) { s = splsoftnet(); @@ -460,6 +489,40 @@ pppioctl(sc, cmd, data, flag, p) splx(s); break; +#if 0 + case PPPIOCSPASS: + case PPPIOCSACTIVE: + nbp = (struct bpf_program *) data; + if ((unsigned) nbp->bf_len > BPF_MAXINSNS) + return EINVAL; + newcodelen = nbp->bf_len * sizeof(struct bpf_insn); + if (newcodelen != 0) { + MALLOC(newcode, struct bpf_insn *, newcodelen, M_DEVBUF, M_WAITOK); + if (newcode == 0) { + return EINVAL; /* or sumpin */ + } + if ((error = copyin((caddr_t)nbp->bf_insns, (caddr_t)newcode, + newcodelen)) != 0) { + FREE(newcode, M_DEVBUF); + return error; + } + if (!bpf_validate(newcode, nbp->bf_len)) { + FREE(newcode, M_DEVBUF); + return EINVAL; + } + } else + newcode = 0; + bp = (cmd == PPPIOCSPASS)? &sc->sc_pass_filt: &sc->sc_active_filt; + oldcode = bp->bf_insns; + s = splimp(); + bp->bf_len = nbp->bf_len; + bp->bf_insns = newcode; + splx(s); + if (oldcode != 0) + FREE(oldcode, M_DEVBUF); + break; +#endif + default: return (-1); } @@ -469,7 +532,7 @@ pppioctl(sc, cmd, data, flag, p) /* * Process an ioctl request to the ppp network interface. */ -int +static int pppsioctl(ifp, cmd, data) register struct ifnet *ifp; u_long cmd; @@ -502,7 +565,7 @@ pppsioctl(ifp, cmd, data) break; case SIOCSIFMTU: - if (error = suser(p->p_ucred, &p->p_acflag)) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) break; sc->sc_if.if_mtu = ifr->ifr_mtu; break; @@ -513,6 +576,10 @@ pppsioctl(ifp, cmd, data) case SIOCADDMULTI: case SIOCDELMULTI: + if (ifr == 0) { + error = EAFNOSUPPORT; + break; + } switch(ifr->ifr_addr.sa_family) { #ifdef INET case AF_INET: @@ -527,21 +594,18 @@ pppsioctl(ifp, cmd, data) case SIOCGPPPSTATS: psp = &((struct ifpppstatsreq *) data)->stats; bzero(psp, sizeof(*psp)); - psp->p.ppp_ibytes = sc->sc_bytesrcvd; - psp->p.ppp_ipackets = ifp->if_ipackets; - psp->p.ppp_ierrors = ifp->if_ierrors; - psp->p.ppp_obytes = sc->sc_bytessent; - psp->p.ppp_opackets = ifp->if_opackets; - psp->p.ppp_oerrors = ifp->if_oerrors; -#ifdef VJC - psp->vj.vjs_packets = sc->sc_comp.sls_packets; - psp->vj.vjs_compressed = sc->sc_comp.sls_compressed; - psp->vj.vjs_searches = sc->sc_comp.sls_searches; - psp->vj.vjs_misses = sc->sc_comp.sls_misses; - psp->vj.vjs_uncompressedin = sc->sc_comp.sls_uncompressedin; - psp->vj.vjs_compressedin = sc->sc_comp.sls_compressedin; - psp->vj.vjs_errorin = sc->sc_comp.sls_errorin; - psp->vj.vjs_tossed = sc->sc_comp.sls_tossed; + psp->p = sc->sc_stats; +#if defined(VJC) && !defined(SL_NO_STATS) + if (sc->sc_comp) { + psp->vj.vjs_packets = sc->sc_comp->sls_packets; + psp->vj.vjs_compressed = sc->sc_comp->sls_compressed; + psp->vj.vjs_searches = sc->sc_comp->sls_searches; + psp->vj.vjs_misses = sc->sc_comp->sls_misses; + psp->vj.vjs_uncompressedin = sc->sc_comp->sls_uncompressedin; + psp->vj.vjs_compressedin = sc->sc_comp->sls_compressedin; + psp->vj.vjs_errorin = sc->sc_comp->sls_errorin; + psp->vj.vjs_tossed = sc->sc_comp->sls_tossed; + } #endif /* VJC */ break; @@ -575,16 +639,17 @@ pppoutput(ifp, m0, dst, rtp) struct rtentry *rtp; { register struct ppp_softc *sc = &ppp_softc[ifp->if_unit]; - struct ppp_header *ph; int protocol, address, control; u_char *cp; int s, error; struct ip *ip; struct ifqueue *ifq; enum NPmode mode; + int len; + struct mbuf *m; if (sc->sc_devp == NULL || (ifp->if_flags & IFF_RUNNING) == 0 - || (ifp->if_flags & IFF_UP) == 0 && dst->sa_family != AF_UNSPEC) { + || ((ifp->if_flags & IFF_UP) == 0 && dst->sa_family != AF_UNSPEC)) { error = ENETDOWN; /* sort of */ goto bad; } @@ -655,11 +720,22 @@ pppoutput(ifp, m0, dst, rtp) *cp++ = protocol & 0xff; m0->m_len += PPP_HDRLEN; + len = 0; + for (m = m0; m != 0; m = m->m_next) + len += m->m_len; + if (sc->sc_flags & SC_LOG_OUTPKT) { printf("ppp%d output: ", ifp->if_unit); pppdumpm(m0); } + if ((protocol & 0x8000) == 0) { + /* + * Update the time we sent the most recent data packet. + */ + sc->sc_last_sent = time.tv_sec; + } + #if NBPFILTER > 0 /* * See if bpf wants to look at the packet. @@ -683,6 +759,7 @@ pppoutput(ifp, m0, dst, rtp) IF_DROP(ifq); splx(s); sc->sc_if.if_oerrors++; + sc->sc_stats.ppp_oerrors++; error = ENOBUFS; goto bad; } @@ -690,6 +767,8 @@ pppoutput(ifp, m0, dst, rtp) (*sc->sc_start)(sc); } ifp->if_lastchange = time; + ifp->if_opackets++; + ifp->if_obytes += len; splx(s); return (0); @@ -732,6 +811,7 @@ ppp_requeue(sc) if (IF_QFULL(ifq)) { IF_DROP(ifq); sc->sc_if.if_oerrors++; + sc->sc_stats.ppp_oerrors++; } else IF_ENQUEUE(ifq, m); break; @@ -751,78 +831,34 @@ ppp_requeue(sc) } /* - * Get a packet to send. This procedure is intended to be called at - * spltty or splimp, so it takes little time. If there isn't a packet - * waiting to go out, it schedules a software interrupt to prepare a - * new packet; the device start routine gets called again when a - * packet is ready. + * Transmitter has finished outputting some stuff; + * remember to call sc->sc_start later at splsoftnet. */ -struct mbuf * -ppp_dequeue(sc) +void +ppp_restart(sc) struct ppp_softc *sc; { - struct mbuf *m; - int s = splhigh(); + int s = splimp(); - m = sc->sc_togo; - if (m) { - /* - * Had a packet waiting - send it. - */ - sc->sc_togo = NULL; - sc->sc_flags |= SC_TBUSY; - splx(s); - return m; - } - /* - * Remember we wanted a packet and schedule a software interrupt. - */ sc->sc_flags &= ~SC_TBUSY; schednetisr(NETISR_PPP); splx(s); - return NULL; } /* - * Software interrupt routine, called at splsoftnet. - */ -void -pppintr() -{ - struct ppp_softc *sc; - int i, s; - struct mbuf *m; - - sc = ppp_softc; - for (i = 0; i < NPPP; ++i, ++sc) { - if (!(sc->sc_flags & SC_TBUSY) && sc->sc_togo == NULL - && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head)) - ppp_outpkt(sc); - for (;;) { - s = splhigh(); - IF_DEQUEUE(&sc->sc_rawq, m); - splx(s); - if (m == NULL) - break; - ppp_inproc(sc, m); - } - } -} - -/* - * Grab another packet off a queue and apply VJ compression, - * packet compression, address/control and/or protocol compression - * if enabled. Should be called at splsoftnet. + * Get a packet to send. This procedure is intended to be called at + * splsoftnet, since it may involve time-consuming operations such as + * applying VJ compression, packet compression, address/control and/or + * protocol field compression to the packet. */ -static void -ppp_outpkt(sc) +struct mbuf * +ppp_dequeue(sc) struct ppp_softc *sc; { - int s; struct mbuf *m, *mp; u_char *cp; int address, control, protocol; - enum NPmode mode; + int s; /* * Grab a packet to send: first try the fast queue, then the @@ -832,7 +868,9 @@ ppp_outpkt(sc) if (m == NULL) IF_DEQUEUE(&sc->sc_if.if_snd, m); if (m == NULL) - return; + return NULL; + + ++sc->sc_stats.ppp_opackets; /* * Extract the ppp header of the new packet. @@ -845,16 +883,11 @@ ppp_outpkt(sc) switch (protocol) { case PPP_IP: - /* - * Update the time we sent the most recent packet. - */ - sc->sc_last_sent = time.tv_sec; - #ifdef VJC /* * If the packet is a TCP/IP packet, see if we can compress it. */ - if (sc->sc_flags & SC_COMP_TCP) { + if ((sc->sc_flags & SC_COMP_TCP) && sc->sc_comp != NULL) { struct ip *ip; int type; @@ -868,7 +901,7 @@ ppp_outpkt(sc) } /* this code assumes the IP/TCP header is in one non-shared mbuf */ if (ip->ip_p == IPPROTO_TCP) { - type = sl_compress_tcp(mp, ip, &sc->sc_comp, + type = sl_compress_tcp(mp, ip, sc->sc_comp, !(sc->sc_flags & SC_NO_TCP_CCID)); switch (type) { case TYPE_UNCOMPRESSED_TCP: @@ -905,13 +938,18 @@ ppp_outpkt(sc) for (mp = m; mp != NULL; mp = mp->m_next) slen += mp->m_len; clen = (*sc->sc_xcomp->compress) - (sc->sc_xc_state, &mcomp, m, slen, - (sc->sc_flags & SC_CCP_UP? sc->sc_if.if_mtu: 0)); + (sc->sc_xc_state, &mcomp, m, slen, sc->sc_if.if_mtu + PPP_HDRLEN); if (mcomp != NULL) { - m_freem(m); - m = mcomp; - cp = mtod(m, u_char *); - protocol = cp[3]; + if (sc->sc_flags & SC_CCP_UP) { + /* Send the compressed packet instead of the original. */ + m_freem(m); + m = mcomp; + cp = mtod(m, u_char *); + protocol = cp[3]; + } else { + /* Can't transmit compressed packets until CCP is up. */ + m_freem(mcomp); + } } } #endif /* PPP_COMPRESS */ @@ -936,8 +974,39 @@ ppp_outpkt(sc) --m->m_len; } - sc->sc_togo = m; - (*sc->sc_start)(sc); + return m; +} + +/* + * Software interrupt routine, called at splsoftnet. + */ +void +pppintr() +{ + struct ppp_softc *sc; + int i, s, s2; + struct mbuf *m; + + sc = ppp_softc; + s = splsoftnet(); + for (i = 0; i < NPPP; ++i, ++sc) { + if (!(sc->sc_flags & SC_TBUSY) + && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head)) { + s2 = splimp(); + sc->sc_flags |= SC_TBUSY; + splx(s2); + (*sc->sc_start)(sc); + } + for (;;) { + s2 = splimp(); + IF_DEQUEUE(&sc->sc_rawq, m); + splx(s2); + if (m == NULL) + break; + ppp_inproc(sc, m); + } + } + splx(s); } #ifdef PPP_COMPRESS @@ -945,7 +1014,7 @@ ppp_outpkt(sc) * Handle a CCP packet. `rcvd' is 1 if the packet was received, * 0 if it is about to be transmitted. */ -static int +static void ppp_ccp(sc, m, rcvd) struct ppp_softc *sc; struct mbuf *m; @@ -974,7 +1043,7 @@ ppp_ccp(sc, m, rcvd) slen = CCP_LENGTH(dp); if (dp + slen > ep) { if (sc->sc_flags & SC_DEBUG) - printf("if_ppp/ccp: not enough data in mbuf (%x+%x > %x+%x)\n", + printf("if_ppp/ccp: not enough data in mbuf (%p+%x > %p+%x)\n", dp, slen, mtod(mp, u_char *), mp->m_len); return; } @@ -985,7 +1054,7 @@ ppp_ccp(sc, m, rcvd) case CCP_TERMACK: /* CCP must be going down - disable compression */ if (sc->sc_flags & SC_CCP_UP) { - s = splhigh(); + s = splimp(); sc->sc_flags &= ~(SC_CCP_UP | SC_COMP_RUN | SC_DECOMP_RUN); splx(s); } @@ -1001,7 +1070,7 @@ ppp_ccp(sc, m, rcvd) && (*sc->sc_xcomp->comp_init) (sc->sc_xc_state, dp + CCP_HDRLEN, slen - CCP_HDRLEN, sc->sc_if.if_unit, 0, sc->sc_flags & SC_DEBUG)) { - s = splhigh(); + s = splimp(); sc->sc_flags |= SC_COMP_RUN; splx(s); } @@ -1012,7 +1081,7 @@ ppp_ccp(sc, m, rcvd) (sc->sc_rc_state, dp + CCP_HDRLEN, slen - CCP_HDRLEN, sc->sc_if.if_unit, 0, sc->sc_mru, sc->sc_flags & SC_DEBUG)) { - s = splhigh(); + s = splimp(); sc->sc_flags |= SC_DECOMP_RUN; sc->sc_flags &= ~(SC_DC_ERROR | SC_DC_FERROR); splx(s); @@ -1029,7 +1098,7 @@ ppp_ccp(sc, m, rcvd) } else { if (sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN)) { (*sc->sc_rcomp->decomp_reset)(sc->sc_rc_state); - s = splhigh(); + s = splimp(); sc->sc_flags &= ~SC_DC_ERROR; splx(s); } @@ -1069,7 +1138,7 @@ ppppktin(sc, m, lost) struct mbuf *m; int lost; { - int s = splhigh(); + int s = splimp(); if (lost) m->m_flags |= M_ERRMARK; @@ -1098,8 +1167,7 @@ ppp_inproc(sc, m) u_char *iphdr; u_int hlen; - ifp->if_ipackets++; - ifp->if_lastchange = time; + sc->sc_stats.ppp_ipackets++; if (sc->sc_flags & SC_LOG_INPKT) { ilen = 0; @@ -1116,7 +1184,7 @@ ppp_inproc(sc, m) if (m->m_flags & M_ERRMARK) { m->m_flags &= ~M_ERRMARK; - s = splhigh(); + s = splimp(); sc->sc_flags |= SC_VJ_RESET; splx(s); } @@ -1148,7 +1216,7 @@ ppp_inproc(sc, m) */ if (sc->sc_flags & SC_DEBUG) printf("ppp%d: decompress failed %d\n", ifp->if_unit, rv); - s = splhigh(); + s = splimp(); sc->sc_flags |= SC_VJ_RESET; if (rv == DECOMP_ERROR) sc->sc_flags |= SC_DC_ERROR; @@ -1177,8 +1245,9 @@ ppp_inproc(sc, m) * If we've missed a packet, we must toss subsequent compressed * packets which don't have an explicit connection ID. */ - sl_uncompress_tcp(NULL, 0, TYPE_ERROR, &sc->sc_comp); - s = splhigh(); + if (sc->sc_comp) + sl_uncompress_tcp(NULL, 0, TYPE_ERROR, sc->sc_comp); + s = splimp(); sc->sc_flags &= ~SC_VJ_RESET; splx(s); } @@ -1187,12 +1256,12 @@ ppp_inproc(sc, m) * See if we have a VJ-compressed packet to uncompress. */ if (proto == PPP_VJC_COMP) { - if (sc->sc_flags & SC_REJ_COMP_TCP) + if ((sc->sc_flags & SC_REJ_COMP_TCP) || sc->sc_comp == 0) goto bad; xlen = sl_uncompress_tcp_core(cp + PPP_HDRLEN, m->m_len - PPP_HDRLEN, ilen - PPP_HDRLEN, TYPE_COMPRESSED_TCP, - &sc->sc_comp, &iphdr, &hlen); + sc->sc_comp, &iphdr, &hlen); if (xlen <= 0) { if (sc->sc_flags & SC_DEBUG) @@ -1239,12 +1308,12 @@ ppp_inproc(sc, m) ilen += hlen - xlen; } else if (proto == PPP_VJC_UNCOMP) { - if (sc->sc_flags & SC_REJ_COMP_TCP) + if ((sc->sc_flags & SC_REJ_COMP_TCP) || sc->sc_comp == 0) goto bad; xlen = sl_uncompress_tcp_core(cp + PPP_HDRLEN, m->m_len - PPP_HDRLEN, ilen - PPP_HDRLEN, TYPE_UNCOMPRESSED_TCP, - &sc->sc_comp, &iphdr, &hlen); + sc->sc_comp, &iphdr, &hlen); if (xlen < 0) { if (sc->sc_flags & SC_DEBUG) @@ -1274,6 +1343,13 @@ ppp_inproc(sc, m) m->m_pkthdr.len = ilen; m->m_pkthdr.rcvif = ifp; + /* + * Record the time that we received this packet. + */ + if ((proto & 0x8000) == 0) { + sc->sc_last_recv = time.tv_sec; + } + #if NBPFILTER > 0 /* See if bpf wants to look at the packet. */ if (sc->sc_bpf) @@ -1298,7 +1374,6 @@ ppp_inproc(sc, m) m->m_len -= PPP_HDRLEN; schednetisr(NETISR_IP); inq = &ipintrq; - sc->sc_last_recv = time.tv_sec; /* update time of last pkt rcvd */ break; #endif @@ -1314,7 +1389,7 @@ ppp_inproc(sc, m) /* * Put the packet on the appropriate input queue. */ - s = splhigh(); + s = splimp(); if (IF_QFULL(inq)) { IF_DROP(inq); splx(s); @@ -1325,6 +1400,9 @@ ppp_inproc(sc, m) } IF_ENQUEUE(inq, m); splx(s); + ifp->if_ipackets++; + ifp->if_ibytes += ilen; + ifp->if_lastchange = time; if (rv) (*sc->sc_ctlp)(sc); @@ -1334,6 +1412,7 @@ ppp_inproc(sc, m) bad: m_freem(m); sc->sc_if.if_ierrors++; + sc->sc_stats.ppp_ierrors++; } #define MAX_DUMP_BYTES 128