diff options
author | Kozlov Dmitry <dima@server> | 2010-08-17 17:29:46 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-08-17 17:29:46 +0400 |
commit | 760d8427f133df486a145e6e7ac7610caf2356fc (patch) | |
tree | ebd109efc8882e56165e05f050dd30c9313bb9c7 /accel-pptpd/ppp_fsm.c | |
parent | ab418b16bf2c9a57dbb7c18141af2eb283c44447 (diff) | |
download | accel-ppp-xebd-760d8427f133df486a145e6e7ac7610caf2356fc.tar.gz accel-ppp-xebd-760d8427f133df486a145e6e7ac7610caf2356fc.zip |
reworked/rewrited lcp handling code to become more abstract
Diffstat (limited to 'accel-pptpd/ppp_fsm.c')
-rw-r--r-- | accel-pptpd/ppp_fsm.c | 118 |
1 files changed, 72 insertions, 46 deletions
diff --git a/accel-pptpd/ppp_fsm.c b/accel-pptpd/ppp_fsm.c index fdbcbe9..e2884c2 100644 --- a/accel-pptpd/ppp_fsm.c +++ b/accel-pptpd/ppp_fsm.c @@ -14,16 +14,17 @@ #include "ppp.h" #include "ppp_fsm.h" #include "ppp_lcp.h" +#include "log.h" -void send_term_req(struct ppp_layer_t *layer); -void send_term_ack(struct ppp_layer_t *layer); -void send_echo_reply(struct ppp_layer_t *layer); +void send_term_req(struct ppp_fsm_t *layer); +void send_term_ack(struct ppp_fsm_t *layer); +void send_echo_reply(struct ppp_fsm_t *layer); -static void init_req_counter(struct ppp_layer_t *layer,int timeout); -static void zero_req_counter(struct ppp_layer_t *layer); +static void init_req_counter(struct ppp_fsm_t *layer,int timeout); +static void zero_req_counter(struct ppp_fsm_t *layer); static int restart_timer_func(struct triton_timer_t*t); -void ppp_fsm_init(struct ppp_layer_t *layer) +void ppp_fsm_init(struct ppp_fsm_t *layer) { layer->fsm_state=FSM_Initial; layer->restart_timer.active=0; @@ -34,10 +35,9 @@ void ppp_fsm_init(struct ppp_layer_t *layer) layer->max_terminate=2; layer->max_configure=10; layer->max_failure=5; - layer->id=0; } -void ppp_fsm_lower_up(struct ppp_layer_t *layer) +void ppp_fsm_lower_up(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -55,7 +55,7 @@ void ppp_fsm_lower_up(struct ppp_layer_t *layer) } } -void ppp_fsm_lower_down(struct ppp_layer_t *layer) +void ppp_fsm_lower_down(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -82,7 +82,7 @@ void ppp_fsm_lower_down(struct ppp_layer_t *layer) } } -void ppp_fsm_open(struct ppp_layer_t *layer) +void ppp_fsm_open(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -103,18 +103,15 @@ void ppp_fsm_open(struct ppp_layer_t *layer) layer->fsm_state=FSM_Stopping; case FSM_Stopped: case FSM_Opened: - if (layer->opt_restart) - { - ppp_fsm_lower_down(layer); - ppp_fsm_lower_up(layer); - } + ppp_fsm_lower_down(layer); + ppp_fsm_lower_up(layer); break; default: break; } } -void ppp_fsm_close(struct ppp_layer_t *layer) +void ppp_fsm_close(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -143,7 +140,7 @@ void ppp_fsm_close(struct ppp_layer_t *layer) } } -void ppp_fsm_timeout0(struct ppp_layer_t *layer) +void ppp_fsm_timeout0(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -162,7 +159,7 @@ void ppp_fsm_timeout0(struct ppp_layer_t *layer) } } -void ppp_fsm_timeout1(struct ppp_layer_t *layer) +void ppp_fsm_timeout1(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -179,14 +176,13 @@ void ppp_fsm_timeout1(struct ppp_layer_t *layer) case FSM_Ack_Sent: if (layer->layer_finished) layer->layer_finished(layer); layer->fsm_state=FSM_Stopped; - layer->opt_passive=1; break; default: break; } } -void ppp_fsm_recv_conf_req_good(struct ppp_layer_t *layer) +void ppp_fsm_recv_conf_req_ack(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -219,7 +215,37 @@ void ppp_fsm_recv_conf_req_good(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_conf_req_bad(struct ppp_layer_t *layer) +void ppp_fsm_recv_conf_req_nak(struct ppp_fsm_t *layer) +{ + switch(layer->fsm_state) + { + case FSM_Closed: + send_term_ack(layer); + break; + case FSM_Stopped: + //if (layer->init_req_cnt) layer->init_req_cnt(layer); + init_req_counter(layer,layer->max_configure); + if (layer->send_conf_req) layer->send_conf_req(layer); + case FSM_Ack_Sent: + if (layer->send_conf_nak) layer->send_conf_nak(layer); + layer->fsm_state=FSM_Req_Sent; + break; + case FSM_Req_Sent: + case FSM_Ack_Rcvd: + if (layer->send_conf_nak) layer->send_conf_nak(layer); + break; + case FSM_Opened: + if (layer->layer_down) layer->layer_down(layer); + if (layer->send_conf_req) layer->send_conf_req(layer); + if (layer->send_conf_nak) layer->send_conf_nak(layer); + layer->fsm_state=FSM_Req_Sent; + break; + default: + break; + } +} + +void ppp_fsm_recv_conf_req_rej(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -249,7 +275,7 @@ void ppp_fsm_recv_conf_req_bad(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_conf_ack(struct ppp_layer_t *layer) +void ppp_fsm_recv_conf_ack(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -282,7 +308,7 @@ void ppp_fsm_recv_conf_ack(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_conf_rej(struct ppp_layer_t *layer) +void ppp_fsm_recv_conf_rej(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -314,7 +340,7 @@ void ppp_fsm_recv_conf_rej(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_term_req(struct ppp_layer_t *layer) +void ppp_fsm_recv_term_req(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -337,7 +363,7 @@ void ppp_fsm_recv_term_req(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_term_ack(struct ppp_layer_t *layer) +void ppp_fsm_recv_term_ack(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -362,12 +388,12 @@ void ppp_fsm_recv_term_ack(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_unk(struct ppp_layer_t *layer) +void ppp_fsm_recv_unk(struct ppp_fsm_t *layer) { if (layer->send_conf_rej) layer->send_conf_rej(layer); } -void ppp_fsm_recv_code_rej_perm(struct ppp_layer_t *layer) +void ppp_fsm_recv_code_rej_perm(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { @@ -379,15 +405,13 @@ void ppp_fsm_recv_code_rej_perm(struct ppp_layer_t *layer) } } -void ppp_fsm_recv_code_rej_bad(struct ppp_layer_t *layer) +void ppp_fsm_recv_code_rej_bad(struct ppp_fsm_t *layer) { switch(layer->fsm_state) { case FSM_Opened: if (layer->layer_down) layer->layer_down(layer); - //if (layer->init_req_cnt) layer->init_req_cnt(layer); - init_req_counter(layer,layer->max_configure); - if (layer->send_conf_req) layer->send_conf_req(layer); + send_term_req(layer); layer->fsm_state=FSM_Stopping; break; case FSM_Closing: @@ -406,53 +430,55 @@ void ppp_fsm_recv_code_rej_bad(struct ppp_layer_t *layer) } } -void send_term_req(struct ppp_layer_t *layer) +void send_term_req(struct ppp_fsm_t *layer) { struct lcp_hdr_t hdr={ - .proto=PPP_LCP, + .proto=htons(PPP_LCP), .code=TERMREQ, .id=++layer->id, - .len=4, + .len=htons(4), }; - ppp_send(layer->ppp,&hdr,hdr.len); + log_debug("send [LCP TermReq id=%i \"\"]\n",hdr.id); + + ppp_send(layer->ppp,&hdr,6); } -void send_term_ack(struct ppp_layer_t *layer) +void send_term_ack(struct ppp_fsm_t *layer) { struct lcp_hdr_t hdr={ - .proto=PPP_LCP, + .proto=htons(PPP_LCP), .code=TERMACK, .id=layer->recv_id, - .len=4, + .len=htons(4), }; - ppp_send(layer->ppp,&hdr,hdr.len); -} -void ppp_fsm_recv(struct ppp_layer_t *layer) -{ + log_debug("send [LCP TermAck id=%i \"\"]\n",hdr.id); + + ppp_send(layer->ppp,&hdr,6); } -static void init_req_counter(struct ppp_layer_t *layer,int timeout) +static void init_req_counter(struct ppp_fsm_t *layer,int timeout) { triton_timer_del(&layer->restart_timer); + layer->restart_timer.expire_tv.tv_sec=0; triton_timer_add(&layer->restart_timer); layer->restart_counter=timeout; } -static void zero_req_counter(struct ppp_layer_t *layer) +static void zero_req_counter(struct ppp_fsm_t *layer) { triton_timer_del(&layer->restart_timer); + layer->restart_timer.expire_tv.tv_sec=0; triton_timer_add(&layer->restart_timer); layer->restart_counter=0; } static int restart_timer_func(struct triton_timer_t*t) { - struct ppp_layer_t *layer=(struct ppp_layer_t *)t->pd; + struct ppp_fsm_t *layer=(struct ppp_fsm_t *)t->pd; if (layer->restart_counter) { ppp_fsm_timeout0(layer); - layer->restart_counter--; return 1; } |