Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Sync if if_sl.c,v 1.66:



details:   https://anonhg.NetBSD.org/src/rev/032896a77a5d
branches:  trunk
changeset: 502119:032896a77a5d
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Thu Jan 11 22:56:51 2001 +0000

description:
Sync if if_sl.c,v 1.66:

Move the VJ uncompress code into the software interrupt.

diffstat:

 sys/net/if_strip.c |  208 ++++++++++++++++++++++++++++------------------------
 1 files changed, 110 insertions(+), 98 deletions(-)

diffs (270 lines):

diff -r afb49dc115f6 -r 032896a77a5d sys/net/if_strip.c
--- a/sys/net/if_strip.c        Thu Jan 11 22:46:40 2001 +0000
+++ b/sys/net/if_strip.c        Thu Jan 11 22:56:51 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_strip.c,v 1.29 2001/01/11 22:31:49 thorpej Exp $    */
+/*     $NetBSD: if_strip.c,v 1.30 2001/01/11 22:56:51 thorpej Exp $    */
 /*     from: NetBSD: if_sl.c,v 1.38 1996/02/13 22:00:23 christos Exp $ */
 
 /*
@@ -1077,43 +1077,25 @@
 {
        struct mbuf *m;
 
-       MGETHDR(m, M_DONTWAIT, MT_DATA);
-       if (m == NULL)
-               return (NULL);
-
        /*
-        * We always prepend enough space for the SLIP "header".
-        */
-       sc->sc_pktstart -= SLIP_HDRLEN;
-       len += SLIP_HDRLEN;
-
-       /*
-        * If the packet will fit into the header mbuf we allocated
-        * above, copy it there and re-use the input buffer we already
-        * have.
+        * Allocate a new input buffer and swap.
         */
-       if (len < MHLEN)
-               memcpy(mtod(m, caddr_t), sc->sc_pktstart, len);
-       else {
-               /*
-                * Allocate a new input buffer and swap.
-                */
-               m = sc->sc_mbuf;
-               MGETHDR(sc->sc_mbuf, M_DONTWAIT, MT_DATA);
-               if (sc->sc_mbuf == NULL) {
-                       sc->sc_mbuf = m;
-                       return (NULL);
-               }
-               MCLGET(sc->sc_mbuf, M_DONTWAIT);
-               if ((sc->sc_mbuf->m_flags & M_EXT) == 0) {
-                       sc->sc_mbuf = m;
-                       return (NULL);
-               }
-               sc->sc_ep = (u_char *) sc->sc_mbuf->m_ext.ext_buf +
-                   sc->sc_mbuf->m_ext.ext_size;
+       m = sc->sc_mbuf;
+       MGETHDR(sc->sc_mbuf, M_DONTWAIT, MT_DATA);
+       if (sc->sc_mbuf == NULL) {
+               sc->sc_mbuf = m;
+               return (NULL);
+       }
+       MCLGET(sc->sc_mbuf, M_DONTWAIT);
+       if ((sc->sc_mbuf->m_flags & M_EXT) == 0) {
+               m_freem(sc->sc_mbuf);
+               sc->sc_mbuf = m;
+               return (NULL);
+       }
+       sc->sc_ep = (u_char *) sc->sc_mbuf->m_ext.ext_buf +
+           sc->sc_mbuf->m_ext.ext_size;
 
-               m->m_data = sc->sc_pktstart;
-       }
+       m->m_data = sc->sc_pktstart;
 
        m->m_pkthdr.len = m->m_len = len;
        m->m_pkthdr.rcvif = &sc->sc_if;
@@ -1137,9 +1119,6 @@
        struct mbuf *m;
        int len;
        int s;
-#if NBPFILTER > 0
-       u_char chdr[CHDR_LEN];
-#endif
 
        tk_nin++;
        sc = (struct strip_softc *)tp->t_sc;
@@ -1215,72 +1194,14 @@
                /* less than min length packet - ignore */
                goto newpack;
 
-
-#if NBPFILTER > 0
-       if (sc->sc_if.if_bpf) {
-               /*
-                * Save the compressed header, so we
-                * can tack it on later.  Note that we
-                * will end up copying garbage in some
-                * cases but this is okay.  We remember
-                * where the buffer started so we can
-                * compute the new header length.
-                */
-               bcopy(sc->sc_pktstart, chdr, CHDR_LEN);
-       }
-#endif
-
-       if ((c = (*sc->sc_pktstart & 0xf0)) != (IPVERSION << 4)) {
-               if (c & 0x80)
-                       c = TYPE_COMPRESSED_TCP;
-               else if (c == TYPE_UNCOMPRESSED_TCP)
-                       *sc->sc_pktstart &= 0x4f; /* XXX */
-               /*
-                * We've got something that's not an IP packet.
-                * If compression is enabled, try to decompress it.
-                * Otherwise, if `auto-enable' compression is on and
-                * it's a reasonable packet, decompress it and then
-                * enable compression.  Otherwise, drop it.
-                */
-               if (sc->sc_if.if_flags & SC_COMPRESS) {
-                       len = sl_uncompress_tcp(&sc->sc_pktstart, len,
-                                               (u_int)c, &sc->sc_comp);
-                       if (len <= 0)
-                               goto error;
-               } else if ((sc->sc_if.if_flags & SC_AUTOCOMP) &&
-                   c == TYPE_UNCOMPRESSED_TCP && len >= 40) {
-                       len = sl_uncompress_tcp(&sc->sc_pktstart, len,
-                                               (u_int)c, &sc->sc_comp);
-                       if (len <= 0)
-                               goto error;
-                       sc->sc_if.if_flags |= SC_COMPRESS;
-               } else
-                       goto error;
-       }
-
        m = strip_btom(sc, len);
        if (m == NULL)
                goto error;
 
