📄 patch.ppp_tty.c
字号:
--- sys.stable/net/ppp_tty.c Fri Apr 16 16:14:38 1999+++ /usr/src/synclink/bsd2/ppp_tty.c Thu Apr 15 14:40:51 1999@@ -113,7 +113,10 @@ static int pppinput __P((int c, struct tty *tp)); static int pppstart __P((struct tty *tp)); +static void ppprcvframe __P((struct ppp_softc *sc, struct mbuf *m));+ static u_short pppfcs __P((u_short fcs, u_char *cp, int len));+static void pppsyncstart __P((register struct ppp_softc *sc)); static void pppasyncstart __P((struct ppp_softc *)); static void pppasyncctlp __P((struct ppp_softc *)); static void pppasyncrelinq __P((struct ppp_softc *));@@ -121,6 +124,7 @@ static void ppp_timeout __P((void *)); static void pppgetm __P((struct ppp_softc *sc)); static void ppplogchar __P((struct ppp_softc *, int));+static void pppdumpframe __P((struct ppp_softc *sc,struct mbuf* m,int xmit)); /* XXX called from if_ppp.c - layering violation */ void pppasyncattach __P((void *));@@ -473,6 +477,10 @@ error = 0; switch (cmd) {+ case TIOCRCVFRAME:+ ppprcvframe(sc,*((struct mbuf **)data));+ break;+ case PPPIOCSASYNCMAP: if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) break;@@ -517,6 +525,111 @@ return error; } +/* receive a complete ppp frame from device in synchronous+ * hdlc mode. caller gives up ownership of mbuf+ */+static void ppprcvframe(struct ppp_softc *sc, struct mbuf *m)+{+ int len, s;+ struct mbuf *n;+ u_char hdr[4];+ int hlen,count;+ + for (n=m,len=0;n != NULL;n = n->m_next)+ len += n->m_len;+ if (len==0) {+ m_freem(m);+ return;+ }+ + /* extract PPP header from mbuf chain (1 to 4 bytes) */+ for (n=m,hlen=0;n!=NULL && hlen<sizeof(hdr);n=n->m_next) {+ count = (sizeof(hdr)-hlen) < n->m_len ?+ sizeof(hdr)-hlen : n->m_len;+ bcopy(mtod(n,u_char*),&hdr[hlen],count);+ hlen+=count;+ }+ + s = spltty();+ + /* if AFCF compressed then prepend AFCF */+ if (hdr[0] != PPP_ALLSTATIONS) {+ if (sc->sc_flags & SC_REJ_COMP_AC) {+ if (sc->sc_flags & SC_DEBUG)+ printf("ppp%d: garbage received: 0x%x (need 0xFF)\n",+ sc->sc_if.if_unit, hdr[0]);+ goto bail;+ }+ M_PREPEND(m,2,M_DONTWAIT); + if (m==NULL) {+ splx(s);+ return;+ }+ hdr[3] = hdr[1];+ hdr[2] = hdr[0];+ hdr[0] = PPP_ALLSTATIONS;+ hdr[1] = PPP_UI;+ len += 2;+ }++ /* if protocol field compressed, add MSB of protocol field = 0 */+ if (hdr[2] & 1) {+ /* a compressed protocol */+ M_PREPEND(m,1,M_DONTWAIT); + if (m==NULL) {+ splx(s);+ return;+ }+ hdr[3] = hdr[2];+ hdr[2] = 0;+ len++;+ } + + /* valid LSB of protocol field has bit0 set */+ if (!(hdr[3] & 1)) {+ if (sc->sc_flags & SC_DEBUG)+ printf("ppp%d: bad protocol %x\n", sc->sc_if.if_unit,+ (hdr[2] << 8) + hdr[3]);+ goto bail;+ }+ + /* packet beyond configured mru? */+ if (len > sc->sc_mru + PPP_HDRLEN) {+ if (sc->sc_flags & SC_DEBUG)+ printf("ppp%d: packet too big\n", sc->sc_if.if_unit);+ goto bail;+ }+ + /* add expanded 4 byte header to mbuf chain */+ for (n=m,hlen=0;n!=NULL && hlen<sizeof(hdr);n=n->m_next) {+ count = (sizeof(hdr)-hlen) < n->m_len ?+ sizeof(hdr)-hlen : n->m_len;+ bcopy(&hdr[hlen],mtod(n,u_char*),count);+ hlen+=count;+ }+ + /* if_ppp.c requires the PPP header and IP header */+ /* to be contiguous */+ count = len < MHLEN ? len : MHLEN;+ if (m->m_len < count) {+ m = m_pullup(m,count);+ if (m==NULL)+ goto bail;+ }+ + sc->sc_stats.ppp_ibytes += len;+ + if (sc->sc_flags & SC_LOG_RAWIN)+ pppdumpframe(sc,m,0);+ + ppppktin(sc, m, 0);+ splx(s);+ return;+bail: + m_freem(m);+ splx(s);+}+ /* * FCS lookup table as calculated by genfcstab. */@@ -566,6 +679,39 @@ return (fcs); } +/* This gets called at splsoftnet from pppasyncstart at various times+ * when there is data ready to be sent.+ */+static void pppsyncstart(register struct ppp_softc *sc)+{+ struct tty *tp = (struct tty *) sc->sc_devp;+ struct mbuf *m, *n;+ int len;+ + for(m = sc->sc_outm;;) {+ if (m == NULL) {+ m = ppp_dequeue(sc); /* get new packet */+ if (m == NULL)+ break; /* no more packets */+ if (sc->sc_flags & SC_DEBUG)+ pppdumpframe(sc,m,1);+ }+ microtime(&sc->sc_if.if_lastchange);+ for(n=m,len=0;n!=NULL;n=n->m_next)+ len += n->m_len;+ + /* call device driver IOCTL to transmit a frame */+ if ((*cdevsw[major(tp->t_dev)]->d_ioctl)+ (tp->t_dev,TIOCXMTFRAME,(caddr_t)&m,0,0)) {+ /* busy or error, set as current packet */+ sc->sc_outm = m;+ break;+ }+ sc->sc_outm = m = NULL;+ sc->sc_stats.ppp_obytes += len;+ }+}+ /* * This gets called at splsoftnet from if_ppp.c at various times * when there is data ready to be sent.@@ -582,6 +728,11 @@ struct mbuf *m2; int s; + if (sc->sc_flags & SC_SYNC){+ pppsyncstart(sc);+ return;+ }+ idle = 0; /* XXX assumes atomic access to *tp although we're not at spltty(). */ while (CCOUNT(&tp->t_outq) < PPP_HIWAT) {@@ -1125,6 +1276,44 @@ sc->sc_rawin_count, sc->sc_rawin, " "); sc->sc_rawin_count = 0; }+}++static void pppdumpframe(struct ppp_softc *sc,struct mbuf* m,int xmit)+{+ int i,lcount,copycount,count;+ char lbuf[16];+ char *data;+ + if (m == NULL)+ return;+ + for(count=m->m_len,data=mtod(m,char*);m != NULL;) {+ /* build a line of output */+ for(lcount=0;lcount < sizeof(lbuf);lcount += copycount) {+ if (!count) {+ m = m->m_next;+ if (m == NULL)+ break;+ count = m->m_len;+ data = mtod(m,char*);+ }+ copycount = (count > sizeof(lbuf)-lcount) ?+ sizeof(lbuf)-lcount : count;+ bcopy(data,&lbuf[lcount],copycount);+ data += copycount;+ count -= copycount;+ }++ /* output line (hex 1st, then ascii) */ + printf("ppp%d %s:",sc->sc_if.if_unit,xmit ? "output":"input ");+ for(i=0;i<lcount;i++)+ printf("%02x ",(u_char)lbuf[i]);+ for(;i<sizeof(lbuf);i++)+ printf(" ");+ for(i=0;i<lcount;i++)+ printf("%c",(lbuf[i]>=040 && lbuf[i]<=0176)?lbuf[i]:'.');+ printf("\n");+ } } #endif /* NPPP > 0 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -