summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp_fsm.c
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2010-08-17 17:29:46 +0400
committerKozlov Dmitry <dima@server>2010-08-17 17:29:46 +0400
commit760d8427f133df486a145e6e7ac7610caf2356fc (patch)
treeebd109efc8882e56165e05f050dd30c9313bb9c7 /accel-pptpd/ppp_fsm.c
parentab418b16bf2c9a57dbb7c18141af2eb283c44447 (diff)
downloadaccel-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.c118
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;
}