summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r--accel-pptpd/ppp/ppp.c8
-rw-r--r--accel-pptpd/ppp/ppp.h1
-rw-r--r--accel-pptpd/ppp/ppp_ccp.c6
-rw-r--r--accel-pptpd/ppp/ppp_fsm.c2
-rw-r--r--accel-pptpd/ppp/ppp_fsm.h1
-rw-r--r--accel-pptpd/ppp/ppp_ipcp.c7
-rw-r--r--accel-pptpd/ppp/ppp_lcp.c3
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;