summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Nault <g.nault@alphalink.fr>2012-09-07 12:35:18 +0200
committerKozlov Dmitry <xeb@mail.ru>2012-09-07 14:51:01 +0400
commitb113d00bcc5d499d2acb4df824a10fcb5ccc3b6c (patch)
tree53ba99c08357f38266d3cb0ff098229691d703b3
parentc5786e4186cabb6801448eff50e26026a8b461b3 (diff)
downloadaccel-ppp-xebd-b113d00bcc5d499d2acb4df824a10fcb5ccc3b6c.tar.gz
accel-ppp-xebd-b113d00bcc5d499d2acb4df824a10fcb5ccc3b6c.zip
L2TP: Close only session (not tunnel) after a PPP disconnection
When a PPP connection is torn down, close the underlying session but not the tunnel (unless its last session has been closed). Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c
index 3c38bfa..819da07 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.c
+++ b/accel-pppd/ctrl/l2tp/l2tp.c
@@ -267,6 +267,19 @@ static int l2tp_session_disconnect(struct l2tp_conn_t *conn,
return l2tp_tunnel_disconnect(conn, 1, 0);
}
+static void l2tp_ppp_session_disconnect(void *param)
+{
+ struct l2tp_sess_t *sess = param;
+ struct l2tp_conn_t *conn = sess->paren_conn;
+
+ l2tp_send_CDN(conn, 2, 0);
+ l2tp_session_free(conn);
+
+ /* Disconnect the tunnel when all sessions have been closed */
+ l2tp_tunnel_disconnect(conn, 1, 0);
+ conn->state = STATE_FIN;
+}
+
static void l2tp_ppp_started(struct ap_session *ses)
{
log_ppp_debug("l2tp: ppp started\n");
@@ -276,15 +289,10 @@ static void l2tp_ppp_finished(struct ap_session *ses)
{
struct ppp_t *ppp = container_of(ses, typeof(*ppp), ses);
struct l2tp_sess_t *sess = container_of(ppp, typeof(*sess), ppp);
- struct l2tp_conn_t *conn = sess->paren_conn;
log_ppp_debug("l2tp: ppp finished\n");
-
- if (conn->sess.state1 == STATE_PPP) {
- __sync_sub_and_fetch(&stat_active, 1);
- if (l2tp_tunnel_disconnect(conn, 0, 0))
- triton_context_call(&conn->ctx, (triton_event_func)l2tp_tunnel_free, conn);
- }
+ triton_context_call(&sess->paren_conn->ctx,
+ l2tp_ppp_session_disconnect, sess);
}
static int l2tp_session_alloc(struct l2tp_conn_t *conn)