]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Move pw status settting until after we get results
authorDonald Sharp <sharpd@nvidia.com>
Fri, 4 Oct 2024 13:38:25 +0000 (09:38 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Tue, 8 Oct 2024 00:36:45 +0000 (20:36 -0400)
Currently the pw code sets the status of the pw for install
and uninstall immediately when notifying the dplane.  This
is incorrect in that we do not actually know the status at
this point in time.  When we get the result is when to set
the status.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
zebra/zebra_pw.c
zebra/zebra_pw.h
zebra/zebra_rib.c

index deed3b6ad3c3c78080e45fb09bf8c7abfdb2fdd1..d7128a1f394614805fdfbd4dbf2ed01ea700a1a0 100644 (file)
@@ -170,9 +170,6 @@ static void zebra_pw_install(struct zebra_pw *pw)
                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 +185,28 @@ static void zebra_pw_uninstall(struct zebra_pw *pw)
        /* ignore any possible error */
        hook_call(pw_uninstall, pw);
        dplane_pw_uninstall(pw);
+}
+
+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 (zebra_pw_enabled(pw))
-               zebra_pw_update_status(pw, PW_NOT_FORWARDING);
+       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);
+       }
 }
 
 /*
index 431d663f7ce1f36f9125e9f19a72c72f874b819d..e037a55048d82cd55f76815aaaa2e74597c54b5f 100644 (file)
@@ -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
 }
index 2d2be4fc780b05803a7200b712869528648079aa..8ebc193fba9997f9bb679cbcac33f948c9ea1bfe 100644 (file)
@@ -4850,29 +4850,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: