Date: Fri, 20 Dec 2002 17:28:45 +0900
From: Masahiko Endo <endo@suri.co.jp>
Reply-To: zebra@zebra.org
To: zebra@zebra.org
Cc: kunihiro@zebra.org, yokota@kddlabs.co.jp
Subject: [zebra 16823] [PATCH] Bugfix and new feature in Opaque-LSA
handling.

----- * ----- * ----- * ----- * ----- * ----- * ----- * ----- * ----- * -----
Changes 2002.12.20

1. Bug fixes

  1.1 When an opaque LSA is being removed from (or added to) the LSDB,
      it does not mean a change in network topology. Therefore, SPF
      recalculation should not be triggered in that case.
      There was an assertion failure problem "assert (rn && rn->info)"
      inside the function "ospf_ase_incremental_update()", because
      the upper function "ospf_lsa_maxage_walker_remover()" called it
      when a type-11 opaque LSA is removed due to MaxAge.

  1.2 Type-9 LSA is defined to have "link-local" flooding scope.
      In the Database exchange procedure with a new neighbor, a type-9
      LSA was added in the database summary of a DD message, even if
      the link is different from the one that have bound to.

2. Feature enhancements

  2.1 Though a "wildcard" concept to handle type-9/10/11 LSAs altogether
      has introduced about a year ago, it was only a symbol definition
      and actual handling mechanism was not implemented. Now it works.
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index cfb18a9..5730357 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -229,6 +229,26 @@
   if (lsa == NULL)
     return 0;
 
+#ifdef HAVE_OPAQUE_LSA
+  switch (lsa->data->type)
+    {
+    case OSPF_OPAQUE_LINK_LSA:
+      /* Exclude type-9 LSAs that does not have the same "oi" with "nbr". */
+      if (lsa->oi != nbr->oi)
+          return 0;
+      break;
+    case OSPF_OPAQUE_AREA_LSA:
+      /*
+       * It is assured by the caller function "nsm_negotiation_done()"
+       * that every given LSA belongs to the same area with "nbr".
+       */
+      break;
+    case OSPF_OPAQUE_AS_LSA:
+    default:
+      break;
+    }
+#endif /* HAVE_OPAQUE_LSA */
+
 #ifdef HAVE_NSSA
   /* Stay away from any Local Translated Type-7 LSAs */
   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))