Мне кажется такой disconnect более корректен, т.к CDN пакет вроде должен отправляться раньше закрытия PPP туннеля.
По крайней мере клиент теперь получает это уведомление при radius Session-Timeout (или terminate if ppp0 из telnet), и сразу разрывает соединение, а не ждет таймаута, чтобы отвалиться с ошибкой.
--- l2tp.c.orig 2014-01-15 00:57:50.000000000 +0600
+++ l2tp.c 2014-01-15 01:40:41.879940918 +0600
@@ -763,6 +763,21 @@
return 0;
}
+static void l2tp_ppp_terminate(struct ap_session *ses, int hard)
+{
+ struct l2tp_sess_t *sess = l2tp_session_self();
+ switch (sess->state1) {
+ case STATE_PPP:
+ if (l2tp_send_CDN(sess, 2, 0) < 0)
+ log_session(log_error, sess,
+ "impossible to notify peer of session"
+ " disconnection, disconnecting anyway\n");
+ break;
+ }
+ ppp_terminate(ses,hard);
+}
+
+
static void l2tp_ppp_finished(struct ap_session *ses)
{
struct l2tp_sess_t *sess = l2tp_session_self();
@@ -774,10 +789,6 @@
" disconnecting session\n",
ses->ifname, ses->username ? ses->username : "");
sess->state1 = STATE_CLOSE;
- if (l2tp_send_CDN(sess, 2, 0) < 0)
- log_session(log_error, sess,
- "impossible to notify peer of session"
- " disconnection, disconnecting anyway\n");
if (l2tp_session_free(sess) < 0)
log_session(log_error, sess,
"impossible to free session,"
@@ -890,7 +901,7 @@
sess->ctrl.name = "l2tp";
sess->ctrl.started = l2tp_ppp_started;
sess->ctrl.finished = l2tp_ppp_finished;
- sess->ctrl.terminate = ppp_terminate;
+ sess->ctrl.terminate = l2tp_ppp_terminate;
sess->ctrl.max_mtu = conf_ppp_max_mtu;
sess->ctrl.mppe = conf_mppe;
sess->ctrl.calling_station_id = _malloc(17);