-#if NBPFILTER > 0
-       if (sc->sc_if.if_bpf) {
-               /*
-                * Put the SLIP pseudo-"link header" in place.
-                * Note the space for it has already been
-                * allocated in strip_btom().
-                */
-               u_char *hp = mtod(m, u_char *);
-
-               hp[SLX_DIR] = SLIPDIR_IN;
-               memcpy(&hp[SLX_CHDR], chdr, CHDR_LEN);
-       }
-#endif
-
        IF_ENQUEUE(&sc->sc_inq, m);
        s = splimp();
        schednetisr(NETISR_STRIP);
        splx(s);
-
        goto newpack;
 
 error:
@@ -1296,7 +1217,11 @@
 {
        struct strip_softc *sc;
        struct mbuf *m;
-       int i, s;
+       int i, s, len;
+       u_char *pktstart, c;
+#if NBPFILTER > 0
+       u_char chdr[CHDR_LEN];
+#endif
 
        for (i = 0; i < NSTRIP; i++) {
                sc = &strip_softc[i];
@@ -1306,16 +1231,103 @@
                        splx(s);
                        if (m == NULL)
                                break;
+                       pktstart = mtod(m, u_char *);
+                       len = m->m_pkthdr.len;
+#if NBPFILTER > 0
+                       if (sc->sc_if.if_bpf) {
+                               /*
+                                * Save the compressed header, so we
+                                * can tack it on later.  Note that we
+                                * will end up copying garbage in come
+                                * cases but this is okay.  We remember
+                                * where the buffer started so we can
+                                * compute the new header length.
+                                */
+                               memcpy(chdr, pktstart, CHDR_LEN);
+                       }
+#endif /* NBPFILTER > 0 */
+                       if ((c = (*pktstart & 0xf0)) != (IPVERSION << 4)) {
+                               if (c & 0x80)
+                                       c = TYPE_COMPRESSED_TCP;
+                               else if (c == TYPE_UNCOMPRESSED_TCP)
+                                       *pktstart &= 0x4f; /* XXX */
+                               /*
+                                * We've got something that's not an IP
+                                * packet.  If compression is enabled,
+                                * try to decompress it.  Otherwise, if
+                                * `auto-enable' compression is on and
+                                * it's a reasonable packet, decompress
+                                * it and then enable compression.
+                                * Otherwise, drop it.
+                                */
+                               if (sc->sc_if.if_flags & SC_COMPRESS) {
+                                       len = sl_uncompress_tcp(&pktstart, len,
+                                           (u_int)c, &sc->sc_comp);
+                                       if (len <= 0) {
+                                               m_freem(m);
+                                               continue;
+                                       }
+                               } else if ((sc->sc_if.if_flags & SC_AUTOCOMP) &&
+                                   c == TYPE_UNCOMPRESSED_TCP && len >= 40) {
+                                       len = sl_uncompress_tcp(&pktstart, len,
+                                           (u_int)c, &sc->sc_comp);
+                                       if (len <= 0) {
+                                               m_freem(m);
+                                               continue;
+                                       }
+                                       sc->sc_if.if_flags |= SC_COMPRESS;
+                               } else {
+                                       m_freem(m);
+                                       continue;
+                               }
+                       }
+                       m->m_data = (caddr_t) pktstart;
+                       m->m_pkthdr.len = m->m_len = len;
 #if NPBFILTER > 0
                        if (sc->sc_if.if_bpf) {
+                               /*
+                                * Put the SLIP pseudo-"link header" in place.
+                                * Note this M_PREPEND() should never fail,
+                                * swince we know we always have enough space
+                                * in the input buffer.
+                                */
+                               u_char *hp;
+
+                               M_PREPEND(m, SLIP_HDRLEN, M_DONTWAIT);
+                               if (m == NULL)
+                                       continue;
+
+                               hp = mtod(m, u_char *);
+                               hp[SLX_DIR] = SLIPDIR_IN;
+                               memcpy(&hp[SLX_CHDR], chdr, CHDR_LEN);
+
                                s = splnet();
                                bpf_mtap(sc->sc_if.if_bpf, m);
                                splx(s);
+
+                               m_adj(m, SLIP_HDRLEN);
                        }
 #endif
-                       m_adj(m, SLIP_HDRLEN);
+                       /*
+                        * If the packet will fit into a single
+                        * header mbuf, copy it into one, to save
+                        * memory.
+                        */
+                       if (m->m_pkthdr.len < MHLEN) {
+                               struct mbuf *n;
+
+                               MGETHDR(n, M_DONTWAIT, MT_DATA);
+                               M_COPY_PKTHDR(n, m);
+                               memcpy(mtod(n, caddr_t), mtod(m, caddr_t),
+                                   m->m_pkthdr.len);
+                               n->m_len = m->m_len;
+                               m_freem(m);
+                               m = n;
+                       }
+
                        sc->sc_if.if_ipackets++;
                        sc->sc_if.if_lastchange = time;
+
                        s = splimp();
                        if (IF_QFULL(&ipintrq)) {
                                IF_DROP(&ipintrq);



Home | Main Index | Thread Index | Old Index