summaryrefslogtreecommitdiffstats
path: root/zebra/zebra_mpls.h
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-02-08 23:14:30 +0100
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-03-27 21:22:22 +0100
commita1494c250ccf6737135f52b5bf660ca071e1c43f (patch)
tree8688839a1de661d4b03ebd5f9bf5b884dcb832dc /zebra/zebra_mpls.h
parentzebra: Add detailed debugging command for NHT tracking (diff)
downloadfrr-a1494c250ccf6737135f52b5bf660ca071e1c43f.tar.xz
frr-a1494c250ccf6737135f52b5bf660ca071e1c43f.zip
zebra: Modify lsp processing to be invoked as needed
LSP processing was a zvrf flag based upon a connected route coming or going. But this did not allow us to know that we should do lsp processing other than after the meta-queue processing was finished. Eventually we moved meta-queue processing of do_nht_processing to after the dataplane sent the main pthread some results. This of course left us with a timing hole where if a connected route came in and we received a data plane response *before* the meta queue was processed we would not do the work as necessary. Move the lsp processing to a flag off of the rib_dest_t. If it is marked then we need to process lsps. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'zebra/zebra_mpls.h')
-rw-r--r--zebra/zebra_mpls.h33
1 files changed, 23 insertions, 10 deletions
diff --git a/zebra/zebra_mpls.h b/zebra/zebra_mpls.h
index f8c6c794a..3a131e1aa 100644
--- a/zebra/zebra_mpls.h
+++ b/zebra/zebra_mpls.h
@@ -510,28 +510,41 @@ static inline const char *nhlfe_type2str(enum lsp_types_t lsp_type)
return "Unknown";
}
-static inline void mpls_mark_lsps_for_processing(struct zebra_vrf *zvrf)
+static inline void mpls_mark_lsps_for_processing(struct zebra_vrf *zvrf,
+ struct prefix *p)
{
+ struct route_table *table;
+ struct route_node *rn;
+ rib_dest_t *dest;
+
if (!zvrf)
return;
- zvrf->mpls_flags |= MPLS_FLAG_SCHEDULE_LSPS;
+ table = zvrf->table[family2afi(p->family)][SAFI_UNICAST];
+ if (!table)
+ return;
+
+ rn = route_node_match(table, p);
+ if (!rn)
+ return;
+
+
+ dest = rib_dest_from_rnode(rn);
+ SET_FLAG(dest->flags, RIB_DEST_UPDATE_LSPS);
}
-static inline void mpls_unmark_lsps_for_processing(struct zebra_vrf *zvrf)
+static inline void mpls_unmark_lsps_for_processing(struct route_node *rn)
{
- if (!zvrf)
- return;
+ rib_dest_t *dest = rib_dest_from_rnode(rn);
- zvrf->mpls_flags &= ~MPLS_FLAG_SCHEDULE_LSPS;
+ UNSET_FLAG(dest->flags, RIB_DEST_UPDATE_LSPS);
}
-static inline int mpls_should_lsps_be_processed(struct zebra_vrf *zvrf)
+static inline int mpls_should_lsps_be_processed(struct route_node *rn)
{
- if (!zvrf)
- return 0;
+ rib_dest_t *dest = rib_dest_from_rnode(rn);
- return ((zvrf->mpls_flags & MPLS_FLAG_SCHEDULE_LSPS) ? 1 : 0);
+ return !!CHECK_FLAG(dest->flags, RIB_DEST_UPDATE_LSPS);
}
/* Global variables. */