diff options
Diffstat (limited to 'zebra/zebra_vty.c')
| -rw-r--r-- | zebra/zebra_vty.c | 5701 |
1 files changed, 2820 insertions, 2881 deletions
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index aeb01be070..9e27d7a43d 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -45,160 +45,156 @@ extern int allow_delete; -static int do_show_ip_route(struct vty *vty, const char *vrf_name, - safi_t safi, u_char use_json); -static void vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, - int mcast); +static int do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi, + u_char use_json); +static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn, + int mcast); #define ONE_DAY_SECOND 60*60*24 #define ONE_WEEK_SECOND 60*60*24*7 /* General function for static route. */ -int -zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd, - const char *dest_str, const char *mask_str, - const char *gate_str, const char *flag_str, - const char *tag_str, const char *distance_str, - const char *vrf_id_str, const char *label_str) -{ - int ret; - u_char distance; - struct prefix p; - struct in_addr gate; - struct in_addr mask; - u_char flag = 0; - route_tag_t tag = 0; - struct zebra_vrf *zvrf = NULL; - const char *ifname = NULL; - u_char type = STATIC_BLACKHOLE; - struct static_nh_label snh_label; - - memset (&snh_label, 0, sizeof (struct static_nh_label)); - ret = str2prefix (dest_str, &p); - if (ret <= 0) - { - vty_out (vty, "%% Malformed address%s", VTY_NEWLINE); - return CMD_WARNING; - } - - /* Cisco like mask notation. */ - if (mask_str) - { - ret = inet_aton (mask_str, &mask); - if (ret == 0) - { - vty_out (vty, "%% Malformed address%s", VTY_NEWLINE); - return CMD_WARNING; - } - p.prefixlen = ip_masklen (mask); - } - - /* Apply mask for given prefix. */ - apply_mask (&p); - - /* Administrative distance. */ - if (distance_str) - distance = atoi (distance_str); - else - distance = ZEBRA_STATIC_DISTANCE_DEFAULT; - - /* tag */ - if (tag_str) - VTY_GET_INTEGER_RANGE("tag", tag, tag_str, 0, 4294967295); - - /* VRF id */ - zvrf = zebra_vrf_lookup_by_name (vrf_id_str); - - if (!zvrf) - { - vty_out (vty, "%% vrf %s is not defined%s", vrf_id_str, VTY_NEWLINE); - return CMD_WARNING; - } - - /* Labels */ - if (label_str) - { - if (!mpls_enabled) - { - vty_out (vty, "%% MPLS not turned on in kernel, ignoring command%s", - VTY_NEWLINE); - return CMD_WARNING; - } - if (mpls_str2label (label_str, &snh_label.num_labels, - snh_label.label)) - { - vty_out (vty, "%% Malformed label(s)%s", VTY_NEWLINE); - return CMD_WARNING; - } - } - - /* Null0 static route. */ - if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0)) - { - if (flag_str) - { - vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE); - return CMD_WARNING; - } - if (add_cmd) - static_add_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, - ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label); - else - static_delete_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, tag, - distance, zvrf, &snh_label); - return CMD_SUCCESS; - } - - /* Route flags */ - if (flag_str) { - switch(flag_str[0]) { - case 'r': - case 'R': /* XXX */ - SET_FLAG (flag, ZEBRA_FLAG_REJECT); - break; - case 'b': - case 'B': /* XXX */ - SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE); - break; - default: - vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE); - return CMD_WARNING; - } - } - - if (gate_str == NULL) - { - if (add_cmd) - static_add_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, flag, - tag, distance, zvrf, &snh_label); - else - static_delete_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, tag, - distance, zvrf, &snh_label); - - return CMD_SUCCESS; - } - - /* When gateway is A.B.C.D format, gate is treated as nexthop - address other case gate is treated as interface name. */ - ret = inet_aton (gate_str, &gate); - if (!ret) - { - ifname = gate_str; - type = STATIC_IFNAME; - } - else - type = STATIC_IPV4_GATEWAY; - - if (add_cmd) - static_add_route (AFI_IP, safi, type, &p, NULL, - ret ? (union g_addr *)&gate : NULL, ifname, - flag, tag, distance, zvrf, &snh_label); - else - static_delete_route (AFI_IP, safi, type, &p, NULL, - ret ? (union g_addr *)&gate : NULL, ifname, tag, - distance, zvrf, &snh_label); - - return CMD_SUCCESS; +int zebra_static_ipv4(struct vty *vty, safi_t safi, int add_cmd, + const char *dest_str, const char *mask_str, + const char *gate_str, const char *flag_str, + const char *tag_str, const char *distance_str, + const char *vrf_id_str, const char *label_str) +{ + int ret; + u_char distance; + struct prefix p; + struct in_addr gate; + struct in_addr mask; + u_char flag = 0; + route_tag_t tag = 0; + struct zebra_vrf *zvrf = NULL; + const char *ifname = NULL; + u_char type = STATIC_BLACKHOLE; + struct static_nh_label snh_label; + + memset(&snh_label, 0, sizeof(struct static_nh_label)); + ret = str2prefix(dest_str, &p); + if (ret <= 0) { + vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); + return CMD_WARNING; + } + + /* Cisco like mask notation. */ + if (mask_str) { + ret = inet_aton(mask_str, &mask); + if (ret == 0) { + vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); + return CMD_WARNING; + } + p.prefixlen = ip_masklen(mask); + } + + /* Apply mask for given prefix. */ + apply_mask(&p); + + /* Administrative distance. */ + if (distance_str) + distance = atoi(distance_str); + else + distance = ZEBRA_STATIC_DISTANCE_DEFAULT; + + /* tag */ + if (tag_str) + VTY_GET_INTEGER_RANGE("tag", tag, tag_str, 0, 4294967295); + + /* VRF id */ + zvrf = zebra_vrf_lookup_by_name(vrf_id_str); + + if (!zvrf) { + vty_out(vty, "%% vrf %s is not defined%s", vrf_id_str, + VTY_NEWLINE); + return CMD_WARNING; + } + + /* Labels */ + if (label_str) { + if (!mpls_enabled) { + vty_out(vty, + "%% MPLS not turned on in kernel, ignoring command%s", + VTY_NEWLINE); + return CMD_WARNING; + } + if (mpls_str2label(label_str, &snh_label.num_labels, + snh_label.label)) { + vty_out(vty, "%% Malformed label(s)%s", VTY_NEWLINE); + return CMD_WARNING; + } + } + + /* Null0 static route. */ + if ((gate_str != NULL) + && (strncasecmp(gate_str, "Null0", strlen(gate_str)) == 0)) { + if (flag_str) { + vty_out(vty, "%% can not have flag %s with Null0%s", + flag_str, VTY_NEWLINE); + return CMD_WARNING; + } + if (add_cmd) + static_add_route(AFI_IP, safi, type, &p, NULL, NULL, + ifname, ZEBRA_FLAG_BLACKHOLE, tag, + distance, zvrf, &snh_label); + else + static_delete_route(AFI_IP, safi, type, &p, NULL, NULL, + ifname, tag, distance, zvrf, + &snh_label); + return CMD_SUCCESS; + } + + /* Route flags */ + if (flag_str) { + switch (flag_str[0]) { + case 'r': + case 'R': /* XXX */ + SET_FLAG(flag, ZEBRA_FLAG_REJECT); + break; + case 'b': + case 'B': /* XXX */ + SET_FLAG(flag, ZEBRA_FLAG_BLACKHOLE); + break; + default: + vty_out(vty, "%% Malformed flag %s %s", flag_str, + VTY_NEWLINE); + return CMD_WARNING; + } + } + + if (gate_str == NULL) { + if (add_cmd) + static_add_route(AFI_IP, safi, type, &p, NULL, NULL, + ifname, flag, tag, distance, zvrf, + &snh_label); + else + static_delete_route(AFI_IP, safi, type, &p, NULL, NULL, + ifname, tag, distance, zvrf, + &snh_label); + + return CMD_SUCCESS; + } + + /* When gateway is A.B.C.D format, gate is treated as nexthop + address other case gate is treated as interface name. */ + ret = inet_aton(gate_str, &gate); + if (!ret) { + ifname = gate_str; + type = STATIC_IFNAME; + } else + type = STATIC_IPV4_GATEWAY; + + if (add_cmd) + static_add_route(AFI_IP, safi, type, &p, NULL, + ret ? (union g_addr *)&gate : NULL, ifname, + flag, tag, distance, zvrf, &snh_label); + else + static_delete_route(AFI_IP, safi, type, &p, NULL, + ret ? (union g_addr *)&gate : NULL, ifname, + tag, distance, zvrf, &snh_label); + + return CMD_SUCCESS; } /* Static unicast routes for multicast RPF lookup. */ @@ -212,11 +208,12 @@ DEFUN (ip_mroute_dist, "Nexthop interface name\n" "Distance\n") { - char *destprefix = argv[2]->arg; - char *nexthop = argv[3]->arg; - char *distance = (argc == 5) ? argv[4]->arg : NULL; + char *destprefix = argv[2]->arg; + char *nexthop = argv[3]->arg; + char *distance = (argc == 5) ? argv[4]->arg : NULL; - return zebra_static_ipv4 (vty, SAFI_MULTICAST, 1, destprefix, NULL, nexthop, NULL, NULL, distance, NULL, NULL); + return zebra_static_ipv4(vty, SAFI_MULTICAST, 1, destprefix, NULL, + nexthop, NULL, NULL, distance, NULL, NULL); } DEFUN (no_ip_mroute_dist, @@ -230,11 +227,12 @@ DEFUN (no_ip_mroute_dist, "Nexthop interface name\n" "Distance\n") { - char *destprefix = argv[3]->arg; - char *nexthop = argv[4]->arg; - char *distance = (argc == 6) ? argv[5]->arg : NULL; + char *destprefix = argv[3]->arg; + char *nexthop = argv[4]->arg; + char *distance = (argc == 6) ? argv[5]->arg : NULL; - return zebra_static_ipv4 (vty, SAFI_MULTICAST, 0, destprefix, NULL, nexthop, NULL, NULL, distance, NULL, NULL); + return zebra_static_ipv4(vty, SAFI_MULTICAST, 0, destprefix, NULL, + nexthop, NULL, NULL, distance, NULL, NULL); } DEFUN (ip_multicast_mode, @@ -249,25 +247,24 @@ DEFUN (ip_multicast_mode, "Lookup both, use entry with lower distance\n" "Lookup both, use entry with longer prefix\n") { - char *mode = argv[3]->text; - - if (strmatch (mode, "urib-only")) - multicast_mode_ipv4_set (MCAST_URIB_ONLY); - else if (strmatch (mode, "mrib-only")) - multicast_mode_ipv4_set (MCAST_MRIB_ONLY); - else if (strmatch (mode, "mrib-then-urib")) - multicast_mode_ipv4_set (MCAST_MIX_MRIB_FIRST); - else if (strmatch (mode, "lower-distance")) - multicast_mode_ipv4_set (MCAST_MIX_DISTANCE); - else if (strmatch (mode, "longer-prefix")) - multicast_mode_ipv4_set (MCAST_MIX_PFXLEN); - else - { - vty_out (vty, "Invalid mode specified%s", VTY_NEWLINE); - return CMD_WARNING; - } + char *mode = argv[3]->text; + + if (strmatch(mode, "urib-only")) + multicast_mode_ipv4_set(MCAST_URIB_ONLY); + else if (strmatch(mode, "mrib-only")) + multicast_mode_ipv4_set(MCAST_MRIB_ONLY); + else if (strmatch(mode, "mrib-then-urib")) + multicast_mode_ipv4_set(MCAST_MIX_MRIB_FIRST); + else if (strmatch(mode, "lower-distance")) + multicast_mode_ipv4_set(MCAST_MIX_DISTANCE); + else if (strmatch(mode, "longer-prefix")) + multicast_mode_ipv4_set(MCAST_MIX_PFXLEN); + else { + vty_out(vty, "Invalid mode specified%s", VTY_NEWLINE); + return CMD_WARNING; + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (no_ip_multicast_mode, @@ -283,8 +280,8 @@ DEFUN (no_ip_multicast_mode, "Lookup both, use entry with lower distance\n" "Lookup both, use entry with longer prefix\n") { - multicast_mode_ipv4_set (MCAST_NO_CONFIG); - return CMD_SUCCESS; + multicast_mode_ipv4_set(MCAST_NO_CONFIG); + return CMD_SUCCESS; } @@ -295,7 +292,7 @@ DEFUN (show_ip_rpf, IP_STR "Display RPF information for multicast source\n") { - return do_show_ip_route(vty, VRF_DEFAULT_NAME, SAFI_MULTICAST, 0); + return do_show_ip_route(vty, VRF_DEFAULT_NAME, SAFI_MULTICAST, 0); } DEFUN (show_ip_rpf_addr, @@ -306,64 +303,55 @@ DEFUN (show_ip_rpf_addr, "Display RPF information for multicast source\n" "IP multicast source address (e.g. 10.0.0.0)\n") { - int idx_ipv4 = 3; - struct in_addr addr; - struct route_node *rn; - struct rib *rib; - int ret; - - ret = inet_aton (argv[idx_ipv4]->arg, &addr); - if (ret == 0) - { - vty_out (vty, "%% Malformed address%s", VTY_NEWLINE); - return CMD_WARNING; - } - - rib = rib_match_ipv4_multicast (VRF_DEFAULT, addr, &rn); - - if (rib) - vty_show_ip_route_detail (vty, rn, 1); - else - vty_out (vty, "%% No match for RPF lookup%s", VTY_NEWLINE); - - return CMD_SUCCESS; -} - -static void -zebra_vty_ip_route_tdv_helper (int argc, struct cmd_token *argv[], - int idx_curr, char **tag, - char **distance, char **vrf, char **labels) -{ - *distance = NULL; - while (idx_curr < argc) - { - if (strmatch (argv[idx_curr]->text, "tag")) - { - if (tag) - *tag = argv[idx_curr+1]->arg; - idx_curr += 2; - } - else if (strmatch (argv[idx_curr]->text, "vrf")) - { - if (vrf) - *vrf = argv[idx_curr+1]->arg; - idx_curr += 2; - } - else if (strmatch (argv[idx_curr]->text, "label")) - { - if (labels) - *labels = argv[idx_curr+1]->arg; - idx_curr += 2; - } - else - { - if (distance) - *distance = argv[idx_curr]->arg; - idx_curr++; - } - } - - return; + int idx_ipv4 = 3; + struct in_addr addr; + struct route_node *rn; + struct rib *rib; + int ret; + + ret = inet_aton(argv[idx_ipv4]->arg, &addr); + if (ret == 0) { + vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); + return CMD_WARNING; + } + + rib = rib_match_ipv4_multicast(VRF_DEFAULT, addr, &rn); + + if (rib) + vty_show_ip_route_detail(vty, rn, 1); + else + vty_out(vty, "%% No match for RPF lookup%s", VTY_NEWLINE); + + return CMD_SUCCESS; +} + +static void zebra_vty_ip_route_tdv_helper(int argc, struct cmd_token *argv[], + int idx_curr, char **tag, + char **distance, char **vrf, + char **labels) +{ + *distance = NULL; + while (idx_curr < argc) { + if (strmatch(argv[idx_curr]->text, "tag")) { + if (tag) + *tag = argv[idx_curr + 1]->arg; + idx_curr += 2; + } else if (strmatch(argv[idx_curr]->text, "vrf")) { + if (vrf) + *vrf = argv[idx_curr + 1]->arg; + idx_curr += 2; + } else if (strmatch(argv[idx_curr]->text, "label")) { + if (labels) + *labels = argv[idx_curr + 1]->arg; + idx_curr += 2; + } else { + if (distance) + *distance = argv[idx_curr]->arg; + idx_curr++; + } + } + + return; } /* Static route configuration. */ @@ -381,20 +369,19 @@ DEFUN (ip_route, "Distance value for this route\n" VRF_CMD_HELP_STR) { - int idx_ipv4_prefixlen = 2; - int idx_ipv4_ifname_null = 3; - int idx_curr = 4; - char *tag, *distance, *vrf; + int idx_ipv4_prefixlen = 2; + int idx_ipv4_ifname_null = 3; + int idx_curr = 4; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, - argv[idx_ipv4_prefixlen]->arg, - NULL, - argv[idx_ipv4_ifname_null]->arg, - NULL, - tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 1, + argv[idx_ipv4_prefixlen]->arg, NULL, + argv[idx_ipv4_ifname_null]->arg, NULL, tag, + distance, vrf, NULL); } DEFUN (ip_route_flags, @@ -412,20 +399,18 @@ DEFUN (ip_route_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4_prefixlen = 2; - int idx_reject_blackhole = 3; - int idx_curr = 4; - char *tag, *distance, *vrf; + int idx_ipv4_prefixlen = 2; + int idx_reject_blackhole = 3; + int idx_curr = 4; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, - argv[idx_ipv4_prefixlen]->arg, - NULL, - NULL, - argv[idx_reject_blackhole]->arg, - tag, distance, vrf, NULL); + return zebra_static_ipv4( + vty, SAFI_UNICAST, 1, argv[idx_ipv4_prefixlen]->arg, NULL, NULL, + argv[idx_reject_blackhole]->arg, tag, distance, vrf, NULL); } /* Mask as A.B.C.D format. */ @@ -446,20 +431,20 @@ DEFUN (ip_route_mask, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4 = 2; - int idx_ipv4_2 = 3; - int idx_ipv4_ifname_null = 4; - int idx_curr = 5; - char *tag, *distance, *vrf; + int idx_ipv4 = 2; + int idx_ipv4_2 = 3; + int idx_ipv4_ifname_null = 4; + int idx_curr = 5; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, - argv[idx_ipv4]->arg, - argv[idx_ipv4_2]->arg, - argv[idx_ipv4_ifname_null]->arg, - NULL, tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 1, argv[idx_ipv4]->arg, + argv[idx_ipv4_2]->arg, + argv[idx_ipv4_ifname_null]->arg, NULL, tag, + distance, vrf, NULL); } DEFUN (ip_route_mask_flags, @@ -478,21 +463,20 @@ DEFUN (ip_route_mask_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4 = 2; - int idx_ipv4_2 = 3; - int idx_reject_blackhole = 4; - int idx_curr = 5; - char *tag, *distance, *vrf; + int idx_ipv4 = 2; + int idx_ipv4_2 = 3; + int idx_reject_blackhole = 4; + int idx_curr = 5; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, - argv[idx_ipv4]->arg, - argv[idx_ipv4_2]->arg, - NULL, - argv[idx_reject_blackhole]->arg, - tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 1, argv[idx_ipv4]->arg, + argv[idx_ipv4_2]->arg, NULL, + argv[idx_reject_blackhole]->arg, tag, distance, + vrf, NULL); } DEFUN (no_ip_route, @@ -512,20 +496,19 @@ DEFUN (no_ip_route, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4_prefixlen = 3; - int idx_ipv4_ifname_null = 4; - int idx_curr = 5; - char *tag, *distance, *vrf; + int idx_ipv4_prefixlen = 3; + int idx_ipv4_ifname_null = 4; + int idx_curr = 5; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, - argv[idx_ipv4_prefixlen]->arg, - NULL, - argv[idx_ipv4_ifname_null]->arg, - NULL, - tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 0, + argv[idx_ipv4_prefixlen]->arg, NULL, + argv[idx_ipv4_ifname_null]->arg, NULL, tag, + distance, vrf, NULL); } DEFUN (no_ip_route_flags, @@ -544,17 +527,17 @@ DEFUN (no_ip_route_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4_prefixlen = 3; - int idx_curr = 5; - char *tag, *distance, *vrf; + int idx_ipv4_prefixlen = 3; + int idx_curr = 5; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, - argv[idx_ipv4_prefixlen]->arg, - NULL, NULL, NULL, - tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 0, + argv[idx_ipv4_prefixlen]->arg, NULL, NULL, + NULL, tag, distance, vrf, NULL); } DEFUN (no_ip_route_mask, @@ -575,21 +558,20 @@ DEFUN (no_ip_route_mask, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4 = 3; - int idx_ipv4_2 = 4; - int idx_ipv4_ifname_null = 5; - int idx_curr = 6; - char *tag, *distance, *vrf; + int idx_ipv4 = 3; + int idx_ipv4_2 = 4; + int idx_ipv4_ifname_null = 5; + int idx_curr = 6; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, - argv[idx_ipv4]->arg, - argv[idx_ipv4_2]->arg, - argv[idx_ipv4_ifname_null]->arg, - NULL, - tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 0, argv[idx_ipv4]->arg, + argv[idx_ipv4_2]->arg, + argv[idx_ipv4_ifname_null]->arg, NULL, tag, + distance, vrf, NULL); } DEFUN (no_ip_route_mask_flags, @@ -609,462 +591,509 @@ DEFUN (no_ip_route_mask_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv4 = 3; - int idx_ipv4_2 = 4; - int idx_curr = 6; - char *tag, *distance, *vrf; + int idx_ipv4 = 3; + int idx_ipv4_2 = 4; + int idx_curr = 6; + char *tag, *distance, *vrf; - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); - return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, - argv[idx_ipv4]->arg, - argv[idx_ipv4_2]->arg, - NULL, NULL, - tag, distance, vrf, NULL); + return zebra_static_ipv4(vty, SAFI_UNICAST, 0, argv[idx_ipv4]->arg, + argv[idx_ipv4_2]->arg, NULL, NULL, tag, + distance, vrf, NULL); } /* New RIB. Detailed information for IPv4 route. */ -static void -vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast) -{ - struct rib *rib; - struct nexthop *nexthop, *tnexthop; - int recursing; - char buf[SRCDEST2STR_BUFFER]; - struct zebra_vrf *zvrf; - - RNODE_FOREACH_RIB (rn, rib) - { - const char *mcast_info = ""; - if (mcast) - { - rib_table_info_t *info = srcdest_rnode_table_info(rn); - mcast_info = (info->safi == SAFI_MULTICAST) - ? " using Multicast RIB" - : " using Unicast RIB"; - } - - vty_out (vty, "Routing entry for %s%s%s", - srcdest_rnode2str(rn, buf, sizeof(buf)), mcast_info, - VTY_NEWLINE); - vty_out (vty, " Known via \"%s", zebra_route_string (rib->type)); - if (rib->instance) - vty_out (vty, "[%d]", rib->instance); - vty_out (vty, "\""); - vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric); - if (rib->tag) - vty_out (vty, ", tag %d", rib->tag); - if (rib->mtu) - vty_out (vty, ", mtu %u", rib->mtu); - if (rib->vrf_id != VRF_DEFAULT) - { - zvrf = vrf_info_lookup(rib->vrf_id); - vty_out (vty, ", vrf %s", zvrf_name (zvrf)); - } - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)) - vty_out (vty, ", best"); - if (rib->refcnt) - vty_out (vty, ", refcnt %ld", rib->refcnt); - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE)) - vty_out (vty, ", blackhole"); - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT)) - vty_out (vty, ", reject"); - vty_out (vty, "%s", VTY_NEWLINE); - - if (rib->type == ZEBRA_ROUTE_RIP - || rib->type == ZEBRA_ROUTE_OSPF - || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_NHRP - || rib->type == ZEBRA_ROUTE_TABLE - || rib->type == ZEBRA_ROUTE_BGP) - { - time_t uptime; - struct tm *tm; - - uptime = time (NULL); - uptime -= rib->uptime; - tm = gmtime (&uptime); - - vty_out (vty, " Last update "); - - if (uptime < ONE_DAY_SECOND) - vty_out (vty, "%02d:%02d:%02d", - tm->tm_hour, tm->tm_min, tm->tm_sec); - else if (uptime < ONE_WEEK_SECOND) - vty_out (vty, "%dd%02dh%02dm", - tm->tm_yday, tm->tm_hour, tm->tm_min); - else - vty_out (vty, "%02dw%dd%02dh", - tm->tm_yday/7, - tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour); - vty_out (vty, " ago%s", VTY_NEWLINE); - } +static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn, + int mcast) +{ + struct rib *rib; + struct nexthop *nexthop, *tnexthop; + int recursing; + char buf[SRCDEST2STR_BUFFER]; + struct zebra_vrf *zvrf; - for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing)) - { - char addrstr[32]; - - vty_out (vty, " %c%s", - CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ', - recursing ? " " : ""); - - switch (nexthop->type) - { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4)); - if (nexthop->ifindex) - vty_out (vty, ", via %s", - ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_IPV6_IFINDEX: - vty_out (vty, " %s", - inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ)); - if (nexthop->ifindex) - vty_out (vty, ", via %s", - ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - case NEXTHOP_TYPE_IFINDEX: - vty_out (vty, " directly connected, %s", - ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - case NEXTHOP_TYPE_BLACKHOLE: - vty_out (vty, " directly connected, Null0"); - break; - default: - break; - } - 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->type) - { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - if (nexthop->src.ipv4.s_addr) - { - if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr, - sizeof addrstr)) - vty_out (vty, ", src %s", addrstr); - } - break; - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_IPV6_IFINDEX: - if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any)) - { - if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr, - sizeof addrstr)) - vty_out (vty, ", src %s", addrstr); - } - break; - default: - break; - } - - /* Label information */ - if (nexthop->nh_label && nexthop->nh_label->num_labels) - { - vty_out (vty, " label %s", - mpls_label2str (nexthop->nh_label->num_labels, - nexthop->nh_label->label, buf, BUFSIZ)); - } - - vty_out (vty, "%s", VTY_NEWLINE); - } - vty_out (vty, "%s", VTY_NEWLINE); - } -} - -static void -vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib, - json_object *json) -{ - struct nexthop *nexthop, *tnexthop; - int recursing; - int len = 0; - char buf[SRCDEST2STR_BUFFER]; - json_object *json_nexthops = NULL; - json_object *json_nexthop = NULL; - json_object *json_route = NULL; - - if (json) - { - json_route = json_object_new_object(); - json_nexthops = json_object_new_array(); - - json_object_string_add(json_route, "prefix", srcdest_rnode2str (rn, buf, sizeof buf)); - json_object_string_add(json_route, "protocol", zebra_route_string(rib->type)); - - if (rib->instance) - json_object_int_add(json_route, "instance", rib->instance); - - if (rib->vrf_id) - json_object_int_add(json_route, "vrfId", rib->vrf_id); - - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)) - json_object_boolean_true_add(json_route, "selected"); - - if (rib->type != ZEBRA_ROUTE_CONNECT && rib->type != ZEBRA_ROUTE_KERNEL) - { - json_object_int_add(json_route, "distance", rib->distance); - json_object_int_add(json_route, "metric", rib->metric); - } - - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE)) - json_object_boolean_true_add(json_route, "blackhole"); - - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT)) - json_object_boolean_true_add(json_route, "reject"); - - if (rib->type == ZEBRA_ROUTE_RIP - || rib->type == ZEBRA_ROUTE_OSPF - || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_NHRP - || rib->type == ZEBRA_ROUTE_TABLE - || rib->type == ZEBRA_ROUTE_BGP) - { - time_t uptime; - struct tm *tm; - - uptime = time (NULL); - uptime -= rib->uptime; - tm = gmtime (&uptime); - - if (uptime < ONE_DAY_SECOND) - sprintf(buf, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec); - else if (uptime < ONE_WEEK_SECOND) - sprintf(buf, "%dd%02dh%02dm", tm->tm_yday, tm->tm_hour, tm->tm_min); - else - sprintf(buf, "%02dw%dd%02dh", tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour); - - json_object_string_add(json_route, "uptime", buf); - } - - for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing)) - { - json_nexthop = json_object_new_object(); - - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) - json_object_boolean_true_add(json_nexthop, "fib"); - - switch (nexthop->type) - { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - json_object_string_add(json_nexthop, "ip", inet_ntoa (nexthop->gate.ipv4)); - json_object_string_add(json_nexthop, "afi", "ipv4"); - - if (nexthop->ifindex) - { - json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex); - json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - } - break; - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_IPV6_IFINDEX: - json_object_string_add(json_nexthop, "ip", inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ)); - json_object_string_add(json_nexthop, "afi", "ipv6"); - - if (nexthop->ifindex) - { - json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex); - json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - } - break; - - case NEXTHOP_TYPE_IFINDEX: - json_object_boolean_true_add(json_nexthop, "directlyConnected"); - json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex); - json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - case NEXTHOP_TYPE_BLACKHOLE: - json_object_boolean_true_add(json_nexthop, "blackhole"); - break; - default: - break; - } - - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE)) - json_object_boolean_true_add(json_nexthop, "active"); - - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK)) - json_object_boolean_true_add(json_nexthop, "onLink"); - - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) - json_object_boolean_true_add(json_nexthop, "recursive"); - - switch (nexthop->type) - { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - if (nexthop->src.ipv4.s_addr) - { - if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf)) - json_object_string_add(json_nexthop, "source", buf); - } - break; - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_IPV6_IFINDEX: - if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any)) - { - if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf)) - json_object_string_add(json_nexthop, "source", buf); - } - break; - default: - break; - } - - if (nexthop->nh_label && nexthop->nh_label->num_labels) - { - json_object_string_add(json_nexthop, "labels", - mpls_label2str (nexthop->nh_label->num_labels, - nexthop->nh_label->label, buf, BUFSIZ)); - } - - json_object_array_add(json_nexthops, json_nexthop); - } - - json_object_object_add(json_route, "nexthops", json_nexthops); - json_object_array_add(json, json_route); - return; - } - - /* Nexthop information. */ - for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing)) - { - if (nexthop == rib->nexthop) - { - /* Prefix information. */ - len = vty_out (vty, "%c", zebra_route_char (rib->type)); - if (rib->instance) - len += vty_out (vty, "[%d]", rib->instance); - len += vty_out (vty, "%c%c %s", - CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED) - ? '>' : ' ', - CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) - ? '*' : ' ', - srcdest_rnode2str (rn, buf, sizeof buf)); - - /* Distance and metric display. */ - if (rib->type != ZEBRA_ROUTE_CONNECT - && rib->type != ZEBRA_ROUTE_KERNEL) - len += vty_out (vty, " [%d/%d]", rib->distance, - rib->metric); - } - else - vty_out (vty, " %c%*c", - CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) - ? '*' : ' ', - len - 3 + (2 * recursing), ' '); - - switch (nexthop->type) - { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4)); - if (nexthop->ifindex) - vty_out (vty, ", %s", - ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_IPV6_IFINDEX: - vty_out (vty, " via %s", - inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ)); - if (nexthop->ifindex) - vty_out (vty, ", %s", - ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - - case NEXTHOP_TYPE_IFINDEX: - vty_out (vty, " is directly connected, %s", - ifindex2ifname (nexthop->ifindex, rib->vrf_id)); - break; - case NEXTHOP_TYPE_BLACKHOLE: - vty_out (vty, " is directly connected, Null0"); - break; - default: - break; - } - 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->type) - { - case NEXTHOP_TYPE_IPV4: - case NEXTHOP_TYPE_IPV4_IFINDEX: - if (nexthop->src.ipv4.s_addr) - { - if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf)) - vty_out (vty, ", src %s", buf); - } - break; - case NEXTHOP_TYPE_IPV6: - case NEXTHOP_TYPE_IPV6_IFINDEX: - if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any)) - { - if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf)) - vty_out (vty, ", src %s", buf); - } - break; - default: - break; - } - - /* Label information */ - if (nexthop->nh_label && nexthop->nh_label->num_labels) - { - vty_out (vty, " label %s", - mpls_label2str (nexthop->nh_label->num_labels, - nexthop->nh_label->label, buf, BUFSIZ)); - } - - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE)) - vty_out (vty, ", bh"); - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT)) - vty_out (vty, ", rej"); - - if (rib->type == ZEBRA_ROUTE_RIP - || rib->type == ZEBRA_ROUTE_OSPF - || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_NHRP - || rib->type == ZEBRA_ROUTE_TABLE - || rib->type == ZEBRA_ROUTE_BGP) + RNODE_FOREACH_RIB(rn, rib) { - time_t uptime; - struct tm *tm; + const char *mcast_info = ""; + if (mcast) { + rib_table_info_t *info = srcdest_rnode_table_info(rn); + mcast_info = (info->safi == SAFI_MULTICAST) + ? " using Multicast RIB" + : " using Unicast RIB"; + } + + vty_out(vty, "Routing entry for %s%s%s", + srcdest_rnode2str(rn, buf, sizeof(buf)), mcast_info, + VTY_NEWLINE); + vty_out(vty, " Known via \"%s", zebra_route_string(rib->type)); + if (rib->instance) + vty_out(vty, "[%d]", rib->instance); + vty_out(vty, "\""); + vty_out(vty, ", distance %u, metric %u", rib->distance, + rib->metric); + if (rib->tag) + vty_out(vty, ", tag %d", rib->tag); + if (rib->mtu) + vty_out(vty, ", mtu %u", rib->mtu); + if (rib->vrf_id != VRF_DEFAULT) { + zvrf = vrf_info_lookup(rib->vrf_id); + vty_out(vty, ", vrf %s", zvrf_name(zvrf)); + } + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_SELECTED)) + vty_out(vty, ", best"); + if (rib->refcnt) + vty_out(vty, ", refcnt %ld", rib->refcnt); + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_BLACKHOLE)) + vty_out(vty, ", blackhole"); + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_REJECT)) + vty_out(vty, ", reject"); + vty_out(vty, "%s", VTY_NEWLINE); + + if (rib->type == ZEBRA_ROUTE_RIP + || rib->type == ZEBRA_ROUTE_OSPF + || rib->type == ZEBRA_ROUTE_ISIS + || rib->type == ZEBRA_ROUTE_NHRP + || rib->type == ZEBRA_ROUTE_TABLE + || rib->type == ZEBRA_ROUTE_BGP) { + time_t uptime; + struct tm *tm; + + uptime = time(NULL); + uptime -= rib->uptime; + tm = gmtime(&uptime); + + vty_out(vty, " Last update "); + + if (uptime < ONE_DAY_SECOND) + vty_out(vty, "%02d:%02d:%02d", tm->tm_hour, + tm->tm_min, tm->tm_sec); + else if (uptime < ONE_WEEK_SECOND) + vty_out(vty, "%dd%02dh%02dm", tm->tm_yday, + tm->tm_hour, tm->tm_min); + else + vty_out(vty, "%02dw%dd%02dh", tm->tm_yday / 7, + tm->tm_yday - ((tm->tm_yday / 7) * 7), + tm->tm_hour); + vty_out(vty, " ago%s", VTY_NEWLINE); + } + + for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, + recursing)) { + char addrstr[32]; + + vty_out(vty, " %c%s", + CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB) + ? '*' + : ' ', + recursing ? " " : ""); + + switch (nexthop->type) { + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + vty_out(vty, " %s", + inet_ntoa(nexthop->gate.ipv4)); + if (nexthop->ifindex) + vty_out(vty, ", via %s", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + break; + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV6_IFINDEX: + vty_out(vty, " %s", + inet_ntop(AF_INET6, &nexthop->gate.ipv6, + buf, BUFSIZ)); + if (nexthop->ifindex) + vty_out(vty, ", via %s", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + break; + case NEXTHOP_TYPE_IFINDEX: + vty_out(vty, " directly connected, %s", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + break; + case NEXTHOP_TYPE_BLACKHOLE: + vty_out(vty, " directly connected, Null0"); + break; + default: + break; + } + 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->type) { + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + if (nexthop->src.ipv4.s_addr) { + if (inet_ntop(AF_INET, + &nexthop->src.ipv4, + addrstr, sizeof addrstr)) + vty_out(vty, ", src %s", + addrstr); + } + break; + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV6_IFINDEX: + if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, + &in6addr_any)) { + if (inet_ntop(AF_INET6, + &nexthop->src.ipv6, + addrstr, sizeof addrstr)) + vty_out(vty, ", src %s", + addrstr); + } + break; + default: + break; + } + + /* Label information */ + if (nexthop->nh_label + && nexthop->nh_label->num_labels) { + vty_out(vty, " label %s", + mpls_label2str( + nexthop->nh_label->num_labels, + nexthop->nh_label->label, buf, + BUFSIZ)); + } + + vty_out(vty, "%s", VTY_NEWLINE); + } + vty_out(vty, "%s", VTY_NEWLINE); + } +} - uptime = time (NULL); - uptime -= rib->uptime; - tm = gmtime (&uptime); +static void vty_show_ip_route(struct vty *vty, struct route_node *rn, + struct rib *rib, json_object *json) +{ + struct nexthop *nexthop, *tnexthop; + int recursing; + int len = 0; + char buf[SRCDEST2STR_BUFFER]; + json_object *json_nexthops = NULL; + json_object *json_nexthop = NULL; + json_object *json_route = NULL; + + if (json) { + json_route = json_object_new_object(); + json_nexthops = json_object_new_array(); + + json_object_string_add(json_route, "prefix", + srcdest_rnode2str(rn, buf, sizeof buf)); + json_object_string_add(json_route, "protocol", + zebra_route_string(rib->type)); + + if (rib->instance) + json_object_int_add(json_route, "instance", + rib->instance); + + if (rib->vrf_id) + json_object_int_add(json_route, "vrfId", rib->vrf_id); + + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_SELECTED)) + json_object_boolean_true_add(json_route, "selected"); + + if (rib->type != ZEBRA_ROUTE_CONNECT + && rib->type != ZEBRA_ROUTE_KERNEL) { + json_object_int_add(json_route, "distance", + rib->distance); + json_object_int_add(json_route, "metric", rib->metric); + } + + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_BLACKHOLE)) + json_object_boolean_true_add(json_route, "blackhole"); + + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_REJECT)) + json_object_boolean_true_add(json_route, "reject"); + + if (rib->type == ZEBRA_ROUTE_RIP + || rib->type == ZEBRA_ROUTE_OSPF + || rib->type == ZEBRA_ROUTE_ISIS + || rib->type == ZEBRA_ROUTE_NHRP + || rib->type == ZEBRA_ROUTE_TABLE + || rib->type == ZEBRA_ROUTE_BGP) { + time_t uptime; + struct tm *tm; + + uptime = time(NULL); + uptime -= rib->uptime; + tm = gmtime(&uptime); + + if (uptime < ONE_DAY_SECOND) + sprintf(buf, "%02d:%02d:%02d", tm->tm_hour, + tm->tm_min, tm->tm_sec); + else if (uptime < ONE_WEEK_SECOND) + sprintf(buf, "%dd%02dh%02dm", tm->tm_yday, + tm->tm_hour, tm->tm_min); + else + sprintf(buf, "%02dw%dd%02dh", tm->tm_yday / 7, + tm->tm_yday - ((tm->tm_yday / 7) * 7), + tm->tm_hour); + + json_object_string_add(json_route, "uptime", buf); + } + + for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, + recursing)) { + json_nexthop = json_object_new_object(); + + if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB)) + json_object_boolean_true_add(json_nexthop, + "fib"); + + switch (nexthop->type) { + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + json_object_string_add( + json_nexthop, "ip", + inet_ntoa(nexthop->gate.ipv4)); + json_object_string_add(json_nexthop, "afi", + "ipv4"); + + if (nexthop->ifindex) { + json_object_int_add(json_nexthop, + "interfaceIndex", + nexthop->ifindex); + json_object_string_add( + json_nexthop, "interfaceName", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + } + break; + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV6_IFINDEX: + json_object_string_add( + json_nexthop, "ip", + inet_ntop(AF_INET6, &nexthop->gate.ipv6, + buf, BUFSIZ)); + json_object_string_add(json_nexthop, "afi", + "ipv6"); + + if (nexthop->ifindex) { + json_object_int_add(json_nexthop, + "interfaceIndex", + nexthop->ifindex); + json_object_string_add( + json_nexthop, "interfaceName", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + } + break; + + case NEXTHOP_TYPE_IFINDEX: + json_object_boolean_true_add( + json_nexthop, "directlyConnected"); + json_object_int_add(json_nexthop, + "interfaceIndex", + nexthop->ifindex); + json_object_string_add( + json_nexthop, "interfaceName", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + break; + case NEXTHOP_TYPE_BLACKHOLE: + json_object_boolean_true_add(json_nexthop, + "blackhole"); + break; + default: + break; + } + + if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)) + json_object_boolean_true_add(json_nexthop, + "active"); + + if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK)) + json_object_boolean_true_add(json_nexthop, + "onLink"); + + if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) + json_object_boolean_true_add(json_nexthop, + "recursive"); + + switch (nexthop->type) { + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + if (nexthop->src.ipv4.s_addr) { + if (inet_ntop(AF_INET, + &nexthop->src.ipv4, buf, + sizeof buf)) + json_object_string_add( + json_nexthop, "source", + buf); + } + break; + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV6_IFINDEX: + if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, + &in6addr_any)) { + if (inet_ntop(AF_INET6, + &nexthop->src.ipv6, buf, + sizeof buf)) + json_object_string_add( + json_nexthop, "source", + buf); + } + break; + default: + break; + } + + if (nexthop->nh_label + && nexthop->nh_label->num_labels) { + json_object_string_add( + json_nexthop, "labels", + mpls_label2str( + nexthop->nh_label->num_labels, + nexthop->nh_label->label, buf, + BUFSIZ)); + } + + json_object_array_add(json_nexthops, json_nexthop); + } + + json_object_object_add(json_route, "nexthops", json_nexthops); + json_object_array_add(json, json_route); + return; + } - if (uptime < ONE_DAY_SECOND) - vty_out (vty, ", %02d:%02d:%02d", - tm->tm_hour, tm->tm_min, tm->tm_sec); - else if (uptime < ONE_WEEK_SECOND) - vty_out (vty, ", %dd%02dh%02dm", - tm->tm_yday, tm->tm_hour, tm->tm_min); - else - vty_out (vty, ", %02dw%dd%02dh", - tm->tm_yday/7, - tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour); + /* Nexthop information. */ + for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing)) { + if (nexthop == rib->nexthop) { + /* Prefix information. */ + len = vty_out(vty, "%c", zebra_route_char(rib->type)); + if (rib->instance) + len += vty_out(vty, "[%d]", rib->instance); + len += vty_out( + vty, "%c%c %s", + CHECK_FLAG(rib->flags, ZEBRA_FLAG_SELECTED) + ? '>' + : ' ', + CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB) + ? '*' + : ' ', + srcdest_rnode2str(rn, buf, sizeof buf)); + + /* Distance and metric display. */ + if (rib->type != ZEBRA_ROUTE_CONNECT + && rib->type != ZEBRA_ROUTE_KERNEL) + len += vty_out(vty, " [%d/%d]", rib->distance, + rib->metric); + } else + vty_out(vty, " %c%*c", + CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB) + ? '*' + : ' ', + len - 3 + (2 * recursing), ' '); + + switch (nexthop->type) { + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + vty_out(vty, " via %s", inet_ntoa(nexthop->gate.ipv4)); + if (nexthop->ifindex) + vty_out(vty, ", %s", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + break; + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV6_IFINDEX: + vty_out(vty, " via %s", + inet_ntop(AF_INET6, &nexthop->gate.ipv6, buf, + BUFSIZ)); + if (nexthop->ifindex) + vty_out(vty, ", %s", + ifindex2ifname(nexthop->ifindex, + rib->vrf_id)); + break; + + case NEXTHOP_TYPE_IFINDEX: + vty_out(vty, " is directly connected, %s", + ifindex2ifname(nexthop->ifindex, rib->vrf_id)); + break; + case NEXTHOP_TYPE_BLACKHOLE: + vty_out(vty, " is directly connected, Null0"); + break; + default: + break; + } + 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->type) { + case NEXTHOP_TYPE_IPV4: + case NEXTHOP_TYPE_IPV4_IFINDEX: + if (nexthop->src.ipv4.s_addr) { + if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, + sizeof buf)) + vty_out(vty, ", src %s", buf); + } + break; + case NEXTHOP_TYPE_IPV6: + case NEXTHOP_TYPE_IPV6_IFINDEX: + if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any)) { + if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, + sizeof buf)) + vty_out(vty, ", src %s", buf); + } + break; + default: + break; + } + + /* Label information */ + if (nexthop->nh_label && nexthop->nh_label->num_labels) { + vty_out(vty, " label %s", + mpls_label2str(nexthop->nh_label->num_labels, + nexthop->nh_label->label, buf, + BUFSIZ)); + } + + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_BLACKHOLE)) + vty_out(vty, ", bh"); + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_REJECT)) + vty_out(vty, ", rej"); + + if (rib->type == ZEBRA_ROUTE_RIP + || rib->type == ZEBRA_ROUTE_OSPF + || rib->type == ZEBRA_ROUTE_ISIS + || rib->type == ZEBRA_ROUTE_NHRP + || rib->type == ZEBRA_ROUTE_TABLE + || rib->type == ZEBRA_ROUTE_BGP) { + time_t uptime; + struct tm *tm; + + uptime = time(NULL); + uptime -= rib->uptime; + tm = gmtime(&uptime); + + if (uptime < ONE_DAY_SECOND) + vty_out(vty, ", %02d:%02d:%02d", tm->tm_hour, + tm->tm_min, tm->tm_sec); + else if (uptime < ONE_WEEK_SECOND) + vty_out(vty, ", %dd%02dh%02dm", tm->tm_yday, + tm->tm_hour, tm->tm_min); + else + vty_out(vty, ", %02dw%dd%02dh", tm->tm_yday / 7, + tm->tm_yday - ((tm->tm_yday / 7) * 7), + tm->tm_hour); + } + vty_out(vty, "%s", VTY_NEWLINE); } - vty_out (vty, "%s", VTY_NEWLINE); - } } DEFUN (show_ip_route, @@ -1075,91 +1104,85 @@ DEFUN (show_ip_route, "IP routing table\n" JSON_STR) { - return do_show_ip_route (vty, VRF_DEFAULT_NAME, SAFI_UNICAST, use_json(argc, argv)); -} - -static int -do_show_ip_route (struct vty *vty, const char *vrf_name, safi_t safi, - u_char use_json) -{ - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - struct zebra_vrf *zvrf = NULL; - char buf[BUFSIZ]; - json_object *json = NULL; - json_object *json_prefix = NULL; - - if (!(zvrf = zebra_vrf_lookup_by_name (vrf_name))) - { - if (use_json) - vty_out (vty, "{}%s", VTY_NEWLINE); - else - vty_out (vty, "vrf %s not defined%s", vrf_name, VTY_NEWLINE); - return CMD_SUCCESS; - } - - if (zvrf_id (zvrf) == VRF_UNKNOWN) - { - if (use_json) - vty_out (vty, "{}%s", VTY_NEWLINE); - else - vty_out (vty, "vrf %s inactive%s", vrf_name, VTY_NEWLINE); - return CMD_SUCCESS; - } - - table = zebra_vrf_table (AFI_IP, safi, zvrf_id (zvrf)); - if (! table) - { - if (use_json) - vty_out (vty, "{}%s", VTY_NEWLINE); - return CMD_SUCCESS; - } - - if (use_json) - { - json = json_object_new_object(); - - /* Show all IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - { - RNODE_FOREACH_RIB (rn, rib) - { - if (!json_prefix) - json_prefix = json_object_new_array(); - vty_show_ip_route (vty, rn, rib, json_prefix); - } - - if (json_prefix) - { - prefix2str (&rn->p, buf, sizeof buf); - json_object_object_add(json, buf, json_prefix); - json_prefix = NULL; - } - } - - vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE); - json_object_free(json); - } - else - { - /* Show all IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - { - RNODE_FOREACH_RIB (rn, rib) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - } - - return CMD_SUCCESS; + return do_show_ip_route(vty, VRF_DEFAULT_NAME, SAFI_UNICAST, + use_json(argc, argv)); +} + +static int do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi, + u_char use_json) +{ + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + struct zebra_vrf *zvrf = NULL; + char buf[BUFSIZ]; + json_object *json = NULL; + json_object *json_prefix = NULL; + + if (!(zvrf = zebra_vrf_lookup_by_name(vrf_name))) { + if (use_json) + vty_out(vty, "{}%s", VTY_NEWLINE); + else + vty_out(vty, "vrf %s not defined%s", vrf_name, + VTY_NEWLINE); + return CMD_SUCCESS; + } + + if (zvrf_id(zvrf) == VRF_UNKNOWN) { + if (use_json) + vty_out(vty, "{}%s", VTY_NEWLINE); + else + vty_out(vty, "vrf %s inactive%s", vrf_name, + VTY_NEWLINE); + return CMD_SUCCESS; + } + + table = zebra_vrf_table(AFI_IP, safi, zvrf_id(zvrf)); + if (!table) { + if (use_json) + vty_out(vty, "{}%s", VTY_NEWLINE); + return CMD_SUCCESS; + } + + if (use_json) { + json = json_object_new_object(); + + /* Show all IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) { + RNODE_FOREACH_RIB(rn, rib) + { + if (!json_prefix) + json_prefix = json_object_new_array(); + vty_show_ip_route(vty, rn, rib, json_prefix); + } + + if (json_prefix) { + prefix2str(&rn->p, buf, sizeof buf); + json_object_object_add(json, buf, json_prefix); + json_prefix = NULL; + } + } + + vty_out(vty, "%s%s", json_object_to_json_string_ext( + json, JSON_C_TO_STRING_PRETTY), + VTY_NEWLINE); + json_object_free(json); + } else { + /* Show all IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) { + RNODE_FOREACH_RIB(rn, rib) + { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + } + + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf, @@ -1171,10 +1194,10 @@ DEFUN (show_ip_route_vrf, VRF_CMD_HELP_STR JSON_STR) { - int idx_vrf = 4; - u_char uj = use_json(argc, argv); + int idx_vrf = 4; + u_char uj = use_json(argc, argv); - return do_show_ip_route (vty, argv[idx_vrf]->arg, SAFI_UNICAST, uj); + return do_show_ip_route(vty, argv[idx_vrf]->arg, SAFI_UNICAST, uj); } DEFUN (show_ip_nht, @@ -1185,14 +1208,14 @@ DEFUN (show_ip_nht, "IP nexthop tracking table\n" VRF_CMD_HELP_STR) { - int idx_vrf = 4; - vrf_id_t vrf_id = VRF_DEFAULT; + int idx_vrf = 4; + vrf_id_t vrf_id = VRF_DEFAULT; - if (argc == 5) - VRF_GET_ID (vrf_id, argv[idx_vrf]->arg); + if (argc == 5) + VRF_GET_ID(vrf_id, argv[idx_vrf]->arg); - zebra_print_rnh_table(vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE); - return CMD_SUCCESS; + zebra_print_rnh_table(vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE); + return CMD_SUCCESS; } @@ -1204,17 +1227,18 @@ DEFUN (show_ip_nht_vrf_all, "IP nexthop tracking table\n" VRF_ALL_CMD_HELP_STR) { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - if ((zvrf = vrf->info) != NULL) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - zebra_print_rnh_table(zvrf_id (zvrf), AF_INET, vty, RNH_NEXTHOP_TYPE); - } + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + if ((zvrf = vrf->info) != NULL) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name(zvrf), + VTY_NEWLINE); + zebra_print_rnh_table(zvrf_id(zvrf), AF_INET, vty, + RNH_NEXTHOP_TYPE); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ipv6_nht, @@ -1225,14 +1249,14 @@ DEFUN (show_ipv6_nht, "IPv6 nexthop tracking table\n" VRF_CMD_HELP_STR) { - int idx_vrf = 4; - vrf_id_t vrf_id = VRF_DEFAULT; + int idx_vrf = 4; + vrf_id_t vrf_id = VRF_DEFAULT; - if (argc == 5) - VRF_GET_ID (vrf_id, argv[idx_vrf]->arg); + if (argc == 5) + VRF_GET_ID(vrf_id, argv[idx_vrf]->arg); - zebra_print_rnh_table(vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE); - return CMD_SUCCESS; + zebra_print_rnh_table(vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE); + return CMD_SUCCESS; } @@ -1244,17 +1268,18 @@ DEFUN (show_ipv6_nht_vrf_all, "IPv6 nexthop tracking table\n" VRF_ALL_CMD_HELP_STR) { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - if ((zvrf = vrf->info) != NULL) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - zebra_print_rnh_table(zvrf_id (zvrf), AF_INET6, vty, RNH_NEXTHOP_TYPE); - } + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + if ((zvrf = vrf->info) != NULL) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name(zvrf), + VTY_NEWLINE); + zebra_print_rnh_table(zvrf_id(zvrf), AF_INET6, vty, + RNH_NEXTHOP_TYPE); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (ip_nht_default_route, @@ -1264,12 +1289,12 @@ DEFUN (ip_nht_default_route, "Filter Next Hop tracking route resolution\n" "Resolve via default route\n") { - if (zebra_rnh_ip_default_route) - return CMD_SUCCESS; + if (zebra_rnh_ip_default_route) + return CMD_SUCCESS; - zebra_rnh_ip_default_route = 1; - zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL); - return CMD_SUCCESS; + zebra_rnh_ip_default_route = 1; + zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL); + return CMD_SUCCESS; } DEFUN (no_ip_nht_default_route, @@ -1280,12 +1305,12 @@ DEFUN (no_ip_nht_default_route, "Filter Next Hop tracking route resolution\n" "Resolve via default route\n") { - if (!zebra_rnh_ip_default_route) - return CMD_SUCCESS; + if (!zebra_rnh_ip_default_route) + return CMD_SUCCESS; - zebra_rnh_ip_default_route = 0; - zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL); - return CMD_SUCCESS; + zebra_rnh_ip_default_route = 0; + zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL); + return CMD_SUCCESS; } DEFUN (ipv6_nht_default_route, @@ -1295,12 +1320,12 @@ DEFUN (ipv6_nht_default_route, "Filter Next Hop tracking route resolution\n" "Resolve via default route\n") { - if (zebra_rnh_ipv6_default_route) - return CMD_SUCCESS; + if (zebra_rnh_ipv6_default_route) + return CMD_SUCCESS; - zebra_rnh_ipv6_default_route = 1; - zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL); - return CMD_SUCCESS; + zebra_rnh_ipv6_default_route = 1; + zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL); + return CMD_SUCCESS; } DEFUN (no_ipv6_nht_default_route, @@ -1311,12 +1336,12 @@ DEFUN (no_ipv6_nht_default_route, "Filter Next Hop tracking route resolution\n" "Resolve via default route\n") { - if (!zebra_rnh_ipv6_default_route) - return CMD_SUCCESS; + if (!zebra_rnh_ipv6_default_route) + return CMD_SUCCESS; - zebra_rnh_ipv6_default_route = 0; - zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL); - return CMD_SUCCESS; + zebra_rnh_ipv6_default_route = 0; + zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL); + return CMD_SUCCESS; } DEFUN (show_ip_route_tag, @@ -1329,46 +1354,44 @@ DEFUN (show_ip_route_tag, "Show only routes with tag\n" "Tag value\n") { - int idx_vrf = 3; - int idx_name = 4; - int idx_tag = 6; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - route_tag_t tag = 0; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[idx_vrf]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[idx_name]->arg); - VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295); - } - else - { - idx_tag -= 2; - VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295); - } - - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show all IPv4 routes with matching tag value. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (rib->tag != tag) - continue; - - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - return CMD_SUCCESS; + int idx_vrf = 3; + int idx_name = 4; + int idx_tag = 6; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + route_tag_t tag = 0; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[idx_vrf]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[idx_name]->arg); + VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, + 4294967295); + } else { + idx_tag -= 2; + VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, + 4294967295); + } + + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show all IPv4 routes with matching tag value. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (rib->tag != tag) + continue; + + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + return CMD_SUCCESS; } DEFUN (show_ip_route_prefix_longer, @@ -1381,47 +1404,41 @@ DEFUN (show_ip_route_prefix_longer, "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Show route matching the specified Network/Mask pair only\n") { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct prefix p; - int ret; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[4]->arg); - ret = str2prefix (argv[5]->arg, &p); - } - else - { - ret = str2prefix (argv[3]->arg, &p); - } - - if (! ret) - { - vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE); - return CMD_WARNING; - } - - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (prefix_match (&p, &rn->p)) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct prefix p; + int ret; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[4]->arg); + ret = str2prefix(argv[5]->arg, &p); + } else { + ret = str2prefix(argv[3]->arg, &p); } - return CMD_SUCCESS; + + if (!ret) { + vty_out(vty, "%% Malformed Prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } + + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (prefix_match(&p, &rn->p)) { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + return CMD_SUCCESS; } DEFUN (show_ip_route_supernets, @@ -1433,39 +1450,37 @@ DEFUN (show_ip_route_supernets, VRF_CMD_HELP_STR "Show supernet entries only\n") { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - u_int32_t addr; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - VRF_GET_ID (vrf_id, argv[4]->arg); - - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - addr = ntohl (rn->p.u.prefix4.s_addr); - - if ((IN_CLASSC (addr) && rn->p.prefixlen < 24) - || (IN_CLASSB (addr) && rn->p.prefixlen < 16) - || (IN_CLASSA (addr) && rn->p.prefixlen < 8)) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + u_int32_t addr; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) + VRF_GET_ID(vrf_id, argv[4]->arg); + + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + addr = ntohl(rn->p.u.prefix4.s_addr); + + if ((IN_CLASSC(addr) && rn->p.prefixlen < 24) + || (IN_CLASSB(addr) && rn->p.prefixlen < 16) + || (IN_CLASSA(addr) && rn->p.prefixlen < 8)) { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + return CMD_SUCCESS; } DEFUN (show_ip_route_protocol, @@ -1477,43 +1492,40 @@ DEFUN (show_ip_route_protocol, VRF_CMD_HELP_STR FRR_IP_REDIST_HELP_STR_ZEBRA) { - int type; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; - - int idx = 0; - if (argv_find (argv, argc, "NAME", &idx)) - VRF_GET_ID (vrf_id, argv[idx]->arg); - - char *proto = argv[argc - 1]->text; - type = proto_redistnum (AFI_IP, proto); - - if (type < 0) - { - vty_out (vty, "Unknown route type%s", VTY_NEWLINE); - return CMD_WARNING; - } - - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (rib->type == type) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); + int type; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; + + int idx = 0; + if (argv_find(argv, argc, "NAME", &idx)) + VRF_GET_ID(vrf_id, argv[idx]->arg); + + char *proto = argv[argc - 1]->text; + type = proto_redistnum(AFI_IP, proto); + + if (type < 0) { + vty_out(vty, "Unknown route type%s", VTY_NEWLINE); + return CMD_WARNING; + } + + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (rib->type == type) { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); } - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -1526,32 +1538,30 @@ DEFUN (show_ip_route_ospf_instance, "Open Shortest Path First (OSPFv2)\n" "Instance ID\n") { - int idx_number = 4; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - u_short instance = 0; - - VTY_GET_INTEGER ("Instance", instance, argv[idx_number]->arg); - - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, VRF_DEFAULT); - if (! table) - return CMD_SUCCESS; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (rib->type == ZEBRA_ROUTE_OSPF && rib->instance == instance) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); + int idx_number = 4; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + u_short instance = 0; + + VTY_GET_INTEGER("Instance", instance, argv[idx_number]->arg); + + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, VRF_DEFAULT); + if (!table) + return CMD_SUCCESS; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (rib->type == ZEBRA_ROUTE_OSPF && rib->instance == instance) { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ip_route_addr, @@ -1563,44 +1573,39 @@ DEFUN (show_ip_route_addr, VRF_CMD_HELP_STR "Network in the IP routing table to display\n") { - int ret; - struct prefix_ipv4 p; - struct route_table *table; - struct route_node *rn; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[4]->arg); - ret = str2prefix_ipv4 (argv[5]->arg, &p); - } - else - { - ret = str2prefix_ipv4 (argv[3]->arg, &p); - } + int ret; + struct prefix_ipv4 p; + struct route_table *table; + struct route_node *rn; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[4]->arg); + ret = str2prefix_ipv4(argv[5]->arg, &p); + } else { + ret = str2prefix_ipv4(argv[3]->arg, &p); + } - if (ret <= 0) - { - vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); - return CMD_WARNING; - } + if (ret <= 0) { + vty_out(vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); + return CMD_WARNING; + } - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn) - { - vty_out (vty, "%% Network not in table%s", VTY_NEWLINE); - return CMD_WARNING; - } + rn = route_node_match(table, (struct prefix *)&p); + if (!rn) { + vty_out(vty, "%% Network not in table%s", VTY_NEWLINE); + return CMD_WARNING; + } - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); + route_unlock_node(rn); - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ip_route_prefix, @@ -1612,113 +1617,104 @@ DEFUN (show_ip_route_prefix, VRF_CMD_HELP_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n") { - int ret; - struct prefix_ipv4 p; - struct route_table *table; - struct route_node *rn; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[4]->arg); - ret = str2prefix_ipv4 (argv[5]->arg, &p); - } - else - { - ret = str2prefix_ipv4 (argv[3]->arg, &p); - } + int ret; + struct prefix_ipv4 p; + struct route_table *table; + struct route_node *rn; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[4]->arg); + ret = str2prefix_ipv4(argv[5]->arg, &p); + } else { + ret = str2prefix_ipv4(argv[3]->arg, &p); + } - if (ret <= 0) - { - vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); - return CMD_WARNING; - } + if (ret <= 0) { + vty_out(vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); + return CMD_WARNING; + } - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn || rn->p.prefixlen != p.prefixlen) - { - vty_out (vty, "%% Network not in table%s", VTY_NEWLINE); - return CMD_WARNING; - } + rn = route_node_match(table, (struct prefix *)&p); + if (!rn || rn->p.prefixlen != p.prefixlen) { + vty_out(vty, "%% Network not in table%s", VTY_NEWLINE); + return CMD_WARNING; + } - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); + route_unlock_node(rn); - return CMD_SUCCESS; + return CMD_SUCCESS; } -static void -vty_show_ip_route_summary (struct vty *vty, struct route_table *table) +static void vty_show_ip_route_summary(struct vty *vty, + struct route_table *table) { - struct route_node *rn; - struct rib *rib; + struct route_node *rn; + struct rib *rib; #define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1) - u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1]; - u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1]; - u_int32_t i; - u_int32_t is_ibgp; - - memset (&rib_cnt, 0, sizeof(rib_cnt)); - memset (&fib_cnt, 0, sizeof(fib_cnt)); - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - is_ibgp = (rib->type == ZEBRA_ROUTE_BGP && - CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP)); - - rib_cnt[ZEBRA_ROUTE_TOTAL]++; - if (is_ibgp) - rib_cnt[ZEBRA_ROUTE_IBGP]++; - else - rib_cnt[rib->type]++; - - if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)) - { - fib_cnt[ZEBRA_ROUTE_TOTAL]++; - - if (is_ibgp) - fib_cnt[ZEBRA_ROUTE_IBGP]++; - else - fib_cnt[rib->type]++; - } - } - - vty_out (vty, "%-20s %-20s %s (vrf %s)%s", - "Route Source", "Routes", "FIB", - zvrf_name (((rib_table_info_t *)table->info)->zvrf), - VTY_NEWLINE); - - for (i = 0; i < ZEBRA_ROUTE_MAX; i++) - { - if ((rib_cnt[i] > 0) || - (i == ZEBRA_ROUTE_BGP && rib_cnt[ZEBRA_ROUTE_IBGP] > 0)) - { - if (i == ZEBRA_ROUTE_BGP) - { - vty_out (vty, "%-20s %-20d %-20d %s", "ebgp", - rib_cnt[ZEBRA_ROUTE_BGP], fib_cnt[ZEBRA_ROUTE_BGP], - VTY_NEWLINE); - vty_out (vty, "%-20s %-20d %-20d %s", "ibgp", - rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP], - VTY_NEWLINE); - } - else - vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i), - rib_cnt[i], fib_cnt[i], VTY_NEWLINE); - } - } - - vty_out (vty, "------%s", VTY_NEWLINE); - vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL], - fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE); - vty_out (vty, "%s", VTY_NEWLINE); + u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1]; + u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1]; + u_int32_t i; + u_int32_t is_ibgp; + + memset(&rib_cnt, 0, sizeof(rib_cnt)); + memset(&fib_cnt, 0, sizeof(fib_cnt)); + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + is_ibgp = (rib->type == ZEBRA_ROUTE_BGP + && CHECK_FLAG(rib->flags, ZEBRA_FLAG_IBGP)); + + rib_cnt[ZEBRA_ROUTE_TOTAL]++; + if (is_ibgp) + rib_cnt[ZEBRA_ROUTE_IBGP]++; + else + rib_cnt[rib->type]++; + + if (CHECK_FLAG(rib->flags, ZEBRA_FLAG_SELECTED)) { + fib_cnt[ZEBRA_ROUTE_TOTAL]++; + + if (is_ibgp) + fib_cnt[ZEBRA_ROUTE_IBGP]++; + else + fib_cnt[rib->type]++; + } + } + + vty_out(vty, "%-20s %-20s %s (vrf %s)%s", "Route Source", "Routes", + "FIB", zvrf_name(((rib_table_info_t *)table->info)->zvrf), + VTY_NEWLINE); + + for (i = 0; i < ZEBRA_ROUTE_MAX; i++) { + if ((rib_cnt[i] > 0) || (i == ZEBRA_ROUTE_BGP + && rib_cnt[ZEBRA_ROUTE_IBGP] > 0)) { + if (i == ZEBRA_ROUTE_BGP) { + vty_out(vty, "%-20s %-20d %-20d %s", "ebgp", + rib_cnt[ZEBRA_ROUTE_BGP], + fib_cnt[ZEBRA_ROUTE_BGP], VTY_NEWLINE); + vty_out(vty, "%-20s %-20d %-20d %s", "ibgp", + rib_cnt[ZEBRA_ROUTE_IBGP], + fib_cnt[ZEBRA_ROUTE_IBGP], VTY_NEWLINE); + } else + vty_out(vty, "%-20s %-20d %-20d %s", + zebra_route_string(i), rib_cnt[i], + fib_cnt[i], VTY_NEWLINE); + } + } + + vty_out(vty, "------%s", VTY_NEWLINE); + vty_out(vty, "%-20s %-20d %-20d %s", "Totals", + rib_cnt[ZEBRA_ROUTE_TOTAL], fib_cnt[ZEBRA_ROUTE_TOTAL], + VTY_NEWLINE); + vty_out(vty, "%s", VTY_NEWLINE); } /* @@ -1728,78 +1724,79 @@ vty_show_ip_route_summary (struct vty *vty, struct route_table *table) * protocols on the box. * */ -static void -vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table) +static void vty_show_ip_route_summary_prefix(struct vty *vty, + struct route_table *table) { - struct route_node *rn; - struct rib *rib; - struct nexthop *nexthop; + struct route_node *rn; + struct rib *rib; + struct nexthop *nexthop; #define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1) - u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1]; - u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1]; - u_int32_t i; - int cnt; - - memset (&rib_cnt, 0, sizeof(rib_cnt)); - memset (&fib_cnt, 0, sizeof(fib_cnt)); - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - - /* - * In case of ECMP, count only once. - */ - cnt = 0; - for (nexthop = rib->nexthop; (!cnt && nexthop); nexthop = nexthop->next) - { - cnt++; - rib_cnt[ZEBRA_ROUTE_TOTAL]++; - rib_cnt[rib->type]++; - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) - { - fib_cnt[ZEBRA_ROUTE_TOTAL]++; - fib_cnt[rib->type]++; - } - if (rib->type == ZEBRA_ROUTE_BGP && - CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP)) - { - rib_cnt[ZEBRA_ROUTE_IBGP]++; - if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) - fib_cnt[ZEBRA_ROUTE_IBGP]++; - } - } - } - - vty_out (vty, "%-20s %-20s %s (vrf %s)%s", - "Route Source", "Prefix Routes", "FIB", - zvrf_name (((rib_table_info_t *)table->info)->zvrf), - VTY_NEWLINE); - - for (i = 0; i < ZEBRA_ROUTE_MAX; i++) - { - if (rib_cnt[i] > 0) - { - if (i == ZEBRA_ROUTE_BGP) - { - vty_out (vty, "%-20s %-20d %-20d %s", "ebgp", - rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP], - fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP], - VTY_NEWLINE); - vty_out (vty, "%-20s %-20d %-20d %s", "ibgp", - rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP], - VTY_NEWLINE); - } - else - vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i), - rib_cnt[i], fib_cnt[i], VTY_NEWLINE); - } - } - - vty_out (vty, "------%s", VTY_NEWLINE); - vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL], - fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE); - vty_out (vty, "%s", VTY_NEWLINE); + u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1]; + u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1]; + u_int32_t i; + int cnt; + + memset(&rib_cnt, 0, sizeof(rib_cnt)); + memset(&fib_cnt, 0, sizeof(fib_cnt)); + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + + /* + * In case of ECMP, count only once. + */ + cnt = 0; + for (nexthop = rib->nexthop; (!cnt && nexthop); + nexthop = nexthop->next) { + cnt++; + rib_cnt[ZEBRA_ROUTE_TOTAL]++; + rib_cnt[rib->type]++; + if (CHECK_FLAG(nexthop->flags, + NEXTHOP_FLAG_FIB)) { + fib_cnt[ZEBRA_ROUTE_TOTAL]++; + fib_cnt[rib->type]++; + } + if (rib->type == ZEBRA_ROUTE_BGP + && CHECK_FLAG(rib->flags, + ZEBRA_FLAG_IBGP)) { + rib_cnt[ZEBRA_ROUTE_IBGP]++; + if (CHECK_FLAG(nexthop->flags, + NEXTHOP_FLAG_FIB)) + fib_cnt[ZEBRA_ROUTE_IBGP]++; + } + } + } + + vty_out(vty, "%-20s %-20s %s (vrf %s)%s", "Route Source", + "Prefix Routes", "FIB", + zvrf_name(((rib_table_info_t *)table->info)->zvrf), + VTY_NEWLINE); + + for (i = 0; i < ZEBRA_ROUTE_MAX; i++) { + if (rib_cnt[i] > 0) { + if (i == ZEBRA_ROUTE_BGP) { + vty_out(vty, "%-20s %-20d %-20d %s", "ebgp", + rib_cnt[ZEBRA_ROUTE_BGP] + - rib_cnt[ZEBRA_ROUTE_IBGP], + fib_cnt[ZEBRA_ROUTE_BGP] + - fib_cnt[ZEBRA_ROUTE_IBGP], + VTY_NEWLINE); + vty_out(vty, "%-20s %-20d %-20d %s", "ibgp", + rib_cnt[ZEBRA_ROUTE_IBGP], + fib_cnt[ZEBRA_ROUTE_IBGP], VTY_NEWLINE); + } else + vty_out(vty, "%-20s %-20d %-20d %s", + zebra_route_string(i), rib_cnt[i], + fib_cnt[i], VTY_NEWLINE); + } + } + + vty_out(vty, "------%s", VTY_NEWLINE); + vty_out(vty, "%-20s %-20d %-20d %s", "Totals", + rib_cnt[ZEBRA_ROUTE_TOTAL], fib_cnt[ZEBRA_ROUTE_TOTAL], + VTY_NEWLINE); + vty_out(vty, "%s", VTY_NEWLINE); } /* Show route summary. */ @@ -1812,19 +1809,19 @@ DEFUN (show_ip_route_summary, VRF_CMD_HELP_STR "Summary of all routes\n") { - struct route_table *table; - vrf_id_t vrf_id = VRF_DEFAULT; + struct route_table *table; + vrf_id_t vrf_id = VRF_DEFAULT; - if (strmatch(argv[3]->text, "vrf")) - VRF_GET_ID (vrf_id, argv[4]->arg); + if (strmatch(argv[3]->text, "vrf")) + VRF_GET_ID(vrf_id, argv[4]->arg); - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - vty_show_ip_route_summary (vty, table); + vty_show_ip_route_summary(vty, table); - return CMD_SUCCESS; + return CMD_SUCCESS; } /* Show route summary prefix. */ @@ -1838,19 +1835,19 @@ DEFUN (show_ip_route_summary_prefix, "Summary of all routes\n" "Prefix routes\n") { - struct route_table *table; - vrf_id_t vrf_id = VRF_DEFAULT; + struct route_table *table; + vrf_id_t vrf_id = VRF_DEFAULT; - if (strmatch(argv[3]->text, "vrf")) - VRF_GET_ID (vrf_id, argv[4]->arg); + if (strmatch(argv[3]->text, "vrf")) + VRF_GET_ID(vrf_id, argv[4]->arg); - table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - vty_show_ip_route_summary_prefix (vty, table); + vty_show_ip_route_summary_prefix(vty, table); - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -1862,41 +1859,40 @@ DEFUN (show_ip_route_vrf_all, "IP routing table\n" VRF_ALL_CMD_HELP_STR) { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - int vrf_header = 1; - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; - - /* Show all IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + int vrf_header = 1; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; + + /* Show all IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_tag, @@ -1909,48 +1905,48 @@ DEFUN (show_ip_route_vrf_all_tag, "Show only routes with tag\n" "Tag value\n") { - int idx_number = 6; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - int vrf_header = 1; - route_tag_t tag = 0; - - if (argv[idx_number]->arg) - VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_number]->arg, 0, 4294967295); - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; - - /* Show all IPv4 routes with matching tag value. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (rib->tag != tag) - continue; - - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - return CMD_SUCCESS; + int idx_number = 6; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + int vrf_header = 1; + route_tag_t tag = 0; + + if (argv[idx_number]->arg) + VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_number]->arg, 0, + 4294967295); + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; + + /* Show all IPv4 routes with matching tag value. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (rib->tag != tag) + continue; + + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_prefix_longer, @@ -1963,52 +1959,49 @@ DEFUN (show_ip_route_vrf_all_prefix_longer, "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Show route matching the specified Network/Mask pair only\n") { - int idx_ipv4_prefixlen = 5; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct prefix p; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int ret; - int first = 1; - int vrf_header = 1; - - ret = str2prefix (argv[idx_ipv4_prefixlen]->arg, &p); - if (! ret) - { - vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE); - return CMD_WARNING; - } - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (prefix_match (&p, &rn->p)) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - - return CMD_SUCCESS; + int idx_ipv4_prefixlen = 5; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct prefix p; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int ret; + int first = 1; + int vrf_header = 1; + + ret = str2prefix(argv[idx_ipv4_prefixlen]->arg, &p); + if (!ret) { + vty_out(vty, "%% Malformed Prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (prefix_match(&p, &rn->p)) { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_supernets, @@ -2020,48 +2013,50 @@ DEFUN (show_ip_route_vrf_all_supernets, VRF_ALL_CMD_HELP_STR "Show supernet entries only\n") { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - u_int32_t addr; - int first = 1; - int vrf_header = 1; - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - addr = ntohl (rn->p.u.prefix4.s_addr); - - if ((IN_CLASSC (addr) && rn->p.prefixlen < 24) - || (IN_CLASSB (addr) && rn->p.prefixlen < 16) - || (IN_CLASSA (addr) && rn->p.prefixlen < 8)) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - vrf_header = 1; - } - - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + u_int32_t addr; + int first = 1; + int vrf_header = 1; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + addr = ntohl(rn->p.u.prefix4.s_addr); + + if ((IN_CLASSC(addr) && rn->p.prefixlen < 24) + || (IN_CLASSB(addr) && rn->p.prefixlen < 16) + || (IN_CLASSA(addr) + && rn->p.prefixlen < 8)) { + if (first) { + vty_out(vty, + SHOW_ROUTE_V4_HEADER); + first = 0; + } + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", + VTY_NEWLINE, + zvrf_name(zvrf), + VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_protocol, @@ -2073,52 +2068,49 @@ DEFUN (show_ip_route_vrf_all_protocol, VRF_ALL_CMD_HELP_STR FRR_IP_REDIST_HELP_STR_ZEBRA"\n") { - int type; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - int vrf_header = 1; - - char *proto = argv[argc - 1]->text; - type = proto_redistnum (AFI_IP, proto); - - if (type < 0) - { - vty_out (vty, "Unknown route type%s", VTY_NEWLINE); - return CMD_WARNING; - } - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; - - /* Show matched type IPv4 routes. */ - for (rn = route_top (table); rn; rn = route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (rib->type == type) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V4_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - - return CMD_SUCCESS; + int type; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + int vrf_header = 1; + + char *proto = argv[argc - 1]->text; + type = proto_redistnum(AFI_IP, proto); + + if (type < 0) { + vty_out(vty, "Unknown route type%s", VTY_NEWLINE); + return CMD_WARNING; + } + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; + + /* Show matched type IPv4 routes. */ + for (rn = route_top(table); rn; rn = route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (rib->type == type) { + if (first) { + vty_out(vty, SHOW_ROUTE_V4_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_addr, @@ -2130,37 +2122,36 @@ DEFUN (show_ip_route_vrf_all_addr, VRF_ALL_CMD_HELP_STR "Network in the IP routing table to display\n") { - int idx_ipv4 = 5; - int ret; - struct prefix_ipv4 p; - struct route_table *table; - struct route_node *rn; - struct vrf *vrf; - struct zebra_vrf *zvrf; - - ret = str2prefix_ipv4 (argv[idx_ipv4]->arg, &p); - if (ret <= 0) - { - vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); - return CMD_WARNING; - } + int idx_ipv4 = 5; + int ret; + struct prefix_ipv4 p; + struct route_table *table; + struct route_node *rn; + struct vrf *vrf; + struct zebra_vrf *zvrf; + + ret = str2prefix_ipv4(argv[idx_ipv4]->arg, &p); + if (ret <= 0) { + vty_out(vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); + return CMD_WARNING; + } - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn) - continue; + rn = route_node_match(table, (struct prefix *)&p); + if (!rn) + continue; - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); - } + route_unlock_node(rn); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_prefix, @@ -2172,42 +2163,40 @@ DEFUN (show_ip_route_vrf_all_prefix, VRF_ALL_CMD_HELP_STR "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n") { - int idx_ipv4_prefixlen = 5; - int ret; - struct prefix_ipv4 p; - struct route_table *table; - struct route_node *rn; - struct vrf *vrf; - struct zebra_vrf *zvrf; - - ret = str2prefix_ipv4 (argv[idx_ipv4_prefixlen]->arg, &p); - if (ret <= 0) - { - vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); - return CMD_WARNING; - } + int idx_ipv4_prefixlen = 5; + int ret; + struct prefix_ipv4 p; + struct route_table *table; + struct route_node *rn; + struct vrf *vrf; + struct zebra_vrf *zvrf; + + ret = str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p); + if (ret <= 0) { + vty_out(vty, "%% Malformed IPv4 address%s", VTY_NEWLINE); + return CMD_WARNING; + } - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) - continue; + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL) + continue; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn) - continue; - if (rn->p.prefixlen != p.prefixlen) - { - route_unlock_node (rn); - continue; - } + rn = route_node_match(table, (struct prefix *)&p); + if (!rn) + continue; + if (rn->p.prefixlen != p.prefixlen) { + route_unlock_node(rn); + continue; + } - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); - } + route_unlock_node(rn); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_summary, @@ -2219,14 +2208,15 @@ DEFUN (show_ip_route_vrf_all_summary, VRF_ALL_CMD_HELP_STR "Summary of all routes\n") { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - if ((zvrf = vrf->info) != NULL) - vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]); + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + if ((zvrf = vrf->info) != NULL) + vty_show_ip_route_summary(vty, + zvrf->table[AFI_IP][SAFI_UNICAST]); - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ip_route_vrf_all_summary_prefix, @@ -2239,245 +2229,252 @@ DEFUN (show_ip_route_vrf_all_summary_prefix, "Summary of all routes\n" "Prefix routes\n") { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - if ((zvrf = vrf->info) != NULL) - vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]); + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + if ((zvrf = vrf->info) != NULL) + vty_show_ip_route_summary_prefix( + vty, zvrf->table[AFI_IP][SAFI_UNICAST]); - return CMD_SUCCESS; + return CMD_SUCCESS; } /* Write IPv4 static route configuration. */ -static int -static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd) -{ - struct route_node *rn; - struct static_route *si; - struct route_table *stable; - struct vrf *vrf; - struct zebra_vrf *zvrf; - char buf[BUFSIZ]; - int write =0; - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if (!(zvrf = vrf->info)) - continue; - if ((stable = zvrf->stable[AFI_IP][safi]) == NULL) - continue; - - for (rn = route_top (stable); rn; rn = route_next (rn)) - for (si = rn->info; si; si = si->next) - { - vty_out (vty, "%s %s", cmd, prefix2str (&rn->p, buf, sizeof buf)); - - switch (si->type) - { - case STATIC_IPV4_GATEWAY: - vty_out (vty, " %s", inet_ntoa (si->addr.ipv4)); - break; - case STATIC_IFNAME: - vty_out (vty, " %s", si->ifname); - break; - case STATIC_BLACKHOLE: - vty_out (vty, " Null0"); - break; - case STATIC_IPV6_GATEWAY: - vty_out (vty, " %s", inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ)); - break; - case STATIC_IPV6_GATEWAY_IFNAME: - vty_out (vty, " %s %s", - inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ), - ifindex2ifname (si->ifindex, si->vrf_id)); - 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); - - if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT) - vty_out (vty, " %d", si->distance); - - if (si->vrf_id != VRF_DEFAULT) - vty_out (vty, " vrf %s", zvrf ? zvrf_name (zvrf) : ""); - - /* Label information */ - if (si->snh_label.num_labels) - vty_out (vty, " label %s", - mpls_label2str (si->snh_label.num_labels, - si->snh_label.label, buf, sizeof buf)); - - vty_out (vty, "%s", VTY_NEWLINE); - - write = 1; - } - } - return write; +static int static_config_ipv4(struct vty *vty, safi_t safi, const char *cmd) +{ + struct route_node *rn; + struct static_route *si; + struct route_table *stable; + struct vrf *vrf; + struct zebra_vrf *zvrf; + char buf[BUFSIZ]; + int write = 0; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if (!(zvrf = vrf->info)) + continue; + if ((stable = zvrf->stable[AFI_IP][safi]) == NULL) + continue; + + for (rn = route_top(stable); rn; rn = route_next(rn)) + for (si = rn->info; si; si = si->next) { + vty_out(vty, "%s %s", cmd, + prefix2str(&rn->p, buf, sizeof buf)); + + switch (si->type) { + case STATIC_IPV4_GATEWAY: + vty_out(vty, " %s", + inet_ntoa(si->addr.ipv4)); + break; + case STATIC_IFNAME: + vty_out(vty, " %s", si->ifname); + break; + case STATIC_BLACKHOLE: + vty_out(vty, " Null0"); + break; + case STATIC_IPV6_GATEWAY: + vty_out(vty, " %s", + inet_ntop(AF_INET6, + &si->addr.ipv6, buf, + BUFSIZ)); + break; + case STATIC_IPV6_GATEWAY_IFNAME: + vty_out(vty, " %s %s", + inet_ntop(AF_INET6, + &si->addr.ipv6, buf, + BUFSIZ), + ifindex2ifname(si->ifindex, + si->vrf_id)); + 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); + + if (si->distance + != ZEBRA_STATIC_DISTANCE_DEFAULT) + vty_out(vty, " %d", si->distance); + + if (si->vrf_id != VRF_DEFAULT) + vty_out(vty, " vrf %s", + zvrf ? zvrf_name(zvrf) : ""); + + /* Label information */ + if (si->snh_label.num_labels) + vty_out(vty, " label %s", + mpls_label2str( + si->snh_label + .num_labels, + si->snh_label.label, + buf, sizeof buf)); + + vty_out(vty, "%s", VTY_NEWLINE); + + write = 1; + } + } + return write; } /* General fucntion for IPv6 static route. */ -int -static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str, - const char *src_str, - const char *gate_str, const char *ifname, - const char *flag_str, const char *tag_str, - const char *distance_str, const char *vrf_id_str, - const char *label_str) -{ - int ret; - u_char distance; - struct prefix p, src; - struct prefix_ipv6 *src_p = NULL; - struct in6_addr *gate = NULL; - struct in6_addr gate_addr; - u_char type = STATIC_BLACKHOLE; - u_char flag = 0; - route_tag_t tag = 0; - struct zebra_vrf *zvrf; - struct static_nh_label snh_label; - - ret = str2prefix (dest_str, &p); - if (ret <= 0) - { - vty_out (vty, "%% Malformed address%s", VTY_NEWLINE); - return CMD_WARNING; - } - - if (src_str) - { - ret = str2prefix (src_str, &src); - if (ret <= 0 || src.family != AF_INET6) - { - vty_out (vty, "%% Malformed source address%s", VTY_NEWLINE); - return CMD_WARNING; - } - src_p = (struct prefix_ipv6*)&src; - } - - /* Apply mask for given prefix. */ - apply_mask (&p); - - /* Administrative distance. */ - if (distance_str) - distance = atoi (distance_str); - else - distance = ZEBRA_STATIC_DISTANCE_DEFAULT; - - /* tag */ - if (tag_str) - VTY_GET_INTEGER_RANGE("tag", tag, tag_str, 0, 4294967295); - - /* When gateway is valid IPv6 addrees, then gate is treated as - nexthop address other case gate is treated as interface name. */ - ret = inet_pton (AF_INET6, gate_str, &gate_addr); - - /* VRF id */ - zvrf = zebra_vrf_lookup_by_name (vrf_id_str); - - if (!zvrf) - { - vty_out (vty, "%% vrf %s is not defined%s", vrf_id_str, VTY_NEWLINE); - return CMD_WARNING; - } - - /* Labels */ - memset (&snh_label, 0, sizeof (struct static_nh_label)); - if (label_str) - { - if (!mpls_enabled) - { - vty_out (vty, "%% MPLS not turned on in kernel, ignoring command%s", - VTY_NEWLINE); - return CMD_WARNING; - } - if (mpls_str2label (label_str, &snh_label.num_labels, - snh_label.label)) - { - vty_out (vty, "%% Malformed label(s)%s", VTY_NEWLINE); - return CMD_WARNING; - } - } - - /* Null0 static route. */ - if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0)) - { - if (flag_str) - { - vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE); - return CMD_WARNING; - } - if (add_cmd) - static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, NULL, ifname, - ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label); - else - static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, NULL, - ifname, tag, distance, zvrf, &snh_label); - return CMD_SUCCESS; - } - - /* Route flags */ - if (flag_str) { - switch(flag_str[0]) { - case 'r': - case 'R': /* XXX */ - SET_FLAG (flag, ZEBRA_FLAG_REJECT); - break; - case 'b': - case 'B': /* XXX */ - SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE); - break; - default: - vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE); - return CMD_WARNING; - } - } - - if (ifname) - { - /* When ifname is specified. It must be come with gateway - address. */ - if (ret != 1) - { - vty_out (vty, "%% Malformed address%s", VTY_NEWLINE); - return CMD_WARNING; - } - type = STATIC_IPV6_GATEWAY_IFNAME; - gate = &gate_addr; - } - else - { - if (ret == 1) - { - type = STATIC_IPV6_GATEWAY; - gate = &gate_addr; - } - else - { - type = STATIC_IFNAME; - ifname = gate_str; - } - } - - if (add_cmd) - static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, (union g_addr *)gate, - ifname, flag, tag, distance, zvrf, &snh_label); - else - static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, (union g_addr *)gate, - ifname, tag, distance, zvrf, &snh_label); - - return CMD_SUCCESS; +int static_ipv6_func(struct vty *vty, int add_cmd, const char *dest_str, + const char *src_str, const char *gate_str, + const char *ifname, const char *flag_str, + const char *tag_str, const char *distance_str, + const char *vrf_id_str, const char *label_str) +{ + int ret; + u_char distance; + struct prefix p, src; + struct prefix_ipv6 *src_p = NULL; + struct in6_addr *gate = NULL; + struct in6_addr gate_addr; + u_char type = STATIC_BLACKHOLE; + u_char flag = 0; + route_tag_t tag = 0; + struct zebra_vrf *zvrf; + struct static_nh_label snh_label; + + ret = str2prefix(dest_str, &p); + if (ret <= 0) { + vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); + return CMD_WARNING; + } + + if (src_str) { + ret = str2prefix(src_str, &src); + if (ret <= 0 || src.family != AF_INET6) { + vty_out(vty, "%% Malformed source address%s", + VTY_NEWLINE); + return CMD_WARNING; + } + src_p = (struct prefix_ipv6 *)&src; + } + + /* Apply mask for given prefix. */ + apply_mask(&p); + + /* Administrative distance. */ + if (distance_str) + distance = atoi(distance_str); + else + distance = ZEBRA_STATIC_DISTANCE_DEFAULT; + + /* tag */ + if (tag_str) + VTY_GET_INTEGER_RANGE("tag", tag, tag_str, 0, 4294967295); + + /* When gateway is valid IPv6 addrees, then gate is treated as + nexthop address other case gate is treated as interface name. */ + ret = inet_pton(AF_INET6, gate_str, &gate_addr); + + /* VRF id */ + zvrf = zebra_vrf_lookup_by_name(vrf_id_str); + + if (!zvrf) { + vty_out(vty, "%% vrf %s is not defined%s", vrf_id_str, + VTY_NEWLINE); + return CMD_WARNING; + } + + /* Labels */ + memset(&snh_label, 0, sizeof(struct static_nh_label)); + if (label_str) { + if (!mpls_enabled) { + vty_out(vty, + "%% MPLS not turned on in kernel, ignoring command%s", + VTY_NEWLINE); + return CMD_WARNING; + } + if (mpls_str2label(label_str, &snh_label.num_labels, + snh_label.label)) { + vty_out(vty, "%% Malformed label(s)%s", VTY_NEWLINE); + return CMD_WARNING; + } + } + + /* Null0 static route. */ + if ((gate_str != NULL) + && (strncasecmp(gate_str, "Null0", strlen(gate_str)) == 0)) { + if (flag_str) { + vty_out(vty, "%% can not have flag %s with Null0%s", + flag_str, VTY_NEWLINE); + return CMD_WARNING; + } + if (add_cmd) + static_add_route(AFI_IP6, SAFI_UNICAST, type, &p, src_p, + NULL, ifname, ZEBRA_FLAG_BLACKHOLE, + tag, distance, zvrf, &snh_label); + else + static_delete_route(AFI_IP6, SAFI_UNICAST, type, &p, + src_p, NULL, ifname, tag, distance, + zvrf, &snh_label); + return CMD_SUCCESS; + } + + /* Route flags */ + if (flag_str) { + switch (flag_str[0]) { + case 'r': + case 'R': /* XXX */ + SET_FLAG(flag, ZEBRA_FLAG_REJECT); + break; + case 'b': + case 'B': /* XXX */ + SET_FLAG(flag, ZEBRA_FLAG_BLACKHOLE); + break; + default: + vty_out(vty, "%% Malformed flag %s %s", flag_str, + VTY_NEWLINE); + return CMD_WARNING; + } + } + + if (ifname) { + /* When ifname is specified. It must be come with gateway + address. */ + if (ret != 1) { + vty_out(vty, "%% Malformed address%s", VTY_NEWLINE); + return CMD_WARNING; + } + type = STATIC_IPV6_GATEWAY_IFNAME; + gate = &gate_addr; + } else { + if (ret == 1) { + type = STATIC_IPV6_GATEWAY; + gate = &gate_addr; + } else { + type = STATIC_IFNAME; + ifname = gate_str; + } + } + + if (add_cmd) + static_add_route(AFI_IP6, SAFI_UNICAST, type, &p, src_p, + (union g_addr *)gate, ifname, flag, tag, + distance, zvrf, &snh_label); + else + static_delete_route(AFI_IP6, SAFI_UNICAST, type, &p, src_p, + (union g_addr *)gate, ifname, tag, distance, + zvrf, &snh_label); + + return CMD_SUCCESS; } DEFUN (ipv6_route, @@ -2498,33 +2495,28 @@ DEFUN (ipv6_route, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 2; - int idx_ipv6_ifname; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[3]->text, "from")) - { - src = argv[4]->arg; - idx_ipv6_ifname = 5; - idx_curr = 6; - } - else - { - src = NULL; - idx_ipv6_ifname = 3; - idx_curr = 4; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 1, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6_ifname]->arg, - NULL, NULL, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 2; + int idx_ipv6_ifname; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[3]->text, "from")) { + src = argv[4]->arg; + idx_ipv6_ifname = 5; + idx_curr = 6; + } else { + src = NULL; + idx_ipv6_ifname = 3; + idx_curr = 4; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 1, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6_ifname]->arg, NULL, NULL, tag, + distance, vrf, NULL); } DEFUN (ipv6_route_flags, @@ -2546,37 +2538,32 @@ DEFUN (ipv6_route_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 2; - int idx_ipv6_ifname; - int idx_reject_blackhole; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[3]->text, "from")) - { - src = argv[4]->arg; - idx_ipv6_ifname = 5; - idx_reject_blackhole = 6; - idx_curr = 7; - } - else - { - src = NULL; - idx_ipv6_ifname = 3; - idx_reject_blackhole = 4; - idx_curr = 5; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 1, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6_ifname]->arg, - NULL, - argv[idx_reject_blackhole]->arg, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 2; + int idx_ipv6_ifname; + int idx_reject_blackhole; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[3]->text, "from")) { + src = argv[4]->arg; + idx_ipv6_ifname = 5; + idx_reject_blackhole = 6; + idx_curr = 7; + } else { + src = NULL; + idx_ipv6_ifname = 3; + idx_reject_blackhole = 4; + idx_curr = 5; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 1, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6_ifname]->arg, NULL, + argv[idx_reject_blackhole]->arg, tag, distance, + vrf, NULL); } DEFUN (ipv6_route_ifname, @@ -2596,37 +2583,31 @@ DEFUN (ipv6_route_ifname, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 2; - int idx_ipv6 = 3; - int idx_interface = 4; - int idx_curr = 5; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[3]->text, "from")) - { - src = argv[4]->arg; - idx_ipv6 = 5; - idx_interface = 6; - idx_curr = 7; - } - else - { - src = NULL; - idx_ipv6 = 3; - idx_interface = 4; - idx_curr = 5; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 1, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6]->arg, - argv[idx_interface]->arg, - NULL, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 2; + int idx_ipv6 = 3; + int idx_interface = 4; + int idx_curr = 5; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[3]->text, "from")) { + src = argv[4]->arg; + idx_ipv6 = 5; + idx_interface = 6; + idx_curr = 7; + } else { + src = NULL; + idx_ipv6 = 3; + idx_interface = 4; + idx_curr = 5; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 1, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6]->arg, argv[idx_interface]->arg, + NULL, tag, distance, vrf, NULL); } DEFUN (ipv6_route_ifname_flags, @@ -2648,40 +2629,35 @@ DEFUN (ipv6_route_ifname_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 2; - int idx_ipv6; - int idx_interface; - int idx_reject_blackhole; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[3]->text, "from")) - { - src = argv[4]->arg; - idx_ipv6 = 5; - idx_interface = 6; - idx_reject_blackhole = 7; - idx_curr = 8; - } - else - { - src = NULL; - idx_ipv6 = 3; - idx_interface = 4; - idx_reject_blackhole = 5; - idx_curr = 6; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 1, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6]->arg, - argv[idx_interface]->arg, - argv[idx_reject_blackhole]->arg, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 2; + int idx_ipv6; + int idx_interface; + int idx_reject_blackhole; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[3]->text, "from")) { + src = argv[4]->arg; + idx_ipv6 = 5; + idx_interface = 6; + idx_reject_blackhole = 7; + idx_curr = 8; + } else { + src = NULL; + idx_ipv6 = 3; + idx_interface = 4; + idx_reject_blackhole = 5; + idx_curr = 6; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 1, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6]->arg, argv[idx_interface]->arg, + argv[idx_reject_blackhole]->arg, tag, distance, + vrf, NULL); } DEFUN (no_ipv6_route, @@ -2703,33 +2679,28 @@ DEFUN (no_ipv6_route, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 3; - int idx_ipv6_ifname; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[4]->text, "from")) - { - src = argv[5]->arg; - idx_ipv6_ifname = 6; - idx_curr = 7; - } - else - { - src = NULL; - idx_ipv6_ifname = 4; - idx_curr = 5; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 0, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6_ifname]->arg, - NULL, NULL, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 3; + int idx_ipv6_ifname; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[4]->text, "from")) { + src = argv[5]->arg; + idx_ipv6_ifname = 6; + idx_curr = 7; + } else { + src = NULL; + idx_ipv6_ifname = 4; + idx_curr = 5; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 0, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6_ifname]->arg, NULL, NULL, tag, + distance, vrf, NULL); } DEFUN (no_ipv6_route_flags, @@ -2752,37 +2723,32 @@ DEFUN (no_ipv6_route_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 3; - int idx_ipv6_ifname; - int idx_reject_blackhole; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[4]->text, "from")) - { - src = argv[5]->arg; - idx_ipv6_ifname = 6; - idx_reject_blackhole = 7; - idx_curr = 8; - } - else - { - src = NULL; - idx_ipv6_ifname = 4; - idx_reject_blackhole = 5; - idx_curr = 6; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 0, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6_ifname]->arg, - NULL, - argv[idx_reject_blackhole]->arg, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 3; + int idx_ipv6_ifname; + int idx_reject_blackhole; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[4]->text, "from")) { + src = argv[5]->arg; + idx_ipv6_ifname = 6; + idx_reject_blackhole = 7; + idx_curr = 8; + } else { + src = NULL; + idx_ipv6_ifname = 4; + idx_reject_blackhole = 5; + idx_curr = 6; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 0, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6_ifname]->arg, NULL, + argv[idx_reject_blackhole]->arg, tag, distance, + vrf, NULL); } DEFUN (no_ipv6_route_ifname, @@ -2803,37 +2769,31 @@ DEFUN (no_ipv6_route_ifname, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 3; - int idx_ipv6; - int idx_interface; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[4]->text, "from")) - { - src = argv[5]->arg; - idx_ipv6 = 6; - idx_interface = 7; - idx_curr = 8; - } - else - { - src = NULL; - idx_ipv6 = 4; - idx_interface = 5; - idx_curr = 6; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 0, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6]->arg, - argv[idx_interface]->arg, - NULL, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 3; + int idx_ipv6; + int idx_interface; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[4]->text, "from")) { + src = argv[5]->arg; + idx_ipv6 = 6; + idx_interface = 7; + idx_curr = 8; + } else { + src = NULL; + idx_ipv6 = 4; + idx_interface = 5; + idx_curr = 6; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 0, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6]->arg, argv[idx_interface]->arg, + NULL, tag, distance, vrf, NULL); } DEFUN (no_ipv6_route_ifname_flags, @@ -2856,40 +2816,35 @@ DEFUN (no_ipv6_route_ifname_flags, "Specify labels for this route\n" "One or more labels separated by '/'\n") { - int idx_ipv6_prefixlen = 3; - int idx_ipv6; - int idx_interface; - int idx_reject_blackhole; - int idx_curr; - char *src, *tag, *distance, *vrf; - - if (!strcmp(argv[4]->text, "from")) - { - src = argv[5]->arg; - idx_ipv6 = 6; - idx_interface = 7; - idx_reject_blackhole = 8; - idx_curr = 9; - } - else - { - src = NULL; - idx_ipv6 = 4; - idx_interface = 5; - idx_reject_blackhole = 6; - idx_curr = 7; - } - - tag = distance = vrf = NULL; - zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL); - - return static_ipv6_func (vty, 0, - argv[idx_ipv6_prefixlen]->arg, - src, - argv[idx_ipv6]->arg, - argv[idx_interface]->arg, - argv[idx_reject_blackhole]->arg, - tag, distance, vrf, NULL); + int idx_ipv6_prefixlen = 3; + int idx_ipv6; + int idx_interface; + int idx_reject_blackhole; + int idx_curr; + char *src, *tag, *distance, *vrf; + + if (!strcmp(argv[4]->text, "from")) { + src = argv[5]->arg; + idx_ipv6 = 6; + idx_interface = 7; + idx_reject_blackhole = 8; + idx_curr = 9; + } else { + src = NULL; + idx_ipv6 = 4; + idx_interface = 5; + idx_reject_blackhole = 6; + idx_curr = 7; + } + + tag = distance = vrf = NULL; + zebra_vty_ip_route_tdv_helper(argc, argv, idx_curr, &tag, &distance, + &vrf, NULL); + + return static_ipv6_func(vty, 0, argv[idx_ipv6_prefixlen]->arg, src, + argv[idx_ipv6]->arg, argv[idx_interface]->arg, + argv[idx_reject_blackhole]->arg, tag, distance, + vrf, NULL); } DEFUN (show_ipv6_route, @@ -2901,94 +2856,86 @@ DEFUN (show_ipv6_route, VRF_CMD_HELP_STR "Output JSON\n") { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; - struct zebra_vrf *zvrf = NULL; - char buf[SRCDEST2STR_BUFFER]; - json_object *json = NULL; - json_object *json_prefix = NULL; - - int vrf = (argc > 3 && strmatch (argv[3]->text, "vrf")); - int uj = vrf ? argc == 6 : argc == 4; - char *vrfname = vrf ? argv[4]->arg : NULL; - - if (vrf) - { - if (!(zvrf = zebra_vrf_lookup_by_name (vrfname))) - { - if (uj) - vty_out (vty, "{}%s", VTY_NEWLINE); - else - vty_out (vty, "vrf %s not defined%s", vrfname, VTY_NEWLINE); - return CMD_SUCCESS; - } - - if (zvrf_id (zvrf) == VRF_UNKNOWN) - { - if (uj) - vty_out (vty, "{}%s", VTY_NEWLINE); - else - vty_out (vty, "vrf %s inactive%s", vrfname, VTY_NEWLINE); - return CMD_SUCCESS; - } - else - vrf_id = zvrf_id (zvrf); - } - - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (!table) - { - if (uj) - vty_out (vty, "{}%s", VTY_NEWLINE); - return CMD_SUCCESS; - } - - if (uj) - { - json = json_object_new_object(); - - /* Show all IPv6 route. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - { - RNODE_FOREACH_RIB (rn, rib) - { - if (!json_prefix) - json_prefix = json_object_new_array(); - vty_show_ip_route (vty, rn, rib, json_prefix); - } - - if (json_prefix) - { - srcdest_rnode2str (rn, buf, sizeof buf); - json_object_object_add(json, buf, json_prefix); - json_prefix = NULL; - } - } - - vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE); - json_object_free(json); - } - else - { - /* Show all IPv6 route. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - { - RNODE_FOREACH_RIB (rn, rib) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - } - - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; + struct zebra_vrf *zvrf = NULL; + char buf[SRCDEST2STR_BUFFER]; + json_object *json = NULL; + json_object *json_prefix = NULL; + + int vrf = (argc > 3 && strmatch(argv[3]->text, "vrf")); + int uj = vrf ? argc == 6 : argc == 4; + char *vrfname = vrf ? argv[4]->arg : NULL; + + if (vrf) { + if (!(zvrf = zebra_vrf_lookup_by_name(vrfname))) { + if (uj) + vty_out(vty, "{}%s", VTY_NEWLINE); + else + vty_out(vty, "vrf %s not defined%s", vrfname, + VTY_NEWLINE); + return CMD_SUCCESS; + } + + if (zvrf_id(zvrf) == VRF_UNKNOWN) { + if (uj) + vty_out(vty, "{}%s", VTY_NEWLINE); + else + vty_out(vty, "vrf %s inactive%s", vrfname, + VTY_NEWLINE); + return CMD_SUCCESS; + } else + vrf_id = zvrf_id(zvrf); + } + + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) { + if (uj) + vty_out(vty, "{}%s", VTY_NEWLINE); + return CMD_SUCCESS; + } + + if (uj) { + json = json_object_new_object(); + + /* Show all IPv6 route. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) { + RNODE_FOREACH_RIB(rn, rib) + { + if (!json_prefix) + json_prefix = json_object_new_array(); + vty_show_ip_route(vty, rn, rib, json_prefix); + } + + if (json_prefix) { + srcdest_rnode2str(rn, buf, sizeof buf); + json_object_object_add(json, buf, json_prefix); + json_prefix = NULL; + } + } + + vty_out(vty, "%s%s", json_object_to_json_string_ext( + json, JSON_C_TO_STRING_PRETTY), + VTY_NEWLINE); + json_object_free(json); + } else { + /* Show all IPv6 route. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) { + RNODE_FOREACH_RIB(rn, rib) + { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + } + + return CMD_SUCCESS; } DEFUN (show_ipv6_route_tag, @@ -3001,46 +2948,44 @@ DEFUN (show_ipv6_route_tag, "Show only routes with tag\n" "Tag value\n") { - int idx_vrf = 3; - int idx_name = 4; - int idx_tag = 6; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - route_tag_t tag = 0; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[idx_vrf]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[idx_name]->arg); - VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295); - } - else - { - idx_tag -= 2; - VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295); - } - - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show all IPv6 routes with matching tag value. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (rib->tag != tag) - continue; - - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - return CMD_SUCCESS; + int idx_vrf = 3; + int idx_name = 4; + int idx_tag = 6; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + route_tag_t tag = 0; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[idx_vrf]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[idx_name]->arg); + VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, + 4294967295); + } else { + idx_tag -= 2; + VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, + 4294967295); + } + + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show all IPv6 routes with matching tag value. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (rib->tag != tag) + continue; + + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + return CMD_SUCCESS; } DEFUN (show_ipv6_route_prefix_longer, @@ -3053,52 +2998,46 @@ DEFUN (show_ipv6_route_prefix_longer, "IPv6 prefix\n" "Show route matching the specified Network/Mask pair only\n") { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct prefix p; - int ret; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[4]->arg); - ret = str2prefix (argv[5]->arg, &p); - } - else - { - ret = str2prefix (argv[3]->arg, &p); - } - - if (! ret) - { - vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE); - return CMD_WARNING; - } - - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show matched type IPv6 routes. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - struct prefix *p, *src_p; - srcdest_rnode_prefixes(rn, &p, &src_p); - - if (prefix_match (p, &rn->p)) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct prefix p; + int ret; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[4]->arg); + ret = str2prefix(argv[5]->arg, &p); + } else { + ret = str2prefix(argv[3]->arg, &p); + } + + if (!ret) { + vty_out(vty, "%% Malformed Prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } + + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show matched type IPv6 routes. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + struct prefix *p, *src_p; + srcdest_rnode_prefixes(rn, &p, &src_p); + + if (prefix_match(p, &rn->p)) { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + return CMD_SUCCESS; } DEFUN (show_ipv6_route_protocol, @@ -3110,43 +3049,40 @@ DEFUN (show_ipv6_route_protocol, VRF_CMD_HELP_STR FRR_IP6_REDIST_HELP_STR_ZEBRA) { - int type; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; - - int idx = 0; - if (argv_find (argv, argc, "NAME", &idx)) - VRF_GET_ID (vrf_id, argv[idx]->arg); - - char *proto = argv[argc - 1]->text; - type = proto_redistnum (AFI_IP6, proto); - - if (type < 0) - { - vty_out (vty, "Unknown route type%s", VTY_NEWLINE); - return CMD_WARNING; - } - - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; - - /* Show matched type IPv6 routes. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (rib->type == type) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); + int type; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; + + int idx = 0; + if (argv_find(argv, argc, "NAME", &idx)) + VRF_GET_ID(vrf_id, argv[idx]->arg); + + char *proto = argv[argc - 1]->text; + type = proto_redistnum(AFI_IP6, proto); + + if (type < 0) { + vty_out(vty, "Unknown route type%s", VTY_NEWLINE); + return CMD_WARNING; + } + + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; + + /* Show matched type IPv6 routes. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (rib->type == type) { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ipv6_route_addr, @@ -3158,44 +3094,39 @@ DEFUN (show_ipv6_route_addr, VRF_CMD_HELP_STR "IPv6 Address\n") { - int ret; - struct prefix_ipv6 p; - struct route_table *table; - struct route_node *rn; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[4]->arg); - ret = str2prefix_ipv6 (argv[5]->arg, &p); - } - else - { - ret = str2prefix_ipv6 (argv[3]->arg, &p); - } + int ret; + struct prefix_ipv6 p; + struct route_table *table; + struct route_node *rn; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[4]->arg); + ret = str2prefix_ipv6(argv[5]->arg, &p); + } else { + ret = str2prefix_ipv6(argv[3]->arg, &p); + } - if (ret <= 0) - { - vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE); - return CMD_WARNING; - } + if (ret <= 0) { + vty_out(vty, "Malformed IPv6 address%s", VTY_NEWLINE); + return CMD_WARNING; + } - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn) - { - vty_out (vty, "%% Network not in table%s", VTY_NEWLINE); - return CMD_WARNING; - } + rn = route_node_match(table, (struct prefix *)&p); + if (!rn) { + vty_out(vty, "%% Network not in table%s", VTY_NEWLINE); + return CMD_WARNING; + } - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); + route_unlock_node(rn); - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ipv6_route_prefix, @@ -3207,42 +3138,38 @@ DEFUN (show_ipv6_route_prefix, VRF_CMD_HELP_STR "IPv6 prefix\n") { - int ret; - struct prefix_ipv6 p; - struct route_table *table; - struct route_node *rn; - vrf_id_t vrf_id = VRF_DEFAULT; - - if (strmatch(argv[3]->text, "vrf")) - { - VRF_GET_ID (vrf_id, argv[4]->arg); - ret = str2prefix_ipv6 (argv[5]->arg, &p); - } - else - ret = str2prefix_ipv6 (argv[3]->arg, &p); - - if (ret <= 0) - { - vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE); - return CMD_WARNING; - } + int ret; + struct prefix_ipv6 p; + struct route_table *table; + struct route_node *rn; + vrf_id_t vrf_id = VRF_DEFAULT; + + if (strmatch(argv[3]->text, "vrf")) { + VRF_GET_ID(vrf_id, argv[4]->arg); + ret = str2prefix_ipv6(argv[5]->arg, &p); + } else + ret = str2prefix_ipv6(argv[3]->arg, &p); + + if (ret <= 0) { + vty_out(vty, "Malformed IPv6 prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn || rn->p.prefixlen != p.prefixlen) - { - vty_out (vty, "%% Network not in table%s", VTY_NEWLINE); - return CMD_WARNING; - } + rn = route_node_match(table, (struct prefix *)&p); + if (!rn || rn->p.prefixlen != p.prefixlen) { + vty_out(vty, "%% Network not in table%s", VTY_NEWLINE); + return CMD_WARNING; + } - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); + route_unlock_node(rn); - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -3256,19 +3183,19 @@ DEFUN (show_ipv6_route_summary, VRF_CMD_HELP_STR "Summary of all IPv6 routes\n") { - struct route_table *table; - vrf_id_t vrf_id = VRF_DEFAULT; + struct route_table *table; + vrf_id_t vrf_id = VRF_DEFAULT; - if (strmatch(argv[3]->text, "vrf")) - VRF_GET_ID (vrf_id, argv[4]->arg); + if (strmatch(argv[3]->text, "vrf")) + VRF_GET_ID(vrf_id, argv[4]->arg); - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - vty_show_ip_route_summary (vty, table); + vty_show_ip_route_summary(vty, table); - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -3283,19 +3210,19 @@ DEFUN (show_ipv6_route_summary_prefix, "Summary of all IPv6 routes\n" "Prefix routes\n") { - struct route_table *table; - vrf_id_t vrf_id = VRF_DEFAULT; + struct route_table *table; + vrf_id_t vrf_id = VRF_DEFAULT; - if (strmatch(argv[3]->text, "vrf")) - VRF_GET_ID (vrf_id, argv[4]->arg); + if (strmatch(argv[3]->text, "vrf")) + VRF_GET_ID(vrf_id, argv[4]->arg); - table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP6, SAFI_UNICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - vty_show_ip_route_summary_prefix (vty, table); + vty_show_ip_route_summary_prefix(vty, table); - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -3311,31 +3238,30 @@ DEFUN (show_ipv6_mroute, "IPv6 Multicast routing table\n" VRF_CMD_HELP_STR) { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - int first = 1; - vrf_id_t vrf_id = VRF_DEFAULT; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + int first = 1; + vrf_id_t vrf_id = VRF_DEFAULT; - if (argc == 5) - VRF_GET_ID (vrf_id, argv[4]->arg); + if (argc == 5) + VRF_GET_ID(vrf_id, argv[4]->arg); - table = zebra_vrf_table (AFI_IP6, SAFI_MULTICAST, vrf_id); - if (! table) - return CMD_SUCCESS; + table = zebra_vrf_table(AFI_IP6, SAFI_MULTICAST, vrf_id); + if (!table) + return CMD_SUCCESS; - /* Show all IPv6 route. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - return CMD_SUCCESS; + /* Show all IPv6 route. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + return CMD_SUCCESS; } @@ -3347,41 +3273,40 @@ DEFUN (show_ipv6_route_vrf_all, "IPv6 routing table\n" VRF_ALL_CMD_HELP_STR) { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - int vrf_header = 1; - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; - - /* Show all IPv6 route. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + int vrf_header = 1; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; + + /* Show all IPv6 route. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_tag, @@ -3394,49 +3319,49 @@ DEFUN (show_ipv6_route_vrf_all_tag, "Show only routes with tag\n" "Tag value\n") { - int idx_number = 6; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - int vrf_header = 1; - route_tag_t tag = 0; - - if (argv[idx_number]->arg) - VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_number]->arg, 0, 4294967295); - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; - - /* Show all IPv6 routes with matching tag value. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (rib->tag != tag) - continue; - - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - - return CMD_SUCCESS; + int idx_number = 6; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + int vrf_header = 1; + route_tag_t tag = 0; + + if (argv[idx_number]->arg) + VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_number]->arg, 0, + 4294967295); + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; + + /* Show all IPv6 routes with matching tag value. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (rib->tag != tag) + continue; + + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_prefix_longer, @@ -3449,56 +3374,56 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer, "IPv6 prefix\n" "Show route matching the specified Network/Mask pair only\n") { - int idx_ipv6_prefixlen = 5; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct prefix p; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int ret; - int first = 1; - int vrf_header = 1; - - ret = str2prefix (argv[idx_ipv6_prefixlen]->arg, &p); - if (! ret) - { - vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE); - return CMD_WARNING; - } - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; - - /* Show matched type IPv6 routes. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - struct prefix *p, *src_p; - srcdest_rnode_prefixes(rn, &p, &src_p); - if (prefix_match (p, &rn->p)) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - vrf_header = 1; - } - - return CMD_SUCCESS; + int idx_ipv6_prefixlen = 5; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct prefix p; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int ret; + int first = 1; + int vrf_header = 1; + + ret = str2prefix(argv[idx_ipv6_prefixlen]->arg, &p); + if (!ret) { + vty_out(vty, "%% Malformed Prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; + + /* Show matched type IPv6 routes. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + struct prefix *p, *src_p; + srcdest_rnode_prefixes(rn, &p, &src_p); + if (prefix_match(p, &rn->p)) { + if (first) { + vty_out(vty, + SHOW_ROUTE_V6_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", + VTY_NEWLINE, + zvrf_name(zvrf), + VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_protocol, @@ -3510,52 +3435,49 @@ DEFUN (show_ipv6_route_vrf_all_protocol, VRF_ALL_CMD_HELP_STR FRR_IP6_REDIST_HELP_STR_ZEBRA) { - int type; - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - int vrf_header = 1; - - char *proto = argv[argc - 1]->text; - type = proto_redistnum (AFI_IP6, proto); - - if (type < 0) - { - vty_out (vty, "Unknown route type%s", VTY_NEWLINE); - return CMD_WARNING; - } - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; - - /* Show matched type IPv6 routes. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - if (rib->type == type) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - - if (vrf_header) - { - vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE); - vrf_header = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - vrf_header = 1; - } - - return CMD_SUCCESS; + int type; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + int vrf_header = 1; + + char *proto = argv[argc - 1]->text; + type = proto_redistnum(AFI_IP6, proto); + + if (type < 0) { + vty_out(vty, "Unknown route type%s", VTY_NEWLINE); + return CMD_WARNING; + } + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; + + /* Show matched type IPv6 routes. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + if (rib->type == type) { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + + if (vrf_header) { + vty_out(vty, "%sVRF %s:%s", VTY_NEWLINE, + zvrf_name(zvrf), VTY_NEWLINE); + vrf_header = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + vrf_header = 1; + } + + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_addr, @@ -3567,37 +3489,36 @@ DEFUN (show_ipv6_route_vrf_all_addr, VRF_ALL_CMD_HELP_STR "IPv6 Address\n") { - int idx_ipv6 = 5; - int ret; - struct prefix_ipv6 p; - struct route_table *table; - struct route_node *rn; - struct vrf *vrf; - struct zebra_vrf *zvrf; - - ret = str2prefix_ipv6 (argv[idx_ipv6]->arg, &p); - if (ret <= 0) - { - vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE); - return CMD_WARNING; - } + int idx_ipv6 = 5; + int ret; + struct prefix_ipv6 p; + struct route_table *table; + struct route_node *rn; + struct vrf *vrf; + struct zebra_vrf *zvrf; + + ret = str2prefix_ipv6(argv[idx_ipv6]->arg, &p); + if (ret <= 0) { + vty_out(vty, "Malformed IPv6 address%s", VTY_NEWLINE); + return CMD_WARNING; + } - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn) - continue; + rn = route_node_match(table, (struct prefix *)&p); + if (!rn) + continue; - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); - } + route_unlock_node(rn); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_prefix, @@ -3609,42 +3530,40 @@ DEFUN (show_ipv6_route_vrf_all_prefix, VRF_ALL_CMD_HELP_STR "IPv6 prefix\n") { - int idx_ipv6_prefixlen = 5; - int ret; - struct prefix_ipv6 p; - struct route_table *table; - struct route_node *rn; - struct vrf *vrf; - struct zebra_vrf *zvrf; - - ret = str2prefix_ipv6 (argv[idx_ipv6_prefixlen]->arg, &p); - if (ret <= 0) - { - vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE); - return CMD_WARNING; - } + int idx_ipv6_prefixlen = 5; + int ret; + struct prefix_ipv6 p; + struct route_table *table; + struct route_node *rn; + struct vrf *vrf; + struct zebra_vrf *zvrf; + + ret = str2prefix_ipv6(argv[idx_ipv6_prefixlen]->arg, &p); + if (ret <= 0) { + vty_out(vty, "Malformed IPv6 prefix%s", VTY_NEWLINE); + return CMD_WARNING; + } - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; - rn = route_node_match (table, (struct prefix *) &p); - if (! rn) - continue; - if (rn->p.prefixlen != p.prefixlen) - { - route_unlock_node (rn); - continue; - } + rn = route_node_match(table, (struct prefix *)&p); + if (!rn) + continue; + if (rn->p.prefixlen != p.prefixlen) { + route_unlock_node(rn); + continue; + } - vty_show_ip_route_detail (vty, rn, 0); + vty_show_ip_route_detail(vty, rn, 0); - route_unlock_node (rn); - } + route_unlock_node(rn); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_summary, @@ -3656,14 +3575,15 @@ DEFUN (show_ipv6_route_vrf_all_summary, VRF_ALL_CMD_HELP_STR "Summary of all IPv6 routes\n") { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - if ((zvrf = vrf->info) != NULL) - vty_show_ip_route_summary (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]); + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + if ((zvrf = vrf->info) != NULL) + vty_show_ip_route_summary(vty, + zvrf->table[AFI_IP6][SAFI_UNICAST]); - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (show_ipv6_mroute_vrf_all, @@ -3674,32 +3594,31 @@ DEFUN (show_ipv6_mroute_vrf_all, "IPv6 Multicast routing table\n" VRF_ALL_CMD_HELP_STR) { - struct route_table *table; - struct route_node *rn; - struct rib *rib; - struct vrf *vrf; - struct zebra_vrf *zvrf; - int first = 1; - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if ((zvrf = vrf->info) == NULL || - (table = zvrf->table[AFI_IP6][SAFI_MULTICAST]) == NULL) - continue; - - /* Show all IPv6 route. */ - for (rn = route_top (table); rn; rn = srcdest_route_next (rn)) - RNODE_FOREACH_RIB (rn, rib) - { - if (first) - { - vty_out (vty, SHOW_ROUTE_V6_HEADER); - first = 0; - } - vty_show_ip_route (vty, rn, rib, NULL); - } - } - return CMD_SUCCESS; + struct route_table *table; + struct route_node *rn; + struct rib *rib; + struct vrf *vrf; + struct zebra_vrf *zvrf; + int first = 1; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if ((zvrf = vrf->info) == NULL + || (table = zvrf->table[AFI_IP6][SAFI_MULTICAST]) == NULL) + continue; + + /* Show all IPv6 route. */ + for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) + RNODE_FOREACH_RIB(rn, rib) + { + if (first) { + vty_out(vty, SHOW_ROUTE_V6_HEADER); + first = 0; + } + vty_show_ip_route(vty, rn, rib, NULL); + } + } + return CMD_SUCCESS; } DEFUN (show_ipv6_route_vrf_all_summary_prefix, @@ -3712,93 +3631,107 @@ DEFUN (show_ipv6_route_vrf_all_summary_prefix, "Summary of all IPv6 routes\n" "Prefix routes\n") { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - if ((zvrf = vrf->info) != NULL) - vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]); + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + if ((zvrf = vrf->info) != NULL) + vty_show_ip_route_summary_prefix( + vty, zvrf->table[AFI_IP6][SAFI_UNICAST]); - return CMD_SUCCESS; + return CMD_SUCCESS; } /* Write IPv6 static route configuration. */ -static int -static_config_ipv6 (struct vty *vty) -{ - struct route_node *rn; - struct static_route *si; - int write = 0; - char buf[SRCDEST2STR_BUFFER]; - struct route_table *stable; - struct vrf *vrf; - struct zebra_vrf *zvrf; - - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if (!(zvrf = vrf->info)) - continue; - if ((stable = zvrf->stable[AFI_IP6][SAFI_UNICAST]) == NULL) - continue; - - for (rn = route_top (stable); rn; rn = srcdest_route_next (rn)) - for (si = rn->info; si; si = si->next) - { - vty_out (vty, "ipv6 route %s", srcdest_rnode2str (rn, buf, sizeof buf)); - - switch (si->type) - { - case STATIC_IPV4_GATEWAY: - vty_out (vty, " %s", inet_ntoa (si->addr.ipv4)); - break; - case STATIC_IPV6_GATEWAY: - vty_out (vty, " %s", inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ)); - break; - case STATIC_IFNAME: - vty_out (vty, " %s", si->ifname); - break; - case STATIC_BLACKHOLE: - vty_out (vty, " Null0" ); - break; - case STATIC_IPV6_GATEWAY_IFNAME: - vty_out (vty, " %s %s", - inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ), - ifindex2ifname (si->ifindex, si->vrf_id)); - 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); - - if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT) - vty_out (vty, " %d", si->distance); - - if (si->vrf_id != VRF_DEFAULT) - { - vty_out (vty, " vrf %s", zvrf_name (zvrf)); - } - - /* Label information */ - if (si->snh_label.num_labels) - vty_out (vty, " label %s", - mpls_label2str (si->snh_label.num_labels, - si->snh_label.label, buf, sizeof buf)); - - vty_out (vty, "%s", VTY_NEWLINE); - - write = 1; - } - } - return write; +static int static_config_ipv6(struct vty *vty) +{ + struct route_node *rn; + struct static_route *si; + int write = 0; + char buf[SRCDEST2STR_BUFFER]; + struct route_table *stable; + struct vrf *vrf; + struct zebra_vrf *zvrf; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if (!(zvrf = vrf->info)) + continue; + if ((stable = zvrf->stable[AFI_IP6][SAFI_UNICAST]) == NULL) + continue; + + for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) + for (si = rn->info; si; si = si->next) { + vty_out(vty, "ipv6 route %s", + srcdest_rnode2str(rn, buf, sizeof buf)); + + switch (si->type) { + case STATIC_IPV4_GATEWAY: + vty_out(vty, " %s", + inet_ntoa(si->addr.ipv4)); + break; + case STATIC_IPV6_GATEWAY: + vty_out(vty, " %s", + inet_ntop(AF_INET6, + &si->addr.ipv6, buf, + BUFSIZ)); + break; + case STATIC_IFNAME: + vty_out(vty, " %s", si->ifname); + break; + case STATIC_BLACKHOLE: + vty_out(vty, " Null0"); + break; + case STATIC_IPV6_GATEWAY_IFNAME: + vty_out(vty, " %s %s", + inet_ntop(AF_INET6, + &si->addr.ipv6, buf, + BUFSIZ), + ifindex2ifname(si->ifindex, + si->vrf_id)); + 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); + + if (si->distance + != ZEBRA_STATIC_DISTANCE_DEFAULT) + vty_out(vty, " %d", si->distance); + + if (si->vrf_id != VRF_DEFAULT) { + vty_out(vty, " vrf %s", + zvrf_name(zvrf)); + } + + /* Label information */ + if (si->snh_label.num_labels) + vty_out(vty, " label %s", + mpls_label2str( + si->snh_label + .num_labels, + si->snh_label.label, + buf, sizeof buf)); + + vty_out(vty, "%s", VTY_NEWLINE); + + write = 1; + } + } + return write; } DEFUN (allow_external_route_update, @@ -3806,9 +3739,9 @@ DEFUN (allow_external_route_update, "allow-external-route-update", "Allow FRR routes to be overwritten by external processes\n") { - allow_delete = 1; + allow_delete = 1; - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (no_allow_external_route_update, @@ -3817,9 +3750,9 @@ DEFUN (no_allow_external_route_update, NO_STR "Allow FRR routes to be overwritten by external processes\n") { - allow_delete = 0; + allow_delete = 0; - return CMD_SUCCESS; + return CMD_SUCCESS; } /* show vrf */ @@ -3829,40 +3762,39 @@ DEFUN (show_vrf, SHOW_STR "VRF\n") { - struct vrf *vrf; - struct zebra_vrf *zvrf; + struct vrf *vrf; + struct zebra_vrf *zvrf; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - if (!(zvrf = vrf->info)) - continue; - if (!zvrf_id (zvrf)) - continue; - - vty_out (vty, "vrf %s ", zvrf_name (zvrf)); - if (zvrf_id (zvrf) == VRF_UNKNOWN) - vty_out (vty, "inactive"); - else - vty_out (vty, "id %u table %u", zvrf_id (zvrf), zvrf->table_id); - vty_out (vty, "%s", VTY_NEWLINE); - - } + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if (!(zvrf = vrf->info)) + continue; + if (!zvrf_id(zvrf)) + continue; + + vty_out(vty, "vrf %s ", zvrf_name(zvrf)); + if (zvrf_id(zvrf) == VRF_UNKNOWN) + vty_out(vty, "inactive"); + else + vty_out(vty, "id %u table %u", zvrf_id(zvrf), + zvrf->table_id); + vty_out(vty, "%s", VTY_NEWLINE); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } /* Static ip route configuration write function. */ -static int -zebra_ip_config (struct vty *vty) +static int zebra_ip_config(struct vty *vty) { - int write = 0; + int write = 0; - write += static_config_ipv4 (vty, SAFI_UNICAST, "ip route"); - write += static_config_ipv4 (vty, SAFI_MULTICAST, "ip mroute"); - write += static_config_ipv6 (vty); + write += static_config_ipv4(vty, SAFI_UNICAST, "ip route"); + write += static_config_ipv4(vty, SAFI_MULTICAST, "ip mroute"); + write += static_config_ipv6(vty); - write += zebra_import_table_config (vty); - return write; + write += zebra_import_table_config(vty); + return write; } DEFUN (ip_zebra_import_table_distance, @@ -3876,30 +3808,33 @@ DEFUN (ip_zebra_import_table_distance, "route-map for filtering\n" "route-map name\n") { - u_int32_t table_id = 0; - - VTY_GET_INTEGER("table", table_id, argv[2]->arg); - int distance = ZEBRA_TABLE_DISTANCE_DEFAULT; - char *rmap = strmatch (argv[argc - 2]->text, "route-map") ? - XSTRDUP(MTYPE_ROUTE_MAP_NAME, argv[argc - 1]->arg) : NULL; - if (argc == 7 || (argc == 5 && !rmap)) - VTY_GET_INTEGER_RANGE("distance", distance, argv[4]->arg, 1, 255); - - if (!is_zebra_valid_kernel_table(table_id)) - { - vty_out(vty, "Invalid routing table ID, %d. Must be in range 1-252%s", - table_id, VTY_NEWLINE); - return CMD_WARNING; - } + u_int32_t table_id = 0; + + VTY_GET_INTEGER("table", table_id, argv[2]->arg); + int distance = ZEBRA_TABLE_DISTANCE_DEFAULT; + char *rmap = + strmatch(argv[argc - 2]->text, "route-map") + ? XSTRDUP(MTYPE_ROUTE_MAP_NAME, argv[argc - 1]->arg) + : NULL; + if (argc == 7 || (argc == 5 && !rmap)) + VTY_GET_INTEGER_RANGE("distance", distance, argv[4]->arg, 1, + 255); + + if (!is_zebra_valid_kernel_table(table_id)) { + vty_out(vty, + "Invalid routing table ID, %d. Must be in range 1-252%s", + table_id, VTY_NEWLINE); + return CMD_WARNING; + } - if (is_zebra_main_routing_table(table_id)) - { - vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s", - table_id, VTY_NEWLINE); - return CMD_WARNING; - } + if (is_zebra_main_routing_table(table_id)) { + vty_out(vty, + "Invalid routing table ID, %d. Must be non-default table%s", + table_id, VTY_NEWLINE); + return CMD_WARNING; + } - return (zebra_import_table(AFI_IP, table_id, distance, rmap, 1)); + return (zebra_import_table(AFI_IP, table_id, distance, rmap, 1)); } DEFUN (no_ip_zebra_import_table, @@ -3914,151 +3849,155 @@ DEFUN (no_ip_zebra_import_table, "route-map for filtering\n" "route-map name\n") { - u_int32_t table_id = 0; - VTY_GET_INTEGER("table", table_id, argv[3]->arg); + u_int32_t table_id = 0; + VTY_GET_INTEGER("table", table_id, argv[3]->arg); - if (!is_zebra_valid_kernel_table(table_id)) - { - vty_out(vty, "Invalid routing table ID. Must be in range 1-252%s", - VTY_NEWLINE); - return CMD_WARNING; - } + if (!is_zebra_valid_kernel_table(table_id)) { + vty_out(vty, + "Invalid routing table ID. Must be in range 1-252%s", + VTY_NEWLINE); + return CMD_WARNING; + } - if (is_zebra_main_routing_table(table_id)) - { - vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s", - table_id, VTY_NEWLINE); - return CMD_WARNING; - } + if (is_zebra_main_routing_table(table_id)) { + vty_out(vty, + "Invalid routing table ID, %d. Must be non-default table%s", + table_id, VTY_NEWLINE); + return CMD_WARNING; + } - if (!is_zebra_import_table_enabled(AFI_IP, table_id)) - return CMD_SUCCESS; + if (!is_zebra_import_table_enabled(AFI_IP, table_id)) + return CMD_SUCCESS; - return (zebra_import_table(AFI_IP, table_id, 0, NULL, 0)); + return (zebra_import_table(AFI_IP, table_id, 0, NULL, 0)); } -static int -config_write_protocol (struct vty *vty) +static int config_write_protocol(struct vty *vty) { - if (allow_delete) - vty_out(vty, "allow-external-route-update%s", VTY_NEWLINE); + if (allow_delete) + vty_out(vty, "allow-external-route-update%s", VTY_NEWLINE); - if (zebra_rnh_ip_default_route) - vty_out(vty, "ip nht resolve-via-default%s", VTY_NEWLINE); + if (zebra_rnh_ip_default_route) + vty_out(vty, "ip nht resolve-via-default%s", VTY_NEWLINE); - if (zebra_rnh_ipv6_default_route) - vty_out(vty, "ipv6 nht resolve-via-default%s", VTY_NEWLINE); + if (zebra_rnh_ipv6_default_route) + vty_out(vty, "ipv6 nht resolve-via-default%s", VTY_NEWLINE); - enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get (); + enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get(); - if (ipv4_multicast_mode != MCAST_NO_CONFIG) - vty_out (vty, "ip multicast rpf-lookup-mode %s%s", - ipv4_multicast_mode == MCAST_URIB_ONLY ? "urib-only" : - ipv4_multicast_mode == MCAST_MRIB_ONLY ? "mrib-only" : - ipv4_multicast_mode == MCAST_MIX_MRIB_FIRST ? "mrib-then-urib" : - ipv4_multicast_mode == MCAST_MIX_DISTANCE ? "lower-distance" : - "longer-prefix", - VTY_NEWLINE); + if (ipv4_multicast_mode != MCAST_NO_CONFIG) + vty_out(vty, "ip multicast rpf-lookup-mode %s%s", + ipv4_multicast_mode == MCAST_URIB_ONLY + ? "urib-only" + : ipv4_multicast_mode == MCAST_MRIB_ONLY + ? "mrib-only" + : ipv4_multicast_mode + == MCAST_MIX_MRIB_FIRST + ? "mrib-then-urib" + : ipv4_multicast_mode + == MCAST_MIX_DISTANCE + ? "lower-distance" + : "longer-prefix", + VTY_NEWLINE); - zebra_routemap_config_write_protocol(vty); + zebra_routemap_config_write_protocol(vty); - return 1; + return 1; } /* IP node for static routes. */ -static struct cmd_node ip_node = { IP_NODE, "", 1 }; -static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 }; +static struct cmd_node ip_node = {IP_NODE, "", 1}; +static struct cmd_node protocol_node = {PROTOCOL_NODE, "", 1}; /* Route VTY. */ -void -zebra_vty_init (void) -{ - install_node (&ip_node, zebra_ip_config); - install_node (&protocol_node, config_write_protocol); - - install_element (CONFIG_NODE, &allow_external_route_update_cmd); - install_element (CONFIG_NODE, &no_allow_external_route_update_cmd); - install_element (CONFIG_NODE, &ip_mroute_dist_cmd); - install_element (CONFIG_NODE, &no_ip_mroute_dist_cmd); - install_element (CONFIG_NODE, &ip_multicast_mode_cmd); - install_element (CONFIG_NODE, &no_ip_multicast_mode_cmd); - install_element (CONFIG_NODE, &ip_route_cmd); - install_element (CONFIG_NODE, &ip_route_flags_cmd); - install_element (CONFIG_NODE, &ip_route_mask_cmd); - install_element (CONFIG_NODE, &ip_route_mask_flags_cmd); - install_element (CONFIG_NODE, &no_ip_route_cmd); - install_element (CONFIG_NODE, &no_ip_route_mask_cmd); - install_element (CONFIG_NODE, &ip_zebra_import_table_distance_cmd); - install_element (CONFIG_NODE, &no_ip_zebra_import_table_cmd); - - install_element (VIEW_NODE, &show_vrf_cmd); - install_element (VIEW_NODE, &show_ip_route_cmd); - install_element (VIEW_NODE, &show_ip_route_ospf_instance_cmd); - install_element (VIEW_NODE, &show_ip_route_tag_cmd); - install_element (VIEW_NODE, &show_ip_nht_cmd); - install_element (VIEW_NODE, &show_ip_nht_vrf_all_cmd); - install_element (VIEW_NODE, &show_ipv6_nht_cmd); - install_element (VIEW_NODE, &show_ipv6_nht_vrf_all_cmd); - install_element (VIEW_NODE, &show_ip_route_addr_cmd); - install_element (VIEW_NODE, &show_ip_route_prefix_cmd); - install_element (VIEW_NODE, &show_ip_route_prefix_longer_cmd); - install_element (VIEW_NODE, &show_ip_route_protocol_cmd); - install_element (VIEW_NODE, &show_ip_route_supernets_cmd); - install_element (VIEW_NODE, &show_ip_route_summary_cmd); - install_element (VIEW_NODE, &show_ip_route_summary_prefix_cmd); - - install_element (VIEW_NODE, &show_ip_rpf_cmd); - install_element (VIEW_NODE, &show_ip_rpf_addr_cmd); - - /* Commands for VRF */ - - install_element (CONFIG_NODE, &no_ip_route_flags_cmd); - install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd); - - install_element (VIEW_NODE, &show_ip_route_vrf_cmd); - - install_element (VIEW_NODE, &show_ip_route_vrf_all_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_tag_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_addr_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_prefix_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_prefix_longer_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_protocol_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_supernets_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_summary_cmd); - install_element (VIEW_NODE, &show_ip_route_vrf_all_summary_prefix_cmd); - - install_element (CONFIG_NODE, &ipv6_route_cmd); - install_element (CONFIG_NODE, &ipv6_route_flags_cmd); - install_element (CONFIG_NODE, &ipv6_route_ifname_cmd); - install_element (CONFIG_NODE, &ipv6_route_ifname_flags_cmd); - install_element (CONFIG_NODE, &no_ipv6_route_cmd); - install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd); - install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd); - install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd); - install_element (CONFIG_NODE, &ip_nht_default_route_cmd); - install_element (CONFIG_NODE, &no_ip_nht_default_route_cmd); - install_element (CONFIG_NODE, &ipv6_nht_default_route_cmd); - install_element (CONFIG_NODE, &no_ipv6_nht_default_route_cmd); - install_element (VIEW_NODE, &show_ipv6_route_cmd); - install_element (VIEW_NODE, &show_ipv6_route_tag_cmd); - install_element (VIEW_NODE, &show_ipv6_route_summary_cmd); - install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_cmd); - install_element (VIEW_NODE, &show_ipv6_route_protocol_cmd); - install_element (VIEW_NODE, &show_ipv6_route_addr_cmd); - install_element (VIEW_NODE, &show_ipv6_route_prefix_cmd); - install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_cmd); - - install_element (VIEW_NODE, &show_ipv6_mroute_cmd); - - /* Commands for VRF */ - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_tag_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_summary_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_summary_prefix_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_protocol_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_addr_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_prefix_cmd); - install_element (VIEW_NODE, &show_ipv6_route_vrf_all_prefix_longer_cmd); - - install_element (VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd); +void zebra_vty_init(void) +{ + install_node(&ip_node, zebra_ip_config); + install_node(&protocol_node, config_write_protocol); + + install_element(CONFIG_NODE, &allow_external_route_update_cmd); + install_element(CONFIG_NODE, &no_allow_external_route_update_cmd); + install_element(CONFIG_NODE, &ip_mroute_dist_cmd); + install_element(CONFIG_NODE, &no_ip_mroute_dist_cmd); + install_element(CONFIG_NODE, &ip_multicast_mode_cmd); + install_element(CONFIG_NODE, &no_ip_multicast_mode_cmd); + install_element(CONFIG_NODE, &ip_route_cmd); + install_element(CONFIG_NODE, &ip_route_flags_cmd); + install_element(CONFIG_NODE, &ip_route_mask_cmd); + install_element(CONFIG_NODE, &ip_route_mask_flags_cmd); + install_element(CONFIG_NODE, &no_ip_route_cmd); + install_element(CONFIG_NODE, &no_ip_route_mask_cmd); + install_element(CONFIG_NODE, &ip_zebra_import_table_distance_cmd); + install_element(CONFIG_NODE, &no_ip_zebra_import_table_cmd); + + install_element(VIEW_NODE, &show_vrf_cmd); + install_element(VIEW_NODE, &show_ip_route_cmd); + install_element(VIEW_NODE, &show_ip_route_ospf_instance_cmd); + install_element(VIEW_NODE, &show_ip_route_tag_cmd); + install_element(VIEW_NODE, &show_ip_nht_cmd); + install_element(VIEW_NODE, &show_ip_nht_vrf_all_cmd); + install_element(VIEW_NODE, &show_ipv6_nht_cmd); + install_element(VIEW_NODE, &show_ipv6_nht_vrf_all_cmd); + install_element(VIEW_NODE, &show_ip_route_addr_cmd); + install_element(VIEW_NODE, &show_ip_route_prefix_cmd); + install_element(VIEW_NODE, &show_ip_route_prefix_longer_cmd); + install_element(VIEW_NODE, &show_ip_route_protocol_cmd); + install_element(VIEW_NODE, &show_ip_route_supernets_cmd); + install_element(VIEW_NODE, &show_ip_route_summary_cmd); + install_element(VIEW_NODE, &show_ip_route_summary_prefix_cmd); + + install_element(VIEW_NODE, &show_ip_rpf_cmd); + install_element(VIEW_NODE, &show_ip_rpf_addr_cmd); + + /* Commands for VRF */ + + install_element(CONFIG_NODE, &no_ip_route_flags_cmd); + install_element(CONFIG_NODE, &no_ip_route_mask_flags_cmd); + + install_element(VIEW_NODE, &show_ip_route_vrf_cmd); + + install_element(VIEW_NODE, &show_ip_route_vrf_all_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_tag_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_addr_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_prefix_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_prefix_longer_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_protocol_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_supernets_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_summary_cmd); + install_element(VIEW_NODE, &show_ip_route_vrf_all_summary_prefix_cmd); + + install_element(CONFIG_NODE, &ipv6_route_cmd); + install_element(CONFIG_NODE, &ipv6_route_flags_cmd); + install_element(CONFIG_NODE, &ipv6_route_ifname_cmd); + install_element(CONFIG_NODE, &ipv6_route_ifname_flags_cmd); + install_element(CONFIG_NODE, &no_ipv6_route_cmd); + install_element(CONFIG_NODE, &no_ipv6_route_flags_cmd); + install_element(CONFIG_NODE, &no_ipv6_route_ifname_cmd); + install_element(CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd); + install_element(CONFIG_NODE, &ip_nht_default_route_cmd); + install_element(CONFIG_NODE, &no_ip_nht_default_route_cmd); + install_element(CONFIG_NODE, &ipv6_nht_default_route_cmd); + install_element(CONFIG_NODE, &no_ipv6_nht_default_route_cmd); + install_element(VIEW_NODE, &show_ipv6_route_cmd); + install_element(VIEW_NODE, &show_ipv6_route_tag_cmd); + install_element(VIEW_NODE, &show_ipv6_route_summary_cmd); + install_element(VIEW_NODE, &show_ipv6_route_summary_prefix_cmd); + install_element(VIEW_NODE, &show_ipv6_route_protocol_cmd); + install_element(VIEW_NODE, &show_ipv6_route_addr_cmd); + install_element(VIEW_NODE, &show_ipv6_route_prefix_cmd); + install_element(VIEW_NODE, &show_ipv6_route_prefix_longer_cmd); + + install_element(VIEW_NODE, &show_ipv6_mroute_cmd); + + /* Commands for VRF */ + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_tag_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_summary_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_summary_prefix_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_protocol_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_addr_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_prefix_cmd); + install_element(VIEW_NODE, &show_ipv6_route_vrf_all_prefix_longer_cmd); + + install_element(VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd); } |
