From 23a958deec775a74d2ff9d0d31ef208c47516a4b Mon Sep 17 00:00:00 2001 From: Kozlov Dmitry Date: Mon, 16 May 2011 18:04:28 +0400 Subject: ppp: better handling for lost last acknowledge packet --- accel-pppd/ppp/ppp_ipcp.c | 50 ++++++++++++++++++----------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) (limited to 'accel-pppd/ppp/ppp_ipcp.c') 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) -- cgit v1.2.3