]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: packet fifo init in interface create
authorChirag Shah <chirag@cumulusnetworks.com>
Tue, 1 May 2018 14:36:53 +0000 (07:36 -0700)
committerChirag Shah <chirag@cumulusnetworks.com>
Fri, 11 May 2018 00:45:43 +0000 (17:45 -0700)
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>
ospfd/ospf_interface.c

index 52b954d6a1dfa07a08a5aaffe323441d2a836820..ea31d8c2ca2bbb8f50d6801d0a8750489a9b6c1b 100644 (file)
@@ -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);
        }