Source-Changes-HG archive

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

[src/trunk]: src/sys/net Move the VJ uncompress code into the software interr...



details:   https://anonhg.NetBSD.org/src/rev/bca5390bd872
branches:  trunk
changeset: 502035:bca5390bd872
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Wed Jan 10 23:29:42 2001 +0000

description:
Move the VJ uncompress code into the software interrupt.

diffstat:

 sys/net/if_sl.c |  206 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 110 insertions(+), 96 deletions(-)

diffs (266 lines):

diff -r c0b116b0a9ac -r bca5390bd872 sys/net/if_sl.c
--- a/sys/net/if_sl.c   Wed Jan 10 23:15:42 2001 +0000
+++ b/sys/net/if_sl.c   Wed Jan 10 23:29:42 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_sl.c,v 1.65 2001/01/09 05:04:23 thorpej Exp $       */
+/*     $NetBSD: if_sl.c,v 1.66 2001/01/10 23:29:42 thorpej Exp $       */
 
 /*
  * Copyright (c) 1987, 1989, 1992, 1993
@@ -686,38 +686,23 @@
                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) {
+               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;
@@ -736,9 +721,6 @@
        struct mbuf *m;
        int len;
        int s;
-#if NBPFILTER > 0
-       u_char chdr[CHDR_LEN];
-#endif
 
        tk_nin++;
        sc = (struct sl_softc *)tp->t_sc;
@@ -805,73 +787,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 = sl_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 sl_btom().
-                        */
-                       u_char *hp = mtod(m, u_char *);
-
-                       hp[SLX_DIR] = SLIPDIR_IN;
-                       memcpy(&hp[SLX_CHDR], chdr, CHDR_LEN);
-
-                       bpf_mtap(sc->sc_if.if_bpf, m);
-               }
-#endif
-
                IF_ENQUEUE(&sc->sc_inq, m);
                s = splimp();
                schednetisr(NETISR_SLIP);
                splx(s);
-
                goto newpack;
        }
        if (sc->sc_mp < sc->sc_ep) {
@@ -896,7 +819,11 @@
 {
        struct sl_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 < NSL; i++) {
                sc = &sl_softc[i];
@@ -906,16 +833,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 some
+                                * 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 NBPFILTER > 0
+                       if (sc->sc_if.if_bpf) {
+                               /*
+                                * Put the SLIP pseudo-"link header" in place.
+                                * Note this M_PREPEND() should bever fail,
+                                * since 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);
+#endif /* NBPFILTER > 0 */
+                       /*
+                        * 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