summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl
diff options
context:
space:
mode:
authorGuillaume Nault <g.nault@alphalink.fr>2012-08-23 16:38:50 +0200
committerKozlov Dmitry <xeb@mail.ru>2012-08-23 21:36:15 +0400
commitfa66284f4bddf7686d2d5cfe40b387e0bbbba71a (patch)
tree28bf9fa0dea978e3bf433a6a82f8edd0daa8c1a6 /accel-pppd/ctrl
parent1872dd97822f406a2d54bd75ed8220092ec5d4fb (diff)
downloadaccel-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.c8
-rw-r--r--accel-pppd/ctrl/l2tp/packet.c5
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;
}