diff options
-rw-r--r-- | usr.sbin/ppp/auth.c | 10 | ||||
-rw-r--r-- | usr.sbin/ppp/auth.h | 4 | ||||
-rw-r--r-- | usr.sbin/ppp/cbcp.c | 10 | ||||
-rw-r--r-- | usr.sbin/ppp/ccp.c | 42 | ||||
-rw-r--r-- | usr.sbin/ppp/ccp.h | 4 | ||||
-rw-r--r-- | usr.sbin/ppp/command.c | 118 | ||||
-rw-r--r-- | usr.sbin/ppp/datalink.c | 16 | ||||
-rw-r--r-- | usr.sbin/ppp/defs.h | 5 | ||||
-rw-r--r-- | usr.sbin/ppp/fsm.c | 78 | ||||
-rw-r--r-- | usr.sbin/ppp/fsm.h | 22 | ||||
-rw-r--r-- | usr.sbin/ppp/ipcp.c | 38 | ||||
-rw-r--r-- | usr.sbin/ppp/ipcp.h | 4 | ||||
-rw-r--r-- | usr.sbin/ppp/lcp.c | 50 | ||||
-rw-r--r-- | usr.sbin/ppp/lcp.h | 5 | ||||
-rw-r--r-- | usr.sbin/ppp/modem.c | 4 | ||||
-rw-r--r-- | usr.sbin/ppp/ppp.8 | 38 | ||||
-rw-r--r-- | usr.sbin/ppp/ppp.8.m4 | 38 |
17 files changed, 332 insertions, 154 deletions
diff --git a/usr.sbin/ppp/auth.c b/usr.sbin/ppp/auth.c index d67aeda..2373289 100644 --- a/usr.sbin/ppp/auth.c +++ b/usr.sbin/ppp/auth.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: auth.c,v 1.40 1999/02/19 10:48:42 brian Exp $ + * $Id: auth.c,v 1.41 1999/02/20 01:12:45 brian Exp $ * * TODO: * o Implement check against with registered IP addresses. @@ -290,7 +290,9 @@ auth_Init(struct authinfo *authp, struct physical *p, auth_func req, auth_func success, auth_func failure) { memset(authp, '\0', sizeof(struct authinfo)); - authp->cfg.fsmretry = DEF_FSMRETRY; + authp->cfg.fsm.timeout = DEF_FSMRETRY; + authp->cfg.fsm.maxreq = DEF_FSMAUTHTRIES; + authp->cfg.fsm.maxtrm = 0; /* not used */ authp->fn.req = req; authp->fn.success = success; authp->fn.failure = failure; @@ -303,9 +305,9 @@ auth_StartReq(struct authinfo *authp) timer_Stop(&authp->authtimer); authp->authtimer.func = AuthTimeout; authp->authtimer.name = "auth"; - authp->authtimer.load = authp->cfg.fsmretry * SECTICKS; + authp->authtimer.load = authp->cfg.fsm.timeout * SECTICKS; authp->authtimer.arg = (void *)authp; - authp->retry = 3; + authp->retry = authp->cfg.fsm.maxreq; authp->id = 1; (*authp->fn.req)(authp); timer_Start(&authp->authtimer); diff --git a/usr.sbin/ppp/auth.h b/usr.sbin/ppp/auth.h index 1b85f4b..a4224ba 100644 --- a/usr.sbin/ppp/auth.h +++ b/usr.sbin/ppp/auth.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: auth.h,v 1.15 1999/02/06 02:54:43 brian Exp $ + * $Id: auth.h,v 1.16 1999/02/18 00:52:12 brian Exp $ * * TODO: */ @@ -40,7 +40,7 @@ struct authinfo { int id; struct physical *physical; struct { - u_int fsmretry; + struct fsm_retry fsm; /* How often/frequently to resend requests */ } cfg; }; diff --git a/usr.sbin/ppp/cbcp.c b/usr.sbin/ppp/cbcp.c index 9433baf..446f464 100644 --- a/usr.sbin/ppp/cbcp.c +++ b/usr.sbin/ppp/cbcp.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cbcp.c,v 1.8 1999/01/19 22:15:25 brian Exp $ + * $Id: cbcp.c,v 1.9 1999/01/28 01:56:30 brian Exp $ */ #include <sys/param.h> @@ -327,7 +327,7 @@ cbcp_Up(struct cbcp *cbcp) } else cbcp->fsm.type = CBCP_CLIENTNUM; cbcp_NewPhase(cbcp, CBCP_STOPPED); /* Wait for a REQ */ - cbcp_StartTimer(cbcp, cbcp->fsm.delay * DEF_REQs); + cbcp_StartTimer(cbcp, cbcp->fsm.delay * DEF_FSMTRIES); } else { if (*cbcp->fsm.phone == '\0') cbcp->fsm.type = CBCP_NONUM; @@ -338,7 +338,7 @@ cbcp_Up(struct cbcp *cbcp) cbcp->fsm.type = CBCP_LISTNUM; else cbcp->fsm.type = CBCP_SERVERNUM; - cbcp->fsm.restart = DEF_REQs; + cbcp->fsm.restart = DEF_FSMTRIES; cbcp_SendReq(cbcp); } } @@ -635,7 +635,7 @@ cbcp_Input(struct physical *p, struct mbuf *bp) if (cbcp->fsm.state == CBCP_STOPPED || cbcp->fsm.state == CBCP_RESPSENT) { timer_Stop(&cbcp->fsm.timer); if (cbcp_AdjustResponse(cbcp, data)) { - cbcp->fsm.restart = DEF_REQs; + cbcp->fsm.restart = DEF_FSMTRIES; cbcp->fsm.id = head->id; cbcp_SendResponse(cbcp); } else @@ -661,7 +661,7 @@ cbcp_Input(struct physical *p, struct mbuf *bp) break; case CBCP_ACTION_ACK: - cbcp->fsm.restart = DEF_REQs; + cbcp->fsm.restart = DEF_FSMTRIES; cbcp_SendAck(cbcp); if (cbcp->fsm.type == CBCP_NONUM) { /* diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c index eabcf76..97a36fb 100644 --- a/usr.sbin/ppp/ccp.c +++ b/usr.sbin/ppp/ccp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ccp.c,v 1.41 1999/01/28 01:56:30 brian Exp $ + * $Id: ccp.c,v 1.42 1999/02/06 02:54:44 brian Exp $ * * TODO: * o Support other compression protocols @@ -70,7 +70,7 @@ static void CcpLayerStart(struct fsm *); static void CcpLayerFinish(struct fsm *); static int CcpLayerUp(struct fsm *); static void CcpLayerDown(struct fsm *); -static void CcpInitRestartCounter(struct fsm *); +static void CcpInitRestartCounter(struct fsm *, int); static void CcpRecvResetReq(struct fsm *); static void CcpRecvResetAck(struct fsm *, u_char); @@ -150,7 +150,10 @@ ccp_ReportStatus(struct cmdargs const *arg) ccp->compin, ccp->uncompin); prompt_Printf(arg->prompt, "\n Defaults: "); - prompt_Printf(arg->prompt, "FSM retry = %us\n", ccp->cfg.fsmretry); + prompt_Printf(arg->prompt, "FSM retry = %us, max %u Config" + " REQ%s, %u Term REQ%s\n", ccp->cfg.fsm.timeout, + ccp->cfg.fsm.maxreq, ccp->cfg.fsm.maxreq == 1 ? "" : "s", + ccp->cfg.fsm.maxtrm, ccp->cfg.fsm.maxtrm == 1 ? "" : "s"); prompt_Printf(arg->prompt, " deflate windows: "); prompt_Printf(arg->prompt, "incoming = %d, ", ccp->cfg.deflate.in.winsize); prompt_Printf(arg->prompt, "outgoing = %d\n", ccp->cfg.deflate.out.winsize); @@ -178,12 +181,14 @@ ccp_Init(struct ccp *ccp, struct bundle *bundle, struct link *l, { /* Initialise ourselves */ - fsm_Init(&ccp->fsm, "CCP", PROTO_CCP, 1, CCP_MAXCODE, 10, LogCCP, + fsm_Init(&ccp->fsm, "CCP", PROTO_CCP, 1, CCP_MAXCODE, LogCCP, bundle, l, parent, &ccp_Callbacks, ccp_TimerNames); ccp->cfg.deflate.in.winsize = 0; ccp->cfg.deflate.out.winsize = 15; - ccp->cfg.fsmretry = DEF_FSMRETRY; + ccp->cfg.fsm.timeout = DEF_FSMRETRY; + ccp->cfg.fsm.maxreq = DEF_FSMTRIES; + ccp->cfg.fsm.maxtrm = DEF_FSMTRIES; ccp->cfg.neg[CCP_NEG_DEFLATE] = NEG_ENABLED|NEG_ACCEPTED; ccp->cfg.neg[CCP_NEG_PRED1] = NEG_ENABLED|NEG_ACCEPTED; ccp->cfg.neg[CCP_NEG_DEFLATE24] = 0; @@ -196,7 +201,6 @@ ccp_Setup(struct ccp *ccp) { /* Set ourselves up for a startup */ ccp->fsm.open_mode = 0; - ccp->fsm.maxconfig = 10; ccp->his_proto = ccp->my_proto = -1; ccp->reset_sent = ccp->last_reset = -1; ccp->in.algorithm = ccp->out.algorithm = -1; @@ -209,13 +213,23 @@ ccp_Setup(struct ccp *ccp) } static void -CcpInitRestartCounter(struct fsm *fp) +CcpInitRestartCounter(struct fsm *fp, int what) { /* Set fsm timer load */ struct ccp *ccp = fsm2ccp(fp); - fp->FsmTimer.load = ccp->cfg.fsmretry * SECTICKS; - fp->restart = DEF_REQs; + fp->FsmTimer.load = ccp->cfg.fsm.timeout * SECTICKS; + switch (what) { + case FSM_REQ_TIMER: + fp->restart = ccp->cfg.fsm.maxreq; + break; + case FSM_TRM_TIMER: + fp->restart = ccp->cfg.fsm.maxtrm; + break; + default: + fp->restart = 1; + break; + } } static void @@ -304,7 +318,10 @@ static void CcpLayerStart(struct fsm *fp) { /* We're about to start up ! */ + struct ccp *ccp = fsm2ccp(fp); + log_Printf(LogCCP, "%s: LayerStart.\n", fp->link->name); + fp->more.reqs = fp->more.naks = fp->more.rejs = ccp->cfg.fsm.maxreq * 3; } static void @@ -350,7 +367,9 @@ CcpLayerUp(struct fsm *fp) { /* We're now up */ struct ccp *ccp = fsm2ccp(fp); + log_Printf(LogCCP, "%s: LayerUp.\n", fp->link->name); + if (ccp->in.state == NULL && ccp->in.algorithm >= 0 && ccp->in.algorithm < NALGORITHMS) { ccp->in.state = (*algorithm[ccp->in.algorithm]->i.Init)(&ccp->in.opt); @@ -359,6 +378,7 @@ CcpLayerUp(struct fsm *fp) fp->link->name, protoname(ccp->his_proto)); ccp->his_proto = ccp->my_proto = -1; fsm_Close(fp); + return 0; } } @@ -371,12 +391,16 @@ CcpLayerUp(struct fsm *fp) fp->link->name, protoname(ccp->my_proto)); ccp->his_proto = ccp->my_proto = -1; fsm_Close(fp); + return 0; } } + fp->more.reqs = fp->more.naks = fp->more.rejs = ccp->cfg.fsm.maxreq * 3; + log_Printf(LogCCP, "%s: Out = %s[%d], In = %s[%d]\n", fp->link->name, protoname(ccp->my_proto), ccp->my_proto, protoname(ccp->his_proto), ccp->his_proto); + return 1; } diff --git a/usr.sbin/ppp/ccp.h b/usr.sbin/ppp/ccp.h index b79fc27..5cac40d 100644 --- a/usr.sbin/ppp/ccp.h +++ b/usr.sbin/ppp/ccp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ccp.h,v 1.18 1998/06/27 23:48:41 brian Exp $ + * $Id: ccp.h,v 1.19 1998/06/30 23:04:12 brian Exp $ * * TODO: */ @@ -49,7 +49,7 @@ struct ccp_config { int winsize; } in, out; } deflate; - u_int fsmretry; /* FSM retry frequency */ + struct fsm_retry fsm; /* How often/frequently to resend requests */ unsigned neg[CCP_NEG_TOTAL]; }; diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index 91f43c33..1f9f1b4 100644 --- a/usr.sbin/ppp/command.c +++ b/usr.sbin/ppp/command.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: command.c,v 1.182 1999/02/18 00:52:12 brian Exp $ + * $Id: command.c,v 1.183 1999/02/25 20:05:54 brian Exp $ * */ #include <sys/param.h> @@ -141,7 +141,7 @@ #define NEG_DNS 52 const char Version[] = "2.11"; -const char VersionDate[] = "$Date: 1999/02/18 00:52:12 $"; +const char VersionDate[] = "$Date: 1999/02/25 20:05:54 $"; static int ShowCommand(struct cmdargs const *); static int TerminalCommand(struct cmdargs const *); @@ -1319,6 +1319,47 @@ SetInterfaceAddr(struct cmdargs const *arg) } static int +SetRetry(int argc, char const *const *argv, u_int *timeout, u_int *maxreq, + u_int *maxtrm, int def) +{ + if (argc == 0) { + *timeout = DEF_FSMRETRY; + *maxreq = def; + if (maxtrm != NULL) + *maxtrm = def; + } else { + long l = atol(argv[0]); + + if (l < MIN_FSMRETRY) { + log_Printf(LogWARN, "%ld: Invalid FSM retry period - min %d\n", + l, MIN_FSMRETRY); + return 1; + } else + *timeout = l; + + if (argc > 1) { + l = atol(argv[1]); + if (l < 1) { + log_Printf(LogWARN, "%ld: Invalid FSM REQ tries - changed to 1\n", l); + l = 1; + } + *maxreq = l; + + if (argc > 2 && maxtrm != NULL) { + l = atol(argv[2]); + if (l < 1) { + log_Printf(LogWARN, "%ld: Invalid FSM TRM tries - changed to 1\n", l); + l = 1; + } + *maxtrm = l; + } + } + } + + return 0; +} + +static int SetVariable(struct cmdargs const *arg) { long long_val, param = (long)arg->cmd->args; @@ -1548,53 +1589,35 @@ SetVariable(struct cmdargs const *arg) break; case VAR_LCPRETRY: - long_val = atol(argp); - if (long_val < MIN_FSMRETRY) { - log_Printf(LogWARN, "%ld: Invalid LCP FSM retry period - min %d\n", - long_val, MIN_FSMRETRY); - return 1; - } else - cx->physical->link.lcp.cfg.fsmretry = long_val; + return SetRetry(arg->argc - arg->argn, arg->argv + arg->argn, + &cx->physical->link.lcp.cfg.fsm.timeout, + &cx->physical->link.lcp.cfg.fsm.maxreq, + &cx->physical->link.lcp.cfg.fsm.maxtrm, DEF_FSMTRIES); break; case VAR_CHAPRETRY: - long_val = atol(argp); - if (long_val < MIN_FSMRETRY) { - log_Printf(LogWARN, "%ld: Invalid CHAP FSM retry period - min %d\n", - long_val, MIN_FSMRETRY); - return 1; - } else - cx->chap.auth.cfg.fsmretry = long_val; + return SetRetry(arg->argc - arg->argn, arg->argv + arg->argn, + &cx->chap.auth.cfg.fsm.timeout, + &cx->chap.auth.cfg.fsm.maxreq, NULL, DEF_FSMAUTHTRIES); break; case VAR_PAPRETRY: - long_val = atol(argp); - if (long_val < MIN_FSMRETRY) { - log_Printf(LogWARN, "%ld: Invalid PAP FSM retry period - min %d\n", - long_val, MIN_FSMRETRY); - return 1; - } else - cx->pap.cfg.fsmretry = long_val; + return SetRetry(arg->argc - arg->argn, arg->argv + arg->argn, + &cx->pap.cfg.fsm.timeout, &cx->pap.cfg.fsm.maxreq, + NULL, DEF_FSMAUTHTRIES); break; case VAR_CCPRETRY: - long_val = atol(argp); - if (long_val < MIN_FSMRETRY) { - log_Printf(LogWARN, "%ld: Invalid CCP FSM retry period - min %d\n", - long_val, MIN_FSMRETRY); - return 1; - } else - l->ccp.cfg.fsmretry = long_val; + return SetRetry(arg->argc - arg->argn, arg->argv + arg->argn, + &l->ccp.cfg.fsm.timeout, &l->ccp.cfg.fsm.maxreq, + &l->ccp.cfg.fsm.maxtrm, DEF_FSMTRIES); break; case VAR_IPCPRETRY: - long_val = atol(argp); - if (long_val < MIN_FSMRETRY) { - log_Printf(LogWARN, "%ld: Invalid IPCP FSM retry period - min %d\n", - long_val, MIN_FSMRETRY); - return 1; - } else - arg->bundle->ncp.ipcp.cfg.fsmretry = long_val; + return SetRetry(arg->argc - arg->argn, arg->argv + arg->argn, + &arg->bundle->ncp.ipcp.cfg.fsm.timeout, + &arg->bundle->ncp.ipcp.cfg.fsm.maxreq, + &arg->bundle->ncp.ipcp.cfg.fsm.maxtrm, DEF_FSMTRIES); break; case VAR_NBNS: @@ -1747,12 +1770,13 @@ static struct cmdtab const SetCommands[] = { {"cbcp", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, "CBCP control", "set cbcp [*|phone[,phone...] [delay [timeout]]]", (const void *)VAR_CBCP}, - {"ccpretry", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX_OPT, - "FSM retry period", "set ccpretry value", (const void *)VAR_CCPRETRY}, + {"ccpretry", "ccpretries", SetVariable, LOCAL_AUTH | LOCAL_CX_OPT, + "CCP retries", "set ccpretry value [attempts]", (const void *)VAR_CCPRETRY}, {"cd", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, "Carrier delay requirement", "set cd value[!]", (const void *)VAR_CD}, - {"chapretry", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, - "CHAP retry period", "set chapretry value", (const void *)VAR_CHAPRETRY}, + {"chapretry", "chapretries", SetVariable, LOCAL_AUTH | LOCAL_CX, + "CHAP retries", "set chapretry value [attempts]", + (const void *)VAR_CHAPRETRY}, {"choked", NULL, SetVariable, LOCAL_AUTH, "choked timeout", "set choked [secs]", (const void *)VAR_CHOKED}, {"ctsrts", "crtscts", SetCtsRts, LOCAL_AUTH | LOCAL_CX, @@ -1779,10 +1803,10 @@ static struct cmdtab const SetCommands[] = { "hangup script", "set hangup chat-script", (const void *) VAR_HANGUP}, {"ifaddr", NULL, SetInterfaceAddr, LOCAL_AUTH, "destination address", "set ifaddr [src-addr [dst-addr [netmask [trg-addr]]]]"}, - {"ipcpretry", NULL, SetVariable, LOCAL_AUTH, - "FSM retry period", "set ipcpretry value", (const void *)VAR_IPCPRETRY}, - {"lcpretry", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, - "FSM retry period", "set lcpretry value", (const void *)VAR_LCPRETRY}, + {"ipcpretry", "ipcpretries", SetVariable, LOCAL_AUTH, "IPCP retries", + "set ipcpretry value [attempts]", (const void *)VAR_IPCPRETRY}, + {"lcpretry", "lcpretries", SetVariable, LOCAL_AUTH | LOCAL_CX, "LCP retries", + "set lcpretry value [attempts]", (const void *)VAR_LCPRETRY}, {"log", NULL, log_SetLevel, LOCAL_AUTH, "log level", "set log [local] [+|-]async|cbcp|ccp|chat|command|connect|debug|hdlc|id0|" "ipcp|lcp|lqm|phase|tcp/ip|timer|tun..."}, @@ -1802,8 +1826,8 @@ static struct cmdtab const SetCommands[] = { "set nbns pri-addr [sec-addr]", (const void *)VAR_NBNS}, {"openmode", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, "open mode", "set openmode active|passive [secs]", (const void *)VAR_OPENMODE}, - {"papretry", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, - "PAP retry period", "set papretry value", (const void *)VAR_PAPRETRY}, + {"papretry", "papretries", SetVariable, LOCAL_AUTH | LOCAL_CX, "PAP retries", + "set papretry value [attempts]", (const void *)VAR_PAPRETRY}, {"parity", NULL, SetModemParity, LOCAL_AUTH | LOCAL_CX, "modem parity", "set parity [odd|even|none]"}, {"phone", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, "telephone number(s)", diff --git a/usr.sbin/ppp/datalink.c b/usr.sbin/ppp/datalink.c index 9a521761..8f0ed49 100644 --- a/usr.sbin/ppp/datalink.c +++ b/usr.sbin/ppp/datalink.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: datalink.c,v 1.32 1999/02/18 00:52:13 brian Exp $ + * $Id: datalink.c,v 1.33 1999/02/25 12:00:04 brian Exp $ */ #include <sys/param.h> @@ -808,10 +808,10 @@ datalink_Clone(struct datalink *odl, const char *name) return NULL; } pap_Init(&dl->pap, dl->physical); - dl->pap.cfg.fsmretry = odl->pap.cfg.fsmretry; + dl->pap.cfg = odl->pap.cfg; chap_Init(&dl->chap, dl->physical); - dl->chap.auth.cfg.fsmretry = odl->chap.auth.cfg.fsmretry; + dl->chap.auth.cfg = odl->chap.auth.cfg; memcpy(&dl->physical->cfg, &odl->physical->cfg, sizeof dl->physical->cfg); memcpy(&dl->physical->link.lcp.cfg, &odl->physical->link.lcp.cfg, @@ -1149,7 +1149,7 @@ iov2datalink(struct bundle *bundle, struct iovec *iov, int *niov, int maxiov, int fd) { struct datalink *dl, *cdl; - u_int retry; + struct fsm_retry copy; char *oname; dl = (struct datalink *)iov[(*niov)++].iov_base; @@ -1214,13 +1214,13 @@ iov2datalink(struct bundle *bundle, struct iovec *iov, int *niov, int maxiov, free(dl); dl = NULL; } else { - retry = dl->pap.cfg.fsmretry; + copy = dl->pap.cfg.fsm; pap_Init(&dl->pap, dl->physical); - dl->pap.cfg.fsmretry = retry; + dl->pap.cfg.fsm = copy; - retry = dl->chap.auth.cfg.fsmretry; + copy = dl->chap.auth.cfg.fsm; chap_Init(&dl->chap, dl->physical); - dl->chap.auth.cfg.fsmretry = retry; + dl->chap.auth.cfg.fsm = copy; cbcp_Init(&dl->cbcp, dl->physical); chat_Init(&dl->chat, dl->physical, NULL, 1, NULL); diff --git a/usr.sbin/ppp/defs.h b/usr.sbin/ppp/defs.h index 686df25..48f0677 100644 --- a/usr.sbin/ppp/defs.h +++ b/usr.sbin/ppp/defs.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: defs.h,v 1.39 1999/02/16 00:16:56 brian Exp $ + * $Id: defs.h,v 1.40 1999/02/25 20:05:55 brian Exp $ * * TODO: */ @@ -56,7 +56,8 @@ #define DEF_LQRPERIOD 30 /* Default LQR frequency */ #define MIN_FSMRETRY 3 /* Minimum FSM retry frequency */ #define DEF_FSMRETRY 3 /* FSM retry frequency */ -#define DEF_REQs 5 /* This number of REQs in IRC */ +#define DEF_FSMTRIES 5 /* Default max retries */ +#define DEF_FSMAUTHTRIES 3 /* Default max auth retries */ #define DEF_CDDELAY 1 /* Delay before checking for carrier */ #define CONFFILE "ppp.conf" diff --git a/usr.sbin/ppp/fsm.c b/usr.sbin/ppp/fsm.c index 5af170b..b10daee 100644 --- a/usr.sbin/ppp/fsm.c +++ b/usr.sbin/ppp/fsm.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: fsm.c,v 1.37 1998/09/04 18:25:59 brian Exp $ + * $Id: fsm.c,v 1.38 1999/01/28 01:56:31 brian Exp $ * * TODO: */ @@ -59,7 +59,7 @@ static void FsmSendConfigReq(struct fsm *); static void FsmSendTerminateReq(struct fsm *); -static void FsmInitRestartCounter(struct fsm *); +static void FsmInitRestartCounter(struct fsm *, int); typedef void (recvfn)(struct fsm *, struct fsmheader *, struct mbuf *); static recvfn FsmRecvConfigReq, FsmRecvConfigAck, FsmRecvConfigNak, @@ -129,7 +129,7 @@ StoppedTimeout(void *v) void fsm_Init(struct fsm *fp, const char *name, u_short proto, int mincode, - int maxcode, int maxcfg, int LogLevel, struct bundle *bundle, + int maxcode, int LogLevel, struct bundle *bundle, struct link *l, const struct fsm_parent *parent, struct fsm_callbacks *fn, const char *timer_names[3]) { @@ -140,7 +140,7 @@ fsm_Init(struct fsm *fp, const char *name, u_short proto, int mincode, fp->state = fp->min_code > CODE_TERMACK ? ST_OPENED : ST_INITIAL; fp->reqid = 1; fp->restart = 1; - fp->maxconfig = maxcfg; + fp->more.reqs = fp->more.naks = fp->more.rejs = 1; memset(&fp->FsmTimer, '\0', sizeof fp->FsmTimer); memset(&fp->OpenTimer, '\0', sizeof fp->OpenTimer); memset(&fp->StoppedTimer, '\0', sizeof fp->StoppedTimer); @@ -229,7 +229,7 @@ FsmOpenNow(void *v) (*fp->fn->LayerStart)(fp); (*fp->parent->LayerStart)(fp->parent->object, fp); } - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); FsmSendConfigReq(fp); NewState(fp, ST_REQSENT); } @@ -283,7 +283,7 @@ fsm_Up(struct fsm * fp) NewState(fp, ST_CLOSED); break; case ST_STARTING: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); FsmSendConfigReq(fp); NewState(fp, ST_REQSENT); break; @@ -342,7 +342,7 @@ fsm_Close(struct fsm *fp) break; case ST_OPENED: (*fp->fn->LayerDown)(fp); - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_TRM_TIMER); FsmSendTerminateReq(fp); NewState(fp, ST_CLOSING); (*fp->parent->LayerDown)(fp->parent->object, fp); @@ -350,7 +350,7 @@ fsm_Close(struct fsm *fp) case ST_REQSENT: case ST_ACKRCVD: case ST_ACKSENT: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_TRM_TIMER); FsmSendTerminateReq(fp); NewState(fp, ST_CLOSING); break; @@ -363,11 +363,13 @@ fsm_Close(struct fsm *fp) static void FsmSendConfigReq(struct fsm * fp) { - if (--fp->maxconfig > 0) { + if (fp->more.reqs-- > 0 && fp->restart-- > 0) { (*fp->fn->SendConfigReq)(fp); - timer_Start(&fp->FsmTimer); /* Start restart timer */ - fp->restart--; /* Decrement restart counter */ + timer_Start(&fp->FsmTimer); /* Start restart timer */ } else { + if (fp->more.reqs < 0) + log_Printf(LogPHASE, "%s: Too many %s REQs sent - abandoning " + "negotiation\n", fp->link->name, fp->name); fsm_Close(fp); } } @@ -429,12 +431,12 @@ FsmTimeout(void *v) } static void -FsmInitRestartCounter(struct fsm * fp) +FsmInitRestartCounter(struct fsm *fp, int what) { timer_Stop(&fp->FsmTimer); fp->FsmTimer.func = FsmTimeout; - fp->FsmTimer.arg = (void *) fp; - (*fp->fn->InitRestartCounter)(fp); + fp->FsmTimer.arg = (void *)fp; + (*fp->fn->InitRestartCounter)(fp, what); } /* @@ -510,7 +512,7 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) switch (fp->state) { case ST_STOPPED: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); /* Fall through */ case ST_OPENED: @@ -526,8 +528,17 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) fsm_Output(fp, CODE_CONFIGACK, lhp->id, dec.ack, dec.ackend - dec.ack); switch (fp->state) { - case ST_OPENED: case ST_STOPPED: + /* + * According to the RFC (1661) state transition table, a TLS isn't + * required for a RCR when state == ST_STOPPED, but the RFC + * must be wrong as TLS hasn't yet been called (since the last TLF) + */ + (*fp->fn->LayerStart)(fp); + (*fp->parent->LayerStart)(fp->parent->object, fp); + /* Fall through */ + + case ST_OPENED: if (ackaction) NewState(fp, ST_ACKSENT); else @@ -544,7 +555,7 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) (*fp->parent->LayerUp)(fp->parent->object, fp); else { (*fp->fn->LayerDown)(fp); - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_TRM_TIMER); FsmSendTerminateReq(fp); NewState(fp, ST_CLOSING); } @@ -556,6 +567,19 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) break; } mbuf_Free(bp); + + if (dec.rejend != dec.rej && --fp->more.rejs <= 0) { + log_Printf(LogPHASE, "%s: Too many %s REJs sent - abandoning negotiation\n", + fp->link->name, fp->name); + fsm_Close(fp); + } + + if (dec.nakend != dec.nak && --fp->more.naks <= 0) { + fsm_Close(fp); + log_Printf(LogPHASE, "%s: Too many %s NAKs sent - abandoning negotiation\n", + fp->link->name, fp->name); + fsm_Close(fp); + } } static void @@ -571,7 +595,7 @@ FsmRecvConfigAck(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) case ST_STOPPING: break; case ST_REQSENT: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); NewState(fp, ST_ACKRCVD); break; case ST_ACKRCVD: @@ -579,13 +603,13 @@ FsmRecvConfigAck(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) NewState(fp, ST_REQSENT); break; case ST_ACKSENT: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); NewState(fp, ST_OPENED); if ((*fp->fn->LayerUp)(fp)) (*fp->parent->LayerUp)(fp->parent->object, fp); else { (*fp->fn->LayerDown)(fp); - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_TRM_TIMER); FsmSendTerminateReq(fp); NewState(fp, ST_CLOSING); } @@ -645,7 +669,7 @@ FsmRecvConfigNak(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) switch (fp->state) { case ST_REQSENT: case ST_ACKSENT: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); FsmSendConfigReq(fp); break; case ST_OPENED: @@ -688,11 +712,12 @@ FsmRecvTermReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) case ST_OPENED: (*fp->fn->LayerDown)(fp); (*fp->fn->SendTerminateAck)(fp, lhp->id); - FsmInitRestartCounter(fp); - timer_Start(&fp->FsmTimer); /* Start restart timer */ + FsmInitRestartCounter(fp, FSM_TRM_TIMER); + timer_Start(&fp->FsmTimer); /* Start restart timer */ fp->restart = 0; NewState(fp, ST_STOPPING); (*fp->parent->LayerDown)(fp->parent->object, fp); + /* A delayed ST_STOPPED is now scheduled */ break; } mbuf_Free(bp); @@ -771,7 +796,7 @@ FsmRecvConfigRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) switch (fp->state) { case ST_REQSENT: case ST_ACKSENT: - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); FsmSendConfigReq(fp); break; case ST_OPENED: @@ -999,7 +1024,7 @@ fsm_Reopen(struct fsm *fp) { if (fp->state == ST_OPENED) { (*fp->fn->LayerDown)(fp); - FsmInitRestartCounter(fp); + FsmInitRestartCounter(fp, FSM_REQ_TIMER); FsmSendConfigReq(fp); NewState(fp, ST_REQSENT); (*fp->parent->LayerDown)(fp->parent->object, fp); @@ -1009,6 +1034,9 @@ fsm_Reopen(struct fsm *fp) void fsm2initial(struct fsm *fp) { + timer_Stop(&fp->FsmTimer); + timer_Stop(&fp->OpenTimer); + timer_Stop(&fp->StoppedTimer); if (fp->state == ST_STOPPED) fsm_Close(fp); if (fp->state > ST_INITIAL) diff --git a/usr.sbin/ppp/fsm.h b/usr.sbin/ppp/fsm.h index 6a047ba..c25a6ba 100644 --- a/usr.sbin/ppp/fsm.h +++ b/usr.sbin/ppp/fsm.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: fsm.h,v 1.18 1998/06/20 00:19:38 brian Exp $ + * $Id: fsm.h,v 1.19 1998/06/25 22:33:24 brian Exp $ * * TODO: */ @@ -45,8 +45,17 @@ #define OPEN_PASSIVE -1 +#define FSM_REQ_TIMER 1 +#define FSM_TRM_TIMER 2 + struct fsm; +struct fsm_retry { + u_int timeout; /* FSM retry frequency */ + u_int maxreq; /* Max Config REQ retries */ + u_int maxtrm; /* Max Term REQ retries */ +}; + struct fsm_decode { u_char ack[100], *ackend; u_char nak[100], *nakend; @@ -58,7 +67,7 @@ struct fsm_callbacks { void (*LayerDown) (struct fsm *); /* About to come down (tld) */ void (*LayerStart) (struct fsm *); /* Layer about to start up (tls) */ void (*LayerFinish) (struct fsm *); /* Layer now down (tlf) */ - void (*InitRestartCounter) (struct fsm *); /* Set fsm timer load */ + void (*InitRestartCounter) (struct fsm *, int); /* Set fsm timer load */ void (*SendConfigReq) (struct fsm *); /* Send REQ please */ void (*SentTerminateReq) (struct fsm *); /* Term REQ just sent */ void (*SendTerminateAck) (struct fsm *, u_char); /* Send Term ACK please */ @@ -88,7 +97,12 @@ struct fsm { int state; /* State of the machine */ u_char reqid; /* Next request id */ int restart; /* Restart counter value */ - int maxconfig; /* Max config REQ before a close() */ + + struct { + int reqs; /* Max config REQs before a close() */ + int naks; /* Max config NAKs before a close() */ + int rejs; /* Max config REJs before a close() */ + } more; struct pppTimer FsmTimer; /* Restart Timer */ struct pppTimer OpenTimer; /* Delay before opening */ @@ -143,7 +157,7 @@ struct fsmconfig { u_char length; }; -extern void fsm_Init(struct fsm *, const char *, u_short, int, int, int, int, +extern void fsm_Init(struct fsm *, const char *, u_short, int, int, int, struct bundle *, struct link *, const struct fsm_parent *, struct fsm_callbacks *, const char *[3]); extern void fsm_Output(struct fsm *, u_int, u_int, u_char *, int); diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c index a430994..48ac07b 100644 --- a/usr.sbin/ppp/ipcp.c +++ b/usr.sbin/ppp/ipcp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ipcp.c,v 1.70 1999/02/02 20:27:12 brian Exp $ + * $Id: ipcp.c,v 1.71 1999/02/06 02:54:45 brian Exp $ * * TODO: * o More RFC1772 backward compatibility @@ -96,7 +96,7 @@ static int IpcpLayerUp(struct fsm *); static void IpcpLayerDown(struct fsm *); static void IpcpLayerStart(struct fsm *); static void IpcpLayerFinish(struct fsm *); -static void IpcpInitRestartCounter(struct fsm *); +static void IpcpInitRestartCounter(struct fsm *, int); static void IpcpSendConfigReq(struct fsm *); static void IpcpSentTerminateReq(struct fsm *); static void IpcpSendTerminateAck(struct fsm *, u_char); @@ -282,6 +282,10 @@ ipcp_Show(struct cmdargs const *arg) } prompt_Printf(arg->prompt, "\nDefaults:\n"); + prompt_Printf(arg->prompt, " FSM retry = %us, max %u Config" + " REQ%s, %u Term REQ%s\n", ipcp->cfg.fsm.timeout, + ipcp->cfg.fsm.maxreq, ipcp->cfg.fsm.maxreq == 1 ? "" : "s", + ipcp->cfg.fsm.maxtrm, ipcp->cfg.fsm.maxtrm == 1 ? "" : "s"); prompt_Printf(arg->prompt, " My Address: %s/%d", inet_ntoa(ipcp->cfg.my_range.ipaddr), ipcp->cfg.my_range.width); @@ -348,7 +352,7 @@ ipcp_Init(struct ipcp *ipcp, struct bundle *bundle, struct link *l, static const char *timer_names[] = {"IPCP restart", "IPCP openmode", "IPCP stopped"}; - fsm_Init(&ipcp->fsm, "IPCP", PROTO_IPCP, 1, IPCP_MAXCODE, 10, LogIPCP, + fsm_Init(&ipcp->fsm, "IPCP", PROTO_IPCP, 1, IPCP_MAXCODE, LogIPCP, bundle, l, parent, &ipcp_Callbacks, timer_names); ipcp->route = NULL; @@ -371,7 +375,9 @@ ipcp_Init(struct ipcp *ipcp, struct bundle *bundle, struct link *l, ipcp->cfg.ns.nbns[0].s_addr = INADDR_ANY; ipcp->cfg.ns.nbns[1].s_addr = INADDR_ANY; - ipcp->cfg.fsmretry = DEF_FSMRETRY; + ipcp->cfg.fsm.timeout = DEF_FSMRETRY; + ipcp->cfg.fsm.maxreq = DEF_FSMTRIES; + ipcp->cfg.fsm.maxtrm = DEF_FSMTRIES; ipcp->cfg.vj.neg = NEG_ENABLED|NEG_ACCEPTED; memset(&ipcp->vj, '\0', sizeof ipcp->vj); @@ -394,7 +400,6 @@ ipcp_Setup(struct ipcp *ipcp, u_int32_t mask) int pos, n; ipcp->fsm.open_mode = 0; - ipcp->fsm.maxconfig = 10; ipcp->ifmask.s_addr = mask == INADDR_NONE ? ipcp->cfg.netmask.s_addr : mask; if (iplist_isvalid(&ipcp->cfg.peer_list)) { @@ -571,13 +576,23 @@ ChooseHisAddr(struct bundle *bundle, struct in_addr gw) } static void -IpcpInitRestartCounter(struct fsm * fp) +IpcpInitRestartCounter(struct fsm *fp, int what) { /* Set fsm timer load */ struct ipcp *ipcp = fsm2ipcp(fp); - fp->FsmTimer.load = ipcp->cfg.fsmretry * SECTICKS; - fp->restart = DEF_REQs; + fp->FsmTimer.load = ipcp->cfg.fsm.timeout * SECTICKS; + switch (what) { + case FSM_REQ_TIMER: + fp->restart = ipcp->cfg.fsm.maxreq; + break; + case FSM_TRM_TIMER: + fp->restart = ipcp->cfg.fsm.maxtrm; + break; + default: + fp->restart = 1; + break; + } } static void @@ -628,7 +643,7 @@ IpcpSendConfigReq(struct fsm *fp) } static void -IpcpSentTerminateReq(struct fsm * fp) +IpcpSentTerminateReq(struct fsm *fp) { /* Term REQ just sent by FSM */ } @@ -649,8 +664,7 @@ IpcpLayerStart(struct fsm *fp) log_Printf(LogIPCP, "%s: LayerStart.\n", fp->link->name); throughput_start(&ipcp->throughput, "IPCP throughput", Enabled(fp->bundle, OPT_THROUGHPUT)); - - /* This is where we should be setting up the interface in AUTO mode */ + fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3; } static void @@ -765,7 +779,9 @@ IpcpLayerUp(struct fsm *fp) system_Select(fp->bundle, "MYADDR", LINKUPFILE, NULL, NULL); } + fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3; log_DisplayPrompts(); + return 1; } diff --git a/usr.sbin/ppp/ipcp.h b/usr.sbin/ppp/ipcp.h index 2c6b5e1..5681bd0 100644 --- a/usr.sbin/ppp/ipcp.h +++ b/usr.sbin/ppp/ipcp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ipcp.h,v 1.22 1998/10/26 19:07:39 brian Exp $ + * $Id: ipcp.h,v 1.23 1999/01/28 01:56:32 brian Exp $ * * TODO: */ @@ -77,7 +77,7 @@ struct ipcp { struct in_addr nbns[2]; /* NetBIOS NS addresses offered */ } ns; - u_int fsmretry; /* FSM retry frequency */ + struct fsm_retry fsm; /* How often/frequently to resend requests */ } cfg; struct { diff --git a/usr.sbin/ppp/lcp.c b/usr.sbin/ppp/lcp.c index 61d58251..009cc06 100644 --- a/usr.sbin/ppp/lcp.c +++ b/usr.sbin/ppp/lcp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: lcp.c,v 1.67 1999/01/28 01:56:32 brian Exp $ + * $Id: lcp.c,v 1.68 1999/02/18 00:52:14 brian Exp $ * * TODO: * o Limit data field length by MRU @@ -81,7 +81,7 @@ static int LcpLayerUp(struct fsm *); static void LcpLayerDown(struct fsm *); static void LcpLayerStart(struct fsm *); static void LcpLayerFinish(struct fsm *); -static void LcpInitRestartCounter(struct fsm *); +static void LcpInitRestartCounter(struct fsm *, int); static void LcpSendConfigReq(struct fsm *); static void LcpSentTerminateReq(struct fsm *); static void LcpSendTerminateAck(struct fsm *, u_char); @@ -171,8 +171,10 @@ lcp_ReportStatus(struct cmdargs const *arg) lcp->cfg.openmode == OPEN_PASSIVE ? "passive" : "active"); if (lcp->cfg.openmode > 0) prompt_Printf(arg->prompt, " (delay %ds)", lcp->cfg.openmode); - prompt_Printf(arg->prompt, "\n FSM retry = %us\n", - lcp->cfg.fsmretry); + prompt_Printf(arg->prompt, "\n FSM retry = %us, max %u Config" + " REQ%s, %u Term REQ%s\n", lcp->cfg.fsm.timeout, + lcp->cfg.fsm.maxreq, lcp->cfg.fsm.maxreq == 1 ? "" : "s", + lcp->cfg.fsm.maxtrm, lcp->cfg.fsm.maxtrm == 1 ? "" : "s"); prompt_Printf(arg->prompt, "\n Negotiation:\n"); prompt_Printf(arg->prompt, " ACFCOMP = %s\n", command_ShowNegval(lcp->cfg.acfcomp)); @@ -218,14 +220,16 @@ lcp_Init(struct lcp *lcp, struct bundle *bundle, struct link *l, /* Initialise ourselves */ int mincode = parent ? 1 : LCP_MINMPCODE; - fsm_Init(&lcp->fsm, "LCP", PROTO_LCP, mincode, LCP_MAXCODE, 10, LogLCP, + fsm_Init(&lcp->fsm, "LCP", PROTO_LCP, mincode, LCP_MAXCODE, LogLCP, bundle, l, parent, &lcp_Callbacks, lcp_TimerNames); lcp->cfg.mru = DEF_MRU; lcp->cfg.accmap = 0; lcp->cfg.openmode = 1; lcp->cfg.lqrperiod = DEF_LQRPERIOD; - lcp->cfg.fsmretry = DEF_FSMRETRY; + lcp->cfg.fsm.timeout = DEF_FSMRETRY; + lcp->cfg.fsm.maxreq = DEF_FSMTRIES; + lcp->cfg.fsm.maxtrm = DEF_FSMTRIES; lcp->cfg.acfcomp = NEG_ENABLED|NEG_ACCEPTED; lcp->cfg.chap05 = NEG_ACCEPTED; @@ -244,7 +248,6 @@ void lcp_Setup(struct lcp *lcp, int openmode) { lcp->fsm.open_mode = openmode; - lcp->fsm.maxconfig = 10; lcp->his_mru = lcp->fsm.bundle->cfg.mtu; if (!lcp->his_mru || lcp->his_mru > DEF_MRU) @@ -311,13 +314,23 @@ lcp_Setup(struct lcp *lcp, int openmode) } static void -LcpInitRestartCounter(struct fsm * fp) +LcpInitRestartCounter(struct fsm *fp, int what) { /* Set fsm timer load */ struct lcp *lcp = fsm2lcp(fp); - fp->FsmTimer.load = lcp->cfg.fsmretry * SECTICKS; - fp->restart = DEF_REQs; + fp->FsmTimer.load = lcp->cfg.fsm.timeout * SECTICKS; + switch (what) { + case FSM_REQ_TIMER: + fp->restart = lcp->cfg.fsm.maxreq; + break; + case FSM_TRM_TIMER: + fp->restart = lcp->cfg.fsm.maxtrm; + break; + default: + fp->restart = 1; + break; + } } static void @@ -429,7 +442,7 @@ lcp_SendProtoRej(struct lcp *lcp, u_char *option, int count) } static void -LcpSentTerminateReq(struct fsm * fp) +LcpSentTerminateReq(struct fsm *fp) { /* Term REQ just sent by FSM */ } @@ -454,6 +467,7 @@ LcpLayerStart(struct fsm *fp) log_Printf(LogLCP, "%s: LayerStart\n", fp->link->name); lcp->LcpFailedMagic = 0; + fp->more.reqs = fp->more.naks = fp->more.rejs = lcp->cfg.fsm.maxreq * 3; } static void @@ -474,6 +488,8 @@ LcpLayerUp(struct fsm *fp) async_SetLinkParams(&p->async, lcp); lqr_Start(lcp); hdlc_StartTimer(&p->hdlc); + fp->more.reqs = fp->more.naks = fp->more.rejs = lcp->cfg.fsm.maxreq * 3; + return 1; } @@ -764,8 +780,12 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type, " without DES)\n"); else #endif - log_Printf(LogLCP, "Peer will only send %s (not supported)\n", - Auth2Nam(PROTO_CHAP, cp[4])); + log_Printf(LogLCP, "Peer will only send %s (not %s)\n", + Auth2Nam(PROTO_CHAP, cp[4]), +#ifdef HAVE_DES + cp[4] == 0x80 ? "configured" : +#endif + "supported"); lcp->his_reject |= (1 << type); } break; @@ -1062,7 +1082,7 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type, } break; - case MODE_NAK: /* Treat this as a REJ, we don't vary or disc */ + case MODE_NAK: /* Treat this as a REJ, we don't vary our disc */ case MODE_REJ: lcp->his_reject |= (1 << type); break; @@ -1130,7 +1150,7 @@ reqreject: } void -lcp_Input(struct lcp *lcp, struct mbuf * bp) +lcp_Input(struct lcp *lcp, struct mbuf *bp) { /* Got PROTO_LCP from link */ fsm_Input(&lcp->fsm, bp); diff --git a/usr.sbin/ppp/lcp.h b/usr.sbin/ppp/lcp.h index 609a6e5..47a984d 100644 --- a/usr.sbin/ppp/lcp.h +++ b/usr.sbin/ppp/lcp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: lcp.h,v 1.19 1998/08/07 18:42:49 brian Exp $ + * $Id: lcp.h,v 1.20 1999/02/18 00:52:15 brian Exp $ * * TODO: */ @@ -77,8 +77,7 @@ struct lcp { u_int32_t accmap; /* Initial ACCMAP value */ int openmode; /* when to start CFG REQs */ u_int32_t lqrperiod; /* LQR frequency (seconds) */ - u_int fsmretry; /* FSM retry frequency */ - + struct fsm_retry fsm; /* How often/frequently to resend requests */ unsigned acfcomp : 2; /* Address & Control Field Compression neg */ unsigned chap05 : 2; /* Challenge Handshake Authentication proto */ #ifdef HAVE_DES diff --git a/usr.sbin/ppp/modem.c b/usr.sbin/ppp/modem.c index 26a9d49..4d079dd 100644 --- a/usr.sbin/ppp/modem.c +++ b/usr.sbin/ppp/modem.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: modem.c,v 1.102 1999/02/16 00:16:56 brian Exp $ + * $Id: modem.c,v 1.103 1999/02/25 20:05:55 brian Exp $ * * TODO: */ @@ -810,6 +810,8 @@ modem_Close(struct physical *modem) if (!modem->isatty) { modem_PhysicalClose(modem); + if (*modem->name.full == '/') + modem_Unlock(modem); *modem->name.full = '\0'; modem->name.base = modem->name.full; return; diff --git a/usr.sbin/ppp/ppp.8 b/usr.sbin/ppp/ppp.8 index 4ef3c32..ed513f2 100644 --- a/usr.sbin/ppp/ppp.8 +++ b/usr.sbin/ppp/ppp.8 @@ -1,4 +1,4 @@ -.\" $Id: ppp.8,v 1.150 1999/02/18 00:52:15 brian Exp $ +.\" $Id: ppp.8,v 1.151 1999/02/25 12:00:04 brian Exp $ .Dd 20 September 1995 .nr XX \w'\fC00' .Os FreeBSD @@ -3588,17 +3588,41 @@ In all cases, if the interface is already configured, .Nm will try to maintain the interface IP numbers so that any existing bound sockets will remain valid. -.It set ccpretry Ar period -.It set chapretry Ar period -.It set ipcpretry Ar period -.It set lcpretry Ar period -.It set papretry Ar period +.It "set ccpretry|ccpretries" Ar "[timeout [reqtries [trmtries]]]" +.It "set chapretry|chapretries" Ar "[timeout [reqtries]]" +.It "set ipcpretry|ipcpretries" Ar "[timeout [reqtries [trmtries]]]" +.It "set lcpretry|lcpretries" Ar "[timeout [reqtries [trmtries]]]" +.It "set papretry|papretries" Ar "[timeout [reqtries]]" These commands set the number of seconds that .Nm will wait before resending Finite State Machine (FSM) Request packets. The default -.Ar period +.Ar timeout for all FSMs is 3 seconds (which should suffice in most cases). +.Pp +If +.Ar reqtries +is specified, it tells +.Nm +how many configuration request attempts it should make while receiving +no reply from the peer before giving up. The default is 5 attempts for +CCP, LCP and IPCP and 3 attempts for PAP and CHAP. +.Pp +If +.Ar trmtries +is specified, it tells +.Nm +how many terminate requests should be sent before giving up waiting for the +peers response. The default is 3 attempts. Authentication protocols are +not terminated and it is therefore invalid to specify +.Ar trmtries +for PAP or CHAP. +.Pp +In order to avoid netogiations with the peer that will never converge, +.Nm +will only send at most 3 times the configured number of +.Ar reqtries +in any given negotiation session before giving up and closing that layer. .It set log [local] [+|-] Ns Ar value... This command allows the adjustment of the current log level. Refer to the Logging Facility section for further details. diff --git a/usr.sbin/ppp/ppp.8.m4 b/usr.sbin/ppp/ppp.8.m4 index 4ef3c32..ed513f2 100644 --- a/usr.sbin/ppp/ppp.8.m4 +++ b/usr.sbin/ppp/ppp.8.m4 @@ -1,4 +1,4 @@ -.\" $Id: ppp.8,v 1.150 1999/02/18 00:52:15 brian Exp $ +.\" $Id: ppp.8,v 1.151 1999/02/25 12:00:04 brian Exp $ .Dd 20 September 1995 .nr XX \w'\fC00' .Os FreeBSD @@ -3588,17 +3588,41 @@ In all cases, if the interface is already configured, .Nm will try to maintain the interface IP numbers so that any existing bound sockets will remain valid. -.It set ccpretry Ar period -.It set chapretry Ar period -.It set ipcpretry Ar period -.It set lcpretry Ar period -.It set papretry Ar period +.It "set ccpretry|ccpretries" Ar "[timeout [reqtries [trmtries]]]" +.It "set chapretry|chapretries" Ar "[timeout [reqtries]]" +.It "set ipcpretry|ipcpretries" Ar "[timeout [reqtries [trmtries]]]" +.It "set lcpretry|lcpretries" Ar "[timeout [reqtries [trmtries]]]" +.It "set papretry|papretries" Ar "[timeout [reqtries]]" These commands set the number of seconds that .Nm will wait before resending Finite State Machine (FSM) Request packets. The default -.Ar period +.Ar timeout for all FSMs is 3 seconds (which should suffice in most cases). +.Pp +If +.Ar reqtries +is specified, it tells +.Nm +how many configuration request attempts it should make while receiving +no reply from the peer before giving up. The default is 5 attempts for +CCP, LCP and IPCP and 3 attempts for PAP and CHAP. +.Pp +If +.Ar trmtries +is specified, it tells +.Nm +how many terminate requests should be sent before giving up waiting for the +peers response. The default is 3 attempts. Authentication protocols are +not terminated and it is therefore invalid to specify +.Ar trmtries +for PAP or CHAP. +.Pp +In order to avoid netogiations with the peer that will never converge, +.Nm +will only send at most 3 times the configured number of +.Ar reqtries +in any given negotiation session before giving up and closing that layer. .It set log [local] [+|-] Ns Ar value... This command allows the adjustment of the current log level. Refer to the Logging Facility section for further details. |