summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl
diff options
context:
space:
mode:
authorGuillaume Nault <g.nault@alphalink.fr>2013-03-15 21:47:53 +0100
committerKozlov Dmitry <xeb@mail.ru>2013-03-16 08:34:46 +0400
commit47d51c689d2e80f09b0815d0905e15e4d16ae0bb (patch)
tree814fc902a620854a13fd13d5b65c09f7886ca585 /accel-pppd/ctrl
parent4ae5fc3b6cf03b6ba256be486911a9e90af870d6 (diff)
downloadaccel-ppp-47d51c689d2e80f09b0815d0905e15e4d16ae0bb.tar.gz
accel-ppp-47d51c689d2e80f09b0815d0905e15e4d16ae0bb.zip
l2tp: Centralise management of tunnel establishment timers
Handle tunnel timeout timers in l2tp_tunnel_start() and l2tp_tunnel_connect(). This avoids timer code duplication across functions that are spectific to the tunnel establishment mode. Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Diffstat (limited to 'accel-pppd/ctrl')
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.c46
1 files changed, 17 insertions, 29 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c
index c16304b4..00b2f0f1 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.c
+++ b/accel-pppd/ctrl/l2tp/l2tp.c
@@ -956,27 +956,35 @@ static int l2tp_tunnel_start(struct l2tp_conn_t *conn,
if (triton_context_register(&conn->ctx, NULL) < 0) {
log_error("l2tp: impossible to start new tunnel:"
" context registration failed\n");
- return -1;
+ goto err;
}
triton_md_register_handler(&conn->ctx, &conn->hnd);
if (triton_md_enable_handler(&conn->hnd, MD_MODE_READ) < 0) {
log_error("l2tp: impossible to start new tunnel:"
" enabling handler failed\n");
- goto out_err;
+ goto err_ctx;
}
triton_context_wakeup(&conn->ctx);
+ if (triton_timer_add(&conn->ctx, &conn->timeout_timer, 0) < 0) {
+ log_error("l2tp: impossible to start new tunnel:"
+ " setting tunnel establishment timer failed\n");
+ goto err_ctx_md;
+ }
if (triton_context_call(&conn->ctx, start_func, start_param) < 0) {
log_error("l2tp: impossible to start new tunnel:"
" call to tunnel context failed\n");
- goto out_err;
+ goto err_ctx_md_timer;
}
return 0;
-out_err:
+err_ctx_md_timer:
+ triton_timer_del(&conn->timeout_timer);
+err_ctx_md:
triton_md_unregister_handler(&conn->hnd);
+err_ctx:
triton_context_unregister(&conn->ctx);
-
+err:
return -1;
}
@@ -1264,8 +1272,12 @@ static int l2tp_tunnel_connect(struct l2tp_conn_t *conn)
log_tunnel(log_error, conn,
"impossible to connect tunnel:"
" setting HELLO timer failed\n");
+ goto out_err;
}
+ if (conn->timeout_timer.tpd)
+ triton_timer_del(&conn->timeout_timer);
+
return 0;
out_err:
@@ -1495,16 +1507,6 @@ static void l2tp_send_SCCRQ(void *peer_addr)
goto err;
}
- if (!conn->timeout_timer.tpd) {
- if (triton_timer_add(&conn->ctx, &conn->timeout_timer, 0) < 0)
- log_tunnel(log_warn, conn, "SCCRQ: setting tunnel"
- " establishment timer failed\n");
- } else {
- if (triton_timer_mod(&conn->timeout_timer, 0) < 0)
- log_tunnel(log_warn, conn, "SCCRQ: resetting tunnel"
- " establishment timer failed\n");
- }
-
conn->state = STATE_WAIT_SCCRP;
return;
@@ -1574,16 +1576,6 @@ static void l2tp_send_SCCRP(struct l2tp_conn_t *conn)
goto out;
}
- if (!conn->timeout_timer.tpd) {
- if (triton_timer_add(&conn->ctx, &conn->timeout_timer, 0) < 0)
- log_tunnel(log_warn, conn, "SCCRP: setting tunnel"
- " establishment timer failed\n");
- } else {
- if (triton_timer_mod(&conn->timeout_timer, 0) < 0)
- log_tunnel(log_warn, conn, "SCCRP: resetting tunnel"
- " establishment timer failed\n");
- }
-
conn->state = STATE_WAIT_SCCCN;
return;
@@ -2010,8 +2002,6 @@ static int l2tp_recv_SCCRP(struct l2tp_conn_t *conn,
return -1;
}
- triton_timer_del(&conn->timeout_timer);
-
list_for_each_entry(attr, &pack->attrs, entry) {
switch (attr->attr->id) {
case Message_Type:
@@ -2138,8 +2128,6 @@ static int l2tp_recv_SCCCN(struct l2tp_conn_t *conn,
return 0;
}
- triton_timer_del(&conn->timeout_timer);
-
list_for_each_entry(attr, &pack->attrs, entry) {
switch (attr->attr->id) {
case Message_Type: