]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: add new flag to detect nexthop label updates
authorRenato Westphal <renato@opensourcerouting.org>
Thu, 8 Jun 2017 23:29:12 +0000 (20:29 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Tue, 25 Jul 2017 03:53:23 +0000 (00:53 -0300)
With the introduction of the pseudowire manager, the NHT tracking code
needs to detect label updates as well.

Create a specific nexthop flag for that. We can't reuse the
RIB_ENTRY_NEXTHOPS_CHANGED flag for this porpose because this flag is
always cleared and reevaluated in rib_process(), setting it outside that
function is a nop.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
zebra/rib.h
zebra/zebra_mpls.c
zebra/zebra_rnh.c

index 5381d76b9874688cf88007093979a669d0b160c5..e910facb44771a14cf78f412f6cec2a2500cddc5 100644 (file)
@@ -91,6 +91,7 @@ struct rib
 #define RIB_ENTRY_NEXTHOPS_CHANGED 0x2
 #define RIB_ENTRY_CHANGED          0x4
 #define RIB_ENTRY_SELECTED_FIB     0x8
+#define RIB_ENTRY_LABELS_CHANGED   0x10
 
   /* Nexthop information. */
   u_char nexthop_num;
index 5a3ed7545d294f5f4f29747428f3458d540f58ca..ba500cac2724c89f8d4387650af36185da0651da 100644 (file)
@@ -1346,7 +1346,7 @@ mpls_ftn_update (int add, struct zebra_vrf *zvrf, enum lsp_types_t type,
     return 0;
 
   SET_FLAG (rib->status, RIB_ENTRY_CHANGED);
-  SET_FLAG (rib->status, RIB_ENTRY_NEXTHOPS_CHANGED);
+  SET_FLAG (rib->status, RIB_ENTRY_LABELS_CHANGED);
   rib_queue_add (rn);
 
   return 0;
@@ -1542,7 +1542,7 @@ mpls_ldp_ftn_uninstall_all (struct zebra_vrf *zvrf, int afi)
            {
              nexthop_del_labels (nexthop);
              SET_FLAG (rib->status, RIB_ENTRY_CHANGED);
-             SET_FLAG (rib->status, RIB_ENTRY_NEXTHOPS_CHANGED);
+             SET_FLAG (rib->status, RIB_ENTRY_LABELS_CHANGED);
              update = 1;
            }
 
index 2a1f69d7b82354edb14a67106626407d8491e885..ff3b94a25b017e2b6a4bc08cf8ab5850e3a95a0f 100644 (file)
@@ -790,7 +790,10 @@ zebra_rnh_clear_nhc_flag (vrf_id_t vrfid, int family, rnh_type_t type,
   rib = zebra_rnh_resolve_entry (vrfid, family, type, nrn, rnh, &prn);
 
   if (rib)
-    UNSET_FLAG (rib->status, RIB_ENTRY_NEXTHOPS_CHANGED);
+    {
+      UNSET_FLAG (rib->status, RIB_ENTRY_NEXTHOPS_CHANGED);
+      UNSET_FLAG (rib->status, RIB_ENTRY_LABELS_CHANGED);
+    }
 }
 
 /* Evaluate all tracked entries (nexthops or routes for import into BGP)
@@ -941,7 +944,8 @@ compare_state (struct rib *r1, struct rib *r2)
   if (r1->nexthop_num != r2->nexthop_num)
       return 1;
 
-  if (CHECK_FLAG(r1->status, RIB_ENTRY_NEXTHOPS_CHANGED))
+  if (CHECK_FLAG(r1->status, RIB_ENTRY_NEXTHOPS_CHANGED) ||
+      CHECK_FLAG(r1->status, RIB_ENTRY_LABELS_CHANGED))
     return 1;
 
   return 0;