From b47dc61ade27c295e5a9c1b4d00344231498da67 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 13 Feb 2019 08:55:12 -0500 Subject: [PATCH 1/2] sharpd: Allow the registration of import checks to zebra Minor code modification to allow the sharp_zebra.c code to differentiate between import check or nexthop watch types. Signed-off-by: Donald Sharp --- sharpd/sharp_vty.c | 4 ++-- sharpd/sharp_zebra.c | 19 +++++++++++++++---- sharpd/sharp_zebra.h | 4 ++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/sharpd/sharp_vty.c b/sharpd/sharp_vty.c index 0c02bd304d..26ce7c73bc 100644 --- a/sharpd/sharp_vty.c +++ b/sharpd/sharp_vty.c @@ -55,7 +55,7 @@ DEFPY(watch_nexthop_v6, watch_nexthop_v6_cmd, p.family = AF_INET6; sharp_nh_tracker_get(&p); - sharp_zebra_nexthop_watch(&p, true, !!connected); + sharp_zebra_nexthop_watch(&p, false, true, !!connected); return CMD_SUCCESS; } @@ -77,7 +77,7 @@ DEFPY(watch_nexthop_v4, watch_nexthop_v4_cmd, p.family = AF_INET; sharp_nh_tracker_get(&p); - sharp_zebra_nexthop_watch(&p, true, !!connected); + sharp_zebra_nexthop_watch(&p, false, true, !!connected); return CMD_SUCCESS; } diff --git a/sharpd/sharp_zebra.c b/sharpd/sharp_zebra.c index 30e616a057..4682dbc73a 100644 --- a/sharpd/sharp_zebra.c +++ b/sharpd/sharp_zebra.c @@ -320,12 +320,22 @@ void route_delete(struct prefix *p, uint8_t instance) return; } -void sharp_zebra_nexthop_watch(struct prefix *p, bool watch, bool connected) +void sharp_zebra_nexthop_watch(struct prefix *p, bool import, + bool watch, bool connected) { - int command = ZEBRA_NEXTHOP_REGISTER; + int command; - if (!watch) - command = ZEBRA_NEXTHOP_UNREGISTER; + if (!import) { + command = ZEBRA_NEXTHOP_REGISTER; + + if (!watch) + command = ZEBRA_NEXTHOP_UNREGISTER; + } else { + command = ZEBRA_IMPORT_ROUTE_REGISTER; + + if (!watch) + command = ZEBRA_IMPORT_ROUTE_UNREGISTER; + } if (zclient_send_rnh(zclient, command, p, connected, VRF_DEFAULT) < 0) zlog_warn("%s: Failure to send nexthop to zebra", @@ -405,4 +415,5 @@ void sharp_zebra_init(void) zclient->interface_address_delete = interface_address_delete; zclient->route_notify_owner = route_notify_owner; zclient->nexthop_update = sharp_nexthop_update; + zclient->import_check_update = sharp_nexthop_update; } diff --git a/sharpd/sharp_zebra.h b/sharpd/sharp_zebra.h index 7e6ac7670b..b219022f02 100644 --- a/sharpd/sharp_zebra.h +++ b/sharpd/sharp_zebra.h @@ -28,8 +28,8 @@ extern void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label); extern void route_add(struct prefix *p, uint8_t instance, struct nexthop_group *nhg); extern void route_delete(struct prefix *p, uint8_t instance); -extern void sharp_zebra_nexthop_watch(struct prefix *p, bool watch, - bool connected); +extern void sharp_zebra_nexthop_watch(struct prefix *p, bool import, + bool watch, bool connected); extern void sharp_install_routes_helper(struct prefix *p, uint8_t instance, struct nexthop_group *nhg, From 80d5ff338da6fecbef297db3eb42a98711205fb2 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 13 Feb 2019 09:27:19 -0500 Subject: [PATCH 2/2] sharpd: Add ability to track import-check nexthops Add the ability to sharp to track import-check type routes from the cli. Update docs too. Signed-off-by: Donald Sharp --- doc/user/sharp.rst | 7 ++++++- sharpd/sharp_vty.c | 23 +++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/doc/user/sharp.rst b/doc/user/sharp.rst index a78fac8fc1..ca8f1f512f 100644 --- a/doc/user/sharp.rst +++ b/doc/user/sharp.rst @@ -71,10 +71,15 @@ keyword. At present, no sharp commands will be preserved in the config. be used for pop and forward operations when the specified label is seen. .. index:: sharp watch -.. clicmd:: sharp watch nexthop +.. clicmd:: [no] sharp watch [connected] Instruct zebra to monitor and notify sharp when the specified nexthop is changed. The notification from zebra is written into the debug log. + The nexthop or import choice chooses the type of nexthop we are asking + zebra to watch for us. This choice affects zebra's decision on what + matches. Connected tells zebra whether or not that we want the route + matched against to be a static or connected route. The no form of + the command obviously turns this watching off. .. index:: sharp data nexthop .. clicmd:: sharp data nexthop diff --git a/sharpd/sharp_vty.c b/sharpd/sharp_vty.c index 26ce7c73bc..9018cfb359 100644 --- a/sharpd/sharp_vty.c +++ b/sharpd/sharp_vty.c @@ -39,14 +39,22 @@ #endif DEFPY(watch_nexthop_v6, watch_nexthop_v6_cmd, - "sharp watch nexthop X:X::X:X$nhop [connected$connected]", + "sharp watch X:X::X:X$nhop [connected$connected]", "Sharp routing Protocol\n" "Watch for changes\n" "Watch for nexthop changes\n" + "Watch for import check changes\n" "The v6 nexthop to signal for watching\n" "Should the route be connected\n") { struct prefix p; + bool type_import; + + + if (n) + type_import = false; + else + type_import = true; memset(&p, 0, sizeof(p)); @@ -55,29 +63,36 @@ DEFPY(watch_nexthop_v6, watch_nexthop_v6_cmd, p.family = AF_INET6; sharp_nh_tracker_get(&p); - sharp_zebra_nexthop_watch(&p, false, true, !!connected); + sharp_zebra_nexthop_watch(&p, type_import, true, !!connected); return CMD_SUCCESS; } DEFPY(watch_nexthop_v4, watch_nexthop_v4_cmd, - "sharp watch nexthop A.B.C.D$nhop [connected$connected]", + "sharp watch A.B.C.D$nhop [connected$connected]", "Sharp routing Protocol\n" "Watch for changes\n" "Watch for nexthop changes\n" + "Watch for import check changes\n" "The v4 nexthop to signal for watching\n" "Should the route be connected\n") { struct prefix p; + bool type_import; memset(&p, 0, sizeof(p)); + if (n) + type_import = false; + else + type_import = true; + p.prefixlen = 32; p.u.prefix4 = nhop; p.family = AF_INET; sharp_nh_tracker_get(&p); - sharp_zebra_nexthop_watch(&p, false, true, !!connected); + sharp_zebra_nexthop_watch(&p, type_import, true, !!connected); return CMD_SUCCESS; }