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)
{
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;
}
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;
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
/* 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 */