]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: Fix RFC conformance test cases 25.19 and 27.6
authorMobashshera Rasool <mrasool@vmware.com>
Tue, 15 Nov 2022 05:00:55 +0000 (21:00 -0800)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Thu, 24 Nov 2022 15:22:24 +0000 (15:22 +0000)
Steps to reproduce:
--------------------------
1. ANVL: Establish full adjacency with DUT for neighbor Rtr-0-A on DIface-0 with DUT as DR.
2. ANVL: Listen (for up to 2 * <RxmtInterval> seconds) on DIface-0.
3. DUT: Send <OSPF-LSU> packet.
4. ANVL: Verify that the received <OSPF-LSU> packet contains a Network- LSA for network N1
   originated by DUT, and the LS Sequence Number is set to <InitialSequenceNumber>.
5. ANVL: Establish full adjacency with DUT for neighbor Rtr-0-B on DIface-0 with DUT as DR.
6. ANVL: Listen (for up to 2 * <RxmtInterval> seconds) on DIface-0.
7. DUT: Send <OSPF-LSU> packet.
8. ANVL: Verify that the received <OSPF-LSU> packet contains a new instance of the
   Network-LSA for network N1 originated by DUT, and the LS Sequence Number
   is set to (<InitialSequenceNumber> + 1).

Both the test cases were failing while verifying the initial sequence number for network LSA.

This is because currently OSPF does not reset its LSA sequence number when it is going down.

Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
(cherry picked from commit ca5997cd018ec66534285130d02de168a3a4ed5c)

lib/libospf.h
ospfd/ospf_lsa.c

index c8ada9d3c52fb69b66cd0a9ae2965860283c2413..161c7635d8816b2e3cbb8bd4352910906487ce2d 100644 (file)
@@ -52,6 +52,7 @@ extern "C" {
 #define OSPF_DEFAULT_DESTINATION        0x00000000      /* 0.0.0.0 */
 #define OSPF_INITIAL_SEQUENCE_NUMBER    0x80000001U
 #define OSPF_MAX_SEQUENCE_NUMBER        0x7fffffffU
+#define OSPF_INVALID_SEQUENCE_NUMBER 0x80000000U
 
 /* OSPF Interface Types */
 #define OSPF_IFTYPE_NONE               0
index 8d05cebcdca6b5878f9a86e62077bada28eaeb80..e20235b9674f63adf2e09f2e29290a718494ce29 100644 (file)
@@ -3565,6 +3565,7 @@ void ospf_flush_self_originated_lsas_now(struct ospf *ospf)
        struct ospf_interface *oi;
        struct ospf_lsa *lsa;
        struct route_node *rn;
+       struct ospf_if_params *oip;
        int need_to_flush_ase = 0;
 
        ospf->inst_shutdown = 1;
@@ -3597,6 +3598,12 @@ void ospf_flush_self_originated_lsas_now(struct ospf *ospf)
                                ospf_lsa_flush_area(oi->network_lsa_self, area);
                                ospf_lsa_unlock(&oi->network_lsa_self);
                                oi->network_lsa_self = NULL;
+
+                               oip = ospf_lookup_if_params(
+                                       oi->ifp, oi->address->u.prefix4);
+                               if (oip)
+                                       oip->network_lsa_seqnum = htonl(
+                                               OSPF_INVALID_SEQUENCE_NUMBER);
                        }
 
                        if (oi->type != OSPF_IFTYPE_VIRTUALLINK