summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/ppp/ccp.c10
-rw-r--r--usr.sbin/ppp/ccp.h2
-rw-r--r--usr.sbin/ppp/deflate.c4
-rw-r--r--usr.sbin/ppp/mppe.c20
-rw-r--r--usr.sbin/ppp/pred.c1
5 files changed, 35 insertions, 2 deletions
diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c
index 6acfc53e8827..f2b7f19c8032 100644
--- a/usr.sbin/ppp/ccp.c
+++ b/usr.sbin/ppp/ccp.c
@@ -268,7 +268,8 @@ CcpSendConfigReq(struct fsm *fp)
ccp->out.algorithm = -1;
for (f = 0; f < NALGORITHMS; f++)
if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg]) &&
- !REJECTED(ccp, algorithm[f]->id)) {
+ !REJECTED(ccp, algorithm[f]->id) &&
+ (*algorithm[f]->Usable)(fp)) {
if (!alloc)
for (o = &ccp->out.opt; *o != NULL; o = &(*o)->next)
@@ -491,6 +492,7 @@ CcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
switch (mode_type) {
case MODE_REQ:
if (IsAccepted(ccp->cfg.neg[algorithm[f]->Neg]) &&
+ (*algorithm[f]->Usable)(fp) &&
ccp->in.algorithm == -1) {
memcpy(&ccp->in.opt, cp, length);
switch ((*algorithm[f]->i.Set)(&ccp->in.opt, &ccp->cfg)) {
@@ -697,4 +699,10 @@ ccp_SetOpenMode(struct ccp *ccp)
return 0; /* No CCP at all */
}
+int
+ccp_IsUsable(struct fsm *fp)
+{
+ return 1;
+}
+
struct layer ccplayer = { LAYER_CCP, "ccp", ccp_LayerPush, ccp_LayerPull };
diff --git a/usr.sbin/ppp/ccp.h b/usr.sbin/ppp/ccp.h
index 442d65feb1b0..b7f278d28521 100644
--- a/usr.sbin/ppp/ccp.h
+++ b/usr.sbin/ppp/ccp.h
@@ -106,6 +106,7 @@ struct ccp_algorithm {
int id;
int Neg; /* ccp_config neg array item */
const char *(*Disp)(struct lcp_opt *); /* Use result immediately ! */
+ int (*Usable)(struct fsm *); /* Ok to negotiate ? */
struct {
int (*Set)(struct lcp_opt *, const struct ccp_config *);
void *(*Init)(struct lcp_opt *);
@@ -135,5 +136,6 @@ extern int ccp_ReportStatus(struct cmdargs const *);
extern u_short ccp_Proto(struct ccp *);
extern void ccp_SetupCallbacks(struct ccp *);
extern int ccp_SetOpenMode(struct ccp *);
+extern int ccp_IsUsable(struct fsm *);
extern struct layer ccplayer;
diff --git a/usr.sbin/ppp/deflate.c b/usr.sbin/ppp/deflate.c
index aacc438710c3..8908f127e6bd 100644
--- a/usr.sbin/ppp/deflate.c
+++ b/usr.sbin/ppp/deflate.c
@@ -551,9 +551,10 @@ DeflateTermOutput(void *v)
}
const struct ccp_algorithm PppdDeflateAlgorithm = {
- TY_PPPD_DEFLATE, /* pppd (wrongly) expects this ``type'' field */
+ TY_PPPD_DEFLATE, /* Older versions of pppd expected this ``type'' */
CCP_NEG_DEFLATE24,
DeflateDispOpts,
+ ccp_IsUsable,
{
DeflateSetOptsInput,
DeflateInitInput,
@@ -576,6 +577,7 @@ const struct ccp_algorithm DeflateAlgorithm = {
TY_DEFLATE, /* rfc 1979 */
CCP_NEG_DEFLATE,
DeflateDispOpts,
+ ccp_IsUsable,
{
DeflateSetOptsInput,
DeflateInitInput,
diff --git a/usr.sbin/ppp/mppe.c b/usr.sbin/ppp/mppe.c
index cbda453c0f9e..617596a816bf 100644
--- a/usr.sbin/ppp/mppe.c
+++ b/usr.sbin/ppp/mppe.c
@@ -47,7 +47,11 @@
#include "hdlc.h"
#include "lcp.h"
#include "ccp.h"
+#include "throughput.h"
+#include "layer.h"
+#include "link.h"
#include "chap_ms.h"
+#include "proto.h"
#include "mppe.h"
/*
@@ -223,6 +227,21 @@ MPPEDispOpts(struct lcp_opt *o)
return buf;
}
+static int
+MPPEUsable(struct fsm *fp)
+{
+ struct lcp *lcp;
+ int ok;
+
+ lcp = &fp->link->lcp;
+ ok = (lcp->want_auth == PROTO_CHAP && lcp->want_authtype == 0x81) ||
+ (lcp->his_auth == PROTO_CHAP && lcp->his_authtype == 0x81);
+ if (!ok)
+ log_Printf(LogCCP, "MPPE: Not usable without CHAP81\n");
+
+ return ok;
+}
+
static void
MPPEInitOptsOutput(struct lcp_opt *o, const struct ccp_config *cfg)
{
@@ -414,6 +433,7 @@ const struct ccp_algorithm MPPEAlgorithm = {
TY_MPPE,
CCP_NEG_MPPE,
MPPEDispOpts,
+ MPPEUsable,
{
MPPESetOptsInput,
MPPEInitInput,
diff --git a/usr.sbin/ppp/pred.c b/usr.sbin/ppp/pred.c
index d21a28f81d44..6fd300c7a8c1 100644
--- a/usr.sbin/ppp/pred.c
+++ b/usr.sbin/ppp/pred.c
@@ -323,6 +323,7 @@ const struct ccp_algorithm Pred1Algorithm = {
TY_PRED1,
CCP_NEG_PRED1,
Pred1DispOpts,
+ ccp_IsUsable,
{
Pred1SetOptsInput,
Pred1InitInput,