diff options
Diffstat (limited to 'zebra/zebra_pw.c')
| -rw-r--r-- | zebra/zebra_pw.c | 35 | 
1 files changed, 29 insertions, 6 deletions
diff --git a/zebra/zebra_pw.c b/zebra/zebra_pw.c index deed3b6ad3..c8ffaf0bbe 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); +	}  }  /*  | 
