summaryrefslogtreecommitdiff
path: root/zebra/zebra_rib.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/zebra_rib.c')
-rw-r--r--zebra/zebra_rib.c72
1 files changed, 49 insertions, 23 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 0226c355c8..a1c8cd3059 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1891,20 +1891,18 @@ struct route_node *rib_find_rn_from_ctx(const struct zebra_dplane_ctx *ctx)
struct route_table *table = NULL;
struct route_node *rn = NULL;
const struct prefix *dest_pfx, *src_pfx;
+ uint32_t tableid = dplane_ctx_get_table(ctx);
+ vrf_id_t vrf_id = dplane_ctx_get_vrf(ctx);
/* Locate rn and re(s) from ctx */
+ table = zebra_vrf_lookup_table_with_table_id(dplane_ctx_get_afi(ctx),
+ dplane_ctx_get_safi(ctx), vrf_id, tableid);
- table = zebra_vrf_lookup_table_with_table_id(
- dplane_ctx_get_afi(ctx), dplane_ctx_get_safi(ctx),
- dplane_ctx_get_vrf(ctx), dplane_ctx_get_table(ctx));
if (table == NULL) {
if (IS_ZEBRA_DEBUG_DPLANE) {
- zlog_debug(
- "Failed to find route for ctx: no table for afi %d, safi %d, vrf %s(%u)",
- dplane_ctx_get_afi(ctx),
- dplane_ctx_get_safi(ctx),
- vrf_id_to_name(dplane_ctx_get_vrf(ctx)),
- dplane_ctx_get_vrf(ctx));
+ zlog_debug("Failed to find route for ctx: no table for afi %d, safi %d, vrf %s(%u) table %u",
+ dplane_ctx_get_afi(ctx), dplane_ctx_get_safi(ctx),
+ vrf_id_to_name(vrf_id), vrf_id, tableid);
}
goto done;
}
@@ -2214,14 +2212,13 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
{
struct route_node *rn = NULL;
struct route_entry *re = NULL;
- struct vrf *vrf;
+ struct vrf *vrf = vrf_lookup_by_id(dplane_ctx_get_vrf(ctx));
struct nexthop *nexthop;
rib_dest_t *dest;
bool fib_changed = false;
bool debug_p = IS_ZEBRA_DEBUG_DPLANE | IS_ZEBRA_DEBUG_RIB;
int start_count, end_count;
-
- vrf = vrf_lookup_by_id(dplane_ctx_get_vrf(ctx));
+ uint32_t tableid = dplane_ctx_get_table(ctx);
/* Locate rn and re(s) from ctx */
rn = rib_find_rn_from_ctx(ctx);
@@ -2230,7 +2227,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
zlog_debug(
"Failed to process dplane notification: no routes for %s(%u:%u):%pRN",
VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn);
+ tableid, rn);
}
goto done;
}
@@ -2240,7 +2237,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
if (debug_p)
zlog_debug("%s(%u:%u):%pRN Processing dplane notif ctx %p",
VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn, ctx);
+ tableid, rn, ctx);
/*
* Take a pass through the routes, look for matches with the context
@@ -2257,7 +2254,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
zlog_debug(
"%s(%u:%u):%pRN Unable to process dplane notification: no entry for type %s",
VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn,
+ tableid, rn,
zebra_route_string(dplane_ctx_get_type(ctx)));
goto done;
@@ -2293,7 +2290,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
"%s(%u:%u):%pRN dplane notif, uninstalled type %s route",
VRF_LOGNAME(vrf),
dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn,
+ tableid, rn,
zebra_route_string(
dplane_ctx_get_type(ctx)));
} else {
@@ -2303,7 +2300,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
"%s(%u:%u):%pRN dplane notif, but type %s not selected_fib",
VRF_LOGNAME(vrf),
dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn,
+ tableid, rn,
zebra_route_string(
dplane_ctx_get_type(ctx)));
}
@@ -2342,7 +2339,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
zlog_debug(
"%s(%u:%u):%pRN dplane notification: rib_update returns FALSE",
VRF_LOGNAME(vrf), dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn);
+ tableid, rn);
}
/*
@@ -2361,7 +2358,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
"%s(%u:%u):%pRN applied nexthop changes from dplane notification",
VRF_LOGNAME(vrf),
dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn);
+ tableid, rn);
/* Changed nexthops - update kernel/others */
dplane_route_notif_update(rn, re,
@@ -2373,7 +2370,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
"%s(%u:%u):%pRN installed transition from dplane notification",
VRF_LOGNAME(vrf),
dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn);
+ tableid, rn);
/* We expect this to be the selected route, so we want
* to tell others about this transition.
@@ -2393,7 +2390,7 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx)
"%s(%u:%u):%pRN un-installed transition from dplane notification",
VRF_LOGNAME(vrf),
dplane_ctx_get_vrf(ctx),
- dplane_ctx_get_table(ctx), rn);
+ tableid, rn);
/* Transition from _something_ installed to _nothing_
* installed.
@@ -3973,10 +3970,10 @@ static void rib_link(struct route_node *rn, struct route_entry *re, int process)
dest = rib_dest_from_rnode(rn);
if (!dest) {
+ dest = zebra_rib_create_dest(rn);
+
if (IS_ZEBRA_DEBUG_RIB_DETAILED)
rnode_debug(rn, re->vrf_id, "rn %p adding dest", rn);
-
- dest = zebra_rib_create_dest(rn);
}
re_list_add_head(&dest->routes, re);
@@ -4851,6 +4848,33 @@ void rib_close_table(struct route_table *table)
}
/*
+ * The context sent up from the dplane may be a context
+ * that has been generated by the zebra master pthread
+ * or it may be a context generated from a event in
+ * either the kernel dplane code or the fpm dplane
+ * code. In which case the tableid and vrfid may
+ * not be fully known and we have to figure it out
+ * when the context hits the master pthread.
+ * since this is the *starter* spot for that let
+ * us do a bit of work on each one to see if any
+ * massaging is needed
+ */
+static inline void zebra_rib_translate_ctx_from_dplane(struct zebra_dplane_ctx *ctx)
+{
+ uint32_t tableid = dplane_ctx_get_table(ctx);
+ vrf_id_t vrfid = dplane_ctx_get_vrf(ctx);
+ uint32_t nsid = dplane_ctx_get_ns_id(ctx);
+ enum dplane_op_e op = dplane_ctx_get_op(ctx);
+
+ if (vrfid == VRF_UNKNOWN)
+ dplane_ctx_set_vrf(ctx, zebra_vrf_lookup_by_table(tableid, nsid));
+ else if ((op == DPLANE_OP_ROUTE_INSTALL || op == DPLANE_OP_ROUTE_UPDATE ||
+ op == DPLANE_OP_ROUTE_DELETE) &&
+ tableid == ZEBRA_ROUTE_TABLE_UNKNOWN)
+ dplane_ctx_set_table(ctx, zebra_vrf_lookup_tableid(vrfid, nsid));
+}
+
+/*
* Handle results from the dataplane system. Dequeue update context
* structs, dispatch to appropriate internal handlers.
*/
@@ -4909,6 +4933,8 @@ static void rib_process_dplane_results(struct event *thread)
}
while (ctx) {
+ zebra_rib_translate_ctx_from_dplane(ctx);
+
#ifdef HAVE_SCRIPTING
if (ret == 0)
frrscript_call(fs,