diff options
author | Kozlov Dmitry <dima@server> | 2011-05-16 18:04:28 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2011-05-16 18:04:28 +0400 |
commit | 23a958deec775a74d2ff9d0d31ef208c47516a4b (patch) | |
tree | 34eb7ae83c3093e8e434fb4fc9cc6e2ba33a235f /accel-pppd/ppp/ppp_ipcp.c | |
parent | d2cb39985cd33f5678cad3e68b69cca51894bd58 (diff) | |
download | accel-ppp-xebd-23a958deec775a74d2ff9d0d31ef208c47516a4b.tar.gz accel-ppp-xebd-23a958deec775a74d2ff9d0d31ef208c47516a4b.zip |
ppp: better handling for lost last acknowledge packet
Diffstat (limited to 'accel-pppd/ppp/ppp_ipcp.c')
-rw-r--r-- | accel-pppd/ppp/ppp_ipcp.c | 50 |
1 files changed, 19 insertions, 31 deletions
diff --git a/accel-pppd/ppp/ppp_ipcp.c b/accel-pppd/ppp/ppp_ipcp.c index 8890f2c..72760d5 100644 --- a/accel-pppd/ppp/ppp_ipcp.c +++ b/accel-pppd/ppp/ppp_ipcp.c @@ -61,9 +61,6 @@ static void ipcp_options_free(struct ppp_ipcp_t *ipcp) list_del(&lopt->entry); lopt->h->free(ipcp, lopt); } - - if (ipcp->buf) - _free(ipcp->buf); } static struct ppp_layer_data_t *ipcp_layer_init(struct ppp_t *ppp) @@ -226,10 +223,7 @@ static void send_conf_ack(struct ppp_fsm_t *fsm) struct ipcp_hdr_t *hdr = (struct ipcp_hdr_t*)ipcp->ppp->buf; if (ipcp->delay_ack) { - if (!ipcp->buf) { - ipcp->buf = _malloc(ntohs(hdr->len) + 2); - memcpy(ipcp->buf, ipcp->ppp->buf, ntohs(hdr->len) + 2); - } + send_term_ack(fsm); return; } @@ -241,19 +235,6 @@ static void send_conf_ack(struct ppp_fsm_t *fsm) ppp_unit_send(ipcp->ppp, hdr, ntohs(hdr->len) + 2); } -void ipcp_send_ack(struct ppp_t *ppp) -{ - struct ppp_ipcp_t *ipcp = container_of(ppp_find_layer_data(ppp, &ipcp_layer), typeof(*ipcp), ld); - struct ipcp_hdr_t *hdr = (struct ipcp_hdr_t*)ipcp->buf; - - hdr->code = CONFACK; - - if (conf_ppp_verbose) - log_ppp_info2("send [IPCP ConfAck id=%x]\n", ipcp->fsm.recv_id); - - ppp_unit_send(ipcp->ppp, hdr, ntohs(hdr->len) + 2); -} - static void send_conf_nak(struct ppp_fsm_t *fsm) { struct ppp_ipcp_t *ipcp = container_of(fsm, typeof(*ipcp), fsm); @@ -583,7 +564,7 @@ static void ipcp_recv(struct ppp_handler_t*h) struct ppp_ipcp_t *ipcp = container_of(h, typeof(*ipcp), hnd); int r; - if (ipcp->fsm.fsm_state == FSM_Initial || ipcp->fsm.fsm_state == FSM_Closed || ipcp->fsm.fsm_state == FSM_Opened || ipcp->ppp->terminating) { + if (ipcp->fsm.fsm_state == FSM_Initial || ipcp->fsm.fsm_state == FSM_Closed || ipcp->ppp->terminating) { if (conf_ppp_verbose) log_ppp_warn("IPCP: discarding packet\n"); return; @@ -612,16 +593,23 @@ static void ipcp_recv(struct ppp_handler_t*h) ipcp_free_conf_req(ipcp); return; } - switch(r) { - case IPCP_OPT_ACK: - ppp_fsm_recv_conf_req_ack(&ipcp->fsm); - break; - case IPCP_OPT_NAK: - ppp_fsm_recv_conf_req_nak(&ipcp->fsm); - break; - case IPCP_OPT_REJ: - ppp_fsm_recv_conf_req_rej(&ipcp->fsm); - break; + if (ipcp->started) { + if (r == IPCP_OPT_ACK) + send_conf_ack(&ipcp->fsm); + else + r = IPCP_OPT_FAIL; + } else { + switch(r) { + case IPCP_OPT_ACK: + ppp_fsm_recv_conf_req_ack(&ipcp->fsm); + break; + case IPCP_OPT_NAK: + ppp_fsm_recv_conf_req_nak(&ipcp->fsm); + break; + case IPCP_OPT_REJ: + ppp_fsm_recv_conf_req_rej(&ipcp->fsm); + break; + } } ipcp_free_conf_req(ipcp); if (r == IPCP_OPT_FAIL) |