Merge pull request #3383 from qlyoung/fix-static-routes-again

staticd: fix null0 routes (again)
This commit is contained in:
Russ White 2018-11-29 15:24:03 -05:00 committed by GitHub
commit 6d51a5f9b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -837,7 +837,7 @@ DEFPY(ip_route_address_interface,
"[no] ip route\ "[no] ip route\
<A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \ <A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \
A.B.C.D$gate \ A.B.C.D$gate \
INTERFACE$ifname \ <INTERFACE|Null0>$ifname \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -853,8 +853,8 @@ DEFPY(ip_route_address_interface,
"IP destination prefix\n" "IP destination prefix\n"
"IP destination prefix mask\n" "IP destination prefix mask\n"
"IP gateway address\n" "IP gateway address\n"
"IP gateway interface name. Specify 'Null0' (case-insensitive) for a \ "IP gateway interface name\n"
null route.\n" "Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this route\n" "Distance value for this route\n"
@ -907,7 +907,7 @@ DEFPY(ip_route_address_interface_vrf,
"[no] ip route\ "[no] ip route\
<A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \ <A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \
A.B.C.D$gate \ A.B.C.D$gate \
INTERFACE$ifname \ <INTERFACE|Null0>$ifname \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -922,8 +922,8 @@ DEFPY(ip_route_address_interface_vrf,
"IP destination prefix\n" "IP destination prefix\n"
"IP destination prefix mask\n" "IP destination prefix mask\n"
"IP gateway address\n" "IP gateway address\n"
"IP gateway interface name. Specify 'Null0' (case-insensitive) for a \ "IP gateway interface name\n"
null route.\n" "Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this route\n" "Distance value for this route\n"
@ -969,7 +969,7 @@ DEFPY(ip_route,
ip_route_cmd, ip_route_cmd,
"[no] ip route\ "[no] ip route\
<A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \ <A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \
<A.B.C.D$gate|INTERFACE$ifname> \ <A.B.C.D$gate|<INTERFACE|Null0>$ifname> \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -985,6 +985,7 @@ DEFPY(ip_route,
"IP destination prefix mask\n" "IP destination prefix mask\n"
"IP gateway address\n" "IP gateway address\n"
"IP gateway interface name\n" "IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this route\n" "Distance value for this route\n"
@ -1035,7 +1036,7 @@ DEFPY(ip_route_vrf,
ip_route_vrf_cmd, ip_route_vrf_cmd,
"[no] ip route\ "[no] ip route\
<A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \ <A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask> \
<A.B.C.D$gate|INTERFACE$ifname> \ <A.B.C.D$gate|<INTERFACE|Null0>$ifname> \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1050,6 +1051,7 @@ DEFPY(ip_route_vrf,
"IP destination prefix mask\n" "IP destination prefix mask\n"
"IP gateway address\n" "IP gateway address\n"
"IP gateway interface name\n" "IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this route\n" "Distance value for this route\n"
@ -1093,7 +1095,7 @@ DEFPY(ip_route_vrf,
DEFPY(ipv6_route_blackhole, DEFPY(ipv6_route_blackhole,
ipv6_route_blackhole_cmd, ipv6_route_blackhole_cmd,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \ "[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \
<Null0|reject|blackhole>$flag \ <reject|blackhole>$flag \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1107,7 +1109,6 @@ DEFPY(ipv6_route_blackhole,
"IPv6 destination prefix (e.g. 3ffe:506::/32)\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
"IPv6 source-dest route\n" "IPv6 source-dest route\n"
"IPv6 source prefix\n" "IPv6 source prefix\n"
"Null interface\n"
"Emit an ICMP unreachable when matched\n" "Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n" "Silently discard pkts when matched\n"
"Set tag for this route\n" "Set tag for this route\n"
@ -1132,7 +1133,7 @@ DEFPY(ipv6_route_blackhole,
DEFPY(ipv6_route_blackhole_vrf, DEFPY(ipv6_route_blackhole_vrf,
ipv6_route_blackhole_vrf_cmd, ipv6_route_blackhole_vrf_cmd,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \ "[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \
<Null0|reject|blackhole>$flag \ <reject|blackhole>$flag \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1145,7 +1146,6 @@ DEFPY(ipv6_route_blackhole_vrf,
"IPv6 destination prefix (e.g. 3ffe:506::/32)\n" "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
"IPv6 source-dest route\n" "IPv6 source-dest route\n"
"IPv6 source prefix\n" "IPv6 source prefix\n"
"Null interface\n"
"Emit an ICMP unreachable when matched\n" "Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n" "Silently discard pkts when matched\n"
"Set tag for this route\n" "Set tag for this route\n"
@ -1180,7 +1180,7 @@ DEFPY(ipv6_route_address_interface,
ipv6_route_address_interface_cmd, ipv6_route_address_interface_cmd,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \ "[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \
X:X::X:X$gate \ X:X::X:X$gate \
INTERFACE$ifname \ <INTERFACE|Null0>$ifname \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1198,6 +1198,7 @@ DEFPY(ipv6_route_address_interface,
"IPv6 source prefix\n" "IPv6 source prefix\n"
"IPv6 gateway address\n" "IPv6 gateway address\n"
"IPv6 gateway interface name\n" "IPv6 gateway interface name\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this prefix\n" "Distance value for this prefix\n"
@ -1210,6 +1211,7 @@ DEFPY(ipv6_route_address_interface,
{ {
struct static_vrf *svrf; struct static_vrf *svrf;
struct static_vrf *nh_svrf; struct static_vrf *nh_svrf;
const char *flag;
if (table_str && vrf && !vrf_is_mapped_on_netns(vrf_lookup_by_name(vrf))) { if (table_str && vrf && !vrf_is_mapped_on_netns(vrf_lookup_by_name(vrf))) {
vty_out(vty, vty_out(vty,
@ -1233,9 +1235,14 @@ DEFPY(ipv6_route_address_interface,
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
if (ifname && !strncasecmp(ifname, "Null0", 5)) {
flag = "Null0";
ifname = NULL;
}
return static_route_leak( return static_route_leak(
vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL, vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL,
from_str, gate_str, ifname, NULL, tag_str, distance_str, label, from_str, gate_str, ifname, flag, tag_str, distance_str, label,
table_str, !!onlink); table_str, !!onlink);
} }
@ -1243,7 +1250,7 @@ DEFPY(ipv6_route_address_interface_vrf,
ipv6_route_address_interface_vrf_cmd, ipv6_route_address_interface_vrf_cmd,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \ "[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \
X:X::X:X$gate \ X:X::X:X$gate \
INTERFACE$ifname \ <INTERFACE|Null0>$ifname \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1260,6 +1267,7 @@ DEFPY(ipv6_route_address_interface_vrf,
"IPv6 source prefix\n" "IPv6 source prefix\n"
"IPv6 gateway address\n" "IPv6 gateway address\n"
"IPv6 gateway interface name\n" "IPv6 gateway interface name\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this prefix\n" "Distance value for this prefix\n"
@ -1272,6 +1280,7 @@ DEFPY(ipv6_route_address_interface_vrf,
VTY_DECLVAR_CONTEXT(vrf, vrf); VTY_DECLVAR_CONTEXT(vrf, vrf);
struct static_vrf *svrf = vrf->info; struct static_vrf *svrf = vrf->info;
struct static_vrf *nh_svrf; struct static_vrf *nh_svrf;
const char *flag;
if (table_str && !vrf_is_mapped_on_netns(vrf)) { if (table_str && !vrf_is_mapped_on_netns(vrf)) {
vty_out(vty, vty_out(vty,
@ -1289,16 +1298,21 @@ DEFPY(ipv6_route_address_interface_vrf,
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
if (ifname && !strncasecmp(ifname, "Null0", 5)) {
flag = "Null0";
ifname = NULL;
}
return static_route_leak( return static_route_leak(
vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL, vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL,
from_str, gate_str, ifname, NULL, tag_str, distance_str, label, from_str, gate_str, ifname, flag, tag_str, distance_str, label,
table_str, !!onlink); table_str, !!onlink);
} }
DEFPY(ipv6_route, DEFPY(ipv6_route,
ipv6_route_cmd, ipv6_route_cmd,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \ "[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \
<X:X::X:X$gate|INTERFACE$ifname> \ <X:X::X:X$gate|<INTERFACE|Null0>$ifname> \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1315,6 +1329,7 @@ DEFPY(ipv6_route,
"IPv6 source prefix\n" "IPv6 source prefix\n"
"IPv6 gateway address\n" "IPv6 gateway address\n"
"IPv6 gateway interface name\n" "IPv6 gateway interface name\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this prefix\n" "Distance value for this prefix\n"
@ -1326,6 +1341,7 @@ DEFPY(ipv6_route,
{ {
struct static_vrf *svrf; struct static_vrf *svrf;
struct static_vrf *nh_svrf; struct static_vrf *nh_svrf;
const char *flag;
if (table_str && vrf && !vrf_is_mapped_on_netns(vrf_lookup_by_name(vrf))) { if (table_str && vrf && !vrf_is_mapped_on_netns(vrf_lookup_by_name(vrf))) {
vty_out(vty, vty_out(vty,
@ -1349,16 +1365,21 @@ DEFPY(ipv6_route,
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
if (ifname && !strncasecmp(ifname, "Null0", 5)) {
flag = "Null0";
ifname = NULL;
}
return static_route_leak( return static_route_leak(
vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL, vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL,
from_str, gate_str, ifname, NULL, tag_str, distance_str, label, from_str, gate_str, ifname, flag, tag_str, distance_str, label,
table_str, false); table_str, false);
} }
DEFPY(ipv6_route_vrf, DEFPY(ipv6_route_vrf,
ipv6_route_vrf_cmd, ipv6_route_vrf_cmd,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \ "[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M] \
<X:X::X:X$gate|INTERFACE$ifname> \ <X:X::X:X$gate|<INTERFACE|Null0>$ifname> \
[{ \ [{ \
tag (1-4294967295) \ tag (1-4294967295) \
|(1-255)$distance \ |(1-255)$distance \
@ -1374,6 +1395,7 @@ DEFPY(ipv6_route_vrf,
"IPv6 source prefix\n" "IPv6 source prefix\n"
"IPv6 gateway address\n" "IPv6 gateway address\n"
"IPv6 gateway interface name\n" "IPv6 gateway interface name\n"
"Null interface\n"
"Set tag for this route\n" "Set tag for this route\n"
"Tag value\n" "Tag value\n"
"Distance value for this prefix\n" "Distance value for this prefix\n"
@ -1385,6 +1407,7 @@ DEFPY(ipv6_route_vrf,
VTY_DECLVAR_CONTEXT(vrf, vrf); VTY_DECLVAR_CONTEXT(vrf, vrf);
struct static_vrf *svrf = vrf->info; struct static_vrf *svrf = vrf->info;
struct static_vrf *nh_svrf; struct static_vrf *nh_svrf;
const char *flag;
if (table_str && !vrf_is_mapped_on_netns(vrf)) { if (table_str && !vrf_is_mapped_on_netns(vrf)) {
vty_out(vty, vty_out(vty,
@ -1402,9 +1425,14 @@ DEFPY(ipv6_route_vrf,
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
if (ifname && !strncasecmp(ifname, "Null0", 5)) {
flag = "Null0";
ifname = NULL;
}
return static_route_leak( return static_route_leak(
vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL, vty, svrf, nh_svrf, AFI_IP6, SAFI_UNICAST, no, prefix_str, NULL,
from_str, gate_str, ifname, NULL, tag_str, distance_str, label, from_str, gate_str, ifname, flag, tag_str, distance_str, label,
table_str, false); table_str, false);
} }