summaryrefslogtreecommitdiff
path: root/zebra/zebra_pw.c
diff options
context:
space:
mode:
authorKaren Schoener <karen@volta.io>2020-05-28 16:36:35 -0400
committerKaren Schoener <karen@volta.io>2020-06-01 13:21:37 -0400
commitfd563cc7f35e598decdbfd6a58bae2f050143b3f (patch)
tree682f7ce1aaa6b133803c0c61e31e2c6f55d387f9 /zebra/zebra_pw.c
parent6b2210021cab645efa58a23d5a4d171fe37f305e (diff)
ldpd: Relay data plane pseudowire status in LDP notification
Provide a way for the data plane to indicate pseudowire status (such as: not forwarding, AC failure). On a data plane pseudowire install failure, data plane sets the pseudowire status. Zebra relays the pseudowire status to LDP. LDP includes the pseudowire status in the LDP notification to the LDP peer. Signed-off-by: Karen Schoener <karen@voltanet.io>
Diffstat (limited to 'zebra/zebra_pw.c')
-rw-r--r--zebra/zebra_pw.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/zebra/zebra_pw.c b/zebra/zebra_pw.c
index 273843baa2..8f255ecfb0 100644
--- a/zebra/zebra_pw.c
+++ b/zebra/zebra_pw.c
@@ -74,7 +74,7 @@ struct zebra_pw *zebra_pw_add(struct zebra_vrf *zvrf, const char *ifname,
pw->protocol = protocol;
pw->vrf_id = zvrf_id(zvrf);
pw->client = client;
- pw->status = PW_STATUS_DOWN;
+ pw->status = PW_NOT_FORWARDING;
pw->local_label = MPLS_NO_LABEL;
pw->remote_label = MPLS_NO_LABEL;
pw->flags = F_PSEUDOWIRE_CWORD;
@@ -98,7 +98,7 @@ void zebra_pw_del(struct zebra_vrf *zvrf, struct zebra_pw *pw)
zebra_deregister_rnh_pseudowire(pw->vrf_id, pw);
/* uninstall */
- if (pw->status == PW_STATUS_UP) {
+ if (pw->status == PW_FORWARDING) {
hook_call(pw_uninstall, pw);
dplane_pw_uninstall(pw);
} else if (pw->install_retry_timer)
@@ -156,6 +156,7 @@ 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 {
/*
@@ -175,17 +176,17 @@ static void zebra_pw_install(struct zebra_pw *pw)
hook_call(pw_install, pw);
if (dplane_pw_install(pw) == ZEBRA_DPLANE_REQUEST_FAILURE) {
- zebra_pw_install_failure(pw);
+ zebra_pw_install_failure(pw, PW_NOT_FORWARDING);
return;
}
- if (pw->status == PW_STATUS_DOWN)
- zebra_pw_update_status(pw, PW_STATUS_UP);
+ if (pw->status != PW_FORWARDING)
+ zebra_pw_update_status(pw, PW_FORWARDING);
}
static void zebra_pw_uninstall(struct zebra_pw *pw)
{
- if (pw->status == PW_STATUS_DOWN)
+ if (pw->status != PW_FORWARDING)
return;
if (IS_ZEBRA_DEBUG_PW)
@@ -198,7 +199,7 @@ static void zebra_pw_uninstall(struct zebra_pw *pw)
dplane_pw_uninstall(pw);
if (zebra_pw_enabled(pw))
- zebra_pw_update_status(pw, PW_STATUS_DOWN);
+ zebra_pw_update_status(pw, PW_NOT_FORWARDING);
}
/*
@@ -207,7 +208,7 @@ static void zebra_pw_uninstall(struct zebra_pw *pw)
* to retry the installation later. This function can be called by an external
* agent that performs the pseudowire installation in an asynchronous way.
*/
-void zebra_pw_install_failure(struct zebra_pw *pw)
+void zebra_pw_install_failure(struct zebra_pw *pw, int pwstatus)
{
if (IS_ZEBRA_DEBUG_PW)
zlog_debug(
@@ -220,7 +221,7 @@ void zebra_pw_install_failure(struct zebra_pw *pw)
thread_add_timer(zrouter.master, zebra_pw_install_retry, pw,
PW_INSTALL_RETRY_INTERVAL, &pw->install_retry_timer);
- zebra_pw_update_status(pw, PW_STATUS_DOWN);
+ zebra_pw_update_status(pw, pwstatus);
}
static int zebra_pw_install_retry(struct thread *thread)
@@ -500,7 +501,7 @@ DEFUN (show_pseudowires,
vty_out(vty, "%-16s %-24s %-12s %-8s %-10s\n", pw->ifname,
(pw->af != AF_UNSPEC) ? buf_nbr : "-", buf_labels,
zebra_route_string(pw->protocol),
- (zebra_pw_enabled(pw) && pw->status == PW_STATUS_UP)
+ (zebra_pw_enabled(pw) && pw->status == PW_FORWARDING)
? "UP"
: "DOWN");
}
@@ -540,7 +541,7 @@ static void vty_show_mpls_pseudowire_detail(struct vty *vty)
if (pw->protocol == ZEBRA_ROUTE_LDP)
vty_out(vty, " VC-ID: %u\n", pw->data.ldp.pwid);
vty_out(vty, " Status: %s \n",
- (zebra_pw_enabled(pw) && pw->status == PW_STATUS_UP)
+ (zebra_pw_enabled(pw) && pw->status == PW_FORWARDING)
? "Up"
: "Down");
re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id,
@@ -595,8 +596,8 @@ static void vty_show_mpls_pseudowire(struct zebra_pw *pw, json_object *json_pws)
json_object_int_add(json_pw, "vcId", pw->data.ldp.pwid);
json_object_string_add(
json_pw, "Status",
- (zebra_pw_enabled(pw) && pw->status == PW_STATUS_UP) ? "Up"
- : "Down");
+ (zebra_pw_enabled(pw) && pw->status == PW_FORWARDING) ? "Up"
+ : "Down");
re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id,
&pw->nexthop, NULL);
if (re) {