summaryrefslogtreecommitdiff
path: root/accel-pppd/ppp/ppp_ipcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd/ppp/ppp_ipcp.c')
-rw-r--r--accel-pppd/ppp/ppp_ipcp.c50
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)