bgp_route.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:275k
- SET_FLAG (ri->flags, BGP_INFO_ATTR_CHANGED);
- match++;
- }
- /* as-set aggregate route generate origin, as path,
- community aggregation. */
- if (aggregate->as_set)
- {
- if (origin < ri->attr->origin)
- origin = ri->attr->origin;
- if (aspath)
- {
- asmerge = aspath_aggregate (aspath, ri->attr->aspath);
- aspath_free (aspath);
- aspath = asmerge;
- }
- else
- aspath = aspath_dup (ri->attr->aspath);
- if (ri->attr->community)
- {
- if (community)
- {
- commerge = community_merge (community,
- ri->attr->community);
- community = community_uniq_sort (commerge);
- community_free (commerge);
- }
- else
- community = community_dup (ri->attr->community);
- }
- }
- aggregate->count++;
- }
- }
-
- /* If this node is suppressed, process the change. */
- if (match)
- bgp_process (bgp, rn, afi, safi);
- }
- bgp_unlock_node (top);
- /* Add aggregate route to BGP table. */
- if (aggregate->count)
- {
- rn = bgp_node_get (table, p);
- new = bgp_info_new ();
- new->type = ZEBRA_ROUTE_BGP;
- new->sub_type = BGP_ROUTE_AGGREGATE;
- new->peer = bgp->peer_self;
- SET_FLAG (new->flags, BGP_INFO_VALID);
- new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
- new->uptime = time (NULL);
- bgp_info_add (rn, new);
- /* Process change. */
- bgp_process (bgp, rn, afi, safi);
- }
- }
- void
- bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
- safi_t safi, struct bgp_aggregate *aggregate)
- {
- struct bgp_table *table;
- struct bgp_node *top;
- struct bgp_node *rn;
- struct bgp_info *ri;
- unsigned long match;
- table = bgp->rib[afi][safi];
- if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
- return;
- if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
- return;
- /* If routes exists below this node, generate aggregate routes. */
- top = bgp_node_get (table, p);
- for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
- if (rn->p.prefixlen > p->prefixlen)
- {
- match = 0;
- for (ri = rn->info; ri; ri = ri->next)
- {
- if (BGP_INFO_HOLDDOWN (ri))
- continue;
- if (ri->sub_type != BGP_ROUTE_AGGREGATE)
- {
- if (aggregate->summary_only)
- {
- ri->suppress--;
- if (ri->suppress == 0)
- {
- SET_FLAG (ri->flags, BGP_INFO_ATTR_CHANGED);
- match++;
- }
- }
- aggregate->count--;
- }
- }
- /* If this node is suppressed, process the change. */
- if (match)
- bgp_process (bgp, rn, afi, safi);
- }
- bgp_unlock_node (top);
- /* Delete aggregate route from BGP table. */
- rn = bgp_node_get (table, p);
- for (ri = rn->info; ri; ri = ri->next)
- if (ri->peer == bgp->peer_self
- && ri->type == ZEBRA_ROUTE_BGP
- && ri->sub_type == BGP_ROUTE_AGGREGATE)
- break;
- /* Withdraw static BGP route from routing table. */
- if (ri)
- {
- UNSET_FLAG (ri->flags, BGP_INFO_VALID);
- bgp_process (bgp, rn, afi, safi);
- bgp_info_delete (rn, ri);
- bgp_info_free (ri);
- bgp_unlock_node (rn);
- }
- /* Unlock bgp_node_lookup. */
- bgp_unlock_node (rn);
- }
- /* Aggregate route attribute. */
- #define AGGREGATE_SUMMARY_ONLY 1
- #define AGGREGATE_AS_SET 1
- int
- bgp_aggregate_set (struct vty *vty, char *prefix_str, afi_t afi, safi_t safi,
- u_char summary_only, u_char as_set)
- {
- int ret;
- struct prefix p;
- struct bgp_node *rn;
- struct bgp *bgp;
- struct bgp_aggregate *aggregate;
- /* Convert string to prefix structure. */
- ret = str2prefix (prefix_str, &p);
- if (!ret)
- {
- vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- apply_mask (&p);
- /* Get BGP structure. */
- bgp = vty->index;
- /* Old configuration check. */
- rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
- if (rn->info)
- {
- vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
- bgp_unlock_node (rn);
- return CMD_WARNING;
- }
- /* Make aggregate address structure. */
- aggregate = bgp_aggregate_new ();
- aggregate->summary_only = summary_only;
- aggregate->as_set = as_set;
- aggregate->safi = safi;
- rn->info = aggregate;
- /* Aggregate address insert into BGP routing table. */
- if (safi & SAFI_UNICAST)
- bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
- if (safi & SAFI_MULTICAST)
- bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
- return CMD_SUCCESS;
- }
- int
- bgp_aggregate_unset (struct vty *vty, char *prefix_str, afi_t afi, safi_t safi)
- {
- int ret;
- struct prefix p;
- struct bgp_node *rn;
- struct bgp *bgp;
- struct bgp_aggregate *aggregate;
- /* Convert string to prefix structure. */
- ret = str2prefix (prefix_str, &p);
- if (!ret)
- {
- vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- apply_mask (&p);
- /* Get BGP structure. */
- bgp = vty->index;
- /* Old configuration check. */
- rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
- if (! rn)
- {
- vty_out (vty, "%% There is no aggregate-address configuration.%s",
- VTY_NEWLINE);
- return CMD_WARNING;
- }
- aggregate = rn->info;
- if (aggregate->safi & SAFI_UNICAST)
- bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
- if (aggregate->safi & SAFI_MULTICAST)
- bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
- /* Unlock aggregate address configuration. */
- rn->info = NULL;
- bgp_aggregate_free (aggregate);
- bgp_unlock_node (rn);
- bgp_unlock_node (rn);
- return CMD_SUCCESS;
- }
- DEFUN (aggregate_address,
- aggregate_address_cmd,
- "aggregate-address A.B.C.D/M",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn")
- {
- return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
- }
- DEFUN (aggregate_address_mask,
- aggregate_address_mask_cmd,
- "aggregate-address A.B.C.D A.B.C.D",
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn")
- {
- int ret;
- char prefix_str[BUFSIZ];
- ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
- if (! ret)
- {
- vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
- 0, 0);
- }
- DEFUN (aggregate_address_summary_only,
- aggregate_address_summary_only_cmd,
- "aggregate-address A.B.C.D/M summary-only",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn")
- {
- return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
- AGGREGATE_SUMMARY_ONLY, 0);
- }
- DEFUN (aggregate_address_mask_summary_only,
- aggregate_address_mask_summary_only_cmd,
- "aggregate-address A.B.C.D A.B.C.D summary-only",
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Filter more specific routes from updatesn")
- {
- int ret;
- char prefix_str[BUFSIZ];
- ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
- if (! ret)
- {
- vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
- AGGREGATE_SUMMARY_ONLY, 0);
- }
- DEFUN (aggregate_address_as_set,
- aggregate_address_as_set_cmd,
- "aggregate-address A.B.C.D/M as-set",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Generate AS set path informationn")
- {
- return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
- 0, AGGREGATE_AS_SET);
- }
- DEFUN (aggregate_address_mask_as_set,
- aggregate_address_mask_as_set_cmd,
- "aggregate-address A.B.C.D A.B.C.D as-set",
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Generate AS set path informationn")
- {
- int ret;
- char prefix_str[BUFSIZ];
- ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
- if (! ret)
- {
- vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
- 0, AGGREGATE_AS_SET);
- }
- DEFUN (aggregate_address_as_set_summary,
- aggregate_address_as_set_summary_cmd,
- "aggregate-address A.B.C.D/M as-set summary-only",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Generate AS set path informationn"
- "Filter more specific routes from updatesn")
- {
- return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
- AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
- }
- ALIAS (aggregate_address_as_set_summary,
- aggregate_address_summary_as_set_cmd,
- "aggregate-address A.B.C.D/M summary-only as-set",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn"
- "Generate AS set path informationn");
- DEFUN (aggregate_address_mask_as_set_summary,
- aggregate_address_mask_as_set_summary_cmd,
- "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Generate AS set path informationn"
- "Filter more specific routes from updatesn")
- {
- int ret;
- char prefix_str[BUFSIZ];
- ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
- if (! ret)
- {
- vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
- AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
- }
- ALIAS (aggregate_address_mask_as_set_summary,
- aggregate_address_mask_summary_as_set_cmd,
- "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Filter more specific routes from updatesn"
- "Generate AS set path informationn");
- DEFUN (no_aggregate_address,
- no_aggregate_address_cmd,
- "no aggregate-address A.B.C.D/M",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn")
- {
- return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
- }
- ALIAS (no_aggregate_address,
- no_aggregate_address_summary_only_cmd,
- "no aggregate-address A.B.C.D/M summary-only",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn");
- ALIAS (no_aggregate_address,
- no_aggregate_address_as_set_cmd,
- "no aggregate-address A.B.C.D/M as-set",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Generate AS set path informationn");
- ALIAS (no_aggregate_address,
- no_aggregate_address_as_set_summary_cmd,
- "no aggregate-address A.B.C.D/M as-set summary-only",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Generate AS set path informationn"
- "Filter more specific routes from updatesn");
- ALIAS (no_aggregate_address,
- no_aggregate_address_summary_as_set_cmd,
- "no aggregate-address A.B.C.D/M summary-only as-set",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn"
- "Generate AS set path informationn");
- DEFUN (no_aggregate_address_mask,
- no_aggregate_address_mask_cmd,
- "no aggregate-address A.B.C.D A.B.C.D",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn")
- {
- int ret;
- char prefix_str[BUFSIZ];
- ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
- if (! ret)
- {
- vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
- }
- ALIAS (no_aggregate_address_mask,
- no_aggregate_address_mask_summary_only_cmd,
- "no aggregate-address A.B.C.D A.B.C.D summary-only",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Filter more specific routes from updatesn");
- ALIAS (no_aggregate_address_mask,
- no_aggregate_address_mask_as_set_cmd,
- "no aggregate-address A.B.C.D A.B.C.D as-set",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Generate AS set path informationn");
- ALIAS (no_aggregate_address_mask,
- no_aggregate_address_mask_as_set_summary_cmd,
- "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Generate AS set path informationn"
- "Filter more specific routes from updatesn");
- ALIAS (no_aggregate_address_mask,
- no_aggregate_address_mask_summary_as_set_cmd,
- "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate addressn"
- "Aggregate maskn"
- "Filter more specific routes from updatesn"
- "Generate AS set path informationn");
- #ifdef HAVE_IPV6
- DEFUN (ipv6_aggregate_address,
- ipv6_aggregate_address_cmd,
- "aggregate-address X:X::X:X/M",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn")
- {
- return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
- }
- DEFUN (ipv6_aggregate_address_summary_only,
- ipv6_aggregate_address_summary_only_cmd,
- "aggregate-address X:X::X:X/M summary-only",
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn")
- {
- return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
- AGGREGATE_SUMMARY_ONLY, 0);
- }
- DEFUN (no_ipv6_aggregate_address,
- no_ipv6_aggregate_address_cmd,
- "no aggregate-address X:X::X:X/M",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn")
- {
- return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
- }
- DEFUN (no_ipv6_aggregate_address_summary_only,
- no_ipv6_aggregate_address_summary_only_cmd,
- "no aggregate-address X:X::X:X/M summary-only",
- NO_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn")
- {
- return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
- }
- ALIAS (ipv6_aggregate_address,
- old_ipv6_aggregate_address_cmd,
- "ipv6 bgp aggregate-address X:X::X:X/M",
- IPV6_STR
- BGP_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn");
- ALIAS (ipv6_aggregate_address_summary_only,
- old_ipv6_aggregate_address_summary_only_cmd,
- "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
- IPV6_STR
- BGP_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn");
- ALIAS (no_ipv6_aggregate_address,
- old_no_ipv6_aggregate_address_cmd,
- "no ipv6 bgp aggregate-address X:X::X:X/M",
- NO_STR
- IPV6_STR
- BGP_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn");
- ALIAS (no_ipv6_aggregate_address_summary_only,
- old_no_ipv6_aggregate_address_summary_only_cmd,
- "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
- NO_STR
- IPV6_STR
- BGP_STR
- "Configure BGP aggregate entriesn"
- "Aggregate prefixn"
- "Filter more specific routes from updatesn");
- #endif /* HAVE_IPV6 */
- /* Redistribute route treatment. */
- void
- bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
- u_int32_t metric, u_char type)
- {
- struct bgp *bgp;
- struct listnode *nn;
- struct bgp_info *new;
- struct bgp_info *bi;
- struct bgp_info info;
- struct bgp_node *bn;
- struct attr attr;
- struct attr attr_new;
- struct attr *new_attr;
- afi_t afi;
- int ret;
- /* Make default attribute. */
- bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
- if (nexthop)
- attr.nexthop = *nexthop;
- attr.med = metric;
- attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
- LIST_LOOP (bm->bgp, bgp, nn)
- {
- afi = family2afi (p->family);
- if (bgp->redist[afi][type])
- {
- /* Copy attribute for modification. */
- attr_new = attr;
- if (bgp->redist_metric_flag[afi][type])
- attr_new.med = bgp->redist_metric[afi][type];
- /* Apply route-map. */
- if (bgp->rmap[afi][type].map)
- {
- info.peer = bgp->peer_self;
- info.attr = &attr_new;
- ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
- &info);
- if (ret == RMAP_DENYMATCH)
- {
- /* Free uninterned attribute. */
- bgp_attr_flush (&attr_new);
- /* Unintern original. */
- aspath_unintern (attr.aspath);
- bgp_redistribute_delete (p, type);
- return;
- }
- }
- bn = bgp_afi_node_get (bgp, afi, SAFI_UNICAST, p, NULL);
- new_attr = bgp_attr_intern (&attr_new);
-
- for (bi = bn->info; bi; bi = bi->next)
- if (bi->peer == bgp->peer_self
- && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
- break;
-
- if (bi)
- {
- if (attrhash_cmp (bi->attr, new_attr))
- {
- bgp_attr_unintern (new_attr);
- aspath_unintern (attr.aspath);
- bgp_unlock_node (bn);
- return;
- }
- else
- {
- /* The attribute is changed. */
- SET_FLAG (bi->flags, BGP_INFO_ATTR_CHANGED);
-
- /* Rewrite BGP route information. */
- bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
- bgp_attr_unintern (bi->attr);
- bi->attr = new_attr;
- bi->uptime = time (NULL);
-
- /* Process change. */
- bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
- bgp_process (bgp, bn, afi, SAFI_UNICAST);
- bgp_unlock_node (bn);
- aspath_unintern (attr.aspath);
- return;
- }
- }
- new = bgp_info_new ();
- new->type = type;
- new->sub_type = BGP_ROUTE_REDISTRIBUTE;
- new->peer = bgp->peer_self;
- SET_FLAG (new->flags, BGP_INFO_VALID);
- new->attr = new_attr;
- new->uptime = time (NULL);
- bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
- bgp_info_add (bn, new);
- bgp_process (bgp, bn, afi, SAFI_UNICAST);
- }
- }
- /* Unintern original. */
- aspath_unintern (attr.aspath);
- }
- void
- bgp_redistribute_delete (struct prefix *p, u_char type)
- {
- struct bgp *bgp;
- struct listnode *nn;
- afi_t afi;
- struct bgp_node *rn;
- struct bgp_info *ri;
- LIST_LOOP (bm->bgp, bgp, nn)
- {
- afi = family2afi (p->family);
- if (bgp->redist[afi][type])
- {
- rn = bgp_afi_node_get (bgp, afi, SAFI_UNICAST, p, NULL);
- for (ri = rn->info; ri; ri = ri->next)
- if (ri->peer == bgp->peer_self
- && ri->type == type)
- break;
- if (ri)
- {
- bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
- UNSET_FLAG (ri->flags, BGP_INFO_VALID);
- bgp_process (bgp, rn, afi, SAFI_UNICAST);
- bgp_info_delete (rn, ri);
- bgp_info_free (ri);
- bgp_unlock_node (rn);
- }
- bgp_unlock_node (rn);
- }
- }
- }
- /* Withdraw specified route type's route. */
- void
- bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
- {
- struct bgp_node *rn;
- struct bgp_info *ri;
- struct bgp_table *table;
- table = bgp->rib[afi][SAFI_UNICAST];
- for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
- {
- for (ri = rn->info; ri; ri = ri->next)
- if (ri->peer == bgp->peer_self
- && ri->type == type)
- break;
- if (ri)
- {
- bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
- UNSET_FLAG (ri->flags, BGP_INFO_VALID);
- bgp_process (bgp, rn, afi, SAFI_UNICAST);
- bgp_info_delete (rn, ri);
- bgp_info_free (ri);
- bgp_unlock_node (rn);
- }
- }
- }
- /* Static function to display route. */
- static int
- route_vty_out_route (struct prefix *p, struct vty *vty)
- {
- int len;
- u_int32_t destination;
- char buf[BUFSIZ];
- if (p->family == AF_INET)
- {
- len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
- destination = ntohl (p->u.prefix4.s_addr);
- if ((IN_CLASSC (destination) && p->prefixlen == 24)
- || (IN_CLASSB (destination) && p->prefixlen == 16)
- || (IN_CLASSA (destination) && p->prefixlen == 8)
- || p->u.prefix4.s_addr == 0)
- {
- /* When mask is natural, mask is not displayed. */
- }
- else
- len += vty_out (vty, "/%d", p->prefixlen);
- }
- else
- len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
- p->prefixlen);
- len = 17 - len;
- if (len < 1)
- vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
- else
- vty_out (vty, "%*s", len, " ");
- /* return 1 if it added extra newline */
- if (len < 1)
- return 1;
- else
- return 0;
- }
- /* Calculate line number of output data. */
- int
- vty_calc_line (struct vty *vty, unsigned long length)
- {
- return vty->width ? (((vty->obuf->length - length) / vty->width) + 1) : 1;
- }
- enum bgp_display_type
- {
- normal_list,
- };
- /* called from terminal list command */
- int
- route_vty_out (struct vty *vty, struct prefix *p,
- struct bgp_info *binfo, int display, safi_t safi)
- {
- struct attr *attr;
- unsigned long length = 0;
- int extra_line = 0;
- length = vty->obuf->length;
- /* Route status display. */
- if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
- vty_out (vty, "S");
- else if (binfo->suppress)
- vty_out (vty, "s");
- else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "*");
- else
- vty_out (vty, " ");
- /* Selected */
- if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "h");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
- vty_out (vty, "d");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
- vty_out (vty, ">");
- else
- vty_out (vty, " ");
- /* Internal route. */
- if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
- vty_out (vty, "i");
- else
- vty_out (vty, " ");
-
- /* print prefix and mask */
- if (! display)
- extra_line += route_vty_out_route (p, vty);
- else
- vty_out (vty, "%*s", 17, " ");
- /* Print attribute */
- attr = binfo->attr;
- if (attr)
- {
- if (p->family == AF_INET)
- {
- if (safi == SAFI_MPLS_VPN)
- vty_out (vty, "%-16s", inet_ntoa (attr->mp_nexthop_global_in));
- else
- vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
- }
- #ifdef HAVE_IPV6
- else if (p->family == AF_INET6)
- {
- int len;
- char buf[BUFSIZ];
- len = vty_out (vty, "%s",
- inet_ntop (AF_INET6, &attr->mp_nexthop_global, buf, BUFSIZ));
- len = 16 - len;
- if (len < 1)
- {
- vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
- extra_line++; /* Adjust More mode for newline above */
- }
- else
- vty_out (vty, "%*s", len, " ");
- }
- #endif /* HAVE_IPV6 */
- if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
- vty_out (vty, "%10u", attr->med);
- else
- vty_out (vty, " ");
- if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
- vty_out (vty, "%7u", attr->local_pref);
- else
- vty_out (vty, " ");
- vty_out (vty, "%7d ",attr->weight);
-
- /* Print aspath */
- if (attr->aspath)
- aspath_print_vty (vty, attr->aspath);
- /* Print origin */
- if (strlen (attr->aspath->str) == 0)
- vty_out (vty, "%s", bgp_origin_str[attr->origin]);
- else
- vty_out (vty, " %s", bgp_origin_str[attr->origin]);
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- return vty_calc_line (vty, length) + extra_line;
- }
- /* called from terminal list command */
- void
- route_vty_out_tmp (struct vty *vty, struct prefix *p,
- struct attr *attr, safi_t safi)
- {
- /* Route status display. */
- vty_out (vty, "*");
- vty_out (vty, ">");
- vty_out (vty, " ");
- /* print prefix and mask */
- route_vty_out_route (p, vty);
- /* Print attribute */
- if (attr)
- {
- if (p->family == AF_INET)
- {
- if (safi == SAFI_MPLS_VPN)
- vty_out (vty, "%-16s", inet_ntoa (attr->mp_nexthop_global_in));
- else
- vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
- }
- #ifdef HAVE_IPV6
- else if (p->family == AF_INET6)
- {
- int len;
- char buf[BUFSIZ];
- len = vty_out (vty, "%s",
- inet_ntop (AF_INET6, &attr->mp_nexthop_global, buf, BUFSIZ));
- len = 16 - len;
- if (len < 1)
- vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
- else
- vty_out (vty, "%*s", len, " ");
- }
- #endif /* HAVE_IPV6 */
- if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
- vty_out (vty, "%10u", attr->med);
- else
- vty_out (vty, " ");
- if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
- vty_out (vty, "%7u", attr->local_pref);
- else
- vty_out (vty, " ");
- vty_out (vty, "%7d ",attr->weight);
-
- /* Print aspath */
- if (attr->aspath)
- aspath_print_vty (vty, attr->aspath);
- /* Print origin */
- if (strlen (attr->aspath->str) == 0)
- vty_out (vty, "%s", bgp_origin_str[attr->origin]);
- else
- vty_out (vty, " %s", bgp_origin_str[attr->origin]);
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- }
- int
- route_vty_out_tag (struct vty *vty, struct prefix *p,
- struct bgp_info *binfo, int display, safi_t safi)
- {
- struct attr *attr;
- unsigned long length = 0;
- u_int32_t label = 0;
- int extra_line = 0;
- length = vty->obuf->length;
- /* Route status display. */
- if (binfo->suppress)
- vty_out (vty, "s");
- else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "*");
- else
- vty_out (vty, " ");
- /* Selected */
- if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "h");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
- vty_out (vty, "d");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
- vty_out (vty, ">");
- else
- vty_out (vty, " ");
- /* Internal route. */
- if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
- vty_out (vty, "i");
- else
- vty_out (vty, " ");
- /* print prefix and mask */
- if (! display)
- extra_line += route_vty_out_route (p, vty);
- else
- vty_out (vty, "%*s", 17, " ");
- /* Print attribute */
- attr = binfo->attr;
- if (attr)
- {
- if (p->family == AF_INET)
- {
- if (safi == SAFI_MPLS_VPN)
- vty_out (vty, "%-16s", inet_ntoa (attr->mp_nexthop_global_in));
- else
- vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
- }
- #ifdef HAVE_IPV6
- else if (p->family == AF_INET6)
- {
- char buf[BUFSIZ];
- char buf1[BUFSIZ];
- if (attr->mp_nexthop_len == 16)
- vty_out (vty, "%s",
- inet_ntop (AF_INET6, &attr->mp_nexthop_global, buf, BUFSIZ));
- else if (attr->mp_nexthop_len == 32)
- vty_out (vty, "%s(%s)",
- inet_ntop (AF_INET6, &attr->mp_nexthop_global, buf, BUFSIZ),
- inet_ntop (AF_INET6, &attr->mp_nexthop_local, buf1, BUFSIZ));
-
- }
- #endif /* HAVE_IPV6 */
- }
- label = decode_label (binfo->tag);
- vty_out (vty, "notag/%d", label);
- vty_out (vty, "%s", VTY_NEWLINE);
- return vty_calc_line (vty, length) + extra_line;
- }
- /* dampening route */
- int
- damp_route_vty_out (struct vty *vty, struct prefix *p,
- struct bgp_info *binfo, int display, safi_t safi)
- {
- struct attr *attr;
- unsigned long length = 0;
- int len;
- int extra_line = 0;
- length = vty->obuf->length;
- /* Route status display. */
- if (binfo->suppress)
- vty_out (vty, "s");
- else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "*");
- else
- vty_out (vty, " ");
- /* Selected */
- if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "h");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
- vty_out (vty, "d");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
- vty_out (vty, ">");
- else
- vty_out (vty, " ");
- vty_out (vty, " ");
- /* print prefix and mask */
- if (! display)
- extra_line += route_vty_out_route (p, vty);
- else
- vty_out (vty, "%*s", 17, " ");
- len = vty_out (vty, "%s", binfo->peer->host);
- len = 17 - len;
- if (len < 1)
- {
- vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
- extra_line++;
- }
- else
- vty_out (vty, "%*s", len, " ");
- vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo));
- /* Print attribute */
- attr = binfo->attr;
- if (attr)
- {
- /* Print aspath */
- if (attr->aspath)
- aspath_print_vty (vty, attr->aspath);
- /* Print origin */
- if (strlen (attr->aspath->str) == 0)
- vty_out (vty, "%s", bgp_origin_str[attr->origin]);
- else
- vty_out (vty, " %s", bgp_origin_str[attr->origin]);
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- return vty_calc_line (vty, length) + extra_line;
- }
- #define BGP_UPTIME_LEN 25
- /* flap route */
- int
- flap_route_vty_out (struct vty *vty, struct prefix *p,
- struct bgp_info *binfo, int display, safi_t safi)
- {
- struct attr *attr;
- struct bgp_damp_info *bdi;
- unsigned long length = 0;
- char timebuf[BGP_UPTIME_LEN];
- int len;
- int extra_line = 0;
- length = vty->obuf->length;
- bdi = binfo->damp_info;
- /* Route status display. */
- if (binfo->suppress)
- vty_out (vty, "s");
- else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "*");
- else
- vty_out (vty, " ");
- /* Selected */
- if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "h");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
- vty_out (vty, "d");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
- vty_out (vty, ">");
- else
- vty_out (vty, " ");
- vty_out (vty, " ");
- /* print prefix and mask */
- if (! display)
- extra_line += route_vty_out_route (p, vty);
- else
- vty_out (vty, "%*s", 17, " ");
- len = vty_out (vty, "%s", binfo->peer->host);
- len = 16 - len;
- if (len < 1)
- {
- vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
- extra_line++;
- }
- else
- vty_out (vty, "%*s", len, " ");
- len = vty_out (vty, "%d", bdi->flap);
- len = 5 - len;
- if (len < 1)
- vty_out (vty, " ");
- else
- vty_out (vty, "%*s ", len, " ");
-
- vty_out (vty, "%s ", peer_uptime (bdi->start_time,
- timebuf, BGP_UPTIME_LEN));
- if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
- && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo));
- else
- vty_out (vty, "%*s ", 8, " ");
- /* Print attribute */
- attr = binfo->attr;
- if (attr)
- {
- /* Print aspath */
- if (attr->aspath)
- aspath_print_vty (vty, attr->aspath);
- /* Print origin */
- if (strlen (attr->aspath->str) == 0)
- vty_out (vty, "%s", bgp_origin_str[attr->origin]);
- else
- vty_out (vty, " %s", bgp_origin_str[attr->origin]);
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- return vty_calc_line (vty, length) + extra_line;
- }
- void
- route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
- struct bgp_info *binfo, afi_t afi, safi_t safi)
- {
- char buf[INET6_ADDRSTRLEN];
- char buf1[BUFSIZ];
- struct attr *attr;
- int sockunion_vty_out (struct vty *, union sockunion *);
-
- attr = binfo->attr;
- if (attr)
- {
- /* Line1 display AS-path, Aggregator */
- if (attr->aspath)
- {
- vty_out (vty, " ");
- if (attr->aspath->length == 0)
- vty_out (vty, "Local");
- else
- aspath_print_vty (vty, attr->aspath);
- }
- if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
- vty_out (vty, ", (stale)");
- if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
- vty_out (vty, ", (aggregated by %d %s)", attr->aggregator_as,
- inet_ntoa (attr->aggregator_addr));
- if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
- vty_out (vty, ", (Received from a RR-client)");
- if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
- vty_out (vty, ", (Received from a RS-client)");
- if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, ", (history entry)");
- else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
- vty_out (vty, ", (suppressed due to dampening)");
- vty_out (vty, "%s", VTY_NEWLINE);
-
- /* Line2 display Next-hop, Neighbor, Router-id */
- if (p->family == AF_INET)
- {
- vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
- inet_ntoa (attr->mp_nexthop_global_in) :
- inet_ntoa (attr->nexthop));
- }
- #ifdef HAVE_IPV6
- else
- {
- vty_out (vty, " %s",
- inet_ntop (AF_INET6, &attr->mp_nexthop_global,
- buf, INET6_ADDRSTRLEN));
- }
- #endif /* HAVE_IPV6 */
- if (binfo->peer == bgp->peer_self)
- {
- vty_out (vty, " from %s ",
- p->family == AF_INET ? "0.0.0.0" : "::");
- vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
- }
- else
- {
- if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
- vty_out (vty, " (inaccessible)");
- else if (binfo->igpmetric)
- vty_out (vty, " (metric %d)", binfo->igpmetric);
- vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
- vty_out (vty, " (%s)", inet_ntoa (attr->originator_id));
- else
- vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- #ifdef HAVE_IPV6
- /* display nexthop local */
- if (attr->mp_nexthop_len == 32)
- {
- vty_out (vty, " (%s)%s",
- inet_ntop (AF_INET6, &attr->mp_nexthop_local,
- buf, INET6_ADDRSTRLEN),
- VTY_NEWLINE);
- }
- #endif /* HAVE_IPV6 */
- /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
- vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
-
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
- vty_out (vty, ", metric %u", attr->med);
-
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
- vty_out (vty, ", localpref %u", attr->local_pref);
- else
- vty_out (vty, ", localpref %u", bgp->default_local_pref);
- if (attr->weight != 0)
- vty_out (vty, ", weight %d", attr->weight);
-
- if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
- vty_out (vty, ", valid");
- if (binfo->peer != bgp->peer_self)
- {
- if (binfo->peer->as == binfo->peer->local_as)
- vty_out (vty, ", internal");
- else
- vty_out (vty, ", %s",
- (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
- }
- else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
- vty_out (vty, ", aggregated, local");
- else if (binfo->type != ZEBRA_ROUTE_BGP)
- vty_out (vty, ", sourced");
- else
- vty_out (vty, ", sourced, local");
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
- vty_out (vty, ", atomic-aggregate");
-
- if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
- vty_out (vty, ", best");
- vty_out (vty, "%s", VTY_NEWLINE);
-
- /* Line 4 display Community */
- if (attr->community)
- vty_out (vty, " Community: %s%s", attr->community->str,
- VTY_NEWLINE);
-
- /* Line 5 display Extended-community */
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
- vty_out (vty, " Extended Community: %s%s", attr->ecommunity->str,
- VTY_NEWLINE);
-
- /* Line 6 display Originator, Cluster-id */
- if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
- (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
- {
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
- vty_out (vty, " Originator: %s", inet_ntoa (attr->originator_id));
- if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
- {
- int i;
- vty_out (vty, ", Cluster list: ");
- for (i = 0; i < attr->cluster->length / 4; i++)
- vty_out (vty, "%s ", inet_ntoa (attr->cluster->list[i]));
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- }
- if (binfo->damp_info)
- bgp_damp_info_vty (vty, binfo);
- /* Line 7 display Uptime */
- vty_out (vty, " Last update: %s", ctime (&binfo->uptime));
- }
- vty_out (vty, "%s", VTY_NEWLINE);
- }
- #define BGP_SHOW_SCODE_HEADER "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,%s r RIB-failure, S Stale%s"
- #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
- #define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
- #define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
- #define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
- enum bgp_show_type
- {
- bgp_show_type_normal,
- bgp_show_type_regexp,
- bgp_show_type_prefix_list,
- bgp_show_type_filter_list,
- bgp_show_type_route_map,
- bgp_show_type_neighbor,
- bgp_show_type_cidr_only,
- bgp_show_type_prefix_longer,
- bgp_show_type_community_all,
- bgp_show_type_community,
- bgp_show_type_community_exact,
- bgp_show_type_community_list,
- bgp_show_type_community_list_exact,
- bgp_show_type_flap_statistics,
- bgp_show_type_flap_address,
- bgp_show_type_flap_prefix,
- bgp_show_type_flap_cidr_only,
- bgp_show_type_flap_regexp,
- bgp_show_type_flap_filter_list,
- bgp_show_type_flap_prefix_list,
- bgp_show_type_flap_prefix_longer,
- bgp_show_type_flap_route_map,
- bgp_show_type_flap_neighbor,
- bgp_show_type_dampend_paths,
- bgp_show_type_damp_neighbor
- };
- int
- bgp_show_callback (struct vty *vty, int unlock)
- {
- struct bgp_node *rn;
- struct bgp_info *ri;
- int count;
- int limit;
- int display;
- rn = vty->output_rn;
- count = 0;
- limit = ((vty->lines == 0) ? 10 :
- (vty->lines > 0 ? vty->lines : vty->height - 2));
- if (vty->status == VTY_MORELINE)
- limit = 1;
- else
- limit = limit > 0 ? limit : 2;
- /* Quit of display. */
- if (unlock && rn)
- {
- bgp_unlock_node (rn);
- if (vty->output_clean)
- (*vty->output_clean) (vty);
- vty->output_rn = NULL;
- vty->output_func = NULL;
- vty->output_clean = NULL;
- vty->output_arg = NULL;
- return 0;
- }
- for (; rn; rn = bgp_route_next (rn))
- if (rn->info != NULL)
- {
- display = 0;
- for (ri = rn->info; ri; ri = ri->next)
- {
- if (vty->output_type == bgp_show_type_flap_statistics
- || vty->output_type == bgp_show_type_flap_address
- || vty->output_type == bgp_show_type_flap_prefix
- || vty->output_type == bgp_show_type_flap_cidr_only
- || vty->output_type == bgp_show_type_flap_regexp
- || vty->output_type == bgp_show_type_flap_filter_list
- || vty->output_type == bgp_show_type_flap_prefix_list
- || vty->output_type == bgp_show_type_flap_prefix_longer
- || vty->output_type == bgp_show_type_flap_route_map
- || vty->output_type == bgp_show_type_flap_neighbor
- || vty->output_type == bgp_show_type_dampend_paths
- || vty->output_type == bgp_show_type_damp_neighbor)
- {
- if (! ri->damp_info)
- continue;
- }
- if (vty->output_type == bgp_show_type_regexp
- || vty->output_type == bgp_show_type_flap_regexp)
- {
- regex_t *regex = vty->output_arg;
- if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
- continue;
- }
- if (vty->output_type == bgp_show_type_prefix_list
- || vty->output_type == bgp_show_type_flap_prefix_list)
- {
- struct prefix_list *plist = vty->output_arg;
- if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
- continue;
- }
- if (vty->output_type == bgp_show_type_filter_list
- || vty->output_type == bgp_show_type_flap_filter_list)
- {
- struct as_list *as_list = vty->output_arg;
- if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
- continue;
- }
- if (vty->output_type == bgp_show_type_route_map
- || vty->output_type == bgp_show_type_flap_route_map)
- {
- struct route_map *rmap = vty->output_arg;
- struct bgp_info binfo;
- struct attr dummy_attr;
- int ret;
- dummy_attr = *ri->attr;
- binfo.peer = ri->peer;
- binfo.attr = &dummy_attr;
- ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
- if (ret == RMAP_DENYMATCH)
- continue;
- }
- if (vty->output_type == bgp_show_type_neighbor
- || vty->output_type == bgp_show_type_flap_neighbor
- || vty->output_type == bgp_show_type_damp_neighbor)
- {
- union sockunion *su = vty->output_arg;
- if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
- continue;
- }
- if (vty->output_type == bgp_show_type_cidr_only
- || vty->output_type == bgp_show_type_flap_cidr_only)
- {
- u_int32_t destination;
- destination = ntohl (rn->p.u.prefix4.s_addr);
- if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
- continue;
- if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
- continue;
- if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
- continue;
- }
- if (vty->output_type == bgp_show_type_prefix_longer
- || vty->output_type == bgp_show_type_flap_prefix_longer)
- {
- struct prefix *p = vty->output_arg;
- if (! prefix_match (p, &rn->p))
- continue;
- }
- if (vty->output_type == bgp_show_type_community_all)
- {
- if (! ri->attr->community)
- continue;
- }
- if (vty->output_type == bgp_show_type_community)
- {
- struct community *com = vty->output_arg;
- if (! ri->attr->community ||
- ! community_match (ri->attr->community, com))
- continue;
- }
- if (vty->output_type == bgp_show_type_community_exact)
- {
- struct community *com = vty->output_arg;
- if (! ri->attr->community ||
- ! community_cmp (ri->attr->community, com))
- continue;
- }
- if (vty->output_type == bgp_show_type_community_list)
- {
- struct community_list *list = vty->output_arg;
- if (! community_list_match (ri->attr->community, list))
- continue;
- }
- if (vty->output_type == bgp_show_type_community_list_exact)
- {
- struct community_list *list = vty->output_arg;
- if (! community_list_exact_match (ri->attr->community, list))
- continue;
- }
- if (vty->output_type == bgp_show_type_flap_address
- || vty->output_type == bgp_show_type_flap_prefix)
- {
- struct prefix *p = vty->output_arg;
- if (! prefix_match (&rn->p, p))
- continue;
- if (vty->output_type == bgp_show_type_flap_prefix)
- if (p->prefixlen != rn->p.prefixlen)
- continue;
- }
- if (vty->output_type == bgp_show_type_dampend_paths
- || vty->output_type == bgp_show_type_damp_neighbor)
- {
- if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
- || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
- continue;
- }
- if (vty->output_type == bgp_show_type_dampend_paths
- || vty->output_type == bgp_show_type_damp_neighbor)
- count += damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
- else if (vty->output_type == bgp_show_type_flap_statistics
- || vty->output_type == bgp_show_type_flap_address
- || vty->output_type == bgp_show_type_flap_prefix
- || vty->output_type == bgp_show_type_flap_cidr_only
- || vty->output_type == bgp_show_type_flap_regexp
- || vty->output_type == bgp_show_type_flap_filter_list
- || vty->output_type == bgp_show_type_flap_prefix_list
- || vty->output_type == bgp_show_type_flap_prefix_longer
- || vty->output_type == bgp_show_type_flap_route_map
- || vty->output_type == bgp_show_type_flap_neighbor)
- count += flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
- else
- count += route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
- display++;
- }
- if (display)
- vty->output_count++;
- /* Remember current pointer then suspend output. */
- if (count >= limit)
- {
- vty->status = VTY_CONTINUE;
- vty->output_rn = bgp_route_next (rn);;
- vty->output_func = bgp_show_callback;
- return 0;
- }
- }
- /* Total line display. */
- if (vty->output_count)
- vty_out (vty, "%sTotal number of prefixes %ld%s",
- VTY_NEWLINE, vty->output_count, VTY_NEWLINE);
- if (vty->output_clean)
- (*vty->output_clean) (vty);
- vty->status = VTY_CONTINUE;
- vty->output_rn = NULL;
- vty->output_func = NULL;
- vty->output_clean = NULL;
- vty->output_arg = NULL;
- return 0;
- }
- int
- bgp_show (struct vty *vty, char *view_name, afi_t afi, safi_t safi,
- enum bgp_show_type type)
- {
- struct bgp *bgp;
- struct bgp_info *ri;
- struct bgp_node *rn;
- struct bgp_table *table;
- int header = 1;
- int count;
- int limit;
- int display;
- limit = ((vty->lines == 0)
- ? 10 : (vty->lines > 0
- ? vty->lines : vty->height - 2));
- limit = limit > 0 ? limit : 2;
- /* BGP structure lookup. */
- if (view_name)
- {
- bgp = bgp_lookup_by_name (view_name);
- if (bgp == NULL)
- {
- vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
- return CMD_WARNING;
- }
- }
- else
- {
- bgp = bgp_get_default ();
- if (bgp == NULL)
- {
- vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- }
- count = 0;
- /* This is first entry point, so reset total line. */
- vty->output_count = 0;
- vty->output_type = type;
- table = bgp->rib[afi][safi];
- /* Start processing of routes. */
- for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
- if (rn->info != NULL)
- {
- display = 0;
- for (ri = rn->info; ri; ri = ri->next)
- {
- if (vty->output_type == bgp_show_type_flap_statistics
- || type == bgp_show_type_flap_address
- || type == bgp_show_type_flap_prefix
- || type == bgp_show_type_flap_cidr_only
- || type == bgp_show_type_flap_regexp
- || type == bgp_show_type_flap_filter_list
- || type == bgp_show_type_flap_prefix_list
- || type == bgp_show_type_flap_prefix_longer
- || type == bgp_show_type_flap_route_map
- || type == bgp_show_type_flap_neighbor
- || type == bgp_show_type_dampend_paths
- || type == bgp_show_type_damp_neighbor)
- {
- if (! ri->damp_info)
- continue;
- }
- if (type == bgp_show_type_regexp
- || type == bgp_show_type_flap_regexp)
- {
- regex_t *regex = vty->output_arg;
-
- if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
- continue;
- }
- if (type == bgp_show_type_prefix_list
- || type == bgp_show_type_flap_prefix_list)
- {
- struct prefix_list *plist = vty->output_arg;
-
- if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
- continue;
- }
- if (type == bgp_show_type_filter_list
- || type == bgp_show_type_flap_filter_list)
- {
- struct as_list *as_list = vty->output_arg;
- if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
- continue;
- }
- if (type == bgp_show_type_route_map
- || type == bgp_show_type_flap_route_map)
- {
- struct route_map *rmap = vty->output_arg;
- struct bgp_info binfo;
- struct attr dummy_attr;
- int ret;
- dummy_attr = *ri->attr;
- binfo.peer = ri->peer;
- binfo.attr = &dummy_attr;
- ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
- if (ret == RMAP_DENYMATCH)
- continue;
- }
- if (type == bgp_show_type_neighbor
- || type == bgp_show_type_flap_neighbor
- || type == bgp_show_type_damp_neighbor)
- {
- union sockunion *su = vty->output_arg;
- if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
- continue;
- }
- if (type == bgp_show_type_cidr_only
- || type == bgp_show_type_flap_cidr_only)
- {
- u_int32_t destination;
- destination = ntohl (rn->p.u.prefix4.s_addr);
- if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
- continue;
- if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
- continue;
- if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
- continue;
- }
- if (type == bgp_show_type_prefix_longer
- || type == bgp_show_type_flap_prefix_longer)
- {
- struct prefix *p = vty->output_arg;
- if (! prefix_match (p, &rn->p))
- continue;
- }
- if (type == bgp_show_type_community_all)
- {
- if (! ri->attr->community)
- continue;
- }
- if (type == bgp_show_type_community)
- {
- struct community *com = vty->output_arg;
- if (! ri->attr->community ||
- ! community_match (ri->attr->community, com))
- continue;
- }
- if (type == bgp_show_type_community_exact)
- {
- struct community *com = vty->output_arg;
- if (! ri->attr->community ||
- ! community_cmp (ri->attr->community, com))
- continue;
- }
- if (type == bgp_show_type_community_list)
- {
- struct community_list *list = vty->output_arg;
- if (! community_list_match (ri->attr->community, list))
- continue;
- }
- if (type == bgp_show_type_community_list_exact)
- {
- struct community_list *list = vty->output_arg;
- if (! community_list_exact_match (ri->attr->community, list))
- continue;
- }
- if (type == bgp_show_type_flap_address
- || type == bgp_show_type_flap_prefix)
- {
- struct prefix *p = vty->output_arg;
- if (! prefix_match (&rn->p, p))
- continue;
- if (type == bgp_show_type_flap_prefix)
- if (p->prefixlen != rn->p.prefixlen)
- continue;
- }
- if (type == bgp_show_type_dampend_paths
- || type == bgp_show_type_damp_neighbor)
- {
- if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
- || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
- continue;
- }
- if (header)
- {
- vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
- vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
- vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
- if (type == bgp_show_type_dampend_paths
- || type == bgp_show_type_damp_neighbor)
- vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
- else if (type == bgp_show_type_flap_statistics
- || type == bgp_show_type_flap_address
- || type == bgp_show_type_flap_prefix
- || type == bgp_show_type_flap_cidr_only
- || type == bgp_show_type_flap_regexp
- || type == bgp_show_type_flap_filter_list
- || type == bgp_show_type_flap_prefix_list
- || type == bgp_show_type_flap_prefix_longer
- || type == bgp_show_type_flap_route_map
- || type == bgp_show_type_flap_neighbor)
- vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
- else
- vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
- count += 5;
- header = 0;
- }
- if (type == bgp_show_type_dampend_paths
- || type == bgp_show_type_damp_neighbor)
- count += damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
- else if (type == bgp_show_type_flap_statistics
- || type == bgp_show_type_flap_address
- || type == bgp_show_type_flap_prefix
- || type == bgp_show_type_flap_cidr_only
- || type == bgp_show_type_flap_regexp
- || type == bgp_show_type_flap_filter_list
- || type == bgp_show_type_flap_prefix_list
- || type == bgp_show_type_flap_prefix_longer
- || type == bgp_show_type_flap_route_map
- || type == bgp_show_type_flap_neighbor)
- count += flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
- else
- count += route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
- display++;
- }
- if (display)
- vty->output_count++;
- /* Remember current pointer then suspend output. */
- if (count >= limit && vty->type != VTY_SHELL_SERV)
- {
- vty->status = VTY_START;
- vty->output_rn = bgp_route_next (rn);
- vty->output_func = bgp_show_callback;
- vty->output_type = type;
- return CMD_SUCCESS;
- }
- }
- /* No route is displayed */
- if (vty->output_count == 0)
- {
- if (type == bgp_show_type_normal)
- vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
- }
- else
- vty_out (vty, "%sTotal number of prefixes %ld%s",
- VTY_NEWLINE, vty->output_count, VTY_NEWLINE);
- /* Clean up allocated resources. */
- if (vty->output_clean)
- (*vty->output_clean) (vty);
- vty->status = VTY_START;
- vty->output_rn = NULL;
- vty->output_func = NULL;
- vty->output_clean = NULL;
- vty->output_arg = NULL;
- return CMD_SUCCESS;
- }
- /* Header of detailed BGP route information */
- void
- route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
- struct bgp_node *rn,
- struct prefix_rd *prd, afi_t afi, safi_t safi)
- {
- struct bgp_info *ri;
- struct prefix *p;
- struct peer *peer;
- struct listnode *nn;
- char buf1[INET6_ADDRSTRLEN];
- char buf2[INET6_ADDRSTRLEN];
- int count = 0;
- int best = 0;
- int suppress = 0;
- int no_export = 0;
- int no_advertise = 0;
- int local_as = 0;
- int first = 0;
- p = &rn->p;
- vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
- (safi == SAFI_MPLS_VPN ?
- prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
- safi == SAFI_MPLS_VPN ? ":" : "",
- inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
- p->prefixlen, VTY_NEWLINE);
- for (ri = rn->info; ri; ri = ri->next)
- {
- count++;
- if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
- {
- best = count;
- if (ri->suppress)
- suppress = 1;
- if (ri->attr->community != NULL)
- {
- if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
- no_advertise = 1;
- if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
- no_export = 1;
- if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
- local_as = 1;
- }
- }
- }
- vty_out (vty, "Paths: (%d available", count);
- if (best)
- {
- vty_out (vty, ", best #%d", best);
- if (safi == SAFI_UNICAST)
- vty_out (vty, ", table Default-IP-Routing-Table");
- }
- else
- vty_out (vty, ", no best path");
- if (no_advertise)
- vty_out (vty, ", not advertised to any peer");
- else if (no_export)
- vty_out (vty, ", not advertised to EBGP peer");
- else if (local_as)
- vty_out (vty, ", not advertised outside local AS");
- if (suppress)
- vty_out (vty, ", Advertisements suppressed by an aggregate.");
- vty_out (vty, ")%s", VTY_NEWLINE);
- /* advertised peer */
- LIST_LOOP (bgp->peer, peer, nn)
- {
- if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
- {
- if (! first)
- vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
- vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
- first = 1;
- }
- }
- if (! first)
- vty_out (vty, " Not advertised to any peer");
- vty_out (vty, "%s", VTY_NEWLINE);
- }
- /* Display specified route of BGP table. */
- int
- bgp_show_route (struct vty *vty, char *view_name, char *ip_str,
- afi_t afi, safi_t safi, struct prefix_rd *prd,
- int prefix_check)
- {
- int ret;
- int header;
- int display = 0;
- struct prefix match;
- struct bgp_node *rn;
- struct bgp_node *rm;
- struct bgp_info *ri;
- struct bgp *bgp;
- struct bgp_table *table;
- /* BGP structure lookup. */
- if (view_name)
- {
- bgp = bgp_lookup_by_name (view_name);
- if (bgp == NULL)
- {
- vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
- return CMD_WARNING;
- }
- }
- else
- {
- bgp = bgp_get_default ();
- if (bgp == NULL)
- {
- vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- }
- /* Check IP address argument. */
- ret = str2prefix (ip_str, &match);
- if (! ret)
- {
- vty_out (vty, "address is malformed%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- match.family = afi2family (afi);
- if (safi == SAFI_MPLS_VPN)
- {
- for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
- {
- if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
- continue;
- if ((table = rn->info) != NULL)
- {
- header = 1;
- if ((rm = bgp_node_match (table, &match)) != NULL)
- {
- if (prefix_check && rm->p.prefixlen != match.prefixlen)
- continue;
- for (ri = rm->info; ri; ri = ri->next)
- {
- if (header)
- {
- route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
- AFI_IP, SAFI_MPLS_VPN);
- header = 0;
- }
- display++;
- route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
- }
- }
- }
- }
- }
- else
- {
- header = 1;
- if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
- {
- if (! prefix_check || rn->p.prefixlen == match.prefixlen)
- {
- for (ri = rn->info; ri; ri = ri->next)
- {
- if (header)
- {
- route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
- header = 0;
- }
- display++;
- route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
- }
- }
- }
- }
- if (! display)
- {
- vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return CMD_SUCCESS;
- }
- /* BGP route print out function. */
- DEFUN (show_ip_bgp,
- show_ip_bgp_cmd,
- "show ip bgp",
- SHOW_STR
- IP_STR
- BGP_STR)
- {
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal);
- }
- DEFUN (show_ip_bgp_ipv4,
- show_ip_bgp_ipv4_cmd,
- "show ip bgp ipv4 (unicast|multicast)",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal);
-
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal);
- }
- DEFUN (show_ip_bgp_route,
- show_ip_bgp_route_cmd,
- "show ip bgp A.B.C.D",
- SHOW_STR
- IP_STR
- BGP_STR
- "Network in the BGP routing table to displayn")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
- }
- DEFUN (show_ip_bgp_ipv4_route,
- show_ip_bgp_ipv4_route_cmd,
- "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Network in the BGP routing table to displayn")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
- return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
- }
- DEFUN (show_ip_bgp_vpnv4_all_route,
- show_ip_bgp_vpnv4_all_route_cmd,
- "show ip bgp vpnv4 all A.B.C.D",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display VPNv4 NLRI specific informationn"
- "Display information about all VPNv4 NLRIsn"
- "Network in the BGP routing table to displayn")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
- }
- DEFUN (show_ip_bgp_vpnv4_rd_route,
- show_ip_bgp_vpnv4_rd_route_cmd,
- "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display VPNv4 NLRI specific informationn"
- "Display information for a route distinguishern"
- "VPN Route Distinguishern"
- "Network in the BGP routing table to displayn")
- {
- int ret;
- struct prefix_rd prd;
- ret = str2prefix_rd (argv[0], &prd);
- if (! ret)
- {
- vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
- }
- DEFUN (show_ip_bgp_prefix,
- show_ip_bgp_prefix_cmd,
- "show ip bgp A.B.C.D/M",
- SHOW_STR
- IP_STR
- BGP_STR
- "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
- }
- DEFUN (show_ip_bgp_ipv4_prefix,
- show_ip_bgp_ipv4_prefix_cmd,
- "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
- return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
- }
- DEFUN (show_ip_bgp_vpnv4_all_prefix,
- show_ip_bgp_vpnv4_all_prefix_cmd,
- "show ip bgp vpnv4 all A.B.C.D/M",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display VPNv4 NLRI specific informationn"
- "Display information about all VPNv4 NLRIsn"
- "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
- }
- DEFUN (show_ip_bgp_vpnv4_rd_prefix,
- show_ip_bgp_vpnv4_rd_prefix_cmd,
- "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display VPNv4 NLRI specific informationn"
- "Display information for a route distinguishern"
- "VPN Route Distinguishern"
- "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
- {
- int ret;
- struct prefix_rd prd;
- ret = str2prefix_rd (argv[0], &prd);
- if (! ret)
- {
- vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
- }
- DEFUN (show_ip_bgp_view,
- show_ip_bgp_view_cmd,
- "show ip bgp view WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "BGP viewn"
- "BGP view namen")
- {
- return bgp_show (vty, argv[0], AFI_IP, SAFI_UNICAST, bgp_show_type_normal);
- }
- DEFUN (show_ip_bgp_view_route,
- show_ip_bgp_view_route_cmd,
- "show ip bgp view WORD A.B.C.D",
- SHOW_STR
- IP_STR
- BGP_STR
- "BGP viewn"
- "BGP view namen"
- "Network in the BGP routing table to displayn")
- {
- return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
- }
- DEFUN (show_ip_bgp_view_prefix,
- show_ip_bgp_view_prefix_cmd,
- "show ip bgp view WORD A.B.C.D/M",
- SHOW_STR
- IP_STR
- BGP_STR
- "BGP viewn"
- "BGP view namen"
- "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
- {
- return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
- }
- #ifdef HAVE_IPV6
- DEFUN (show_bgp,
- show_bgp_cmd,
- "show bgp",
- SHOW_STR
- BGP_STR)
- {
- return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal);
- }
- ALIAS (show_bgp,
- show_bgp_ipv6_cmd,
- "show bgp ipv6",
- SHOW_STR
- BGP_STR
- "Address familyn");
- /* old command */
- DEFUN (show_ipv6_bgp,
- show_ipv6_bgp_cmd,
- "show ipv6 bgp",
- SHOW_STR
- IP_STR
- BGP_STR)
- {
- return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal);
- }
- DEFUN (show_bgp_route,
- show_bgp_route_cmd,
- "show bgp X:X::X:X",
- SHOW_STR
- BGP_STR
- "Network in the BGP routing table to displayn")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
- }
- ALIAS (show_bgp_route,
- show_bgp_ipv6_route_cmd,
- "show bgp ipv6 X:X::X:X",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "Network in the BGP routing table to displayn");
- /* old command */
- DEFUN (show_ipv6_bgp_route,
- show_ipv6_bgp_route_cmd,
- "show ipv6 bgp X:X::X:X",
- SHOW_STR
- IP_STR
- BGP_STR
- "Network in the BGP routing table to displayn")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
- }
- DEFUN (show_bgp_prefix,
- show_bgp_prefix_cmd,
- "show bgp X:X::X:X/M",
- SHOW_STR
- BGP_STR
- "IPv6 prefix <network>/<length>n")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
- }
- ALIAS (show_bgp_prefix,
- show_bgp_ipv6_prefix_cmd,
- "show bgp ipv6 X:X::X:X/M",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "IPv6 prefix <network>/<length>n");
- /* old command */
- DEFUN (show_ipv6_bgp_prefix,
- show_ipv6_bgp_prefix_cmd,
- "show ipv6 bgp X:X::X:X/M",
- SHOW_STR
- IP_STR
- BGP_STR
- "IPv6 prefix <network>/<length>, e.g., 3ffe::/16n")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp,
- show_ipv6_mbgp_cmd,
- "show ipv6 mbgp",
- SHOW_STR
- IP_STR
- MBGP_STR)
- {
- return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp_route,
- show_ipv6_mbgp_route_cmd,
- "show ipv6 mbgp X:X::X:X",
- SHOW_STR
- IP_STR
- MBGP_STR
- "Network in the MBGP routing table to displayn")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp_prefix,
- show_ipv6_mbgp_prefix_cmd,
- "show ipv6 mbgp X:X::X:X/M",
- SHOW_STR
- IP_STR
- MBGP_STR
- "IPv6 prefix <network>/<length>, e.g., 3ffe::/16n")
- {
- return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
- }
- #endif
- void
- bgp_show_regexp_clean (struct vty *vty)
- {
- bgp_regex_free (vty->output_arg);
- }
- int
- bgp_show_regexp (struct vty *vty, int argc, char **argv, afi_t afi,
- safi_t safi, enum bgp_show_type type)
- {
- int i;
- struct buffer *b;
- char *regstr;
- int first;
- regex_t *regex;
-
- first = 0;
- b = buffer_new (1024);
- for (i = 0; i < argc; i++)
- {
- if (first)
- buffer_putc (b, ' ');
- else
- {
- if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
- continue;
- first = 1;
- }
- buffer_putstr (b, argv[i]);
- }
- buffer_putc (b, ' ');
- regstr = buffer_getstr (b);
- buffer_free (b);
- regex = bgp_regcomp (regstr);
- if (! regex)
- {
- vty_out (vty, "Can't compile regexp %s%s", argv[0],
- VTY_NEWLINE);
- return CMD_WARNING;
- }
- vty->output_arg = regex;
- vty->output_clean = bgp_show_regexp_clean;
- return bgp_show (vty, NULL, afi, safi, type);
- }
- DEFUN (show_ip_bgp_regexp,
- show_ip_bgp_regexp_cmd,
- "show ip bgp regexp .LINE",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the BGP AS pathsn")
- {
- return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
- bgp_show_type_regexp);
- }
- DEFUN (show_ip_bgp_flap_regexp,
- show_ip_bgp_flap_regexp_cmd,
- "show ip bgp flap-statistics regexp .LINE",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display flap statistics of routesn"
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the BGP AS pathsn")
- {
- return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
- bgp_show_type_flap_regexp);
- }
- DEFUN (show_ip_bgp_ipv4_regexp,
- show_ip_bgp_ipv4_regexp_cmd,
- "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the BGP AS pathsn")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
- bgp_show_type_regexp);
- return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
- bgp_show_type_regexp);
- }
- #ifdef HAVE_IPV6
- DEFUN (show_bgp_regexp,
- show_bgp_regexp_cmd,
- "show bgp regexp .LINE",
- SHOW_STR
- BGP_STR
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the BGP AS pathsn")
- {
- return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
- bgp_show_type_regexp);
- }
- ALIAS (show_bgp_regexp,
- show_bgp_ipv6_regexp_cmd,
- "show bgp ipv6 regexp .LINE",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the BGP AS pathsn");
- /* old command */
- DEFUN (show_ipv6_bgp_regexp,
- show_ipv6_bgp_regexp_cmd,
- "show ipv6 bgp regexp .LINE",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the BGP AS pathsn")
- {
- return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
- bgp_show_type_regexp);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp_regexp,
- show_ipv6_mbgp_regexp_cmd,
- "show ipv6 mbgp regexp .LINE",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the AS path regular expressionn"
- "A regular-expression to match the MBGP AS pathsn")
- {
- return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
- bgp_show_type_regexp);
- }
- #endif /* HAVE_IPV6 */
- int
- bgp_show_prefix_list (struct vty *vty, char *prefix_list_str, afi_t afi,
- safi_t safi, enum bgp_show_type type)
- {
- struct prefix_list *plist;
- plist = prefix_list_lookup (afi, prefix_list_str);
- if (plist == NULL)
- {
- vty_out (vty, "%% %s is not a valid prefix-list name%s",
- prefix_list_str, VTY_NEWLINE);
- return CMD_WARNING;
- }
- vty->output_arg = plist;
- return bgp_show (vty, NULL, afi, safi, type);
- }
- DEFUN (show_ip_bgp_prefix_list,
- show_ip_bgp_prefix_list_cmd,
- "show ip bgp prefix-list WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes conforming to the prefix-listn"
- "IP prefix-list namen")
- {
- return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
- bgp_show_type_prefix_list);
- }
- DEFUN (show_ip_bgp_flap_prefix_list,
- show_ip_bgp_flap_prefix_list_cmd,
- "show ip bgp flap-statistics prefix-list WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display flap statistics of routesn"
- "Display routes conforming to the prefix-listn"
- "IP prefix-list namen")
- {
- return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
- bgp_show_type_flap_prefix_list);
- }
- DEFUN (show_ip_bgp_ipv4_prefix_list,
- show_ip_bgp_ipv4_prefix_list_cmd,
- "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Display routes conforming to the prefix-listn"
- "IP prefix-list namen")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
- bgp_show_type_prefix_list);
- return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
- bgp_show_type_prefix_list);
- }
- #ifdef HAVE_IPV6
- DEFUN (show_bgp_prefix_list,
- show_bgp_prefix_list_cmd,
- "show bgp prefix-list WORD",
- SHOW_STR
- BGP_STR
- "Display routes conforming to the prefix-listn"
- "IPv6 prefix-list namen")
- {
- return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
- bgp_show_type_prefix_list);
- }
- ALIAS (show_bgp_prefix_list,
- show_bgp_ipv6_prefix_list_cmd,
- "show bgp ipv6 prefix-list WORD",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "Display routes conforming to the prefix-listn"
- "IPv6 prefix-list namen");
- /* old command */
- DEFUN (show_ipv6_bgp_prefix_list,
- show_ipv6_bgp_prefix_list_cmd,
- "show ipv6 bgp prefix-list WORD",
- SHOW_STR
- IPV6_STR
- BGP_STR
- "Display routes matching the prefix-listn"
- "IPv6 prefix-list namen")
- {
- return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
- bgp_show_type_prefix_list);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp_prefix_list,
- show_ipv6_mbgp_prefix_list_cmd,
- "show ipv6 mbgp prefix-list WORD",
- SHOW_STR
- IPV6_STR
- MBGP_STR
- "Display routes matching the prefix-listn"
- "IPv6 prefix-list namen")
- {
- return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
- bgp_show_type_prefix_list);
- }
- #endif /* HAVE_IPV6 */
- int
- bgp_show_filter_list (struct vty *vty, char *filter, afi_t afi,
- safi_t safi, enum bgp_show_type type)
- {
- struct as_list *as_list;
- as_list = as_list_lookup (filter);
- if (as_list == NULL)
- {
- vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
- return CMD_WARNING;
- }
- vty->output_arg = as_list;
- return bgp_show (vty, NULL, afi, safi, type);
- }
- DEFUN (show_ip_bgp_filter_list,
- show_ip_bgp_filter_list_cmd,
- "show ip bgp filter-list WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen")
- {
- return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
- bgp_show_type_filter_list);
- }
- DEFUN (show_ip_bgp_flap_filter_list,
- show_ip_bgp_flap_filter_list_cmd,
- "show ip bgp flap-statistics filter-list WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display flap statistics of routesn"
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen")
- {
- return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
- bgp_show_type_flap_filter_list);
- }
- DEFUN (show_ip_bgp_ipv4_filter_list,
- show_ip_bgp_ipv4_filter_list_cmd,
- "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
- bgp_show_type_filter_list);
-
- return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
- bgp_show_type_filter_list);
- }
- #ifdef HAVE_IPV6
- DEFUN (show_bgp_filter_list,
- show_bgp_filter_list_cmd,
- "show bgp filter-list WORD",
- SHOW_STR
- BGP_STR
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen")
- {
- return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
- bgp_show_type_filter_list);
- }
- ALIAS (show_bgp_filter_list,
- show_bgp_ipv6_filter_list_cmd,
- "show bgp ipv6 filter-list WORD",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen");
- /* old command */
- DEFUN (show_ipv6_bgp_filter_list,
- show_ipv6_bgp_filter_list_cmd,
- "show ipv6 bgp filter-list WORD",
- SHOW_STR
- IPV6_STR
- BGP_STR
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen")
- {
- return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
- bgp_show_type_filter_list);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp_filter_list,
- show_ipv6_mbgp_filter_list_cmd,
- "show ipv6 mbgp filter-list WORD",
- SHOW_STR
- IPV6_STR
- MBGP_STR
- "Display routes conforming to the filter-listn"
- "Regular expression access list namen")
- {
- return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
- bgp_show_type_filter_list);
- }
- #endif /* HAVE_IPV6 */
- int
- bgp_show_route_map (struct vty *vty, char *rmap_str, afi_t afi,
- safi_t safi, enum bgp_show_type type)
- {
- struct route_map *rmap;
- rmap = route_map_lookup_by_name (rmap_str);
- if (! rmap)
- {
- vty_out (vty, "%% %s is not a valid route-map name%s",
- rmap_str, VTY_NEWLINE);
- return CMD_WARNING;
- }
- vty->output_arg = rmap;
- return bgp_show (vty, NULL, afi, safi, type);
- }
- DEFUN (show_ip_bgp_route_map,
- show_ip_bgp_route_map_cmd,
- "show ip bgp route-map WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the route-mapn"
- "A route-map to match onn")
- {
- return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
- bgp_show_type_route_map);
- }
- DEFUN (show_ip_bgp_flap_route_map,
- show_ip_bgp_flap_route_map_cmd,
- "show ip bgp flap-statistics route-map WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display flap statistics of routesn"
- "Display routes matching the route-mapn"
- "A route-map to match onn")
- {
- return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
- bgp_show_type_flap_route_map);
- }
- DEFUN (show_ip_bgp_ipv4_route_map,
- show_ip_bgp_ipv4_route_map_cmd,
- "show ip bgp ipv4 (unicast|multicast) route-map WORD",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Display routes matching the route-mapn"
- "A route-map to match onn")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
- bgp_show_type_route_map);
- return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
- bgp_show_type_route_map);
- }
- DEFUN (show_bgp_route_map,
- show_bgp_route_map_cmd,
- "show bgp route-map WORD",
- SHOW_STR
- BGP_STR
- "Display routes matching the route-mapn"
- "A route-map to match onn")
- {
- return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
- bgp_show_type_route_map);
- }
- ALIAS (show_bgp_route_map,
- show_bgp_ipv6_route_map_cmd,
- "show bgp ipv6 route-map WORD",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "Display routes matching the route-mapn"
- "A route-map to match onn");
- DEFUN (show_ip_bgp_cidr_only,
- show_ip_bgp_cidr_only_cmd,
- "show ip bgp cidr-only",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display only routes with non-natural netmasksn")
- {
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
- bgp_show_type_cidr_only);
- }
- DEFUN (show_ip_bgp_flap_cidr_only,
- show_ip_bgp_flap_cidr_only_cmd,
- "show ip bgp flap-statistics cidr-only",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display flap statistics of routesn"
- "Display only routes with non-natural netmasksn")
- {
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
- bgp_show_type_flap_cidr_only);
- }
- DEFUN (show_ip_bgp_ipv4_cidr_only,
- show_ip_bgp_ipv4_cidr_only_cmd,
- "show ip bgp ipv4 (unicast|multicast) cidr-only",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Display only routes with non-natural netmasksn")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
- bgp_show_type_cidr_only);
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
- bgp_show_type_cidr_only);
- }
- DEFUN (show_ip_bgp_community_all,
- show_ip_bgp_community_all_cmd,
- "show ip bgp community",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the communitiesn")
- {
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
- bgp_show_type_community_all);
- }
- DEFUN (show_ip_bgp_ipv4_community_all,
- show_ip_bgp_ipv4_community_all_cmd,
- "show ip bgp ipv4 (unicast|multicast) community",
- SHOW_STR
- IP_STR
- BGP_STR
- "Address familyn"
- "Address Family modifiern"
- "Address Family modifiern"
- "Display routes matching the communitiesn")
- {
- if (strncmp (argv[0], "m", 1) == 0)
- return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
- bgp_show_type_community_all);
-
- return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
- bgp_show_type_community_all);
- }
- #ifdef HAVE_IPV6
- DEFUN (show_bgp_community_all,
- show_bgp_community_all_cmd,
- "show bgp community",
- SHOW_STR
- BGP_STR
- "Display routes matching the communitiesn")
- {
- return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
- bgp_show_type_community_all);
- }
- ALIAS (show_bgp_community_all,
- show_bgp_ipv6_community_all_cmd,
- "show bgp ipv6 community",
- SHOW_STR
- BGP_STR
- "Address familyn"
- "Display routes matching the communitiesn");
- /* old command */
- DEFUN (show_ipv6_bgp_community_all,
- show_ipv6_bgp_community_all_cmd,
- "show ipv6 bgp community",
- SHOW_STR
- IPV6_STR
- BGP_STR
- "Display routes matching the communitiesn")
- {
- return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
- bgp_show_type_community_all);
- }
- /* old command */
- DEFUN (show_ipv6_mbgp_community_all,
- show_ipv6_mbgp_community_all_cmd,
- "show ipv6 mbgp community",
- SHOW_STR
- IPV6_STR
- MBGP_STR
- "Display routes matching the communitiesn")
- {
- return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
- bgp_show_type_community_all);
- }
- #endif /* HAVE_IPV6 */
- int
- bgp_show_community (struct vty *vty, int argc, char **argv, int exact,
- u_int16_t afi, u_char safi)
- {
- struct community *com;
- struct buffer *b;
- int i;
- char *str;
- int first = 0;
- b = buffer_new (1024);
- for (i = 0; i < argc; i++)
- {
- if (first)
- buffer_putc (b, ' ');
- else
- {
- if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
- continue;
- first = 1;
- }
-
- buffer_putstr (b, argv[i]);
- }
- buffer_putc (b, ' ');
- str = buffer_getstr (b);
- buffer_free (b);
- com = community_str2com (str);
- free (str);
- if (! com)
- {
- vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- vty->output_arg = com;
- if (exact)
- return bgp_show (vty, NULL, afi, safi, bgp_show_type_community_exact);
- return bgp_show (vty, NULL, afi, safi, bgp_show_type_community);
- }
- DEFUN (show_ip_bgp_community,
- show_ip_bgp_community_cmd,
- "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the communitiesn"
- "community numbern"
- "Do not send outside local AS (well-known community)n"
- "Do not advertise to any peer (well-known community)n"
- "Do not export to next AS (well-known community)n")
- {
- return bgp_show_community (vty, argc, argv, 0, AFI_IP, SAFI_UNICAST);
- }
- ALIAS (show_ip_bgp_community,
- show_ip_bgp_community2_cmd,
- "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
- SHOW_STR
- IP_STR
- BGP_STR
- "Display routes matching the communitiesn"
- "community numbern"
- "Do not send outside local AS (well-known community)n"
- "Do not advertise to any peer (well-known community)n"
- "Do not export to next AS (well-known community)n"
- "community numbern"
- "Do not send outside local AS (well-known community)n"