From dee9aa718363d00d3cca815b137aa49ed91bc851 Mon Sep 17 00:00:00 2001 From: Kozlov Dmitry Date: Fri, 3 Aug 2012 22:19:19 +0400 Subject: l2tp: stop hello timer on session termination l2tp: rertansmit last packet if duplicate packet received --- accel-pppd/ctrl/l2tp/l2tp.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'accel-pppd') diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index 162c9cb4..01d0c90b 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -174,6 +174,9 @@ static int l2tp_terminate(struct l2tp_conn_t *conn, int res, int err) log_ppp_debug("l2tp: terminate (%i, %i)\n", res, err); + if (conn->hello_timer.tpd) + triton_timer_del(&conn->hello_timer); + pack = l2tp_packet_alloc(2, Message_Type_Stop_Ctrl_Conn_Notify, &conn->addr); if (!pack) return -1; @@ -464,22 +467,27 @@ out_err: return -1; } +static void l2tp_retransmit(struct l2tp_conn_t *conn) +{ + struct l2tp_packet_t *pack; + + pack = list_entry(conn->send_queue.next, typeof(*pack), entry); + pack->hdr.Nr = htons(conn->Nr + 1); + if (conf_verbose) { + log_ppp_debug("send "); + l2tp_packet_print(pack, log_ppp_debug); + } + l2tp_packet_send(conn->hnd.fd, pack); +} + static void l2tp_rtimeout(struct triton_timer_t *t) { struct l2tp_conn_t *conn = container_of(t, typeof(*conn), rtimeout_timer); - struct l2tp_packet_t *pack; if (!list_empty(&conn->send_queue)) { log_ppp_debug("l2tp: retransmit (%i)\n", conn->retransmit); if (++conn->retransmit <= conf_retransmit) { - pack = list_entry(conn->send_queue.next, typeof(*pack), entry); - pack->hdr.Nr = htons(conn->Nr + 1); - if (conf_verbose) { - log_ppp_debug("send "); - l2tp_packet_print(pack, log_ppp_debug); - } - if (l2tp_packet_send(conn->hnd.fd, pack) == 0) - return; + l2tp_retransmit(conn); } else l2tp_disconnect(conn); } @@ -947,8 +955,10 @@ static int l2tp_conn_read(struct triton_md_handler_t *h) } else { if (ntohs(pack->hdr.Ns) < conn->Nr + 1 || (ntohs(pack->hdr.Ns > 32767 && conn->Nr + 1 < 32767))) { log_ppp_debug("duplicate packet\n"); - if (l2tp_send_ZLB(conn)) - goto drop; + //if (l2tp_send_ZLB(conn)) + // goto drop; + if (!list_empty(&conn->send_queue)) + l2tp_retransmit(conn); } else log_ppp_debug("reordered packet\n"); l2tp_packet_free(pack); -- cgit v1.2.3