diff --git a/proto/ospf/dbdes.c b/proto/ospf/dbdes.c index e74baa82..3c228508 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 9239894e..6d2f1fb2 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 35fd6672..6a20300e 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 */