diff --git a/src/include/netif/ppp/fsm.h b/src/include/netif/ppp/fsm.h index d4318c5e..cd12075f 100644 --- a/src/include/netif/ppp/fsm.h +++ b/src/include/netif/ppp/fsm.h @@ -82,13 +82,11 @@ typedef struct fsm { u8_t flags; /* Contains option bits */ u8_t id; /* Current id */ u8_t reqid; /* Current request id */ - u8_t timeouttime; /* Timeout time in seconds */ - u8_t maxconfreqtransmits; /* Maximum Configure-Request transmissions */ u8_t retransmits; /* Number of retransmissions left */ - u8_t maxtermtransmits; /* Maximum Terminate-Request transmissions */ u8_t nakloops; /* Number of nak loops since last ack */ u8_t rnakloops; /* Number of naks received */ - u8_t maxnakloops; /* Maximum number of nak loops tolerated */ + u8_t maxnakloops; /* Maximum number of nak loops tolerated + (necessary because IPCP require a custom large max nak loops value) */ u8_t term_reason_len; /* Length of term_reason */ } fsm; diff --git a/src/include/netif/ppp/ppp.h b/src/include/netif/ppp/ppp.h index 8768ae85..30bb67af 100644 --- a/src/include/netif/ppp/ppp.h +++ b/src/include/netif/ppp/ppp.h @@ -249,6 +249,11 @@ typedef struct ppp_settings_s { #endif /* PPP_SERVER */ #endif /* EAP_SUPPORT */ + u8_t fsm_timeout_time; /* Timeout time in seconds */ + u8_t fsm_max_conf_req_transmits; /* Maximum Configure-Request transmissions */ + u8_t fsm_max_term_transmits; /* Maximum Terminate-Request transmissions */ + u8_t fsm_max_nak_loops; /* Maximum number of nak loops tolerated */ + u8_t lcp_loopbackfail; /* Number of times we receive our magic number from the peer before deciding the link is looped-back. */ u8_t lcp_echo_interval; /* Interval between LCP echo-requests */ diff --git a/src/netif/ppp/fsm.c b/src/netif/ppp/fsm.c index ad04dcb9..896eb7a2 100644 --- a/src/netif/ppp/fsm.c +++ b/src/netif/ppp/fsm.c @@ -76,13 +76,11 @@ static void fsm_sconfreq(fsm *f, int retransmit); * Initialize fsm state. */ void fsm_init(fsm *f) { + ppp_pcb *pcb = f->pcb; f->state = PPP_FSM_INITIAL; f->flags = 0; f->id = 0; /* XXX Start with random id? */ - f->timeouttime = FSM_DEFTIMEOUT; - f->maxconfreqtransmits = FSM_DEFMAXCONFREQS; - f->maxtermtransmits = FSM_DEFMAXTERMREQS; - f->maxnakloops = FSM_DEFMAXNAKLOOPS; + f->maxnakloops = pcb->settings.fsm_max_nak_loops; f->term_reason_len = 0; } @@ -198,13 +196,15 @@ void fsm_open(fsm *f) { * send a terminate-request message as configured. */ static void terminate_layer(fsm *f, int nextstate) { + ppp_pcb *pcb = f->pcb; + if( f->state != PPP_FSM_OPENED ) UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ else if( f->callbacks->down ) (*f->callbacks->down)(f); /* Inform upper layers we're down */ /* Init restart counter and send Terminate-Request */ - f->retransmits = f->maxtermtransmits; + f->retransmits = pcb->settings.fsm_max_term_transmits; fsm_sdata(f, TERMREQ, f->reqid = ++f->id, (u_char *) f->term_reason, f->term_reason_len); @@ -220,7 +220,7 @@ static void terminate_layer(fsm *f, int nextstate) { return; } - TIMEOUT(fsm_timeout, f, f->timeouttime); + TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); --f->retransmits; f->state = nextstate; @@ -261,6 +261,7 @@ void fsm_close(fsm *f, char *reason) { */ static void fsm_timeout(void *arg) { fsm *f = (fsm *) arg; + ppp_pcb *pcb = f->pcb; switch (f->state) { case PPP_FSM_CLOSING: @@ -276,7 +277,7 @@ static void fsm_timeout(void *arg) { /* Send Terminate-Request */ fsm_sdata(f, TERMREQ, f->reqid = ++f->id, (u_char *) f->term_reason, f->term_reason_len); - TIMEOUT(fsm_timeout, f, f->timeouttime); + TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); --f->retransmits; } break; @@ -450,6 +451,8 @@ static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) { * fsm_rconfack - Receive Configure-Ack. */ static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) { + ppp_pcb *pcb = f->pcb; + if (id != f->reqid || f->seen_ack) /* Expected id? */ return; /* Nope, toss... */ if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len): @@ -469,7 +472,7 @@ static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) { case PPP_FSM_REQSENT: f->state = PPP_FSM_ACKRCVD; - f->retransmits = f->maxconfreqtransmits; + f->retransmits = pcb->settings.fsm_max_conf_req_transmits; break; case PPP_FSM_ACKRCVD: @@ -482,7 +485,7 @@ static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) { case PPP_FSM_ACKSENT: UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ f->state = PPP_FSM_OPENED; - f->retransmits = f->maxconfreqtransmits; + f->retransmits = pcb->settings.fsm_max_conf_req_transmits; if (f->callbacks->up) (*f->callbacks->up)(f); /* Inform upper layers */ break; @@ -565,6 +568,8 @@ static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) { * fsm_rtermreq - Receive Terminate-Req. */ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) { + ppp_pcb *pcb = f->pcb; + switch (f->state) { case PPP_FSM_ACKRCVD: case PPP_FSM_ACKSENT: @@ -580,7 +585,7 @@ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) { f->state = PPP_FSM_STOPPING; if (f->callbacks->down) (*f->callbacks->down)(f); /* Inform upper layers */ - TIMEOUT(fsm_timeout, f, f->timeouttime); + TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); break; } @@ -700,7 +705,7 @@ static void fsm_sconfreq(fsm *f, int retransmit) { if( !retransmit ){ /* New request - reset retransmission counter, use new ID */ - f->retransmits = f->maxconfreqtransmits; + f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->reqid = ++f->id; } @@ -738,7 +743,7 @@ static void fsm_sconfreq(fsm *f, int retransmit) { /* start the retransmit timer */ --f->retransmits; - TIMEOUT(fsm_timeout, f, f->timeouttime); + TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); } diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c index a99980fe..4c459b28 100644 --- a/src/netif/ppp/ppp.c +++ b/src/netif/ppp/ppp.c @@ -257,6 +257,7 @@ ppp_pcb *ppp_new(void) { /* default configuration */ pcb->settings.usepeerdns = 1; + #if PAP_SUPPORT pcb->settings.pap_timeout_time = UPAP_DEFTIMEOUT; pcb->settings.pap_max_transmits = UPAP_DEFTRANSMITS; @@ -264,6 +265,7 @@ ppp_pcb *ppp_new(void) { pcb->settings.pap_req_timeout = UPAP_DEFREQTIME; #endif /* PPP_SERVER */ #endif /* PAP_SUPPORT */ + #if CHAP_SUPPORT pcb->settings.chap_timeout_time = CHAP_DEFTIMEOUT; pcb->settings.chap_max_transmits = CHAP_DEFTRANSMITS; @@ -271,6 +273,7 @@ ppp_pcb *ppp_new(void) { pcb->settings.chap_rechallenge_time = CHAP_DEFREQTIME; #endif /* PPP_SERVER */ #endif /* CHAP_SUPPPORT */ + #if EAP_SUPPORT pcb->settings.eap_req_time = EAP_DEFREQTIME; pcb->settings.eap_allow_req = EAP_DEFALLOWREQ; @@ -279,10 +282,16 @@ ppp_pcb *ppp_new(void) { pcb->settings.eap_max_transmits = EAP_DEFTRANSMITS; #endif /* PPP_SERVER */ #endif /* EAP_SUPPORT */ + pcb->settings.lcp_loopbackfail = LCP_DEFLOOPBACKFAIL; pcb->settings.lcp_echo_interval = LCP_ECHOINTERVAL; pcb->settings.lcp_echo_fails = LCP_MAXECHOFAILS; + pcb->settings.fsm_timeout_time = FSM_DEFTIMEOUT; + pcb->settings.fsm_max_conf_req_transmits = FSM_DEFMAXCONFREQS; + pcb->settings.fsm_max_term_transmits = FSM_DEFMAXTERMREQS; + pcb->settings.fsm_max_nak_loops = FSM_DEFMAXNAKLOOPS; + if (!netif_add(&pcb->netif, &pcb->addrs.our_ipaddr, &pcb->addrs.netmask, &pcb->addrs.his_ipaddr, (void *)pcb, ppp_netif_init_cb, NULL)) { memp_free(MEMP_PPP_PCB, pcb);