summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--zebra/zebra_pw.c35
-rw-r--r--zebra/zebra_pw.h1
-rw-r--r--zebra/zebra_rib.c25
3 files changed, 31 insertions, 30 deletions
diff --git a/zebra/zebra_pw.c b/zebra/zebra_pw.c
index deed3b6ad..c8ffaf0bb 100644
--- a/zebra/zebra_pw.c
+++ b/zebra/zebra_pw.c
@@ -147,7 +147,6 @@ void zebra_pw_update(struct zebra_pw *pw)
{
if (zebra_pw_check_reachability(pw) < 0) {
zebra_pw_uninstall(pw);
- zebra_pw_install_failure(pw, PW_NOT_FORWARDING);
/* wait for NHT and try again later */
} else {
/*
@@ -167,12 +166,17 @@ static void zebra_pw_install(struct zebra_pw *pw)
hook_call(pw_install, pw);
if (dplane_pw_install(pw) == ZEBRA_DPLANE_REQUEST_FAILURE) {
+ /*
+ * Realistically this is never going to fail passing
+ * the pw data down to the dplane. The failure modes
+ * look like impossible events but we still return
+ * on them.... but I don't see a real clean way to remove this
+ * at all. So let's just leave the retry mechanism for
+ * the moment.
+ */
zebra_pw_install_failure(pw, PW_NOT_FORWARDING);
return;
}
-
- if (pw->status != PW_FORWARDING)
- zebra_pw_update_status(pw, PW_FORWARDING);
}
static void zebra_pw_uninstall(struct zebra_pw *pw)
@@ -188,9 +192,28 @@ static void zebra_pw_uninstall(struct zebra_pw *pw)
/* ignore any possible error */
hook_call(pw_uninstall, pw);
dplane_pw_uninstall(pw);
+}
- if (zebra_pw_enabled(pw))
- zebra_pw_update_status(pw, PW_NOT_FORWARDING);
+void zebra_pw_handle_dplane_results(struct zebra_dplane_ctx *ctx)
+{
+ struct zebra_pw *pw;
+ struct zebra_vrf *vrf;
+ enum dplane_op_e op;
+
+ op = dplane_ctx_get_op(ctx);
+
+ vrf = zebra_vrf_lookup_by_id(dplane_ctx_get_vrf(ctx));
+ pw = zebra_pw_find(vrf, dplane_ctx_get_ifname(ctx));
+
+ if (dplane_ctx_get_status(ctx) != ZEBRA_DPLANE_REQUEST_SUCCESS) {
+ if (pw)
+ zebra_pw_install_failure(pw, dplane_ctx_get_pw_status(ctx));
+ } else {
+ if (op == DPLANE_OP_PW_INSTALL && pw->status != PW_FORWARDING)
+ zebra_pw_update_status(pw, PW_FORWARDING);
+ else if (op == DPLANE_OP_PW_UNINSTALL && zebra_pw_enabled(pw))
+ zebra_pw_update_status(pw, PW_NOT_FORWARDING);
+ }
}
/*
diff --git a/zebra/zebra_pw.h b/zebra/zebra_pw.h
index 431d663f7..e037a5504 100644
--- a/zebra/zebra_pw.h
+++ b/zebra/zebra_pw.h
@@ -64,6 +64,7 @@ void zebra_pw_init_vrf(struct zebra_vrf *);
void zebra_pw_exit_vrf(struct zebra_vrf *);
void zebra_pw_terminate(void);
void zebra_pw_vty_init(void);
+void zebra_pw_handle_dplane_results(struct zebra_dplane_ctx *ctx);
#ifdef __cplusplus
}
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 2d2be4fc7..8ebc193fb 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -4851,29 +4851,6 @@ void rib_close_table(struct route_table *table)
}
/*
- * Handler for async dataplane results after a pseudowire installation
- */
-static void handle_pw_result(struct zebra_dplane_ctx *ctx)
-{
- struct zebra_pw *pw;
- struct zebra_vrf *vrf;
-
- /* The pseudowire code assumes success - we act on an error
- * result for installation attempts here.
- */
- if (dplane_ctx_get_op(ctx) != DPLANE_OP_PW_INSTALL)
- return;
-
- if (dplane_ctx_get_status(ctx) != ZEBRA_DPLANE_REQUEST_SUCCESS) {
- vrf = zebra_vrf_lookup_by_id(dplane_ctx_get_vrf(ctx));
- pw = zebra_pw_find(vrf, dplane_ctx_get_ifname(ctx));
- if (pw)
- zebra_pw_install_failure(pw,
- dplane_ctx_get_pw_status(ctx));
- }
-}
-
-/*
* Handle results from the dataplane system. Dequeue update context
* structs, dispatch to appropriate internal handlers.
*/
@@ -4979,7 +4956,7 @@ static void rib_process_dplane_results(struct event *thread)
case DPLANE_OP_PW_INSTALL:
case DPLANE_OP_PW_UNINSTALL:
- handle_pw_result(ctx);
+ zebra_pw_handle_dplane_results(ctx);
break;
case DPLANE_OP_SYS_ROUTE_ADD: