summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp/ppp_ccp.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/ppp/ppp_ccp.c')
-rw-r--r--accel-pptpd/ppp/ppp_ccp.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/accel-pptpd/ppp/ppp_ccp.c b/accel-pptpd/ppp/ppp_ccp.c
index fe10886..f895da9 100644
--- a/accel-pptpd/ppp/ppp_ccp.c
+++ b/accel-pptpd/ppp/ppp_ccp.c
@@ -24,7 +24,7 @@ static LIST_HEAD(option_handlers);
static void ccp_layer_up(struct ppp_fsm_t*);
static void ccp_layer_down(struct ppp_fsm_t*);
-static void send_conf_req(struct ppp_fsm_t*);
+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*);
@@ -90,7 +90,7 @@ static struct ppp_layer_data_t *ccp_layer_init(struct ppp_t *ppp)
return &ccp->ld;
}
-void ccp_layer_start(struct ppp_layer_data_t *ld)
+int ccp_layer_start(struct ppp_layer_data_t *ld)
{
struct ppp_ccp_t *ccp=container_of(ld,typeof(*ccp),ld);
@@ -98,7 +98,10 @@ void ccp_layer_start(struct ppp_layer_data_t *ld)
ccp_options_init(ccp);
ppp_fsm_lower_up(&ccp->fsm);
- ppp_fsm_open(&ccp->fsm);
+ if (ppp_fsm_open(&ccp->fsm))
+ return -1;
+
+ return 0;
}
void ccp_layer_finish(struct ppp_layer_data_t *ld)
@@ -107,12 +110,8 @@ void ccp_layer_finish(struct ppp_layer_data_t *ld)
log_debug("ccp_layer_finish\n");
- ppp_fsm_lower_down(&ccp->fsm);
-
- ppp_unregister_handler(ccp->ppp,&ccp->hnd);
- ccp_options_free(ccp);
-
- ppp_layer_finished(ccp->ppp,ld);
+ ccp->fsm.fsm_state = FSM_Closed;
+ ppp_layer_finished(ccp->ppp,&ccp->ld);
}
void ccp_layer_free(struct ppp_layer_data_t *ld)
@@ -121,6 +120,10 @@ void ccp_layer_free(struct ppp_layer_data_t *ld)
log_debug("ccp_layer_free\n");
+ ppp_unregister_handler(ccp->ppp,&ccp->hnd);
+ ccp_options_free(ccp);
+ ppp_fsm_free(&ccp->fsm);
+
free(ccp);
}
@@ -151,7 +154,7 @@ static void print_ropt(struct recv_opt_t *ropt)
log_debug(" >");
}
-static void send_conf_req(struct ppp_fsm_t *fsm)
+static int send_conf_req(struct ppp_fsm_t *fsm)
{
struct ppp_ccp_t *ccp=container_of(fsm,typeof(*ccp),fsm);
uint8_t *buf=malloc(ccp->conf_req_len), *ptr=buf;
@@ -171,6 +174,8 @@ static void send_conf_req(struct ppp_fsm_t *fsm)
list_for_each_entry(lopt,&ccp->options,entry)
{
n=lopt->h->send_conf_req(ccp,lopt,ptr);
+ if (n < 0)
+ return -1;
if (n)
{
log_debug(" ");
@@ -183,6 +188,8 @@ static void send_conf_req(struct ppp_fsm_t *fsm)
ccp_hdr->len=htons((ptr-buf)-2);
ppp_unit_send(ccp->ppp,ccp_hdr,ptr-buf);
+
+ return 0;
}
static void send_conf_ack(struct ppp_fsm_t *fsm)
@@ -473,7 +480,7 @@ static void ccp_recv(struct ppp_handler_t*h)
if (ccp->fsm.fsm_state==FSM_Initial || ccp->fsm.fsm_state==FSM_Closed)
{
- log_error("CCP: discaring packet\n");
+ log_warn("CCP: discaring packet\n");
return;
}