From 99b2d10be00d408fc8b151db902fe7d843f8acdc Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Sun, 3 Feb 2019 21:31:15 +0100 Subject: [PATCH] OSPF: Reject duplicate DBDES packets after dead interval Master may free last DBDES packet immediately. Slave must wait dead interval before freeing last DBDES packet and then reject duplicate DBDES packets with SeqNumberMismatch. --- proto/ospf/dbdes.c | 13 +++++++++++++ proto/ospf/neighbor.c | 6 ++++++ proto/ospf/ospf.h | 1 + 3 files changed, 20 insertions(+) diff --git a/proto/ospf/dbdes.c b/proto/ospf/dbdes.c index e74baa823..3c2285087 100644 --- a/proto/ospf/dbdes.c +++ b/proto/ospf/dbdes.c @@ -235,6 +235,14 @@ ospf_rxmt_dbdes(struct ospf_proto *p, struct ospf_neighbor *n) ospf_do_send_dbdes(p, n); } +void +ospf_reset_ldd(struct ospf_proto *p UNUSED, struct ospf_neighbor *n) +{ + mb_free(n->ldd_buffer); + n->ldd_buffer = NULL; + n->ldd_bsize = 0; +} + static int ospf_process_dbdes(struct ospf_proto *p, struct ospf_packet *pkt, struct ospf_neighbor *n) { @@ -433,6 +441,7 @@ ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa, if (!(n->myimms & DBDES_M) && !(n->imms & DBDES_M)) { tm_stop(n->dbdes_timer); + ospf_reset_ldd(p, n); ospf_neigh_sm(n, INM_EXDONE); break; } @@ -456,7 +465,11 @@ ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa, ospf_send_dbdes(p, n); if (!(n->myimms & DBDES_M) && !(n->imms & DBDES_M)) + { + /* Use dbdes timer to postpone freeing of Last DBDES packet buffer */ + tm_start(n->dbdes_timer, n->ifa->deadint S); ospf_neigh_sm(n, INM_EXDONE); + } } break; diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c index 9239894ec..6d2f1fb2e 100644 --- a/proto/ospf/neighbor.c +++ b/proto/ospf/neighbor.c @@ -610,6 +610,12 @@ dbdes_timer_hook(timer *t) if ((n->state == NEIGHBOR_EXCHANGE) && (n->myimms & DBDES_MS)) ospf_rxmt_dbdes(p, n); + + if ((n->state > NEIGHBOR_LOADING) && !(n->myimms & DBDES_MS)) + { + ospf_reset_ldd(p, n); + tm_stop(n->dbdes_timer); + } } static void diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 35fd66722..6a20300e5 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -989,6 +989,7 @@ void ospf_receive_hello(struct ospf_packet *pkt, struct ospf_iface *ifa, struct /* dbdes.c */ void ospf_send_dbdes(struct ospf_proto *p, struct ospf_neighbor *n); void ospf_rxmt_dbdes(struct ospf_proto *p, struct ospf_neighbor *n); +void ospf_reset_ldd(struct ospf_proto *p, struct ospf_neighbor *n); void ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa, struct ospf_neighbor *n); /* lsreq.c */ -- 2.47.2