1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-19 02:29:40 +00:00

Fix some bugs; seems to work now. Minor change to the configuration field

to make the number of compression slots parameter consistent with what
IPCP negotiates (ie, the number of slots - 1).
This commit is contained in:
Archie Cobbs 1999-11-10 06:17:14 +00:00
parent d690a6e798
commit 3f47e1e357
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=53076

View File

@ -155,13 +155,13 @@ ng_vjc_newhook(node_p node, hook_p hook, const char *name)
hook_p *hookp; hook_p *hookp;
/* Get hook */ /* Get hook */
if (!strcmp(name, NG_VJC_HOOK_IP)) if (strcmp(name, NG_VJC_HOOK_IP) == 0)
hookp = &priv->ip; hookp = &priv->ip;
else if (!strcmp(name, NG_VJC_HOOK_VJCOMP)) else if (strcmp(name, NG_VJC_HOOK_VJCOMP) == 0)
hookp = &priv->vjcomp; hookp = &priv->vjcomp;
else if (!strcmp(name, NG_VJC_HOOK_VJUNCOMP)) else if (strcmp(name, NG_VJC_HOOK_VJUNCOMP) == 0)
hookp = &priv->vjuncomp; hookp = &priv->vjuncomp;
else if (!strcmp(name, NG_VJC_HOOK_VJIP)) else if (strcmp(name, NG_VJC_HOOK_VJIP) == 0)
hookp = &priv->vjip; hookp = &priv->vjip;
else else
return (EINVAL); return (EINVAL);
@ -201,15 +201,15 @@ ng_vjc_rcvmsg(node_p node, struct ng_mesg *msg,
&& (c->enableComp || c->enableDecomp)) && (c->enableComp || c->enableDecomp))
ERROUT(EALREADY); ERROUT(EALREADY);
if (c->enableComp) { if (c->enableComp) {
if (c->numChannels > NG_VJC_MAX_CHANNELS if (c->maxChannel > NG_VJC_MAX_CHANNELS - 1
|| c->numChannels < NG_VJC_MIN_CHANNELS) || c->maxChannel < NG_VJC_MIN_CHANNELS - 1)
ERROUT(EINVAL); ERROUT(EINVAL);
} else { } else {
c->numChannels = NG_VJC_MAX_CHANNELS; c->maxChannel = NG_VJC_MAX_CHANNELS;
} }
if (c->enableComp != 0 || c->enableDecomp != 0) { if (c->enableComp != 0 || c->enableDecomp != 0) {
bzero(&priv->slc, sizeof(priv->slc)); bzero(&priv->slc, sizeof(priv->slc));
sl_compress_init(&priv->slc, c->numChannels); sl_compress_init(&priv->slc, c->maxChannel);
} }
priv->conf = *c; priv->conf = *c;
break; break;
@ -231,7 +231,7 @@ ng_vjc_rcvmsg(node_p node, struct ng_mesg *msg,
priv->slc.sls_tossed = 0; priv->slc.sls_tossed = 0;
break; break;
case NGM_VJC_RECV_ERROR: case NGM_VJC_RECV_ERROR:
priv->slc.flags |= SLF_TOSS; sl_uncompress_tcp(NULL, 0, TYPE_ERROR, &priv->slc);
break; break;
default: default:
error = EINVAL; error = EINVAL;
@ -288,7 +288,7 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
hook = priv->vjcomp; hook = priv->vjcomp;
break; break;
default: default:
panic(__FUNCTION__); panic("%s: type=%d", __FUNCTION__, type);
} }
} else if (hook == priv->vjcomp) { /* incoming compressed packet */ } else if (hook == priv->vjcomp) { /* incoming compressed packet */
int vjlen; int vjlen;
@ -298,26 +298,29 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
/* Are we decompressing? */ /* Are we decompressing? */
if (!priv->conf.enableDecomp) { if (!priv->conf.enableDecomp) {
m_freem(m); NG_FREE_DATA(m, meta);
m = NULL;
ERROUT(ENETDOWN); ERROUT(ENETDOWN);
} }
/* Uncompress packet to reconstruct TCP/IP header */ /* Uncompress packet to reconstruct TCP/IP header */
if (m->m_len < MAX_VJHEADER && !(m = m_pullup(m, MAX_VJHEADER))) if (m->m_len < MAX_VJHEADER
&& (m = m_pullup(m, MAX_VJHEADER)) == NULL) {
priv->slc.sls_tossed++;
NG_FREE_META(meta);
ERROUT(ENOBUFS); ERROUT(ENOBUFS);
}
vjlen = sl_uncompress_tcp_core(mtod(m, u_char *), vjlen = sl_uncompress_tcp_core(mtod(m, u_char *),
m->m_len, m->m_pkthdr.len, TYPE_COMPRESSED_TCP, m->m_len, m->m_pkthdr.len, TYPE_COMPRESSED_TCP,
&priv->slc, &hdr, &hlen); &priv->slc, &hdr, &hlen);
if (vjlen <= 0) { if (vjlen <= 0) {
m_freem(m); NG_FREE_DATA(m, meta);
m = NULL;
ERROUT(EINVAL); ERROUT(EINVAL);
} }
m_adj(m, vjlen);
/* Copy the reconstructed TCP/IP headers into a new mbuf */ /* Copy the reconstructed TCP/IP headers into a new mbuf */
MGETHDR(mp, M_DONTWAIT, MT_DATA); MGETHDR(mp, M_DONTWAIT, MT_DATA);
if (!mp) if (mp == NULL)
goto compfailmem; goto compfailmem;
mp->m_len = 0; mp->m_len = 0;
mp->m_next = NULL; mp->m_next = NULL;
@ -326,8 +329,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
if (M_TRAILINGSPACE(mp) < hlen) { if (M_TRAILINGSPACE(mp) < hlen) {
m_freem(mp); /* can't get a cluster, drop */ m_freem(mp); /* can't get a cluster, drop */
compfailmem: compfailmem:
m_freem(m); priv->slc.sls_tossed++;
m = NULL; NG_FREE_DATA(m, meta);
ERROUT(ENOBUFS); ERROUT(ENOBUFS);
} }
} }
@ -335,15 +338,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
mp->m_len = hlen; mp->m_len = hlen;
/* Stick header and rest of packet together */ /* Stick header and rest of packet together */
m->m_data += vjlen; mp->m_next = m;
m->m_len -= vjlen; mp->m_pkthdr.len = hlen + m->m_pkthdr.len;
if (m->m_len <= M_TRAILINGSPACE(mp)) {
bcopy(mtod(m, u_char *),
mtod(mp, u_char *) + mp->m_len, m->m_len);
mp->m_len += m->m_len;
MFREE(m, mp->m_next);
} else
mp->m_next = m;
m = mp; m = mp;
hook = priv->ip; hook = priv->ip;
} else if (hook == priv->vjuncomp) { /* incoming uncompressed pkt */ } else if (hook == priv->vjuncomp) { /* incoming uncompressed pkt */
@ -352,8 +348,7 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
/* Are we decompressing? */ /* Are we decompressing? */
if (!priv->conf.enableDecomp) { if (!priv->conf.enableDecomp) {
m_freem(m); NG_FREE_DATA(m, meta);
m = NULL;
ERROUT(ENETDOWN); ERROUT(ENETDOWN);
} }
@ -363,18 +358,17 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
if (sl_uncompress_tcp_core(mtod(m, u_char *), if (sl_uncompress_tcp_core(mtod(m, u_char *),
m->m_len, m->m_pkthdr.len, TYPE_UNCOMPRESSED_TCP, m->m_len, m->m_pkthdr.len, TYPE_UNCOMPRESSED_TCP,
&priv->slc, &hdr, &hlen) < 0) { &priv->slc, &hdr, &hlen) < 0) {
m_freem(m); NG_FREE_DATA(m, meta);
m = NULL;
ERROUT(EINVAL); ERROUT(EINVAL);
} }
hook = priv->ip; hook = priv->ip;
} else if (hook == priv->vjip) /* incoming regular packet (bypass) */ } else if (hook == priv->vjip) /* incoming regular packet (bypass) */
hook = priv->ip; hook = priv->ip;
else else
panic(__FUNCTION__); panic("%s: unknown hook", __FUNCTION__);
done: done:
if (m) if (m != NULL)
NG_SEND_DATA(error, hook, m, meta); NG_SEND_DATA(error, hook, m, meta);
else else
NG_FREE_META(meta); NG_FREE_META(meta);
@ -425,14 +419,14 @@ ng_vjc_pulluphdrs(struct mbuf *m)
struct tcphdr *tcp; struct tcphdr *tcp;
int ihlen, thlen; int ihlen, thlen;
if (m->m_len < sizeof(*ip) && !(m = m_pullup(m, sizeof(*ip)))) if (m->m_len < sizeof(*ip) && (m = m_pullup(m, sizeof(*ip))) == NULL)
return (NULL); return (NULL);
ip = mtod(m, struct ip *); ip = mtod(m, struct ip *);
if (ip->ip_p != IPPROTO_TCP) if (ip->ip_p != IPPROTO_TCP)
return (m); return (m);
ihlen = ip->ip_hl << 2; ihlen = ip->ip_hl << 2;
if (m->m_len < ihlen + sizeof(*tcp)) { if (m->m_len < ihlen + sizeof(*tcp)) {
if (!(m = m_pullup(m, ihlen + sizeof(*tcp)))) if ((m = m_pullup(m, ihlen + sizeof(*tcp))) == NULL)
return (NULL); return (NULL);
ip = mtod(m, struct ip *); ip = mtod(m, struct ip *);
} }