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:
parent
d690a6e798
commit
3f47e1e357
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=53076
@ -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 *);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user