aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/ppp
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>2001-07-03 22:20:19 +0000
committerBrian Somers <brian@FreeBSD.org>2001-07-03 22:20:19 +0000
commit6301d506fb03264736d864d191614a2c5a35efc1 (patch)
tree753c521335e8c5586213ea14afc2e9e2080bf808 /usr.sbin/ppp
parent4bb6aac05ef4db56a760f582e005280fd2cdc42f (diff)
downloadsrc-6301d506fb03264736d864d191614a2c5a35efc1.tar.gz
src-6301d506fb03264736d864d191614a2c5a35efc1.zip
Reduce the interface MTU by 2 when MPPE has been successfully negotiated.
This is necessary because MPPE will combine the protocol id with the payload received on the tun interface, encrypt it, then prepend its own protocol id, effectively increasing the payload by two bytes.
Notes
Notes: svn path=/head/; revision=79165
Diffstat (limited to 'usr.sbin/ppp')
-rw-r--r--usr.sbin/ppp/bundle.c26
-rw-r--r--usr.sbin/ppp/ccp.c32
-rw-r--r--usr.sbin/ppp/ccp.h2
-rw-r--r--usr.sbin/ppp/datalink.c3
-rw-r--r--usr.sbin/ppp/deflate.c2
-rw-r--r--usr.sbin/ppp/mp.c7
-rw-r--r--usr.sbin/ppp/mppe.c1
-rw-r--r--usr.sbin/ppp/pred.c1
8 files changed, 67 insertions, 7 deletions
diff --git a/usr.sbin/ppp/bundle.c b/usr.sbin/ppp/bundle.c
index 7e484991816b..ba1eca594b13 100644
--- a/usr.sbin/ppp/bundle.c
+++ b/usr.sbin/ppp/bundle.c
@@ -276,7 +276,8 @@ bundle_LayerUp(void *v, struct fsm *fp)
bundle_StartIdleTimer(bundle, 0);
bundle_Notify(bundle, EX_NORMAL);
mp_CheckAutoloadTimer(&fp->bundle->ncp.mp);
- }
+ } else if (fp->proto == PROTO_CCP)
+ bundle_CalculateBandwidth(fp->bundle); /* Against ccp_MTUOverhead */
}
static void
@@ -1816,11 +1817,16 @@ void
bundle_CalculateBandwidth(struct bundle *bundle)
{
struct datalink *dl;
- int sp;
+ int sp, overhead, maxoverhead;
bundle->bandwidth = 0;
bundle->iface->mtu = 0;
- for (dl = bundle->links; dl; dl = dl->next)
+ maxoverhead = 0;
+
+ for (dl = bundle->links; dl; dl = dl->next) {
+ overhead = ccp_MTUOverhead(&dl->physical->link.ccp);
+ if (maxoverhead < overhead)
+ maxoverhead = overhead;
if (dl->state == DATALINK_OPEN) {
if ((sp = dl->mp.bandwidth) == 0 &&
(sp = physical_GetSpeed(dl->physical)) == 0)
@@ -1833,13 +1839,17 @@ bundle_CalculateBandwidth(struct bundle *bundle)
break;
}
}
+ }
if(bundle->bandwidth == 0)
bundle->bandwidth = 115200; /* Shrug */
- if (bundle->ncp.mp.active)
+ if (bundle->ncp.mp.active) {
bundle->iface->mtu = bundle->ncp.mp.peer_mrru;
- else if (!bundle->iface->mtu)
+ overhead = ccp_MTUOverhead(&bundle->ncp.mp.link.ccp);
+ if (maxoverhead < overhead)
+ maxoverhead = overhead;
+ } else if (!bundle->iface->mtu)
bundle->iface->mtu = DEF_MRU;
#ifndef NORADIUS
@@ -1851,6 +1861,12 @@ bundle_CalculateBandwidth(struct bundle *bundle)
}
#endif
+ if (maxoverhead) {
+ log_Printf(LogLCP, "Reducing MTU from %d to %d (CCP requirement)\n",
+ bundle->iface->mtu, bundle->iface->mtu - maxoverhead);
+ bundle->iface->mtu -= maxoverhead;
+ }
+
tun_configure(bundle);
route_UpdateMTU(bundle);
diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c
index e8f0a411cbe8..b3a80f89c213 100644
--- a/usr.sbin/ppp/ccp.c
+++ b/usr.sbin/ppp/ccp.c
@@ -299,6 +299,19 @@ ccp_Required(struct ccp *ccp)
return 0;
}
+/*
+ * Report whether it's possible to increase a packet's size after
+ * compression (and by how much).
+ */
+int
+ccp_MTUOverhead(struct ccp *ccp)
+{
+ if (ccp->fsm.state == ST_OPENED)
+ return algorithm[ccp->out.algorithm]->o.MTUOverhead;
+
+ return 0;
+}
+
static void
CcpInitRestartCounter(struct fsm *fp, int what)
{
@@ -474,7 +487,24 @@ CcpLayerUp(struct fsm *fp)
/* We're now up */
struct ccp *ccp = fsm2ccp(fp);
struct ccp_opt **o;
- int f;
+ int f, fail;
+
+ for (f = fail = 0; f < NALGORITHMS; f++)
+ if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]) &&
+ (*algorithm[f]->Required)(&ccp->fsm) &&
+ (ccp->in.algorithm != f || ccp->out.algorithm != f)) {
+ /* Blow it all away - we haven't negotiated a required algorithm */
+ log_Printf(LogWARN, "%s: Failed to negotiate (required) %s\n",
+ fp->link->name, protoname(algorithm[f]->id));
+ fail = 1;
+ }
+
+ if (fail) {
+ ccp->his_proto = ccp->my_proto = -1;
+ fsm_Close(fp);
+ fsm_Close(&fp->link->lcp.fsm);
+ return 0;
+ }
log_Printf(LogCCP, "%s: LayerUp.\n", fp->link->name);
diff --git a/usr.sbin/ppp/ccp.h b/usr.sbin/ppp/ccp.h
index e604e22ccd3b..bb4f08bac588 100644
--- a/usr.sbin/ppp/ccp.h
+++ b/usr.sbin/ppp/ccp.h
@@ -135,6 +135,7 @@ struct ccp_algorithm {
void (*DictSetup)(void *, struct ccp *, u_short, struct mbuf *);
} i;
struct {
+ int MTUOverhead;
void (*OptInit)(struct lcp_opt *, const struct ccp_config *);
int (*Set)(struct lcp_opt *, const struct ccp_config *);
void *(*Init)(struct lcp_opt *);
@@ -149,6 +150,7 @@ extern void ccp_Init(struct ccp *, struct bundle *, struct link *,
const struct fsm_parent *);
extern void ccp_Setup(struct ccp *);
extern int ccp_Required(struct ccp *);
+extern int ccp_MTUOverhead(struct ccp *);
extern void ccp_SendResetReq(struct fsm *);
extern struct mbuf *ccp_Input(struct bundle *, struct link *, struct mbuf *);
diff --git a/usr.sbin/ppp/datalink.c b/usr.sbin/ppp/datalink.c
index 5f8544f387be..71616cc1aa4b 100644
--- a/usr.sbin/ppp/datalink.c
+++ b/usr.sbin/ppp/datalink.c
@@ -570,7 +570,8 @@ datalink_LayerUp(void *v, struct fsm *fp)
auth_StartReq(&dl->chap.auth);
} else
datalink_AuthOk(dl);
- }
+ } else if (fp->proto == PROTO_CCP)
+ (*dl->parent->LayerUp)(dl->parent->object, &dl->physical->link.ccp.fsm);
}
static void
diff --git a/usr.sbin/ppp/deflate.c b/usr.sbin/ppp/deflate.c
index 340d048641dc..ef04c270bcdd 100644
--- a/usr.sbin/ppp/deflate.c
+++ b/usr.sbin/ppp/deflate.c
@@ -567,6 +567,7 @@ const struct ccp_algorithm PppdDeflateAlgorithm = {
DeflateDictSetup
},
{
+ 0,
DeflateInitOptsOutput,
DeflateSetOptsOutput,
DeflateInitOutput,
@@ -591,6 +592,7 @@ const struct ccp_algorithm DeflateAlgorithm = {
DeflateDictSetup
},
{
+ 0,
DeflateInitOptsOutput,
DeflateSetOptsOutput,
DeflateInitOutput,
diff --git a/usr.sbin/ppp/mp.c b/usr.sbin/ppp/mp.c
index 2652d465baf5..448b9e29eeef 100644
--- a/usr.sbin/ppp/mp.c
+++ b/usr.sbin/ppp/mp.c
@@ -167,6 +167,8 @@ static void
mp_LayerUp(void *v, struct fsm *fp)
{
/* The given fsm (ccp) is now up */
+
+ bundle_CalculateBandwidth(fp->bundle); /* Against ccp_MTUOverhead */
}
static void
@@ -646,6 +648,11 @@ mp_Output(struct mp *mp, struct bundle *bundle, struct link *l,
mp->out.seq, m_length(m), l->name);
mp->out.seq = inc_seq(mp->peer_is12bit, mp->out.seq);
+ if (l->ccp.fsm.state != ST_OPENED && ccp_Required(&l->ccp)) {
+ log_Printf(LogPHASE, "%s: Not transmitting... waiting for CCP\n", l->name);
+ return;
+ }
+
link_PushPacket(l, m, bundle, LINK_QUEUES(l) - 1, PROTO_MP);
}
diff --git a/usr.sbin/ppp/mppe.c b/usr.sbin/ppp/mppe.c
index 5b32d1b0f42b..891492b49e31 100644
--- a/usr.sbin/ppp/mppe.c
+++ b/usr.sbin/ppp/mppe.c
@@ -721,6 +721,7 @@ const struct ccp_algorithm MPPEAlgorithm = {
MPPEDictSetup
},
{
+ 2,
MPPEInitOptsOutput,
MPPESetOptsOutput,
MPPEInitOutput,
diff --git a/usr.sbin/ppp/pred.c b/usr.sbin/ppp/pred.c
index 47d9a8cec880..d1a5b53f1276 100644
--- a/usr.sbin/ppp/pred.c
+++ b/usr.sbin/ppp/pred.c
@@ -340,6 +340,7 @@ const struct ccp_algorithm Pred1Algorithm = {
Pred1DictSetup
},
{
+ 0,
Pred1InitOptsOutput,
Pred1SetOptsOutput,
Pred1InitOutput,