diff options
author | Guillaume Nault <g.nault@alphalink.fr> | 2012-09-07 12:35:18 +0200 |
---|---|---|
committer | Kozlov Dmitry <xeb@mail.ru> | 2012-09-07 14:51:01 +0400 |
commit | b113d00bcc5d499d2acb4df824a10fcb5ccc3b6c (patch) | |
tree | 53ba99c08357f38266d3cb0ff098229691d703b3 /accel-pppd | |
parent | c5786e4186cabb6801448eff50e26026a8b461b3 (diff) | |
download | accel-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>
Diffstat (limited to 'accel-pppd')
-rw-r--r-- | accel-pppd/ctrl/l2tp/l2tp.c | 22 |
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) |