"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
- "Distance value for this route\n"
"Emit an ICMP unreachable when matched\n"
- "Silently discard pkts when matched\n")
+ "Silently discard pkts when matched\n"
+ "Distance value for this route\n")
{
return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
}
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
- "Distance value for this route\n"
"Emit an ICMP unreachable when matched\n"
- "Silently discard pkts when matched\n")
+ "Silently discard pkts when matched\n"
+ "Distance value for this route\n")
{
return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
}
vty_show_ip_route_detail (struct vty *vty, struct route_node *rn)
{
struct rib *rib;
- struct nexthop *nexthop;
+ struct nexthop *nexthop, *tnexthop;
+ int recursing;
RNODE_FOREACH_RIB (rn, rib)
{
vty_out (vty, " ago%s", VTY_NEWLINE);
}
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
+ for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
{
char addrstr[32];
- vty_out (vty, " %c",
- CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ');
+ vty_out (vty, " %c%s",
+ CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
+ recursing ? " " : "");
switch (nexthop->type)
{
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
+ if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+ vty_out (vty, " onlink");
+
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
- {
- vty_out (vty, " (recursive");
-
- switch (nexthop->rtype)
- {
- case NEXTHOP_TYPE_IPV4:
- case NEXTHOP_TYPE_IPV4_IFINDEX:
- vty_out (vty, " via %s)", inet_ntoa (nexthop->rgate.ipv4));
- break;
- case NEXTHOP_TYPE_IFINDEX:
- case NEXTHOP_TYPE_IFNAME:
- vty_out (vty, " is directly connected, %s)",
- ifindex2ifname (nexthop->rifindex));
- break;
- default:
- break;
- }
- }
+ vty_out (vty, " (recursive)");
+
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
static void
vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
{
- struct nexthop *nexthop;
+ struct nexthop *nexthop, *tnexthop;
+ int recursing;
int len = 0;
char buf[BUFSIZ];
/* Nexthop information. */
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
+ for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
{
if (nexthop == rib->nexthop)
{
vty_out (vty, " %c%*c",
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
? '*' : ' ',
- len - 3, ' ');
+ len - 3 + (2 * recursing), ' ');
switch (nexthop->type)
{
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
+ if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+ vty_out (vty, " onlink");
+
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
- {
- vty_out (vty, " (recursive");
-
- switch (nexthop->rtype)
- {
- case NEXTHOP_TYPE_IPV4:
- case NEXTHOP_TYPE_IPV4_IFINDEX:
- vty_out (vty, " via %s)", inet_ntoa (nexthop->rgate.ipv4));
- break;
- case NEXTHOP_TYPE_IFINDEX:
- case NEXTHOP_TYPE_IFNAME:
- vty_out (vty, " is directly connected, %s)",
- ifindex2ifname (nexthop->rifindex));
- break;
- default:
- break;
- }
- }
+ vty_out (vty, " (recursive)");
+
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
{
rib_cnt[ZEBRA_ROUTE_TOTAL]++;
rib_cnt[rib->type]++;
- if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
+ if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
+ || nexthop_has_fib_child(nexthop))
{
fib_cnt[ZEBRA_ROUTE_TOTAL]++;
fib_cnt[rib->type]++;
CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
{
rib_cnt[ZEBRA_ROUTE_IBGP]++;
- if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
+ if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
+ || nexthop_has_fib_child(nexthop))
fib_cnt[ZEBRA_ROUTE_IBGP]++;
}
}
return CMD_SUCCESS;
}
-\f
+
#ifdef HAVE_IPV6
/* General fucntion for IPv6 static route. */
static int
vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
{
struct rib *rib;
- struct nexthop *nexthop;
+ struct nexthop *nexthop, *tnexthop;
+ int recursing;
char buf[BUFSIZ];
RNODE_FOREACH_RIB (rn, rib)
vty_out (vty, " ago%s", VTY_NEWLINE);
}
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
+ for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
{
- vty_out (vty, " %c",
- CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ');
+ vty_out (vty, " %c%s",
+ CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
+ recursing ? " " : "");
switch (nexthop->type)
{
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
+ if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+ vty_out (vty, " onlink");
+
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
- {
- vty_out (vty, " (recursive");
-
- switch (nexthop->rtype)
- {
- case NEXTHOP_TYPE_IPV6:
- case NEXTHOP_TYPE_IPV6_IFINDEX:
- case NEXTHOP_TYPE_IPV6_IFNAME:
- vty_out (vty, " via %s)",
- inet_ntop (AF_INET6, &nexthop->rgate.ipv6,
- buf, BUFSIZ));
- if (nexthop->rifindex)
- vty_out (vty, ", %s", ifindex2ifname (nexthop->rifindex));
- break;
- case NEXTHOP_TYPE_IFINDEX:
- case NEXTHOP_TYPE_IFNAME:
- vty_out (vty, " is directly connected, %s)",
- ifindex2ifname (nexthop->rifindex));
- break;
- default:
- break;
- }
- }
+ vty_out (vty, " (recursive)");
+
vty_out (vty, "%s", VTY_NEWLINE);
}
vty_out (vty, "%s", VTY_NEWLINE);
vty_show_ipv6_route (struct vty *vty, struct route_node *rn,
struct rib *rib)
{
- struct nexthop *nexthop;
+ struct nexthop *nexthop, *tnexthop;
+ int recursing;
int len = 0;
char buf[BUFSIZ];
/* Nexthop information. */
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
+ for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
{
if (nexthop == rib->nexthop)
{
vty_out (vty, " %c%*c",
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
? '*' : ' ',
- len - 3, ' ');
+ len - 3 + (2 * recursing), ' ');
switch (nexthop->type)
{
vty_out (vty, " inactive");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
- {
- vty_out (vty, " (recursive");
-
- switch (nexthop->rtype)
- {
- case NEXTHOP_TYPE_IPV6:
- case NEXTHOP_TYPE_IPV6_IFINDEX:
- case NEXTHOP_TYPE_IPV6_IFNAME:
- vty_out (vty, " via %s)",
- inet_ntop (AF_INET6, &nexthop->rgate.ipv6,
- buf, BUFSIZ));
- if (nexthop->rifindex)
- vty_out (vty, ", %s", ifindex2ifname (nexthop->rifindex));
- break;
- case NEXTHOP_TYPE_IFINDEX:
- case NEXTHOP_TYPE_IFNAME:
- vty_out (vty, " is directly connected, %s)",
- ifindex2ifname (nexthop->rifindex));
- break;
- default:
- break;
- }
- }
+ vty_out (vty, " (recursive)");
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, ", bh");