summaryrefslogtreecommitdiff
path: root/accel-pppd/ppp/ppp_lcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd/ppp/ppp_lcp.c')
-rw-r--r--accel-pppd/ppp/ppp_lcp.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/accel-pppd/ppp/ppp_lcp.c b/accel-pppd/ppp/ppp_lcp.c
index 279d815..56a3ca6 100644
--- a/accel-pppd/ppp/ppp_lcp.c
+++ b/accel-pppd/ppp/ppp_lcp.c
@@ -704,25 +704,29 @@ static void lcp_recv(struct ppp_handler_t*h)
int r;
char *term_msg;
- if (lcp->fsm.fsm_state == FSM_Initial || lcp->fsm.fsm_state == FSM_Closed || lcp->ppp->terminating) {
- /*if (conf_ppp_verbose)
- log_ppp_warn("LCP: discaring packet\n");
- lcp_send_proto_rej(ccp->ppp, htons(PPP_CCP));*/
- return;
- }
-
if (lcp->ppp->buf_size < PPP_HEADERLEN + 2) {
log_ppp_warn("LCP: short packet received\n");
return;
}
- hdr = (struct lcp_hdr_t *)lcp->ppp->buf;
+ hdr = (struct lcp_hdr_t *)lcp->ppp->buf;
if (ntohs(hdr->len) < PPP_HEADERLEN) {
log_ppp_warn("LCP: short packet received\n");
return;
}
+ if ((hdr->code == CONFACK || hdr->code == CONFNAK || hdr->code == CONFREJ) && hdr->id != lcp->fsm.id)
+ return;
+
+ if (lcp->fsm.fsm_state == FSM_Initial || lcp->fsm.fsm_state == FSM_Closed || (lcp->ppp->terminating && (hdr->code != TERMACK && hdr->code != TERMREQ))) {
+ /*if (conf_ppp_verbose)
+ log_ppp_warn("LCP: discaring packet\n");
+ lcp_send_proto_rej(ccp->ppp, htons(PPP_CCP));*/
+ return;
+ }
+
lcp->fsm.recv_id = hdr->id;
+
switch(hdr->code) {
case CONFREQ:
r = lcp_recv_conf_req(lcp, (uint8_t*)(hdr + 1), ntohs(hdr->len) - PPP_HDRLEN);