summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>2001-02-04 22:53:11 +0000
committerbrian <brian@FreeBSD.org>2001-02-04 22:53:11 +0000
commita59964d665ad1cfe452c2c227de97a8af275fec8 (patch)
treed2333a42ca97b6c465b331cfb89fc7686024d300
parentc0460ef928465b6cc12672bb05309f2a94ab6f87 (diff)
downloadFreeBSD-src-a59964d665ad1cfe452c2c227de97a8af275fec8.zip
FreeBSD-src-a59964d665ad1cfe452c2c227de97a8af275fec8.tar.gz
Add a ``Usable'' function to the ccp switch. The function
is called prior to sending a CCP configure request for a given protocol. The default is to send the request, but this is overridden for MPPE which checks to see if the lcp negotiations agreed CHAP81, and if not fails. Use the same function to decide if we should reject peer requests for MPPE. This should get rid of those boring messages about not being able to initialise MPPE when we don't negotiate CHAP81.
-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 6acfc53..f2b7f19 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 442d65f..b7f278d 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 aacc438..8908f12 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 cbda453..617596a 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 d21a28f..6fd300c 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,
OpenPOWER on IntegriCloud