summaryrefslogtreecommitdiff
path: root/zebra/zebra_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/zebra_vty.c')
-rw-r--r--zebra/zebra_vty.c118
1 files changed, 63 insertions, 55 deletions
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c
index 7649d5f358..eeca7bceda 100644
--- a/zebra/zebra_vty.c
+++ b/zebra/zebra_vty.c
@@ -74,7 +74,7 @@ static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi,
union g_addr gate;
union g_addr *gatep = NULL;
struct in_addr mask;
- u_char flag = 0;
+ enum blackhole_type bh_type = 0;
route_tag_t tag = 0;
struct zebra_vrf *zvrf;
u_char type;
@@ -165,28 +165,18 @@ static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi,
}
}
- /* Null0 static route. */
- if ((ifname != NULL)
- && (strncasecmp(ifname, "Null0", strlen(ifname)) == 0)) {
- if (flag_str) {
- vty_out(vty, "%% can not have flag %s with Null0\n",
- flag_str);
- return CMD_WARNING_CONFIG_FAILED;
- }
- SET_FLAG(flag, ZEBRA_FLAG_BLACKHOLE);
- ifname = NULL;
- }
-
/* Route flags */
if (flag_str) {
switch (flag_str[0]) {
case 'r':
case 'R': /* XXX */
- SET_FLAG(flag, ZEBRA_FLAG_REJECT);
+ bh_type = BLACKHOLE_REJECT;
break;
+ case 'n':
+ case 'N' /* XXX */:
case 'b':
case 'B': /* XXX */
- SET_FLAG(flag, ZEBRA_FLAG_BLACKHOLE);
+ bh_type = BLACKHOLE_NULL;
break;
default:
vty_out(vty, "%% Malformed flag %s \n", flag_str);
@@ -221,7 +211,7 @@ static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi,
if (!negate)
static_add_route(afi, safi, type, &p, src_p, gatep, ifname,
- flag, tag, distance, zvrf, &snh_label);
+ bh_type, tag, distance, zvrf, &snh_label);
else
static_delete_route(afi, safi, type, &p, src_p, gatep, ifname,
tag, distance, zvrf, &snh_label);
@@ -346,8 +336,7 @@ DEFPY (ip_route,
<A.B.C.D/M$prefix|A.B.C.D$prefix A.B.C.D$mask>\
<\
{A.B.C.D$gate|INTERFACE$ifname}\
- |null0$ifname\
- |<reject|blackhole>$flag\
+ |<null0|reject|blackhole>$flag\
>\
[{\
tag (1-4294967295)\
@@ -417,10 +406,6 @@ static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn,
vty_out(vty, ", best");
if (re->refcnt)
vty_out(vty, ", refcnt %ld", re->refcnt);
- if (CHECK_FLAG(re->flags, ZEBRA_FLAG_BLACKHOLE))
- vty_out(vty, ", blackhole");
- if (CHECK_FLAG(re->flags, ZEBRA_FLAG_REJECT))
- vty_out(vty, ", reject");
vty_out(vty, "\n");
if (re->type == ZEBRA_ROUTE_RIP || re->type == ZEBRA_ROUTE_OSPF
@@ -485,7 +470,20 @@ static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn,
re->vrf_id));
break;
case NEXTHOP_TYPE_BLACKHOLE:
- vty_out(vty, " directly connected, Null0");
+ vty_out(vty, " unreachable");
+ switch (nexthop->bh_type) {
+ case BLACKHOLE_REJECT:
+ vty_out(vty, " (ICMP unreachable)");
+ break;
+ case BLACKHOLE_ADMINPROHIB:
+ vty_out(vty, " (ICMP admin-prohibited)");
+ break;
+ case BLACKHOLE_NULL:
+ vty_out(vty, " (blackhole)");
+ break;
+ case BLACKHOLE_UNSPEC:
+ break;
+ }
break;
default:
break;
@@ -580,12 +578,6 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn,
json_object_int_add(json_route, "metric", re->metric);
}
- if (CHECK_FLAG(re->flags, ZEBRA_FLAG_BLACKHOLE))
- json_object_boolean_true_add(json_route, "blackhole");
-
- if (CHECK_FLAG(re->flags, ZEBRA_FLAG_REJECT))
- json_object_boolean_true_add(json_route, "reject");
-
if (re->type == ZEBRA_ROUTE_RIP || re->type == ZEBRA_ROUTE_OSPF
|| re->type == ZEBRA_ROUTE_ISIS
|| re->type == ZEBRA_ROUTE_NHRP
@@ -671,7 +663,26 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn,
break;
case NEXTHOP_TYPE_BLACKHOLE:
json_object_boolean_true_add(json_nexthop,
- "blackhole");
+ "unreachable");
+ switch (nexthop->bh_type) {
+ case BLACKHOLE_REJECT:
+ json_object_boolean_true_add(
+ json_nexthop,
+ "reject");
+ break;
+ case BLACKHOLE_ADMINPROHIB:
+ json_object_boolean_true_add(
+ json_nexthop,
+ "admin-prohibited");
+ break;
+ case BLACKHOLE_NULL:
+ json_object_boolean_true_add(
+ json_nexthop,
+ "blackhole");
+ break;
+ case BLACKHOLE_UNSPEC:
+ break;
+ }
break;
default:
break;
@@ -796,7 +807,20 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn,
ifindex2ifname(nexthop->ifindex, re->vrf_id));
break;
case NEXTHOP_TYPE_BLACKHOLE:
- vty_out(vty, " is directly connected, Null0");
+ vty_out(vty, " unreachable");
+ switch (nexthop->bh_type) {
+ case BLACKHOLE_REJECT:
+ vty_out(vty, " (ICMP unreachable)");
+ break;
+ case BLACKHOLE_ADMINPROHIB:
+ vty_out(vty, " (ICMP admin-prohibited)");
+ break;
+ case BLACKHOLE_NULL:
+ vty_out(vty, " (blackhole)");
+ break;
+ case BLACKHOLE_UNSPEC:
+ break;
+ }
break;
default:
break;
@@ -839,11 +863,6 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn,
sizeof buf, 1));
}
- if (CHECK_FLAG(re->flags, ZEBRA_FLAG_BLACKHOLE))
- vty_out(vty, ", bh");
- if (CHECK_FLAG(re->flags, ZEBRA_FLAG_REJECT))
- vty_out(vty, ", rej");
-
if (re->type == ZEBRA_ROUTE_RIP || re->type == ZEBRA_ROUTE_OSPF
|| re->type == ZEBRA_ROUTE_ISIS
|| re->type == ZEBRA_ROUTE_NHRP
@@ -1696,12 +1715,15 @@ static int static_config(struct vty *vty, afi_t afi, safi_t safi,
case STATIC_IFNAME:
vty_out(vty, " %s", si->ifname);
break;
- /* blackhole and Null0 mean the same thing */
case STATIC_BLACKHOLE:
- if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
+ switch (si->bh_type) {
+ case BLACKHOLE_REJECT:
vty_out(vty, " reject");
- else
- vty_out(vty, " Null0");
+ break;
+ default:
+ vty_out(vty, " blackhole");
+ break;
+ }
break;
case STATIC_IPV4_GATEWAY_IFNAME:
vty_out(vty, " %s %s",
@@ -1719,19 +1741,6 @@ static int static_config(struct vty *vty, afi_t afi, safi_t safi,
break;
}
- /* flags are incompatible with STATIC_BLACKHOLE
- */
- if (si->type != STATIC_BLACKHOLE) {
- if (CHECK_FLAG(si->flags,
- ZEBRA_FLAG_REJECT))
- vty_out(vty, " %s", "reject");
-
- if (CHECK_FLAG(si->flags,
- ZEBRA_FLAG_BLACKHOLE))
- vty_out(vty, " %s",
- "blackhole");
- }
-
if (si->tag)
vty_out(vty, " tag %" ROUTE_TAG_PRI,
si->tag);
@@ -1766,8 +1775,7 @@ DEFPY (ipv6_route,
"[no] ipv6 route X:X::X:X/M$prefix [from X:X::X:X/M]\
<\
{X:X::X:X$gate|INTERFACE$ifname}\
- |null0$ifname\
- |<reject|blackhole>$flag\
+ |<null0|reject|blackhole>$flag\
>\
[{\
tag (1-4294967295)\