X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Ffsm.c;h=4ac0cb6b8dddb878956631b246f5ef03c607551f;hp=426e86d79814fbbaa7342503b8873aca61fa768c;hb=36b9eaf645b253e2ce4b1904f325835e427fc321;hpb=6a34bc9a3edf435bc67e81755b65acb6786c98b3 diff --git a/pppd/fsm.c b/pppd/fsm.c index 426e86d..4ac0cb6 100644 --- a/pppd/fsm.c +++ b/pppd/fsm.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: fsm.c,v 1.6 1994/10/22 11:54:04 paulus Exp $"; +static char rcsid[] = "$Id: fsm.c,v 1.9 1995/10/27 03:43:46 paulus Exp $"; #endif /* @@ -48,7 +48,7 @@ static void fsm_sconfreq __P((fsm *, int)); #define PROTO_NAME(f) ((f)->callbacks->proto_name) -int peer_mru[N_PPP]; +int peer_mru[NUM_PPP]; /* @@ -470,6 +470,7 @@ fsm_rconfack(f, id, inp, len) case ACKRCVD: /* Huh? an extra valid Ack? oh well... */ + UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */ fsm_sconfreq(f, 0); f->state = REQSENT; break; @@ -504,6 +505,7 @@ fsm_rconfnakrej(f, code, id, inp, len) int len; { int (*proc)(); + int ret; FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d.", PROTO_NAME(f), id)); @@ -511,7 +513,7 @@ fsm_rconfnakrej(f, code, id, inp, len) if (id != f->reqid || f->seen_ack) /* Expected id? */ return; /* Nope, toss... */ proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci; - if (!proc || !proc(f, inp, len)) { + if (!proc || !(ret = proc(f, inp, len))) { /* Nak/reject is bad - ignore it */ FSMDEBUG((LOG_INFO, "%s: received bad %s (length %d)", PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len)); @@ -529,11 +531,15 @@ fsm_rconfnakrej(f, code, id, inp, len) case ACKSENT: /* They didn't agree to what we wanted - try another request */ UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */ - fsm_sconfreq(f, 0); /* Send Configure-Request */ + if (ret < 0) + f->state = STOPPED; /* kludge for stopping CCP */ + else + fsm_sconfreq(f, 0); /* Send Configure-Request */ break; case ACKRCVD: /* Got a Nak/reject when we had already had an Ack?? oh well... */ + UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */ fsm_sconfreq(f, 0); f->state = REQSENT; break; @@ -591,11 +597,13 @@ fsm_rtermack(f) switch (f->state) { case CLOSING: + UNTIMEOUT(fsm_timeout, (caddr_t) f); f->state = CLOSED; if( f->callbacks->finished ) (*f->callbacks->finished)(f); break; case STOPPING: + UNTIMEOUT(fsm_timeout, (caddr_t) f); f->state = STOPPED; if( f->callbacks->finished ) (*f->callbacks->finished)(f);