diff options
author | Guillaume Nault <g.nault@alphalink.fr> | 2012-08-23 16:38:50 +0200 |
---|---|---|
committer | Kozlov Dmitry <xeb@mail.ru> | 2012-08-23 21:36:15 +0400 |
commit | fa66284f4bddf7686d2d5cfe40b387e0bbbba71a (patch) | |
tree | 28bf9fa0dea978e3bf433a6a82f8edd0daa8c1a6 /accel-pppd/ctrl | |
parent | 1872dd97822f406a2d54bd75ed8220092ec5d4fb (diff) | |
download | accel-ppp-fa66284f4bddf7686d2d5cfe40b387e0bbbba71a.tar.gz accel-ppp-fa66284f4bddf7686d2d5cfe40b387e0bbbba71a.zip |
L2TP: Tear down tunnel when peer stops listening
Stop sending messages on tunnels for which no peer is listening.
Discard retransmissions too.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Diffstat (limited to 'accel-pppd/ctrl')
-rw-r--r-- | accel-pppd/ctrl/l2tp/l2tp.c | 8 | ||||
-rw-r--r-- | accel-pppd/ctrl/l2tp/packet.c | 5 |
2 files changed, 11 insertions, 2 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index 43b210ff..2d37d99b 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -913,10 +913,16 @@ static int l2tp_conn_read(struct triton_md_handler_t *h) struct l2tp_conn_t *conn = container_of(h, typeof(*conn), hnd); struct l2tp_packet_t *pack, *p; struct l2tp_attr_t *msg_type; + int res; while (1) { - if (l2tp_recv(h->fd, &pack, NULL)) + res = l2tp_recv(h->fd, &pack, NULL); + if (res) { + if (res == -2) + /* No peer listening, tear down connection */ + l2tp_disconnect(conn); return 0; + } if (!pack) continue; diff --git a/accel-pppd/ctrl/l2tp/packet.c b/accel-pppd/ctrl/l2tp/packet.c index f8a46e7f..60b9d36c 100644 --- a/accel-pppd/ctrl/l2tp/packet.c +++ b/accel-pppd/ctrl/l2tp/packet.c @@ -147,8 +147,11 @@ int l2tp_recv(int fd, struct l2tp_packet_t **p, struct in_pktinfo *pkt_info) if (n < 0) { mempool_free(buf); - if (errno == EAGAIN) + if (errno == EAGAIN) { return -1; + } else if (errno == ECONNREFUSED) { + return -2; + } log_error("l2tp: recv: %s\n", strerror(errno)); return 0; } |