diff options
author | Kozlov Dmitry <dima@server> | 2010-09-27 20:07:32 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-09-27 20:07:32 +0400 |
commit | 0325cc5f07ac992414129b4f47ae4aae017dbd2b (patch) | |
tree | 52c6d762dd62b347695aa51ab5cf4944e5f7bd9b /accel-pptpd/ppp/ppp_ccp.c | |
parent | 59d9616d73973c529b08578f3596acaa081cd8bf (diff) | |
download | accel-ppp-0325cc5f07ac992414129b4f47ae4aae017dbd2b.tar.gz accel-ppp-0325cc5f07ac992414129b4f47ae4aae017dbd2b.zip |
bug fixes
Diffstat (limited to 'accel-pptpd/ppp/ppp_ccp.c')
-rw-r--r-- | accel-pptpd/ppp/ppp_ccp.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/accel-pptpd/ppp/ppp_ccp.c b/accel-pptpd/ppp/ppp_ccp.c index e2ee48ac..477b6242 100644 --- a/accel-pptpd/ppp/ppp_ccp.c +++ b/accel-pptpd/ppp/ppp_ccp.c @@ -30,6 +30,8 @@ static int send_conf_req(struct ppp_fsm_t*); static void send_conf_ack(struct ppp_fsm_t*); static void send_conf_nak(struct ppp_fsm_t*); static void send_conf_rej(struct ppp_fsm_t*); +static void send_term_req(struct ppp_fsm_t *fsm); +static void send_term_ack(struct ppp_fsm_t *fsm); static void ccp_recv(struct ppp_handler_t*); static void ccp_options_init(struct ppp_ccp_t *ccp) @@ -87,6 +89,8 @@ static struct ppp_layer_data_t *ccp_layer_init(struct ppp_t *ppp) ccp->fsm.send_conf_ack=send_conf_ack; ccp->fsm.send_conf_nak=send_conf_nak; ccp->fsm.send_conf_rej=send_conf_rej; + ccp->fsm.send_term_req=send_term_req; + ccp->fsm.send_term_ack=send_term_ack; INIT_LIST_HEAD(&ccp->options); INIT_LIST_HEAD(&ccp->ropt_list); @@ -135,6 +139,7 @@ static void ccp_layer_up(struct ppp_fsm_t *fsm) { struct ppp_ccp_t *ccp=container_of(fsm,typeof(*ccp),fsm); log_ppp_debug("ccp_layer_started\n"); + ccp->started = 1; ppp_layer_started(ccp->ppp,&ccp->ld); } @@ -142,6 +147,9 @@ static void ccp_layer_down(struct ppp_fsm_t *fsm) { struct ppp_ccp_t *ccp=container_of(fsm,typeof(*ccp),fsm); log_ppp_debug("ccp_layer_finished\n"); + if (!ccp->started) + ppp_layer_started(ccp->ppp, &ccp->ld); + ccp->started = 0; ppp_layer_finished(ccp->ppp,&ccp->ld); } @@ -481,6 +489,36 @@ static int ccp_recv_conf_ack(struct ppp_ccp_t *ccp,uint8_t *data,int size) return res; } +static void send_term_req(struct ppp_fsm_t *fsm) +{ + struct ppp_ccp_t *ccp=container_of(fsm,typeof(*ccp),fsm); + struct ccp_hdr_t hdr = { + .proto = htons(PPP_CCP), + .code = TERMREQ, + .id = ++ccp->fsm.id, + .len = htons(4), + }; + + log_ppp_debug("send [CCP TermReq id=%i \"\"]\n",hdr.id); + + ppp_chan_send(ccp->ppp, &hdr, 6); +} + +static void send_term_ack(struct ppp_fsm_t *fsm) +{ + struct ppp_ccp_t *ccp=container_of(fsm,typeof(*ccp),fsm); + struct ccp_hdr_t hdr = { + .proto = htons(PPP_CCP), + .code = TERMACK, + .id = ccp->fsm.recv_id, + .len = htons(4), + }; + + log_ppp_debug("send [CCP TermAck id=%i \"\"]\n", hdr.id); + + ppp_chan_send(ccp->ppp, &hdr, 6); +} + static void ccp_recv(struct ppp_handler_t*h) { struct ccp_hdr_t *hdr; @@ -549,6 +587,7 @@ static void ccp_recv(struct ppp_handler_t*h) 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_fsm_close(&ccp->fsm); break; case TERMACK: term_msg=_strndup((char*)(hdr+1),ntohs(hdr->len) - 4); |