From 8a8d99276fbe426bfd91cf4527394b482fe4404f Mon Sep 17 00:00:00 2001 From: Brian Somers Date: Mon, 1 Mar 1999 02:52:39 +0000 Subject: [PATCH] Comment why we do a TLF when we get a ``Down'' event in state ``closing''. Pointed out by: archie Don't do a TLF when we get a ``Catastrphic Protocol Reject'' event in state ``closed'' or ``stopped''. Pointed out but not suggested by: archie This makes no difference in the current implementation as LcpLayerFinish() does nothing but log the event, but I disagree in principle because it unbalances the TLF/TLS calls which (IMHO) doesn't fit with the intentions of the RFC. Maybe the RFC author had a reason for this. It can only happen in two circumstances: - if LCP has already been negotiated then stopped or closed and we receive a protocol reject, then we must already have done a TLF. Why do one again and stay in the same state ? - if LCP hasn't yet been started and we receive an unsolicted protocol reject, why should we TLF when we haven't done a TLS ? --- usr.sbin/ppp/fsm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/usr.sbin/ppp/fsm.c b/usr.sbin/ppp/fsm.c index b10daeeceb8..149087c496e 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.38 1999/01/28 01:56:31 brian Exp $ + * $Id: fsm.c,v 1.39 1999/02/26 21:28:11 brian Exp $ * * TODO: */ @@ -302,6 +302,7 @@ fsm_Down(struct fsm *fp) NewState(fp, ST_INITIAL); break; case ST_CLOSING: + /* This TLF contradicts the RFC (1661), which ``misses it out'' ! */ (*fp->fn->LayerFinish)(fp); NewState(fp, ST_INITIAL); (*fp->parent->LayerFinish)(fp->parent->object, fp); @@ -841,7 +842,8 @@ FsmRecvProtoRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) case PROTO_CCP: if (fp->proto == PROTO_LCP) { fp = &fp->link->ccp.fsm; - (*fp->fn->LayerFinish)(fp); + /* Despite the RFC (1661), don't do an out-of-place TLF */ + /* (*fp->fn->LayerFinish)(fp); */ switch (fp->state) { case ST_CLOSED: case ST_CLOSING: @@ -850,7 +852,8 @@ FsmRecvProtoRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) NewState(fp, ST_STOPPED); break; } - (*fp->parent->LayerFinish)(fp->parent->object, fp); + /* See above */ + /* (*fp->parent->LayerFinish)(fp->parent->object, fp); */ } break; case PROTO_MP: