diff options
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r-- | accel-pptpd/ppp/ppp.c | 8 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp.h | 1 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_ccp.c | 6 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_fsm.c | 2 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_fsm.h | 1 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_ipcp.c | 7 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_lcp.c | 3 |
7 files changed, 20 insertions, 8 deletions
diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c index dfe5bbe..f8da005 100644 --- a/accel-pptpd/ppp/ppp.c +++ b/accel-pptpd/ppp/ppp.c @@ -373,6 +373,14 @@ void __export ppp_terminate(struct ppp_t *ppp, int hard) struct ppp_layer_data_t *d; int s = 0; + if (ppp->terminating) { + if (hard) + destablish_ppp(ppp); + return; + } + + ppp->terminating = 1; + log_ppp_debug("ppp_terminate\n"); triton_event_fire(EV_PPP_FINISHING, ppp); diff --git a/accel-pptpd/ppp/ppp.h b/accel-pptpd/ppp/ppp.h index 5a8ac57..5769f8c 100644 --- a/accel-pptpd/ppp/ppp.h +++ b/accel-pptpd/ppp/ppp.h @@ -86,6 +86,7 @@ struct ppp_t struct ppp_ctrl_t *ctrl; int log:1; + int terminating:1; void *chan_buf; int chan_buf_size; diff --git a/accel-pptpd/ppp/ppp_ccp.c b/accel-pptpd/ppp/ppp_ccp.c index 301c238..e2ee48a 100644 --- a/accel-pptpd/ppp/ppp_ccp.c +++ b/accel-pptpd/ppp/ppp_ccp.c @@ -78,6 +78,7 @@ static struct ppp_layer_data_t *ccp_layer_init(struct ppp_t *ppp) ppp_register_unit_handler(ppp,&ccp->hnd); + ccp->fsm.proto = PPP_CCP; ppp_fsm_init(&ccp->fsm); ccp->fsm.layer_up=ccp_layer_up; @@ -544,14 +545,13 @@ static void ccp_recv(struct ppp_handler_t*h) ppp_fsm_recv_conf_rej(&ccp->fsm); break; case TERMREQ: - term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len)); + term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len) - 4); log_ppp_debug("recv [CCP TermReq id=%x \"%s\"]\n",hdr->id,term_msg); _free(term_msg); ppp_fsm_recv_term_req(&ccp->fsm); - ppp_terminate(ccp->ppp, 0); break; case TERMACK: - term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len)); + term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len) - 4); log_ppp_debug("recv [CCP TermAck id=%x \"%s\"]\n",hdr->id,term_msg); _free(term_msg); ppp_fsm_recv_term_ack(&ccp->fsm); diff --git a/accel-pptpd/ppp/ppp_fsm.c b/accel-pptpd/ppp/ppp_fsm.c index 8f8e855..62dd878 100644 --- a/accel-pptpd/ppp/ppp_fsm.c +++ b/accel-pptpd/ppp/ppp_fsm.c @@ -477,7 +477,7 @@ void send_term_req(struct ppp_fsm_t *layer) void send_term_ack(struct ppp_fsm_t *layer) { struct lcp_hdr_t hdr = { - .proto = htons(PPP_LCP), + .proto = htons(layer->proto), .code = TERMACK, .id = layer->recv_id, .len = htons(4), diff --git a/accel-pptpd/ppp/ppp_fsm.h b/accel-pptpd/ppp/ppp_fsm.h index 908936d..d8624eb 100644 --- a/accel-pptpd/ppp/ppp_fsm.h +++ b/accel-pptpd/ppp/ppp_fsm.h @@ -21,6 +21,7 @@ struct ppp_fsm_t { struct ppp_t *ppp; FSM_STATE fsm_state; + uint16_t proto; struct triton_timer_t restart_timer; int restart_counter; diff --git a/accel-pptpd/ppp/ppp_ipcp.c b/accel-pptpd/ppp/ppp_ipcp.c index f3c20a6..420b9b8 100644 --- a/accel-pptpd/ppp/ppp_ipcp.c +++ b/accel-pptpd/ppp/ppp_ipcp.c @@ -77,7 +77,8 @@ static struct ppp_layer_data_t *ipcp_layer_init(struct ppp_t *ppp) ipcp->hnd.recv=ipcp_recv; ppp_register_unit_handler(ppp,&ipcp->hnd); - + + ipcp->fsm.proto = PPP_IPCP; ppp_fsm_init(&ipcp->fsm); ipcp->fsm.layer_up=ipcp_layer_up; @@ -541,14 +542,14 @@ static void ipcp_recv(struct ppp_handler_t*h) ppp_fsm_recv_conf_rej(&ipcp->fsm); break; case TERMREQ: - term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len)); + term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len) - 4); log_ppp_debug("recv [IPCP TermReq id=%x \"%s\"]\n",hdr->id,term_msg); _free(term_msg); ppp_fsm_recv_term_req(&ipcp->fsm); ppp_terminate(ipcp->ppp, 0); break; case TERMACK: - term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len)); + term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len) - 4); log_ppp_debug("recv [IPCP TermAck id=%x \"%s\"]\n",hdr->id,term_msg); _free(term_msg); ppp_fsm_recv_term_ack(&ipcp->fsm); diff --git a/accel-pptpd/ppp/ppp_lcp.c b/accel-pptpd/ppp/ppp_lcp.c index 7081cbb..563936e 100644 --- a/accel-pptpd/ppp/ppp_lcp.c +++ b/accel-pptpd/ppp/ppp_lcp.c @@ -85,7 +85,8 @@ static struct ppp_layer_data_t *lcp_layer_init(struct ppp_t *ppp) lcp->hnd.recv=lcp_recv; ppp_register_chan_handler(ppp,&lcp->hnd); - + + lcp->fsm.proto = PPP_LCP; ppp_fsm_init(&lcp->fsm); lcp->fsm.layer_up=lcp_layer_up; |