diff options
Diffstat (limited to 'bgpd/bgp_route.c')
-rw-r--r-- | bgpd/bgp_route.c | 230 |
1 files changed, 115 insertions, 115 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 31c1dd8c1..15367ec7c 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -35,7 +35,6 @@ #include "thread.h" #include "workqueue.h" #include "queue.h" -#include "mpls.h" #include "memory.h" #include "lib/json.h" @@ -117,6 +116,7 @@ bgp_info_extra_new (void) { struct bgp_info_extra *new; new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra)); + new->label = MPLS_INVALID_LABEL; return new; } @@ -694,7 +694,17 @@ bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist, /* 11. Maximum path check. */ if (newm == existm) { - if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) + /* If one path has a label but the other does not, do not treat + * them as equals for multipath + */ + if ((new->extra && bgp_is_valid_label(&new->extra->label)) != + (exist->extra && bgp_is_valid_label(&exist->extra->label))) + { + if (debug) + zlog_debug("%s: %s and %s cannot be multipath, one has a label while the other does not", + pfx_buf, new_buf, exist_buf); + } + else if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) { /* @@ -1271,14 +1281,14 @@ subgroup_announce_check (struct bgp_node *rn, struct bgp_info *ri, /* If it's labeled safi, make sure the route has a valid label. */ if (safi == SAFI_LABELED_UNICAST) { - u_char *tag = bgp_adv_label(rn, ri, peer, afi, safi); - if (!bgp_is_valid_label(tag)) + mpls_label_t label = bgp_adv_label(rn, ri, peer, afi, safi); + if (!bgp_is_valid_label(&label)) { if (bgp_debug_update(NULL, p, subgrp->update_group, 0)) zlog_debug ("u%" PRIu64 ":s%" PRIu64 " %s/%d is filtered - no label (%p)", subgrp->update_group->id, subgrp->id, inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN), - p->prefixlen, tag); + p->prefixlen, &label); return 0; } } @@ -1940,7 +1950,7 @@ bgp_process_main (struct work_queue *wq, void *data) * Right now, since we only deal with per-prefix labels, it is not necessary * to do this upon changes to best path except of the label index changes. */ - if (safi == SAFI_LABELED_UNICAST) + if (safi == SAFI_UNICAST) { bgp_table_lock (bgp_node_table (rn)); if (new_select) @@ -1955,8 +1965,8 @@ bgp_process_main (struct work_queue *wq, void *data) { if (CHECK_FLAG (rn->flags, BGP_NODE_REGISTERED_FOR_LABEL)) bgp_unregister_for_label (rn); - label_ntop (MPLS_IMP_NULL_LABEL, 1, rn->local_label); - bgp_set_valid_label(rn->local_label); + label_ntop (MPLS_IMP_NULL_LABEL, 1, &rn->local_label); + bgp_set_valid_label(&rn->local_label); } else bgp_register_for_label (rn, new_select); @@ -1997,6 +2007,10 @@ bgp_process_main (struct work_queue *wq, void *data) { group_announce_route(bgp, afi, safi, rn, new_select); + /* unicast routes must also be annouced to labeled-unicast update-groups */ + if (safi == SAFI_UNICAST) + group_announce_route(bgp, afi, SAFI_LABELED_UNICAST, rn, new_select); + UNSET_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED); UNSET_FLAG (rn->flags, BGP_NODE_LABEL_CHANGED); } @@ -2049,6 +2063,10 @@ bgp_process_main (struct work_queue *wq, void *data) group_announce_route(bgp, afi, safi, rn, new_select); + /* unicast routes must also be annouced to labeled-unicast update-groups */ + if (safi == SAFI_UNICAST) + group_announce_route(bgp, afi, SAFI_LABELED_UNICAST, rn, new_select); + /* FIB update. */ if (bgp_fibupd_safi(safi) && (bgp->inst_type != BGP_INSTANCE_TYPE_VIEW) && @@ -2464,7 +2482,7 @@ bgp_update_martian_nexthop (struct bgp *bgp, afi_t afi, safi_t safi, struct attr int bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, struct attr *attr, afi_t afi, safi_t safi, int type, - int sub_type, struct prefix_rd *prd, u_char *tag, + int sub_type, struct prefix_rd *prd, mpls_label_t *label, int soft_reconfig, struct bgp_route_evpn* evpn) { int ret; @@ -2481,18 +2499,24 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, char label_buf[20]; int connected = 0; int do_loop_check = 1; + int has_valid_label = 0; #if ENABLE_BGP_VNC int vnc_implicit_withdraw = 0; #endif memset (&new_attr, 0, sizeof(struct attr)); memset (&new_extra, 0, sizeof(struct attr_extra)); + new_extra.label_index = BGP_INVALID_LABEL_INDEX; + new_extra.label = MPLS_INVALID_LABEL; bgp = peer->bgp; rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd); label_buf[0] = '\0'; - if (bgp_labeled_safi(safi)) - sprintf (label_buf, "label %u", label_pton(tag)); + + has_valid_label = bgp_is_valid_label(label); + + if (has_valid_label) + sprintf (label_buf, "label %u", label_pton(label)); /* When peer's soft reconfiguration enabled. Record input packet in Adj-RIBs-In. */ @@ -2592,8 +2616,8 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, /* Same attribute comes in. */ if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED) && attrhash_cmp (ri->attr, attr_new) - && (!bgp_labeled_safi(safi) || - memcmp ((bgp_info_extra_get (ri))->tag, tag, 3) == 0) + && (!has_valid_label || + memcmp (&(bgp_info_extra_get (ri))->label, label, BGP_LABEL_BYTES) == 0) && (overlay_index_equal(afi, ri, evpn==NULL?NULL:&evpn->eth_s_id, evpn==NULL?NULL:&evpn->gw_ip))) { @@ -2714,9 +2738,12 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, bgp_attr_unintern (&ri->attr); ri->attr = attr_new; - /* Update MPLS tag. */ - if (bgp_labeled_safi(safi)) - memcpy ((bgp_info_extra_get (ri))->tag, tag, 3); + /* Update MPLS label */ + if (has_valid_label) + { + memcpy (&(bgp_info_extra_get (ri))->label, label, BGP_LABEL_BYTES); + bgp_set_valid_label(&(bgp_info_extra_get (ri))->label); + } #if ENABLE_BGP_VNC if ((afi == AFI_IP || afi == AFI_IP6) && (safi == SAFI_UNICAST)) @@ -2814,10 +2841,10 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, #if ENABLE_BGP_VNC if (SAFI_MPLS_VPN == safi) { - uint32_t label = decode_label(tag); + mpls_label_t label_decoded = decode_label(label); rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type, sub_type, - &label); + &label_decoded); } if (SAFI_ENCAP == safi) { @@ -2846,9 +2873,12 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, /* Make new BGP info. */ new = info_make(type, sub_type, 0, peer, attr_new, rn); - /* Update MPLS tag. */ - if (bgp_labeled_safi(safi)) - memcpy ((bgp_info_extra_get (new))->tag, tag, 3); + /* Update MPLS label */ + if (has_valid_label) + { + memcpy (&(bgp_info_extra_get (new))->label, label, BGP_LABEL_BYTES); + bgp_set_valid_label(&(bgp_info_extra_get (new))->label); + } /* Update Overlay Index */ if(afi == AFI_L2VPN) @@ -2928,10 +2958,10 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, #if ENABLE_BGP_VNC if (SAFI_MPLS_VPN == safi) { - uint32_t label = decode_label(tag); + mpls_label_t label_decoded = decode_label(label); rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type, sub_type, - &label); + &label_decoded); } if (SAFI_ENCAP == safi) { @@ -2981,7 +3011,7 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id, int bgp_withdraw (struct peer *peer, struct prefix *p, u_int32_t addpath_id, struct attr *attr, afi_t afi, safi_t safi, int type, int sub_type, - struct prefix_rd *prd, u_char *tag, struct bgp_route_evpn *evpn) + struct prefix_rd *prd, mpls_label_t *label, struct bgp_route_evpn *evpn) { struct bgp *bgp; char pfx_buf[BGP_PRD_PATH_STRLEN]; @@ -3169,11 +3199,11 @@ bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi, if (ain->peer == peer) { struct bgp_info *ri = rn->info; - u_char *tag = (ri && ri->extra) ? ri->extra->tag : NULL; + mpls_label_t label = (ri && ri->extra) ? ri->extra->label : MPLS_INVALID_LABEL; ret = bgp_update (peer, &rn->p, ain->addpath_rx_id, ain->attr, afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, - prd, tag, 1, NULL); + prd, &label, 1, NULL); if (ret < 0) { @@ -4021,7 +4051,7 @@ bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi, */ static void bgp_static_withdraw_safi (struct bgp *bgp, struct prefix *p, afi_t afi, - safi_t safi, struct prefix_rd *prd, u_char *tag) + safi_t safi, struct prefix_rd *prd) { struct bgp_node *rn; struct bgp_info *ri; @@ -4134,8 +4164,7 @@ bgp_static_update_safi (struct bgp *bgp, struct prefix *p, /* Unintern original. */ aspath_unintern (&attr.aspath); bgp_attr_extra_free (&attr); - bgp_static_withdraw_safi (bgp, p, afi, safi, &bgp_static->prd, - bgp_static->tag); + bgp_static_withdraw_safi (bgp, p, afi, safi, &bgp_static->prd); return; } @@ -4204,9 +4233,9 @@ bgp_static_update_safi (struct bgp *bgp, struct prefix *p, rn); SET_FLAG (new->flags, BGP_INFO_VALID); new->extra = bgp_info_extra_new(); - memcpy (new->extra->tag, bgp_static->tag, 3); + new->extra->label = bgp_static->label; #if ENABLE_BGP_VNC - label = decode_label (bgp_static->tag); + label = decode_label (bgp_static->label); #endif /* Aggregate address increment. */ @@ -4437,8 +4466,7 @@ bgp_static_delete (struct bgp *bgp) bgp_static = rm->info; bgp_static_withdraw_safi (bgp, &rm->p, AFI_IP, safi, - (struct prefix_rd *)&rn->p, - bgp_static->tag); + (struct prefix_rd *)&rn->p); bgp_static_free (bgp_static); rn->info = NULL; bgp_unlock_node (rn); @@ -4552,7 +4580,7 @@ bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str struct bgp_node *rn; struct bgp_table *table; struct bgp_static *bgp_static; - u_char tag[3]; + mpls_label_t label = MPLS_INVALID_LABEL; struct prefix gw_ip; /* validate ip prefix */ @@ -4580,13 +4608,10 @@ bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str if (label_str) { unsigned long label_val; - VTY_GET_INTEGER_RANGE("Label/tag", label_val, label_str, 0, 16777215); - encode_label (label_val, tag); - } - else - { - memset (tag, 0, sizeof(tag)); /* empty, not even BoS */ + VTY_GET_INTEGER_RANGE("Label", label_val, label_str, 0, 16777215); + encode_label (label_val, &label); } + if (safi == SAFI_EVPN) { if( esi && str2esi (esi, NULL) == 0) @@ -4639,7 +4664,7 @@ bgp_static_set_safi (afi_t afi, safi_t safi, struct vty *vty, const char *ip_str bgp_static->valid = 0; bgp_static->igpmetric = 0; bgp_static->igpnexthop.s_addr = 0; - memcpy(bgp_static->tag, tag, 3); + bgp_static->label = label; bgp_static->prd = prd; if (rmap_str) @@ -4688,7 +4713,7 @@ bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, const char *ip_st struct bgp_node *rn; struct bgp_table *table; struct bgp_static *bgp_static; - u_char tag[3]; + mpls_label_t label = MPLS_INVALID_LABEL; /* Convert IP prefix string to struct prefix. */ ret = str2prefix (ip_str, &p); @@ -4714,12 +4739,8 @@ bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, const char *ip_st if (label_str) { unsigned long label_val; - VTY_GET_INTEGER_RANGE("Label/tag", label_val, label_str, 0, MPLS_LABEL_MAX); - encode_label (label_val, tag); - } - else - { - memset (tag, 0, sizeof(tag)); /* empty, not even BoS */ + VTY_GET_INTEGER_RANGE("Label", label_val, label_str, 0, MPLS_LABEL_MAX); + encode_label (label_val, &label); } prn = bgp_node_get (bgp->route[afi][safi], @@ -4734,7 +4755,7 @@ bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, const char *ip_st if (rn) { - bgp_static_withdraw_safi (bgp, &p, afi, safi, &prd, tag); + bgp_static_withdraw_safi (bgp, &p, afi, safi, &prd); bgp_static = rn->info; bgp_static_free (bgp_static); @@ -6658,7 +6679,7 @@ route_vty_out_tag (struct vty *vty, struct prefix *p, { json_object *json_out = NULL; struct attr *attr; - u_int32_t label = 0; + mpls_label_t label = MPLS_INVALID_LABEL; if (!binfo->extra) return; @@ -6741,19 +6762,20 @@ route_vty_out_tag (struct vty *vty, struct prefix *p, } } - label = decode_label (binfo->extra->tag); + label = decode_label (&binfo->extra->label); - if (json) + // dwalton why is this called 'notag'? + if (bgp_is_valid_label(&label)) { - if (label) - json_object_int_add(json_out, "notag", label); - json_object_array_add(json, json_out); - } - else - { - vty_out (vty, "notag/%d", label); - - vty_out (vty, "%s", VTY_NEWLINE); + if (json) + { + json_object_int_add(json_out, "notag", label); + json_object_array_add(json, json_out); + } + else + { + vty_out (vty, "notag/%d%s", label, VTY_NEWLINE); + } } } @@ -7642,10 +7664,10 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p, if (binfo->extra && binfo->extra->damp_info) bgp_damp_info_vty (vty, binfo, json_path); - /* Remove Label */ - if (bgp_labeled_safi(safi) && binfo->extra) + /* Remote Label */ + if (binfo->extra && bgp_is_valid_label(&binfo->extra->label)) { - uint32_t label = label_pton(binfo->extra->tag); + mpls_label_t label = label_pton(&binfo->extra->label); if (json_paths) json_object_int_add(json_path, "remoteLabel", label); else @@ -8124,12 +8146,21 @@ route_vty_out_detail_header (struct vty *vty, struct bgp *bgp, int no_advertise = 0; int local_as = 0; int first = 1; + int has_valid_label = 0; + uint32_t label = 0; json_object *json_adv_to = NULL; p = &rn->p; + has_valid_label = bgp_is_valid_label(&rn->local_label); + + if (has_valid_label) + label = label_pton(&rn->local_label); if (json) { + if (has_valid_label) + json_object_int_add(json, "localLabel", label); + json_object_string_add(json, "prefix", inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN)); json_object_int_add(json, "prefixlen", p->prefixlen); } @@ -8146,17 +8177,10 @@ route_vty_out_detail_header (struct vty *vty, struct bgp *bgp, buf2, p->prefixlen, VTY_NEWLINE); - if (bgp_labeled_safi(safi)) - { - vty_out(vty, "Local label: "); - if (!bgp_is_valid_label(rn->local_label)) - vty_out(vty, "not allocated%s", VTY_NEWLINE); - else - { - uint32_t label = label_pton(rn->local_label); - vty_out(vty, "%d%s", label, VTY_NEWLINE); - } - } + if (has_valid_label) + vty_out(vty, "Local label: %d%s", label, VTY_NEWLINE); + else if (bgp_labeled_safi(safi)) + vty_out(vty, "Local label: not allocated%s", VTY_NEWLINE); } for (ri = rn->info; ri; ri = ri->next) @@ -8438,17 +8462,13 @@ bgp_show_lcommunity_list (struct vty *vty, struct bgp *bgp, const char *lcom, DEFUN (show_ip_bgp_large_community_list, show_ip_bgp_large_community_list_cmd, - "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]] large-community-list <(1-500)|WORD> [json]", + "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] large-community-list <(1-500)|WORD> [json]", SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR - "Address Family\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_AFI_HELP_STR + BGP_SAFI_HELP_STR "Display routes matching the large-community-list\n" "large-community-list number\n" "large-community-list name\n" @@ -8484,17 +8504,13 @@ DEFUN (show_ip_bgp_large_community_list, } DEFUN (show_ip_bgp_large_community, show_ip_bgp_large_community_cmd, - "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]] large-community [AA:BB:CC] [json]", + "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] large-community [AA:BB:CC] [json]", SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR - "Address Family\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_AFI_HELP_STR + BGP_SAFI_HELP_STR "Display routes matching the large-communities\n" "List of large-community numbers\n" JSON_STR) @@ -9437,18 +9453,14 @@ bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, u_c DEFUN (show_ip_bgp_instance_neighbor_prefix_counts, show_ip_bgp_instance_neighbor_prefix_counts_cmd, - "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]] " + "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] " "neighbors <A.B.C.D|X:X::X:X|WORD> prefix-counts [json]", SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR - "Address Family\n" - "Address Family\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family modifier\n" - "Address Family modifier\n" + BGP_AFI_HELP_STR + BGP_SAFI_HELP_STR "Address Family modifier\n" "Detailed information on TCP and BGP neighbor connections\n" "Neighbor to display information about\n" @@ -10638,7 +10650,7 @@ bgp_config_write_network_vpn (struct vty *vty, struct bgp *bgp, struct prefix *p; struct prefix_rd *prd; struct bgp_static *bgp_static; - u_int32_t label; + mpls_label_t label; char buf[SU_ADDRSTRLEN]; char rdbuf[RD_ADDRSTRLEN]; @@ -10656,7 +10668,7 @@ bgp_config_write_network_vpn (struct vty *vty, struct bgp *bgp, /* "network" configuration display. */ prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN); - label = decode_label (bgp_static->tag); + label = decode_label (&bgp_static->label); vty_out (vty, " network %s/%d rd %s", inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN), @@ -10717,7 +10729,7 @@ bgp_config_write_network_evpn (struct vty *vty, struct bgp *bgp, prefix2str (p, buf, sizeof (buf)), vty_out (vty, " network %s rd %s ethtag %u tag %u esi %s gwip %s routermac %s", buf, rdbuf, p->u.prefix_evpn.eth_tag, - decode_label (bgp_static->tag), esi, buf2 , macrouter); + decode_label (&bgp_static->label), esi, buf2 , macrouter); vty_out (vty, "%s", VTY_NEWLINE); if (macrouter) XFREE (MTYPE_TMP, macrouter); @@ -10911,8 +10923,10 @@ bgp_route_init (void) install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd); install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd); install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd); - install_element (BGP_IPV4L_NODE, &no_bgp_network_label_index_cmd); - install_element (BGP_IPV4L_NODE, &no_bgp_network_label_index_route_map_cmd); + install_element (BGP_IPV4_NODE, &bgp_network_label_index_cmd); + install_element (BGP_IPV4_NODE, &bgp_network_label_index_route_map_cmd); + install_element (BGP_IPV4_NODE, &no_bgp_network_label_index_cmd); + install_element (BGP_IPV4_NODE, &no_bgp_network_label_index_route_map_cmd); install_element (BGP_IPV4_NODE, &no_bgp_table_map_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_cmd); install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd); @@ -10941,20 +10955,6 @@ bgp_route_init (void) install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd); /* IPv4 labeled-unicast configuration. */ - install_element (BGP_IPV4L_NODE, &bgp_table_map_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_mask_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_mask_natural_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_route_map_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_mask_route_map_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_mask_natural_route_map_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_label_index_cmd); - install_element (BGP_IPV4L_NODE, &bgp_network_label_index_route_map_cmd); - install_element (BGP_IPV4L_NODE, &no_bgp_table_map_cmd); - install_element (BGP_IPV4L_NODE, &no_bgp_network_cmd); - install_element (BGP_IPV4L_NODE, &no_bgp_network_mask_cmd); - install_element (BGP_IPV4L_NODE, &no_bgp_network_mask_natural_cmd); - install_element (VIEW_NODE, &show_ip_bgp_instance_all_cmd); install_element (VIEW_NODE, &show_ip_bgp_cmd); install_element (VIEW_NODE, &show_ip_bgp_route_cmd); |