summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp/ppp_ccp.c
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2010-10-14 19:12:53 +0400
committerKozlov Dmitry <dima@server>2010-10-14 19:12:53 +0400
commit04c623f7a645d0decae6ba73ba19650aaec3c497 (patch)
tree5c986653ca593e9de93edeac2b35654d5164c2af /accel-pptpd/ppp/ppp_ccp.c
parentf2cca0f357cebb8aedc43673809cae396a921c98 (diff)
downloadaccel-ppp-04c623f7a645d0decae6ba73ba19650aaec3c497.tar.gz
accel-ppp-04c623f7a645d0decae6ba73ba19650aaec3c497.zip
fixed bug: incorrect handling of mppe ConfNak
improved ccp handling
Diffstat (limited to 'accel-pptpd/ppp/ppp_ccp.c')
-rw-r--r--accel-pptpd/ppp/ppp_ccp.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/accel-pptpd/ppp/ppp_ccp.c b/accel-pptpd/ppp/ppp_ccp.c
index 24f0e517..613fb52c 100644
--- a/accel-pptpd/ppp/ppp_ccp.c
+++ b/accel-pptpd/ppp/ppp_ccp.c
@@ -37,6 +37,7 @@ 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_recv_proto_rej(struct ppp_handler_t*);
static void ccp_options_init(struct ppp_ccp_t *ccp)
{
@@ -98,6 +99,7 @@ static struct ppp_layer_data_t *ccp_layer_init(struct ppp_t *ppp)
ccp->hnd.proto = PPP_CCP;
ccp->hnd.recv = ccp_recv;
+ ccp->hnd.recv_proto_rej = ccp_recv_proto_rej;
ppp_register_unit_handler(ppp, &ccp->hnd);
@@ -223,8 +225,10 @@ static int send_conf_req(struct ppp_fsm_t *fsm)
ccp->need_req = 0;
- if (ccp->passive)
+ if (ccp->passive) {
+ ccp->passive--;
return 0;
+ }
buf = _malloc(ccp->conf_req_len);
ccp_hdr = (struct ccp_hdr_t*)buf;
@@ -508,8 +512,9 @@ static int ccp_recv_conf_nak(struct ppp_ccp_t *ccp, uint8_t *data, int size)
log_ppp_info(" ");
lopt->h->print(log_ppp_info, lopt, data);
}
- if (lopt->h->recv_conf_nak(ccp, lopt, data))
+ if (lopt->h->recv_conf_nak && lopt->h->recv_conf_nak(ccp, lopt, data))
res = -1;
+ lopt->state = CCP_OPT_NAK;
break;
}
}
@@ -688,6 +693,17 @@ static void ccp_recv(struct ppp_handler_t*h)
}
}
+static void ccp_recv_proto_rej(struct ppp_handler_t *h)
+{
+ struct ppp_ccp_t *ccp = container_of(h, typeof(*ccp), hnd);
+
+ if (ccp->fsm.fsm_state == FSM_Initial || ccp->fsm.fsm_state == FSM_Closed)
+ return;
+
+ ppp_fsm_lower_down(&ccp->fsm);
+ ppp_fsm_close(&ccp->fsm);
+}
+
int ccp_option_register(struct ccp_option_handler_t *h)
{
/*struct ccp_option_drv_t *p;