mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-02 15:34:30 +00:00
ospfd: packet fifo init in interface create
Currently, interface packet transmit queue is created/deleted as part of Interface UP/Down event. This results in a rare condition where port came up but queue was not created. The creation of queue occupies only few bytes. Moving fifo queue creation to interface create would add few bytes of fifo creation but at least it guaranteed to be available during Up/down -->Up event. Initialize ospf packet fifo queue during ospf interface creation. Drain queue during interface down event. Drained and free the queue as part of the interface delete/cleanup. Ticket:CM-20744 Testing Done: Bring up ospfv2 topology with multiple neighbors. 1) Trigger multiple shut/no shut events and validate all queues are freed. 2) configure/deconfigure router ospf and validate all ospf instance and interface underneath are freed. Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
This commit is contained in:
parent
3dc755e492
commit
4fc8a85288
@ -263,6 +263,9 @@ struct ospf_interface *ospf_if_new(struct ospf *ospf, struct interface *ifp,
|
||||
ospf_opaque_type9_lsa_init(oi);
|
||||
|
||||
oi->ospf = ospf;
|
||||
|
||||
ospf_if_stream_set(oi);
|
||||
|
||||
QOBJ_REG(oi, ospf_interface);
|
||||
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
@ -322,6 +325,9 @@ void ospf_if_free(struct ospf_interface *oi)
|
||||
{
|
||||
ospf_if_down(oi);
|
||||
|
||||
if (oi->obuf)
|
||||
ospf_fifo_free(oi->obuf);
|
||||
|
||||
assert(oi->state == ISM_Down);
|
||||
|
||||
ospf_opaque_type9_lsa_term(oi);
|
||||
@ -496,9 +502,8 @@ void ospf_if_stream_unset(struct ospf_interface *oi)
|
||||
struct ospf *ospf = oi->ospf;
|
||||
|
||||
if (oi->obuf) {
|
||||
ospf_fifo_free(oi->obuf);
|
||||
oi->obuf = NULL;
|
||||
|
||||
/* flush the interface packet queue */
|
||||
ospf_fifo_flush(oi->obuf);
|
||||
/*reset protocol stats */
|
||||
ospf_if_reset_stats(oi);
|
||||
|
||||
@ -781,7 +786,6 @@ int ospf_if_up(struct ospf_interface *oi)
|
||||
if (oi->type == OSPF_IFTYPE_LOOPBACK)
|
||||
OSPF_ISM_EVENT_SCHEDULE(oi, ISM_LoopInd);
|
||||
else {
|
||||
ospf_if_stream_set(oi);
|
||||
OSPF_ISM_EVENT_SCHEDULE(oi, ISM_InterfaceUp);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user