Annotation of embedaddon/quagga/bgpd/bgp_route.c, revision 1.1.1.1
1.1 misho 1: /* BGP routing information
2: Copyright (C) 1996, 97, 98, 99 Kunihiro Ishiguro
3:
4: This file is part of GNU Zebra.
5:
6: GNU Zebra is free software; you can redistribute it and/or modify it
7: under the terms of the GNU General Public License as published by the
8: Free Software Foundation; either version 2, or (at your option) any
9: later version.
10:
11: GNU Zebra is distributed in the hope that it will be useful, but
12: WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU Zebra; see the file COPYING. If not, write to the Free
18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19: 02111-1307, USA. */
20:
21: #include <zebra.h>
22:
23: #include "prefix.h"
24: #include "linklist.h"
25: #include "memory.h"
26: #include "command.h"
27: #include "stream.h"
28: #include "filter.h"
29: #include "str.h"
30: #include "log.h"
31: #include "routemap.h"
32: #include "buffer.h"
33: #include "sockunion.h"
34: #include "plist.h"
35: #include "thread.h"
36: #include "workqueue.h"
37:
38: #include "bgpd/bgpd.h"
39: #include "bgpd/bgp_table.h"
40: #include "bgpd/bgp_route.h"
41: #include "bgpd/bgp_attr.h"
42: #include "bgpd/bgp_debug.h"
43: #include "bgpd/bgp_aspath.h"
44: #include "bgpd/bgp_regex.h"
45: #include "bgpd/bgp_community.h"
46: #include "bgpd/bgp_ecommunity.h"
47: #include "bgpd/bgp_clist.h"
48: #include "bgpd/bgp_packet.h"
49: #include "bgpd/bgp_filter.h"
50: #include "bgpd/bgp_fsm.h"
51: #include "bgpd/bgp_mplsvpn.h"
52: #include "bgpd/bgp_nexthop.h"
53: #include "bgpd/bgp_damp.h"
54: #include "bgpd/bgp_advertise.h"
55: #include "bgpd/bgp_zebra.h"
56: #include "bgpd/bgp_vty.h"
57:
58: /* Extern from bgp_dump.c */
59: extern const char *bgp_origin_str[];
60: extern const char *bgp_origin_long_str[];
61:
62: static struct bgp_node *
63: bgp_afi_node_get (struct bgp_table *table, afi_t afi, safi_t safi, struct prefix *p,
64: struct prefix_rd *prd)
65: {
66: struct bgp_node *rn;
67: struct bgp_node *prn = NULL;
68:
69: assert (table);
70: if (!table)
71: return NULL;
72:
73: if (safi == SAFI_MPLS_VPN)
74: {
75: prn = bgp_node_get (table, (struct prefix *) prd);
76:
77: if (prn->info == NULL)
78: prn->info = bgp_table_init (afi, safi);
79: else
80: bgp_unlock_node (prn);
81: table = prn->info;
82: }
83:
84: rn = bgp_node_get (table, p);
85:
86: if (safi == SAFI_MPLS_VPN)
87: rn->prn = prn;
88:
89: return rn;
90: }
91:
92: /* Allocate bgp_info_extra */
93: static struct bgp_info_extra *
94: bgp_info_extra_new (void)
95: {
96: struct bgp_info_extra *new;
97: new = XCALLOC (MTYPE_BGP_ROUTE_EXTRA, sizeof (struct bgp_info_extra));
98: return new;
99: }
100:
101: static void
102: bgp_info_extra_free (struct bgp_info_extra **extra)
103: {
104: if (extra && *extra)
105: {
106: if ((*extra)->damp_info)
107: bgp_damp_info_free ((*extra)->damp_info, 0);
108:
109: (*extra)->damp_info = NULL;
110:
111: XFREE (MTYPE_BGP_ROUTE_EXTRA, *extra);
112:
113: *extra = NULL;
114: }
115: }
116:
117: /* Get bgp_info extra information for the given bgp_info, lazy allocated
118: * if required.
119: */
120: struct bgp_info_extra *
121: bgp_info_extra_get (struct bgp_info *ri)
122: {
123: if (!ri->extra)
124: ri->extra = bgp_info_extra_new();
125: return ri->extra;
126: }
127:
128: /* Allocate new bgp info structure. */
129: static struct bgp_info *
130: bgp_info_new (void)
131: {
132: return XCALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
133: }
134:
135: /* Free bgp route information. */
136: static void
137: bgp_info_free (struct bgp_info *binfo)
138: {
139: if (binfo->attr)
140: bgp_attr_unintern (&binfo->attr);
141:
142: bgp_info_extra_free (&binfo->extra);
143:
144: peer_unlock (binfo->peer); /* bgp_info peer reference */
145:
146: XFREE (MTYPE_BGP_ROUTE, binfo);
147: }
148:
149: struct bgp_info *
150: bgp_info_lock (struct bgp_info *binfo)
151: {
152: binfo->lock++;
153: return binfo;
154: }
155:
156: struct bgp_info *
157: bgp_info_unlock (struct bgp_info *binfo)
158: {
159: assert (binfo && binfo->lock > 0);
160: binfo->lock--;
161:
162: if (binfo->lock == 0)
163: {
164: #if 0
165: zlog_debug ("%s: unlocked and freeing", __func__);
166: zlog_backtrace (LOG_DEBUG);
167: #endif
168: bgp_info_free (binfo);
169: return NULL;
170: }
171:
172: #if 0
173: if (binfo->lock == 1)
174: {
175: zlog_debug ("%s: unlocked to 1", __func__);
176: zlog_backtrace (LOG_DEBUG);
177: }
178: #endif
179:
180: return binfo;
181: }
182:
183: void
184: bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
185: {
186: struct bgp_info *top;
187:
188: top = rn->info;
189:
190: ri->next = rn->info;
191: ri->prev = NULL;
192: if (top)
193: top->prev = ri;
194: rn->info = ri;
195:
196: bgp_info_lock (ri);
197: bgp_lock_node (rn);
198: peer_lock (ri->peer); /* bgp_info peer reference */
199: }
200:
201: /* Do the actual removal of info from RIB, for use by bgp_process
202: completion callback *only* */
203: static void
204: bgp_info_reap (struct bgp_node *rn, struct bgp_info *ri)
205: {
206: if (ri->next)
207: ri->next->prev = ri->prev;
208: if (ri->prev)
209: ri->prev->next = ri->next;
210: else
211: rn->info = ri->next;
212:
213: bgp_info_unlock (ri);
214: bgp_unlock_node (rn);
215: }
216:
217: void
218: bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
219: {
220: bgp_info_set_flag (rn, ri, BGP_INFO_REMOVED);
221: /* set of previous already took care of pcount */
222: UNSET_FLAG (ri->flags, BGP_INFO_VALID);
223: }
224:
225: /* undo the effects of a previous call to bgp_info_delete; typically
226: called when a route is deleted and then quickly re-added before the
227: deletion has been processed */
228: static void
229: bgp_info_restore (struct bgp_node *rn, struct bgp_info *ri)
230: {
231: bgp_info_unset_flag (rn, ri, BGP_INFO_REMOVED);
232: /* unset of previous already took care of pcount */
233: SET_FLAG (ri->flags, BGP_INFO_VALID);
234: }
235:
236: /* Adjust pcount as required */
237: static void
238: bgp_pcount_adjust (struct bgp_node *rn, struct bgp_info *ri)
239: {
240: assert (rn && rn->table);
241: assert (ri && ri->peer && ri->peer->bgp);
242:
243: /* Ignore 'pcount' for RS-client tables */
244: if (rn->table->type != BGP_TABLE_MAIN
245: || ri->peer == ri->peer->bgp->peer_self)
246: return;
247:
248: if (BGP_INFO_HOLDDOWN (ri)
249: && CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
250: {
251:
252: UNSET_FLAG (ri->flags, BGP_INFO_COUNTED);
253:
254: /* slight hack, but more robust against errors. */
255: if (ri->peer->pcount[rn->table->afi][rn->table->safi])
256: ri->peer->pcount[rn->table->afi][rn->table->safi]--;
257: else
258: {
259: zlog_warn ("%s: Asked to decrement 0 prefix count for peer %s",
260: __func__, ri->peer->host);
261: zlog_backtrace (LOG_WARNING);
262: zlog_warn ("%s: Please report to Quagga bugzilla", __func__);
263: }
264: }
265: else if (!BGP_INFO_HOLDDOWN (ri)
266: && !CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
267: {
268: SET_FLAG (ri->flags, BGP_INFO_COUNTED);
269: ri->peer->pcount[rn->table->afi][rn->table->safi]++;
270: }
271: }
272:
273:
274: /* Set/unset bgp_info flags, adjusting any other state as needed.
275: * This is here primarily to keep prefix-count in check.
276: */
277: void
278: bgp_info_set_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
279: {
280: SET_FLAG (ri->flags, flag);
281:
282: /* early bath if we know it's not a flag that changes useability state */
283: if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
284: return;
285:
286: bgp_pcount_adjust (rn, ri);
287: }
288:
289: void
290: bgp_info_unset_flag (struct bgp_node *rn, struct bgp_info *ri, u_int32_t flag)
291: {
292: UNSET_FLAG (ri->flags, flag);
293:
294: /* early bath if we know it's not a flag that changes useability state */
295: if (!CHECK_FLAG (flag, BGP_INFO_VALID|BGP_INFO_UNUSEABLE))
296: return;
297:
298: bgp_pcount_adjust (rn, ri);
299: }
300:
301: /* Get MED value. If MED value is missing and "bgp bestpath
302: missing-as-worst" is specified, treat it as the worst value. */
303: static u_int32_t
304: bgp_med_value (struct attr *attr, struct bgp *bgp)
305: {
306: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
307: return attr->med;
308: else
309: {
310: if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
311: return BGP_MED_MAX;
312: else
313: return 0;
314: }
315: }
316:
317: /* Compare two bgp route entity. br is preferable then return 1. */
318: static int
319: bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist)
320: {
321: u_int32_t new_pref;
322: u_int32_t exist_pref;
323: u_int32_t new_med;
324: u_int32_t exist_med;
325: u_int32_t new_weight = 0;
326: u_int32_t exist_weight = 0;
327: struct in_addr new_id;
328: struct in_addr exist_id;
329: int new_cluster;
330: int exist_cluster;
331: int internal_as_route = 0;
332: int confed_as_route = 0;
333: int ret;
334:
335: /* 0. Null check. */
336: if (new == NULL)
337: return 0;
338: if (exist == NULL)
339: return 1;
340:
341: /* 1. Weight check. */
342: if (new->attr->extra)
343: new_weight = new->attr->extra->weight;
344: if (exist->attr->extra)
345: exist_weight = exist->attr->extra->weight;
346: if (new_weight > exist_weight)
347: return 1;
348: if (new_weight < exist_weight)
349: return 0;
350:
351: /* 2. Local preference check. */
352: if (new->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
353: new_pref = new->attr->local_pref;
354: else
355: new_pref = bgp->default_local_pref;
356:
357: if (exist->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
358: exist_pref = exist->attr->local_pref;
359: else
360: exist_pref = bgp->default_local_pref;
361:
362: if (new_pref > exist_pref)
363: return 1;
364: if (new_pref < exist_pref)
365: return 0;
366:
367: /* 3. Local route check. */
368: if (new->sub_type == BGP_ROUTE_STATIC)
369: return 1;
370: if (exist->sub_type == BGP_ROUTE_STATIC)
371: return 0;
372:
373: if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
374: return 1;
375: if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
376: return 0;
377:
378: if (new->sub_type == BGP_ROUTE_AGGREGATE)
379: return 1;
380: if (exist->sub_type == BGP_ROUTE_AGGREGATE)
381: return 0;
382:
383: /* 4. AS path length check. */
384: if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
385: {
386: int exist_hops = aspath_count_hops (exist->attr->aspath);
387: int exist_confeds = aspath_count_confeds (exist->attr->aspath);
388:
389: if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
390: {
391: int aspath_hops;
392:
393: aspath_hops = aspath_count_hops (new->attr->aspath);
394: aspath_hops += aspath_count_confeds (new->attr->aspath);
395:
396: if ( aspath_hops < (exist_hops + exist_confeds))
397: return 1;
398: if ( aspath_hops > (exist_hops + exist_confeds))
399: return 0;
400: }
401: else
402: {
403: int newhops = aspath_count_hops (new->attr->aspath);
404:
405: if (newhops < exist_hops)
406: return 1;
407: if (newhops > exist_hops)
408: return 0;
409: }
410: }
411:
412: /* 5. Origin check. */
413: if (new->attr->origin < exist->attr->origin)
414: return 1;
415: if (new->attr->origin > exist->attr->origin)
416: return 0;
417:
418: /* 6. MED check. */
419: internal_as_route = (aspath_count_hops (new->attr->aspath) == 0
420: && aspath_count_hops (exist->attr->aspath) == 0);
421: confed_as_route = (aspath_count_confeds (new->attr->aspath) > 0
422: && aspath_count_confeds (exist->attr->aspath) > 0
423: && aspath_count_hops (new->attr->aspath) == 0
424: && aspath_count_hops (exist->attr->aspath) == 0);
425:
426: if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
427: || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
428: && confed_as_route)
429: || aspath_cmp_left (new->attr->aspath, exist->attr->aspath)
430: || aspath_cmp_left_confed (new->attr->aspath, exist->attr->aspath)
431: || internal_as_route)
432: {
433: new_med = bgp_med_value (new->attr, bgp);
434: exist_med = bgp_med_value (exist->attr, bgp);
435:
436: if (new_med < exist_med)
437: return 1;
438: if (new_med > exist_med)
439: return 0;
440: }
441:
442: /* 7. Peer type check. */
443: if (peer_sort (new->peer) == BGP_PEER_EBGP
444: && peer_sort (exist->peer) == BGP_PEER_IBGP)
445: return 1;
446: if (peer_sort (new->peer) == BGP_PEER_EBGP
447: && peer_sort (exist->peer) == BGP_PEER_CONFED)
448: return 1;
449: if (peer_sort (new->peer) == BGP_PEER_IBGP
450: && peer_sort (exist->peer) == BGP_PEER_EBGP)
451: return 0;
452: if (peer_sort (new->peer) == BGP_PEER_CONFED
453: && peer_sort (exist->peer) == BGP_PEER_EBGP)
454: return 0;
455:
456: /* 8. IGP metric check. */
457: if (new->extra || exist->extra)
458: {
459: uint32_t newm = (new->extra ? new->extra->igpmetric : 0);
460: uint32_t existm = (exist->extra ? exist->extra->igpmetric : 0);
461:
462: if (newm < existm)
463: return 1;
464: if (newm > existm)
465: return 0;
466: }
467:
468: /* 9. Maximum path check. */
469:
470: /* 10. If both paths are external, prefer the path that was received
471: first (the oldest one). This step minimizes route-flap, since a
472: newer path won't displace an older one, even if it was the
473: preferred route based on the additional decision criteria below. */
474: if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
475: && peer_sort (new->peer) == BGP_PEER_EBGP
476: && peer_sort (exist->peer) == BGP_PEER_EBGP)
477: {
478: if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
479: return 1;
480: if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
481: return 0;
482: }
483:
484: /* 11. Rourter-ID comparision. */
485: if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
486: new_id.s_addr = new->attr->extra->originator_id.s_addr;
487: else
488: new_id.s_addr = new->peer->remote_id.s_addr;
489: if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
490: exist_id.s_addr = exist->attr->extra->originator_id.s_addr;
491: else
492: exist_id.s_addr = exist->peer->remote_id.s_addr;
493:
494: if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
495: return 1;
496: if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
497: return 0;
498:
499: /* 12. Cluster length comparision. */
500: if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
501: new_cluster = new->attr->extra->cluster->length;
502: else
503: new_cluster = 0;
504: if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
505: exist_cluster = exist->attr->extra->cluster->length;
506: else
507: exist_cluster = 0;
508:
509: if (new_cluster < exist_cluster)
510: return 1;
511: if (new_cluster > exist_cluster)
512: return 0;
513:
514: /* 13. Neighbor address comparision. */
515: ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
516:
517: if (ret == 1)
518: return 0;
519: if (ret == -1)
520: return 1;
521:
522: return 1;
523: }
524:
525: static enum filter_type
526: bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
527: afi_t afi, safi_t safi)
528: {
529: struct bgp_filter *filter;
530:
531: filter = &peer->filter[afi][safi];
532:
533: #define FILTER_EXIST_WARN(F,f,filter) \
534: if (BGP_DEBUG (update, UPDATE_IN) \
535: && !(F ## _IN (filter))) \
536: plog_warn (peer->log, "%s: Could not find configured input %s-list %s!", \
537: peer->host, #f, F ## _IN_NAME(filter));
538:
539: if (DISTRIBUTE_IN_NAME (filter)) {
540: FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
541:
542: if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
543: return FILTER_DENY;
544: }
545:
546: if (PREFIX_LIST_IN_NAME (filter)) {
547: FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
548:
549: if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
550: return FILTER_DENY;
551: }
552:
553: if (FILTER_LIST_IN_NAME (filter)) {
554: FILTER_EXIST_WARN(FILTER_LIST, as, filter);
555:
556: if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
557: return FILTER_DENY;
558: }
559:
560: return FILTER_PERMIT;
561: #undef FILTER_EXIST_WARN
562: }
563:
564: static enum filter_type
565: bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
566: afi_t afi, safi_t safi)
567: {
568: struct bgp_filter *filter;
569:
570: filter = &peer->filter[afi][safi];
571:
572: #define FILTER_EXIST_WARN(F,f,filter) \
573: if (BGP_DEBUG (update, UPDATE_OUT) \
574: && !(F ## _OUT (filter))) \
575: plog_warn (peer->log, "%s: Could not find configured output %s-list %s!", \
576: peer->host, #f, F ## _OUT_NAME(filter));
577:
578: if (DISTRIBUTE_OUT_NAME (filter)) {
579: FILTER_EXIST_WARN(DISTRIBUTE, distribute, filter);
580:
581: if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
582: return FILTER_DENY;
583: }
584:
585: if (PREFIX_LIST_OUT_NAME (filter)) {
586: FILTER_EXIST_WARN(PREFIX_LIST, prefix, filter);
587:
588: if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
589: return FILTER_DENY;
590: }
591:
592: if (FILTER_LIST_OUT_NAME (filter)) {
593: FILTER_EXIST_WARN(FILTER_LIST, as, filter);
594:
595: if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
596: return FILTER_DENY;
597: }
598:
599: return FILTER_PERMIT;
600: #undef FILTER_EXIST_WARN
601: }
602:
603: /* If community attribute includes no_export then return 1. */
604: static int
605: bgp_community_filter (struct peer *peer, struct attr *attr)
606: {
607: if (attr->community)
608: {
609: /* NO_ADVERTISE check. */
610: if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
611: return 1;
612:
613: /* NO_EXPORT check. */
614: if (peer_sort (peer) == BGP_PEER_EBGP &&
615: community_include (attr->community, COMMUNITY_NO_EXPORT))
616: return 1;
617:
618: /* NO_EXPORT_SUBCONFED check. */
619: if (peer_sort (peer) == BGP_PEER_EBGP
620: || peer_sort (peer) == BGP_PEER_CONFED)
621: if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
622: return 1;
623: }
624: return 0;
625: }
626:
627: /* Route reflection loop check. */
628: static int
629: bgp_cluster_filter (struct peer *peer, struct attr *attr)
630: {
631: struct in_addr cluster_id;
632:
633: if (attr->extra && attr->extra->cluster)
634: {
635: if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
636: cluster_id = peer->bgp->cluster_id;
637: else
638: cluster_id = peer->bgp->router_id;
639:
640: if (cluster_loop_check (attr->extra->cluster, cluster_id))
641: return 1;
642: }
643: return 0;
644: }
645:
646: static int
647: bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
648: afi_t afi, safi_t safi)
649: {
650: struct bgp_filter *filter;
651: struct bgp_info info;
652: route_map_result_t ret;
653:
654: filter = &peer->filter[afi][safi];
655:
656: /* Apply default weight value. */
657: if (peer->weight)
658: (bgp_attr_extra_get (attr))->weight = peer->weight;
659:
660: /* Route map apply. */
661: if (ROUTE_MAP_IN_NAME (filter))
662: {
663: /* Duplicate current value to new strucutre for modification. */
664: info.peer = peer;
665: info.attr = attr;
666:
667: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN);
668:
669: /* Apply BGP route map to the attribute. */
670: ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
671:
672: peer->rmap_type = 0;
673:
674: if (ret == RMAP_DENYMATCH)
675: {
676: /* Free newly generated AS path and community by route-map. */
677: bgp_attr_flush (attr);
678: return RMAP_DENY;
679: }
680: }
681: return RMAP_PERMIT;
682: }
683:
684: static int
685: bgp_export_modifier (struct peer *rsclient, struct peer *peer,
686: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
687: {
688: struct bgp_filter *filter;
689: struct bgp_info info;
690: route_map_result_t ret;
691:
692: filter = &peer->filter[afi][safi];
693:
694: /* Route map apply. */
695: if (ROUTE_MAP_EXPORT_NAME (filter))
696: {
697: /* Duplicate current value to new strucutre for modification. */
698: info.peer = rsclient;
699: info.attr = attr;
700:
701: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
702:
703: /* Apply BGP route map to the attribute. */
704: ret = route_map_apply (ROUTE_MAP_EXPORT (filter), p, RMAP_BGP, &info);
705:
706: rsclient->rmap_type = 0;
707:
708: if (ret == RMAP_DENYMATCH)
709: {
710: /* Free newly generated AS path and community by route-map. */
711: bgp_attr_flush (attr);
712: return RMAP_DENY;
713: }
714: }
715: return RMAP_PERMIT;
716: }
717:
718: static int
719: bgp_import_modifier (struct peer *rsclient, struct peer *peer,
720: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
721: {
722: struct bgp_filter *filter;
723: struct bgp_info info;
724: route_map_result_t ret;
725:
726: filter = &rsclient->filter[afi][safi];
727:
728: /* Apply default weight value. */
729: if (peer->weight)
730: (bgp_attr_extra_get (attr))->weight = peer->weight;
731:
732: /* Route map apply. */
733: if (ROUTE_MAP_IMPORT_NAME (filter))
734: {
735: /* Duplicate current value to new strucutre for modification. */
736: info.peer = peer;
737: info.attr = attr;
738:
739: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT);
740:
741: /* Apply BGP route map to the attribute. */
742: ret = route_map_apply (ROUTE_MAP_IMPORT (filter), p, RMAP_BGP, &info);
743:
744: peer->rmap_type = 0;
745:
746: if (ret == RMAP_DENYMATCH)
747: {
748: /* Free newly generated AS path and community by route-map. */
749: bgp_attr_flush (attr);
750: return RMAP_DENY;
751: }
752: }
753: return RMAP_PERMIT;
754: }
755:
756: static int
757: bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
758: struct attr *attr, afi_t afi, safi_t safi)
759: {
760: int ret;
761: char buf[SU_ADDRSTRLEN];
762: struct bgp_filter *filter;
763: struct peer *from;
764: struct bgp *bgp;
765: int transparent;
766: int reflect;
767:
768: from = ri->peer;
769: filter = &peer->filter[afi][safi];
770: bgp = peer->bgp;
771:
772: if (DISABLE_BGP_ANNOUNCE)
773: return 0;
774:
775: /* Do not send announces to RS-clients from the 'normal' bgp_table. */
776: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
777: return 0;
778:
779: /* Do not send back route to sender. */
780: if (from == peer)
781: return 0;
782:
783: /* If peer's id and route's nexthop are same. draft-ietf-idr-bgp4-23 5.1.3 */
784: if (p->family == AF_INET
785: && IPV4_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
786: return 0;
787: #ifdef HAVE_IPV6
788: if (p->family == AF_INET6
789: && IPV6_ADDR_SAME(&peer->remote_id, &ri->attr->nexthop))
790: return 0;
791: #endif
792:
793: /* Aggregate-address suppress check. */
794: if (ri->extra && ri->extra->suppress)
795: if (! UNSUPPRESS_MAP_NAME (filter))
796: return 0;
797:
798: /* Default route check. */
799: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
800: {
801: if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
802: return 0;
803: #ifdef HAVE_IPV6
804: else if (p->family == AF_INET6 && p->prefixlen == 0)
805: return 0;
806: #endif /* HAVE_IPV6 */
807: }
808:
809: /* Transparency check. */
810: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
811: && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
812: transparent = 1;
813: else
814: transparent = 0;
815:
816: /* If community is not disabled check the no-export and local. */
817: if (! transparent && bgp_community_filter (peer, ri->attr))
818: return 0;
819:
820: /* If the attribute has originator-id and it is same as remote
821: peer's id. */
822: if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
823: {
824: if (IPV4_ADDR_SAME (&peer->remote_id, &ri->attr->extra->originator_id))
825: {
826: if (BGP_DEBUG (filter, FILTER))
827: zlog (peer->log, LOG_DEBUG,
828: "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
829: peer->host,
830: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
831: p->prefixlen);
832: return 0;
833: }
834: }
835:
836: /* ORF prefix-list filter check */
837: if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
838: && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
839: || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
840: if (peer->orf_plist[afi][safi])
841: {
842: if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
843: return 0;
844: }
845:
846: /* Output filter check. */
847: if (bgp_output_filter (peer, p, ri->attr, afi, safi) == FILTER_DENY)
848: {
849: if (BGP_DEBUG (filter, FILTER))
850: zlog (peer->log, LOG_DEBUG,
851: "%s [Update:SEND] %s/%d is filtered",
852: peer->host,
853: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
854: p->prefixlen);
855: return 0;
856: }
857:
858: #ifdef BGP_SEND_ASPATH_CHECK
859: /* AS path loop check. */
860: if (aspath_loop_check (ri->attr->aspath, peer->as))
861: {
862: if (BGP_DEBUG (filter, FILTER))
863: zlog (peer->log, LOG_DEBUG,
864: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
865: peer->host, peer->as);
866: return 0;
867: }
868: #endif /* BGP_SEND_ASPATH_CHECK */
869:
870: /* If we're a CONFED we need to loop check the CONFED ID too */
871: if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
872: {
873: if (aspath_loop_check(ri->attr->aspath, bgp->confed_id))
874: {
875: if (BGP_DEBUG (filter, FILTER))
876: zlog (peer->log, LOG_DEBUG,
877: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
878: peer->host,
879: bgp->confed_id);
880: return 0;
881: }
882: }
883:
884: /* Route-Reflect check. */
885: if (peer_sort (from) == BGP_PEER_IBGP && peer_sort (peer) == BGP_PEER_IBGP)
886: reflect = 1;
887: else
888: reflect = 0;
889:
890: /* IBGP reflection check. */
891: if (reflect)
892: {
893: /* A route from a Client peer. */
894: if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
895: {
896: /* Reflect to all the Non-Client peers and also to the
897: Client peers other than the originator. Originator check
898: is already done. So there is noting to do. */
899: /* no bgp client-to-client reflection check. */
900: if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
901: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
902: return 0;
903: }
904: else
905: {
906: /* A route from a Non-client peer. Reflect to all other
907: clients. */
908: if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
909: return 0;
910: }
911: }
912:
913: /* For modify attribute, copy it to temporary structure. */
914: bgp_attr_dup (attr, ri->attr);
915:
916: /* If local-preference is not set. */
917: if ((peer_sort (peer) == BGP_PEER_IBGP
918: || peer_sort (peer) == BGP_PEER_CONFED)
919: && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
920: {
921: attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
922: attr->local_pref = bgp->default_local_pref;
923: }
924:
925: /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
926: if (peer_sort (peer) == BGP_PEER_EBGP
927: && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
928: {
929: if (ri->peer != bgp->peer_self && ! transparent
930: && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
931: attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
932: }
933:
934: /* next-hop-set */
935: if (transparent || reflect
936: || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
937: && ((p->family == AF_INET && attr->nexthop.s_addr)
938: #ifdef HAVE_IPV6
939: || (p->family == AF_INET6 &&
940: ! IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
941: #endif /* HAVE_IPV6 */
942: )))
943: {
944: /* NEXT-HOP Unchanged. */
945: }
946: else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
947: || (p->family == AF_INET && attr->nexthop.s_addr == 0)
948: #ifdef HAVE_IPV6
949: || (p->family == AF_INET6 &&
950: IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
951: #endif /* HAVE_IPV6 */
952: || (peer_sort (peer) == BGP_PEER_EBGP
953: && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
954: {
955: /* Set IPv4 nexthop. */
956: if (p->family == AF_INET)
957: {
958: if (safi == SAFI_MPLS_VPN)
959: memcpy (&attr->extra->mp_nexthop_global_in, &peer->nexthop.v4,
960: IPV4_MAX_BYTELEN);
961: else
962: memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
963: }
964: #ifdef HAVE_IPV6
965: /* Set IPv6 nexthop. */
966: if (p->family == AF_INET6)
967: {
968: /* IPv6 global nexthop must be included. */
969: memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
970: IPV6_MAX_BYTELEN);
971: attr->extra->mp_nexthop_len = 16;
972: }
973: #endif /* HAVE_IPV6 */
974: }
975:
976: #ifdef HAVE_IPV6
977: if (p->family == AF_INET6)
978: {
979: /* Left nexthop_local unchanged if so configured. */
980: if ( CHECK_FLAG (peer->af_flags[afi][safi],
981: PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
982: {
983: if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
984: attr->extra->mp_nexthop_len=32;
985: else
986: attr->extra->mp_nexthop_len=16;
987: }
988:
989: /* Default nexthop_local treatment for non-RS-Clients */
990: else
991: {
992: /* Link-local address should not be transit to different peer. */
993: attr->extra->mp_nexthop_len = 16;
994:
995: /* Set link-local address for shared network peer. */
996: if (peer->shared_network
997: && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
998: {
999: memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
1000: IPV6_MAX_BYTELEN);
1001: attr->extra->mp_nexthop_len = 32;
1002: }
1003:
1004: /* If bgpd act as BGP-4+ route-reflector, do not send link-local
1005: address.*/
1006: if (reflect)
1007: attr->extra->mp_nexthop_len = 16;
1008:
1009: /* If BGP-4+ link-local nexthop is not link-local nexthop. */
1010: if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
1011: attr->extra->mp_nexthop_len = 16;
1012: }
1013:
1014: }
1015: #endif /* HAVE_IPV6 */
1016:
1017: /* If this is EBGP peer and remove-private-AS is set. */
1018: if (peer_sort (peer) == BGP_PEER_EBGP
1019: && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1020: && aspath_private_as_check (attr->aspath))
1021: attr->aspath = aspath_empty_get ();
1022:
1023: /* Route map & unsuppress-map apply. */
1024: if (ROUTE_MAP_OUT_NAME (filter)
1025: || (ri->extra && ri->extra->suppress) )
1026: {
1027: struct bgp_info info;
1028: struct attr dummy_attr = { 0 };
1029:
1030: info.peer = peer;
1031: info.attr = attr;
1032:
1033: /* The route reflector is not allowed to modify the attributes
1034: of the reflected IBGP routes. */
1035: if (peer_sort (from) == BGP_PEER_IBGP
1036: && peer_sort (peer) == BGP_PEER_IBGP)
1037: {
1038: bgp_attr_dup (&dummy_attr, attr);
1039: info.attr = &dummy_attr;
1040: }
1041:
1042: SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT);
1043:
1044: if (ri->extra && ri->extra->suppress)
1045: ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1046: else
1047: ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1048:
1049: peer->rmap_type = 0;
1050:
1051: if (dummy_attr.extra)
1052: bgp_attr_extra_free (&dummy_attr);
1053:
1054: if (ret == RMAP_DENYMATCH)
1055: {
1056: bgp_attr_flush (attr);
1057: return 0;
1058: }
1059: }
1060: return 1;
1061: }
1062:
1063: static int
1064: bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
1065: struct prefix *p, struct attr *attr, afi_t afi, safi_t safi)
1066: {
1067: int ret;
1068: char buf[SU_ADDRSTRLEN];
1069: struct bgp_filter *filter;
1070: struct bgp_info info;
1071: struct peer *from;
1072: struct bgp *bgp;
1073:
1074: from = ri->peer;
1075: filter = &rsclient->filter[afi][safi];
1076: bgp = rsclient->bgp;
1077:
1078: if (DISABLE_BGP_ANNOUNCE)
1079: return 0;
1080:
1081: /* Do not send back route to sender. */
1082: if (from == rsclient)
1083: return 0;
1084:
1085: /* Aggregate-address suppress check. */
1086: if (ri->extra && ri->extra->suppress)
1087: if (! UNSUPPRESS_MAP_NAME (filter))
1088: return 0;
1089:
1090: /* Default route check. */
1091: if (CHECK_FLAG (rsclient->af_sflags[afi][safi],
1092: PEER_STATUS_DEFAULT_ORIGINATE))
1093: {
1094: if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
1095: return 0;
1096: #ifdef HAVE_IPV6
1097: else if (p->family == AF_INET6 && p->prefixlen == 0)
1098: return 0;
1099: #endif /* HAVE_IPV6 */
1100: }
1101:
1102: /* If the attribute has originator-id and it is same as remote
1103: peer's id. */
1104: if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
1105: {
1106: if (IPV4_ADDR_SAME (&rsclient->remote_id,
1107: &ri->attr->extra->originator_id))
1108: {
1109: if (BGP_DEBUG (filter, FILTER))
1110: zlog (rsclient->log, LOG_DEBUG,
1111: "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
1112: rsclient->host,
1113: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1114: p->prefixlen);
1115: return 0;
1116: }
1117: }
1118:
1119: /* ORF prefix-list filter check */
1120: if (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
1121: && (CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1122: || CHECK_FLAG (rsclient->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
1123: if (rsclient->orf_plist[afi][safi])
1124: {
1125: if (prefix_list_apply (rsclient->orf_plist[afi][safi], p) == PREFIX_DENY)
1126: return 0;
1127: }
1128:
1129: /* Output filter check. */
1130: if (bgp_output_filter (rsclient, p, ri->attr, afi, safi) == FILTER_DENY)
1131: {
1132: if (BGP_DEBUG (filter, FILTER))
1133: zlog (rsclient->log, LOG_DEBUG,
1134: "%s [Update:SEND] %s/%d is filtered",
1135: rsclient->host,
1136: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1137: p->prefixlen);
1138: return 0;
1139: }
1140:
1141: #ifdef BGP_SEND_ASPATH_CHECK
1142: /* AS path loop check. */
1143: if (aspath_loop_check (ri->attr->aspath, rsclient->as))
1144: {
1145: if (BGP_DEBUG (filter, FILTER))
1146: zlog (rsclient->log, LOG_DEBUG,
1147: "%s [Update:SEND] suppress announcement to peer AS %u is AS path.",
1148: rsclient->host, rsclient->as);
1149: return 0;
1150: }
1151: #endif /* BGP_SEND_ASPATH_CHECK */
1152:
1153: /* For modify attribute, copy it to temporary structure. */
1154: bgp_attr_dup (attr, ri->attr);
1155:
1156: /* next-hop-set */
1157: if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
1158: #ifdef HAVE_IPV6
1159: || (p->family == AF_INET6 &&
1160: IN6_IS_ADDR_UNSPECIFIED(&attr->extra->mp_nexthop_global))
1161: #endif /* HAVE_IPV6 */
1162: )
1163: {
1164: /* Set IPv4 nexthop. */
1165: if (p->family == AF_INET)
1166: {
1167: if (safi == SAFI_MPLS_VPN)
1168: memcpy (&attr->extra->mp_nexthop_global_in, &rsclient->nexthop.v4,
1169: IPV4_MAX_BYTELEN);
1170: else
1171: memcpy (&attr->nexthop, &rsclient->nexthop.v4, IPV4_MAX_BYTELEN);
1172: }
1173: #ifdef HAVE_IPV6
1174: /* Set IPv6 nexthop. */
1175: if (p->family == AF_INET6)
1176: {
1177: /* IPv6 global nexthop must be included. */
1178: memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
1179: IPV6_MAX_BYTELEN);
1180: attr->extra->mp_nexthop_len = 16;
1181: }
1182: #endif /* HAVE_IPV6 */
1183: }
1184:
1185: #ifdef HAVE_IPV6
1186: if (p->family == AF_INET6)
1187: {
1188: struct attr_extra *attre = attr->extra;
1189:
1190: assert (attr->extra);
1191:
1192: /* Left nexthop_local unchanged if so configured. */
1193: if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
1194: PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
1195: {
1196: if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1197: attre->mp_nexthop_len=32;
1198: else
1199: attre->mp_nexthop_len=16;
1200: }
1201:
1202: /* Default nexthop_local treatment for RS-Clients */
1203: else
1204: {
1205: /* Announcer and RS-Client are both in the same network */
1206: if (rsclient->shared_network && from->shared_network &&
1207: (rsclient->ifindex == from->ifindex))
1208: {
1209: if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
1210: attre->mp_nexthop_len=32;
1211: else
1212: attre->mp_nexthop_len=16;
1213: }
1214:
1215: /* Set link-local address for shared network peer. */
1216: else if (rsclient->shared_network
1217: && IN6_IS_ADDR_LINKLOCAL (&rsclient->nexthop.v6_local))
1218: {
1219: memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
1220: IPV6_MAX_BYTELEN);
1221: attre->mp_nexthop_len = 32;
1222: }
1223:
1224: else
1225: attre->mp_nexthop_len = 16;
1226: }
1227:
1228: }
1229: #endif /* HAVE_IPV6 */
1230:
1231:
1232: /* If this is EBGP peer and remove-private-AS is set. */
1233: if (peer_sort (rsclient) == BGP_PEER_EBGP
1234: && peer_af_flag_check (rsclient, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
1235: && aspath_private_as_check (attr->aspath))
1236: attr->aspath = aspath_empty_get ();
1237:
1238: /* Route map & unsuppress-map apply. */
1239: if (ROUTE_MAP_OUT_NAME (filter) || (ri->extra && ri->extra->suppress) )
1240: {
1241: info.peer = rsclient;
1242: info.attr = attr;
1243:
1244: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_OUT);
1245:
1246: if (ri->extra && ri->extra->suppress)
1247: ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
1248: else
1249: ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
1250:
1251: rsclient->rmap_type = 0;
1252:
1253: if (ret == RMAP_DENYMATCH)
1254: {
1255: bgp_attr_flush (attr);
1256: return 0;
1257: }
1258: }
1259:
1260: return 1;
1261: }
1262:
1263: struct bgp_info_pair
1264: {
1265: struct bgp_info *old;
1266: struct bgp_info *new;
1267: };
1268:
1269: static void
1270: bgp_best_selection (struct bgp *bgp, struct bgp_node *rn, struct bgp_info_pair *result)
1271: {
1272: struct bgp_info *new_select;
1273: struct bgp_info *old_select;
1274: struct bgp_info *ri;
1275: struct bgp_info *ri1;
1276: struct bgp_info *ri2;
1277: struct bgp_info *nextri = NULL;
1278:
1279: /* bgp deterministic-med */
1280: new_select = NULL;
1281: if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
1282: for (ri1 = rn->info; ri1; ri1 = ri1->next)
1283: {
1284: if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
1285: continue;
1286: if (BGP_INFO_HOLDDOWN (ri1))
1287: continue;
1288:
1289: new_select = ri1;
1290: if (ri1->next)
1291: for (ri2 = ri1->next; ri2; ri2 = ri2->next)
1292: {
1293: if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
1294: continue;
1295: if (BGP_INFO_HOLDDOWN (ri2))
1296: continue;
1297:
1298: if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
1299: || aspath_cmp_left_confed (ri1->attr->aspath,
1300: ri2->attr->aspath))
1301: {
1302: if (bgp_info_cmp (bgp, ri2, new_select))
1303: {
1304: bgp_info_unset_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1305: new_select = ri2;
1306: }
1307:
1308: bgp_info_set_flag (rn, ri2, BGP_INFO_DMED_CHECK);
1309: }
1310: }
1311: bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_CHECK);
1312: bgp_info_set_flag (rn, new_select, BGP_INFO_DMED_SELECTED);
1313: }
1314:
1315: /* Check old selected route and new selected route. */
1316: old_select = NULL;
1317: new_select = NULL;
1318: for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1); ri = nextri)
1319: {
1320: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
1321: old_select = ri;
1322:
1323: if (BGP_INFO_HOLDDOWN (ri))
1324: {
1325: /* reap REMOVED routes, if needs be
1326: * selected route must stay for a while longer though
1327: */
1328: if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
1329: && (ri != old_select))
1330: bgp_info_reap (rn, ri);
1331:
1332: continue;
1333: }
1334:
1335: if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
1336: && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
1337: {
1338: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1339: continue;
1340: }
1341: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_CHECK);
1342: bgp_info_unset_flag (rn, ri, BGP_INFO_DMED_SELECTED);
1343:
1344: if (bgp_info_cmp (bgp, ri, new_select))
1345: new_select = ri;
1346: }
1347:
1348: result->old = old_select;
1349: result->new = new_select;
1350:
1351: return;
1352: }
1353:
1354: static int
1355: bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
1356: struct bgp_node *rn, afi_t afi, safi_t safi)
1357: {
1358: struct prefix *p;
1359: struct attr attr = { 0 };
1360:
1361: p = &rn->p;
1362:
1363: /* Announce route to Established peer. */
1364: if (peer->status != Established)
1365: return 0;
1366:
1367: /* Address family configuration check. */
1368: if (! peer->afc_nego[afi][safi])
1369: return 0;
1370:
1371: /* First update is deferred until ORF or ROUTE-REFRESH is received */
1372: if (CHECK_FLAG (peer->af_sflags[afi][safi],
1373: PEER_STATUS_ORF_WAIT_REFRESH))
1374: return 0;
1375:
1376: switch (rn->table->type)
1377: {
1378: case BGP_TABLE_MAIN:
1379: /* Announcement to peer->conf. If the route is filtered,
1380: withdraw it. */
1381: if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
1382: bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1383: else
1384: bgp_adj_out_unset (rn, peer, p, afi, safi);
1385: break;
1386: case BGP_TABLE_RSCLIENT:
1387: /* Announcement to peer->conf. If the route is filtered,
1388: withdraw it. */
1389: if (selected &&
1390: bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
1391: bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
1392: else
1393: bgp_adj_out_unset (rn, peer, p, afi, safi);
1394: break;
1395: }
1396:
1397: bgp_attr_extra_free (&attr);
1398:
1399: return 0;
1400: }
1401:
1402: struct bgp_process_queue
1403: {
1404: struct bgp *bgp;
1405: struct bgp_node *rn;
1406: afi_t afi;
1407: safi_t safi;
1408: };
1409:
1410: static wq_item_status
1411: bgp_process_rsclient (struct work_queue *wq, void *data)
1412: {
1413: struct bgp_process_queue *pq = data;
1414: struct bgp *bgp = pq->bgp;
1415: struct bgp_node *rn = pq->rn;
1416: afi_t afi = pq->afi;
1417: safi_t safi = pq->safi;
1418: struct bgp_info *new_select;
1419: struct bgp_info *old_select;
1420: struct bgp_info_pair old_and_new;
1421: struct listnode *node, *nnode;
1422: struct peer *rsclient = rn->table->owner;
1423:
1424: /* Best path selection. */
1425: bgp_best_selection (bgp, rn, &old_and_new);
1426: new_select = old_and_new.new;
1427: old_select = old_and_new.old;
1428:
1429: if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
1430: {
1431: if (rsclient->group)
1432: for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, rsclient))
1433: {
1434: /* Nothing to do. */
1435: if (old_select && old_select == new_select)
1436: if (!CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1437: continue;
1438:
1439: if (old_select)
1440: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1441: if (new_select)
1442: {
1443: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1444: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1445: }
1446:
1447: bgp_process_announce_selected (rsclient, new_select, rn,
1448: afi, safi);
1449: }
1450: }
1451: else
1452: {
1453: if (old_select)
1454: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1455: if (new_select)
1456: {
1457: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1458: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1459: }
1460: bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
1461: }
1462:
1463: if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1464: bgp_info_reap (rn, old_select);
1465:
1466: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1467: return WQ_SUCCESS;
1468: }
1469:
1470: static wq_item_status
1471: bgp_process_main (struct work_queue *wq, void *data)
1472: {
1473: struct bgp_process_queue *pq = data;
1474: struct bgp *bgp = pq->bgp;
1475: struct bgp_node *rn = pq->rn;
1476: afi_t afi = pq->afi;
1477: safi_t safi = pq->safi;
1478: struct prefix *p = &rn->p;
1479: struct bgp_info *new_select;
1480: struct bgp_info *old_select;
1481: struct bgp_info_pair old_and_new;
1482: struct listnode *node, *nnode;
1483: struct peer *peer;
1484:
1485: /* Best path selection. */
1486: bgp_best_selection (bgp, rn, &old_and_new);
1487: old_select = old_and_new.old;
1488: new_select = old_and_new.new;
1489:
1490: /* Nothing to do. */
1491: if (old_select && old_select == new_select)
1492: {
1493: if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
1494: {
1495: if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED))
1496: bgp_zebra_announce (p, old_select, bgp);
1497:
1498: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1499: return WQ_SUCCESS;
1500: }
1501: }
1502:
1503: if (old_select)
1504: bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
1505: if (new_select)
1506: {
1507: bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
1508: bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
1509: }
1510:
1511:
1512: /* Check each BGP peer. */
1513: for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
1514: {
1515: bgp_process_announce_selected (peer, new_select, rn, afi, safi);
1516: }
1517:
1518: /* FIB update. */
1519: if (safi == SAFI_UNICAST && ! bgp->name &&
1520: ! bgp_option_check (BGP_OPT_NO_FIB))
1521: {
1522: if (new_select
1523: && new_select->type == ZEBRA_ROUTE_BGP
1524: && new_select->sub_type == BGP_ROUTE_NORMAL)
1525: bgp_zebra_announce (p, new_select, bgp);
1526: else
1527: {
1528: /* Withdraw the route from the kernel. */
1529: if (old_select
1530: && old_select->type == ZEBRA_ROUTE_BGP
1531: && old_select->sub_type == BGP_ROUTE_NORMAL)
1532: bgp_zebra_withdraw (p, old_select);
1533: }
1534: }
1535:
1536: /* Reap old select bgp_info, it it has been removed */
1537: if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
1538: bgp_info_reap (rn, old_select);
1539:
1540: UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
1541: return WQ_SUCCESS;
1542: }
1543:
1544: static void
1545: bgp_processq_del (struct work_queue *wq, void *data)
1546: {
1547: struct bgp_process_queue *pq = data;
1548: struct bgp_table *table = pq->rn->table;
1549:
1550: bgp_unlock (pq->bgp);
1551: bgp_unlock_node (pq->rn);
1552: bgp_table_unlock (table);
1553: XFREE (MTYPE_BGP_PROCESS_QUEUE, pq);
1554: }
1555:
1556: static void
1557: bgp_process_queue_init (void)
1558: {
1559: bm->process_main_queue
1560: = work_queue_new (bm->master, "process_main_queue");
1561: bm->process_rsclient_queue
1562: = work_queue_new (bm->master, "process_rsclient_queue");
1563:
1564: if ( !(bm->process_main_queue && bm->process_rsclient_queue) )
1565: {
1566: zlog_err ("%s: Failed to allocate work queue", __func__);
1567: exit (1);
1568: }
1569:
1570: bm->process_main_queue->spec.workfunc = &bgp_process_main;
1571: bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
1572: bm->process_main_queue->spec.max_retries = 0;
1573: bm->process_main_queue->spec.hold = 50;
1574:
1575: memcpy (bm->process_rsclient_queue, bm->process_main_queue,
1576: sizeof (struct work_queue *));
1577: bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
1578: }
1579:
1580: void
1581: bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
1582: {
1583: struct bgp_process_queue *pqnode;
1584:
1585: /* already scheduled for processing? */
1586: if (CHECK_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED))
1587: return;
1588:
1589: if ( (bm->process_main_queue == NULL) ||
1590: (bm->process_rsclient_queue == NULL) )
1591: bgp_process_queue_init ();
1592:
1593: pqnode = XCALLOC (MTYPE_BGP_PROCESS_QUEUE,
1594: sizeof (struct bgp_process_queue));
1595: if (!pqnode)
1596: return;
1597:
1598: /* all unlocked in bgp_processq_del */
1599: bgp_table_lock (rn->table);
1600: pqnode->rn = bgp_lock_node (rn);
1601: pqnode->bgp = bgp;
1602: bgp_lock (bgp);
1603: pqnode->afi = afi;
1604: pqnode->safi = safi;
1605:
1606: switch (rn->table->type)
1607: {
1608: case BGP_TABLE_MAIN:
1609: work_queue_add (bm->process_main_queue, pqnode);
1610: break;
1611: case BGP_TABLE_RSCLIENT:
1612: work_queue_add (bm->process_rsclient_queue, pqnode);
1613: break;
1614: }
1615:
1616: return;
1617: }
1618:
1619: static int
1620: bgp_maximum_prefix_restart_timer (struct thread *thread)
1621: {
1622: struct peer *peer;
1623:
1624: peer = THREAD_ARG (thread);
1625: peer->t_pmax_restart = NULL;
1626:
1627: if (BGP_DEBUG (events, EVENTS))
1628: zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
1629: peer->host);
1630:
1631: peer_clear (peer);
1632:
1633: return 0;
1634: }
1635:
1636: int
1637: bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
1638: safi_t safi, int always)
1639: {
1640: if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
1641: return 0;
1642:
1643: if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
1644: {
1645: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
1646: && ! always)
1647: return 0;
1648:
1649: zlog (peer->log, LOG_INFO,
1650: "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
1651: "limit %ld", afi_safi_print (afi, safi), peer->host,
1652: peer->pcount[afi][safi], peer->pmax[afi][safi]);
1653: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1654:
1655: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
1656: return 0;
1657:
1658: {
1659: u_int8_t ndata[7];
1660:
1661: if (safi == SAFI_MPLS_VPN)
1662: safi = BGP_SAFI_VPNV4;
1663:
1664: ndata[0] = (afi >> 8);
1665: ndata[1] = afi;
1666: ndata[2] = safi;
1667: ndata[3] = (peer->pmax[afi][safi] >> 24);
1668: ndata[4] = (peer->pmax[afi][safi] >> 16);
1669: ndata[5] = (peer->pmax[afi][safi] >> 8);
1670: ndata[6] = (peer->pmax[afi][safi]);
1671:
1672: SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
1673: bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
1674: BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
1675: }
1676:
1677: /* restart timer start */
1678: if (peer->pmax_restart[afi][safi])
1679: {
1680: peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
1681:
1682: if (BGP_DEBUG (events, EVENTS))
1683: zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
1684: peer->host, peer->v_pmax_restart);
1685:
1686: BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
1687: peer->v_pmax_restart);
1688: }
1689:
1690: return 1;
1691: }
1692: else
1693: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
1694:
1695: if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
1696: {
1697: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
1698: && ! always)
1699: return 0;
1700:
1701: zlog (peer->log, LOG_INFO,
1702: "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
1703: afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
1704: peer->pmax[afi][safi]);
1705: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1706: }
1707: else
1708: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
1709: return 0;
1710: }
1711:
1712: /* Unconditionally remove the route from the RIB, without taking
1713: * damping into consideration (eg, because the session went down)
1714: */
1715: static void
1716: bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1717: afi_t afi, safi_t safi)
1718: {
1719: bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1720:
1721: if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1722: bgp_info_delete (rn, ri); /* keep historical info */
1723:
1724: bgp_process (peer->bgp, rn, afi, safi);
1725: }
1726:
1727: static void
1728: bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
1729: afi_t afi, safi_t safi)
1730: {
1731: int status = BGP_DAMP_NONE;
1732:
1733: /* apply dampening, if result is suppressed, we'll be retaining
1734: * the bgp_info in the RIB for historical reference.
1735: */
1736: if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
1737: && peer_sort (peer) == BGP_PEER_EBGP)
1738: if ( (status = bgp_damp_withdraw (ri, rn, afi, safi, 0))
1739: == BGP_DAMP_SUPPRESSED)
1740: {
1741: bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
1742: return;
1743: }
1744:
1745: bgp_rib_remove (rn, ri, peer, afi, safi);
1746: }
1747:
1748: static void
1749: bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1750: struct attr *attr, struct peer *peer, struct prefix *p, int type,
1751: int sub_type, struct prefix_rd *prd, u_char *tag)
1752: {
1753: struct bgp_node *rn;
1754: struct bgp *bgp;
1755: struct attr new_attr = { 0 };
1756: struct attr *attr_new;
1757: struct attr *attr_new2;
1758: struct bgp_info *ri;
1759: struct bgp_info *new;
1760: const char *reason;
1761: char buf[SU_ADDRSTRLEN];
1762:
1763: /* Do not insert announces from a rsclient into its own 'bgp_table'. */
1764: if (peer == rsclient)
1765: return;
1766:
1767: bgp = peer->bgp;
1768: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1769:
1770: /* Check previously received route. */
1771: for (ri = rn->info; ri; ri = ri->next)
1772: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1773: break;
1774:
1775: /* AS path loop check. */
1776: if (aspath_loop_check (attr->aspath, rsclient->as) > peer->allowas_in[afi][safi])
1777: {
1778: reason = "as-path contains our own AS;";
1779: goto filtered;
1780: }
1781:
1782: /* Route reflector originator ID check. */
1783: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
1784: && IPV4_ADDR_SAME (&rsclient->remote_id, &attr->extra->originator_id))
1785: {
1786: reason = "originator is us;";
1787: goto filtered;
1788: }
1789:
1790: bgp_attr_dup (&new_attr, attr);
1791:
1792: /* Apply export policy. */
1793: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT) &&
1794: bgp_export_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1795: {
1796: reason = "export-policy;";
1797: goto filtered;
1798: }
1799:
1800: attr_new2 = bgp_attr_intern (&new_attr);
1801:
1802: /* Apply import policy. */
1803: if (bgp_import_modifier (rsclient, peer, p, &new_attr, afi, safi) == RMAP_DENY)
1804: {
1805: bgp_attr_unintern (&attr_new2);
1806:
1807: reason = "import-policy;";
1808: goto filtered;
1809: }
1810:
1811: attr_new = bgp_attr_intern (&new_attr);
1812: bgp_attr_unintern (&attr_new2);
1813:
1814: /* IPv4 unicast next hop check. */
1815: if (afi == AFI_IP && safi == SAFI_UNICAST)
1816: {
1817: /* Next hop must not be 0.0.0.0 nor Class E address. */
1818: if (new_attr.nexthop.s_addr == 0
1819: || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
1820: {
1821: bgp_attr_unintern (&attr_new);
1822:
1823: reason = "martian next-hop;";
1824: goto filtered;
1825: }
1826: }
1827:
1828: /* new_attr isn't passed to any functions after here */
1829: bgp_attr_extra_free (&new_attr);
1830:
1831: /* If the update is implicit withdraw. */
1832: if (ri)
1833: {
1834: ri->uptime = bgp_clock ();
1835:
1836: /* Same attribute comes in. */
1837: if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)
1838: && attrhash_cmp (ri->attr, attr_new))
1839: {
1840:
1841: bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1842:
1843: if (BGP_DEBUG (update, UPDATE_IN))
1844: zlog (peer->log, LOG_DEBUG,
1845: "%s rcvd %s/%d for RS-client %s...duplicate ignored",
1846: peer->host,
1847: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1848: p->prefixlen, rsclient->host);
1849:
1850: bgp_unlock_node (rn);
1851: bgp_attr_unintern (&attr_new);
1852:
1853: return;
1854: }
1855:
1856: /* Withdraw/Announce before we fully processed the withdraw */
1857: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1858: bgp_info_restore (rn, ri);
1859:
1860: /* Received Logging. */
1861: if (BGP_DEBUG (update, UPDATE_IN))
1862: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1863: peer->host,
1864: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1865: p->prefixlen, rsclient->host);
1866:
1867: /* The attribute is changed. */
1868: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
1869:
1870: /* Update to new attribute. */
1871: bgp_attr_unintern (&ri->attr);
1872: ri->attr = attr_new;
1873:
1874: /* Update MPLS tag. */
1875: if (safi == SAFI_MPLS_VPN)
1876: memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
1877:
1878: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
1879:
1880: /* Process change. */
1881: bgp_process (bgp, rn, afi, safi);
1882: bgp_unlock_node (rn);
1883:
1884: return;
1885: }
1886:
1887: /* Received Logging. */
1888: if (BGP_DEBUG (update, UPDATE_IN))
1889: {
1890: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s",
1891: peer->host,
1892: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1893: p->prefixlen, rsclient->host);
1894: }
1895:
1896: /* Make new BGP info. */
1897: new = bgp_info_new ();
1898: new->type = type;
1899: new->sub_type = sub_type;
1900: new->peer = peer;
1901: new->attr = attr_new;
1902: new->uptime = bgp_clock ();
1903:
1904: /* Update MPLS tag. */
1905: if (safi == SAFI_MPLS_VPN)
1906: memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
1907:
1908: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
1909:
1910: /* Register new BGP information. */
1911: bgp_info_add (rn, new);
1912:
1913: /* route_node_get lock */
1914: bgp_unlock_node (rn);
1915:
1916: /* Process change. */
1917: bgp_process (bgp, rn, afi, safi);
1918:
1919: bgp_attr_extra_free (&new_attr);
1920:
1921: return;
1922:
1923: filtered:
1924:
1925: /* This BGP update is filtered. Log the reason then update BGP entry. */
1926: if (BGP_DEBUG (update, UPDATE_IN))
1927: zlog (peer->log, LOG_DEBUG,
1928: "%s rcvd UPDATE about %s/%d -- DENIED for RS-client %s due to: %s",
1929: peer->host,
1930: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1931: p->prefixlen, rsclient->host, reason);
1932:
1933: if (ri)
1934: bgp_rib_remove (rn, ri, peer, afi, safi);
1935:
1936: bgp_unlock_node (rn);
1937:
1938: if (new_attr.extra)
1939: bgp_attr_extra_free (&new_attr);
1940:
1941: return;
1942: }
1943:
1944: static void
1945: bgp_withdraw_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,
1946: struct peer *peer, struct prefix *p, int type, int sub_type,
1947: struct prefix_rd *prd, u_char *tag)
1948: {
1949: struct bgp_node *rn;
1950: struct bgp_info *ri;
1951: char buf[SU_ADDRSTRLEN];
1952:
1953: if (rsclient == peer)
1954: return;
1955:
1956: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, prd);
1957:
1958: /* Lookup withdrawn route. */
1959: for (ri = rn->info; ri; ri = ri->next)
1960: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
1961: break;
1962:
1963: /* Withdraw specified route from routing table. */
1964: if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
1965: bgp_rib_withdraw (rn, ri, peer, afi, safi);
1966: else if (BGP_DEBUG (update, UPDATE_IN))
1967: zlog (peer->log, LOG_DEBUG,
1968: "%s Can't find the route %s/%d", peer->host,
1969: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
1970: p->prefixlen);
1971:
1972: /* Unlock bgp_node_get() lock. */
1973: bgp_unlock_node (rn);
1974: }
1975:
1976: static int
1977: bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,
1978: afi_t afi, safi_t safi, int type, int sub_type,
1979: struct prefix_rd *prd, u_char *tag, int soft_reconfig)
1980: {
1981: int ret;
1982: int aspath_loop_count = 0;
1983: struct bgp_node *rn;
1984: struct bgp *bgp;
1985: struct attr new_attr = { 0 };
1986: struct attr *attr_new;
1987: struct bgp_info *ri;
1988: struct bgp_info *new;
1989: const char *reason;
1990: char buf[SU_ADDRSTRLEN];
1991:
1992: bgp = peer->bgp;
1993: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
1994:
1995: /* When peer's soft reconfiguration enabled. Record input packet in
1996: Adj-RIBs-In. */
1997: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
1998: && peer != bgp->peer_self && ! soft_reconfig)
1999: bgp_adj_in_set (rn, peer, attr);
2000:
2001: /* Check previously received route. */
2002: for (ri = rn->info; ri; ri = ri->next)
2003: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2004: break;
2005:
2006: /* AS path local-as loop check. */
2007: if (peer->change_local_as)
2008: {
2009: if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
2010: aspath_loop_count = 1;
2011:
2012: if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count)
2013: {
2014: reason = "as-path contains our own AS;";
2015: goto filtered;
2016: }
2017: }
2018:
2019: /* AS path loop check. */
2020: if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
2021: || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
2022: && aspath_loop_check(attr->aspath, bgp->confed_id)
2023: > peer->allowas_in[afi][safi]))
2024: {
2025: reason = "as-path contains our own AS;";
2026: goto filtered;
2027: }
2028:
2029: /* Route reflector originator ID check. */
2030: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
2031: && IPV4_ADDR_SAME (&bgp->router_id, &attr->extra->originator_id))
2032: {
2033: reason = "originator is us;";
2034: goto filtered;
2035: }
2036:
2037: /* Route reflector cluster ID check. */
2038: if (bgp_cluster_filter (peer, attr))
2039: {
2040: reason = "reflected from the same cluster;";
2041: goto filtered;
2042: }
2043:
2044: /* Apply incoming filter. */
2045: if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
2046: {
2047: reason = "filter;";
2048: goto filtered;
2049: }
2050:
2051: /* Apply incoming route-map. */
2052: bgp_attr_dup (&new_attr, attr);
2053:
2054: if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
2055: {
2056: reason = "route-map;";
2057: goto filtered;
2058: }
2059:
2060: /* IPv4 unicast next hop check. */
2061: if (afi == AFI_IP && safi == SAFI_UNICAST)
2062: {
2063: /* If the peer is EBGP and nexthop is not on connected route,
2064: discard it. */
2065: if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
2066: && ! bgp_nexthop_check_ebgp (afi, &new_attr)
2067: && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
2068: {
2069: reason = "non-connected next-hop;";
2070: goto filtered;
2071: }
2072:
2073: /* Next hop must not be 0.0.0.0 nor Class E address. Next hop
2074: must not be my own address. */
2075: if (bgp_nexthop_self (afi, &new_attr)
2076: || new_attr.nexthop.s_addr == 0
2077: || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
2078: {
2079: reason = "martian next-hop;";
2080: goto filtered;
2081: }
2082: }
2083:
2084: attr_new = bgp_attr_intern (&new_attr);
2085:
2086: /* If the update is implicit withdraw. */
2087: if (ri)
2088: {
2089: ri->uptime = bgp_clock ();
2090:
2091: /* Same attribute comes in. */
2092: if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)
2093: && attrhash_cmp (ri->attr, attr_new))
2094: {
2095: bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2096:
2097: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2098: && peer_sort (peer) == BGP_PEER_EBGP
2099: && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2100: {
2101: if (BGP_DEBUG (update, UPDATE_IN))
2102: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2103: peer->host,
2104: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2105: p->prefixlen);
2106:
2107: if (bgp_damp_update (ri, rn, afi, safi) != BGP_DAMP_SUPPRESSED)
2108: {
2109: bgp_aggregate_increment (bgp, p, ri, afi, safi);
2110: bgp_process (bgp, rn, afi, safi);
2111: }
2112: }
2113: else /* Duplicate - odd */
2114: {
2115: if (BGP_DEBUG (update, UPDATE_IN))
2116: zlog (peer->log, LOG_DEBUG,
2117: "%s rcvd %s/%d...duplicate ignored",
2118: peer->host,
2119: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2120: p->prefixlen);
2121:
2122: /* graceful restart STALE flag unset. */
2123: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2124: {
2125: bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2126: bgp_process (bgp, rn, afi, safi);
2127: }
2128: }
2129:
2130: bgp_unlock_node (rn);
2131: bgp_attr_unintern (&attr_new);
2132: bgp_attr_extra_free (&new_attr);
2133:
2134: return 0;
2135: }
2136:
2137: /* Withdraw/Announce before we fully processed the withdraw */
2138: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
2139: {
2140: if (BGP_DEBUG (update, UPDATE_IN))
2141: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing",
2142: peer->host,
2143: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2144: p->prefixlen);
2145: bgp_info_restore (rn, ri);
2146: }
2147:
2148: /* Received Logging. */
2149: if (BGP_DEBUG (update, UPDATE_IN))
2150: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2151: peer->host,
2152: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2153: p->prefixlen);
2154:
2155: /* graceful restart STALE flag unset. */
2156: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2157: bgp_info_unset_flag (rn, ri, BGP_INFO_STALE);
2158:
2159: /* The attribute is changed. */
2160: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
2161:
2162: /* implicit withdraw, decrement aggregate and pcount here.
2163: * only if update is accepted, they'll increment below.
2164: */
2165: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
2166:
2167: /* Update bgp route dampening information. */
2168: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2169: && peer_sort (peer) == BGP_PEER_EBGP)
2170: {
2171: /* This is implicit withdraw so we should update dampening
2172: information. */
2173: if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2174: bgp_damp_withdraw (ri, rn, afi, safi, 1);
2175: }
2176:
2177: /* Update to new attribute. */
2178: bgp_attr_unintern (&ri->attr);
2179: ri->attr = attr_new;
2180:
2181: /* Update MPLS tag. */
2182: if (safi == SAFI_MPLS_VPN)
2183: memcpy ((bgp_info_extra_get (ri))->tag, tag, 3);
2184:
2185: /* Update bgp route dampening information. */
2186: if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
2187: && peer_sort (peer) == BGP_PEER_EBGP)
2188: {
2189: /* Now we do normal update dampening. */
2190: ret = bgp_damp_update (ri, rn, afi, safi);
2191: if (ret == BGP_DAMP_SUPPRESSED)
2192: {
2193: bgp_unlock_node (rn);
2194: bgp_attr_extra_free (&new_attr);
2195: return 0;
2196: }
2197: }
2198:
2199: /* Nexthop reachability check. */
2200: if ((afi == AFI_IP || afi == AFI_IP6)
2201: && safi == SAFI_UNICAST
2202: && (peer_sort (peer) == BGP_PEER_IBGP
2203: || peer_sort (peer) == BGP_PEER_CONFED
2204: || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
2205: || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2206: {
2207: if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
2208: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2209: else
2210: bgp_info_unset_flag (rn, ri, BGP_INFO_VALID);
2211: }
2212: else
2213: bgp_info_set_flag (rn, ri, BGP_INFO_VALID);
2214:
2215: /* Process change. */
2216: bgp_aggregate_increment (bgp, p, ri, afi, safi);
2217:
2218: bgp_process (bgp, rn, afi, safi);
2219: bgp_unlock_node (rn);
2220: bgp_attr_extra_free (&new_attr);
2221:
2222: return 0;
2223: }
2224:
2225: /* Received Logging. */
2226: if (BGP_DEBUG (update, UPDATE_IN))
2227: {
2228: zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",
2229: peer->host,
2230: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2231: p->prefixlen);
2232: }
2233:
2234: /* Make new BGP info. */
2235: new = bgp_info_new ();
2236: new->type = type;
2237: new->sub_type = sub_type;
2238: new->peer = peer;
2239: new->attr = attr_new;
2240: new->uptime = bgp_clock ();
2241:
2242: /* Update MPLS tag. */
2243: if (safi == SAFI_MPLS_VPN)
2244: memcpy ((bgp_info_extra_get (new))->tag, tag, 3);
2245:
2246: /* Nexthop reachability check. */
2247: if ((afi == AFI_IP || afi == AFI_IP6)
2248: && safi == SAFI_UNICAST
2249: && (peer_sort (peer) == BGP_PEER_IBGP
2250: || peer_sort (peer) == BGP_PEER_CONFED
2251: || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
2252: || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
2253: {
2254: if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
2255: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2256: else
2257: bgp_info_unset_flag (rn, new, BGP_INFO_VALID);
2258: }
2259: else
2260: bgp_info_set_flag (rn, new, BGP_INFO_VALID);
2261:
2262: /* Increment prefix */
2263: bgp_aggregate_increment (bgp, p, new, afi, safi);
2264:
2265: /* Register new BGP information. */
2266: bgp_info_add (rn, new);
2267:
2268: /* route_node_get lock */
2269: bgp_unlock_node (rn);
2270:
2271: bgp_attr_extra_free (&new_attr);
2272:
2273: /* If maximum prefix count is configured and current prefix
2274: count exeed it. */
2275: if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
2276: return -1;
2277:
2278: /* Process change. */
2279: bgp_process (bgp, rn, afi, safi);
2280:
2281: return 0;
2282:
2283: /* This BGP update is filtered. Log the reason then update BGP
2284: entry. */
2285: filtered:
2286: if (BGP_DEBUG (update, UPDATE_IN))
2287: zlog (peer->log, LOG_DEBUG,
2288: "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
2289: peer->host,
2290: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2291: p->prefixlen, reason);
2292:
2293: if (ri)
2294: bgp_rib_remove (rn, ri, peer, afi, safi);
2295:
2296: bgp_unlock_node (rn);
2297:
2298: bgp_attr_extra_free (&new_attr);
2299:
2300: return 0;
2301: }
2302:
2303: int
2304: bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
2305: afi_t afi, safi_t safi, int type, int sub_type,
2306: struct prefix_rd *prd, u_char *tag, int soft_reconfig)
2307: {
2308: struct peer *rsclient;
2309: struct listnode *node, *nnode;
2310: struct bgp *bgp;
2311: int ret;
2312:
2313: ret = bgp_update_main (peer, p, attr, afi, safi, type, sub_type, prd, tag,
2314: soft_reconfig);
2315:
2316: bgp = peer->bgp;
2317:
2318: /* Process the update for each RS-client. */
2319: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2320: {
2321: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2322: bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
2323: sub_type, prd, tag);
2324: }
2325:
2326: return ret;
2327: }
2328:
2329: int
2330: bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
2331: afi_t afi, safi_t safi, int type, int sub_type,
2332: struct prefix_rd *prd, u_char *tag)
2333: {
2334: struct bgp *bgp;
2335: char buf[SU_ADDRSTRLEN];
2336: struct bgp_node *rn;
2337: struct bgp_info *ri;
2338: struct peer *rsclient;
2339: struct listnode *node, *nnode;
2340:
2341: bgp = peer->bgp;
2342:
2343: /* Process the withdraw for each RS-client. */
2344: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
2345: {
2346: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2347: bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
2348: }
2349:
2350: /* Logging. */
2351: if (BGP_DEBUG (update, UPDATE_IN))
2352: zlog (peer->log, LOG_DEBUG, "%s rcvd UPDATE about %s/%d -- withdrawn",
2353: peer->host,
2354: inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2355: p->prefixlen);
2356:
2357: /* Lookup node. */
2358: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
2359:
2360: /* If peer is soft reconfiguration enabled. Record input packet for
2361: further calculation. */
2362: if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
2363: && peer != bgp->peer_self)
2364: bgp_adj_in_unset (rn, peer);
2365:
2366: /* Lookup withdrawn route. */
2367: for (ri = rn->info; ri; ri = ri->next)
2368: if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
2369: break;
2370:
2371: /* Withdraw specified route from routing table. */
2372: if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
2373: bgp_rib_withdraw (rn, ri, peer, afi, safi);
2374: else if (BGP_DEBUG (update, UPDATE_IN))
2375: zlog (peer->log, LOG_DEBUG,
2376: "%s Can't find the route %s/%d", peer->host,
2377: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
2378: p->prefixlen);
2379:
2380: /* Unlock bgp_node_get() lock. */
2381: bgp_unlock_node (rn);
2382:
2383: return 0;
2384: }
2385:
2386: void
2387: bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
2388: {
2389: struct bgp *bgp;
2390: struct attr attr = { 0 };
2391: struct aspath *aspath = { 0 };
2392: struct prefix p;
2393: struct bgp_info binfo;
2394: struct peer *from;
2395: int ret = RMAP_DENYMATCH;
2396:
2397: if (!(afi == AFI_IP || afi == AFI_IP6))
2398: return;
2399:
2400: bgp = peer->bgp;
2401: from = bgp->peer_self;
2402:
2403: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
2404: aspath = attr.aspath;
2405: attr.local_pref = bgp->default_local_pref;
2406: memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
2407:
2408: if (afi == AFI_IP)
2409: str2prefix ("0.0.0.0/0", &p);
2410: #ifdef HAVE_IPV6
2411: else if (afi == AFI_IP6)
2412: {
2413: struct attr_extra *ae;
2414: attr.extra = NULL;
2415:
2416: ae = bgp_attr_extra_get (&attr);
2417: attr.extra = ae;
2418:
2419: str2prefix ("::/0", &p);
2420:
2421: /* IPv6 global nexthop must be included. */
2422: memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
2423: IPV6_MAX_BYTELEN);
2424: ae->mp_nexthop_len = 16;
2425:
2426: /* If the peer is on shared nextwork and we have link-local
2427: nexthop set it. */
2428: if (peer->shared_network
2429: && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
2430: {
2431: memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
2432: IPV6_MAX_BYTELEN);
2433: ae->mp_nexthop_len = 32;
2434: }
2435: }
2436: #endif /* HAVE_IPV6 */
2437:
2438: if (peer->default_rmap[afi][safi].name)
2439: {
2440: binfo.peer = bgp->peer_self;
2441: binfo.attr = &attr;
2442:
2443: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
2444:
2445: ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
2446: RMAP_BGP, &binfo);
2447:
2448: bgp->peer_self->rmap_type = 0;
2449:
2450: if (ret == RMAP_DENYMATCH)
2451: {
2452: bgp_attr_flush (&attr);
2453: withdraw = 1;
2454: }
2455: }
2456:
2457: if (withdraw)
2458: {
2459: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
2460: bgp_default_withdraw_send (peer, afi, safi);
2461: UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2462: }
2463: else
2464: {
2465: SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
2466: bgp_default_update_send (peer, &attr, afi, safi, from);
2467: }
2468:
2469: bgp_attr_extra_free (&attr);
2470: aspath_unintern (&aspath);
2471: }
2472:
2473: static void
2474: bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
2475: struct bgp_table *table, int rsclient)
2476: {
2477: struct bgp_node *rn;
2478: struct bgp_info *ri;
2479: struct attr attr = { 0 };
2480:
2481: if (! table)
2482: table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
2483:
2484: if (safi != SAFI_MPLS_VPN
2485: && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2486: bgp_default_originate (peer, afi, safi, 0);
2487:
2488: for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
2489: for (ri = rn->info; ri; ri = ri->next)
2490: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
2491: {
2492: if ( (rsclient) ?
2493: (bgp_announce_check_rsclient (ri, peer, &rn->p, &attr, afi, safi))
2494: : (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi)))
2495: bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
2496: else
2497: bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
2498:
2499: bgp_attr_extra_free (&attr);
2500: }
2501: }
2502:
2503: void
2504: bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
2505: {
2506: struct bgp_node *rn;
2507: struct bgp_table *table;
2508:
2509: if (peer->status != Established)
2510: return;
2511:
2512: if (! peer->afc_nego[afi][safi])
2513: return;
2514:
2515: /* First update is deferred until ORF or ROUTE-REFRESH is received */
2516: if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2517: return;
2518:
2519: if (safi != SAFI_MPLS_VPN)
2520: bgp_announce_table (peer, afi, safi, NULL, 0);
2521: else
2522: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2523: rn = bgp_route_next(rn))
2524: if ((table = (rn->info)) != NULL)
2525: bgp_announce_table (peer, afi, safi, table, 0);
2526:
2527: if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
2528: bgp_announce_table (peer, afi, safi, NULL, 1);
2529: }
2530:
2531: void
2532: bgp_announce_route_all (struct peer *peer)
2533: {
2534: afi_t afi;
2535: safi_t safi;
2536:
2537: for (afi = AFI_IP; afi < AFI_MAX; afi++)
2538: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2539: bgp_announce_route (peer, afi, safi);
2540: }
2541:
2542: static void
2543: bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
2544: safi_t safi, struct bgp_table *table)
2545: {
2546: struct bgp_node *rn;
2547: struct bgp_adj_in *ain;
2548:
2549: if (! table)
2550: table = rsclient->bgp->rib[afi][safi];
2551:
2552: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2553: for (ain = rn->adj_in; ain; ain = ain->next)
2554: {
2555: bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
2556: &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
2557: }
2558: }
2559:
2560: void
2561: bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
2562: {
2563: struct bgp_table *table;
2564: struct bgp_node *rn;
2565:
2566: if (safi != SAFI_MPLS_VPN)
2567: bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
2568:
2569: else
2570: for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
2571: rn = bgp_route_next (rn))
2572: if ((table = rn->info) != NULL)
2573: bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
2574: }
2575:
2576: static void
2577: bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
2578: struct bgp_table *table)
2579: {
2580: int ret;
2581: struct bgp_node *rn;
2582: struct bgp_adj_in *ain;
2583:
2584: if (! table)
2585: table = peer->bgp->rib[afi][safi];
2586:
2587: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2588: for (ain = rn->adj_in; ain; ain = ain->next)
2589: {
2590: if (ain->peer == peer)
2591: {
2592: ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
2593: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2594: NULL, NULL, 1);
2595: if (ret < 0)
2596: {
2597: bgp_unlock_node (rn);
2598: return;
2599: }
2600: continue;
2601: }
2602: }
2603: }
2604:
2605: void
2606: bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
2607: {
2608: struct bgp_node *rn;
2609: struct bgp_table *table;
2610:
2611: if (peer->status != Established)
2612: return;
2613:
2614: if (safi != SAFI_MPLS_VPN)
2615: bgp_soft_reconfig_table (peer, afi, safi, NULL);
2616: else
2617: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2618: rn = bgp_route_next (rn))
2619: if ((table = rn->info) != NULL)
2620: bgp_soft_reconfig_table (peer, afi, safi, table);
2621: }
2622:
2623:
2624: struct bgp_clear_node_queue
2625: {
2626: struct bgp_node *rn;
2627: enum bgp_clear_route_type purpose;
2628: };
2629:
2630: static wq_item_status
2631: bgp_clear_route_node (struct work_queue *wq, void *data)
2632: {
2633: struct bgp_clear_node_queue *cnq = data;
2634: struct bgp_node *rn = cnq->rn;
2635: struct peer *peer = wq->spec.data;
2636: struct bgp_info *ri;
2637: afi_t afi = rn->table->afi;
2638: safi_t safi = rn->table->safi;
2639:
2640: assert (rn && peer);
2641:
2642: for (ri = rn->info; ri; ri = ri->next)
2643: if (ri->peer == peer || cnq->purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2644: {
2645: /* graceful restart STALE flag set. */
2646: if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
2647: && peer->nsf[afi][safi]
2648: && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
2649: && ! CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
2650: bgp_info_set_flag (rn, ri, BGP_INFO_STALE);
2651: else
2652: bgp_rib_remove (rn, ri, peer, afi, safi);
2653: break;
2654: }
2655: return WQ_SUCCESS;
2656: }
2657:
2658: static void
2659: bgp_clear_node_queue_del (struct work_queue *wq, void *data)
2660: {
2661: struct bgp_clear_node_queue *cnq = data;
2662: struct bgp_node *rn = cnq->rn;
2663: struct bgp_table *table = rn->table;
2664:
2665: bgp_unlock_node (rn);
2666: bgp_table_unlock (table);
2667: XFREE (MTYPE_BGP_CLEAR_NODE_QUEUE, cnq);
2668: }
2669:
2670: static void
2671: bgp_clear_node_complete (struct work_queue *wq)
2672: {
2673: struct peer *peer = wq->spec.data;
2674:
2675: /* Tickle FSM to start moving again */
2676: BGP_EVENT_ADD (peer, Clearing_Completed);
2677:
2678: peer_unlock (peer); /* bgp_clear_route */
2679: }
2680:
2681: static void
2682: bgp_clear_node_queue_init (struct peer *peer)
2683: {
2684: char wname[sizeof("clear xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")];
2685:
2686: snprintf (wname, sizeof(wname), "clear %s", peer->host);
2687: #undef CLEAR_QUEUE_NAME_LEN
2688:
2689: if ( (peer->clear_node_queue = work_queue_new (bm->master, wname)) == NULL)
2690: {
2691: zlog_err ("%s: Failed to allocate work queue", __func__);
2692: exit (1);
2693: }
2694: peer->clear_node_queue->spec.hold = 10;
2695: peer->clear_node_queue->spec.workfunc = &bgp_clear_route_node;
2696: peer->clear_node_queue->spec.del_item_data = &bgp_clear_node_queue_del;
2697: peer->clear_node_queue->spec.completion_func = &bgp_clear_node_complete;
2698: peer->clear_node_queue->spec.max_retries = 0;
2699:
2700: /* we only 'lock' this peer reference when the queue is actually active */
2701: peer->clear_node_queue->spec.data = peer;
2702: }
2703:
2704: static void
2705: bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
2706: struct bgp_table *table, struct peer *rsclient,
2707: enum bgp_clear_route_type purpose)
2708: {
2709: struct bgp_node *rn;
2710:
2711:
2712: if (! table)
2713: table = (rsclient) ? rsclient->rib[afi][safi] : peer->bgp->rib[afi][safi];
2714:
2715: /* If still no table => afi/safi isn't configured at all or smth. */
2716: if (! table)
2717: return;
2718:
2719: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2720: {
2721: struct bgp_info *ri;
2722: struct bgp_adj_in *ain;
2723: struct bgp_adj_out *aout;
2724:
2725: if (rn->info == NULL)
2726: continue;
2727:
2728: /* XXX:TODO: This is suboptimal, every non-empty route_node is
2729: * queued for every clearing peer, regardless of whether it is
2730: * relevant to the peer at hand.
2731: *
2732: * Overview: There are 3 different indices which need to be
2733: * scrubbed, potentially, when a peer is removed:
2734: *
2735: * 1 peer's routes visible via the RIB (ie accepted routes)
2736: * 2 peer's routes visible by the (optional) peer's adj-in index
2737: * 3 other routes visible by the peer's adj-out index
2738: *
2739: * 3 there is no hurry in scrubbing, once the struct peer is
2740: * removed from bgp->peer, we could just GC such deleted peer's
2741: * adj-outs at our leisure.
2742: *
2743: * 1 and 2 must be 'scrubbed' in some way, at least made
2744: * invisible via RIB index before peer session is allowed to be
2745: * brought back up. So one needs to know when such a 'search' is
2746: * complete.
2747: *
2748: * Ideally:
2749: *
2750: * - there'd be a single global queue or a single RIB walker
2751: * - rather than tracking which route_nodes still need to be
2752: * examined on a peer basis, we'd track which peers still
2753: * aren't cleared
2754: *
2755: * Given that our per-peer prefix-counts now should be reliable,
2756: * this may actually be achievable. It doesn't seem to be a huge
2757: * problem at this time,
2758: */
2759: for (ri = rn->info; ri; ri = ri->next)
2760: if (ri->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2761: {
2762: struct bgp_clear_node_queue *cnq;
2763:
2764: /* both unlocked in bgp_clear_node_queue_del */
2765: bgp_table_lock (rn->table);
2766: bgp_lock_node (rn);
2767: cnq = XCALLOC (MTYPE_BGP_CLEAR_NODE_QUEUE,
2768: sizeof (struct bgp_clear_node_queue));
2769: cnq->rn = rn;
2770: cnq->purpose = purpose;
2771: work_queue_add (peer->clear_node_queue, cnq);
2772: break;
2773: }
2774:
2775: for (ain = rn->adj_in; ain; ain = ain->next)
2776: if (ain->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2777: {
2778: bgp_adj_in_remove (rn, ain);
2779: bgp_unlock_node (rn);
2780: break;
2781: }
2782: for (aout = rn->adj_out; aout; aout = aout->next)
2783: if (aout->peer == peer || purpose == BGP_CLEAR_ROUTE_MY_RSCLIENT)
2784: {
2785: bgp_adj_out_remove (rn, aout, peer, afi, safi);
2786: bgp_unlock_node (rn);
2787: break;
2788: }
2789: }
2790: return;
2791: }
2792:
2793: void
2794: bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi,
2795: enum bgp_clear_route_type purpose)
2796: {
2797: struct bgp_node *rn;
2798: struct bgp_table *table;
2799: struct peer *rsclient;
2800: struct listnode *node, *nnode;
2801:
2802: if (peer->clear_node_queue == NULL)
2803: bgp_clear_node_queue_init (peer);
2804:
2805: /* bgp_fsm.c keeps sessions in state Clearing, not transitioning to
2806: * Idle until it receives a Clearing_Completed event. This protects
2807: * against peers which flap faster than we can we clear, which could
2808: * lead to:
2809: *
2810: * a) race with routes from the new session being installed before
2811: * clear_route_node visits the node (to delete the route of that
2812: * peer)
2813: * b) resource exhaustion, clear_route_node likely leads to an entry
2814: * on the process_main queue. Fast-flapping could cause that queue
2815: * to grow and grow.
2816: */
2817: if (!peer->clear_node_queue->thread)
2818: peer_lock (peer); /* bgp_clear_node_complete */
2819:
2820: switch (purpose)
2821: {
2822: case BGP_CLEAR_ROUTE_NORMAL:
2823: if (safi != SAFI_MPLS_VPN)
2824: bgp_clear_route_table (peer, afi, safi, NULL, NULL, purpose);
2825: else
2826: for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
2827: rn = bgp_route_next (rn))
2828: if ((table = rn->info) != NULL)
2829: bgp_clear_route_table (peer, afi, safi, table, NULL, purpose);
2830:
2831: for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
2832: if (CHECK_FLAG(rsclient->af_flags[afi][safi],
2833: PEER_FLAG_RSERVER_CLIENT))
2834: bgp_clear_route_table (peer, afi, safi, NULL, rsclient, purpose);
2835: break;
2836:
2837: case BGP_CLEAR_ROUTE_MY_RSCLIENT:
2838: bgp_clear_route_table (peer, afi, safi, NULL, peer, purpose);
2839: break;
2840:
2841: default:
2842: assert (0);
2843: break;
2844: }
2845:
2846: /* If no routes were cleared, nothing was added to workqueue, the
2847: * completion function won't be run by workqueue code - call it here.
2848: * XXX: Actually, this assumption doesn't hold, see
2849: * bgp_clear_route_table(), we queue all non-empty nodes.
2850: *
2851: * Additionally, there is a presumption in FSM that clearing is only
2852: * really needed if peer state is Established - peers in
2853: * pre-Established states shouldn't have any route-update state
2854: * associated with them (in or out).
2855: *
2856: * We still can get here in pre-Established though, through
2857: * peer_delete -> bgp_fsm_change_status, so this is a useful sanity
2858: * check to ensure the assumption above holds.
2859: *
2860: * At some future point, this check could be move to the top of the
2861: * function, and do a quick early-return when state is
2862: * pre-Established, avoiding above list and table scans. Once we're
2863: * sure it is safe..
2864: */
2865: if (!peer->clear_node_queue->thread)
2866: bgp_clear_node_complete (peer->clear_node_queue);
2867: }
2868:
2869: void
2870: bgp_clear_route_all (struct peer *peer)
2871: {
2872: afi_t afi;
2873: safi_t safi;
2874:
2875: for (afi = AFI_IP; afi < AFI_MAX; afi++)
2876: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2877: bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
2878: }
2879:
2880: void
2881: bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
2882: {
2883: struct bgp_table *table;
2884: struct bgp_node *rn;
2885: struct bgp_adj_in *ain;
2886:
2887: table = peer->bgp->rib[afi][safi];
2888:
2889: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2890: for (ain = rn->adj_in; ain ; ain = ain->next)
2891: if (ain->peer == peer)
2892: {
2893: bgp_adj_in_remove (rn, ain);
2894: bgp_unlock_node (rn);
2895: break;
2896: }
2897: }
2898:
2899: void
2900: bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
2901: {
2902: struct bgp_node *rn;
2903: struct bgp_info *ri;
2904: struct bgp_table *table;
2905:
2906: table = peer->bgp->rib[afi][safi];
2907:
2908: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2909: {
2910: for (ri = rn->info; ri; ri = ri->next)
2911: if (ri->peer == peer)
2912: {
2913: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
2914: bgp_rib_remove (rn, ri, peer, afi, safi);
2915: break;
2916: }
2917: }
2918: }
2919:
2920: /* Delete all kernel routes. */
2921: void
2922: bgp_cleanup_routes (void)
2923: {
2924: struct bgp *bgp;
2925: struct listnode *node, *nnode;
2926: struct bgp_node *rn;
2927: struct bgp_table *table;
2928: struct bgp_info *ri;
2929:
2930: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
2931: {
2932: table = bgp->rib[AFI_IP][SAFI_UNICAST];
2933:
2934: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2935: for (ri = rn->info; ri; ri = ri->next)
2936: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2937: && ri->type == ZEBRA_ROUTE_BGP
2938: && ri->sub_type == BGP_ROUTE_NORMAL)
2939: bgp_zebra_withdraw (&rn->p, ri);
2940:
2941: table = bgp->rib[AFI_IP6][SAFI_UNICAST];
2942:
2943: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
2944: for (ri = rn->info; ri; ri = ri->next)
2945: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
2946: && ri->type == ZEBRA_ROUTE_BGP
2947: && ri->sub_type == BGP_ROUTE_NORMAL)
2948: bgp_zebra_withdraw (&rn->p, ri);
2949: }
2950: }
2951:
2952: void
2953: bgp_reset (void)
2954: {
2955: vty_reset ();
2956: bgp_zclient_reset ();
2957: access_list_reset ();
2958: prefix_list_reset ();
2959: }
2960:
2961: /* Parse NLRI stream. Withdraw NLRI is recognized by NULL attr
2962: value. */
2963: int
2964: bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
2965: {
2966: u_char *pnt;
2967: u_char *lim;
2968: struct prefix p;
2969: int psize;
2970: int ret;
2971:
2972: /* Check peer status. */
2973: if (peer->status != Established)
2974: return 0;
2975:
2976: pnt = packet->nlri;
2977: lim = pnt + packet->length;
2978:
2979: for (; pnt < lim; pnt += psize)
2980: {
2981: /* Clear prefix structure. */
2982: memset (&p, 0, sizeof (struct prefix));
2983:
2984: /* Fetch prefix length. */
2985: p.prefixlen = *pnt++;
2986: p.family = afi2family (packet->afi);
2987:
2988: /* Already checked in nlri_sanity_check(). We do double check
2989: here. */
2990: if ((packet->afi == AFI_IP && p.prefixlen > 32)
2991: || (packet->afi == AFI_IP6 && p.prefixlen > 128))
2992: return -1;
2993:
2994: /* Packet size overflow check. */
2995: psize = PSIZE (p.prefixlen);
2996:
2997: /* When packet overflow occur return immediately. */
2998: if (pnt + psize > lim)
2999: return -1;
3000:
3001: /* Fetch prefix from NLRI packet. */
3002: memcpy (&p.u.prefix, pnt, psize);
3003:
3004: /* Check address. */
3005: if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
3006: {
3007: if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
3008: {
3009: /*
3010: * From draft-ietf-idr-bgp4-22, Section 6.3:
3011: * If a BGP router receives an UPDATE message with a
3012: * semantically incorrect NLRI field, in which a prefix is
3013: * semantically incorrect (eg. an unexpected multicast IP
3014: * address), it should ignore the prefix.
3015: */
3016: zlog (peer->log, LOG_ERR,
3017: "IPv4 unicast NLRI is multicast address %s",
3018: inet_ntoa (p.u.prefix4));
3019:
3020: return -1;
3021: }
3022: }
3023:
3024: #ifdef HAVE_IPV6
3025: /* Check address. */
3026: if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
3027: {
3028: if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3029: {
3030: char buf[BUFSIZ];
3031:
3032: zlog (peer->log, LOG_WARNING,
3033: "IPv6 link-local NLRI received %s ignore this NLRI",
3034: inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
3035:
3036: continue;
3037: }
3038: }
3039: #endif /* HAVE_IPV6 */
3040:
3041: /* Normal process. */
3042: if (attr)
3043: ret = bgp_update (peer, &p, attr, packet->afi, packet->safi,
3044: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
3045: else
3046: ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi,
3047: ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
3048:
3049: /* Address family configuration mismatch or maximum-prefix count
3050: overflow. */
3051: if (ret < 0)
3052: return -1;
3053: }
3054:
3055: /* Packet length consistency check. */
3056: if (pnt != lim)
3057: return -1;
3058:
3059: return 0;
3060: }
3061:
3062: /* NLRI encode syntax check routine. */
3063: int
3064: bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
3065: bgp_size_t length)
3066: {
3067: u_char *end;
3068: u_char prefixlen;
3069: int psize;
3070:
3071: end = pnt + length;
3072:
3073: /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
3074: syntactic validity. If the field is syntactically incorrect,
3075: then the Error Subcode is set to Invalid Network Field. */
3076:
3077: while (pnt < end)
3078: {
3079: prefixlen = *pnt++;
3080:
3081: /* Prefix length check. */
3082: if ((afi == AFI_IP && prefixlen > 32)
3083: || (afi == AFI_IP6 && prefixlen > 128))
3084: {
3085: plog_err (peer->log,
3086: "%s [Error] Update packet error (wrong prefix length %d)",
3087: peer->host, prefixlen);
3088: bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3089: BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3090: return -1;
3091: }
3092:
3093: /* Packet size overflow check. */
3094: psize = PSIZE (prefixlen);
3095:
3096: if (pnt + psize > end)
3097: {
3098: plog_err (peer->log,
3099: "%s [Error] Update packet error"
3100: " (prefix data overflow prefix size is %d)",
3101: peer->host, psize);
3102: bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3103: BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3104: return -1;
3105: }
3106:
3107: pnt += psize;
3108: }
3109:
3110: /* Packet length consistency check. */
3111: if (pnt != end)
3112: {
3113: plog_err (peer->log,
3114: "%s [Error] Update packet error"
3115: " (prefix length mismatch with total length)",
3116: peer->host);
3117: bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
3118: BGP_NOTIFY_UPDATE_INVAL_NETWORK);
3119: return -1;
3120: }
3121: return 0;
3122: }
3123:
3124: static struct bgp_static *
3125: bgp_static_new (void)
3126: {
3127: return XCALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
3128: }
3129:
3130: static void
3131: bgp_static_free (struct bgp_static *bgp_static)
3132: {
3133: if (bgp_static->rmap.name)
3134: free (bgp_static->rmap.name);
3135: XFREE (MTYPE_BGP_STATIC, bgp_static);
3136: }
3137:
3138: static void
3139: bgp_static_withdraw_rsclient (struct bgp *bgp, struct peer *rsclient,
3140: struct prefix *p, afi_t afi, safi_t safi)
3141: {
3142: struct bgp_node *rn;
3143: struct bgp_info *ri;
3144:
3145: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3146:
3147: /* Check selected route and self inserted route. */
3148: for (ri = rn->info; ri; ri = ri->next)
3149: if (ri->peer == bgp->peer_self
3150: && ri->type == ZEBRA_ROUTE_BGP
3151: && ri->sub_type == BGP_ROUTE_STATIC)
3152: break;
3153:
3154: /* Withdraw static BGP route from routing table. */
3155: if (ri)
3156: {
3157: bgp_info_delete (rn, ri);
3158: bgp_process (bgp, rn, afi, safi);
3159: }
3160:
3161: /* Unlock bgp_node_lookup. */
3162: bgp_unlock_node (rn);
3163: }
3164:
3165: static void
3166: bgp_static_update_rsclient (struct peer *rsclient, struct prefix *p,
3167: struct bgp_static *bgp_static,
3168: afi_t afi, safi_t safi)
3169: {
3170: struct bgp_node *rn;
3171: struct bgp_info *ri;
3172: struct bgp_info *new;
3173: struct bgp_info info;
3174: struct attr *attr_new;
3175: struct attr attr = {0 };
3176: struct attr new_attr = { .extra = 0 };
3177: struct bgp *bgp;
3178: int ret;
3179: char buf[SU_ADDRSTRLEN];
3180:
3181: bgp = rsclient->bgp;
3182:
3183: assert (bgp_static);
3184: if (!bgp_static)
3185: return;
3186:
3187: rn = bgp_afi_node_get (rsclient->rib[afi][safi], afi, safi, p, NULL);
3188:
3189: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3190:
3191: attr.nexthop = bgp_static->igpnexthop;
3192: attr.med = bgp_static->igpmetric;
3193: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3194:
3195: if (bgp_static->atomic)
3196: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3197:
3198: /* Apply network route-map for export to this rsclient. */
3199: if (bgp_static->rmap.name)
3200: {
3201: struct attr attr_tmp = attr;
3202: info.peer = rsclient;
3203: info.attr = &attr_tmp;
3204:
3205: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_EXPORT);
3206: SET_FLAG (rsclient->rmap_type, PEER_RMAP_TYPE_NETWORK);
3207:
3208: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3209:
3210: rsclient->rmap_type = 0;
3211:
3212: if (ret == RMAP_DENYMATCH)
3213: {
3214: /* Free uninterned attribute. */
3215: bgp_attr_flush (&attr_tmp);
3216:
3217: /* Unintern original. */
3218: aspath_unintern (&attr.aspath);
3219: bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3220: bgp_attr_extra_free (&attr);
3221:
3222: return;
3223: }
3224: attr_new = bgp_attr_intern (&attr_tmp);
3225: }
3226: else
3227: attr_new = bgp_attr_intern (&attr);
3228:
3229: bgp_attr_dup(&new_attr, attr_new);
3230:
3231: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3232:
3233: if (bgp_import_modifier (rsclient, bgp->peer_self, p, &new_attr, afi, safi)
3234: == RMAP_DENY)
3235: {
3236: /* This BGP update is filtered. Log the reason then update BGP entry. */
3237: if (BGP_DEBUG (update, UPDATE_IN))
3238: zlog (rsclient->log, LOG_DEBUG,
3239: "Static UPDATE about %s/%d -- DENIED for RS-client %s due to: import-policy",
3240: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
3241: p->prefixlen, rsclient->host);
3242:
3243: bgp->peer_self->rmap_type = 0;
3244:
3245: bgp_attr_unintern (&attr_new);
3246: aspath_unintern (&attr.aspath);
3247: bgp_attr_extra_free (&attr);
3248:
3249: bgp_static_withdraw_rsclient (bgp, rsclient, p, afi, safi);
3250:
3251: return;
3252: }
3253:
3254: bgp->peer_self->rmap_type = 0;
3255:
3256: bgp_attr_unintern (&attr_new);
3257: attr_new = bgp_attr_intern (&new_attr);
3258: bgp_attr_extra_free (&new_attr);
3259:
3260: for (ri = rn->info; ri; ri = ri->next)
3261: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3262: && ri->sub_type == BGP_ROUTE_STATIC)
3263: break;
3264:
3265: if (ri)
3266: {
3267: if (attrhash_cmp (ri->attr, attr_new) &&
3268: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3269: {
3270: bgp_unlock_node (rn);
3271: bgp_attr_unintern (&attr_new);
3272: aspath_unintern (&attr.aspath);
3273: bgp_attr_extra_free (&attr);
3274: return;
3275: }
3276: else
3277: {
3278: /* The attribute is changed. */
3279: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3280:
3281: /* Rewrite BGP route information. */
3282: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3283: bgp_info_restore(rn, ri);
3284: bgp_attr_unintern (&ri->attr);
3285: ri->attr = attr_new;
3286: ri->uptime = bgp_clock ();
3287:
3288: /* Process change. */
3289: bgp_process (bgp, rn, afi, safi);
3290: bgp_unlock_node (rn);
3291: aspath_unintern (&attr.aspath);
3292: bgp_attr_extra_free (&attr);
3293: return;
3294: }
3295: }
3296:
3297: /* Make new BGP info. */
3298: new = bgp_info_new ();
3299: new->type = ZEBRA_ROUTE_BGP;
3300: new->sub_type = BGP_ROUTE_STATIC;
3301: new->peer = bgp->peer_self;
3302: SET_FLAG (new->flags, BGP_INFO_VALID);
3303: new->attr = attr_new;
3304: new->uptime = bgp_clock ();
3305:
3306: /* Register new BGP information. */
3307: bgp_info_add (rn, new);
3308:
3309: /* route_node_get lock */
3310: bgp_unlock_node (rn);
3311:
3312: /* Process change. */
3313: bgp_process (bgp, rn, afi, safi);
3314:
3315: /* Unintern original. */
3316: aspath_unintern (&attr.aspath);
3317: bgp_attr_extra_free (&attr);
3318: }
3319:
3320: static void
3321: bgp_static_update_main (struct bgp *bgp, struct prefix *p,
3322: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3323: {
3324: struct bgp_node *rn;
3325: struct bgp_info *ri;
3326: struct bgp_info *new;
3327: struct bgp_info info;
3328: struct attr attr = { 0 };
3329: struct attr *attr_new;
3330: int ret;
3331:
3332: assert (bgp_static);
3333: if (!bgp_static)
3334: return;
3335:
3336: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3337:
3338: bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
3339:
3340: attr.nexthop = bgp_static->igpnexthop;
3341: attr.med = bgp_static->igpmetric;
3342: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
3343:
3344: if (bgp_static->atomic)
3345: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
3346:
3347: /* Apply route-map. */
3348: if (bgp_static->rmap.name)
3349: {
3350: struct attr attr_tmp = attr;
3351: info.peer = bgp->peer_self;
3352: info.attr = &attr_tmp;
3353:
3354: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
3355:
3356: ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
3357:
3358: bgp->peer_self->rmap_type = 0;
3359:
3360: if (ret == RMAP_DENYMATCH)
3361: {
3362: /* Free uninterned attribute. */
3363: bgp_attr_flush (&attr_tmp);
3364:
3365: /* Unintern original. */
3366: aspath_unintern (&attr.aspath);
3367: bgp_attr_extra_free (&attr);
3368: bgp_static_withdraw (bgp, p, afi, safi);
3369: return;
3370: }
3371: attr_new = bgp_attr_intern (&attr_tmp);
3372: }
3373: else
3374: attr_new = bgp_attr_intern (&attr);
3375:
3376: for (ri = rn->info; ri; ri = ri->next)
3377: if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
3378: && ri->sub_type == BGP_ROUTE_STATIC)
3379: break;
3380:
3381: if (ri)
3382: {
3383: if (attrhash_cmp (ri->attr, attr_new) &&
3384: !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3385: {
3386: bgp_unlock_node (rn);
3387: bgp_attr_unintern (&attr_new);
3388: aspath_unintern (&attr.aspath);
3389: bgp_attr_extra_free (&attr);
3390: return;
3391: }
3392: else
3393: {
3394: /* The attribute is changed. */
3395: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
3396:
3397: /* Rewrite BGP route information. */
3398: if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
3399: bgp_info_restore(rn, ri);
3400: else
3401: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3402: bgp_attr_unintern (&ri->attr);
3403: ri->attr = attr_new;
3404: ri->uptime = bgp_clock ();
3405:
3406: /* Process change. */
3407: bgp_aggregate_increment (bgp, p, ri, afi, safi);
3408: bgp_process (bgp, rn, afi, safi);
3409: bgp_unlock_node (rn);
3410: aspath_unintern (&attr.aspath);
3411: bgp_attr_extra_free (&attr);
3412: return;
3413: }
3414: }
3415:
3416: /* Make new BGP info. */
3417: new = bgp_info_new ();
3418: new->type = ZEBRA_ROUTE_BGP;
3419: new->sub_type = BGP_ROUTE_STATIC;
3420: new->peer = bgp->peer_self;
3421: SET_FLAG (new->flags, BGP_INFO_VALID);
3422: new->attr = attr_new;
3423: new->uptime = bgp_clock ();
3424:
3425: /* Aggregate address increment. */
3426: bgp_aggregate_increment (bgp, p, new, afi, safi);
3427:
3428: /* Register new BGP information. */
3429: bgp_info_add (rn, new);
3430:
3431: /* route_node_get lock */
3432: bgp_unlock_node (rn);
3433:
3434: /* Process change. */
3435: bgp_process (bgp, rn, afi, safi);
3436:
3437: /* Unintern original. */
3438: aspath_unintern (&attr.aspath);
3439: bgp_attr_extra_free (&attr);
3440: }
3441:
3442: void
3443: bgp_static_update (struct bgp *bgp, struct prefix *p,
3444: struct bgp_static *bgp_static, afi_t afi, safi_t safi)
3445: {
3446: struct peer *rsclient;
3447: struct listnode *node, *nnode;
3448:
3449: bgp_static_update_main (bgp, p, bgp_static, afi, safi);
3450:
3451: for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
3452: {
3453: if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
3454: bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
3455: }
3456: }
3457:
3458: static void
3459: bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3460: safi_t safi, struct prefix_rd *prd, u_char *tag)
3461: {
3462: struct bgp_node *rn;
3463: struct bgp_info *new;
3464:
3465: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3466:
3467: /* Make new BGP info. */
3468: new = bgp_info_new ();
3469: new->type = ZEBRA_ROUTE_BGP;
3470: new->sub_type = BGP_ROUTE_STATIC;
3471: new->peer = bgp->peer_self;
3472: new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
3473: SET_FLAG (new->flags, BGP_INFO_VALID);
3474: new->uptime = bgp_clock ();
3475: new->extra = bgp_info_extra_new();
3476: memcpy (new->extra->tag, tag, 3);
3477:
3478: /* Aggregate address increment. */
3479: bgp_aggregate_increment (bgp, p, new, afi, safi);
3480:
3481: /* Register new BGP information. */
3482: bgp_info_add (rn, new);
3483:
3484: /* route_node_get lock */
3485: bgp_unlock_node (rn);
3486:
3487: /* Process change. */
3488: bgp_process (bgp, rn, afi, safi);
3489: }
3490:
3491: void
3492: bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
3493: safi_t safi)
3494: {
3495: struct bgp_node *rn;
3496: struct bgp_info *ri;
3497:
3498: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, NULL);
3499:
3500: /* Check selected route and self inserted route. */
3501: for (ri = rn->info; ri; ri = ri->next)
3502: if (ri->peer == bgp->peer_self
3503: && ri->type == ZEBRA_ROUTE_BGP
3504: && ri->sub_type == BGP_ROUTE_STATIC)
3505: break;
3506:
3507: /* Withdraw static BGP route from routing table. */
3508: if (ri)
3509: {
3510: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3511: bgp_info_delete (rn, ri);
3512: bgp_process (bgp, rn, afi, safi);
3513: }
3514:
3515: /* Unlock bgp_node_lookup. */
3516: bgp_unlock_node (rn);
3517: }
3518:
3519: void
3520: bgp_check_local_routes_rsclient (struct peer *rsclient, afi_t afi, safi_t safi)
3521: {
3522: struct bgp_static *bgp_static;
3523: struct bgp *bgp;
3524: struct bgp_node *rn;
3525: struct prefix *p;
3526:
3527: bgp = rsclient->bgp;
3528:
3529: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3530: if ((bgp_static = rn->info) != NULL)
3531: {
3532: p = &rn->p;
3533:
3534: bgp_static_update_rsclient (rsclient, p, bgp_static,
3535: afi, safi);
3536: }
3537: }
3538:
3539: static void
3540: bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t afi,
3541: safi_t safi, struct prefix_rd *prd, u_char *tag)
3542: {
3543: struct bgp_node *rn;
3544: struct bgp_info *ri;
3545:
3546: rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd);
3547:
3548: /* Check selected route and self inserted route. */
3549: for (ri = rn->info; ri; ri = ri->next)
3550: if (ri->peer == bgp->peer_self
3551: && ri->type == ZEBRA_ROUTE_BGP
3552: && ri->sub_type == BGP_ROUTE_STATIC)
3553: break;
3554:
3555: /* Withdraw static BGP route from routing table. */
3556: if (ri)
3557: {
3558: bgp_aggregate_decrement (bgp, p, ri, afi, safi);
3559: bgp_info_delete (rn, ri);
3560: bgp_process (bgp, rn, afi, safi);
3561: }
3562:
3563: /* Unlock bgp_node_lookup. */
3564: bgp_unlock_node (rn);
3565: }
3566:
3567: /* Configure static BGP network. When user don't run zebra, static
3568: route should be installed as valid. */
3569: static int
3570: bgp_static_set (struct vty *vty, struct bgp *bgp, const char *ip_str,
3571: afi_t afi, safi_t safi, const char *rmap, int backdoor)
3572: {
3573: int ret;
3574: struct prefix p;
3575: struct bgp_static *bgp_static;
3576: struct bgp_node *rn;
3577: u_char need_update = 0;
3578:
3579: /* Convert IP prefix string to struct prefix. */
3580: ret = str2prefix (ip_str, &p);
3581: if (! ret)
3582: {
3583: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3584: return CMD_WARNING;
3585: }
3586: #ifdef HAVE_IPV6
3587: if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3588: {
3589: vty_out (vty, "%% Malformed prefix (link-local address)%s",
3590: VTY_NEWLINE);
3591: return CMD_WARNING;
3592: }
3593: #endif /* HAVE_IPV6 */
3594:
3595: apply_mask (&p);
3596:
3597: /* Set BGP static route configuration. */
3598: rn = bgp_node_get (bgp->route[afi][safi], &p);
3599:
3600: if (rn->info)
3601: {
3602: /* Configuration change. */
3603: bgp_static = rn->info;
3604:
3605: /* Check previous routes are installed into BGP. */
3606: if (bgp_static->valid && bgp_static->backdoor != backdoor)
3607: need_update = 1;
3608:
3609: bgp_static->backdoor = backdoor;
3610:
3611: if (rmap)
3612: {
3613: if (bgp_static->rmap.name)
3614: free (bgp_static->rmap.name);
3615: bgp_static->rmap.name = strdup (rmap);
3616: bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3617: }
3618: else
3619: {
3620: if (bgp_static->rmap.name)
3621: free (bgp_static->rmap.name);
3622: bgp_static->rmap.name = NULL;
3623: bgp_static->rmap.map = NULL;
3624: bgp_static->valid = 0;
3625: }
3626: bgp_unlock_node (rn);
3627: }
3628: else
3629: {
3630: /* New configuration. */
3631: bgp_static = bgp_static_new ();
3632: bgp_static->backdoor = backdoor;
3633: bgp_static->valid = 0;
3634: bgp_static->igpmetric = 0;
3635: bgp_static->igpnexthop.s_addr = 0;
3636:
3637: if (rmap)
3638: {
3639: if (bgp_static->rmap.name)
3640: free (bgp_static->rmap.name);
3641: bgp_static->rmap.name = strdup (rmap);
3642: bgp_static->rmap.map = route_map_lookup_by_name (rmap);
3643: }
3644: rn->info = bgp_static;
3645: }
3646:
3647: /* If BGP scan is not enabled, we should install this route here. */
3648: if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
3649: {
3650: bgp_static->valid = 1;
3651:
3652: if (need_update)
3653: bgp_static_withdraw (bgp, &p, afi, safi);
3654:
3655: if (! bgp_static->backdoor)
3656: bgp_static_update (bgp, &p, bgp_static, afi, safi);
3657: }
3658:
3659: return CMD_SUCCESS;
3660: }
3661:
3662: /* Configure static BGP network. */
3663: static int
3664: bgp_static_unset (struct vty *vty, struct bgp *bgp, const char *ip_str,
3665: afi_t afi, safi_t safi)
3666: {
3667: int ret;
3668: struct prefix p;
3669: struct bgp_static *bgp_static;
3670: struct bgp_node *rn;
3671:
3672: /* Convert IP prefix string to struct prefix. */
3673: ret = str2prefix (ip_str, &p);
3674: if (! ret)
3675: {
3676: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3677: return CMD_WARNING;
3678: }
3679: #ifdef HAVE_IPV6
3680: if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
3681: {
3682: vty_out (vty, "%% Malformed prefix (link-local address)%s",
3683: VTY_NEWLINE);
3684: return CMD_WARNING;
3685: }
3686: #endif /* HAVE_IPV6 */
3687:
3688: apply_mask (&p);
3689:
3690: rn = bgp_node_lookup (bgp->route[afi][safi], &p);
3691: if (! rn)
3692: {
3693: vty_out (vty, "%% Can't find specified static route configuration.%s",
3694: VTY_NEWLINE);
3695: return CMD_WARNING;
3696: }
3697:
3698: bgp_static = rn->info;
3699:
3700: /* Update BGP RIB. */
3701: if (! bgp_static->backdoor)
3702: bgp_static_withdraw (bgp, &p, afi, safi);
3703:
3704: /* Clear configuration. */
3705: bgp_static_free (bgp_static);
3706: rn->info = NULL;
3707: bgp_unlock_node (rn);
3708: bgp_unlock_node (rn);
3709:
3710: return CMD_SUCCESS;
3711: }
3712:
3713: /* Called from bgp_delete(). Delete all static routes from the BGP
3714: instance. */
3715: void
3716: bgp_static_delete (struct bgp *bgp)
3717: {
3718: afi_t afi;
3719: safi_t safi;
3720: struct bgp_node *rn;
3721: struct bgp_node *rm;
3722: struct bgp_table *table;
3723: struct bgp_static *bgp_static;
3724:
3725: for (afi = AFI_IP; afi < AFI_MAX; afi++)
3726: for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3727: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
3728: if (rn->info != NULL)
3729: {
3730: if (safi == SAFI_MPLS_VPN)
3731: {
3732: table = rn->info;
3733:
3734: for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
3735: {
3736: bgp_static = rn->info;
3737: bgp_static_withdraw_vpnv4 (bgp, &rm->p,
3738: AFI_IP, SAFI_MPLS_VPN,
3739: (struct prefix_rd *)&rn->p,
3740: bgp_static->tag);
3741: bgp_static_free (bgp_static);
3742: rn->info = NULL;
3743: bgp_unlock_node (rn);
3744: }
3745: }
3746: else
3747: {
3748: bgp_static = rn->info;
3749: bgp_static_withdraw (bgp, &rn->p, afi, safi);
3750: bgp_static_free (bgp_static);
3751: rn->info = NULL;
3752: bgp_unlock_node (rn);
3753: }
3754: }
3755: }
3756:
3757: int
3758: bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const char *rd_str,
3759: const char *tag_str)
3760: {
3761: int ret;
3762: struct prefix p;
3763: struct prefix_rd prd;
3764: struct bgp *bgp;
3765: struct bgp_node *prn;
3766: struct bgp_node *rn;
3767: struct bgp_table *table;
3768: struct bgp_static *bgp_static;
3769: u_char tag[3];
3770:
3771: bgp = vty->index;
3772:
3773: ret = str2prefix (ip_str, &p);
3774: if (! ret)
3775: {
3776: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3777: return CMD_WARNING;
3778: }
3779: apply_mask (&p);
3780:
3781: ret = str2prefix_rd (rd_str, &prd);
3782: if (! ret)
3783: {
3784: vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3785: return CMD_WARNING;
3786: }
3787:
3788: ret = str2tag (tag_str, tag);
3789: if (! ret)
3790: {
3791: vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3792: return CMD_WARNING;
3793: }
3794:
3795: prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3796: (struct prefix *)&prd);
3797: if (prn->info == NULL)
3798: prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
3799: else
3800: bgp_unlock_node (prn);
3801: table = prn->info;
3802:
3803: rn = bgp_node_get (table, &p);
3804:
3805: if (rn->info)
3806: {
3807: vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
3808: bgp_unlock_node (rn);
3809: }
3810: else
3811: {
3812: /* New configuration. */
3813: bgp_static = bgp_static_new ();
3814: bgp_static->valid = 1;
3815: memcpy (bgp_static->tag, tag, 3);
3816: rn->info = bgp_static;
3817:
3818: bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3819: }
3820:
3821: return CMD_SUCCESS;
3822: }
3823:
3824: /* Configure static BGP network. */
3825: int
3826: bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str,
3827: const char *rd_str, const char *tag_str)
3828: {
3829: int ret;
3830: struct bgp *bgp;
3831: struct prefix p;
3832: struct prefix_rd prd;
3833: struct bgp_node *prn;
3834: struct bgp_node *rn;
3835: struct bgp_table *table;
3836: struct bgp_static *bgp_static;
3837: u_char tag[3];
3838:
3839: bgp = vty->index;
3840:
3841: /* Convert IP prefix string to struct prefix. */
3842: ret = str2prefix (ip_str, &p);
3843: if (! ret)
3844: {
3845: vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
3846: return CMD_WARNING;
3847: }
3848: apply_mask (&p);
3849:
3850: ret = str2prefix_rd (rd_str, &prd);
3851: if (! ret)
3852: {
3853: vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
3854: return CMD_WARNING;
3855: }
3856:
3857: ret = str2tag (tag_str, tag);
3858: if (! ret)
3859: {
3860: vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
3861: return CMD_WARNING;
3862: }
3863:
3864: prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
3865: (struct prefix *)&prd);
3866: if (prn->info == NULL)
3867: prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN);
3868: else
3869: bgp_unlock_node (prn);
3870: table = prn->info;
3871:
3872: rn = bgp_node_lookup (table, &p);
3873:
3874: if (rn)
3875: {
3876: bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
3877:
3878: bgp_static = rn->info;
3879: bgp_static_free (bgp_static);
3880: rn->info = NULL;
3881: bgp_unlock_node (rn);
3882: bgp_unlock_node (rn);
3883: }
3884: else
3885: vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
3886:
3887: return CMD_SUCCESS;
3888: }
3889:
3890: DEFUN (bgp_network,
3891: bgp_network_cmd,
3892: "network A.B.C.D/M",
3893: "Specify a network to announce via BGP\n"
3894: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
3895: {
3896: return bgp_static_set (vty, vty->index, argv[0],
3897: AFI_IP, bgp_node_safi (vty), NULL, 0);
3898: }
3899:
3900: DEFUN (bgp_network_route_map,
3901: bgp_network_route_map_cmd,
3902: "network A.B.C.D/M route-map WORD",
3903: "Specify a network to announce via BGP\n"
3904: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3905: "Route-map to modify the attributes\n"
3906: "Name of the route map\n")
3907: {
3908: return bgp_static_set (vty, vty->index, argv[0],
3909: AFI_IP, bgp_node_safi (vty), argv[1], 0);
3910: }
3911:
3912: DEFUN (bgp_network_backdoor,
3913: bgp_network_backdoor_cmd,
3914: "network A.B.C.D/M backdoor",
3915: "Specify a network to announce via BGP\n"
3916: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
3917: "Specify a BGP backdoor route\n")
3918: {
3919: return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST,
3920: NULL, 1);
3921: }
3922:
3923: DEFUN (bgp_network_mask,
3924: bgp_network_mask_cmd,
3925: "network A.B.C.D mask A.B.C.D",
3926: "Specify a network to announce via BGP\n"
3927: "Network number\n"
3928: "Network mask\n"
3929: "Network mask\n")
3930: {
3931: int ret;
3932: char prefix_str[BUFSIZ];
3933:
3934: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
3935: if (! ret)
3936: {
3937: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
3938: return CMD_WARNING;
3939: }
3940:
3941: return bgp_static_set (vty, vty->index, prefix_str,
3942: AFI_IP, bgp_node_safi (vty), NULL, 0);
3943: }
3944:
3945: DEFUN (bgp_network_mask_route_map,
3946: bgp_network_mask_route_map_cmd,
3947: "network A.B.C.D mask A.B.C.D route-map WORD",
3948: "Specify a network to announce via BGP\n"
3949: "Network number\n"
3950: "Network mask\n"
3951: "Network mask\n"
3952: "Route-map to modify the attributes\n"
3953: "Name of the route map\n")
3954: {
3955: int ret;
3956: char prefix_str[BUFSIZ];
3957:
3958: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
3959: if (! ret)
3960: {
3961: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
3962: return CMD_WARNING;
3963: }
3964:
3965: return bgp_static_set (vty, vty->index, prefix_str,
3966: AFI_IP, bgp_node_safi (vty), argv[2], 0);
3967: }
3968:
3969: DEFUN (bgp_network_mask_backdoor,
3970: bgp_network_mask_backdoor_cmd,
3971: "network A.B.C.D mask A.B.C.D backdoor",
3972: "Specify a network to announce via BGP\n"
3973: "Network number\n"
3974: "Network mask\n"
3975: "Network mask\n"
3976: "Specify a BGP backdoor route\n")
3977: {
3978: int ret;
3979: char prefix_str[BUFSIZ];
3980:
3981: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
3982: if (! ret)
3983: {
3984: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
3985: return CMD_WARNING;
3986: }
3987:
3988: return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
3989: NULL, 1);
3990: }
3991:
3992: DEFUN (bgp_network_mask_natural,
3993: bgp_network_mask_natural_cmd,
3994: "network A.B.C.D",
3995: "Specify a network to announce via BGP\n"
3996: "Network number\n")
3997: {
3998: int ret;
3999: char prefix_str[BUFSIZ];
4000:
4001: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4002: if (! ret)
4003: {
4004: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4005: return CMD_WARNING;
4006: }
4007:
4008: return bgp_static_set (vty, vty->index, prefix_str,
4009: AFI_IP, bgp_node_safi (vty), NULL, 0);
4010: }
4011:
4012: DEFUN (bgp_network_mask_natural_route_map,
4013: bgp_network_mask_natural_route_map_cmd,
4014: "network A.B.C.D route-map WORD",
4015: "Specify a network to announce via BGP\n"
4016: "Network number\n"
4017: "Route-map to modify the attributes\n"
4018: "Name of the route map\n")
4019: {
4020: int ret;
4021: char prefix_str[BUFSIZ];
4022:
4023: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4024: if (! ret)
4025: {
4026: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4027: return CMD_WARNING;
4028: }
4029:
4030: return bgp_static_set (vty, vty->index, prefix_str,
4031: AFI_IP, bgp_node_safi (vty), argv[1], 0);
4032: }
4033:
4034: DEFUN (bgp_network_mask_natural_backdoor,
4035: bgp_network_mask_natural_backdoor_cmd,
4036: "network A.B.C.D backdoor",
4037: "Specify a network to announce via BGP\n"
4038: "Network number\n"
4039: "Specify a BGP backdoor route\n")
4040: {
4041: int ret;
4042: char prefix_str[BUFSIZ];
4043:
4044: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4045: if (! ret)
4046: {
4047: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4048: return CMD_WARNING;
4049: }
4050:
4051: return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST,
4052: NULL, 1);
4053: }
4054:
4055: DEFUN (no_bgp_network,
4056: no_bgp_network_cmd,
4057: "no network A.B.C.D/M",
4058: NO_STR
4059: "Specify a network to announce via BGP\n"
4060: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
4061: {
4062: return bgp_static_unset (vty, vty->index, argv[0], AFI_IP,
4063: bgp_node_safi (vty));
4064: }
4065:
4066: ALIAS (no_bgp_network,
4067: no_bgp_network_route_map_cmd,
4068: "no network A.B.C.D/M route-map WORD",
4069: NO_STR
4070: "Specify a network to announce via BGP\n"
4071: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4072: "Route-map to modify the attributes\n"
4073: "Name of the route map\n")
4074:
4075: ALIAS (no_bgp_network,
4076: no_bgp_network_backdoor_cmd,
4077: "no network A.B.C.D/M backdoor",
4078: NO_STR
4079: "Specify a network to announce via BGP\n"
4080: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4081: "Specify a BGP backdoor route\n")
4082:
4083: DEFUN (no_bgp_network_mask,
4084: no_bgp_network_mask_cmd,
4085: "no network A.B.C.D mask A.B.C.D",
4086: NO_STR
4087: "Specify a network to announce via BGP\n"
4088: "Network number\n"
4089: "Network mask\n"
4090: "Network mask\n")
4091: {
4092: int ret;
4093: char prefix_str[BUFSIZ];
4094:
4095: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4096: if (! ret)
4097: {
4098: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4099: return CMD_WARNING;
4100: }
4101:
4102: return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4103: bgp_node_safi (vty));
4104: }
4105:
4106: ALIAS (no_bgp_network_mask,
4107: no_bgp_network_mask_route_map_cmd,
4108: "no network A.B.C.D mask A.B.C.D route-map WORD",
4109: NO_STR
4110: "Specify a network to announce via BGP\n"
4111: "Network number\n"
4112: "Network mask\n"
4113: "Network mask\n"
4114: "Route-map to modify the attributes\n"
4115: "Name of the route map\n")
4116:
4117: ALIAS (no_bgp_network_mask,
4118: no_bgp_network_mask_backdoor_cmd,
4119: "no network A.B.C.D mask A.B.C.D backdoor",
4120: NO_STR
4121: "Specify a network to announce via BGP\n"
4122: "Network number\n"
4123: "Network mask\n"
4124: "Network mask\n"
4125: "Specify a BGP backdoor route\n")
4126:
4127: DEFUN (no_bgp_network_mask_natural,
4128: no_bgp_network_mask_natural_cmd,
4129: "no network A.B.C.D",
4130: NO_STR
4131: "Specify a network to announce via BGP\n"
4132: "Network number\n")
4133: {
4134: int ret;
4135: char prefix_str[BUFSIZ];
4136:
4137: ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
4138: if (! ret)
4139: {
4140: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4141: return CMD_WARNING;
4142: }
4143:
4144: return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP,
4145: bgp_node_safi (vty));
4146: }
4147:
4148: ALIAS (no_bgp_network_mask_natural,
4149: no_bgp_network_mask_natural_route_map_cmd,
4150: "no network A.B.C.D route-map WORD",
4151: NO_STR
4152: "Specify a network to announce via BGP\n"
4153: "Network number\n"
4154: "Route-map to modify the attributes\n"
4155: "Name of the route map\n")
4156:
4157: ALIAS (no_bgp_network_mask_natural,
4158: no_bgp_network_mask_natural_backdoor_cmd,
4159: "no network A.B.C.D backdoor",
4160: NO_STR
4161: "Specify a network to announce via BGP\n"
4162: "Network number\n"
4163: "Specify a BGP backdoor route\n")
4164:
4165: #ifdef HAVE_IPV6
4166: DEFUN (ipv6_bgp_network,
4167: ipv6_bgp_network_cmd,
4168: "network X:X::X:X/M",
4169: "Specify a network to announce via BGP\n"
4170: "IPv6 prefix <network>/<length>\n")
4171: {
4172: return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST,
4173: NULL, 0);
4174: }
4175:
4176: DEFUN (ipv6_bgp_network_route_map,
4177: ipv6_bgp_network_route_map_cmd,
4178: "network X:X::X:X/M route-map WORD",
4179: "Specify a network to announce via BGP\n"
4180: "IPv6 prefix <network>/<length>\n"
4181: "Route-map to modify the attributes\n"
4182: "Name of the route map\n")
4183: {
4184: return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
4185: bgp_node_safi (vty), argv[1], 0);
4186: }
4187:
4188: DEFUN (no_ipv6_bgp_network,
4189: no_ipv6_bgp_network_cmd,
4190: "no network X:X::X:X/M",
4191: NO_STR
4192: "Specify a network to announce via BGP\n"
4193: "IPv6 prefix <network>/<length>\n")
4194: {
4195: return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST);
4196: }
4197:
4198: ALIAS (no_ipv6_bgp_network,
4199: no_ipv6_bgp_network_route_map_cmd,
4200: "no network X:X::X:X/M route-map WORD",
4201: NO_STR
4202: "Specify a network to announce via BGP\n"
4203: "IPv6 prefix <network>/<length>\n"
4204: "Route-map to modify the attributes\n"
4205: "Name of the route map\n")
4206:
4207: ALIAS (ipv6_bgp_network,
4208: old_ipv6_bgp_network_cmd,
4209: "ipv6 bgp network X:X::X:X/M",
4210: IPV6_STR
4211: BGP_STR
4212: "Specify a network to announce via BGP\n"
4213: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4214:
4215: ALIAS (no_ipv6_bgp_network,
4216: old_no_ipv6_bgp_network_cmd,
4217: "no ipv6 bgp network X:X::X:X/M",
4218: NO_STR
4219: IPV6_STR
4220: BGP_STR
4221: "Specify a network to announce via BGP\n"
4222: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
4223: #endif /* HAVE_IPV6 */
4224:
4225: /* stubs for removed AS-Pathlimit commands, kept for config compatibility */
4226: ALIAS_DEPRECATED (bgp_network,
4227: bgp_network_ttl_cmd,
4228: "network A.B.C.D/M pathlimit <0-255>",
4229: "Specify a network to announce via BGP\n"
4230: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4231: "AS-Path hopcount limit attribute\n"
4232: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4233: ALIAS_DEPRECATED (bgp_network_backdoor,
4234: bgp_network_backdoor_ttl_cmd,
4235: "network A.B.C.D/M backdoor pathlimit <0-255>",
4236: "Specify a network to announce via BGP\n"
4237: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4238: "Specify a BGP backdoor route\n"
4239: "AS-Path hopcount limit attribute\n"
4240: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4241: ALIAS_DEPRECATED (bgp_network_mask,
4242: bgp_network_mask_ttl_cmd,
4243: "network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4244: "Specify a network to announce via BGP\n"
4245: "Network number\n"
4246: "Network mask\n"
4247: "Network mask\n"
4248: "AS-Path hopcount limit attribute\n"
4249: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4250: ALIAS_DEPRECATED (bgp_network_mask_backdoor,
4251: bgp_network_mask_backdoor_ttl_cmd,
4252: "network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4253: "Specify a network to announce via BGP\n"
4254: "Network number\n"
4255: "Network mask\n"
4256: "Network mask\n"
4257: "Specify a BGP backdoor route\n"
4258: "AS-Path hopcount limit attribute\n"
4259: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4260: ALIAS_DEPRECATED (bgp_network_mask_natural,
4261: bgp_network_mask_natural_ttl_cmd,
4262: "network A.B.C.D pathlimit <0-255>",
4263: "Specify a network to announce via BGP\n"
4264: "Network number\n"
4265: "AS-Path hopcount limit attribute\n"
4266: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4267: ALIAS_DEPRECATED (bgp_network_mask_natural_backdoor,
4268: bgp_network_mask_natural_backdoor_ttl_cmd,
4269: "network A.B.C.D backdoor pathlimit (1-255>",
4270: "Specify a network to announce via BGP\n"
4271: "Network number\n"
4272: "Specify a BGP backdoor route\n"
4273: "AS-Path hopcount limit attribute\n"
4274: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4275: ALIAS_DEPRECATED (no_bgp_network,
4276: no_bgp_network_ttl_cmd,
4277: "no network A.B.C.D/M pathlimit <0-255>",
4278: NO_STR
4279: "Specify a network to announce via BGP\n"
4280: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4281: "AS-Path hopcount limit attribute\n"
4282: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4283: ALIAS_DEPRECATED (no_bgp_network,
4284: no_bgp_network_backdoor_ttl_cmd,
4285: "no network A.B.C.D/M backdoor pathlimit <0-255>",
4286: NO_STR
4287: "Specify a network to announce via BGP\n"
4288: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
4289: "Specify a BGP backdoor route\n"
4290: "AS-Path hopcount limit attribute\n"
4291: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4292: ALIAS_DEPRECATED (no_bgp_network,
4293: no_bgp_network_mask_ttl_cmd,
4294: "no network A.B.C.D mask A.B.C.D pathlimit <0-255>",
4295: NO_STR
4296: "Specify a network to announce via BGP\n"
4297: "Network number\n"
4298: "Network mask\n"
4299: "Network mask\n"
4300: "AS-Path hopcount limit attribute\n"
4301: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4302: ALIAS_DEPRECATED (no_bgp_network_mask,
4303: no_bgp_network_mask_backdoor_ttl_cmd,
4304: "no network A.B.C.D mask A.B.C.D backdoor pathlimit <0-255>",
4305: NO_STR
4306: "Specify a network to announce via BGP\n"
4307: "Network number\n"
4308: "Network mask\n"
4309: "Network mask\n"
4310: "Specify a BGP backdoor route\n"
4311: "AS-Path hopcount limit attribute\n"
4312: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4313: ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4314: no_bgp_network_mask_natural_ttl_cmd,
4315: "no network A.B.C.D pathlimit <0-255>",
4316: NO_STR
4317: "Specify a network to announce via BGP\n"
4318: "Network number\n"
4319: "AS-Path hopcount limit attribute\n"
4320: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4321: ALIAS_DEPRECATED (no_bgp_network_mask_natural,
4322: no_bgp_network_mask_natural_backdoor_ttl_cmd,
4323: "no network A.B.C.D backdoor pathlimit <0-255>",
4324: NO_STR
4325: "Specify a network to announce via BGP\n"
4326: "Network number\n"
4327: "Specify a BGP backdoor route\n"
4328: "AS-Path hopcount limit attribute\n"
4329: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4330: #ifdef HAVE_IPV6
4331: ALIAS_DEPRECATED (ipv6_bgp_network,
4332: ipv6_bgp_network_ttl_cmd,
4333: "network X:X::X:X/M pathlimit <0-255>",
4334: "Specify a network to announce via BGP\n"
4335: "IPv6 prefix <network>/<length>\n"
4336: "AS-Path hopcount limit attribute\n"
4337: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4338: ALIAS_DEPRECATED (no_ipv6_bgp_network,
4339: no_ipv6_bgp_network_ttl_cmd,
4340: "no network X:X::X:X/M pathlimit <0-255>",
4341: NO_STR
4342: "Specify a network to announce via BGP\n"
4343: "IPv6 prefix <network>/<length>\n"
4344: "AS-Path hopcount limit attribute\n"
4345: "AS-Pathlimit TTL, in number of AS-Path hops\n")
4346: #endif /* HAVE_IPV6 */
4347:
4348: /* Aggreagete address:
4349:
4350: advertise-map Set condition to advertise attribute
4351: as-set Generate AS set path information
4352: attribute-map Set attributes of aggregate
4353: route-map Set parameters of aggregate
4354: summary-only Filter more specific routes from updates
4355: suppress-map Conditionally filter more specific routes from updates
4356: <cr>
4357: */
4358: struct bgp_aggregate
4359: {
4360: /* Summary-only flag. */
4361: u_char summary_only;
4362:
4363: /* AS set generation. */
4364: u_char as_set;
4365:
4366: /* Route-map for aggregated route. */
4367: struct route_map *map;
4368:
4369: /* Suppress-count. */
4370: unsigned long count;
4371:
4372: /* SAFI configuration. */
4373: safi_t safi;
4374: };
4375:
4376: static struct bgp_aggregate *
4377: bgp_aggregate_new (void)
4378: {
4379: return XCALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
4380: }
4381:
4382: static void
4383: bgp_aggregate_free (struct bgp_aggregate *aggregate)
4384: {
4385: XFREE (MTYPE_BGP_AGGREGATE, aggregate);
4386: }
4387:
4388: static void
4389: bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
4390: afi_t afi, safi_t safi, struct bgp_info *del,
4391: struct bgp_aggregate *aggregate)
4392: {
4393: struct bgp_table *table;
4394: struct bgp_node *top;
4395: struct bgp_node *rn;
4396: u_char origin;
4397: struct aspath *aspath = NULL;
4398: struct aspath *asmerge = NULL;
4399: struct community *community = NULL;
4400: struct community *commerge = NULL;
4401: struct in_addr nexthop;
4402: u_int32_t med = 0;
4403: struct bgp_info *ri;
4404: struct bgp_info *new;
4405: int first = 1;
4406: unsigned long match = 0;
4407:
4408: /* Record adding route's nexthop and med. */
4409: if (rinew)
4410: {
4411: nexthop = rinew->attr->nexthop;
4412: med = rinew->attr->med;
4413: }
4414:
4415: /* ORIGIN attribute: If at least one route among routes that are
4416: aggregated has ORIGIN with the value INCOMPLETE, then the
4417: aggregated route must have the ORIGIN attribute with the value
4418: INCOMPLETE. Otherwise, if at least one route among routes that
4419: are aggregated has ORIGIN with the value EGP, then the aggregated
4420: route must have the origin attribute with the value EGP. In all
4421: other case the value of the ORIGIN attribute of the aggregated
4422: route is INTERNAL. */
4423: origin = BGP_ORIGIN_IGP;
4424:
4425: table = bgp->rib[afi][safi];
4426:
4427: top = bgp_node_get (table, p);
4428: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4429: if (rn->p.prefixlen > p->prefixlen)
4430: {
4431: match = 0;
4432:
4433: for (ri = rn->info; ri; ri = ri->next)
4434: {
4435: if (BGP_INFO_HOLDDOWN (ri))
4436: continue;
4437:
4438: if (del && ri == del)
4439: continue;
4440:
4441: if (! rinew && first)
4442: {
4443: nexthop = ri->attr->nexthop;
4444: med = ri->attr->med;
4445: first = 0;
4446: }
4447:
4448: #ifdef AGGREGATE_NEXTHOP_CHECK
4449: if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
4450: || ri->attr->med != med)
4451: {
4452: if (aspath)
4453: aspath_free (aspath);
4454: if (community)
4455: community_free (community);
4456: bgp_unlock_node (rn);
4457: bgp_unlock_node (top);
4458: return;
4459: }
4460: #endif /* AGGREGATE_NEXTHOP_CHECK */
4461:
4462: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4463: {
4464: if (aggregate->summary_only)
4465: {
4466: (bgp_info_extra_get (ri))->suppress++;
4467: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4468: match++;
4469: }
4470:
4471: aggregate->count++;
4472:
4473: if (aggregate->as_set)
4474: {
4475: if (origin < ri->attr->origin)
4476: origin = ri->attr->origin;
4477:
4478: if (aspath)
4479: {
4480: asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4481: aspath_free (aspath);
4482: aspath = asmerge;
4483: }
4484: else
4485: aspath = aspath_dup (ri->attr->aspath);
4486:
4487: if (ri->attr->community)
4488: {
4489: if (community)
4490: {
4491: commerge = community_merge (community,
4492: ri->attr->community);
4493: community = community_uniq_sort (commerge);
4494: community_free (commerge);
4495: }
4496: else
4497: community = community_dup (ri->attr->community);
4498: }
4499: }
4500: }
4501: }
4502: if (match)
4503: bgp_process (bgp, rn, afi, safi);
4504: }
4505: bgp_unlock_node (top);
4506:
4507: if (rinew)
4508: {
4509: aggregate->count++;
4510:
4511: if (aggregate->summary_only)
4512: (bgp_info_extra_get (rinew))->suppress++;
4513:
4514: if (aggregate->as_set)
4515: {
4516: if (origin < rinew->attr->origin)
4517: origin = rinew->attr->origin;
4518:
4519: if (aspath)
4520: {
4521: asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
4522: aspath_free (aspath);
4523: aspath = asmerge;
4524: }
4525: else
4526: aspath = aspath_dup (rinew->attr->aspath);
4527:
4528: if (rinew->attr->community)
4529: {
4530: if (community)
4531: {
4532: commerge = community_merge (community,
4533: rinew->attr->community);
4534: community = community_uniq_sort (commerge);
4535: community_free (commerge);
4536: }
4537: else
4538: community = community_dup (rinew->attr->community);
4539: }
4540: }
4541: }
4542:
4543: if (aggregate->count > 0)
4544: {
4545: rn = bgp_node_get (table, p);
4546: new = bgp_info_new ();
4547: new->type = ZEBRA_ROUTE_BGP;
4548: new->sub_type = BGP_ROUTE_AGGREGATE;
4549: new->peer = bgp->peer_self;
4550: SET_FLAG (new->flags, BGP_INFO_VALID);
4551: new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4552: new->uptime = bgp_clock ();
4553:
4554: bgp_info_add (rn, new);
4555: bgp_unlock_node (rn);
4556: bgp_process (bgp, rn, afi, safi);
4557: }
4558: else
4559: {
4560: if (aspath)
4561: aspath_free (aspath);
4562: if (community)
4563: community_free (community);
4564: }
4565: }
4566:
4567: void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
4568: struct bgp_aggregate *);
4569:
4570: void
4571: bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
4572: struct bgp_info *ri, afi_t afi, safi_t safi)
4573: {
4574: struct bgp_node *child;
4575: struct bgp_node *rn;
4576: struct bgp_aggregate *aggregate;
4577:
4578: /* MPLS-VPN aggregation is not yet supported. */
4579: if (safi == SAFI_MPLS_VPN)
4580: return;
4581:
4582: if (p->prefixlen == 0)
4583: return;
4584:
4585: if (BGP_INFO_HOLDDOWN (ri))
4586: return;
4587:
4588: child = bgp_node_get (bgp->aggregate[afi][safi], p);
4589:
4590: /* Aggregate address configuration check. */
4591: for (rn = child; rn; rn = rn->parent)
4592: if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4593: {
4594: bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4595: bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
4596: }
4597: bgp_unlock_node (child);
4598: }
4599:
4600: void
4601: bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
4602: struct bgp_info *del, afi_t afi, safi_t safi)
4603: {
4604: struct bgp_node *child;
4605: struct bgp_node *rn;
4606: struct bgp_aggregate *aggregate;
4607:
4608: /* MPLS-VPN aggregation is not yet supported. */
4609: if (safi == SAFI_MPLS_VPN)
4610: return;
4611:
4612: if (p->prefixlen == 0)
4613: return;
4614:
4615: child = bgp_node_get (bgp->aggregate[afi][safi], p);
4616:
4617: /* Aggregate address configuration check. */
4618: for (rn = child; rn; rn = rn->parent)
4619: if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
4620: {
4621: bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
4622: bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
4623: }
4624: bgp_unlock_node (child);
4625: }
4626:
4627: static void
4628: bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
4629: struct bgp_aggregate *aggregate)
4630: {
4631: struct bgp_table *table;
4632: struct bgp_node *top;
4633: struct bgp_node *rn;
4634: struct bgp_info *new;
4635: struct bgp_info *ri;
4636: unsigned long match;
4637: u_char origin = BGP_ORIGIN_IGP;
4638: struct aspath *aspath = NULL;
4639: struct aspath *asmerge = NULL;
4640: struct community *community = NULL;
4641: struct community *commerge = NULL;
4642:
4643: table = bgp->rib[afi][safi];
4644:
4645: /* Sanity check. */
4646: if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4647: return;
4648: if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4649: return;
4650:
4651: /* If routes exists below this node, generate aggregate routes. */
4652: top = bgp_node_get (table, p);
4653: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4654: if (rn->p.prefixlen > p->prefixlen)
4655: {
4656: match = 0;
4657:
4658: for (ri = rn->info; ri; ri = ri->next)
4659: {
4660: if (BGP_INFO_HOLDDOWN (ri))
4661: continue;
4662:
4663: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4664: {
4665: /* summary-only aggregate route suppress aggregated
4666: route announcement. */
4667: if (aggregate->summary_only)
4668: {
4669: (bgp_info_extra_get (ri))->suppress++;
4670: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4671: match++;
4672: }
4673: /* as-set aggregate route generate origin, as path,
4674: community aggregation. */
4675: if (aggregate->as_set)
4676: {
4677: if (origin < ri->attr->origin)
4678: origin = ri->attr->origin;
4679:
4680: if (aspath)
4681: {
4682: asmerge = aspath_aggregate (aspath, ri->attr->aspath);
4683: aspath_free (aspath);
4684: aspath = asmerge;
4685: }
4686: else
4687: aspath = aspath_dup (ri->attr->aspath);
4688:
4689: if (ri->attr->community)
4690: {
4691: if (community)
4692: {
4693: commerge = community_merge (community,
4694: ri->attr->community);
4695: community = community_uniq_sort (commerge);
4696: community_free (commerge);
4697: }
4698: else
4699: community = community_dup (ri->attr->community);
4700: }
4701: }
4702: aggregate->count++;
4703: }
4704: }
4705:
4706: /* If this node is suppressed, process the change. */
4707: if (match)
4708: bgp_process (bgp, rn, afi, safi);
4709: }
4710: bgp_unlock_node (top);
4711:
4712: /* Add aggregate route to BGP table. */
4713: if (aggregate->count)
4714: {
4715: rn = bgp_node_get (table, p);
4716:
4717: new = bgp_info_new ();
4718: new->type = ZEBRA_ROUTE_BGP;
4719: new->sub_type = BGP_ROUTE_AGGREGATE;
4720: new->peer = bgp->peer_self;
4721: SET_FLAG (new->flags, BGP_INFO_VALID);
4722: new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
4723: new->uptime = bgp_clock ();
4724:
4725: bgp_info_add (rn, new);
4726: bgp_unlock_node (rn);
4727:
4728: /* Process change. */
4729: bgp_process (bgp, rn, afi, safi);
4730: }
4731: }
4732:
4733: void
4734: bgp_aggregate_delete (struct bgp *bgp, struct prefix *p, afi_t afi,
4735: safi_t safi, struct bgp_aggregate *aggregate)
4736: {
4737: struct bgp_table *table;
4738: struct bgp_node *top;
4739: struct bgp_node *rn;
4740: struct bgp_info *ri;
4741: unsigned long match;
4742:
4743: table = bgp->rib[afi][safi];
4744:
4745: if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
4746: return;
4747: if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
4748: return;
4749:
4750: /* If routes exists below this node, generate aggregate routes. */
4751: top = bgp_node_get (table, p);
4752: for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
4753: if (rn->p.prefixlen > p->prefixlen)
4754: {
4755: match = 0;
4756:
4757: for (ri = rn->info; ri; ri = ri->next)
4758: {
4759: if (BGP_INFO_HOLDDOWN (ri))
4760: continue;
4761:
4762: if (ri->sub_type != BGP_ROUTE_AGGREGATE)
4763: {
4764: if (aggregate->summary_only && ri->extra)
4765: {
4766: ri->extra->suppress--;
4767:
4768: if (ri->extra->suppress == 0)
4769: {
4770: bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED);
4771: match++;
4772: }
4773: }
4774: aggregate->count--;
4775: }
4776: }
4777:
4778: /* If this node was suppressed, process the change. */
4779: if (match)
4780: bgp_process (bgp, rn, afi, safi);
4781: }
4782: bgp_unlock_node (top);
4783:
4784: /* Delete aggregate route from BGP table. */
4785: rn = bgp_node_get (table, p);
4786:
4787: for (ri = rn->info; ri; ri = ri->next)
4788: if (ri->peer == bgp->peer_self
4789: && ri->type == ZEBRA_ROUTE_BGP
4790: && ri->sub_type == BGP_ROUTE_AGGREGATE)
4791: break;
4792:
4793: /* Withdraw static BGP route from routing table. */
4794: if (ri)
4795: {
4796: bgp_info_delete (rn, ri);
4797: bgp_process (bgp, rn, afi, safi);
4798: }
4799:
4800: /* Unlock bgp_node_lookup. */
4801: bgp_unlock_node (rn);
4802: }
4803:
4804: /* Aggregate route attribute. */
4805: #define AGGREGATE_SUMMARY_ONLY 1
4806: #define AGGREGATE_AS_SET 1
4807:
4808: static int
4809: bgp_aggregate_unset (struct vty *vty, const char *prefix_str,
4810: afi_t afi, safi_t safi)
4811: {
4812: int ret;
4813: struct prefix p;
4814: struct bgp_node *rn;
4815: struct bgp *bgp;
4816: struct bgp_aggregate *aggregate;
4817:
4818: /* Convert string to prefix structure. */
4819: ret = str2prefix (prefix_str, &p);
4820: if (!ret)
4821: {
4822: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4823: return CMD_WARNING;
4824: }
4825: apply_mask (&p);
4826:
4827: /* Get BGP structure. */
4828: bgp = vty->index;
4829:
4830: /* Old configuration check. */
4831: rn = bgp_node_lookup (bgp->aggregate[afi][safi], &p);
4832: if (! rn)
4833: {
4834: vty_out (vty, "%% There is no aggregate-address configuration.%s",
4835: VTY_NEWLINE);
4836: return CMD_WARNING;
4837: }
4838:
4839: aggregate = rn->info;
4840: if (aggregate->safi & SAFI_UNICAST)
4841: bgp_aggregate_delete (bgp, &p, afi, SAFI_UNICAST, aggregate);
4842: if (aggregate->safi & SAFI_MULTICAST)
4843: bgp_aggregate_delete (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4844:
4845: /* Unlock aggregate address configuration. */
4846: rn->info = NULL;
4847: bgp_aggregate_free (aggregate);
4848: bgp_unlock_node (rn);
4849: bgp_unlock_node (rn);
4850:
4851: return CMD_SUCCESS;
4852: }
4853:
4854: static int
4855: bgp_aggregate_set (struct vty *vty, const char *prefix_str,
4856: afi_t afi, safi_t safi,
4857: u_char summary_only, u_char as_set)
4858: {
4859: int ret;
4860: struct prefix p;
4861: struct bgp_node *rn;
4862: struct bgp *bgp;
4863: struct bgp_aggregate *aggregate;
4864:
4865: /* Convert string to prefix structure. */
4866: ret = str2prefix (prefix_str, &p);
4867: if (!ret)
4868: {
4869: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
4870: return CMD_WARNING;
4871: }
4872: apply_mask (&p);
4873:
4874: /* Get BGP structure. */
4875: bgp = vty->index;
4876:
4877: /* Old configuration check. */
4878: rn = bgp_node_get (bgp->aggregate[afi][safi], &p);
4879:
4880: if (rn->info)
4881: {
4882: vty_out (vty, "There is already same aggregate network.%s", VTY_NEWLINE);
4883: /* try to remove the old entry */
4884: ret = bgp_aggregate_unset (vty, prefix_str, afi, safi);
4885: if (ret)
4886: {
4887: vty_out (vty, "Error deleting aggregate.%s", VTY_NEWLINE);
4888: bgp_unlock_node (rn);
4889: return CMD_WARNING;
4890: }
4891: }
4892:
4893: /* Make aggregate address structure. */
4894: aggregate = bgp_aggregate_new ();
4895: aggregate->summary_only = summary_only;
4896: aggregate->as_set = as_set;
4897: aggregate->safi = safi;
4898: rn->info = aggregate;
4899:
4900: /* Aggregate address insert into BGP routing table. */
4901: if (safi & SAFI_UNICAST)
4902: bgp_aggregate_add (bgp, &p, afi, SAFI_UNICAST, aggregate);
4903: if (safi & SAFI_MULTICAST)
4904: bgp_aggregate_add (bgp, &p, afi, SAFI_MULTICAST, aggregate);
4905:
4906: return CMD_SUCCESS;
4907: }
4908:
4909: DEFUN (aggregate_address,
4910: aggregate_address_cmd,
4911: "aggregate-address A.B.C.D/M",
4912: "Configure BGP aggregate entries\n"
4913: "Aggregate prefix\n")
4914: {
4915: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty), 0, 0);
4916: }
4917:
4918: DEFUN (aggregate_address_mask,
4919: aggregate_address_mask_cmd,
4920: "aggregate-address A.B.C.D A.B.C.D",
4921: "Configure BGP aggregate entries\n"
4922: "Aggregate address\n"
4923: "Aggregate mask\n")
4924: {
4925: int ret;
4926: char prefix_str[BUFSIZ];
4927:
4928: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4929:
4930: if (! ret)
4931: {
4932: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4933: return CMD_WARNING;
4934: }
4935:
4936: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4937: 0, 0);
4938: }
4939:
4940: DEFUN (aggregate_address_summary_only,
4941: aggregate_address_summary_only_cmd,
4942: "aggregate-address A.B.C.D/M summary-only",
4943: "Configure BGP aggregate entries\n"
4944: "Aggregate prefix\n"
4945: "Filter more specific routes from updates\n")
4946: {
4947: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
4948: AGGREGATE_SUMMARY_ONLY, 0);
4949: }
4950:
4951: DEFUN (aggregate_address_mask_summary_only,
4952: aggregate_address_mask_summary_only_cmd,
4953: "aggregate-address A.B.C.D A.B.C.D summary-only",
4954: "Configure BGP aggregate entries\n"
4955: "Aggregate address\n"
4956: "Aggregate mask\n"
4957: "Filter more specific routes from updates\n")
4958: {
4959: int ret;
4960: char prefix_str[BUFSIZ];
4961:
4962: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4963:
4964: if (! ret)
4965: {
4966: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
4967: return CMD_WARNING;
4968: }
4969:
4970: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
4971: AGGREGATE_SUMMARY_ONLY, 0);
4972: }
4973:
4974: DEFUN (aggregate_address_as_set,
4975: aggregate_address_as_set_cmd,
4976: "aggregate-address A.B.C.D/M as-set",
4977: "Configure BGP aggregate entries\n"
4978: "Aggregate prefix\n"
4979: "Generate AS set path information\n")
4980: {
4981: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
4982: 0, AGGREGATE_AS_SET);
4983: }
4984:
4985: DEFUN (aggregate_address_mask_as_set,
4986: aggregate_address_mask_as_set_cmd,
4987: "aggregate-address A.B.C.D A.B.C.D as-set",
4988: "Configure BGP aggregate entries\n"
4989: "Aggregate address\n"
4990: "Aggregate mask\n"
4991: "Generate AS set path information\n")
4992: {
4993: int ret;
4994: char prefix_str[BUFSIZ];
4995:
4996: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
4997:
4998: if (! ret)
4999: {
5000: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5001: return CMD_WARNING;
5002: }
5003:
5004: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5005: 0, AGGREGATE_AS_SET);
5006: }
5007:
5008:
5009: DEFUN (aggregate_address_as_set_summary,
5010: aggregate_address_as_set_summary_cmd,
5011: "aggregate-address A.B.C.D/M as-set summary-only",
5012: "Configure BGP aggregate entries\n"
5013: "Aggregate prefix\n"
5014: "Generate AS set path information\n"
5015: "Filter more specific routes from updates\n")
5016: {
5017: return bgp_aggregate_set (vty, argv[0], AFI_IP, bgp_node_safi (vty),
5018: AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5019: }
5020:
5021: ALIAS (aggregate_address_as_set_summary,
5022: aggregate_address_summary_as_set_cmd,
5023: "aggregate-address A.B.C.D/M summary-only as-set",
5024: "Configure BGP aggregate entries\n"
5025: "Aggregate prefix\n"
5026: "Filter more specific routes from updates\n"
5027: "Generate AS set path information\n")
5028:
5029: DEFUN (aggregate_address_mask_as_set_summary,
5030: aggregate_address_mask_as_set_summary_cmd,
5031: "aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5032: "Configure BGP aggregate entries\n"
5033: "Aggregate address\n"
5034: "Aggregate mask\n"
5035: "Generate AS set path information\n"
5036: "Filter more specific routes from updates\n")
5037: {
5038: int ret;
5039: char prefix_str[BUFSIZ];
5040:
5041: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5042:
5043: if (! ret)
5044: {
5045: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5046: return CMD_WARNING;
5047: }
5048:
5049: return bgp_aggregate_set (vty, prefix_str, AFI_IP, bgp_node_safi (vty),
5050: AGGREGATE_SUMMARY_ONLY, AGGREGATE_AS_SET);
5051: }
5052:
5053: ALIAS (aggregate_address_mask_as_set_summary,
5054: aggregate_address_mask_summary_as_set_cmd,
5055: "aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5056: "Configure BGP aggregate entries\n"
5057: "Aggregate address\n"
5058: "Aggregate mask\n"
5059: "Filter more specific routes from updates\n"
5060: "Generate AS set path information\n")
5061:
5062: DEFUN (no_aggregate_address,
5063: no_aggregate_address_cmd,
5064: "no aggregate-address A.B.C.D/M",
5065: NO_STR
5066: "Configure BGP aggregate entries\n"
5067: "Aggregate prefix\n")
5068: {
5069: return bgp_aggregate_unset (vty, argv[0], AFI_IP, bgp_node_safi (vty));
5070: }
5071:
5072: ALIAS (no_aggregate_address,
5073: no_aggregate_address_summary_only_cmd,
5074: "no aggregate-address A.B.C.D/M summary-only",
5075: NO_STR
5076: "Configure BGP aggregate entries\n"
5077: "Aggregate prefix\n"
5078: "Filter more specific routes from updates\n")
5079:
5080: ALIAS (no_aggregate_address,
5081: no_aggregate_address_as_set_cmd,
5082: "no aggregate-address A.B.C.D/M as-set",
5083: NO_STR
5084: "Configure BGP aggregate entries\n"
5085: "Aggregate prefix\n"
5086: "Generate AS set path information\n")
5087:
5088: ALIAS (no_aggregate_address,
5089: no_aggregate_address_as_set_summary_cmd,
5090: "no aggregate-address A.B.C.D/M as-set summary-only",
5091: NO_STR
5092: "Configure BGP aggregate entries\n"
5093: "Aggregate prefix\n"
5094: "Generate AS set path information\n"
5095: "Filter more specific routes from updates\n")
5096:
5097: ALIAS (no_aggregate_address,
5098: no_aggregate_address_summary_as_set_cmd,
5099: "no aggregate-address A.B.C.D/M summary-only as-set",
5100: NO_STR
5101: "Configure BGP aggregate entries\n"
5102: "Aggregate prefix\n"
5103: "Filter more specific routes from updates\n"
5104: "Generate AS set path information\n")
5105:
5106: DEFUN (no_aggregate_address_mask,
5107: no_aggregate_address_mask_cmd,
5108: "no aggregate-address A.B.C.D A.B.C.D",
5109: NO_STR
5110: "Configure BGP aggregate entries\n"
5111: "Aggregate address\n"
5112: "Aggregate mask\n")
5113: {
5114: int ret;
5115: char prefix_str[BUFSIZ];
5116:
5117: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
5118:
5119: if (! ret)
5120: {
5121: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
5122: return CMD_WARNING;
5123: }
5124:
5125: return bgp_aggregate_unset (vty, prefix_str, AFI_IP, bgp_node_safi (vty));
5126: }
5127:
5128: ALIAS (no_aggregate_address_mask,
5129: no_aggregate_address_mask_summary_only_cmd,
5130: "no aggregate-address A.B.C.D A.B.C.D summary-only",
5131: NO_STR
5132: "Configure BGP aggregate entries\n"
5133: "Aggregate address\n"
5134: "Aggregate mask\n"
5135: "Filter more specific routes from updates\n")
5136:
5137: ALIAS (no_aggregate_address_mask,
5138: no_aggregate_address_mask_as_set_cmd,
5139: "no aggregate-address A.B.C.D A.B.C.D as-set",
5140: NO_STR
5141: "Configure BGP aggregate entries\n"
5142: "Aggregate address\n"
5143: "Aggregate mask\n"
5144: "Generate AS set path information\n")
5145:
5146: ALIAS (no_aggregate_address_mask,
5147: no_aggregate_address_mask_as_set_summary_cmd,
5148: "no aggregate-address A.B.C.D A.B.C.D as-set summary-only",
5149: NO_STR
5150: "Configure BGP aggregate entries\n"
5151: "Aggregate address\n"
5152: "Aggregate mask\n"
5153: "Generate AS set path information\n"
5154: "Filter more specific routes from updates\n")
5155:
5156: ALIAS (no_aggregate_address_mask,
5157: no_aggregate_address_mask_summary_as_set_cmd,
5158: "no aggregate-address A.B.C.D A.B.C.D summary-only as-set",
5159: NO_STR
5160: "Configure BGP aggregate entries\n"
5161: "Aggregate address\n"
5162: "Aggregate mask\n"
5163: "Filter more specific routes from updates\n"
5164: "Generate AS set path information\n")
5165:
5166: #ifdef HAVE_IPV6
5167: DEFUN (ipv6_aggregate_address,
5168: ipv6_aggregate_address_cmd,
5169: "aggregate-address X:X::X:X/M",
5170: "Configure BGP aggregate entries\n"
5171: "Aggregate prefix\n")
5172: {
5173: return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST, 0, 0);
5174: }
5175:
5176: DEFUN (ipv6_aggregate_address_summary_only,
5177: ipv6_aggregate_address_summary_only_cmd,
5178: "aggregate-address X:X::X:X/M summary-only",
5179: "Configure BGP aggregate entries\n"
5180: "Aggregate prefix\n"
5181: "Filter more specific routes from updates\n")
5182: {
5183: return bgp_aggregate_set (vty, argv[0], AFI_IP6, SAFI_UNICAST,
5184: AGGREGATE_SUMMARY_ONLY, 0);
5185: }
5186:
5187: DEFUN (no_ipv6_aggregate_address,
5188: no_ipv6_aggregate_address_cmd,
5189: "no aggregate-address X:X::X:X/M",
5190: NO_STR
5191: "Configure BGP aggregate entries\n"
5192: "Aggregate prefix\n")
5193: {
5194: return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5195: }
5196:
5197: DEFUN (no_ipv6_aggregate_address_summary_only,
5198: no_ipv6_aggregate_address_summary_only_cmd,
5199: "no aggregate-address X:X::X:X/M summary-only",
5200: NO_STR
5201: "Configure BGP aggregate entries\n"
5202: "Aggregate prefix\n"
5203: "Filter more specific routes from updates\n")
5204: {
5205: return bgp_aggregate_unset (vty, argv[0], AFI_IP6, SAFI_UNICAST);
5206: }
5207:
5208: ALIAS (ipv6_aggregate_address,
5209: old_ipv6_aggregate_address_cmd,
5210: "ipv6 bgp aggregate-address X:X::X:X/M",
5211: IPV6_STR
5212: BGP_STR
5213: "Configure BGP aggregate entries\n"
5214: "Aggregate prefix\n")
5215:
5216: ALIAS (ipv6_aggregate_address_summary_only,
5217: old_ipv6_aggregate_address_summary_only_cmd,
5218: "ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5219: IPV6_STR
5220: BGP_STR
5221: "Configure BGP aggregate entries\n"
5222: "Aggregate prefix\n"
5223: "Filter more specific routes from updates\n")
5224:
5225: ALIAS (no_ipv6_aggregate_address,
5226: old_no_ipv6_aggregate_address_cmd,
5227: "no ipv6 bgp aggregate-address X:X::X:X/M",
5228: NO_STR
5229: IPV6_STR
5230: BGP_STR
5231: "Configure BGP aggregate entries\n"
5232: "Aggregate prefix\n")
5233:
5234: ALIAS (no_ipv6_aggregate_address_summary_only,
5235: old_no_ipv6_aggregate_address_summary_only_cmd,
5236: "no ipv6 bgp aggregate-address X:X::X:X/M summary-only",
5237: NO_STR
5238: IPV6_STR
5239: BGP_STR
5240: "Configure BGP aggregate entries\n"
5241: "Aggregate prefix\n"
5242: "Filter more specific routes from updates\n")
5243: #endif /* HAVE_IPV6 */
5244:
5245: /* Redistribute route treatment. */
5246: void
5247: bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
5248: u_int32_t metric, u_char type)
5249: {
5250: struct bgp *bgp;
5251: struct listnode *node, *nnode;
5252: struct bgp_info *new;
5253: struct bgp_info *bi;
5254: struct bgp_info info;
5255: struct bgp_node *bn;
5256: struct attr attr = { 0 };
5257: struct attr attr_new = { 0 };
5258: struct attr *new_attr;
5259: afi_t afi;
5260: int ret;
5261:
5262: /* Make default attribute. */
5263: bgp_attr_default_set (&attr, BGP_ORIGIN_INCOMPLETE);
5264: if (nexthop)
5265: attr.nexthop = *nexthop;
5266:
5267: attr.med = metric;
5268: attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
5269:
5270: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5271: {
5272: afi = family2afi (p->family);
5273:
5274: if (bgp->redist[afi][type])
5275: {
5276: /* Copy attribute for modification. */
5277: bgp_attr_dup (&attr_new, &attr);
5278:
5279: if (bgp->redist_metric_flag[afi][type])
5280: attr_new.med = bgp->redist_metric[afi][type];
5281:
5282: /* Apply route-map. */
5283: if (bgp->rmap[afi][type].map)
5284: {
5285: info.peer = bgp->peer_self;
5286: info.attr = &attr_new;
5287:
5288: SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
5289:
5290: ret = route_map_apply (bgp->rmap[afi][type].map, p, RMAP_BGP,
5291: &info);
5292:
5293: bgp->peer_self->rmap_type = 0;
5294:
5295: if (ret == RMAP_DENYMATCH)
5296: {
5297: /* Free uninterned attribute. */
5298: bgp_attr_flush (&attr_new);
5299: bgp_attr_extra_free (&attr_new);
5300:
5301: /* Unintern original. */
5302: aspath_unintern (&attr.aspath);
5303: bgp_attr_extra_free (&attr);
5304: bgp_redistribute_delete (p, type);
5305: return;
5306: }
5307: }
5308:
5309: bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
5310: afi, SAFI_UNICAST, p, NULL);
5311:
5312: new_attr = bgp_attr_intern (&attr_new);
5313: bgp_attr_extra_free (&attr_new);
5314:
5315: for (bi = bn->info; bi; bi = bi->next)
5316: if (bi->peer == bgp->peer_self
5317: && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
5318: break;
5319:
5320: if (bi)
5321: {
5322: if (attrhash_cmp (bi->attr, new_attr) &&
5323: !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5324: {
5325: bgp_attr_unintern (&new_attr);
5326: aspath_unintern (&attr.aspath);
5327: bgp_attr_extra_free (&attr);
5328: bgp_unlock_node (bn);
5329: return;
5330: }
5331: else
5332: {
5333: /* The attribute is changed. */
5334: bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
5335:
5336: /* Rewrite BGP route information. */
5337: if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
5338: bgp_info_restore(bn, bi);
5339: else
5340: bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
5341: bgp_attr_unintern (&bi->attr);
5342: bi->attr = new_attr;
5343: bi->uptime = bgp_clock ();
5344:
5345: /* Process change. */
5346: bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
5347: bgp_process (bgp, bn, afi, SAFI_UNICAST);
5348: bgp_unlock_node (bn);
5349: aspath_unintern (&attr.aspath);
5350: bgp_attr_extra_free (&attr);
5351: return;
5352: }
5353: }
5354:
5355: new = bgp_info_new ();
5356: new->type = type;
5357: new->sub_type = BGP_ROUTE_REDISTRIBUTE;
5358: new->peer = bgp->peer_self;
5359: SET_FLAG (new->flags, BGP_INFO_VALID);
5360: new->attr = new_attr;
5361: new->uptime = bgp_clock ();
5362:
5363: bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
5364: bgp_info_add (bn, new);
5365: bgp_unlock_node (bn);
5366: bgp_process (bgp, bn, afi, SAFI_UNICAST);
5367: }
5368: }
5369:
5370: /* Unintern original. */
5371: aspath_unintern (&attr.aspath);
5372: bgp_attr_extra_free (&attr);
5373: }
5374:
5375: void
5376: bgp_redistribute_delete (struct prefix *p, u_char type)
5377: {
5378: struct bgp *bgp;
5379: struct listnode *node, *nnode;
5380: afi_t afi;
5381: struct bgp_node *rn;
5382: struct bgp_info *ri;
5383:
5384: for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
5385: {
5386: afi = family2afi (p->family);
5387:
5388: if (bgp->redist[afi][type])
5389: {
5390: rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
5391:
5392: for (ri = rn->info; ri; ri = ri->next)
5393: if (ri->peer == bgp->peer_self
5394: && ri->type == type)
5395: break;
5396:
5397: if (ri)
5398: {
5399: bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
5400: bgp_info_delete (rn, ri);
5401: bgp_process (bgp, rn, afi, SAFI_UNICAST);
5402: }
5403: bgp_unlock_node (rn);
5404: }
5405: }
5406: }
5407:
5408: /* Withdraw specified route type's route. */
5409: void
5410: bgp_redistribute_withdraw (struct bgp *bgp, afi_t afi, int type)
5411: {
5412: struct bgp_node *rn;
5413: struct bgp_info *ri;
5414: struct bgp_table *table;
5415:
5416: table = bgp->rib[afi][SAFI_UNICAST];
5417:
5418: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
5419: {
5420: for (ri = rn->info; ri; ri = ri->next)
5421: if (ri->peer == bgp->peer_self
5422: && ri->type == type)
5423: break;
5424:
5425: if (ri)
5426: {
5427: bgp_aggregate_decrement (bgp, &rn->p, ri, afi, SAFI_UNICAST);
5428: bgp_info_delete (rn, ri);
5429: bgp_process (bgp, rn, afi, SAFI_UNICAST);
5430: }
5431: }
5432: }
5433:
5434: /* Static function to display route. */
5435: static void
5436: route_vty_out_route (struct prefix *p, struct vty *vty)
5437: {
5438: int len;
5439: u_int32_t destination;
5440: char buf[BUFSIZ];
5441:
5442: if (p->family == AF_INET)
5443: {
5444: len = vty_out (vty, "%s", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ));
5445: destination = ntohl (p->u.prefix4.s_addr);
5446:
5447: if ((IN_CLASSC (destination) && p->prefixlen == 24)
5448: || (IN_CLASSB (destination) && p->prefixlen == 16)
5449: || (IN_CLASSA (destination) && p->prefixlen == 8)
5450: || p->u.prefix4.s_addr == 0)
5451: {
5452: /* When mask is natural, mask is not displayed. */
5453: }
5454: else
5455: len += vty_out (vty, "/%d", p->prefixlen);
5456: }
5457: else
5458: len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
5459: p->prefixlen);
5460:
5461: len = 17 - len;
5462: if (len < 1)
5463: vty_out (vty, "%s%*s", VTY_NEWLINE, 20, " ");
5464: else
5465: vty_out (vty, "%*s", len, " ");
5466: }
5467:
5468: enum bgp_display_type
5469: {
5470: normal_list,
5471: };
5472:
5473: /* Print the short form route status for a bgp_info */
5474: static void
5475: route_vty_short_status_out (struct vty *vty, struct bgp_info *binfo)
5476: {
5477: /* Route status display. */
5478: if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5479: vty_out (vty, "R");
5480: else if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5481: vty_out (vty, "S");
5482: else if (binfo->extra && binfo->extra->suppress)
5483: vty_out (vty, "s");
5484: else if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5485: vty_out (vty, "*");
5486: else
5487: vty_out (vty, " ");
5488:
5489: /* Selected */
5490: if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5491: vty_out (vty, "h");
5492: else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5493: vty_out (vty, "d");
5494: else if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5495: vty_out (vty, ">");
5496: else
5497: vty_out (vty, " ");
5498:
5499: /* Internal route. */
5500: if ((binfo->peer->as) && (binfo->peer->as == binfo->peer->local_as))
5501: vty_out (vty, "i");
5502: else
5503: vty_out (vty, " ");
5504: }
5505:
5506: /* called from terminal list command */
5507: void
5508: route_vty_out (struct vty *vty, struct prefix *p,
5509: struct bgp_info *binfo, int display, safi_t safi)
5510: {
5511: struct attr *attr;
5512:
5513: /* short status lead text */
5514: route_vty_short_status_out (vty, binfo);
5515:
5516: /* print prefix and mask */
5517: if (! display)
5518: route_vty_out_route (p, vty);
5519: else
5520: vty_out (vty, "%*s", 17, " ");
5521:
5522: /* Print attribute */
5523: attr = binfo->attr;
5524: if (attr)
5525: {
5526: if (p->family == AF_INET)
5527: {
5528: if (safi == SAFI_MPLS_VPN)
5529: vty_out (vty, "%-16s",
5530: inet_ntoa (attr->extra->mp_nexthop_global_in));
5531: else
5532: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5533: }
5534: #ifdef HAVE_IPV6
5535: else if (p->family == AF_INET6)
5536: {
5537: int len;
5538: char buf[BUFSIZ];
5539:
5540: len = vty_out (vty, "%s",
5541: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5542: buf, BUFSIZ));
5543: len = 16 - len;
5544: if (len < 1)
5545: vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5546: else
5547: vty_out (vty, "%*s", len, " ");
5548: }
5549: #endif /* HAVE_IPV6 */
5550:
5551: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5552: vty_out (vty, "%10u", attr->med);
5553: else
5554: vty_out (vty, " ");
5555:
5556: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5557: vty_out (vty, "%7u", attr->local_pref);
5558: else
5559: vty_out (vty, " ");
5560:
5561: vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
5562:
5563: /* Print aspath */
5564: if (attr->aspath)
5565: aspath_print_vty (vty, "%s", attr->aspath, " ");
5566:
5567: /* Print origin */
5568: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5569: }
5570: vty_out (vty, "%s", VTY_NEWLINE);
5571: }
5572:
5573: /* called from terminal list command */
5574: void
5575: route_vty_out_tmp (struct vty *vty, struct prefix *p,
5576: struct attr *attr, safi_t safi)
5577: {
5578: /* Route status display. */
5579: vty_out (vty, "*");
5580: vty_out (vty, ">");
5581: vty_out (vty, " ");
5582:
5583: /* print prefix and mask */
5584: route_vty_out_route (p, vty);
5585:
5586: /* Print attribute */
5587: if (attr)
5588: {
5589: if (p->family == AF_INET)
5590: {
5591: if (safi == SAFI_MPLS_VPN)
5592: vty_out (vty, "%-16s",
5593: inet_ntoa (attr->extra->mp_nexthop_global_in));
5594: else
5595: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5596: }
5597: #ifdef HAVE_IPV6
5598: else if (p->family == AF_INET6)
5599: {
5600: int len;
5601: char buf[BUFSIZ];
5602:
5603: assert (attr->extra);
5604:
5605: len = vty_out (vty, "%s",
5606: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5607: buf, BUFSIZ));
5608: len = 16 - len;
5609: if (len < 1)
5610: vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
5611: else
5612: vty_out (vty, "%*s", len, " ");
5613: }
5614: #endif /* HAVE_IPV6 */
5615:
5616: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
5617: vty_out (vty, "%10u", attr->med);
5618: else
5619: vty_out (vty, " ");
5620:
5621: if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
5622: vty_out (vty, "%7u", attr->local_pref);
5623: else
5624: vty_out (vty, " ");
5625:
5626: vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
5627:
5628: /* Print aspath */
5629: if (attr->aspath)
5630: aspath_print_vty (vty, "%s", attr->aspath, " ");
5631:
5632: /* Print origin */
5633: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5634: }
5635:
5636: vty_out (vty, "%s", VTY_NEWLINE);
5637: }
5638:
5639: void
5640: route_vty_out_tag (struct vty *vty, struct prefix *p,
5641: struct bgp_info *binfo, int display, safi_t safi)
5642: {
5643: struct attr *attr;
5644: u_int32_t label = 0;
5645:
5646: if (!binfo->extra)
5647: return;
5648:
5649: /* short status lead text */
5650: route_vty_short_status_out (vty, binfo);
5651:
5652: /* print prefix and mask */
5653: if (! display)
5654: route_vty_out_route (p, vty);
5655: else
5656: vty_out (vty, "%*s", 17, " ");
5657:
5658: /* Print attribute */
5659: attr = binfo->attr;
5660: if (attr)
5661: {
5662: if (p->family == AF_INET)
5663: {
5664: if (safi == SAFI_MPLS_VPN)
5665: vty_out (vty, "%-16s",
5666: inet_ntoa (attr->extra->mp_nexthop_global_in));
5667: else
5668: vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
5669: }
5670: #ifdef HAVE_IPV6
5671: else if (p->family == AF_INET6)
5672: {
5673: assert (attr->extra);
5674: char buf[BUFSIZ];
5675: char buf1[BUFSIZ];
5676: if (attr->extra->mp_nexthop_len == 16)
5677: vty_out (vty, "%s",
5678: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5679: buf, BUFSIZ));
5680: else if (attr->extra->mp_nexthop_len == 32)
5681: vty_out (vty, "%s(%s)",
5682: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5683: buf, BUFSIZ),
5684: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5685: buf1, BUFSIZ));
5686:
5687: }
5688: #endif /* HAVE_IPV6 */
5689: }
5690:
5691: label = decode_label (binfo->extra->tag);
5692:
5693: vty_out (vty, "notag/%d", label);
5694:
5695: vty_out (vty, "%s", VTY_NEWLINE);
5696: }
5697:
5698: /* dampening route */
5699: static void
5700: damp_route_vty_out (struct vty *vty, struct prefix *p,
5701: struct bgp_info *binfo, int display, safi_t safi)
5702: {
5703: struct attr *attr;
5704: int len;
5705: char timebuf[BGP_UPTIME_LEN];
5706:
5707: /* short status lead text */
5708: route_vty_short_status_out (vty, binfo);
5709:
5710: /* print prefix and mask */
5711: if (! display)
5712: route_vty_out_route (p, vty);
5713: else
5714: vty_out (vty, "%*s", 17, " ");
5715:
5716: len = vty_out (vty, "%s", binfo->peer->host);
5717: len = 17 - len;
5718: if (len < 1)
5719: vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
5720: else
5721: vty_out (vty, "%*s", len, " ");
5722:
5723: vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
5724:
5725: /* Print attribute */
5726: attr = binfo->attr;
5727: if (attr)
5728: {
5729: /* Print aspath */
5730: if (attr->aspath)
5731: aspath_print_vty (vty, "%s", attr->aspath, " ");
5732:
5733: /* Print origin */
5734: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5735: }
5736: vty_out (vty, "%s", VTY_NEWLINE);
5737: }
5738:
5739: /* flap route */
5740: static void
5741: flap_route_vty_out (struct vty *vty, struct prefix *p,
5742: struct bgp_info *binfo, int display, safi_t safi)
5743: {
5744: struct attr *attr;
5745: struct bgp_damp_info *bdi;
5746: char timebuf[BGP_UPTIME_LEN];
5747: int len;
5748:
5749: if (!binfo->extra)
5750: return;
5751:
5752: bdi = binfo->extra->damp_info;
5753:
5754: /* short status lead text */
5755: route_vty_short_status_out (vty, binfo);
5756:
5757: /* print prefix and mask */
5758: if (! display)
5759: route_vty_out_route (p, vty);
5760: else
5761: vty_out (vty, "%*s", 17, " ");
5762:
5763: len = vty_out (vty, "%s", binfo->peer->host);
5764: len = 16 - len;
5765: if (len < 1)
5766: vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
5767: else
5768: vty_out (vty, "%*s", len, " ");
5769:
5770: len = vty_out (vty, "%d", bdi->flap);
5771: len = 5 - len;
5772: if (len < 1)
5773: vty_out (vty, " ");
5774: else
5775: vty_out (vty, "%*s ", len, " ");
5776:
5777: vty_out (vty, "%s ", peer_uptime (bdi->start_time,
5778: timebuf, BGP_UPTIME_LEN));
5779:
5780: if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
5781: && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5782: vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
5783: else
5784: vty_out (vty, "%*s ", 8, " ");
5785:
5786: /* Print attribute */
5787: attr = binfo->attr;
5788: if (attr)
5789: {
5790: /* Print aspath */
5791: if (attr->aspath)
5792: aspath_print_vty (vty, "%s", attr->aspath, " ");
5793:
5794: /* Print origin */
5795: vty_out (vty, "%s", bgp_origin_str[attr->origin]);
5796: }
5797: vty_out (vty, "%s", VTY_NEWLINE);
5798: }
5799:
5800: static void
5801: route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
5802: struct bgp_info *binfo, afi_t afi, safi_t safi)
5803: {
5804: char buf[INET6_ADDRSTRLEN];
5805: char buf1[BUFSIZ];
5806: struct attr *attr;
5807: int sockunion_vty_out (struct vty *, union sockunion *);
5808: #ifdef HAVE_CLOCK_MONOTONIC
5809: time_t tbuf;
5810: #endif
5811:
5812: attr = binfo->attr;
5813:
5814: if (attr)
5815: {
5816: /* Line1 display AS-path, Aggregator */
5817: if (attr->aspath)
5818: {
5819: vty_out (vty, " ");
5820: if (aspath_count_hops (attr->aspath) == 0)
5821: vty_out (vty, "Local");
5822: else
5823: aspath_print_vty (vty, "%s", attr->aspath, "");
5824: }
5825:
5826: if (CHECK_FLAG (binfo->flags, BGP_INFO_REMOVED))
5827: vty_out (vty, ", (removed)");
5828: if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE))
5829: vty_out (vty, ", (stale)");
5830: if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
5831: vty_out (vty, ", (aggregated by %u %s)",
5832: attr->extra->aggregator_as,
5833: inet_ntoa (attr->extra->aggregator_addr));
5834: if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
5835: vty_out (vty, ", (Received from a RR-client)");
5836: if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
5837: vty_out (vty, ", (Received from a RS-client)");
5838: if (CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5839: vty_out (vty, ", (history entry)");
5840: else if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED))
5841: vty_out (vty, ", (suppressed due to dampening)");
5842: vty_out (vty, "%s", VTY_NEWLINE);
5843:
5844: /* Line2 display Next-hop, Neighbor, Router-id */
5845: if (p->family == AF_INET)
5846: {
5847: vty_out (vty, " %s", safi == SAFI_MPLS_VPN ?
5848: inet_ntoa (attr->extra->mp_nexthop_global_in) :
5849: inet_ntoa (attr->nexthop));
5850: }
5851: #ifdef HAVE_IPV6
5852: else
5853: {
5854: assert (attr->extra);
5855: vty_out (vty, " %s",
5856: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
5857: buf, INET6_ADDRSTRLEN));
5858: }
5859: #endif /* HAVE_IPV6 */
5860:
5861: if (binfo->peer == bgp->peer_self)
5862: {
5863: vty_out (vty, " from %s ",
5864: p->family == AF_INET ? "0.0.0.0" : "::");
5865: vty_out (vty, "(%s)", inet_ntoa(bgp->router_id));
5866: }
5867: else
5868: {
5869: if (! CHECK_FLAG (binfo->flags, BGP_INFO_VALID))
5870: vty_out (vty, " (inaccessible)");
5871: else if (binfo->extra && binfo->extra->igpmetric)
5872: vty_out (vty, " (metric %d)", binfo->extra->igpmetric);
5873: vty_out (vty, " from %s", sockunion2str (&binfo->peer->su, buf, SU_ADDRSTRLEN));
5874: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
5875: vty_out (vty, " (%s)", inet_ntoa (attr->extra->originator_id));
5876: else
5877: vty_out (vty, " (%s)", inet_ntop (AF_INET, &binfo->peer->remote_id, buf1, BUFSIZ));
5878: }
5879: vty_out (vty, "%s", VTY_NEWLINE);
5880:
5881: #ifdef HAVE_IPV6
5882: /* display nexthop local */
5883: if (attr->extra && attr->extra->mp_nexthop_len == 32)
5884: {
5885: vty_out (vty, " (%s)%s",
5886: inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
5887: buf, INET6_ADDRSTRLEN),
5888: VTY_NEWLINE);
5889: }
5890: #endif /* HAVE_IPV6 */
5891:
5892: /* Line 3 display Origin, Med, Locpref, Weight, valid, Int/Ext/Local, Atomic, best */
5893: vty_out (vty, " Origin %s", bgp_origin_long_str[attr->origin]);
5894:
5895: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
5896: vty_out (vty, ", metric %u", attr->med);
5897:
5898: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
5899: vty_out (vty, ", localpref %u", attr->local_pref);
5900: else
5901: vty_out (vty, ", localpref %u", bgp->default_local_pref);
5902:
5903: if (attr->extra && attr->extra->weight != 0)
5904: vty_out (vty, ", weight %u", attr->extra->weight);
5905:
5906: if (! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
5907: vty_out (vty, ", valid");
5908:
5909: if (binfo->peer != bgp->peer_self)
5910: {
5911: if (binfo->peer->as == binfo->peer->local_as)
5912: vty_out (vty, ", internal");
5913: else
5914: vty_out (vty, ", %s",
5915: (bgp_confederation_peers_check(bgp, binfo->peer->as) ? "confed-external" : "external"));
5916: }
5917: else if (binfo->sub_type == BGP_ROUTE_AGGREGATE)
5918: vty_out (vty, ", aggregated, local");
5919: else if (binfo->type != ZEBRA_ROUTE_BGP)
5920: vty_out (vty, ", sourced");
5921: else
5922: vty_out (vty, ", sourced, local");
5923:
5924: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
5925: vty_out (vty, ", atomic-aggregate");
5926:
5927: if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
5928: vty_out (vty, ", best");
5929:
5930: vty_out (vty, "%s", VTY_NEWLINE);
5931:
5932: /* Line 4 display Community */
5933: if (attr->community)
5934: vty_out (vty, " Community: %s%s", attr->community->str,
5935: VTY_NEWLINE);
5936:
5937: /* Line 5 display Extended-community */
5938: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES))
5939: vty_out (vty, " Extended Community: %s%s",
5940: attr->extra->ecommunity->str, VTY_NEWLINE);
5941:
5942: /* Line 6 display Originator, Cluster-id */
5943: if ((attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)) ||
5944: (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)))
5945: {
5946: assert (attr->extra);
5947: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
5948: vty_out (vty, " Originator: %s",
5949: inet_ntoa (attr->extra->originator_id));
5950:
5951: if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
5952: {
5953: int i;
5954: vty_out (vty, ", Cluster list: ");
5955: for (i = 0; i < attr->extra->cluster->length / 4; i++)
5956: vty_out (vty, "%s ",
5957: inet_ntoa (attr->extra->cluster->list[i]));
5958: }
5959: vty_out (vty, "%s", VTY_NEWLINE);
5960: }
5961:
5962: if (binfo->extra && binfo->extra->damp_info)
5963: bgp_damp_info_vty (vty, binfo);
5964:
5965: /* Line 7 display Uptime */
5966: #ifdef HAVE_CLOCK_MONOTONIC
5967: tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
5968: vty_out (vty, " Last update: %s", ctime(&tbuf));
5969: #else
5970: vty_out (vty, " Last update: %s", ctime(&binfo->uptime));
5971: #endif /* HAVE_CLOCK_MONOTONIC */
5972: }
5973: vty_out (vty, "%s", VTY_NEWLINE);
5974: }
5975:
5976: #define BGP_SHOW_SCODE_HEADER "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,%s r RIB-failure, S Stale, R Removed%s"
5977: #define BGP_SHOW_OCODE_HEADER "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s"
5978: #define BGP_SHOW_HEADER " Network Next Hop Metric LocPrf Weight Path%s"
5979: #define BGP_SHOW_DAMP_HEADER " Network From Reuse Path%s"
5980: #define BGP_SHOW_FLAP_HEADER " Network From Flaps Duration Reuse Path%s"
5981:
5982: enum bgp_show_type
5983: {
5984: bgp_show_type_normal,
5985: bgp_show_type_regexp,
5986: bgp_show_type_prefix_list,
5987: bgp_show_type_filter_list,
5988: bgp_show_type_route_map,
5989: bgp_show_type_neighbor,
5990: bgp_show_type_cidr_only,
5991: bgp_show_type_prefix_longer,
5992: bgp_show_type_community_all,
5993: bgp_show_type_community,
5994: bgp_show_type_community_exact,
5995: bgp_show_type_community_list,
5996: bgp_show_type_community_list_exact,
5997: bgp_show_type_flap_statistics,
5998: bgp_show_type_flap_address,
5999: bgp_show_type_flap_prefix,
6000: bgp_show_type_flap_cidr_only,
6001: bgp_show_type_flap_regexp,
6002: bgp_show_type_flap_filter_list,
6003: bgp_show_type_flap_prefix_list,
6004: bgp_show_type_flap_prefix_longer,
6005: bgp_show_type_flap_route_map,
6006: bgp_show_type_flap_neighbor,
6007: bgp_show_type_dampend_paths,
6008: bgp_show_type_damp_neighbor
6009: };
6010:
6011: static int
6012: bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
6013: enum bgp_show_type type, void *output_arg)
6014: {
6015: struct bgp_info *ri;
6016: struct bgp_node *rn;
6017: int header = 1;
6018: int display;
6019: unsigned long output_count;
6020:
6021: /* This is first entry point, so reset total line. */
6022: output_count = 0;
6023:
6024: /* Start processing of routes. */
6025: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
6026: if (rn->info != NULL)
6027: {
6028: display = 0;
6029:
6030: for (ri = rn->info; ri; ri = ri->next)
6031: {
6032: if (type == bgp_show_type_flap_statistics
6033: || type == bgp_show_type_flap_address
6034: || type == bgp_show_type_flap_prefix
6035: || type == bgp_show_type_flap_cidr_only
6036: || type == bgp_show_type_flap_regexp
6037: || type == bgp_show_type_flap_filter_list
6038: || type == bgp_show_type_flap_prefix_list
6039: || type == bgp_show_type_flap_prefix_longer
6040: || type == bgp_show_type_flap_route_map
6041: || type == bgp_show_type_flap_neighbor
6042: || type == bgp_show_type_dampend_paths
6043: || type == bgp_show_type_damp_neighbor)
6044: {
6045: if (!(ri->extra && ri->extra->damp_info))
6046: continue;
6047: }
6048: if (type == bgp_show_type_regexp
6049: || type == bgp_show_type_flap_regexp)
6050: {
6051: regex_t *regex = output_arg;
6052:
6053: if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
6054: continue;
6055: }
6056: if (type == bgp_show_type_prefix_list
6057: || type == bgp_show_type_flap_prefix_list)
6058: {
6059: struct prefix_list *plist = output_arg;
6060:
6061: if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
6062: continue;
6063: }
6064: if (type == bgp_show_type_filter_list
6065: || type == bgp_show_type_flap_filter_list)
6066: {
6067: struct as_list *as_list = output_arg;
6068:
6069: if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
6070: continue;
6071: }
6072: if (type == bgp_show_type_route_map
6073: || type == bgp_show_type_flap_route_map)
6074: {
6075: struct route_map *rmap = output_arg;
6076: struct bgp_info binfo;
6077: struct attr dummy_attr = { 0 };
6078: int ret;
6079:
6080: bgp_attr_dup (&dummy_attr, ri->attr);
6081: binfo.peer = ri->peer;
6082: binfo.attr = &dummy_attr;
6083:
6084: ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
6085:
6086: bgp_attr_extra_free (&dummy_attr);
6087:
6088: if (ret == RMAP_DENYMATCH)
6089: continue;
6090: }
6091: if (type == bgp_show_type_neighbor
6092: || type == bgp_show_type_flap_neighbor
6093: || type == bgp_show_type_damp_neighbor)
6094: {
6095: union sockunion *su = output_arg;
6096:
6097: if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
6098: continue;
6099: }
6100: if (type == bgp_show_type_cidr_only
6101: || type == bgp_show_type_flap_cidr_only)
6102: {
6103: u_int32_t destination;
6104:
6105: destination = ntohl (rn->p.u.prefix4.s_addr);
6106: if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
6107: continue;
6108: if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
6109: continue;
6110: if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
6111: continue;
6112: }
6113: if (type == bgp_show_type_prefix_longer
6114: || type == bgp_show_type_flap_prefix_longer)
6115: {
6116: struct prefix *p = output_arg;
6117:
6118: if (! prefix_match (p, &rn->p))
6119: continue;
6120: }
6121: if (type == bgp_show_type_community_all)
6122: {
6123: if (! ri->attr->community)
6124: continue;
6125: }
6126: if (type == bgp_show_type_community)
6127: {
6128: struct community *com = output_arg;
6129:
6130: if (! ri->attr->community ||
6131: ! community_match (ri->attr->community, com))
6132: continue;
6133: }
6134: if (type == bgp_show_type_community_exact)
6135: {
6136: struct community *com = output_arg;
6137:
6138: if (! ri->attr->community ||
6139: ! community_cmp (ri->attr->community, com))
6140: continue;
6141: }
6142: if (type == bgp_show_type_community_list)
6143: {
6144: struct community_list *list = output_arg;
6145:
6146: if (! community_list_match (ri->attr->community, list))
6147: continue;
6148: }
6149: if (type == bgp_show_type_community_list_exact)
6150: {
6151: struct community_list *list = output_arg;
6152:
6153: if (! community_list_exact_match (ri->attr->community, list))
6154: continue;
6155: }
6156: if (type == bgp_show_type_flap_address
6157: || type == bgp_show_type_flap_prefix)
6158: {
6159: struct prefix *p = output_arg;
6160:
6161: if (! prefix_match (&rn->p, p))
6162: continue;
6163:
6164: if (type == bgp_show_type_flap_prefix)
6165: if (p->prefixlen != rn->p.prefixlen)
6166: continue;
6167: }
6168: if (type == bgp_show_type_dampend_paths
6169: || type == bgp_show_type_damp_neighbor)
6170: {
6171: if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
6172: || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
6173: continue;
6174: }
6175:
6176: if (header)
6177: {
6178: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (*router_id), VTY_NEWLINE);
6179: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6180: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
6181: if (type == bgp_show_type_dampend_paths
6182: || type == bgp_show_type_damp_neighbor)
6183: vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
6184: else if (type == bgp_show_type_flap_statistics
6185: || type == bgp_show_type_flap_address
6186: || type == bgp_show_type_flap_prefix
6187: || type == bgp_show_type_flap_cidr_only
6188: || type == bgp_show_type_flap_regexp
6189: || type == bgp_show_type_flap_filter_list
6190: || type == bgp_show_type_flap_prefix_list
6191: || type == bgp_show_type_flap_prefix_longer
6192: || type == bgp_show_type_flap_route_map
6193: || type == bgp_show_type_flap_neighbor)
6194: vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
6195: else
6196: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
6197: header = 0;
6198: }
6199:
6200: if (type == bgp_show_type_dampend_paths
6201: || type == bgp_show_type_damp_neighbor)
6202: damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6203: else if (type == bgp_show_type_flap_statistics
6204: || type == bgp_show_type_flap_address
6205: || type == bgp_show_type_flap_prefix
6206: || type == bgp_show_type_flap_cidr_only
6207: || type == bgp_show_type_flap_regexp
6208: || type == bgp_show_type_flap_filter_list
6209: || type == bgp_show_type_flap_prefix_list
6210: || type == bgp_show_type_flap_prefix_longer
6211: || type == bgp_show_type_flap_route_map
6212: || type == bgp_show_type_flap_neighbor)
6213: flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6214: else
6215: route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
6216: display++;
6217: }
6218: if (display)
6219: output_count++;
6220: }
6221:
6222: /* No route is displayed */
6223: if (output_count == 0)
6224: {
6225: if (type == bgp_show_type_normal)
6226: vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
6227: }
6228: else
6229: vty_out (vty, "%sTotal number of prefixes %ld%s",
6230: VTY_NEWLINE, output_count, VTY_NEWLINE);
6231:
6232: return CMD_SUCCESS;
6233: }
6234:
6235: static int
6236: bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
6237: enum bgp_show_type type, void *output_arg)
6238: {
6239: struct bgp_table *table;
6240:
6241: if (bgp == NULL) {
6242: bgp = bgp_get_default ();
6243: }
6244:
6245: if (bgp == NULL)
6246: {
6247: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6248: return CMD_WARNING;
6249: }
6250:
6251:
6252: table = bgp->rib[afi][safi];
6253:
6254: return bgp_show_table (vty, table, &bgp->router_id, type, output_arg);
6255: }
6256:
6257: /* Header of detailed BGP route information */
6258: static void
6259: route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
6260: struct bgp_node *rn,
6261: struct prefix_rd *prd, afi_t afi, safi_t safi)
6262: {
6263: struct bgp_info *ri;
6264: struct prefix *p;
6265: struct peer *peer;
6266: struct listnode *node, *nnode;
6267: char buf1[INET6_ADDRSTRLEN];
6268: char buf2[INET6_ADDRSTRLEN];
6269: int count = 0;
6270: int best = 0;
6271: int suppress = 0;
6272: int no_export = 0;
6273: int no_advertise = 0;
6274: int local_as = 0;
6275: int first = 0;
6276:
6277: p = &rn->p;
6278: vty_out (vty, "BGP routing table entry for %s%s%s/%d%s",
6279: (safi == SAFI_MPLS_VPN ?
6280: prefix_rd2str (prd, buf1, RD_ADDRSTRLEN) : ""),
6281: safi == SAFI_MPLS_VPN ? ":" : "",
6282: inet_ntop (p->family, &p->u.prefix, buf2, INET6_ADDRSTRLEN),
6283: p->prefixlen, VTY_NEWLINE);
6284:
6285: for (ri = rn->info; ri; ri = ri->next)
6286: {
6287: count++;
6288: if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
6289: {
6290: best = count;
6291: if (ri->extra && ri->extra->suppress)
6292: suppress = 1;
6293: if (ri->attr->community != NULL)
6294: {
6295: if (community_include (ri->attr->community, COMMUNITY_NO_ADVERTISE))
6296: no_advertise = 1;
6297: if (community_include (ri->attr->community, COMMUNITY_NO_EXPORT))
6298: no_export = 1;
6299: if (community_include (ri->attr->community, COMMUNITY_LOCAL_AS))
6300: local_as = 1;
6301: }
6302: }
6303: }
6304:
6305: vty_out (vty, "Paths: (%d available", count);
6306: if (best)
6307: {
6308: vty_out (vty, ", best #%d", best);
6309: if (safi == SAFI_UNICAST)
6310: vty_out (vty, ", table Default-IP-Routing-Table");
6311: }
6312: else
6313: vty_out (vty, ", no best path");
6314: if (no_advertise)
6315: vty_out (vty, ", not advertised to any peer");
6316: else if (no_export)
6317: vty_out (vty, ", not advertised to EBGP peer");
6318: else if (local_as)
6319: vty_out (vty, ", not advertised outside local AS");
6320: if (suppress)
6321: vty_out (vty, ", Advertisements suppressed by an aggregate.");
6322: vty_out (vty, ")%s", VTY_NEWLINE);
6323:
6324: /* advertised peer */
6325: for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
6326: {
6327: if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
6328: {
6329: if (! first)
6330: vty_out (vty, " Advertised to non peer-group peers:%s ", VTY_NEWLINE);
6331: vty_out (vty, " %s", sockunion2str (&peer->su, buf1, SU_ADDRSTRLEN));
6332: first = 1;
6333: }
6334: }
6335: if (! first)
6336: vty_out (vty, " Not advertised to any peer");
6337: vty_out (vty, "%s", VTY_NEWLINE);
6338: }
6339:
6340: /* Display specified route of BGP table. */
6341: static int
6342: bgp_show_route_in_table (struct vty *vty, struct bgp *bgp,
6343: struct bgp_table *rib, const char *ip_str,
6344: afi_t afi, safi_t safi, struct prefix_rd *prd,
6345: int prefix_check)
6346: {
6347: int ret;
6348: int header;
6349: int display = 0;
6350: struct prefix match;
6351: struct bgp_node *rn;
6352: struct bgp_node *rm;
6353: struct bgp_info *ri;
6354: struct bgp_table *table;
6355:
6356: /* Check IP address argument. */
6357: ret = str2prefix (ip_str, &match);
6358: if (! ret)
6359: {
6360: vty_out (vty, "address is malformed%s", VTY_NEWLINE);
6361: return CMD_WARNING;
6362: }
6363:
6364: match.family = afi2family (afi);
6365:
6366: if (safi == SAFI_MPLS_VPN)
6367: {
6368: for (rn = bgp_table_top (rib); rn; rn = bgp_route_next (rn))
6369: {
6370: if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
6371: continue;
6372:
6373: if ((table = rn->info) != NULL)
6374: {
6375: header = 1;
6376:
6377: if ((rm = bgp_node_match (table, &match)) != NULL)
6378: {
6379: if (prefix_check && rm->p.prefixlen != match.prefixlen)
6380: {
6381: bgp_unlock_node (rm);
6382: continue;
6383: }
6384:
6385: for (ri = rm->info; ri; ri = ri->next)
6386: {
6387: if (header)
6388: {
6389: route_vty_out_detail_header (vty, bgp, rm, (struct prefix_rd *)&rn->p,
6390: AFI_IP, SAFI_MPLS_VPN);
6391:
6392: header = 0;
6393: }
6394: display++;
6395: route_vty_out_detail (vty, bgp, &rm->p, ri, AFI_IP, SAFI_MPLS_VPN);
6396: }
6397:
6398: bgp_unlock_node (rm);
6399: }
6400: }
6401: }
6402: }
6403: else
6404: {
6405: header = 1;
6406:
6407: if ((rn = bgp_node_match (rib, &match)) != NULL)
6408: {
6409: if (! prefix_check || rn->p.prefixlen == match.prefixlen)
6410: {
6411: for (ri = rn->info; ri; ri = ri->next)
6412: {
6413: if (header)
6414: {
6415: route_vty_out_detail_header (vty, bgp, rn, NULL, afi, safi);
6416: header = 0;
6417: }
6418: display++;
6419: route_vty_out_detail (vty, bgp, &rn->p, ri, afi, safi);
6420: }
6421: }
6422:
6423: bgp_unlock_node (rn);
6424: }
6425: }
6426:
6427: if (! display)
6428: {
6429: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
6430: return CMD_WARNING;
6431: }
6432:
6433: return CMD_SUCCESS;
6434: }
6435:
6436: /* Display specified route of Main RIB */
6437: static int
6438: bgp_show_route (struct vty *vty, const char *view_name, const char *ip_str,
6439: afi_t afi, safi_t safi, struct prefix_rd *prd,
6440: int prefix_check)
6441: {
6442: struct bgp *bgp;
6443:
6444: /* BGP structure lookup. */
6445: if (view_name)
6446: {
6447: bgp = bgp_lookup_by_name (view_name);
6448: if (bgp == NULL)
6449: {
6450: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
6451: return CMD_WARNING;
6452: }
6453: }
6454: else
6455: {
6456: bgp = bgp_get_default ();
6457: if (bgp == NULL)
6458: {
6459: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
6460: return CMD_WARNING;
6461: }
6462: }
6463:
6464: return bgp_show_route_in_table (vty, bgp, bgp->rib[afi][safi], ip_str,
6465: afi, safi, prd, prefix_check);
6466: }
6467:
6468: /* BGP route print out function. */
6469: DEFUN (show_ip_bgp,
6470: show_ip_bgp_cmd,
6471: "show ip bgp",
6472: SHOW_STR
6473: IP_STR
6474: BGP_STR)
6475: {
6476: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6477: }
6478:
6479: DEFUN (show_ip_bgp_ipv4,
6480: show_ip_bgp_ipv4_cmd,
6481: "show ip bgp ipv4 (unicast|multicast)",
6482: SHOW_STR
6483: IP_STR
6484: BGP_STR
6485: "Address family\n"
6486: "Address Family modifier\n"
6487: "Address Family modifier\n")
6488: {
6489: if (strncmp (argv[0], "m", 1) == 0)
6490: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST, bgp_show_type_normal,
6491: NULL);
6492:
6493: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6494: }
6495:
6496: ALIAS (show_ip_bgp_ipv4,
6497: show_bgp_ipv4_safi_cmd,
6498: "show bgp ipv4 (unicast|multicast)",
6499: SHOW_STR
6500: BGP_STR
6501: "Address family\n"
6502: "Address Family modifier\n"
6503: "Address Family modifier\n")
6504:
6505: DEFUN (show_ip_bgp_route,
6506: show_ip_bgp_route_cmd,
6507: "show ip bgp A.B.C.D",
6508: SHOW_STR
6509: IP_STR
6510: BGP_STR
6511: "Network in the BGP routing table to display\n")
6512: {
6513: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 0);
6514: }
6515:
6516: DEFUN (show_ip_bgp_ipv4_route,
6517: show_ip_bgp_ipv4_route_cmd,
6518: "show ip bgp ipv4 (unicast|multicast) A.B.C.D",
6519: SHOW_STR
6520: IP_STR
6521: BGP_STR
6522: "Address family\n"
6523: "Address Family modifier\n"
6524: "Address Family modifier\n"
6525: "Network in the BGP routing table to display\n")
6526: {
6527: if (strncmp (argv[0], "m", 1) == 0)
6528: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 0);
6529:
6530: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6531: }
6532:
6533: ALIAS (show_ip_bgp_ipv4_route,
6534: show_bgp_ipv4_safi_route_cmd,
6535: "show bgp ipv4 (unicast|multicast) A.B.C.D",
6536: SHOW_STR
6537: BGP_STR
6538: "Address family\n"
6539: "Address Family modifier\n"
6540: "Address Family modifier\n"
6541: "Network in the BGP routing table to display\n")
6542:
6543: DEFUN (show_ip_bgp_vpnv4_all_route,
6544: show_ip_bgp_vpnv4_all_route_cmd,
6545: "show ip bgp vpnv4 all A.B.C.D",
6546: SHOW_STR
6547: IP_STR
6548: BGP_STR
6549: "Display VPNv4 NLRI specific information\n"
6550: "Display information about all VPNv4 NLRIs\n"
6551: "Network in the BGP routing table to display\n")
6552: {
6553: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 0);
6554: }
6555:
6556: DEFUN (show_ip_bgp_vpnv4_rd_route,
6557: show_ip_bgp_vpnv4_rd_route_cmd,
6558: "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D",
6559: SHOW_STR
6560: IP_STR
6561: BGP_STR
6562: "Display VPNv4 NLRI specific information\n"
6563: "Display information for a route distinguisher\n"
6564: "VPN Route Distinguisher\n"
6565: "Network in the BGP routing table to display\n")
6566: {
6567: int ret;
6568: struct prefix_rd prd;
6569:
6570: ret = str2prefix_rd (argv[0], &prd);
6571: if (! ret)
6572: {
6573: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6574: return CMD_WARNING;
6575: }
6576: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 0);
6577: }
6578:
6579: DEFUN (show_ip_bgp_prefix,
6580: show_ip_bgp_prefix_cmd,
6581: "show ip bgp A.B.C.D/M",
6582: SHOW_STR
6583: IP_STR
6584: BGP_STR
6585: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6586: {
6587: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
6588: }
6589:
6590: DEFUN (show_ip_bgp_ipv4_prefix,
6591: show_ip_bgp_ipv4_prefix_cmd,
6592: "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M",
6593: SHOW_STR
6594: IP_STR
6595: BGP_STR
6596: "Address family\n"
6597: "Address Family modifier\n"
6598: "Address Family modifier\n"
6599: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6600: {
6601: if (strncmp (argv[0], "m", 1) == 0)
6602: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MULTICAST, NULL, 1);
6603:
6604: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6605: }
6606:
6607: ALIAS (show_ip_bgp_ipv4_prefix,
6608: show_bgp_ipv4_safi_prefix_cmd,
6609: "show bgp ipv4 (unicast|multicast) A.B.C.D/M",
6610: SHOW_STR
6611: BGP_STR
6612: "Address family\n"
6613: "Address Family modifier\n"
6614: "Address Family modifier\n"
6615: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6616:
6617: DEFUN (show_ip_bgp_vpnv4_all_prefix,
6618: show_ip_bgp_vpnv4_all_prefix_cmd,
6619: "show ip bgp vpnv4 all A.B.C.D/M",
6620: SHOW_STR
6621: IP_STR
6622: BGP_STR
6623: "Display VPNv4 NLRI specific information\n"
6624: "Display information about all VPNv4 NLRIs\n"
6625: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6626: {
6627: return bgp_show_route (vty, NULL, argv[0], AFI_IP, SAFI_MPLS_VPN, NULL, 1);
6628: }
6629:
6630: DEFUN (show_ip_bgp_vpnv4_rd_prefix,
6631: show_ip_bgp_vpnv4_rd_prefix_cmd,
6632: "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn A.B.C.D/M",
6633: SHOW_STR
6634: IP_STR
6635: BGP_STR
6636: "Display VPNv4 NLRI specific information\n"
6637: "Display information for a route distinguisher\n"
6638: "VPN Route Distinguisher\n"
6639: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6640: {
6641: int ret;
6642: struct prefix_rd prd;
6643:
6644: ret = str2prefix_rd (argv[0], &prd);
6645: if (! ret)
6646: {
6647: vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
6648: return CMD_WARNING;
6649: }
6650: return bgp_show_route (vty, NULL, argv[1], AFI_IP, SAFI_MPLS_VPN, &prd, 1);
6651: }
6652:
6653: DEFUN (show_ip_bgp_view,
6654: show_ip_bgp_view_cmd,
6655: "show ip bgp view WORD",
6656: SHOW_STR
6657: IP_STR
6658: BGP_STR
6659: "BGP view\n"
6660: "BGP view name\n")
6661: {
6662: struct bgp *bgp;
6663:
6664: /* BGP structure lookup. */
6665: bgp = bgp_lookup_by_name (argv[0]);
6666: if (bgp == NULL)
6667: {
6668: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6669: return CMD_WARNING;
6670: }
6671:
6672: return bgp_show (vty, bgp, AFI_IP, SAFI_UNICAST, bgp_show_type_normal, NULL);
6673: }
6674:
6675: DEFUN (show_ip_bgp_view_route,
6676: show_ip_bgp_view_route_cmd,
6677: "show ip bgp view WORD A.B.C.D",
6678: SHOW_STR
6679: IP_STR
6680: BGP_STR
6681: "BGP view\n"
6682: "BGP view name\n"
6683: "Network in the BGP routing table to display\n")
6684: {
6685: return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0);
6686: }
6687:
6688: DEFUN (show_ip_bgp_view_prefix,
6689: show_ip_bgp_view_prefix_cmd,
6690: "show ip bgp view WORD A.B.C.D/M",
6691: SHOW_STR
6692: IP_STR
6693: BGP_STR
6694: "BGP view\n"
6695: "BGP view name\n"
6696: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
6697: {
6698: return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1);
6699: }
6700:
6701: #ifdef HAVE_IPV6
6702: DEFUN (show_bgp,
6703: show_bgp_cmd,
6704: "show bgp",
6705: SHOW_STR
6706: BGP_STR)
6707: {
6708: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6709: NULL);
6710: }
6711:
6712: ALIAS (show_bgp,
6713: show_bgp_ipv6_cmd,
6714: "show bgp ipv6",
6715: SHOW_STR
6716: BGP_STR
6717: "Address family\n")
6718:
6719: DEFUN (show_bgp_ipv6_safi,
6720: show_bgp_ipv6_safi_cmd,
6721: "show bgp ipv6 (unicast|multicast)",
6722: SHOW_STR
6723: BGP_STR
6724: "Address family\n"
6725: "Address Family modifier\n"
6726: "Address Family modifier\n")
6727: {
6728: if (strncmp (argv[0], "m", 1) == 0)
6729: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6730: NULL);
6731:
6732: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6733: }
6734:
6735: /* old command */
6736: DEFUN (show_ipv6_bgp,
6737: show_ipv6_bgp_cmd,
6738: "show ipv6 bgp",
6739: SHOW_STR
6740: IP_STR
6741: BGP_STR)
6742: {
6743: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal,
6744: NULL);
6745: }
6746:
6747: DEFUN (show_bgp_route,
6748: show_bgp_route_cmd,
6749: "show bgp X:X::X:X",
6750: SHOW_STR
6751: BGP_STR
6752: "Network in the BGP routing table to display\n")
6753: {
6754: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6755: }
6756:
6757: ALIAS (show_bgp_route,
6758: show_bgp_ipv6_route_cmd,
6759: "show bgp ipv6 X:X::X:X",
6760: SHOW_STR
6761: BGP_STR
6762: "Address family\n"
6763: "Network in the BGP routing table to display\n")
6764:
6765: DEFUN (show_bgp_ipv6_safi_route,
6766: show_bgp_ipv6_safi_route_cmd,
6767: "show bgp ipv6 (unicast|multicast) X:X::X:X",
6768: SHOW_STR
6769: BGP_STR
6770: "Address family\n"
6771: "Address Family modifier\n"
6772: "Address Family modifier\n"
6773: "Network in the BGP routing table to display\n")
6774: {
6775: if (strncmp (argv[0], "m", 1) == 0)
6776: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6777:
6778: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6779: }
6780:
6781: /* old command */
6782: DEFUN (show_ipv6_bgp_route,
6783: show_ipv6_bgp_route_cmd,
6784: "show ipv6 bgp X:X::X:X",
6785: SHOW_STR
6786: IP_STR
6787: BGP_STR
6788: "Network in the BGP routing table to display\n")
6789: {
6790: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
6791: }
6792:
6793: DEFUN (show_bgp_prefix,
6794: show_bgp_prefix_cmd,
6795: "show bgp X:X::X:X/M",
6796: SHOW_STR
6797: BGP_STR
6798: "IPv6 prefix <network>/<length>\n")
6799: {
6800: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6801: }
6802:
6803: ALIAS (show_bgp_prefix,
6804: show_bgp_ipv6_prefix_cmd,
6805: "show bgp ipv6 X:X::X:X/M",
6806: SHOW_STR
6807: BGP_STR
6808: "Address family\n"
6809: "IPv6 prefix <network>/<length>\n")
6810:
6811: DEFUN (show_bgp_ipv6_safi_prefix,
6812: show_bgp_ipv6_safi_prefix_cmd,
6813: "show bgp ipv6 (unicast|multicast) X:X::X:X/M",
6814: SHOW_STR
6815: BGP_STR
6816: "Address family\n"
6817: "Address Family modifier\n"
6818: "Address Family modifier\n"
6819: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6820: {
6821: if (strncmp (argv[0], "m", 1) == 0)
6822: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6823:
6824: return bgp_show_route (vty, NULL, argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6825: }
6826:
6827: /* old command */
6828: DEFUN (show_ipv6_bgp_prefix,
6829: show_ipv6_bgp_prefix_cmd,
6830: "show ipv6 bgp X:X::X:X/M",
6831: SHOW_STR
6832: IP_STR
6833: BGP_STR
6834: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6835: {
6836: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 1);
6837: }
6838:
6839: DEFUN (show_bgp_view,
6840: show_bgp_view_cmd,
6841: "show bgp view WORD",
6842: SHOW_STR
6843: BGP_STR
6844: "BGP view\n"
6845: "View name\n")
6846: {
6847: struct bgp *bgp;
6848:
6849: /* BGP structure lookup. */
6850: bgp = bgp_lookup_by_name (argv[0]);
6851: if (bgp == NULL)
6852: {
6853: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
6854: return CMD_WARNING;
6855: }
6856:
6857: return bgp_show (vty, bgp, AFI_IP6, SAFI_UNICAST, bgp_show_type_normal, NULL);
6858: }
6859:
6860: ALIAS (show_bgp_view,
6861: show_bgp_view_ipv6_cmd,
6862: "show bgp view WORD ipv6",
6863: SHOW_STR
6864: BGP_STR
6865: "BGP view\n"
6866: "View name\n"
6867: "Address family\n")
6868:
6869: DEFUN (show_bgp_view_route,
6870: show_bgp_view_route_cmd,
6871: "show bgp view WORD X:X::X:X",
6872: SHOW_STR
6873: BGP_STR
6874: "BGP view\n"
6875: "View name\n"
6876: "Network in the BGP routing table to display\n")
6877: {
6878: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0);
6879: }
6880:
6881: ALIAS (show_bgp_view_route,
6882: show_bgp_view_ipv6_route_cmd,
6883: "show bgp view WORD ipv6 X:X::X:X",
6884: SHOW_STR
6885: BGP_STR
6886: "BGP view\n"
6887: "View name\n"
6888: "Address family\n"
6889: "Network in the BGP routing table to display\n")
6890:
6891: DEFUN (show_bgp_view_prefix,
6892: show_bgp_view_prefix_cmd,
6893: "show bgp view WORD X:X::X:X/M",
6894: SHOW_STR
6895: BGP_STR
6896: "BGP view\n"
6897: "View name\n"
6898: "IPv6 prefix <network>/<length>\n")
6899: {
6900: return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1);
6901: }
6902:
6903: ALIAS (show_bgp_view_prefix,
6904: show_bgp_view_ipv6_prefix_cmd,
6905: "show bgp view WORD ipv6 X:X::X:X/M",
6906: SHOW_STR
6907: BGP_STR
6908: "BGP view\n"
6909: "View name\n"
6910: "Address family\n"
6911: "IPv6 prefix <network>/<length>\n")
6912:
6913: /* old command */
6914: DEFUN (show_ipv6_mbgp,
6915: show_ipv6_mbgp_cmd,
6916: "show ipv6 mbgp",
6917: SHOW_STR
6918: IP_STR
6919: MBGP_STR)
6920: {
6921: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST, bgp_show_type_normal,
6922: NULL);
6923: }
6924:
6925: /* old command */
6926: DEFUN (show_ipv6_mbgp_route,
6927: show_ipv6_mbgp_route_cmd,
6928: "show ipv6 mbgp X:X::X:X",
6929: SHOW_STR
6930: IP_STR
6931: MBGP_STR
6932: "Network in the MBGP routing table to display\n")
6933: {
6934: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 0);
6935: }
6936:
6937: /* old command */
6938: DEFUN (show_ipv6_mbgp_prefix,
6939: show_ipv6_mbgp_prefix_cmd,
6940: "show ipv6 mbgp X:X::X:X/M",
6941: SHOW_STR
6942: IP_STR
6943: MBGP_STR
6944: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
6945: {
6946: return bgp_show_route (vty, NULL, argv[0], AFI_IP6, SAFI_MULTICAST, NULL, 1);
6947: }
6948: #endif
6949:
6950:
6951: static int
6952: bgp_show_regexp (struct vty *vty, int argc, const char **argv, afi_t afi,
6953: safi_t safi, enum bgp_show_type type)
6954: {
6955: int i;
6956: struct buffer *b;
6957: char *regstr;
6958: int first;
6959: regex_t *regex;
6960: int rc;
6961:
6962: first = 0;
6963: b = buffer_new (1024);
6964: for (i = 0; i < argc; i++)
6965: {
6966: if (first)
6967: buffer_putc (b, ' ');
6968: else
6969: {
6970: if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
6971: continue;
6972: first = 1;
6973: }
6974:
6975: buffer_putstr (b, argv[i]);
6976: }
6977: buffer_putc (b, '\0');
6978:
6979: regstr = buffer_getstr (b);
6980: buffer_free (b);
6981:
6982: regex = bgp_regcomp (regstr);
6983: XFREE(MTYPE_TMP, regstr);
6984: if (! regex)
6985: {
6986: vty_out (vty, "Can't compile regexp %s%s", argv[0],
6987: VTY_NEWLINE);
6988: return CMD_WARNING;
6989: }
6990:
6991: rc = bgp_show (vty, NULL, afi, safi, type, regex);
6992: bgp_regex_free (regex);
6993: return rc;
6994: }
6995:
6996: DEFUN (show_ip_bgp_regexp,
6997: show_ip_bgp_regexp_cmd,
6998: "show ip bgp regexp .LINE",
6999: SHOW_STR
7000: IP_STR
7001: BGP_STR
7002: "Display routes matching the AS path regular expression\n"
7003: "A regular-expression to match the BGP AS paths\n")
7004: {
7005: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7006: bgp_show_type_regexp);
7007: }
7008:
7009: DEFUN (show_ip_bgp_flap_regexp,
7010: show_ip_bgp_flap_regexp_cmd,
7011: "show ip bgp flap-statistics regexp .LINE",
7012: SHOW_STR
7013: IP_STR
7014: BGP_STR
7015: "Display flap statistics of routes\n"
7016: "Display routes matching the AS path regular expression\n"
7017: "A regular-expression to match the BGP AS paths\n")
7018: {
7019: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7020: bgp_show_type_flap_regexp);
7021: }
7022:
7023: DEFUN (show_ip_bgp_ipv4_regexp,
7024: show_ip_bgp_ipv4_regexp_cmd,
7025: "show ip bgp ipv4 (unicast|multicast) regexp .LINE",
7026: SHOW_STR
7027: IP_STR
7028: BGP_STR
7029: "Address family\n"
7030: "Address Family modifier\n"
7031: "Address Family modifier\n"
7032: "Display routes matching the AS path regular expression\n"
7033: "A regular-expression to match the BGP AS paths\n")
7034: {
7035: if (strncmp (argv[0], "m", 1) == 0)
7036: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_MULTICAST,
7037: bgp_show_type_regexp);
7038:
7039: return bgp_show_regexp (vty, argc, argv, AFI_IP, SAFI_UNICAST,
7040: bgp_show_type_regexp);
7041: }
7042:
7043: #ifdef HAVE_IPV6
7044: DEFUN (show_bgp_regexp,
7045: show_bgp_regexp_cmd,
7046: "show bgp regexp .LINE",
7047: SHOW_STR
7048: BGP_STR
7049: "Display routes matching the AS path regular expression\n"
7050: "A regular-expression to match the BGP AS paths\n")
7051: {
7052: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7053: bgp_show_type_regexp);
7054: }
7055:
7056: ALIAS (show_bgp_regexp,
7057: show_bgp_ipv6_regexp_cmd,
7058: "show bgp ipv6 regexp .LINE",
7059: SHOW_STR
7060: BGP_STR
7061: "Address family\n"
7062: "Display routes matching the AS path regular expression\n"
7063: "A regular-expression to match the BGP AS paths\n")
7064:
7065: /* old command */
7066: DEFUN (show_ipv6_bgp_regexp,
7067: show_ipv6_bgp_regexp_cmd,
7068: "show ipv6 bgp regexp .LINE",
7069: SHOW_STR
7070: IP_STR
7071: BGP_STR
7072: "Display routes matching the AS path regular expression\n"
7073: "A regular-expression to match the BGP AS paths\n")
7074: {
7075: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_UNICAST,
7076: bgp_show_type_regexp);
7077: }
7078:
7079: /* old command */
7080: DEFUN (show_ipv6_mbgp_regexp,
7081: show_ipv6_mbgp_regexp_cmd,
7082: "show ipv6 mbgp regexp .LINE",
7083: SHOW_STR
7084: IP_STR
7085: BGP_STR
7086: "Display routes matching the AS path regular expression\n"
7087: "A regular-expression to match the MBGP AS paths\n")
7088: {
7089: return bgp_show_regexp (vty, argc, argv, AFI_IP6, SAFI_MULTICAST,
7090: bgp_show_type_regexp);
7091: }
7092: #endif /* HAVE_IPV6 */
7093:
7094: static int
7095: bgp_show_prefix_list (struct vty *vty, const char *prefix_list_str, afi_t afi,
7096: safi_t safi, enum bgp_show_type type)
7097: {
7098: struct prefix_list *plist;
7099:
7100: plist = prefix_list_lookup (afi, prefix_list_str);
7101: if (plist == NULL)
7102: {
7103: vty_out (vty, "%% %s is not a valid prefix-list name%s",
7104: prefix_list_str, VTY_NEWLINE);
7105: return CMD_WARNING;
7106: }
7107:
7108: return bgp_show (vty, NULL, afi, safi, type, plist);
7109: }
7110:
7111: DEFUN (show_ip_bgp_prefix_list,
7112: show_ip_bgp_prefix_list_cmd,
7113: "show ip bgp prefix-list WORD",
7114: SHOW_STR
7115: IP_STR
7116: BGP_STR
7117: "Display routes conforming to the prefix-list\n"
7118: "IP prefix-list name\n")
7119: {
7120: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7121: bgp_show_type_prefix_list);
7122: }
7123:
7124: DEFUN (show_ip_bgp_flap_prefix_list,
7125: show_ip_bgp_flap_prefix_list_cmd,
7126: "show ip bgp flap-statistics prefix-list WORD",
7127: SHOW_STR
7128: IP_STR
7129: BGP_STR
7130: "Display flap statistics of routes\n"
7131: "Display routes conforming to the prefix-list\n"
7132: "IP prefix-list name\n")
7133: {
7134: return bgp_show_prefix_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7135: bgp_show_type_flap_prefix_list);
7136: }
7137:
7138: DEFUN (show_ip_bgp_ipv4_prefix_list,
7139: show_ip_bgp_ipv4_prefix_list_cmd,
7140: "show ip bgp ipv4 (unicast|multicast) prefix-list WORD",
7141: SHOW_STR
7142: IP_STR
7143: BGP_STR
7144: "Address family\n"
7145: "Address Family modifier\n"
7146: "Address Family modifier\n"
7147: "Display routes conforming to the prefix-list\n"
7148: "IP prefix-list name\n")
7149: {
7150: if (strncmp (argv[0], "m", 1) == 0)
7151: return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7152: bgp_show_type_prefix_list);
7153:
7154: return bgp_show_prefix_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7155: bgp_show_type_prefix_list);
7156: }
7157:
7158: #ifdef HAVE_IPV6
7159: DEFUN (show_bgp_prefix_list,
7160: show_bgp_prefix_list_cmd,
7161: "show bgp prefix-list WORD",
7162: SHOW_STR
7163: BGP_STR
7164: "Display routes conforming to the prefix-list\n"
7165: "IPv6 prefix-list name\n")
7166: {
7167: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7168: bgp_show_type_prefix_list);
7169: }
7170:
7171: ALIAS (show_bgp_prefix_list,
7172: show_bgp_ipv6_prefix_list_cmd,
7173: "show bgp ipv6 prefix-list WORD",
7174: SHOW_STR
7175: BGP_STR
7176: "Address family\n"
7177: "Display routes conforming to the prefix-list\n"
7178: "IPv6 prefix-list name\n")
7179:
7180: /* old command */
7181: DEFUN (show_ipv6_bgp_prefix_list,
7182: show_ipv6_bgp_prefix_list_cmd,
7183: "show ipv6 bgp prefix-list WORD",
7184: SHOW_STR
7185: IPV6_STR
7186: BGP_STR
7187: "Display routes matching the prefix-list\n"
7188: "IPv6 prefix-list name\n")
7189: {
7190: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7191: bgp_show_type_prefix_list);
7192: }
7193:
7194: /* old command */
7195: DEFUN (show_ipv6_mbgp_prefix_list,
7196: show_ipv6_mbgp_prefix_list_cmd,
7197: "show ipv6 mbgp prefix-list WORD",
7198: SHOW_STR
7199: IPV6_STR
7200: MBGP_STR
7201: "Display routes matching the prefix-list\n"
7202: "IPv6 prefix-list name\n")
7203: {
7204: return bgp_show_prefix_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7205: bgp_show_type_prefix_list);
7206: }
7207: #endif /* HAVE_IPV6 */
7208:
7209: static int
7210: bgp_show_filter_list (struct vty *vty, const char *filter, afi_t afi,
7211: safi_t safi, enum bgp_show_type type)
7212: {
7213: struct as_list *as_list;
7214:
7215: as_list = as_list_lookup (filter);
7216: if (as_list == NULL)
7217: {
7218: vty_out (vty, "%% %s is not a valid AS-path access-list name%s", filter, VTY_NEWLINE);
7219: return CMD_WARNING;
7220: }
7221:
7222: return bgp_show (vty, NULL, afi, safi, type, as_list);
7223: }
7224:
7225: DEFUN (show_ip_bgp_filter_list,
7226: show_ip_bgp_filter_list_cmd,
7227: "show ip bgp filter-list WORD",
7228: SHOW_STR
7229: IP_STR
7230: BGP_STR
7231: "Display routes conforming to the filter-list\n"
7232: "Regular expression access list name\n")
7233: {
7234: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7235: bgp_show_type_filter_list);
7236: }
7237:
7238: DEFUN (show_ip_bgp_flap_filter_list,
7239: show_ip_bgp_flap_filter_list_cmd,
7240: "show ip bgp flap-statistics filter-list WORD",
7241: SHOW_STR
7242: IP_STR
7243: BGP_STR
7244: "Display flap statistics of routes\n"
7245: "Display routes conforming to the filter-list\n"
7246: "Regular expression access list name\n")
7247: {
7248: return bgp_show_filter_list (vty, argv[0], AFI_IP, SAFI_UNICAST,
7249: bgp_show_type_flap_filter_list);
7250: }
7251:
7252: DEFUN (show_ip_bgp_ipv4_filter_list,
7253: show_ip_bgp_ipv4_filter_list_cmd,
7254: "show ip bgp ipv4 (unicast|multicast) filter-list WORD",
7255: SHOW_STR
7256: IP_STR
7257: BGP_STR
7258: "Address family\n"
7259: "Address Family modifier\n"
7260: "Address Family modifier\n"
7261: "Display routes conforming to the filter-list\n"
7262: "Regular expression access list name\n")
7263: {
7264: if (strncmp (argv[0], "m", 1) == 0)
7265: return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7266: bgp_show_type_filter_list);
7267:
7268: return bgp_show_filter_list (vty, argv[1], AFI_IP, SAFI_UNICAST,
7269: bgp_show_type_filter_list);
7270: }
7271:
7272: #ifdef HAVE_IPV6
7273: DEFUN (show_bgp_filter_list,
7274: show_bgp_filter_list_cmd,
7275: "show bgp filter-list WORD",
7276: SHOW_STR
7277: BGP_STR
7278: "Display routes conforming to the filter-list\n"
7279: "Regular expression access list name\n")
7280: {
7281: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7282: bgp_show_type_filter_list);
7283: }
7284:
7285: ALIAS (show_bgp_filter_list,
7286: show_bgp_ipv6_filter_list_cmd,
7287: "show bgp ipv6 filter-list WORD",
7288: SHOW_STR
7289: BGP_STR
7290: "Address family\n"
7291: "Display routes conforming to the filter-list\n"
7292: "Regular expression access list name\n")
7293:
7294: /* old command */
7295: DEFUN (show_ipv6_bgp_filter_list,
7296: show_ipv6_bgp_filter_list_cmd,
7297: "show ipv6 bgp filter-list WORD",
7298: SHOW_STR
7299: IPV6_STR
7300: BGP_STR
7301: "Display routes conforming to the filter-list\n"
7302: "Regular expression access list name\n")
7303: {
7304: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7305: bgp_show_type_filter_list);
7306: }
7307:
7308: /* old command */
7309: DEFUN (show_ipv6_mbgp_filter_list,
7310: show_ipv6_mbgp_filter_list_cmd,
7311: "show ipv6 mbgp filter-list WORD",
7312: SHOW_STR
7313: IPV6_STR
7314: MBGP_STR
7315: "Display routes conforming to the filter-list\n"
7316: "Regular expression access list name\n")
7317: {
7318: return bgp_show_filter_list (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
7319: bgp_show_type_filter_list);
7320: }
7321: #endif /* HAVE_IPV6 */
7322:
7323: static int
7324: bgp_show_route_map (struct vty *vty, const char *rmap_str, afi_t afi,
7325: safi_t safi, enum bgp_show_type type)
7326: {
7327: struct route_map *rmap;
7328:
7329: rmap = route_map_lookup_by_name (rmap_str);
7330: if (! rmap)
7331: {
7332: vty_out (vty, "%% %s is not a valid route-map name%s",
7333: rmap_str, VTY_NEWLINE);
7334: return CMD_WARNING;
7335: }
7336:
7337: return bgp_show (vty, NULL, afi, safi, type, rmap);
7338: }
7339:
7340: DEFUN (show_ip_bgp_route_map,
7341: show_ip_bgp_route_map_cmd,
7342: "show ip bgp route-map WORD",
7343: SHOW_STR
7344: IP_STR
7345: BGP_STR
7346: "Display routes matching the route-map\n"
7347: "A route-map to match on\n")
7348: {
7349: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7350: bgp_show_type_route_map);
7351: }
7352:
7353: DEFUN (show_ip_bgp_flap_route_map,
7354: show_ip_bgp_flap_route_map_cmd,
7355: "show ip bgp flap-statistics route-map WORD",
7356: SHOW_STR
7357: IP_STR
7358: BGP_STR
7359: "Display flap statistics of routes\n"
7360: "Display routes matching the route-map\n"
7361: "A route-map to match on\n")
7362: {
7363: return bgp_show_route_map (vty, argv[0], AFI_IP, SAFI_UNICAST,
7364: bgp_show_type_flap_route_map);
7365: }
7366:
7367: DEFUN (show_ip_bgp_ipv4_route_map,
7368: show_ip_bgp_ipv4_route_map_cmd,
7369: "show ip bgp ipv4 (unicast|multicast) route-map WORD",
7370: SHOW_STR
7371: IP_STR
7372: BGP_STR
7373: "Address family\n"
7374: "Address Family modifier\n"
7375: "Address Family modifier\n"
7376: "Display routes matching the route-map\n"
7377: "A route-map to match on\n")
7378: {
7379: if (strncmp (argv[0], "m", 1) == 0)
7380: return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_MULTICAST,
7381: bgp_show_type_route_map);
7382:
7383: return bgp_show_route_map (vty, argv[1], AFI_IP, SAFI_UNICAST,
7384: bgp_show_type_route_map);
7385: }
7386:
7387: DEFUN (show_bgp_route_map,
7388: show_bgp_route_map_cmd,
7389: "show bgp route-map WORD",
7390: SHOW_STR
7391: BGP_STR
7392: "Display routes matching the route-map\n"
7393: "A route-map to match on\n")
7394: {
7395: return bgp_show_route_map (vty, argv[0], AFI_IP6, SAFI_UNICAST,
7396: bgp_show_type_route_map);
7397: }
7398:
7399: ALIAS (show_bgp_route_map,
7400: show_bgp_ipv6_route_map_cmd,
7401: "show bgp ipv6 route-map WORD",
7402: SHOW_STR
7403: BGP_STR
7404: "Address family\n"
7405: "Display routes matching the route-map\n"
7406: "A route-map to match on\n")
7407:
7408: DEFUN (show_ip_bgp_cidr_only,
7409: show_ip_bgp_cidr_only_cmd,
7410: "show ip bgp cidr-only",
7411: SHOW_STR
7412: IP_STR
7413: BGP_STR
7414: "Display only routes with non-natural netmasks\n")
7415: {
7416: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7417: bgp_show_type_cidr_only, NULL);
7418: }
7419:
7420: DEFUN (show_ip_bgp_flap_cidr_only,
7421: show_ip_bgp_flap_cidr_only_cmd,
7422: "show ip bgp flap-statistics cidr-only",
7423: SHOW_STR
7424: IP_STR
7425: BGP_STR
7426: "Display flap statistics of routes\n"
7427: "Display only routes with non-natural netmasks\n")
7428: {
7429: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7430: bgp_show_type_flap_cidr_only, NULL);
7431: }
7432:
7433: DEFUN (show_ip_bgp_ipv4_cidr_only,
7434: show_ip_bgp_ipv4_cidr_only_cmd,
7435: "show ip bgp ipv4 (unicast|multicast) cidr-only",
7436: SHOW_STR
7437: IP_STR
7438: BGP_STR
7439: "Address family\n"
7440: "Address Family modifier\n"
7441: "Address Family modifier\n"
7442: "Display only routes with non-natural netmasks\n")
7443: {
7444: if (strncmp (argv[0], "m", 1) == 0)
7445: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
7446: bgp_show_type_cidr_only, NULL);
7447:
7448: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7449: bgp_show_type_cidr_only, NULL);
7450: }
7451:
7452: DEFUN (show_ip_bgp_community_all,
7453: show_ip_bgp_community_all_cmd,
7454: "show ip bgp community",
7455: SHOW_STR
7456: IP_STR
7457: BGP_STR
7458: "Display routes matching the communities\n")
7459: {
7460: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7461: bgp_show_type_community_all, NULL);
7462: }
7463:
7464: DEFUN (show_ip_bgp_ipv4_community_all,
7465: show_ip_bgp_ipv4_community_all_cmd,
7466: "show ip bgp ipv4 (unicast|multicast) community",
7467: SHOW_STR
7468: IP_STR
7469: BGP_STR
7470: "Address family\n"
7471: "Address Family modifier\n"
7472: "Address Family modifier\n"
7473: "Display routes matching the communities\n")
7474: {
7475: if (strncmp (argv[0], "m", 1) == 0)
7476: return bgp_show (vty, NULL, AFI_IP, SAFI_MULTICAST,
7477: bgp_show_type_community_all, NULL);
7478:
7479: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
7480: bgp_show_type_community_all, NULL);
7481: }
7482:
7483: #ifdef HAVE_IPV6
7484: DEFUN (show_bgp_community_all,
7485: show_bgp_community_all_cmd,
7486: "show bgp community",
7487: SHOW_STR
7488: BGP_STR
7489: "Display routes matching the communities\n")
7490: {
7491: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
7492: bgp_show_type_community_all, NULL);
7493: }
7494:
7495: ALIAS (show_bgp_community_all,
7496: show_bgp_ipv6_community_all_cmd,
7497: "show bgp ipv6 community",
7498: SHOW_STR
7499: BGP_STR
7500: "Address family\n"
7501: "Display routes matching the communities\n")
7502:
7503: /* old command */
7504: DEFUN (show_ipv6_bgp_community_all,
7505: show_ipv6_bgp_community_all_cmd,
7506: "show ipv6 bgp community",
7507: SHOW_STR
7508: IPV6_STR
7509: BGP_STR
7510: "Display routes matching the communities\n")
7511: {
7512: return bgp_show (vty, NULL, AFI_IP6, SAFI_UNICAST,
7513: bgp_show_type_community_all, NULL);
7514: }
7515:
7516: /* old command */
7517: DEFUN (show_ipv6_mbgp_community_all,
7518: show_ipv6_mbgp_community_all_cmd,
7519: "show ipv6 mbgp community",
7520: SHOW_STR
7521: IPV6_STR
7522: MBGP_STR
7523: "Display routes matching the communities\n")
7524: {
7525: return bgp_show (vty, NULL, AFI_IP6, SAFI_MULTICAST,
7526: bgp_show_type_community_all, NULL);
7527: }
7528: #endif /* HAVE_IPV6 */
7529:
7530: static int
7531: bgp_show_community (struct vty *vty, const char *view_name, int argc,
7532: const char **argv, int exact, afi_t afi, safi_t safi)
7533: {
7534: struct community *com;
7535: struct buffer *b;
7536: struct bgp *bgp;
7537: int i;
7538: char *str;
7539: int first = 0;
7540:
7541: /* BGP structure lookup */
7542: if (view_name)
7543: {
7544: bgp = bgp_lookup_by_name (view_name);
7545: if (bgp == NULL)
7546: {
7547: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
7548: return CMD_WARNING;
7549: }
7550: }
7551: else
7552: {
7553: bgp = bgp_get_default ();
7554: if (bgp == NULL)
7555: {
7556: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
7557: return CMD_WARNING;
7558: }
7559: }
7560:
7561: b = buffer_new (1024);
7562: for (i = 0; i < argc; i++)
7563: {
7564: if (first)
7565: buffer_putc (b, ' ');
7566: else
7567: {
7568: if ((strcmp (argv[i], "unicast") == 0) || (strcmp (argv[i], "multicast") == 0))
7569: continue;
7570: first = 1;
7571: }
7572:
7573: buffer_putstr (b, argv[i]);
7574: }
7575: buffer_putc (b, '\0');
7576:
7577: str = buffer_getstr (b);
7578: buffer_free (b);
7579:
7580: com = community_str2com (str);
7581: XFREE (MTYPE_TMP, str);
7582: if (! com)
7583: {
7584: vty_out (vty, "%% Community malformed: %s", VTY_NEWLINE);
7585: return CMD_WARNING;
7586: }
7587:
7588: return bgp_show (vty, bgp, afi, safi,
7589: (exact ? bgp_show_type_community_exact :
7590: bgp_show_type_community), com);
7591: }
7592:
7593: DEFUN (show_ip_bgp_community,
7594: show_ip_bgp_community_cmd,
7595: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export)",
7596: SHOW_STR
7597: IP_STR
7598: BGP_STR
7599: "Display routes matching the communities\n"
7600: "community number\n"
7601: "Do not send outside local AS (well-known community)\n"
7602: "Do not advertise to any peer (well-known community)\n"
7603: "Do not export to next AS (well-known community)\n")
7604: {
7605: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7606: }
7607:
7608: ALIAS (show_ip_bgp_community,
7609: show_ip_bgp_community2_cmd,
7610: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7611: SHOW_STR
7612: IP_STR
7613: BGP_STR
7614: "Display routes matching the communities\n"
7615: "community number\n"
7616: "Do not send outside local AS (well-known community)\n"
7617: "Do not advertise to any peer (well-known community)\n"
7618: "Do not export to next AS (well-known community)\n"
7619: "community number\n"
7620: "Do not send outside local AS (well-known community)\n"
7621: "Do not advertise to any peer (well-known community)\n"
7622: "Do not export to next AS (well-known community)\n")
7623:
7624: ALIAS (show_ip_bgp_community,
7625: show_ip_bgp_community3_cmd,
7626: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7627: SHOW_STR
7628: IP_STR
7629: BGP_STR
7630: "Display routes matching the communities\n"
7631: "community number\n"
7632: "Do not send outside local AS (well-known community)\n"
7633: "Do not advertise to any peer (well-known community)\n"
7634: "Do not export to next AS (well-known community)\n"
7635: "community number\n"
7636: "Do not send outside local AS (well-known community)\n"
7637: "Do not advertise to any peer (well-known community)\n"
7638: "Do not export to next AS (well-known community)\n"
7639: "community number\n"
7640: "Do not send outside local AS (well-known community)\n"
7641: "Do not advertise to any peer (well-known community)\n"
7642: "Do not export to next AS (well-known community)\n")
7643:
7644: ALIAS (show_ip_bgp_community,
7645: show_ip_bgp_community4_cmd,
7646: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7647: SHOW_STR
7648: IP_STR
7649: BGP_STR
7650: "Display routes matching the communities\n"
7651: "community number\n"
7652: "Do not send outside local AS (well-known community)\n"
7653: "Do not advertise to any peer (well-known community)\n"
7654: "Do not export to next AS (well-known community)\n"
7655: "community number\n"
7656: "Do not send outside local AS (well-known community)\n"
7657: "Do not advertise to any peer (well-known community)\n"
7658: "Do not export to next AS (well-known community)\n"
7659: "community number\n"
7660: "Do not send outside local AS (well-known community)\n"
7661: "Do not advertise to any peer (well-known community)\n"
7662: "Do not export to next AS (well-known community)\n"
7663: "community number\n"
7664: "Do not send outside local AS (well-known community)\n"
7665: "Do not advertise to any peer (well-known community)\n"
7666: "Do not export to next AS (well-known community)\n")
7667:
7668: DEFUN (show_ip_bgp_ipv4_community,
7669: show_ip_bgp_ipv4_community_cmd,
7670: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7671: SHOW_STR
7672: IP_STR
7673: BGP_STR
7674: "Address family\n"
7675: "Address Family modifier\n"
7676: "Address Family modifier\n"
7677: "Display routes matching the communities\n"
7678: "community number\n"
7679: "Do not send outside local AS (well-known community)\n"
7680: "Do not advertise to any peer (well-known community)\n"
7681: "Do not export to next AS (well-known community)\n")
7682: {
7683: if (strncmp (argv[0], "m", 1) == 0)
7684: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_MULTICAST);
7685:
7686: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP, SAFI_UNICAST);
7687: }
7688:
7689: ALIAS (show_ip_bgp_ipv4_community,
7690: show_ip_bgp_ipv4_community2_cmd,
7691: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7692: SHOW_STR
7693: IP_STR
7694: BGP_STR
7695: "Address family\n"
7696: "Address Family modifier\n"
7697: "Address Family modifier\n"
7698: "Display routes matching the communities\n"
7699: "community number\n"
7700: "Do not send outside local AS (well-known community)\n"
7701: "Do not advertise to any peer (well-known community)\n"
7702: "Do not export to next AS (well-known community)\n"
7703: "community number\n"
7704: "Do not send outside local AS (well-known community)\n"
7705: "Do not advertise to any peer (well-known community)\n"
7706: "Do not export to next AS (well-known community)\n")
7707:
7708: ALIAS (show_ip_bgp_ipv4_community,
7709: show_ip_bgp_ipv4_community3_cmd,
7710: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7711: SHOW_STR
7712: IP_STR
7713: BGP_STR
7714: "Address family\n"
7715: "Address Family modifier\n"
7716: "Address Family modifier\n"
7717: "Display routes matching the communities\n"
7718: "community number\n"
7719: "Do not send outside local AS (well-known community)\n"
7720: "Do not advertise to any peer (well-known community)\n"
7721: "Do not export to next AS (well-known community)\n"
7722: "community number\n"
7723: "Do not send outside local AS (well-known community)\n"
7724: "Do not advertise to any peer (well-known community)\n"
7725: "Do not export to next AS (well-known community)\n"
7726: "community number\n"
7727: "Do not send outside local AS (well-known community)\n"
7728: "Do not advertise to any peer (well-known community)\n"
7729: "Do not export to next AS (well-known community)\n")
7730:
7731: ALIAS (show_ip_bgp_ipv4_community,
7732: show_ip_bgp_ipv4_community4_cmd,
7733: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7734: SHOW_STR
7735: IP_STR
7736: BGP_STR
7737: "Address family\n"
7738: "Address Family modifier\n"
7739: "Address Family modifier\n"
7740: "Display routes matching the communities\n"
7741: "community number\n"
7742: "Do not send outside local AS (well-known community)\n"
7743: "Do not advertise to any peer (well-known community)\n"
7744: "Do not export to next AS (well-known community)\n"
7745: "community number\n"
7746: "Do not send outside local AS (well-known community)\n"
7747: "Do not advertise to any peer (well-known community)\n"
7748: "Do not export to next AS (well-known community)\n"
7749: "community number\n"
7750: "Do not send outside local AS (well-known community)\n"
7751: "Do not advertise to any peer (well-known community)\n"
7752: "Do not export to next AS (well-known community)\n"
7753: "community number\n"
7754: "Do not send outside local AS (well-known community)\n"
7755: "Do not advertise to any peer (well-known community)\n"
7756: "Do not export to next AS (well-known community)\n")
7757:
7758: DEFUN (show_bgp_view_afi_safi_community_all,
7759: show_bgp_view_afi_safi_community_all_cmd,
7760: #ifdef HAVE_IPV6
7761: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
7762: #else
7763: "show bgp view WORD ipv4 (unicast|multicast) community",
7764: #endif
7765: SHOW_STR
7766: BGP_STR
7767: "BGP view\n"
7768: "BGP view name\n"
7769: "Address family\n"
7770: #ifdef HAVE_IPV6
7771: "Address family\n"
7772: #endif
7773: "Address Family modifier\n"
7774: "Address Family modifier\n"
7775: "Display routes containing communities\n")
7776: {
7777: int afi;
7778: int safi;
7779: struct bgp *bgp;
7780:
7781: /* BGP structure lookup. */
7782: bgp = bgp_lookup_by_name (argv[0]);
7783: if (bgp == NULL)
7784: {
7785: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
7786: return CMD_WARNING;
7787: }
7788:
7789: #ifdef HAVE_IPV6
7790: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7791: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7792: #else
7793: afi = AFI_IP;
7794: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7795: #endif
7796: return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
7797: }
7798:
7799: DEFUN (show_bgp_view_afi_safi_community,
7800: show_bgp_view_afi_safi_community_cmd,
7801: #ifdef HAVE_IPV6
7802: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7803: #else
7804: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
7805: #endif
7806: SHOW_STR
7807: BGP_STR
7808: "BGP view\n"
7809: "BGP view name\n"
7810: "Address family\n"
7811: #ifdef HAVE_IPV6
7812: "Address family\n"
7813: #endif
7814: "Address family modifier\n"
7815: "Address family modifier\n"
7816: "Display routes matching the communities\n"
7817: "community number\n"
7818: "Do not send outside local AS (well-known community)\n"
7819: "Do not advertise to any peer (well-known community)\n"
7820: "Do not export to next AS (well-known community)\n")
7821: {
7822: int afi;
7823: int safi;
7824:
7825: #ifdef HAVE_IPV6
7826: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
7827: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7828: return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
7829: #else
7830: afi = AFI_IP;
7831: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
7832: return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
7833: #endif
7834: }
7835:
7836: ALIAS (show_bgp_view_afi_safi_community,
7837: show_bgp_view_afi_safi_community2_cmd,
7838: #ifdef HAVE_IPV6
7839: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7840: #else
7841: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7842: #endif
7843: SHOW_STR
7844: BGP_STR
7845: "BGP view\n"
7846: "BGP view name\n"
7847: "Address family\n"
7848: #ifdef HAVE_IPV6
7849: "Address family\n"
7850: #endif
7851: "Address family modifier\n"
7852: "Address family modifier\n"
7853: "Display routes matching the communities\n"
7854: "community number\n"
7855: "Do not send outside local AS (well-known community)\n"
7856: "Do not advertise to any peer (well-known community)\n"
7857: "Do not export to next AS (well-known community)\n"
7858: "community number\n"
7859: "Do not send outside local AS (well-known community)\n"
7860: "Do not advertise to any peer (well-known community)\n"
7861: "Do not export to next AS (well-known community)\n")
7862:
7863: ALIAS (show_bgp_view_afi_safi_community,
7864: show_bgp_view_afi_safi_community3_cmd,
7865: #ifdef HAVE_IPV6
7866: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7867: #else
7868: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7869: #endif
7870: SHOW_STR
7871: BGP_STR
7872: "BGP view\n"
7873: "BGP view name\n"
7874: "Address family\n"
7875: #ifdef HAVE_IPV6
7876: "Address family\n"
7877: #endif
7878: "Address family modifier\n"
7879: "Address family modifier\n"
7880: "Display routes matching the communities\n"
7881: "community number\n"
7882: "Do not send outside local AS (well-known community)\n"
7883: "Do not advertise to any peer (well-known community)\n"
7884: "Do not export to next AS (well-known community)\n"
7885: "community number\n"
7886: "Do not send outside local AS (well-known community)\n"
7887: "Do not advertise to any peer (well-known community)\n"
7888: "Do not export to next AS (well-known community)\n"
7889: "community number\n"
7890: "Do not send outside local AS (well-known community)\n"
7891: "Do not advertise to any peer (well-known community)\n"
7892: "Do not export to next AS (well-known community)\n")
7893:
7894: ALIAS (show_bgp_view_afi_safi_community,
7895: show_bgp_view_afi_safi_community4_cmd,
7896: #ifdef HAVE_IPV6
7897: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7898: #else
7899: "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
7900: #endif
7901: SHOW_STR
7902: BGP_STR
7903: "BGP view\n"
7904: "BGP view name\n"
7905: "Address family\n"
7906: #ifdef HAVE_IPV6
7907: "Address family\n"
7908: #endif
7909: "Address family modifier\n"
7910: "Address family modifier\n"
7911: "Display routes matching the communities\n"
7912: "community number\n"
7913: "Do not send outside local AS (well-known community)\n"
7914: "Do not advertise to any peer (well-known community)\n"
7915: "Do not export to next AS (well-known community)\n"
7916: "community number\n"
7917: "Do not send outside local AS (well-known community)\n"
7918: "Do not advertise to any peer (well-known community)\n"
7919: "Do not export to next AS (well-known community)\n"
7920: "community number\n"
7921: "Do not send outside local AS (well-known community)\n"
7922: "Do not advertise to any peer (well-known community)\n"
7923: "Do not export to next AS (well-known community)\n"
7924: "community number\n"
7925: "Do not send outside local AS (well-known community)\n"
7926: "Do not advertise to any peer (well-known community)\n"
7927: "Do not export to next AS (well-known community)\n")
7928:
7929: DEFUN (show_ip_bgp_community_exact,
7930: show_ip_bgp_community_exact_cmd,
7931: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
7932: SHOW_STR
7933: IP_STR
7934: BGP_STR
7935: "Display routes matching the communities\n"
7936: "community number\n"
7937: "Do not send outside local AS (well-known community)\n"
7938: "Do not advertise to any peer (well-known community)\n"
7939: "Do not export to next AS (well-known community)\n"
7940: "Exact match of the communities")
7941: {
7942: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
7943: }
7944:
7945: ALIAS (show_ip_bgp_community_exact,
7946: show_ip_bgp_community2_exact_cmd,
7947: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7948: SHOW_STR
7949: IP_STR
7950: BGP_STR
7951: "Display routes matching the communities\n"
7952: "community number\n"
7953: "Do not send outside local AS (well-known community)\n"
7954: "Do not advertise to any peer (well-known community)\n"
7955: "Do not export to next AS (well-known community)\n"
7956: "community number\n"
7957: "Do not send outside local AS (well-known community)\n"
7958: "Do not advertise to any peer (well-known community)\n"
7959: "Do not export to next AS (well-known community)\n"
7960: "Exact match of the communities")
7961:
7962: ALIAS (show_ip_bgp_community_exact,
7963: show_ip_bgp_community3_exact_cmd,
7964: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7965: SHOW_STR
7966: IP_STR
7967: BGP_STR
7968: "Display routes matching the communities\n"
7969: "community number\n"
7970: "Do not send outside local AS (well-known community)\n"
7971: "Do not advertise to any peer (well-known community)\n"
7972: "Do not export to next AS (well-known community)\n"
7973: "community number\n"
7974: "Do not send outside local AS (well-known community)\n"
7975: "Do not advertise to any peer (well-known community)\n"
7976: "Do not export to next AS (well-known community)\n"
7977: "community number\n"
7978: "Do not send outside local AS (well-known community)\n"
7979: "Do not advertise to any peer (well-known community)\n"
7980: "Do not export to next AS (well-known community)\n"
7981: "Exact match of the communities")
7982:
7983: ALIAS (show_ip_bgp_community_exact,
7984: show_ip_bgp_community4_exact_cmd,
7985: "show ip bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
7986: SHOW_STR
7987: IP_STR
7988: BGP_STR
7989: "Display routes matching the communities\n"
7990: "community number\n"
7991: "Do not send outside local AS (well-known community)\n"
7992: "Do not advertise to any peer (well-known community)\n"
7993: "Do not export to next AS (well-known community)\n"
7994: "community number\n"
7995: "Do not send outside local AS (well-known community)\n"
7996: "Do not advertise to any peer (well-known community)\n"
7997: "Do not export to next AS (well-known community)\n"
7998: "community number\n"
7999: "Do not send outside local AS (well-known community)\n"
8000: "Do not advertise to any peer (well-known community)\n"
8001: "Do not export to next AS (well-known community)\n"
8002: "community number\n"
8003: "Do not send outside local AS (well-known community)\n"
8004: "Do not advertise to any peer (well-known community)\n"
8005: "Do not export to next AS (well-known community)\n"
8006: "Exact match of the communities")
8007:
8008: DEFUN (show_ip_bgp_ipv4_community_exact,
8009: show_ip_bgp_ipv4_community_exact_cmd,
8010: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8011: SHOW_STR
8012: IP_STR
8013: BGP_STR
8014: "Address family\n"
8015: "Address Family modifier\n"
8016: "Address Family modifier\n"
8017: "Display routes matching the communities\n"
8018: "community number\n"
8019: "Do not send outside local AS (well-known community)\n"
8020: "Do not advertise to any peer (well-known community)\n"
8021: "Do not export to next AS (well-known community)\n"
8022: "Exact match of the communities")
8023: {
8024: if (strncmp (argv[0], "m", 1) == 0)
8025: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_MULTICAST);
8026:
8027: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP, SAFI_UNICAST);
8028: }
8029:
8030: ALIAS (show_ip_bgp_ipv4_community_exact,
8031: show_ip_bgp_ipv4_community2_exact_cmd,
8032: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8033: SHOW_STR
8034: IP_STR
8035: BGP_STR
8036: "Address family\n"
8037: "Address Family modifier\n"
8038: "Address Family modifier\n"
8039: "Display routes matching the communities\n"
8040: "community number\n"
8041: "Do not send outside local AS (well-known community)\n"
8042: "Do not advertise to any peer (well-known community)\n"
8043: "Do not export to next AS (well-known community)\n"
8044: "community number\n"
8045: "Do not send outside local AS (well-known community)\n"
8046: "Do not advertise to any peer (well-known community)\n"
8047: "Do not export to next AS (well-known community)\n"
8048: "Exact match of the communities")
8049:
8050: ALIAS (show_ip_bgp_ipv4_community_exact,
8051: show_ip_bgp_ipv4_community3_exact_cmd,
8052: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8053: SHOW_STR
8054: IP_STR
8055: BGP_STR
8056: "Address family\n"
8057: "Address Family modifier\n"
8058: "Address Family modifier\n"
8059: "Display routes matching the communities\n"
8060: "community number\n"
8061: "Do not send outside local AS (well-known community)\n"
8062: "Do not advertise to any peer (well-known community)\n"
8063: "Do not export to next AS (well-known community)\n"
8064: "community number\n"
8065: "Do not send outside local AS (well-known community)\n"
8066: "Do not advertise to any peer (well-known community)\n"
8067: "Do not export to next AS (well-known community)\n"
8068: "community number\n"
8069: "Do not send outside local AS (well-known community)\n"
8070: "Do not advertise to any peer (well-known community)\n"
8071: "Do not export to next AS (well-known community)\n"
8072: "Exact match of the communities")
8073:
8074: ALIAS (show_ip_bgp_ipv4_community_exact,
8075: show_ip_bgp_ipv4_community4_exact_cmd,
8076: "show ip bgp ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8077: SHOW_STR
8078: IP_STR
8079: BGP_STR
8080: "Address family\n"
8081: "Address Family modifier\n"
8082: "Address Family modifier\n"
8083: "Display routes matching the communities\n"
8084: "community number\n"
8085: "Do not send outside local AS (well-known community)\n"
8086: "Do not advertise to any peer (well-known community)\n"
8087: "Do not export to next AS (well-known community)\n"
8088: "community number\n"
8089: "Do not send outside local AS (well-known community)\n"
8090: "Do not advertise to any peer (well-known community)\n"
8091: "Do not export to next AS (well-known community)\n"
8092: "community number\n"
8093: "Do not send outside local AS (well-known community)\n"
8094: "Do not advertise to any peer (well-known community)\n"
8095: "Do not export to next AS (well-known community)\n"
8096: "community number\n"
8097: "Do not send outside local AS (well-known community)\n"
8098: "Do not advertise to any peer (well-known community)\n"
8099: "Do not export to next AS (well-known community)\n"
8100: "Exact match of the communities")
8101:
8102: #ifdef HAVE_IPV6
8103: DEFUN (show_bgp_community,
8104: show_bgp_community_cmd,
8105: "show bgp community (AA:NN|local-AS|no-advertise|no-export)",
8106: SHOW_STR
8107: BGP_STR
8108: "Display routes matching the communities\n"
8109: "community number\n"
8110: "Do not send outside local AS (well-known community)\n"
8111: "Do not advertise to any peer (well-known community)\n"
8112: "Do not export to next AS (well-known community)\n")
8113: {
8114: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
8115: }
8116:
8117: ALIAS (show_bgp_community,
8118: show_bgp_ipv6_community_cmd,
8119: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export)",
8120: SHOW_STR
8121: BGP_STR
8122: "Address family\n"
8123: "Display routes matching the communities\n"
8124: "community number\n"
8125: "Do not send outside local AS (well-known community)\n"
8126: "Do not advertise to any peer (well-known community)\n"
8127: "Do not export to next AS (well-known community)\n")
8128:
8129: ALIAS (show_bgp_community,
8130: show_bgp_community2_cmd,
8131: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8132: SHOW_STR
8133: BGP_STR
8134: "Display routes matching the communities\n"
8135: "community number\n"
8136: "Do not send outside local AS (well-known community)\n"
8137: "Do not advertise to any peer (well-known community)\n"
8138: "Do not export to next AS (well-known community)\n"
8139: "community number\n"
8140: "Do not send outside local AS (well-known community)\n"
8141: "Do not advertise to any peer (well-known community)\n"
8142: "Do not export to next AS (well-known community)\n")
8143:
8144: ALIAS (show_bgp_community,
8145: show_bgp_ipv6_community2_cmd,
8146: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8147: SHOW_STR
8148: BGP_STR
8149: "Address family\n"
8150: "Display routes matching the communities\n"
8151: "community number\n"
8152: "Do not send outside local AS (well-known community)\n"
8153: "Do not advertise to any peer (well-known community)\n"
8154: "Do not export to next AS (well-known community)\n"
8155: "community number\n"
8156: "Do not send outside local AS (well-known community)\n"
8157: "Do not advertise to any peer (well-known community)\n"
8158: "Do not export to next AS (well-known community)\n")
8159:
8160: ALIAS (show_bgp_community,
8161: show_bgp_community3_cmd,
8162: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8163: SHOW_STR
8164: BGP_STR
8165: "Display routes matching the communities\n"
8166: "community number\n"
8167: "Do not send outside local AS (well-known community)\n"
8168: "Do not advertise to any peer (well-known community)\n"
8169: "Do not export to next AS (well-known community)\n"
8170: "community number\n"
8171: "Do not send outside local AS (well-known community)\n"
8172: "Do not advertise to any peer (well-known community)\n"
8173: "Do not export to next AS (well-known community)\n"
8174: "community number\n"
8175: "Do not send outside local AS (well-known community)\n"
8176: "Do not advertise to any peer (well-known community)\n"
8177: "Do not export to next AS (well-known community)\n")
8178:
8179: ALIAS (show_bgp_community,
8180: show_bgp_ipv6_community3_cmd,
8181: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8182: SHOW_STR
8183: BGP_STR
8184: "Address family\n"
8185: "Display routes matching the communities\n"
8186: "community number\n"
8187: "Do not send outside local AS (well-known community)\n"
8188: "Do not advertise to any peer (well-known community)\n"
8189: "Do not export to next AS (well-known community)\n"
8190: "community number\n"
8191: "Do not send outside local AS (well-known community)\n"
8192: "Do not advertise to any peer (well-known community)\n"
8193: "Do not export to next AS (well-known community)\n"
8194: "community number\n"
8195: "Do not send outside local AS (well-known community)\n"
8196: "Do not advertise to any peer (well-known community)\n"
8197: "Do not export to next AS (well-known community)\n")
8198:
8199: ALIAS (show_bgp_community,
8200: show_bgp_community4_cmd,
8201: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8202: SHOW_STR
8203: BGP_STR
8204: "Display routes matching the communities\n"
8205: "community number\n"
8206: "Do not send outside local AS (well-known community)\n"
8207: "Do not advertise to any peer (well-known community)\n"
8208: "Do not export to next AS (well-known community)\n"
8209: "community number\n"
8210: "Do not send outside local AS (well-known community)\n"
8211: "Do not advertise to any peer (well-known community)\n"
8212: "Do not export to next AS (well-known community)\n"
8213: "community number\n"
8214: "Do not send outside local AS (well-known community)\n"
8215: "Do not advertise to any peer (well-known community)\n"
8216: "Do not export to next AS (well-known community)\n"
8217: "community number\n"
8218: "Do not send outside local AS (well-known community)\n"
8219: "Do not advertise to any peer (well-known community)\n"
8220: "Do not export to next AS (well-known community)\n")
8221:
8222: ALIAS (show_bgp_community,
8223: show_bgp_ipv6_community4_cmd,
8224: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8225: SHOW_STR
8226: BGP_STR
8227: "Address family\n"
8228: "Display routes matching the communities\n"
8229: "community number\n"
8230: "Do not send outside local AS (well-known community)\n"
8231: "Do not advertise to any peer (well-known community)\n"
8232: "Do not export to next AS (well-known community)\n"
8233: "community number\n"
8234: "Do not send outside local AS (well-known community)\n"
8235: "Do not advertise to any peer (well-known community)\n"
8236: "Do not export to next AS (well-known community)\n"
8237: "community number\n"
8238: "Do not send outside local AS (well-known community)\n"
8239: "Do not advertise to any peer (well-known community)\n"
8240: "Do not export to next AS (well-known community)\n"
8241: "community number\n"
8242: "Do not send outside local AS (well-known community)\n"
8243: "Do not advertise to any peer (well-known community)\n"
8244: "Do not export to next AS (well-known community)\n")
8245:
8246: /* old command */
8247: DEFUN (show_ipv6_bgp_community,
8248: show_ipv6_bgp_community_cmd,
8249: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export)",
8250: SHOW_STR
8251: IPV6_STR
8252: BGP_STR
8253: "Display routes matching the communities\n"
8254: "community number\n"
8255: "Do not send outside local AS (well-known community)\n"
8256: "Do not advertise to any peer (well-known community)\n"
8257: "Do not export to next AS (well-known community)\n")
8258: {
8259: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_UNICAST);
8260: }
8261:
8262: /* old command */
8263: ALIAS (show_ipv6_bgp_community,
8264: show_ipv6_bgp_community2_cmd,
8265: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8266: SHOW_STR
8267: IPV6_STR
8268: BGP_STR
8269: "Display routes matching the communities\n"
8270: "community number\n"
8271: "Do not send outside local AS (well-known community)\n"
8272: "Do not advertise to any peer (well-known community)\n"
8273: "Do not export to next AS (well-known community)\n"
8274: "community number\n"
8275: "Do not send outside local AS (well-known community)\n"
8276: "Do not advertise to any peer (well-known community)\n"
8277: "Do not export to next AS (well-known community)\n")
8278:
8279: /* old command */
8280: ALIAS (show_ipv6_bgp_community,
8281: show_ipv6_bgp_community3_cmd,
8282: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8283: SHOW_STR
8284: IPV6_STR
8285: BGP_STR
8286: "Display routes matching the communities\n"
8287: "community number\n"
8288: "Do not send outside local AS (well-known community)\n"
8289: "Do not advertise to any peer (well-known community)\n"
8290: "Do not export to next AS (well-known community)\n"
8291: "community number\n"
8292: "Do not send outside local AS (well-known community)\n"
8293: "Do not advertise to any peer (well-known community)\n"
8294: "Do not export to next AS (well-known community)\n"
8295: "community number\n"
8296: "Do not send outside local AS (well-known community)\n"
8297: "Do not advertise to any peer (well-known community)\n"
8298: "Do not export to next AS (well-known community)\n")
8299:
8300: /* old command */
8301: ALIAS (show_ipv6_bgp_community,
8302: show_ipv6_bgp_community4_cmd,
8303: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8304: SHOW_STR
8305: IPV6_STR
8306: BGP_STR
8307: "Display routes matching the communities\n"
8308: "community number\n"
8309: "Do not send outside local AS (well-known community)\n"
8310: "Do not advertise to any peer (well-known community)\n"
8311: "Do not export to next AS (well-known community)\n"
8312: "community number\n"
8313: "Do not send outside local AS (well-known community)\n"
8314: "Do not advertise to any peer (well-known community)\n"
8315: "Do not export to next AS (well-known community)\n"
8316: "community number\n"
8317: "Do not send outside local AS (well-known community)\n"
8318: "Do not advertise to any peer (well-known community)\n"
8319: "Do not export to next AS (well-known community)\n"
8320: "community number\n"
8321: "Do not send outside local AS (well-known community)\n"
8322: "Do not advertise to any peer (well-known community)\n"
8323: "Do not export to next AS (well-known community)\n")
8324:
8325: DEFUN (show_bgp_community_exact,
8326: show_bgp_community_exact_cmd,
8327: "show bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8328: SHOW_STR
8329: BGP_STR
8330: "Display routes matching the communities\n"
8331: "community number\n"
8332: "Do not send outside local AS (well-known community)\n"
8333: "Do not advertise to any peer (well-known community)\n"
8334: "Do not export to next AS (well-known community)\n"
8335: "Exact match of the communities")
8336: {
8337: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8338: }
8339:
8340: ALIAS (show_bgp_community_exact,
8341: show_bgp_ipv6_community_exact_cmd,
8342: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8343: SHOW_STR
8344: BGP_STR
8345: "Address family\n"
8346: "Display routes matching the communities\n"
8347: "community number\n"
8348: "Do not send outside local AS (well-known community)\n"
8349: "Do not advertise to any peer (well-known community)\n"
8350: "Do not export to next AS (well-known community)\n"
8351: "Exact match of the communities")
8352:
8353: ALIAS (show_bgp_community_exact,
8354: show_bgp_community2_exact_cmd,
8355: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8356: SHOW_STR
8357: BGP_STR
8358: "Display routes matching the communities\n"
8359: "community number\n"
8360: "Do not send outside local AS (well-known community)\n"
8361: "Do not advertise to any peer (well-known community)\n"
8362: "Do not export to next AS (well-known community)\n"
8363: "community number\n"
8364: "Do not send outside local AS (well-known community)\n"
8365: "Do not advertise to any peer (well-known community)\n"
8366: "Do not export to next AS (well-known community)\n"
8367: "Exact match of the communities")
8368:
8369: ALIAS (show_bgp_community_exact,
8370: show_bgp_ipv6_community2_exact_cmd,
8371: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8372: SHOW_STR
8373: BGP_STR
8374: "Address family\n"
8375: "Display routes matching the communities\n"
8376: "community number\n"
8377: "Do not send outside local AS (well-known community)\n"
8378: "Do not advertise to any peer (well-known community)\n"
8379: "Do not export to next AS (well-known community)\n"
8380: "community number\n"
8381: "Do not send outside local AS (well-known community)\n"
8382: "Do not advertise to any peer (well-known community)\n"
8383: "Do not export to next AS (well-known community)\n"
8384: "Exact match of the communities")
8385:
8386: ALIAS (show_bgp_community_exact,
8387: show_bgp_community3_exact_cmd,
8388: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8389: SHOW_STR
8390: BGP_STR
8391: "Display routes matching the communities\n"
8392: "community number\n"
8393: "Do not send outside local AS (well-known community)\n"
8394: "Do not advertise to any peer (well-known community)\n"
8395: "Do not export to next AS (well-known community)\n"
8396: "community number\n"
8397: "Do not send outside local AS (well-known community)\n"
8398: "Do not advertise to any peer (well-known community)\n"
8399: "Do not export to next AS (well-known community)\n"
8400: "community number\n"
8401: "Do not send outside local AS (well-known community)\n"
8402: "Do not advertise to any peer (well-known community)\n"
8403: "Do not export to next AS (well-known community)\n"
8404: "Exact match of the communities")
8405:
8406: ALIAS (show_bgp_community_exact,
8407: show_bgp_ipv6_community3_exact_cmd,
8408: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8409: SHOW_STR
8410: BGP_STR
8411: "Address family\n"
8412: "Display routes matching the communities\n"
8413: "community number\n"
8414: "Do not send outside local AS (well-known community)\n"
8415: "Do not advertise to any peer (well-known community)\n"
8416: "Do not export to next AS (well-known community)\n"
8417: "community number\n"
8418: "Do not send outside local AS (well-known community)\n"
8419: "Do not advertise to any peer (well-known community)\n"
8420: "Do not export to next AS (well-known community)\n"
8421: "community number\n"
8422: "Do not send outside local AS (well-known community)\n"
8423: "Do not advertise to any peer (well-known community)\n"
8424: "Do not export to next AS (well-known community)\n"
8425: "Exact match of the communities")
8426:
8427: ALIAS (show_bgp_community_exact,
8428: show_bgp_community4_exact_cmd,
8429: "show bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8430: SHOW_STR
8431: BGP_STR
8432: "Display routes matching the communities\n"
8433: "community number\n"
8434: "Do not send outside local AS (well-known community)\n"
8435: "Do not advertise to any peer (well-known community)\n"
8436: "Do not export to next AS (well-known community)\n"
8437: "community number\n"
8438: "Do not send outside local AS (well-known community)\n"
8439: "Do not advertise to any peer (well-known community)\n"
8440: "Do not export to next AS (well-known community)\n"
8441: "community number\n"
8442: "Do not send outside local AS (well-known community)\n"
8443: "Do not advertise to any peer (well-known community)\n"
8444: "Do not export to next AS (well-known community)\n"
8445: "community number\n"
8446: "Do not send outside local AS (well-known community)\n"
8447: "Do not advertise to any peer (well-known community)\n"
8448: "Do not export to next AS (well-known community)\n"
8449: "Exact match of the communities")
8450:
8451: ALIAS (show_bgp_community_exact,
8452: show_bgp_ipv6_community4_exact_cmd,
8453: "show bgp ipv6 community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8454: SHOW_STR
8455: BGP_STR
8456: "Address family\n"
8457: "Display routes matching the communities\n"
8458: "community number\n"
8459: "Do not send outside local AS (well-known community)\n"
8460: "Do not advertise to any peer (well-known community)\n"
8461: "Do not export to next AS (well-known community)\n"
8462: "community number\n"
8463: "Do not send outside local AS (well-known community)\n"
8464: "Do not advertise to any peer (well-known community)\n"
8465: "Do not export to next AS (well-known community)\n"
8466: "community number\n"
8467: "Do not send outside local AS (well-known community)\n"
8468: "Do not advertise to any peer (well-known community)\n"
8469: "Do not export to next AS (well-known community)\n"
8470: "community number\n"
8471: "Do not send outside local AS (well-known community)\n"
8472: "Do not advertise to any peer (well-known community)\n"
8473: "Do not export to next AS (well-known community)\n"
8474: "Exact match of the communities")
8475:
8476: /* old command */
8477: DEFUN (show_ipv6_bgp_community_exact,
8478: show_ipv6_bgp_community_exact_cmd,
8479: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8480: SHOW_STR
8481: IPV6_STR
8482: BGP_STR
8483: "Display routes matching the communities\n"
8484: "community number\n"
8485: "Do not send outside local AS (well-known community)\n"
8486: "Do not advertise to any peer (well-known community)\n"
8487: "Do not export to next AS (well-known community)\n"
8488: "Exact match of the communities")
8489: {
8490: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_UNICAST);
8491: }
8492:
8493: /* old command */
8494: ALIAS (show_ipv6_bgp_community_exact,
8495: show_ipv6_bgp_community2_exact_cmd,
8496: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8497: SHOW_STR
8498: IPV6_STR
8499: BGP_STR
8500: "Display routes matching the communities\n"
8501: "community number\n"
8502: "Do not send outside local AS (well-known community)\n"
8503: "Do not advertise to any peer (well-known community)\n"
8504: "Do not export to next AS (well-known community)\n"
8505: "community number\n"
8506: "Do not send outside local AS (well-known community)\n"
8507: "Do not advertise to any peer (well-known community)\n"
8508: "Do not export to next AS (well-known community)\n"
8509: "Exact match of the communities")
8510:
8511: /* old command */
8512: ALIAS (show_ipv6_bgp_community_exact,
8513: show_ipv6_bgp_community3_exact_cmd,
8514: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8515: SHOW_STR
8516: IPV6_STR
8517: BGP_STR
8518: "Display routes matching the communities\n"
8519: "community number\n"
8520: "Do not send outside local AS (well-known community)\n"
8521: "Do not advertise to any peer (well-known community)\n"
8522: "Do not export to next AS (well-known community)\n"
8523: "community number\n"
8524: "Do not send outside local AS (well-known community)\n"
8525: "Do not advertise to any peer (well-known community)\n"
8526: "Do not export to next AS (well-known community)\n"
8527: "community number\n"
8528: "Do not send outside local AS (well-known community)\n"
8529: "Do not advertise to any peer (well-known community)\n"
8530: "Do not export to next AS (well-known community)\n"
8531: "Exact match of the communities")
8532:
8533: /* old command */
8534: ALIAS (show_ipv6_bgp_community_exact,
8535: show_ipv6_bgp_community4_exact_cmd,
8536: "show ipv6 bgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8537: SHOW_STR
8538: IPV6_STR
8539: BGP_STR
8540: "Display routes matching the communities\n"
8541: "community number\n"
8542: "Do not send outside local AS (well-known community)\n"
8543: "Do not advertise to any peer (well-known community)\n"
8544: "Do not export to next AS (well-known community)\n"
8545: "community number\n"
8546: "Do not send outside local AS (well-known community)\n"
8547: "Do not advertise to any peer (well-known community)\n"
8548: "Do not export to next AS (well-known community)\n"
8549: "community number\n"
8550: "Do not send outside local AS (well-known community)\n"
8551: "Do not advertise to any peer (well-known community)\n"
8552: "Do not export to next AS (well-known community)\n"
8553: "community number\n"
8554: "Do not send outside local AS (well-known community)\n"
8555: "Do not advertise to any peer (well-known community)\n"
8556: "Do not export to next AS (well-known community)\n"
8557: "Exact match of the communities")
8558:
8559: /* old command */
8560: DEFUN (show_ipv6_mbgp_community,
8561: show_ipv6_mbgp_community_cmd,
8562: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export)",
8563: SHOW_STR
8564: IPV6_STR
8565: MBGP_STR
8566: "Display routes matching the communities\n"
8567: "community number\n"
8568: "Do not send outside local AS (well-known community)\n"
8569: "Do not advertise to any peer (well-known community)\n"
8570: "Do not export to next AS (well-known community)\n")
8571: {
8572: return bgp_show_community (vty, NULL, argc, argv, 0, AFI_IP6, SAFI_MULTICAST);
8573: }
8574:
8575: /* old command */
8576: ALIAS (show_ipv6_mbgp_community,
8577: show_ipv6_mbgp_community2_cmd,
8578: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8579: SHOW_STR
8580: IPV6_STR
8581: MBGP_STR
8582: "Display routes matching the communities\n"
8583: "community number\n"
8584: "Do not send outside local AS (well-known community)\n"
8585: "Do not advertise to any peer (well-known community)\n"
8586: "Do not export to next AS (well-known community)\n"
8587: "community number\n"
8588: "Do not send outside local AS (well-known community)\n"
8589: "Do not advertise to any peer (well-known community)\n"
8590: "Do not export to next AS (well-known community)\n")
8591:
8592: /* old command */
8593: ALIAS (show_ipv6_mbgp_community,
8594: show_ipv6_mbgp_community3_cmd,
8595: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8596: SHOW_STR
8597: IPV6_STR
8598: MBGP_STR
8599: "Display routes matching the communities\n"
8600: "community number\n"
8601: "Do not send outside local AS (well-known community)\n"
8602: "Do not advertise to any peer (well-known community)\n"
8603: "Do not export to next AS (well-known community)\n"
8604: "community number\n"
8605: "Do not send outside local AS (well-known community)\n"
8606: "Do not advertise to any peer (well-known community)\n"
8607: "Do not export to next AS (well-known community)\n"
8608: "community number\n"
8609: "Do not send outside local AS (well-known community)\n"
8610: "Do not advertise to any peer (well-known community)\n"
8611: "Do not export to next AS (well-known community)\n")
8612:
8613: /* old command */
8614: ALIAS (show_ipv6_mbgp_community,
8615: show_ipv6_mbgp_community4_cmd,
8616: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
8617: SHOW_STR
8618: IPV6_STR
8619: MBGP_STR
8620: "Display routes matching the communities\n"
8621: "community number\n"
8622: "Do not send outside local AS (well-known community)\n"
8623: "Do not advertise to any peer (well-known community)\n"
8624: "Do not export to next AS (well-known community)\n"
8625: "community number\n"
8626: "Do not send outside local AS (well-known community)\n"
8627: "Do not advertise to any peer (well-known community)\n"
8628: "Do not export to next AS (well-known community)\n"
8629: "community number\n"
8630: "Do not send outside local AS (well-known community)\n"
8631: "Do not advertise to any peer (well-known community)\n"
8632: "Do not export to next AS (well-known community)\n"
8633: "community number\n"
8634: "Do not send outside local AS (well-known community)\n"
8635: "Do not advertise to any peer (well-known community)\n"
8636: "Do not export to next AS (well-known community)\n")
8637:
8638: /* old command */
8639: DEFUN (show_ipv6_mbgp_community_exact,
8640: show_ipv6_mbgp_community_exact_cmd,
8641: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) exact-match",
8642: SHOW_STR
8643: IPV6_STR
8644: MBGP_STR
8645: "Display routes matching the communities\n"
8646: "community number\n"
8647: "Do not send outside local AS (well-known community)\n"
8648: "Do not advertise to any peer (well-known community)\n"
8649: "Do not export to next AS (well-known community)\n"
8650: "Exact match of the communities")
8651: {
8652: return bgp_show_community (vty, NULL, argc, argv, 1, AFI_IP6, SAFI_MULTICAST);
8653: }
8654:
8655: /* old command */
8656: ALIAS (show_ipv6_mbgp_community_exact,
8657: show_ipv6_mbgp_community2_exact_cmd,
8658: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8659: SHOW_STR
8660: IPV6_STR
8661: MBGP_STR
8662: "Display routes matching the communities\n"
8663: "community number\n"
8664: "Do not send outside local AS (well-known community)\n"
8665: "Do not advertise to any peer (well-known community)\n"
8666: "Do not export to next AS (well-known community)\n"
8667: "community number\n"
8668: "Do not send outside local AS (well-known community)\n"
8669: "Do not advertise to any peer (well-known community)\n"
8670: "Do not export to next AS (well-known community)\n"
8671: "Exact match of the communities")
8672:
8673: /* old command */
8674: ALIAS (show_ipv6_mbgp_community_exact,
8675: show_ipv6_mbgp_community3_exact_cmd,
8676: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8677: SHOW_STR
8678: IPV6_STR
8679: MBGP_STR
8680: "Display routes matching the communities\n"
8681: "community number\n"
8682: "Do not send outside local AS (well-known community)\n"
8683: "Do not advertise to any peer (well-known community)\n"
8684: "Do not export to next AS (well-known community)\n"
8685: "community number\n"
8686: "Do not send outside local AS (well-known community)\n"
8687: "Do not advertise to any peer (well-known community)\n"
8688: "Do not export to next AS (well-known community)\n"
8689: "community number\n"
8690: "Do not send outside local AS (well-known community)\n"
8691: "Do not advertise to any peer (well-known community)\n"
8692: "Do not export to next AS (well-known community)\n"
8693: "Exact match of the communities")
8694:
8695: /* old command */
8696: ALIAS (show_ipv6_mbgp_community_exact,
8697: show_ipv6_mbgp_community4_exact_cmd,
8698: "show ipv6 mbgp community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) exact-match",
8699: SHOW_STR
8700: IPV6_STR
8701: MBGP_STR
8702: "Display routes matching the communities\n"
8703: "community number\n"
8704: "Do not send outside local AS (well-known community)\n"
8705: "Do not advertise to any peer (well-known community)\n"
8706: "Do not export to next AS (well-known community)\n"
8707: "community number\n"
8708: "Do not send outside local AS (well-known community)\n"
8709: "Do not advertise to any peer (well-known community)\n"
8710: "Do not export to next AS (well-known community)\n"
8711: "community number\n"
8712: "Do not send outside local AS (well-known community)\n"
8713: "Do not advertise to any peer (well-known community)\n"
8714: "Do not export to next AS (well-known community)\n"
8715: "community number\n"
8716: "Do not send outside local AS (well-known community)\n"
8717: "Do not advertise to any peer (well-known community)\n"
8718: "Do not export to next AS (well-known community)\n"
8719: "Exact match of the communities")
8720: #endif /* HAVE_IPV6 */
8721:
8722: static int
8723: bgp_show_community_list (struct vty *vty, const char *com, int exact,
8724: afi_t afi, safi_t safi)
8725: {
8726: struct community_list *list;
8727:
8728: list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
8729: if (list == NULL)
8730: {
8731: vty_out (vty, "%% %s is not a valid community-list name%s", com,
8732: VTY_NEWLINE);
8733: return CMD_WARNING;
8734: }
8735:
8736: return bgp_show (vty, NULL, afi, safi,
8737: (exact ? bgp_show_type_community_list_exact :
8738: bgp_show_type_community_list), list);
8739: }
8740:
8741: DEFUN (show_ip_bgp_community_list,
8742: show_ip_bgp_community_list_cmd,
8743: "show ip bgp community-list (<1-500>|WORD)",
8744: SHOW_STR
8745: IP_STR
8746: BGP_STR
8747: "Display routes matching the community-list\n"
8748: "community-list number\n"
8749: "community-list name\n")
8750: {
8751: return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
8752: }
8753:
8754: DEFUN (show_ip_bgp_ipv4_community_list,
8755: show_ip_bgp_ipv4_community_list_cmd,
8756: "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
8757: SHOW_STR
8758: IP_STR
8759: BGP_STR
8760: "Address family\n"
8761: "Address Family modifier\n"
8762: "Address Family modifier\n"
8763: "Display routes matching the community-list\n"
8764: "community-list number\n"
8765: "community-list name\n")
8766: {
8767: if (strncmp (argv[0], "m", 1) == 0)
8768: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_MULTICAST);
8769:
8770: return bgp_show_community_list (vty, argv[1], 0, AFI_IP, SAFI_UNICAST);
8771: }
8772:
8773: DEFUN (show_ip_bgp_community_list_exact,
8774: show_ip_bgp_community_list_exact_cmd,
8775: "show ip bgp community-list (<1-500>|WORD) exact-match",
8776: SHOW_STR
8777: IP_STR
8778: BGP_STR
8779: "Display routes matching the community-list\n"
8780: "community-list number\n"
8781: "community-list name\n"
8782: "Exact match of the communities\n")
8783: {
8784: return bgp_show_community_list (vty, argv[0], 1, AFI_IP, SAFI_UNICAST);
8785: }
8786:
8787: DEFUN (show_ip_bgp_ipv4_community_list_exact,
8788: show_ip_bgp_ipv4_community_list_exact_cmd,
8789: "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
8790: SHOW_STR
8791: IP_STR
8792: BGP_STR
8793: "Address family\n"
8794: "Address Family modifier\n"
8795: "Address Family modifier\n"
8796: "Display routes matching the community-list\n"
8797: "community-list number\n"
8798: "community-list name\n"
8799: "Exact match of the communities\n")
8800: {
8801: if (strncmp (argv[0], "m", 1) == 0)
8802: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_MULTICAST);
8803:
8804: return bgp_show_community_list (vty, argv[1], 1, AFI_IP, SAFI_UNICAST);
8805: }
8806:
8807: #ifdef HAVE_IPV6
8808: DEFUN (show_bgp_community_list,
8809: show_bgp_community_list_cmd,
8810: "show bgp community-list (<1-500>|WORD)",
8811: SHOW_STR
8812: BGP_STR
8813: "Display routes matching the community-list\n"
8814: "community-list number\n"
8815: "community-list name\n")
8816: {
8817: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8818: }
8819:
8820: ALIAS (show_bgp_community_list,
8821: show_bgp_ipv6_community_list_cmd,
8822: "show bgp ipv6 community-list (<1-500>|WORD)",
8823: SHOW_STR
8824: BGP_STR
8825: "Address family\n"
8826: "Display routes matching the community-list\n"
8827: "community-list number\n"
8828: "community-list name\n")
8829:
8830: /* old command */
8831: DEFUN (show_ipv6_bgp_community_list,
8832: show_ipv6_bgp_community_list_cmd,
8833: "show ipv6 bgp community-list WORD",
8834: SHOW_STR
8835: IPV6_STR
8836: BGP_STR
8837: "Display routes matching the community-list\n"
8838: "community-list name\n")
8839: {
8840: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
8841: }
8842:
8843: /* old command */
8844: DEFUN (show_ipv6_mbgp_community_list,
8845: show_ipv6_mbgp_community_list_cmd,
8846: "show ipv6 mbgp community-list WORD",
8847: SHOW_STR
8848: IPV6_STR
8849: MBGP_STR
8850: "Display routes matching the community-list\n"
8851: "community-list name\n")
8852: {
8853: return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_MULTICAST);
8854: }
8855:
8856: DEFUN (show_bgp_community_list_exact,
8857: show_bgp_community_list_exact_cmd,
8858: "show bgp community-list (<1-500>|WORD) exact-match",
8859: SHOW_STR
8860: BGP_STR
8861: "Display routes matching the community-list\n"
8862: "community-list number\n"
8863: "community-list name\n"
8864: "Exact match of the communities\n")
8865: {
8866: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8867: }
8868:
8869: ALIAS (show_bgp_community_list_exact,
8870: show_bgp_ipv6_community_list_exact_cmd,
8871: "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
8872: SHOW_STR
8873: BGP_STR
8874: "Address family\n"
8875: "Display routes matching the community-list\n"
8876: "community-list number\n"
8877: "community-list name\n"
8878: "Exact match of the communities\n")
8879:
8880: /* old command */
8881: DEFUN (show_ipv6_bgp_community_list_exact,
8882: show_ipv6_bgp_community_list_exact_cmd,
8883: "show ipv6 bgp community-list WORD exact-match",
8884: SHOW_STR
8885: IPV6_STR
8886: BGP_STR
8887: "Display routes matching the community-list\n"
8888: "community-list name\n"
8889: "Exact match of the communities\n")
8890: {
8891: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_UNICAST);
8892: }
8893:
8894: /* old command */
8895: DEFUN (show_ipv6_mbgp_community_list_exact,
8896: show_ipv6_mbgp_community_list_exact_cmd,
8897: "show ipv6 mbgp community-list WORD exact-match",
8898: SHOW_STR
8899: IPV6_STR
8900: MBGP_STR
8901: "Display routes matching the community-list\n"
8902: "community-list name\n"
8903: "Exact match of the communities\n")
8904: {
8905: return bgp_show_community_list (vty, argv[0], 1, AFI_IP6, SAFI_MULTICAST);
8906: }
8907: #endif /* HAVE_IPV6 */
8908:
8909: static int
8910: bgp_show_prefix_longer (struct vty *vty, const char *prefix, afi_t afi,
8911: safi_t safi, enum bgp_show_type type)
8912: {
8913: int ret;
8914: struct prefix *p;
8915:
8916: p = prefix_new();
8917:
8918: ret = str2prefix (prefix, p);
8919: if (! ret)
8920: {
8921: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
8922: return CMD_WARNING;
8923: }
8924:
8925: ret = bgp_show (vty, NULL, afi, safi, type, p);
8926: prefix_free(p);
8927: return ret;
8928: }
8929:
8930: DEFUN (show_ip_bgp_prefix_longer,
8931: show_ip_bgp_prefix_longer_cmd,
8932: "show ip bgp A.B.C.D/M longer-prefixes",
8933: SHOW_STR
8934: IP_STR
8935: BGP_STR
8936: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8937: "Display route and more specific routes\n")
8938: {
8939: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8940: bgp_show_type_prefix_longer);
8941: }
8942:
8943: DEFUN (show_ip_bgp_flap_prefix_longer,
8944: show_ip_bgp_flap_prefix_longer_cmd,
8945: "show ip bgp flap-statistics A.B.C.D/M longer-prefixes",
8946: SHOW_STR
8947: IP_STR
8948: BGP_STR
8949: "Display flap statistics of routes\n"
8950: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8951: "Display route and more specific routes\n")
8952: {
8953: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8954: bgp_show_type_flap_prefix_longer);
8955: }
8956:
8957: DEFUN (show_ip_bgp_ipv4_prefix_longer,
8958: show_ip_bgp_ipv4_prefix_longer_cmd,
8959: "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes",
8960: SHOW_STR
8961: IP_STR
8962: BGP_STR
8963: "Address family\n"
8964: "Address Family modifier\n"
8965: "Address Family modifier\n"
8966: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
8967: "Display route and more specific routes\n")
8968: {
8969: if (strncmp (argv[0], "m", 1) == 0)
8970: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_MULTICAST,
8971: bgp_show_type_prefix_longer);
8972:
8973: return bgp_show_prefix_longer (vty, argv[1], AFI_IP, SAFI_UNICAST,
8974: bgp_show_type_prefix_longer);
8975: }
8976:
8977: DEFUN (show_ip_bgp_flap_address,
8978: show_ip_bgp_flap_address_cmd,
8979: "show ip bgp flap-statistics A.B.C.D",
8980: SHOW_STR
8981: IP_STR
8982: BGP_STR
8983: "Display flap statistics of routes\n"
8984: "Network in the BGP routing table to display\n")
8985: {
8986: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
8987: bgp_show_type_flap_address);
8988: }
8989:
8990: DEFUN (show_ip_bgp_flap_prefix,
8991: show_ip_bgp_flap_prefix_cmd,
8992: "show ip bgp flap-statistics A.B.C.D/M",
8993: SHOW_STR
8994: IP_STR
8995: BGP_STR
8996: "Display flap statistics of routes\n"
8997: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
8998: {
8999: return bgp_show_prefix_longer (vty, argv[0], AFI_IP, SAFI_UNICAST,
9000: bgp_show_type_flap_prefix);
9001: }
9002: #ifdef HAVE_IPV6
9003: DEFUN (show_bgp_prefix_longer,
9004: show_bgp_prefix_longer_cmd,
9005: "show bgp X:X::X:X/M longer-prefixes",
9006: SHOW_STR
9007: BGP_STR
9008: "IPv6 prefix <network>/<length>\n"
9009: "Display route and more specific routes\n")
9010: {
9011: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9012: bgp_show_type_prefix_longer);
9013: }
9014:
9015: ALIAS (show_bgp_prefix_longer,
9016: show_bgp_ipv6_prefix_longer_cmd,
9017: "show bgp ipv6 X:X::X:X/M longer-prefixes",
9018: SHOW_STR
9019: BGP_STR
9020: "Address family\n"
9021: "IPv6 prefix <network>/<length>\n"
9022: "Display route and more specific routes\n")
9023:
9024: /* old command */
9025: DEFUN (show_ipv6_bgp_prefix_longer,
9026: show_ipv6_bgp_prefix_longer_cmd,
9027: "show ipv6 bgp X:X::X:X/M longer-prefixes",
9028: SHOW_STR
9029: IPV6_STR
9030: BGP_STR
9031: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9032: "Display route and more specific routes\n")
9033: {
9034: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_UNICAST,
9035: bgp_show_type_prefix_longer);
9036: }
9037:
9038: /* old command */
9039: DEFUN (show_ipv6_mbgp_prefix_longer,
9040: show_ipv6_mbgp_prefix_longer_cmd,
9041: "show ipv6 mbgp X:X::X:X/M longer-prefixes",
9042: SHOW_STR
9043: IPV6_STR
9044: MBGP_STR
9045: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n"
9046: "Display route and more specific routes\n")
9047: {
9048: return bgp_show_prefix_longer (vty, argv[0], AFI_IP6, SAFI_MULTICAST,
9049: bgp_show_type_prefix_longer);
9050: }
9051: #endif /* HAVE_IPV6 */
9052:
9053: static struct peer *
9054: peer_lookup_in_view (struct vty *vty, const char *view_name,
9055: const char *ip_str)
9056: {
9057: int ret;
9058: struct bgp *bgp;
9059: struct peer *peer;
9060: union sockunion su;
9061:
9062: /* BGP structure lookup. */
9063: if (view_name)
9064: {
9065: bgp = bgp_lookup_by_name (view_name);
9066: if (! bgp)
9067: {
9068: vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
9069: return NULL;
9070: }
9071: }
9072: else
9073: {
9074: bgp = bgp_get_default ();
9075: if (! bgp)
9076: {
9077: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
9078: return NULL;
9079: }
9080: }
9081:
9082: /* Get peer sockunion. */
9083: ret = str2sockunion (ip_str, &su);
9084: if (ret < 0)
9085: {
9086: vty_out (vty, "Malformed address: %s%s", ip_str, VTY_NEWLINE);
9087: return NULL;
9088: }
9089:
9090: /* Peer structure lookup. */
9091: peer = peer_lookup (bgp, &su);
9092: if (! peer)
9093: {
9094: vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
9095: return NULL;
9096: }
9097:
9098: return peer;
9099: }
9100:
9101: enum bgp_stats
9102: {
9103: BGP_STATS_MAXBITLEN = 0,
9104: BGP_STATS_RIB,
9105: BGP_STATS_PREFIXES,
9106: BGP_STATS_TOTPLEN,
9107: BGP_STATS_UNAGGREGATEABLE,
9108: BGP_STATS_MAX_AGGREGATEABLE,
9109: BGP_STATS_AGGREGATES,
9110: BGP_STATS_SPACE,
9111: BGP_STATS_ASPATH_COUNT,
9112: BGP_STATS_ASPATH_MAXHOPS,
9113: BGP_STATS_ASPATH_TOTHOPS,
9114: BGP_STATS_ASPATH_MAXSIZE,
9115: BGP_STATS_ASPATH_TOTSIZE,
9116: BGP_STATS_ASN_HIGHEST,
9117: BGP_STATS_MAX,
9118: };
9119:
9120: static const char *table_stats_strs[] =
9121: {
9122: [BGP_STATS_PREFIXES] = "Total Prefixes",
9123: [BGP_STATS_TOTPLEN] = "Average prefix length",
9124: [BGP_STATS_RIB] = "Total Advertisements",
9125: [BGP_STATS_UNAGGREGATEABLE] = "Unaggregateable prefixes",
9126: [BGP_STATS_MAX_AGGREGATEABLE] = "Maximum aggregateable prefixes",
9127: [BGP_STATS_AGGREGATES] = "BGP Aggregate advertisements",
9128: [BGP_STATS_SPACE] = "Address space advertised",
9129: [BGP_STATS_ASPATH_COUNT] = "Advertisements with paths",
9130: [BGP_STATS_ASPATH_MAXHOPS] = "Longest AS-Path (hops)",
9131: [BGP_STATS_ASPATH_MAXSIZE] = "Largest AS-Path (bytes)",
9132: [BGP_STATS_ASPATH_TOTHOPS] = "Average AS-Path length (hops)",
9133: [BGP_STATS_ASPATH_TOTSIZE] = "Average AS-Path size (bytes)",
9134: [BGP_STATS_ASN_HIGHEST] = "Highest public ASN",
9135: [BGP_STATS_MAX] = NULL,
9136: };
9137:
9138: struct bgp_table_stats
9139: {
9140: struct bgp_table *table;
9141: unsigned long long counts[BGP_STATS_MAX];
9142: };
9143:
9144: #if 0
9145: #define TALLY_SIGFIG 100000
9146: static unsigned long
9147: ravg_tally (unsigned long count, unsigned long oldavg, unsigned long newval)
9148: {
9149: unsigned long newtot = (count-1) * oldavg + (newval * TALLY_SIGFIG);
9150: unsigned long res = (newtot * TALLY_SIGFIG) / count;
9151: unsigned long ret = newtot / count;
9152:
9153: if ((res % TALLY_SIGFIG) > (TALLY_SIGFIG/2))
9154: return ret + 1;
9155: else
9156: return ret;
9157: }
9158: #endif
9159:
9160: static int
9161: bgp_table_stats_walker (struct thread *t)
9162: {
9163: struct bgp_node *rn;
9164: struct bgp_node *top;
9165: struct bgp_table_stats *ts = THREAD_ARG (t);
9166: unsigned int space = 0;
9167:
9168: if (!(top = bgp_table_top (ts->table)))
9169: return 0;
9170:
9171: switch (top->p.family)
9172: {
9173: case AF_INET:
9174: space = IPV4_MAX_BITLEN;
9175: break;
9176: case AF_INET6:
9177: space = IPV6_MAX_BITLEN;
9178: break;
9179: }
9180:
9181: ts->counts[BGP_STATS_MAXBITLEN] = space;
9182:
9183: for (rn = top; rn; rn = bgp_route_next (rn))
9184: {
9185: struct bgp_info *ri;
9186: struct bgp_node *prn = rn->parent;
9187: unsigned int rinum = 0;
9188:
9189: if (rn == top)
9190: continue;
9191:
9192: if (!rn->info)
9193: continue;
9194:
9195: ts->counts[BGP_STATS_PREFIXES]++;
9196: ts->counts[BGP_STATS_TOTPLEN] += rn->p.prefixlen;
9197:
9198: #if 0
9199: ts->counts[BGP_STATS_AVGPLEN]
9200: = ravg_tally (ts->counts[BGP_STATS_PREFIXES],
9201: ts->counts[BGP_STATS_AVGPLEN],
9202: rn->p.prefixlen);
9203: #endif
9204:
9205: /* check if the prefix is included by any other announcements */
9206: while (prn && !prn->info)
9207: prn = prn->parent;
9208:
9209: if (prn == NULL || prn == top)
9210: {
9211: ts->counts[BGP_STATS_UNAGGREGATEABLE]++;
9212: /* announced address space */
9213: if (space)
9214: ts->counts[BGP_STATS_SPACE] += 1 << (space - rn->p.prefixlen);
9215: }
9216: else if (prn->info)
9217: ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++;
9218:
9219: for (ri = rn->info; ri; ri = ri->next)
9220: {
9221: rinum++;
9222: ts->counts[BGP_STATS_RIB]++;
9223:
9224: if (ri->attr &&
9225: (CHECK_FLAG (ri->attr->flag,
9226: ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))))
9227: ts->counts[BGP_STATS_AGGREGATES]++;
9228:
9229: /* as-path stats */
9230: if (ri->attr && ri->attr->aspath)
9231: {
9232: unsigned int hops = aspath_count_hops (ri->attr->aspath);
9233: unsigned int size = aspath_size (ri->attr->aspath);
9234: as_t highest = aspath_highest (ri->attr->aspath);
9235:
9236: ts->counts[BGP_STATS_ASPATH_COUNT]++;
9237:
9238: if (hops > ts->counts[BGP_STATS_ASPATH_MAXHOPS])
9239: ts->counts[BGP_STATS_ASPATH_MAXHOPS] = hops;
9240:
9241: if (size > ts->counts[BGP_STATS_ASPATH_MAXSIZE])
9242: ts->counts[BGP_STATS_ASPATH_MAXSIZE] = size;
9243:
9244: ts->counts[BGP_STATS_ASPATH_TOTHOPS] += hops;
9245: ts->counts[BGP_STATS_ASPATH_TOTSIZE] += size;
9246: #if 0
9247: ts->counts[BGP_STATS_ASPATH_AVGHOPS]
9248: = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9249: ts->counts[BGP_STATS_ASPATH_AVGHOPS],
9250: hops);
9251: ts->counts[BGP_STATS_ASPATH_AVGSIZE]
9252: = ravg_tally (ts->counts[BGP_STATS_ASPATH_COUNT],
9253: ts->counts[BGP_STATS_ASPATH_AVGSIZE],
9254: size);
9255: #endif
9256: if (highest > ts->counts[BGP_STATS_ASN_HIGHEST])
9257: ts->counts[BGP_STATS_ASN_HIGHEST] = highest;
9258: }
9259: }
9260: }
9261: return 0;
9262: }
9263:
9264: static int
9265: bgp_table_stats (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi)
9266: {
9267: struct bgp_table_stats ts;
9268: unsigned int i;
9269:
9270: if (!bgp->rib[afi][safi])
9271: {
9272: vty_out (vty, "%% No RIB exist for the AFI/SAFI%s", VTY_NEWLINE);
9273: return CMD_WARNING;
9274: }
9275:
9276: memset (&ts, 0, sizeof (ts));
9277: ts.table = bgp->rib[afi][safi];
9278: thread_execute (bm->master, bgp_table_stats_walker, &ts, 0);
9279:
9280: vty_out (vty, "BGP %s RIB statistics%s%s",
9281: afi_safi_print (afi, safi), VTY_NEWLINE, VTY_NEWLINE);
9282:
9283: for (i = 0; i < BGP_STATS_MAX; i++)
9284: {
9285: if (!table_stats_strs[i])
9286: continue;
9287:
9288: switch (i)
9289: {
9290: #if 0
9291: case BGP_STATS_ASPATH_AVGHOPS:
9292: case BGP_STATS_ASPATH_AVGSIZE:
9293: case BGP_STATS_AVGPLEN:
9294: vty_out (vty, "%-30s: ", table_stats_strs[i]);
9295: vty_out (vty, "%12.2f",
9296: (float)ts.counts[i] / (float)TALLY_SIGFIG);
9297: break;
9298: #endif
9299: case BGP_STATS_ASPATH_TOTHOPS:
9300: case BGP_STATS_ASPATH_TOTSIZE:
9301: vty_out (vty, "%-30s: ", table_stats_strs[i]);
9302: vty_out (vty, "%12.2f",
9303: ts.counts[i] ?
9304: (float)ts.counts[i] /
9305: (float)ts.counts[BGP_STATS_ASPATH_COUNT]
9306: : 0);
9307: break;
9308: case BGP_STATS_TOTPLEN:
9309: vty_out (vty, "%-30s: ", table_stats_strs[i]);
9310: vty_out (vty, "%12.2f",
9311: ts.counts[i] ?
9312: (float)ts.counts[i] /
9313: (float)ts.counts[BGP_STATS_PREFIXES]
9314: : 0);
9315: break;
9316: case BGP_STATS_SPACE:
9317: vty_out (vty, "%-30s: ", table_stats_strs[i]);
9318: vty_out (vty, "%12llu%s", ts.counts[i], VTY_NEWLINE);
9319: if (ts.counts[BGP_STATS_MAXBITLEN] < 9)
9320: break;
9321: vty_out (vty, "%30s: ", "%% announced ");
9322: vty_out (vty, "%12.2f%s",
9323: 100 * (float)ts.counts[BGP_STATS_SPACE] /
9324: (float)((uint64_t)1UL << ts.counts[BGP_STATS_MAXBITLEN]),
9325: VTY_NEWLINE);
9326: vty_out (vty, "%30s: ", "/8 equivalent ");
9327: vty_out (vty, "%12.2f%s",
9328: (float)ts.counts[BGP_STATS_SPACE] /
9329: (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 8)),
9330: VTY_NEWLINE);
9331: if (ts.counts[BGP_STATS_MAXBITLEN] < 25)
9332: break;
9333: vty_out (vty, "%30s: ", "/24 equivalent ");
9334: vty_out (vty, "%12.2f",
9335: (float)ts.counts[BGP_STATS_SPACE] /
9336: (float)(1UL << (ts.counts[BGP_STATS_MAXBITLEN] - 24)));
9337: break;
9338: default:
9339: vty_out (vty, "%-30s: ", table_stats_strs[i]);
9340: vty_out (vty, "%12llu", ts.counts[i]);
9341: }
9342:
9343: vty_out (vty, "%s", VTY_NEWLINE);
9344: }
9345: return CMD_SUCCESS;
9346: }
9347:
9348: static int
9349: bgp_table_stats_vty (struct vty *vty, const char *name,
9350: const char *afi_str, const char *safi_str)
9351: {
9352: struct bgp *bgp;
9353: afi_t afi;
9354: safi_t safi;
9355:
9356: if (name)
9357: bgp = bgp_lookup_by_name (name);
9358: else
9359: bgp = bgp_get_default ();
9360:
9361: if (!bgp)
9362: {
9363: vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
9364: return CMD_WARNING;
9365: }
9366: if (strncmp (afi_str, "ipv", 3) == 0)
9367: {
9368: if (strncmp (afi_str, "ipv4", 4) == 0)
9369: afi = AFI_IP;
9370: else if (strncmp (afi_str, "ipv6", 4) == 0)
9371: afi = AFI_IP6;
9372: else
9373: {
9374: vty_out (vty, "%% Invalid address family %s%s",
9375: afi_str, VTY_NEWLINE);
9376: return CMD_WARNING;
9377: }
9378: if (strncmp (safi_str, "m", 1) == 0)
9379: safi = SAFI_MULTICAST;
9380: else if (strncmp (safi_str, "u", 1) == 0)
9381: safi = SAFI_UNICAST;
9382: else if (strncmp (safi_str, "vpnv4", 5) == 0)
9383: safi = BGP_SAFI_VPNV4;
9384: else if (strncmp (safi_str, "vpnv6", 6) == 0)
9385: safi = BGP_SAFI_VPNV6;
9386: else
9387: {
9388: vty_out (vty, "%% Invalid subsequent address family %s%s",
9389: safi_str, VTY_NEWLINE);
9390: return CMD_WARNING;
9391: }
9392: }
9393: else
9394: {
9395: vty_out (vty, "%% Invalid address family %s%s",
9396: afi_str, VTY_NEWLINE);
9397: return CMD_WARNING;
9398: }
9399:
9400: if ((afi == AFI_IP && safi == BGP_SAFI_VPNV6)
9401: || (afi == AFI_IP6 && safi == BGP_SAFI_VPNV4))
9402: {
9403: vty_out (vty, "%% Invalid subsequent address family %s for %s%s",
9404: afi_str, safi_str, VTY_NEWLINE);
9405: return CMD_WARNING;
9406: }
9407: return bgp_table_stats (vty, bgp, afi, safi);
9408: }
9409:
9410: DEFUN (show_bgp_statistics,
9411: show_bgp_statistics_cmd,
9412: "show bgp (ipv4|ipv6) (unicast|multicast) statistics",
9413: SHOW_STR
9414: BGP_STR
9415: "Address family\n"
9416: "Address family\n"
9417: "Address Family modifier\n"
9418: "Address Family modifier\n"
9419: "BGP RIB advertisement statistics\n")
9420: {
9421: return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9422: }
9423:
9424: ALIAS (show_bgp_statistics,
9425: show_bgp_statistics_vpnv4_cmd,
9426: "show bgp (ipv4) (vpnv4) statistics",
9427: SHOW_STR
9428: BGP_STR
9429: "Address family\n"
9430: "Address Family modifier\n"
9431: "BGP RIB advertisement statistics\n")
9432:
9433: DEFUN (show_bgp_statistics_view,
9434: show_bgp_statistics_view_cmd,
9435: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
9436: SHOW_STR
9437: BGP_STR
9438: "BGP view\n"
9439: "Address family\n"
9440: "Address family\n"
9441: "Address Family modifier\n"
9442: "Address Family modifier\n"
9443: "BGP RIB advertisement statistics\n")
9444: {
9445: return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
9446: }
9447:
9448: ALIAS (show_bgp_statistics_view,
9449: show_bgp_statistics_view_vpnv4_cmd,
9450: "show bgp view WORD (ipv4) (vpnv4) statistics",
9451: SHOW_STR
9452: BGP_STR
9453: "BGP view\n"
9454: "Address family\n"
9455: "Address Family modifier\n"
9456: "BGP RIB advertisement statistics\n")
9457:
9458: enum bgp_pcounts
9459: {
9460: PCOUNT_ADJ_IN = 0,
9461: PCOUNT_DAMPED,
9462: PCOUNT_REMOVED,
9463: PCOUNT_HISTORY,
9464: PCOUNT_STALE,
9465: PCOUNT_VALID,
9466: PCOUNT_ALL,
9467: PCOUNT_COUNTED,
9468: PCOUNT_PFCNT, /* the figure we display to users */
9469: PCOUNT_MAX,
9470: };
9471:
9472: static const char *pcount_strs[] =
9473: {
9474: [PCOUNT_ADJ_IN] = "Adj-in",
9475: [PCOUNT_DAMPED] = "Damped",
9476: [PCOUNT_REMOVED] = "Removed",
9477: [PCOUNT_HISTORY] = "History",
9478: [PCOUNT_STALE] = "Stale",
9479: [PCOUNT_VALID] = "Valid",
9480: [PCOUNT_ALL] = "All RIB",
9481: [PCOUNT_COUNTED] = "PfxCt counted",
9482: [PCOUNT_PFCNT] = "Useable",
9483: [PCOUNT_MAX] = NULL,
9484: };
9485:
9486: struct peer_pcounts
9487: {
9488: unsigned int count[PCOUNT_MAX];
9489: const struct peer *peer;
9490: const struct bgp_table *table;
9491: };
9492:
9493: static int
9494: bgp_peer_count_walker (struct thread *t)
9495: {
9496: struct bgp_node *rn;
9497: struct peer_pcounts *pc = THREAD_ARG (t);
9498: const struct peer *peer = pc->peer;
9499:
9500: for (rn = bgp_table_top (pc->table); rn; rn = bgp_route_next (rn))
9501: {
9502: struct bgp_adj_in *ain;
9503: struct bgp_info *ri;
9504:
9505: for (ain = rn->adj_in; ain; ain = ain->next)
9506: if (ain->peer == peer)
9507: pc->count[PCOUNT_ADJ_IN]++;
9508:
9509: for (ri = rn->info; ri; ri = ri->next)
9510: {
9511: char buf[SU_ADDRSTRLEN];
9512:
9513: if (ri->peer != peer)
9514: continue;
9515:
9516: pc->count[PCOUNT_ALL]++;
9517:
9518: if (CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
9519: pc->count[PCOUNT_DAMPED]++;
9520: if (CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
9521: pc->count[PCOUNT_HISTORY]++;
9522: if (CHECK_FLAG (ri->flags, BGP_INFO_REMOVED))
9523: pc->count[PCOUNT_REMOVED]++;
9524: if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
9525: pc->count[PCOUNT_STALE]++;
9526: if (CHECK_FLAG (ri->flags, BGP_INFO_VALID))
9527: pc->count[PCOUNT_VALID]++;
9528: if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9529: pc->count[PCOUNT_PFCNT]++;
9530:
9531: if (CHECK_FLAG (ri->flags, BGP_INFO_COUNTED))
9532: {
9533: pc->count[PCOUNT_COUNTED]++;
9534: if (CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9535: plog_warn (peer->log,
9536: "%s [pcount] %s/%d is counted but flags 0x%x",
9537: peer->host,
9538: inet_ntop(rn->p.family, &rn->p.u.prefix,
9539: buf, SU_ADDRSTRLEN),
9540: rn->p.prefixlen,
9541: ri->flags);
9542: }
9543: else
9544: {
9545: if (!CHECK_FLAG (ri->flags, BGP_INFO_UNUSEABLE))
9546: plog_warn (peer->log,
9547: "%s [pcount] %s/%d not counted but flags 0x%x",
9548: peer->host,
9549: inet_ntop(rn->p.family, &rn->p.u.prefix,
9550: buf, SU_ADDRSTRLEN),
9551: rn->p.prefixlen,
9552: ri->flags);
9553: }
9554: }
9555: }
9556: return 0;
9557: }
9558:
9559: static int
9560: bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
9561: {
9562: struct peer_pcounts pcounts = { .peer = peer };
9563: unsigned int i;
9564:
9565: if (!peer || !peer->bgp || !peer->afc[afi][safi]
9566: || !peer->bgp->rib[afi][safi])
9567: {
9568: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9569: return CMD_WARNING;
9570: }
9571:
9572: memset (&pcounts, 0, sizeof(pcounts));
9573: pcounts.peer = peer;
9574: pcounts.table = peer->bgp->rib[afi][safi];
9575:
9576: /* in-place call via thread subsystem so as to record execution time
9577: * stats for the thread-walk (i.e. ensure this can't be blamed on
9578: * on just vty_read()).
9579: */
9580: thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
9581:
9582: vty_out (vty, "Prefix counts for %s, %s%s",
9583: peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
9584: vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
9585: vty_out (vty, "%sCounts from RIB table walk:%s%s",
9586: VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
9587:
9588: for (i = 0; i < PCOUNT_MAX; i++)
9589: vty_out (vty, "%20s: %-10d%s",
9590: pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
9591:
9592: if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
9593: {
9594: vty_out (vty, "%s [pcount] PfxCt drift!%s",
9595: peer->host, VTY_NEWLINE);
9596: vty_out (vty, "Please report this bug, with the above command output%s",
9597: VTY_NEWLINE);
9598: }
9599:
9600: return CMD_SUCCESS;
9601: }
9602:
9603: DEFUN (show_ip_bgp_neighbor_prefix_counts,
9604: show_ip_bgp_neighbor_prefix_counts_cmd,
9605: "show ip bgp neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9606: SHOW_STR
9607: IP_STR
9608: BGP_STR
9609: "Detailed information on TCP and BGP neighbor connections\n"
9610: "Neighbor to display information about\n"
9611: "Neighbor to display information about\n"
9612: "Display detailed prefix count information\n")
9613: {
9614: struct peer *peer;
9615:
9616: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9617: if (! peer)
9618: return CMD_WARNING;
9619:
9620: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9621: }
9622:
9623: DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
9624: show_bgp_ipv6_neighbor_prefix_counts_cmd,
9625: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9626: SHOW_STR
9627: BGP_STR
9628: "Address family\n"
9629: "Detailed information on TCP and BGP neighbor connections\n"
9630: "Neighbor to display information about\n"
9631: "Neighbor to display information about\n"
9632: "Display detailed prefix count information\n")
9633: {
9634: struct peer *peer;
9635:
9636: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9637: if (! peer)
9638: return CMD_WARNING;
9639:
9640: return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
9641: }
9642:
9643: DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
9644: show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
9645: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9646: SHOW_STR
9647: IP_STR
9648: BGP_STR
9649: "Address family\n"
9650: "Address Family modifier\n"
9651: "Address Family modifier\n"
9652: "Detailed information on TCP and BGP neighbor connections\n"
9653: "Neighbor to display information about\n"
9654: "Neighbor to display information about\n"
9655: "Display detailed prefix count information\n")
9656: {
9657: struct peer *peer;
9658:
9659: peer = peer_lookup_in_view (vty, NULL, argv[1]);
9660: if (! peer)
9661: return CMD_WARNING;
9662:
9663: if (strncmp (argv[0], "m", 1) == 0)
9664: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
9665:
9666: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
9667: }
9668:
9669: DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
9670: show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
9671: "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X) prefix-counts",
9672: SHOW_STR
9673: IP_STR
9674: BGP_STR
9675: "Address family\n"
9676: "Address Family modifier\n"
9677: "Address Family modifier\n"
9678: "Detailed information on TCP and BGP neighbor connections\n"
9679: "Neighbor to display information about\n"
9680: "Neighbor to display information about\n"
9681: "Display detailed prefix count information\n")
9682: {
9683: struct peer *peer;
9684:
9685: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9686: if (! peer)
9687: return CMD_WARNING;
9688:
9689: return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
9690: }
9691:
9692:
9693: static void
9694: show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
9695: int in)
9696: {
9697: struct bgp_table *table;
9698: struct bgp_adj_in *ain;
9699: struct bgp_adj_out *adj;
9700: unsigned long output_count;
9701: struct bgp_node *rn;
9702: int header1 = 1;
9703: struct bgp *bgp;
9704: int header2 = 1;
9705:
9706: bgp = peer->bgp;
9707:
9708: if (! bgp)
9709: return;
9710:
9711: table = bgp->rib[afi][safi];
9712:
9713: output_count = 0;
9714:
9715: if (! in && CHECK_FLAG (peer->af_sflags[afi][safi],
9716: PEER_STATUS_DEFAULT_ORIGINATE))
9717: {
9718: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9719: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9720: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9721:
9722: vty_out (vty, "Originating default network 0.0.0.0%s%s",
9723: VTY_NEWLINE, VTY_NEWLINE);
9724: header1 = 0;
9725: }
9726:
9727: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
9728: if (in)
9729: {
9730: for (ain = rn->adj_in; ain; ain = ain->next)
9731: if (ain->peer == peer)
9732: {
9733: if (header1)
9734: {
9735: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9736: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9737: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9738: header1 = 0;
9739: }
9740: if (header2)
9741: {
9742: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9743: header2 = 0;
9744: }
9745: if (ain->attr)
9746: {
9747: route_vty_out_tmp (vty, &rn->p, ain->attr, safi);
9748: output_count++;
9749: }
9750: }
9751: }
9752: else
9753: {
9754: for (adj = rn->adj_out; adj; adj = adj->next)
9755: if (adj->peer == peer)
9756: {
9757: if (header1)
9758: {
9759: vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
9760: vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9761: vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
9762: header1 = 0;
9763: }
9764: if (header2)
9765: {
9766: vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
9767: header2 = 0;
9768: }
9769: if (adj->attr)
9770: {
9771: route_vty_out_tmp (vty, &rn->p, adj->attr, safi);
9772: output_count++;
9773: }
9774: }
9775: }
9776:
9777: if (output_count != 0)
9778: vty_out (vty, "%sTotal number of prefixes %ld%s",
9779: VTY_NEWLINE, output_count, VTY_NEWLINE);
9780: }
9781:
9782: static int
9783: peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, int in)
9784: {
9785: if (! peer || ! peer->afc[afi][safi])
9786: {
9787: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
9788: return CMD_WARNING;
9789: }
9790:
9791: if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9792: {
9793: vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
9794: VTY_NEWLINE);
9795: return CMD_WARNING;
9796: }
9797:
9798: show_adj_route (vty, peer, afi, safi, in);
9799:
9800: return CMD_SUCCESS;
9801: }
9802:
9803: DEFUN (show_ip_bgp_view_neighbor_advertised_route,
9804: show_ip_bgp_view_neighbor_advertised_route_cmd,
9805: "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9806: SHOW_STR
9807: IP_STR
9808: BGP_STR
9809: "BGP view\n"
9810: "View name\n"
9811: "Detailed information on TCP and BGP neighbor connections\n"
9812: "Neighbor to display information about\n"
9813: "Neighbor to display information about\n"
9814: "Display the routes advertised to a BGP neighbor\n")
9815: {
9816: struct peer *peer;
9817:
9818: if (argc == 2)
9819: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9820: else
9821: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9822:
9823: if (! peer)
9824: return CMD_WARNING;
9825:
9826: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9827: }
9828:
9829: ALIAS (show_ip_bgp_view_neighbor_advertised_route,
9830: show_ip_bgp_neighbor_advertised_route_cmd,
9831: "show ip bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9832: SHOW_STR
9833: IP_STR
9834: BGP_STR
9835: "Detailed information on TCP and BGP neighbor connections\n"
9836: "Neighbor to display information about\n"
9837: "Neighbor to display information about\n"
9838: "Display the routes advertised to a BGP neighbor\n")
9839:
9840: DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
9841: show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
9842: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9843: SHOW_STR
9844: IP_STR
9845: BGP_STR
9846: "Address family\n"
9847: "Address Family modifier\n"
9848: "Address Family modifier\n"
9849: "Detailed information on TCP and BGP neighbor connections\n"
9850: "Neighbor to display information about\n"
9851: "Neighbor to display information about\n"
9852: "Display the routes advertised to a BGP neighbor\n")
9853: {
9854: struct peer *peer;
9855:
9856: peer = peer_lookup_in_view (vty, NULL, argv[1]);
9857: if (! peer)
9858: return CMD_WARNING;
9859:
9860: if (strncmp (argv[0], "m", 1) == 0)
9861: return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0);
9862:
9863: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0);
9864: }
9865:
9866: #ifdef HAVE_IPV6
9867: DEFUN (show_bgp_view_neighbor_advertised_route,
9868: show_bgp_view_neighbor_advertised_route_cmd,
9869: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9870: SHOW_STR
9871: BGP_STR
9872: "BGP view\n"
9873: "View name\n"
9874: "Detailed information on TCP and BGP neighbor connections\n"
9875: "Neighbor to display information about\n"
9876: "Neighbor to display information about\n"
9877: "Display the routes advertised to a BGP neighbor\n")
9878: {
9879: struct peer *peer;
9880:
9881: if (argc == 2)
9882: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9883: else
9884: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9885:
9886: if (! peer)
9887: return CMD_WARNING;
9888:
9889: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0);
9890: }
9891:
9892: ALIAS (show_bgp_view_neighbor_advertised_route,
9893: show_bgp_view_ipv6_neighbor_advertised_route_cmd,
9894: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9895: SHOW_STR
9896: BGP_STR
9897: "BGP view\n"
9898: "View name\n"
9899: "Address family\n"
9900: "Detailed information on TCP and BGP neighbor connections\n"
9901: "Neighbor to display information about\n"
9902: "Neighbor to display information about\n"
9903: "Display the routes advertised to a BGP neighbor\n")
9904:
9905: DEFUN (show_bgp_view_neighbor_received_routes,
9906: show_bgp_view_neighbor_received_routes_cmd,
9907: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
9908: SHOW_STR
9909: BGP_STR
9910: "BGP view\n"
9911: "View name\n"
9912: "Detailed information on TCP and BGP neighbor connections\n"
9913: "Neighbor to display information about\n"
9914: "Neighbor to display information about\n"
9915: "Display the received routes from neighbor\n")
9916: {
9917: struct peer *peer;
9918:
9919: if (argc == 2)
9920: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
9921: else
9922: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9923:
9924: if (! peer)
9925: return CMD_WARNING;
9926:
9927: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1);
9928: }
9929:
9930: ALIAS (show_bgp_view_neighbor_received_routes,
9931: show_bgp_view_ipv6_neighbor_received_routes_cmd,
9932: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
9933: SHOW_STR
9934: BGP_STR
9935: "BGP view\n"
9936: "View name\n"
9937: "Address family\n"
9938: "Detailed information on TCP and BGP neighbor connections\n"
9939: "Neighbor to display information about\n"
9940: "Neighbor to display information about\n"
9941: "Display the received routes from neighbor\n")
9942:
9943: ALIAS (show_bgp_view_neighbor_advertised_route,
9944: show_bgp_neighbor_advertised_route_cmd,
9945: "show bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9946: SHOW_STR
9947: BGP_STR
9948: "Detailed information on TCP and BGP neighbor connections\n"
9949: "Neighbor to display information about\n"
9950: "Neighbor to display information about\n"
9951: "Display the routes advertised to a BGP neighbor\n")
9952:
9953: ALIAS (show_bgp_view_neighbor_advertised_route,
9954: show_bgp_ipv6_neighbor_advertised_route_cmd,
9955: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9956: SHOW_STR
9957: BGP_STR
9958: "Address family\n"
9959: "Detailed information on TCP and BGP neighbor connections\n"
9960: "Neighbor to display information about\n"
9961: "Neighbor to display information about\n"
9962: "Display the routes advertised to a BGP neighbor\n")
9963:
9964: /* old command */
9965: ALIAS (show_bgp_view_neighbor_advertised_route,
9966: ipv6_bgp_neighbor_advertised_route_cmd,
9967: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9968: SHOW_STR
9969: IPV6_STR
9970: BGP_STR
9971: "Detailed information on TCP and BGP neighbor connections\n"
9972: "Neighbor to display information about\n"
9973: "Neighbor to display information about\n"
9974: "Display the routes advertised to a BGP neighbor\n")
9975:
9976: /* old command */
9977: DEFUN (ipv6_mbgp_neighbor_advertised_route,
9978: ipv6_mbgp_neighbor_advertised_route_cmd,
9979: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) advertised-routes",
9980: SHOW_STR
9981: IPV6_STR
9982: MBGP_STR
9983: "Detailed information on TCP and BGP neighbor connections\n"
9984: "Neighbor to display information about\n"
9985: "Neighbor to display information about\n"
9986: "Display the routes advertised to a BGP neighbor\n")
9987: {
9988: struct peer *peer;
9989:
9990: peer = peer_lookup_in_view (vty, NULL, argv[0]);
9991: if (! peer)
9992: return CMD_WARNING;
9993:
9994: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0);
9995: }
9996: #endif /* HAVE_IPV6 */
9997:
9998: DEFUN (show_ip_bgp_view_neighbor_received_routes,
9999: show_ip_bgp_view_neighbor_received_routes_cmd,
10000: "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X) received-routes",
10001: SHOW_STR
10002: IP_STR
10003: BGP_STR
10004: "BGP view\n"
10005: "View name\n"
10006: "Detailed information on TCP and BGP neighbor connections\n"
10007: "Neighbor to display information about\n"
10008: "Neighbor to display information about\n"
10009: "Display the received routes from neighbor\n")
10010: {
10011: struct peer *peer;
10012:
10013: if (argc == 2)
10014: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10015: else
10016: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10017:
10018: if (! peer)
10019: return CMD_WARNING;
10020:
10021: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
10022: }
10023:
10024: ALIAS (show_ip_bgp_view_neighbor_received_routes,
10025: show_ip_bgp_neighbor_received_routes_cmd,
10026: "show ip bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10027: SHOW_STR
10028: IP_STR
10029: BGP_STR
10030: "Detailed information on TCP and BGP neighbor connections\n"
10031: "Neighbor to display information about\n"
10032: "Neighbor to display information about\n"
10033: "Display the received routes from neighbor\n")
10034:
10035: DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
10036: show_ip_bgp_ipv4_neighbor_received_routes_cmd,
10037: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received-routes",
10038: SHOW_STR
10039: IP_STR
10040: BGP_STR
10041: "Address family\n"
10042: "Address Family modifier\n"
10043: "Address Family modifier\n"
10044: "Detailed information on TCP and BGP neighbor connections\n"
10045: "Neighbor to display information about\n"
10046: "Neighbor to display information about\n"
10047: "Display the received routes from neighbor\n")
10048: {
10049: struct peer *peer;
10050:
10051: peer = peer_lookup_in_view (vty, NULL, argv[1]);
10052: if (! peer)
10053: return CMD_WARNING;
10054:
10055: if (strncmp (argv[0], "m", 1) == 0)
10056: return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1);
10057:
10058: return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1);
10059: }
10060:
10061: DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
10062: show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
10063: #ifdef HAVE_IPV6
10064: "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10065: #else
10066: "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
10067: #endif
10068: SHOW_STR
10069: BGP_STR
10070: "BGP view\n"
10071: "BGP view name\n"
10072: "Address family\n"
10073: #ifdef HAVE_IPV6
10074: "Address family\n"
10075: #endif
10076: "Address family modifier\n"
10077: "Address family modifier\n"
10078: "Detailed information on TCP and BGP neighbor connections\n"
10079: "Neighbor to display information about\n"
10080: "Neighbor to display information about\n"
10081: "Display the advertised routes to neighbor\n"
10082: "Display the received routes from neighbor\n")
10083: {
10084: int afi;
10085: int safi;
10086: int in;
10087: struct peer *peer;
10088:
10089: #ifdef HAVE_IPV6
10090: peer = peer_lookup_in_view (vty, argv[0], argv[3]);
10091: #else
10092: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10093: #endif
10094:
10095: if (! peer)
10096: return CMD_WARNING;
10097:
10098: #ifdef HAVE_IPV6
10099: afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
10100: safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10101: in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
10102: #else
10103: afi = AFI_IP;
10104: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10105: in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
10106: #endif
10107:
10108: return peer_adj_routes (vty, peer, afi, safi, in);
10109: }
10110:
10111: DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
10112: show_ip_bgp_neighbor_received_prefix_filter_cmd,
10113: "show ip bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10114: SHOW_STR
10115: IP_STR
10116: BGP_STR
10117: "Detailed information on TCP and BGP neighbor connections\n"
10118: "Neighbor to display information about\n"
10119: "Neighbor to display information about\n"
10120: "Display information received from a BGP neighbor\n"
10121: "Display the prefixlist filter\n")
10122: {
10123: char name[BUFSIZ];
10124: union sockunion *su;
10125: struct peer *peer;
10126: int count;
10127:
10128: su = sockunion_str2su (argv[0]);
10129: if (su == NULL)
10130: return CMD_WARNING;
10131:
10132: peer = peer_lookup (NULL, su);
10133: if (! peer)
10134: return CMD_WARNING;
10135:
10136: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10137: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10138: if (count)
10139: {
10140: vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10141: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10142: }
10143:
10144: return CMD_SUCCESS;
10145: }
10146:
10147: DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
10148: show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
10149: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10150: SHOW_STR
10151: IP_STR
10152: BGP_STR
10153: "Address family\n"
10154: "Address Family modifier\n"
10155: "Address Family modifier\n"
10156: "Detailed information on TCP and BGP neighbor connections\n"
10157: "Neighbor to display information about\n"
10158: "Neighbor to display information about\n"
10159: "Display information received from a BGP neighbor\n"
10160: "Display the prefixlist filter\n")
10161: {
10162: char name[BUFSIZ];
10163: union sockunion *su;
10164: struct peer *peer;
10165: int count;
10166:
10167: su = sockunion_str2su (argv[1]);
10168: if (su == NULL)
10169: return CMD_WARNING;
10170:
10171: peer = peer_lookup (NULL, su);
10172: if (! peer)
10173: return CMD_WARNING;
10174:
10175: if (strncmp (argv[0], "m", 1) == 0)
10176: {
10177: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
10178: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10179: if (count)
10180: {
10181: vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
10182: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10183: }
10184: }
10185: else
10186: {
10187: sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
10188: count = prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
10189: if (count)
10190: {
10191: vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
10192: prefix_bgp_show_prefix_list (vty, AFI_IP, name);
10193: }
10194: }
10195:
10196: return CMD_SUCCESS;
10197: }
10198:
10199:
10200: #ifdef HAVE_IPV6
10201: ALIAS (show_bgp_view_neighbor_received_routes,
10202: show_bgp_neighbor_received_routes_cmd,
10203: "show bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10204: SHOW_STR
10205: BGP_STR
10206: "Detailed information on TCP and BGP neighbor connections\n"
10207: "Neighbor to display information about\n"
10208: "Neighbor to display information about\n"
10209: "Display the received routes from neighbor\n")
10210:
10211: ALIAS (show_bgp_view_neighbor_received_routes,
10212: show_bgp_ipv6_neighbor_received_routes_cmd,
10213: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received-routes",
10214: SHOW_STR
10215: BGP_STR
10216: "Address family\n"
10217: "Detailed information on TCP and BGP neighbor connections\n"
10218: "Neighbor to display information about\n"
10219: "Neighbor to display information about\n"
10220: "Display the received routes from neighbor\n")
10221:
10222: DEFUN (show_bgp_neighbor_received_prefix_filter,
10223: show_bgp_neighbor_received_prefix_filter_cmd,
10224: "show bgp neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10225: SHOW_STR
10226: BGP_STR
10227: "Detailed information on TCP and BGP neighbor connections\n"
10228: "Neighbor to display information about\n"
10229: "Neighbor to display information about\n"
10230: "Display information received from a BGP neighbor\n"
10231: "Display the prefixlist filter\n")
10232: {
10233: char name[BUFSIZ];
10234: union sockunion *su;
10235: struct peer *peer;
10236: int count;
10237:
10238: su = sockunion_str2su (argv[0]);
10239: if (su == NULL)
10240: return CMD_WARNING;
10241:
10242: peer = peer_lookup (NULL, su);
10243: if (! peer)
10244: return CMD_WARNING;
10245:
10246: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10247: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10248: if (count)
10249: {
10250: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10251: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10252: }
10253:
10254: return CMD_SUCCESS;
10255: }
10256:
10257: ALIAS (show_bgp_neighbor_received_prefix_filter,
10258: show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
10259: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10260: SHOW_STR
10261: BGP_STR
10262: "Address family\n"
10263: "Detailed information on TCP and BGP neighbor connections\n"
10264: "Neighbor to display information about\n"
10265: "Neighbor to display information about\n"
10266: "Display information received from a BGP neighbor\n"
10267: "Display the prefixlist filter\n")
10268:
10269: /* old command */
10270: ALIAS (show_bgp_view_neighbor_received_routes,
10271: ipv6_bgp_neighbor_received_routes_cmd,
10272: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10273: SHOW_STR
10274: IPV6_STR
10275: BGP_STR
10276: "Detailed information on TCP and BGP neighbor connections\n"
10277: "Neighbor to display information about\n"
10278: "Neighbor to display information about\n"
10279: "Display the received routes from neighbor\n")
10280:
10281: /* old command */
10282: DEFUN (ipv6_mbgp_neighbor_received_routes,
10283: ipv6_mbgp_neighbor_received_routes_cmd,
10284: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) received-routes",
10285: SHOW_STR
10286: IPV6_STR
10287: MBGP_STR
10288: "Detailed information on TCP and BGP neighbor connections\n"
10289: "Neighbor to display information about\n"
10290: "Neighbor to display information about\n"
10291: "Display the received routes from neighbor\n")
10292: {
10293: struct peer *peer;
10294:
10295: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10296: if (! peer)
10297: return CMD_WARNING;
10298:
10299: return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1);
10300: }
10301:
10302: DEFUN (show_bgp_view_neighbor_received_prefix_filter,
10303: show_bgp_view_neighbor_received_prefix_filter_cmd,
10304: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10305: SHOW_STR
10306: BGP_STR
10307: "BGP view\n"
10308: "View name\n"
10309: "Detailed information on TCP and BGP neighbor connections\n"
10310: "Neighbor to display information about\n"
10311: "Neighbor to display information about\n"
10312: "Display information received from a BGP neighbor\n"
10313: "Display the prefixlist filter\n")
10314: {
10315: char name[BUFSIZ];
10316: union sockunion *su;
10317: struct peer *peer;
10318: struct bgp *bgp;
10319: int count;
10320:
10321: /* BGP structure lookup. */
10322: bgp = bgp_lookup_by_name (argv[0]);
10323: if (bgp == NULL)
10324: {
10325: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10326: return CMD_WARNING;
10327: }
10328:
10329: su = sockunion_str2su (argv[1]);
10330: if (su == NULL)
10331: return CMD_WARNING;
10332:
10333: peer = peer_lookup (bgp, su);
10334: if (! peer)
10335: return CMD_WARNING;
10336:
10337: sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
10338: count = prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
10339: if (count)
10340: {
10341: vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
10342: prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
10343: }
10344:
10345: return CMD_SUCCESS;
10346: }
10347:
10348: ALIAS (show_bgp_view_neighbor_received_prefix_filter,
10349: show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
10350: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) received prefix-filter",
10351: SHOW_STR
10352: BGP_STR
10353: "BGP view\n"
10354: "View name\n"
10355: "Address family\n"
10356: "Detailed information on TCP and BGP neighbor connections\n"
10357: "Neighbor to display information about\n"
10358: "Neighbor to display information about\n"
10359: "Display information received from a BGP neighbor\n"
10360: "Display the prefixlist filter\n")
10361: #endif /* HAVE_IPV6 */
10362:
10363: static int
10364: bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
10365: safi_t safi, enum bgp_show_type type)
10366: {
10367: if (! peer || ! peer->afc[afi][safi])
10368: {
10369: vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
10370: return CMD_WARNING;
10371: }
10372:
10373: return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su);
10374: }
10375:
10376: DEFUN (show_ip_bgp_neighbor_routes,
10377: show_ip_bgp_neighbor_routes_cmd,
10378: "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes",
10379: SHOW_STR
10380: IP_STR
10381: BGP_STR
10382: "Detailed information on TCP and BGP neighbor connections\n"
10383: "Neighbor to display information about\n"
10384: "Neighbor to display information about\n"
10385: "Display routes learned from neighbor\n")
10386: {
10387: struct peer *peer;
10388:
10389: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10390: if (! peer)
10391: return CMD_WARNING;
10392:
10393: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10394: bgp_show_type_neighbor);
10395: }
10396:
10397: DEFUN (show_ip_bgp_neighbor_flap,
10398: show_ip_bgp_neighbor_flap_cmd,
10399: "show ip bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10400: SHOW_STR
10401: IP_STR
10402: BGP_STR
10403: "Detailed information on TCP and BGP neighbor connections\n"
10404: "Neighbor to display information about\n"
10405: "Neighbor to display information about\n"
10406: "Display flap statistics of the routes learned from neighbor\n")
10407: {
10408: struct peer *peer;
10409:
10410: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10411: if (! peer)
10412: return CMD_WARNING;
10413:
10414: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10415: bgp_show_type_flap_neighbor);
10416: }
10417:
10418: DEFUN (show_ip_bgp_neighbor_damp,
10419: show_ip_bgp_neighbor_damp_cmd,
10420: "show ip bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10421: SHOW_STR
10422: IP_STR
10423: BGP_STR
10424: "Detailed information on TCP and BGP neighbor connections\n"
10425: "Neighbor to display information about\n"
10426: "Neighbor to display information about\n"
10427: "Display the dampened routes received from neighbor\n")
10428: {
10429: struct peer *peer;
10430:
10431: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10432: if (! peer)
10433: return CMD_WARNING;
10434:
10435: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10436: bgp_show_type_damp_neighbor);
10437: }
10438:
10439: DEFUN (show_ip_bgp_ipv4_neighbor_routes,
10440: show_ip_bgp_ipv4_neighbor_routes_cmd,
10441: "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes",
10442: SHOW_STR
10443: IP_STR
10444: BGP_STR
10445: "Address family\n"
10446: "Address Family modifier\n"
10447: "Address Family modifier\n"
10448: "Detailed information on TCP and BGP neighbor connections\n"
10449: "Neighbor to display information about\n"
10450: "Neighbor to display information about\n"
10451: "Display routes learned from neighbor\n")
10452: {
10453: struct peer *peer;
10454:
10455: peer = peer_lookup_in_view (vty, NULL, argv[1]);
10456: if (! peer)
10457: return CMD_WARNING;
10458:
10459: if (strncmp (argv[0], "m", 1) == 0)
10460: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
10461: bgp_show_type_neighbor);
10462:
10463: return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
10464: bgp_show_type_neighbor);
10465: }
10466:
10467: DEFUN (show_ip_bgp_view_rsclient,
10468: show_ip_bgp_view_rsclient_cmd,
10469: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
10470: SHOW_STR
10471: IP_STR
10472: BGP_STR
10473: "BGP view\n"
10474: "BGP view name\n"
10475: "Information about Route Server Client\n"
10476: NEIGHBOR_ADDR_STR)
10477: {
10478: struct bgp_table *table;
10479: struct peer *peer;
10480:
10481: if (argc == 2)
10482: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10483: else
10484: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10485:
10486: if (! peer)
10487: return CMD_WARNING;
10488:
10489: if (! peer->afc[AFI_IP][SAFI_UNICAST])
10490: {
10491: vty_out (vty, "%% Activate the neighbor for the address family first%s",
10492: VTY_NEWLINE);
10493: return CMD_WARNING;
10494: }
10495:
10496: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10497: PEER_FLAG_RSERVER_CLIENT))
10498: {
10499: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10500: VTY_NEWLINE);
10501: return CMD_WARNING;
10502: }
10503:
10504: table = peer->rib[AFI_IP][SAFI_UNICAST];
10505:
10506: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10507: }
10508:
10509: ALIAS (show_ip_bgp_view_rsclient,
10510: show_ip_bgp_rsclient_cmd,
10511: "show ip bgp rsclient (A.B.C.D|X:X::X:X)",
10512: SHOW_STR
10513: IP_STR
10514: BGP_STR
10515: "Information about Route Server Client\n"
10516: NEIGHBOR_ADDR_STR)
10517:
10518: DEFUN (show_bgp_view_ipv4_safi_rsclient,
10519: show_bgp_view_ipv4_safi_rsclient_cmd,
10520: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10521: SHOW_STR
10522: BGP_STR
10523: "BGP view\n"
10524: "BGP view name\n"
10525: "Address family\n"
10526: "Address Family modifier\n"
10527: "Address Family modifier\n"
10528: "Information about Route Server Client\n"
10529: NEIGHBOR_ADDR_STR)
10530: {
10531: struct bgp_table *table;
10532: struct peer *peer;
10533: safi_t safi;
10534:
10535: if (argc == 3) {
10536: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10537: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10538: } else {
10539: peer = peer_lookup_in_view (vty, NULL, argv[1]);
10540: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10541: }
10542:
10543: if (! peer)
10544: return CMD_WARNING;
10545:
10546: if (! peer->afc[AFI_IP][safi])
10547: {
10548: vty_out (vty, "%% Activate the neighbor for the address family first%s",
10549: VTY_NEWLINE);
10550: return CMD_WARNING;
10551: }
10552:
10553: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10554: PEER_FLAG_RSERVER_CLIENT))
10555: {
10556: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10557: VTY_NEWLINE);
10558: return CMD_WARNING;
10559: }
10560:
10561: table = peer->rib[AFI_IP][safi];
10562:
10563: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
10564: }
10565:
10566: ALIAS (show_bgp_view_ipv4_safi_rsclient,
10567: show_bgp_ipv4_safi_rsclient_cmd,
10568: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
10569: SHOW_STR
10570: BGP_STR
10571: "Address family\n"
10572: "Address Family modifier\n"
10573: "Address Family modifier\n"
10574: "Information about Route Server Client\n"
10575: NEIGHBOR_ADDR_STR)
10576:
10577: DEFUN (show_ip_bgp_view_rsclient_route,
10578: show_ip_bgp_view_rsclient_route_cmd,
10579: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10580: SHOW_STR
10581: IP_STR
10582: BGP_STR
10583: "BGP view\n"
10584: "BGP view name\n"
10585: "Information about Route Server Client\n"
10586: NEIGHBOR_ADDR_STR
10587: "Network in the BGP routing table to display\n")
10588: {
10589: struct bgp *bgp;
10590: struct peer *peer;
10591:
10592: /* BGP structure lookup. */
10593: if (argc == 3)
10594: {
10595: bgp = bgp_lookup_by_name (argv[0]);
10596: if (bgp == NULL)
10597: {
10598: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10599: return CMD_WARNING;
10600: }
10601: }
10602: else
10603: {
10604: bgp = bgp_get_default ();
10605: if (bgp == NULL)
10606: {
10607: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10608: return CMD_WARNING;
10609: }
10610: }
10611:
10612: if (argc == 3)
10613: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10614: else
10615: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10616:
10617: if (! peer)
10618: return CMD_WARNING;
10619:
10620: if (! peer->afc[AFI_IP][SAFI_UNICAST])
10621: {
10622: vty_out (vty, "%% Activate the neighbor for the address family first%s",
10623: VTY_NEWLINE);
10624: return CMD_WARNING;
10625: }
10626:
10627: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10628: PEER_FLAG_RSERVER_CLIENT))
10629: {
10630: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10631: VTY_NEWLINE);
10632: return CMD_WARNING;
10633: }
10634:
10635: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10636: (argc == 3) ? argv[2] : argv[1],
10637: AFI_IP, SAFI_UNICAST, NULL, 0);
10638: }
10639:
10640: ALIAS (show_ip_bgp_view_rsclient_route,
10641: show_ip_bgp_rsclient_route_cmd,
10642: "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10643: SHOW_STR
10644: IP_STR
10645: BGP_STR
10646: "Information about Route Server Client\n"
10647: NEIGHBOR_ADDR_STR
10648: "Network in the BGP routing table to display\n")
10649:
10650: DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
10651: show_bgp_view_ipv4_safi_rsclient_route_cmd,
10652: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10653: SHOW_STR
10654: BGP_STR
10655: "BGP view\n"
10656: "BGP view name\n"
10657: "Address family\n"
10658: "Address Family modifier\n"
10659: "Address Family modifier\n"
10660: "Information about Route Server Client\n"
10661: NEIGHBOR_ADDR_STR
10662: "Network in the BGP routing table to display\n")
10663: {
10664: struct bgp *bgp;
10665: struct peer *peer;
10666: safi_t safi;
10667:
10668: /* BGP structure lookup. */
10669: if (argc == 4)
10670: {
10671: bgp = bgp_lookup_by_name (argv[0]);
10672: if (bgp == NULL)
10673: {
10674: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10675: return CMD_WARNING;
10676: }
10677: }
10678: else
10679: {
10680: bgp = bgp_get_default ();
10681: if (bgp == NULL)
10682: {
10683: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10684: return CMD_WARNING;
10685: }
10686: }
10687:
10688: if (argc == 4) {
10689: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10690: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10691: } else {
10692: peer = peer_lookup_in_view (vty, NULL, argv[1]);
10693: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10694: }
10695:
10696: if (! peer)
10697: return CMD_WARNING;
10698:
10699: if (! peer->afc[AFI_IP][safi])
10700: {
10701: vty_out (vty, "%% Activate the neighbor for the address family first%s",
10702: VTY_NEWLINE);
10703: return CMD_WARNING;
10704: }
10705:
10706: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10707: PEER_FLAG_RSERVER_CLIENT))
10708: {
10709: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10710: VTY_NEWLINE);
10711: return CMD_WARNING;
10712: }
10713:
10714: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10715: (argc == 4) ? argv[3] : argv[2],
10716: AFI_IP, safi, NULL, 0);
10717: }
10718:
10719: ALIAS (show_bgp_view_ipv4_safi_rsclient_route,
10720: show_bgp_ipv4_safi_rsclient_route_cmd,
10721: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D",
10722: SHOW_STR
10723: BGP_STR
10724: "Address family\n"
10725: "Address Family modifier\n"
10726: "Address Family modifier\n"
10727: "Information about Route Server Client\n"
10728: NEIGHBOR_ADDR_STR
10729: "Network in the BGP routing table to display\n")
10730:
10731: DEFUN (show_ip_bgp_view_rsclient_prefix,
10732: show_ip_bgp_view_rsclient_prefix_cmd,
10733: "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10734: SHOW_STR
10735: IP_STR
10736: BGP_STR
10737: "BGP view\n"
10738: "BGP view name\n"
10739: "Information about Route Server Client\n"
10740: NEIGHBOR_ADDR_STR
10741: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10742: {
10743: struct bgp *bgp;
10744: struct peer *peer;
10745:
10746: /* BGP structure lookup. */
10747: if (argc == 3)
10748: {
10749: bgp = bgp_lookup_by_name (argv[0]);
10750: if (bgp == NULL)
10751: {
10752: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10753: return CMD_WARNING;
10754: }
10755: }
10756: else
10757: {
10758: bgp = bgp_get_default ();
10759: if (bgp == NULL)
10760: {
10761: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10762: return CMD_WARNING;
10763: }
10764: }
10765:
10766: if (argc == 3)
10767: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10768: else
10769: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10770:
10771: if (! peer)
10772: return CMD_WARNING;
10773:
10774: if (! peer->afc[AFI_IP][SAFI_UNICAST])
10775: {
10776: vty_out (vty, "%% Activate the neighbor for the address family first%s",
10777: VTY_NEWLINE);
10778: return CMD_WARNING;
10779: }
10780:
10781: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
10782: PEER_FLAG_RSERVER_CLIENT))
10783: {
10784: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10785: VTY_NEWLINE);
10786: return CMD_WARNING;
10787: }
10788:
10789: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][SAFI_UNICAST],
10790: (argc == 3) ? argv[2] : argv[1],
10791: AFI_IP, SAFI_UNICAST, NULL, 1);
10792: }
10793:
10794: ALIAS (show_ip_bgp_view_rsclient_prefix,
10795: show_ip_bgp_rsclient_prefix_cmd,
10796: "show ip bgp rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10797: SHOW_STR
10798: IP_STR
10799: BGP_STR
10800: "Information about Route Server Client\n"
10801: NEIGHBOR_ADDR_STR
10802: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10803:
10804: DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
10805: show_bgp_view_ipv4_safi_rsclient_prefix_cmd,
10806: "show bgp view WORD ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10807: SHOW_STR
10808: BGP_STR
10809: "BGP view\n"
10810: "BGP view name\n"
10811: "Address family\n"
10812: "Address Family modifier\n"
10813: "Address Family modifier\n"
10814: "Information about Route Server Client\n"
10815: NEIGHBOR_ADDR_STR
10816: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10817: {
10818: struct bgp *bgp;
10819: struct peer *peer;
10820: safi_t safi;
10821:
10822: /* BGP structure lookup. */
10823: if (argc == 4)
10824: {
10825: bgp = bgp_lookup_by_name (argv[0]);
10826: if (bgp == NULL)
10827: {
10828: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
10829: return CMD_WARNING;
10830: }
10831: }
10832: else
10833: {
10834: bgp = bgp_get_default ();
10835: if (bgp == NULL)
10836: {
10837: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
10838: return CMD_WARNING;
10839: }
10840: }
10841:
10842: if (argc == 4) {
10843: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
10844: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10845: } else {
10846: peer = peer_lookup_in_view (vty, NULL, argv[1]);
10847: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
10848: }
10849:
10850: if (! peer)
10851: return CMD_WARNING;
10852:
10853: if (! peer->afc[AFI_IP][safi])
10854: {
10855: vty_out (vty, "%% Activate the neighbor for the address family first%s",
10856: VTY_NEWLINE);
10857: return CMD_WARNING;
10858: }
10859:
10860: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP][safi],
10861: PEER_FLAG_RSERVER_CLIENT))
10862: {
10863: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
10864: VTY_NEWLINE);
10865: return CMD_WARNING;
10866: }
10867:
10868: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP][safi],
10869: (argc == 4) ? argv[3] : argv[2],
10870: AFI_IP, safi, NULL, 1);
10871: }
10872:
10873: ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
10874: show_bgp_ipv4_safi_rsclient_prefix_cmd,
10875: "show bgp ipv4 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M",
10876: SHOW_STR
10877: BGP_STR
10878: "Address family\n"
10879: "Address Family modifier\n"
10880: "Address Family modifier\n"
10881: "Information about Route Server Client\n"
10882: NEIGHBOR_ADDR_STR
10883: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
10884:
10885: #ifdef HAVE_IPV6
10886: DEFUN (show_bgp_view_neighbor_routes,
10887: show_bgp_view_neighbor_routes_cmd,
10888: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) routes",
10889: SHOW_STR
10890: BGP_STR
10891: "BGP view\n"
10892: "BGP view name\n"
10893: "Detailed information on TCP and BGP neighbor connections\n"
10894: "Neighbor to display information about\n"
10895: "Neighbor to display information about\n"
10896: "Display routes learned from neighbor\n")
10897: {
10898: struct peer *peer;
10899:
10900: if (argc == 2)
10901: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10902: else
10903: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10904:
10905: if (! peer)
10906: return CMD_WARNING;
10907:
10908: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10909: bgp_show_type_neighbor);
10910: }
10911:
10912: ALIAS (show_bgp_view_neighbor_routes,
10913: show_bgp_view_ipv6_neighbor_routes_cmd,
10914: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
10915: SHOW_STR
10916: BGP_STR
10917: "BGP view\n"
10918: "BGP view name\n"
10919: "Address family\n"
10920: "Detailed information on TCP and BGP neighbor connections\n"
10921: "Neighbor to display information about\n"
10922: "Neighbor to display information about\n"
10923: "Display routes learned from neighbor\n")
10924:
10925: DEFUN (show_bgp_view_neighbor_damp,
10926: show_bgp_view_neighbor_damp_cmd,
10927: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10928: SHOW_STR
10929: BGP_STR
10930: "BGP view\n"
10931: "BGP view name\n"
10932: "Detailed information on TCP and BGP neighbor connections\n"
10933: "Neighbor to display information about\n"
10934: "Neighbor to display information about\n"
10935: "Display the dampened routes received from neighbor\n")
10936: {
10937: struct peer *peer;
10938:
10939: if (argc == 2)
10940: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10941: else
10942: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10943:
10944: if (! peer)
10945: return CMD_WARNING;
10946:
10947: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10948: bgp_show_type_damp_neighbor);
10949: }
10950:
10951: ALIAS (show_bgp_view_neighbor_damp,
10952: show_bgp_view_ipv6_neighbor_damp_cmd,
10953: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
10954: SHOW_STR
10955: BGP_STR
10956: "BGP view\n"
10957: "BGP view name\n"
10958: "Address family\n"
10959: "Detailed information on TCP and BGP neighbor connections\n"
10960: "Neighbor to display information about\n"
10961: "Neighbor to display information about\n"
10962: "Display the dampened routes received from neighbor\n")
10963:
10964: DEFUN (show_bgp_view_neighbor_flap,
10965: show_bgp_view_neighbor_flap_cmd,
10966: "show bgp view WORD neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10967: SHOW_STR
10968: BGP_STR
10969: "BGP view\n"
10970: "BGP view name\n"
10971: "Detailed information on TCP and BGP neighbor connections\n"
10972: "Neighbor to display information about\n"
10973: "Neighbor to display information about\n"
10974: "Display flap statistics of the routes learned from neighbor\n")
10975: {
10976: struct peer *peer;
10977:
10978: if (argc == 2)
10979: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
10980: else
10981: peer = peer_lookup_in_view (vty, NULL, argv[0]);
10982:
10983: if (! peer)
10984: return CMD_WARNING;
10985:
10986: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
10987: bgp_show_type_flap_neighbor);
10988: }
10989:
10990: ALIAS (show_bgp_view_neighbor_flap,
10991: show_bgp_view_ipv6_neighbor_flap_cmd,
10992: "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
10993: SHOW_STR
10994: BGP_STR
10995: "BGP view\n"
10996: "BGP view name\n"
10997: "Address family\n"
10998: "Detailed information on TCP and BGP neighbor connections\n"
10999: "Neighbor to display information about\n"
11000: "Neighbor to display information about\n"
11001: "Display flap statistics of the routes learned from neighbor\n")
11002:
11003: ALIAS (show_bgp_view_neighbor_routes,
11004: show_bgp_neighbor_routes_cmd,
11005: "show bgp neighbors (A.B.C.D|X:X::X:X) routes",
11006: SHOW_STR
11007: BGP_STR
11008: "Detailed information on TCP and BGP neighbor connections\n"
11009: "Neighbor to display information about\n"
11010: "Neighbor to display information about\n"
11011: "Display routes learned from neighbor\n")
11012:
11013:
11014: ALIAS (show_bgp_view_neighbor_routes,
11015: show_bgp_ipv6_neighbor_routes_cmd,
11016: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) routes",
11017: SHOW_STR
11018: BGP_STR
11019: "Address family\n"
11020: "Detailed information on TCP and BGP neighbor connections\n"
11021: "Neighbor to display information about\n"
11022: "Neighbor to display information about\n"
11023: "Display routes learned from neighbor\n")
11024:
11025: /* old command */
11026: ALIAS (show_bgp_view_neighbor_routes,
11027: ipv6_bgp_neighbor_routes_cmd,
11028: "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes",
11029: SHOW_STR
11030: IPV6_STR
11031: BGP_STR
11032: "Detailed information on TCP and BGP neighbor connections\n"
11033: "Neighbor to display information about\n"
11034: "Neighbor to display information about\n"
11035: "Display routes learned from neighbor\n")
11036:
11037: /* old command */
11038: DEFUN (ipv6_mbgp_neighbor_routes,
11039: ipv6_mbgp_neighbor_routes_cmd,
11040: "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes",
11041: SHOW_STR
11042: IPV6_STR
11043: MBGP_STR
11044: "Detailed information on TCP and BGP neighbor connections\n"
11045: "Neighbor to display information about\n"
11046: "Neighbor to display information about\n"
11047: "Display routes learned from neighbor\n")
11048: {
11049: struct peer *peer;
11050:
11051: peer = peer_lookup_in_view (vty, NULL, argv[0]);
11052: if (! peer)
11053: return CMD_WARNING;
11054:
11055: return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
11056: bgp_show_type_neighbor);
11057: }
11058:
11059: ALIAS (show_bgp_view_neighbor_flap,
11060: show_bgp_neighbor_flap_cmd,
11061: "show bgp neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11062: SHOW_STR
11063: BGP_STR
11064: "Detailed information on TCP and BGP neighbor connections\n"
11065: "Neighbor to display information about\n"
11066: "Neighbor to display information about\n"
11067: "Display flap statistics of the routes learned from neighbor\n")
11068:
11069: ALIAS (show_bgp_view_neighbor_flap,
11070: show_bgp_ipv6_neighbor_flap_cmd,
11071: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) flap-statistics",
11072: SHOW_STR
11073: BGP_STR
11074: "Address family\n"
11075: "Detailed information on TCP and BGP neighbor connections\n"
11076: "Neighbor to display information about\n"
11077: "Neighbor to display information about\n"
11078: "Display flap statistics of the routes learned from neighbor\n")
11079:
11080: ALIAS (show_bgp_view_neighbor_damp,
11081: show_bgp_neighbor_damp_cmd,
11082: "show bgp neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11083: SHOW_STR
11084: BGP_STR
11085: "Detailed information on TCP and BGP neighbor connections\n"
11086: "Neighbor to display information about\n"
11087: "Neighbor to display information about\n"
11088: "Display the dampened routes received from neighbor\n")
11089:
11090: ALIAS (show_bgp_view_neighbor_damp,
11091: show_bgp_ipv6_neighbor_damp_cmd,
11092: "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X) dampened-routes",
11093: SHOW_STR
11094: BGP_STR
11095: "Address family\n"
11096: "Detailed information on TCP and BGP neighbor connections\n"
11097: "Neighbor to display information about\n"
11098: "Neighbor to display information about\n"
11099: "Display the dampened routes received from neighbor\n")
11100:
11101: DEFUN (show_bgp_view_rsclient,
11102: show_bgp_view_rsclient_cmd,
11103: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X)",
11104: SHOW_STR
11105: BGP_STR
11106: "BGP view\n"
11107: "BGP view name\n"
11108: "Information about Route Server Client\n"
11109: NEIGHBOR_ADDR_STR)
11110: {
11111: struct bgp_table *table;
11112: struct peer *peer;
11113:
11114: if (argc == 2)
11115: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11116: else
11117: peer = peer_lookup_in_view (vty, NULL, argv[0]);
11118:
11119: if (! peer)
11120: return CMD_WARNING;
11121:
11122: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11123: {
11124: vty_out (vty, "%% Activate the neighbor for the address family first%s",
11125: VTY_NEWLINE);
11126: return CMD_WARNING;
11127: }
11128:
11129: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11130: PEER_FLAG_RSERVER_CLIENT))
11131: {
11132: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11133: VTY_NEWLINE);
11134: return CMD_WARNING;
11135: }
11136:
11137: table = peer->rib[AFI_IP6][SAFI_UNICAST];
11138:
11139: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
11140: }
11141:
11142: ALIAS (show_bgp_view_rsclient,
11143: show_bgp_rsclient_cmd,
11144: "show bgp rsclient (A.B.C.D|X:X::X:X)",
11145: SHOW_STR
11146: BGP_STR
11147: "Information about Route Server Client\n"
11148: NEIGHBOR_ADDR_STR)
11149:
11150: DEFUN (show_bgp_view_ipv6_safi_rsclient,
11151: show_bgp_view_ipv6_safi_rsclient_cmd,
11152: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11153: SHOW_STR
11154: BGP_STR
11155: "BGP view\n"
11156: "BGP view name\n"
11157: "Address family\n"
11158: "Address Family modifier\n"
11159: "Address Family modifier\n"
11160: "Information about Route Server Client\n"
11161: NEIGHBOR_ADDR_STR)
11162: {
11163: struct bgp_table *table;
11164: struct peer *peer;
11165: safi_t safi;
11166:
11167: if (argc == 3) {
11168: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11169: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11170: } else {
11171: peer = peer_lookup_in_view (vty, NULL, argv[1]);
11172: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11173: }
11174:
11175: if (! peer)
11176: return CMD_WARNING;
11177:
11178: if (! peer->afc[AFI_IP6][safi])
11179: {
11180: vty_out (vty, "%% Activate the neighbor for the address family first%s",
11181: VTY_NEWLINE);
11182: return CMD_WARNING;
11183: }
11184:
11185: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11186: PEER_FLAG_RSERVER_CLIENT))
11187: {
11188: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11189: VTY_NEWLINE);
11190: return CMD_WARNING;
11191: }
11192:
11193: table = peer->rib[AFI_IP6][safi];
11194:
11195: return bgp_show_table (vty, table, &peer->remote_id, bgp_show_type_normal, NULL);
11196: }
11197:
11198: ALIAS (show_bgp_view_ipv6_safi_rsclient,
11199: show_bgp_ipv6_safi_rsclient_cmd,
11200: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X)",
11201: SHOW_STR
11202: BGP_STR
11203: "Address family\n"
11204: "Address Family modifier\n"
11205: "Address Family modifier\n"
11206: "Information about Route Server Client\n"
11207: NEIGHBOR_ADDR_STR)
11208:
11209: DEFUN (show_bgp_view_rsclient_route,
11210: show_bgp_view_rsclient_route_cmd,
11211: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11212: SHOW_STR
11213: BGP_STR
11214: "BGP view\n"
11215: "BGP view name\n"
11216: "Information about Route Server Client\n"
11217: NEIGHBOR_ADDR_STR
11218: "Network in the BGP routing table to display\n")
11219: {
11220: struct bgp *bgp;
11221: struct peer *peer;
11222:
11223: /* BGP structure lookup. */
11224: if (argc == 3)
11225: {
11226: bgp = bgp_lookup_by_name (argv[0]);
11227: if (bgp == NULL)
11228: {
11229: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11230: return CMD_WARNING;
11231: }
11232: }
11233: else
11234: {
11235: bgp = bgp_get_default ();
11236: if (bgp == NULL)
11237: {
11238: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11239: return CMD_WARNING;
11240: }
11241: }
11242:
11243: if (argc == 3)
11244: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11245: else
11246: peer = peer_lookup_in_view (vty, NULL, argv[0]);
11247:
11248: if (! peer)
11249: return CMD_WARNING;
11250:
11251: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11252: {
11253: vty_out (vty, "%% Activate the neighbor for the address family first%s",
11254: VTY_NEWLINE);
11255: return CMD_WARNING;
11256: }
11257:
11258: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11259: PEER_FLAG_RSERVER_CLIENT))
11260: {
11261: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11262: VTY_NEWLINE);
11263: return CMD_WARNING;
11264: }
11265:
11266: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11267: (argc == 3) ? argv[2] : argv[1],
11268: AFI_IP6, SAFI_UNICAST, NULL, 0);
11269: }
11270:
11271: ALIAS (show_bgp_view_rsclient_route,
11272: show_bgp_rsclient_route_cmd,
11273: "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11274: SHOW_STR
11275: BGP_STR
11276: "Information about Route Server Client\n"
11277: NEIGHBOR_ADDR_STR
11278: "Network in the BGP routing table to display\n")
11279:
11280: DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
11281: show_bgp_view_ipv6_safi_rsclient_route_cmd,
11282: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11283: SHOW_STR
11284: BGP_STR
11285: "BGP view\n"
11286: "BGP view name\n"
11287: "Address family\n"
11288: "Address Family modifier\n"
11289: "Address Family modifier\n"
11290: "Information about Route Server Client\n"
11291: NEIGHBOR_ADDR_STR
11292: "Network in the BGP routing table to display\n")
11293: {
11294: struct bgp *bgp;
11295: struct peer *peer;
11296: safi_t safi;
11297:
11298: /* BGP structure lookup. */
11299: if (argc == 4)
11300: {
11301: bgp = bgp_lookup_by_name (argv[0]);
11302: if (bgp == NULL)
11303: {
11304: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11305: return CMD_WARNING;
11306: }
11307: }
11308: else
11309: {
11310: bgp = bgp_get_default ();
11311: if (bgp == NULL)
11312: {
11313: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11314: return CMD_WARNING;
11315: }
11316: }
11317:
11318: if (argc == 4) {
11319: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11320: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11321: } else {
11322: peer = peer_lookup_in_view (vty, NULL, argv[1]);
11323: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11324: }
11325:
11326: if (! peer)
11327: return CMD_WARNING;
11328:
11329: if (! peer->afc[AFI_IP6][safi])
11330: {
11331: vty_out (vty, "%% Activate the neighbor for the address family first%s",
11332: VTY_NEWLINE);
11333: return CMD_WARNING;
11334: }
11335:
11336: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11337: PEER_FLAG_RSERVER_CLIENT))
11338: {
11339: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11340: VTY_NEWLINE);
11341: return CMD_WARNING;
11342: }
11343:
11344: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11345: (argc == 4) ? argv[3] : argv[2],
11346: AFI_IP6, safi, NULL, 0);
11347: }
11348:
11349: ALIAS (show_bgp_view_ipv6_safi_rsclient_route,
11350: show_bgp_ipv6_safi_rsclient_route_cmd,
11351: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X",
11352: SHOW_STR
11353: BGP_STR
11354: "Address family\n"
11355: "Address Family modifier\n"
11356: "Address Family modifier\n"
11357: "Information about Route Server Client\n"
11358: NEIGHBOR_ADDR_STR
11359: "Network in the BGP routing table to display\n")
11360:
11361: DEFUN (show_bgp_view_rsclient_prefix,
11362: show_bgp_view_rsclient_prefix_cmd,
11363: "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11364: SHOW_STR
11365: BGP_STR
11366: "BGP view\n"
11367: "BGP view name\n"
11368: "Information about Route Server Client\n"
11369: NEIGHBOR_ADDR_STR
11370: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11371: {
11372: struct bgp *bgp;
11373: struct peer *peer;
11374:
11375: /* BGP structure lookup. */
11376: if (argc == 3)
11377: {
11378: bgp = bgp_lookup_by_name (argv[0]);
11379: if (bgp == NULL)
11380: {
11381: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11382: return CMD_WARNING;
11383: }
11384: }
11385: else
11386: {
11387: bgp = bgp_get_default ();
11388: if (bgp == NULL)
11389: {
11390: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11391: return CMD_WARNING;
11392: }
11393: }
11394:
11395: if (argc == 3)
11396: peer = peer_lookup_in_view (vty, argv[0], argv[1]);
11397: else
11398: peer = peer_lookup_in_view (vty, NULL, argv[0]);
11399:
11400: if (! peer)
11401: return CMD_WARNING;
11402:
11403: if (! peer->afc[AFI_IP6][SAFI_UNICAST])
11404: {
11405: vty_out (vty, "%% Activate the neighbor for the address family first%s",
11406: VTY_NEWLINE);
11407: return CMD_WARNING;
11408: }
11409:
11410: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
11411: PEER_FLAG_RSERVER_CLIENT))
11412: {
11413: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11414: VTY_NEWLINE);
11415: return CMD_WARNING;
11416: }
11417:
11418: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][SAFI_UNICAST],
11419: (argc == 3) ? argv[2] : argv[1],
11420: AFI_IP6, SAFI_UNICAST, NULL, 1);
11421: }
11422:
11423: ALIAS (show_bgp_view_rsclient_prefix,
11424: show_bgp_rsclient_prefix_cmd,
11425: "show bgp rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11426: SHOW_STR
11427: BGP_STR
11428: "Information about Route Server Client\n"
11429: NEIGHBOR_ADDR_STR
11430: "IPv6 prefix <network>/<length>, e.g., 3ffe::/16\n")
11431:
11432: DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
11433: show_bgp_view_ipv6_safi_rsclient_prefix_cmd,
11434: "show bgp view WORD ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11435: SHOW_STR
11436: BGP_STR
11437: "BGP view\n"
11438: "BGP view name\n"
11439: "Address family\n"
11440: "Address Family modifier\n"
11441: "Address Family modifier\n"
11442: "Information about Route Server Client\n"
11443: NEIGHBOR_ADDR_STR
11444: "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11445: {
11446: struct bgp *bgp;
11447: struct peer *peer;
11448: safi_t safi;
11449:
11450: /* BGP structure lookup. */
11451: if (argc == 4)
11452: {
11453: bgp = bgp_lookup_by_name (argv[0]);
11454: if (bgp == NULL)
11455: {
11456: vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
11457: return CMD_WARNING;
11458: }
11459: }
11460: else
11461: {
11462: bgp = bgp_get_default ();
11463: if (bgp == NULL)
11464: {
11465: vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
11466: return CMD_WARNING;
11467: }
11468: }
11469:
11470: if (argc == 4) {
11471: peer = peer_lookup_in_view (vty, argv[0], argv[2]);
11472: safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11473: } else {
11474: peer = peer_lookup_in_view (vty, NULL, argv[1]);
11475: safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
11476: }
11477:
11478: if (! peer)
11479: return CMD_WARNING;
11480:
11481: if (! peer->afc[AFI_IP6][safi])
11482: {
11483: vty_out (vty, "%% Activate the neighbor for the address family first%s",
11484: VTY_NEWLINE);
11485: return CMD_WARNING;
11486: }
11487:
11488: if ( ! CHECK_FLAG (peer->af_flags[AFI_IP6][safi],
11489: PEER_FLAG_RSERVER_CLIENT))
11490: {
11491: vty_out (vty, "%% Neighbor is not a Route-Server client%s",
11492: VTY_NEWLINE);
11493: return CMD_WARNING;
11494: }
11495:
11496: return bgp_show_route_in_table (vty, bgp, peer->rib[AFI_IP6][safi],
11497: (argc == 4) ? argv[3] : argv[2],
11498: AFI_IP6, safi, NULL, 1);
11499: }
11500:
11501: ALIAS (show_bgp_view_ipv6_safi_rsclient_prefix,
11502: show_bgp_ipv6_safi_rsclient_prefix_cmd,
11503: "show bgp ipv6 (unicast|multicast) rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M",
11504: SHOW_STR
11505: BGP_STR
11506: "Address family\n"
11507: "Address Family modifier\n"
11508: "Address Family modifier\n"
11509: "Information about Route Server Client\n"
11510: NEIGHBOR_ADDR_STR
11511: "IP prefix <network>/<length>, e.g., 3ffe::/16\n")
11512:
11513: #endif /* HAVE_IPV6 */
11514:
11515: struct bgp_table *bgp_distance_table;
11516:
11517: struct bgp_distance
11518: {
11519: /* Distance value for the IP source prefix. */
11520: u_char distance;
11521:
11522: /* Name of the access-list to be matched. */
11523: char *access_list;
11524: };
11525:
11526: static struct bgp_distance *
11527: bgp_distance_new (void)
11528: {
11529: return XCALLOC (MTYPE_BGP_DISTANCE, sizeof (struct bgp_distance));
11530: }
11531:
11532: static void
11533: bgp_distance_free (struct bgp_distance *bdistance)
11534: {
11535: XFREE (MTYPE_BGP_DISTANCE, bdistance);
11536: }
11537:
11538: static int
11539: bgp_distance_set (struct vty *vty, const char *distance_str,
11540: const char *ip_str, const char *access_list_str)
11541: {
11542: int ret;
11543: struct prefix_ipv4 p;
11544: u_char distance;
11545: struct bgp_node *rn;
11546: struct bgp_distance *bdistance;
11547:
11548: ret = str2prefix_ipv4 (ip_str, &p);
11549: if (ret == 0)
11550: {
11551: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11552: return CMD_WARNING;
11553: }
11554:
11555: distance = atoi (distance_str);
11556:
11557: /* Get BGP distance node. */
11558: rn = bgp_node_get (bgp_distance_table, (struct prefix *) &p);
11559: if (rn->info)
11560: {
11561: bdistance = rn->info;
11562: bgp_unlock_node (rn);
11563: }
11564: else
11565: {
11566: bdistance = bgp_distance_new ();
11567: rn->info = bdistance;
11568: }
11569:
11570: /* Set distance value. */
11571: bdistance->distance = distance;
11572:
11573: /* Reset access-list configuration. */
11574: if (bdistance->access_list)
11575: {
11576: free (bdistance->access_list);
11577: bdistance->access_list = NULL;
11578: }
11579: if (access_list_str)
11580: bdistance->access_list = strdup (access_list_str);
11581:
11582: return CMD_SUCCESS;
11583: }
11584:
11585: static int
11586: bgp_distance_unset (struct vty *vty, const char *distance_str,
11587: const char *ip_str, const char *access_list_str)
11588: {
11589: int ret;
11590: struct prefix_ipv4 p;
11591: u_char distance;
11592: struct bgp_node *rn;
11593: struct bgp_distance *bdistance;
11594:
11595: ret = str2prefix_ipv4 (ip_str, &p);
11596: if (ret == 0)
11597: {
11598: vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
11599: return CMD_WARNING;
11600: }
11601:
11602: distance = atoi (distance_str);
11603:
11604: rn = bgp_node_lookup (bgp_distance_table, (struct prefix *)&p);
11605: if (! rn)
11606: {
11607: vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
11608: return CMD_WARNING;
11609: }
11610:
11611: bdistance = rn->info;
11612:
11613: if (bdistance->access_list)
11614: free (bdistance->access_list);
11615: bgp_distance_free (bdistance);
11616:
11617: rn->info = NULL;
11618: bgp_unlock_node (rn);
11619: bgp_unlock_node (rn);
11620:
11621: return CMD_SUCCESS;
11622: }
11623:
11624: /* Apply BGP information to distance method. */
11625: u_char
11626: bgp_distance_apply (struct prefix *p, struct bgp_info *rinfo, struct bgp *bgp)
11627: {
11628: struct bgp_node *rn;
11629: struct prefix_ipv4 q;
11630: struct peer *peer;
11631: struct bgp_distance *bdistance;
11632: struct access_list *alist;
11633: struct bgp_static *bgp_static;
11634:
11635: if (! bgp)
11636: return 0;
11637:
11638: if (p->family != AF_INET)
11639: return 0;
11640:
11641: peer = rinfo->peer;
11642:
11643: if (peer->su.sa.sa_family != AF_INET)
11644: return 0;
11645:
11646: memset (&q, 0, sizeof (struct prefix_ipv4));
11647: q.family = AF_INET;
11648: q.prefix = peer->su.sin.sin_addr;
11649: q.prefixlen = IPV4_MAX_BITLEN;
11650:
11651: /* Check source address. */
11652: rn = bgp_node_match (bgp_distance_table, (struct prefix *) &q);
11653: if (rn)
11654: {
11655: bdistance = rn->info;
11656: bgp_unlock_node (rn);
11657:
11658: if (bdistance->access_list)
11659: {
11660: alist = access_list_lookup (AFI_IP, bdistance->access_list);
11661: if (alist && access_list_apply (alist, p) == FILTER_PERMIT)
11662: return bdistance->distance;
11663: }
11664: else
11665: return bdistance->distance;
11666: }
11667:
11668: /* Backdoor check. */
11669: rn = bgp_node_lookup (bgp->route[AFI_IP][SAFI_UNICAST], p);
11670: if (rn)
11671: {
11672: bgp_static = rn->info;
11673: bgp_unlock_node (rn);
11674:
11675: if (bgp_static->backdoor)
11676: {
11677: if (bgp->distance_local)
11678: return bgp->distance_local;
11679: else
11680: return ZEBRA_IBGP_DISTANCE_DEFAULT;
11681: }
11682: }
11683:
11684: if (peer_sort (peer) == BGP_PEER_EBGP)
11685: {
11686: if (bgp->distance_ebgp)
11687: return bgp->distance_ebgp;
11688: return ZEBRA_EBGP_DISTANCE_DEFAULT;
11689: }
11690: else
11691: {
11692: if (bgp->distance_ibgp)
11693: return bgp->distance_ibgp;
11694: return ZEBRA_IBGP_DISTANCE_DEFAULT;
11695: }
11696: }
11697:
11698: DEFUN (bgp_distance,
11699: bgp_distance_cmd,
11700: "distance bgp <1-255> <1-255> <1-255>",
11701: "Define an administrative distance\n"
11702: "BGP distance\n"
11703: "Distance for routes external to the AS\n"
11704: "Distance for routes internal to the AS\n"
11705: "Distance for local routes\n")
11706: {
11707: struct bgp *bgp;
11708:
11709: bgp = vty->index;
11710:
11711: bgp->distance_ebgp = atoi (argv[0]);
11712: bgp->distance_ibgp = atoi (argv[1]);
11713: bgp->distance_local = atoi (argv[2]);
11714: return CMD_SUCCESS;
11715: }
11716:
11717: DEFUN (no_bgp_distance,
11718: no_bgp_distance_cmd,
11719: "no distance bgp <1-255> <1-255> <1-255>",
11720: NO_STR
11721: "Define an administrative distance\n"
11722: "BGP distance\n"
11723: "Distance for routes external to the AS\n"
11724: "Distance for routes internal to the AS\n"
11725: "Distance for local routes\n")
11726: {
11727: struct bgp *bgp;
11728:
11729: bgp = vty->index;
11730:
11731: bgp->distance_ebgp= 0;
11732: bgp->distance_ibgp = 0;
11733: bgp->distance_local = 0;
11734: return CMD_SUCCESS;
11735: }
11736:
11737: ALIAS (no_bgp_distance,
11738: no_bgp_distance2_cmd,
11739: "no distance bgp",
11740: NO_STR
11741: "Define an administrative distance\n"
11742: "BGP distance\n")
11743:
11744: DEFUN (bgp_distance_source,
11745: bgp_distance_source_cmd,
11746: "distance <1-255> A.B.C.D/M",
11747: "Define an administrative distance\n"
11748: "Administrative distance\n"
11749: "IP source prefix\n")
11750: {
11751: bgp_distance_set (vty, argv[0], argv[1], NULL);
11752: return CMD_SUCCESS;
11753: }
11754:
11755: DEFUN (no_bgp_distance_source,
11756: no_bgp_distance_source_cmd,
11757: "no distance <1-255> A.B.C.D/M",
11758: NO_STR
11759: "Define an administrative distance\n"
11760: "Administrative distance\n"
11761: "IP source prefix\n")
11762: {
11763: bgp_distance_unset (vty, argv[0], argv[1], NULL);
11764: return CMD_SUCCESS;
11765: }
11766:
11767: DEFUN (bgp_distance_source_access_list,
11768: bgp_distance_source_access_list_cmd,
11769: "distance <1-255> A.B.C.D/M WORD",
11770: "Define an administrative distance\n"
11771: "Administrative distance\n"
11772: "IP source prefix\n"
11773: "Access list name\n")
11774: {
11775: bgp_distance_set (vty, argv[0], argv[1], argv[2]);
11776: return CMD_SUCCESS;
11777: }
11778:
11779: DEFUN (no_bgp_distance_source_access_list,
11780: no_bgp_distance_source_access_list_cmd,
11781: "no distance <1-255> A.B.C.D/M WORD",
11782: NO_STR
11783: "Define an administrative distance\n"
11784: "Administrative distance\n"
11785: "IP source prefix\n"
11786: "Access list name\n")
11787: {
11788: bgp_distance_unset (vty, argv[0], argv[1], argv[2]);
11789: return CMD_SUCCESS;
11790: }
11791:
11792: DEFUN (bgp_damp_set,
11793: bgp_damp_set_cmd,
11794: "bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11795: "BGP Specific commands\n"
11796: "Enable route-flap dampening\n"
11797: "Half-life time for the penalty\n"
11798: "Value to start reusing a route\n"
11799: "Value to start suppressing a route\n"
11800: "Maximum duration to suppress a stable route\n")
11801: {
11802: struct bgp *bgp;
11803: int half = DEFAULT_HALF_LIFE * 60;
11804: int reuse = DEFAULT_REUSE;
11805: int suppress = DEFAULT_SUPPRESS;
11806: int max = 4 * half;
11807:
11808: if (argc == 4)
11809: {
11810: half = atoi (argv[0]) * 60;
11811: reuse = atoi (argv[1]);
11812: suppress = atoi (argv[2]);
11813: max = atoi (argv[3]) * 60;
11814: }
11815: else if (argc == 1)
11816: {
11817: half = atoi (argv[0]) * 60;
11818: max = 4 * half;
11819: }
11820:
11821: bgp = vty->index;
11822: return bgp_damp_enable (bgp, bgp_node_afi (vty), bgp_node_safi (vty),
11823: half, reuse, suppress, max);
11824: }
11825:
11826: ALIAS (bgp_damp_set,
11827: bgp_damp_set2_cmd,
11828: "bgp dampening <1-45>",
11829: "BGP Specific commands\n"
11830: "Enable route-flap dampening\n"
11831: "Half-life time for the penalty\n")
11832:
11833: ALIAS (bgp_damp_set,
11834: bgp_damp_set3_cmd,
11835: "bgp dampening",
11836: "BGP Specific commands\n"
11837: "Enable route-flap dampening\n")
11838:
11839: DEFUN (bgp_damp_unset,
11840: bgp_damp_unset_cmd,
11841: "no bgp dampening",
11842: NO_STR
11843: "BGP Specific commands\n"
11844: "Enable route-flap dampening\n")
11845: {
11846: struct bgp *bgp;
11847:
11848: bgp = vty->index;
11849: return bgp_damp_disable (bgp, bgp_node_afi (vty), bgp_node_safi (vty));
11850: }
11851:
11852: ALIAS (bgp_damp_unset,
11853: bgp_damp_unset2_cmd,
11854: "no bgp dampening <1-45> <1-20000> <1-20000> <1-255>",
11855: NO_STR
11856: "BGP Specific commands\n"
11857: "Enable route-flap dampening\n"
11858: "Half-life time for the penalty\n"
11859: "Value to start reusing a route\n"
11860: "Value to start suppressing a route\n"
11861: "Maximum duration to suppress a stable route\n")
11862:
11863: DEFUN (show_ip_bgp_dampened_paths,
11864: show_ip_bgp_dampened_paths_cmd,
11865: "show ip bgp dampened-paths",
11866: SHOW_STR
11867: IP_STR
11868: BGP_STR
11869: "Display paths suppressed due to dampening\n")
11870: {
11871: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST, bgp_show_type_dampend_paths,
11872: NULL);
11873: }
11874:
11875: DEFUN (show_ip_bgp_flap_statistics,
11876: show_ip_bgp_flap_statistics_cmd,
11877: "show ip bgp flap-statistics",
11878: SHOW_STR
11879: IP_STR
11880: BGP_STR
11881: "Display flap statistics of routes\n")
11882: {
11883: return bgp_show (vty, NULL, AFI_IP, SAFI_UNICAST,
11884: bgp_show_type_flap_statistics, NULL);
11885: }
11886:
11887: /* Display specified route of BGP table. */
11888: static int
11889: bgp_clear_damp_route (struct vty *vty, const char *view_name,
11890: const char *ip_str, afi_t afi, safi_t safi,
11891: struct prefix_rd *prd, int prefix_check)
11892: {
11893: int ret;
11894: struct prefix match;
11895: struct bgp_node *rn;
11896: struct bgp_node *rm;
11897: struct bgp_info *ri;
11898: struct bgp_info *ri_temp;
11899: struct bgp *bgp;
11900: struct bgp_table *table;
11901:
11902: /* BGP structure lookup. */
11903: if (view_name)
11904: {
11905: bgp = bgp_lookup_by_name (view_name);
11906: if (bgp == NULL)
11907: {
11908: vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
11909: return CMD_WARNING;
11910: }
11911: }
11912: else
11913: {
11914: bgp = bgp_get_default ();
11915: if (bgp == NULL)
11916: {
11917: vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
11918: return CMD_WARNING;
11919: }
11920: }
11921:
11922: /* Check IP address argument. */
11923: ret = str2prefix (ip_str, &match);
11924: if (! ret)
11925: {
11926: vty_out (vty, "%% address is malformed%s", VTY_NEWLINE);
11927: return CMD_WARNING;
11928: }
11929:
11930: match.family = afi2family (afi);
11931:
11932: if (safi == SAFI_MPLS_VPN)
11933: {
11934: for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
11935: {
11936: if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
11937: continue;
11938:
11939: if ((table = rn->info) != NULL)
11940: if ((rm = bgp_node_match (table, &match)) != NULL)
11941: {
11942: if (! prefix_check || rm->p.prefixlen == match.prefixlen)
11943: {
11944: ri = rm->info;
11945: while (ri)
11946: {
11947: if (ri->extra && ri->extra->damp_info)
11948: {
11949: ri_temp = ri->next;
11950: bgp_damp_info_free (ri->extra->damp_info, 1);
11951: ri = ri_temp;
11952: }
11953: else
11954: ri = ri->next;
11955: }
11956: }
11957:
11958: bgp_unlock_node (rm);
11959: }
11960: }
11961: }
11962: else
11963: {
11964: if ((rn = bgp_node_match (bgp->rib[afi][safi], &match)) != NULL)
11965: {
11966: if (! prefix_check || rn->p.prefixlen == match.prefixlen)
11967: {
11968: ri = rn->info;
11969: while (ri)
11970: {
11971: if (ri->extra && ri->extra->damp_info)
11972: {
11973: ri_temp = ri->next;
11974: bgp_damp_info_free (ri->extra->damp_info, 1);
11975: ri = ri_temp;
11976: }
11977: else
11978: ri = ri->next;
11979: }
11980: }
11981:
11982: bgp_unlock_node (rn);
11983: }
11984: }
11985:
11986: return CMD_SUCCESS;
11987: }
11988:
11989: DEFUN (clear_ip_bgp_dampening,
11990: clear_ip_bgp_dampening_cmd,
11991: "clear ip bgp dampening",
11992: CLEAR_STR
11993: IP_STR
11994: BGP_STR
11995: "Clear route flap dampening information\n")
11996: {
11997: bgp_damp_info_clean ();
11998: return CMD_SUCCESS;
11999: }
12000:
12001: DEFUN (clear_ip_bgp_dampening_prefix,
12002: clear_ip_bgp_dampening_prefix_cmd,
12003: "clear ip bgp dampening A.B.C.D/M",
12004: CLEAR_STR
12005: IP_STR
12006: BGP_STR
12007: "Clear route flap dampening information\n"
12008: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
12009: {
12010: return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12011: SAFI_UNICAST, NULL, 1);
12012: }
12013:
12014: DEFUN (clear_ip_bgp_dampening_address,
12015: clear_ip_bgp_dampening_address_cmd,
12016: "clear ip bgp dampening A.B.C.D",
12017: CLEAR_STR
12018: IP_STR
12019: BGP_STR
12020: "Clear route flap dampening information\n"
12021: "Network to clear damping information\n")
12022: {
12023: return bgp_clear_damp_route (vty, NULL, argv[0], AFI_IP,
12024: SAFI_UNICAST, NULL, 0);
12025: }
12026:
12027: DEFUN (clear_ip_bgp_dampening_address_mask,
12028: clear_ip_bgp_dampening_address_mask_cmd,
12029: "clear ip bgp dampening A.B.C.D A.B.C.D",
12030: CLEAR_STR
12031: IP_STR
12032: BGP_STR
12033: "Clear route flap dampening information\n"
12034: "Network to clear damping information\n"
12035: "Network mask\n")
12036: {
12037: int ret;
12038: char prefix_str[BUFSIZ];
12039:
12040: ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
12041: if (! ret)
12042: {
12043: vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
12044: return CMD_WARNING;
12045: }
12046:
12047: return bgp_clear_damp_route (vty, NULL, prefix_str, AFI_IP,
12048: SAFI_UNICAST, NULL, 0);
12049: }
12050:
12051: static int
12052: bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
12053: afi_t afi, safi_t safi, int *write)
12054: {
12055: struct bgp_node *prn;
12056: struct bgp_node *rn;
12057: struct bgp_table *table;
12058: struct prefix *p;
12059: struct prefix_rd *prd;
12060: struct bgp_static *bgp_static;
12061: u_int32_t label;
12062: char buf[SU_ADDRSTRLEN];
12063: char rdbuf[RD_ADDRSTRLEN];
12064:
12065: /* Network configuration. */
12066: for (prn = bgp_table_top (bgp->route[afi][safi]); prn; prn = bgp_route_next (prn))
12067: if ((table = prn->info) != NULL)
12068: for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
12069: if ((bgp_static = rn->info) != NULL)
12070: {
12071: p = &rn->p;
12072: prd = (struct prefix_rd *) &prn->p;
12073:
12074: /* "address-family" display. */
12075: bgp_config_write_family_header (vty, afi, safi, write);
12076:
12077: /* "network" configuration display. */
12078: prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
12079: label = decode_label (bgp_static->tag);
12080:
12081: vty_out (vty, " network %s/%d rd %s tag %d",
12082: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12083: p->prefixlen,
12084: rdbuf, label);
12085: vty_out (vty, "%s", VTY_NEWLINE);
12086: }
12087: return 0;
12088: }
12089:
12090: /* Configuration of static route announcement and aggregate
12091: information. */
12092: int
12093: bgp_config_write_network (struct vty *vty, struct bgp *bgp,
12094: afi_t afi, safi_t safi, int *write)
12095: {
12096: struct bgp_node *rn;
12097: struct prefix *p;
12098: struct bgp_static *bgp_static;
12099: struct bgp_aggregate *bgp_aggregate;
12100: char buf[SU_ADDRSTRLEN];
12101:
12102: if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
12103: return bgp_config_write_network_vpnv4 (vty, bgp, afi, safi, write);
12104:
12105: /* Network configuration. */
12106: for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
12107: if ((bgp_static = rn->info) != NULL)
12108: {
12109: p = &rn->p;
12110:
12111: /* "address-family" display. */
12112: bgp_config_write_family_header (vty, afi, safi, write);
12113:
12114: /* "network" configuration display. */
12115: if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12116: {
12117: u_int32_t destination;
12118: struct in_addr netmask;
12119:
12120: destination = ntohl (p->u.prefix4.s_addr);
12121: masklen2ip (p->prefixlen, &netmask);
12122: vty_out (vty, " network %s",
12123: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
12124:
12125: if ((IN_CLASSC (destination) && p->prefixlen == 24)
12126: || (IN_CLASSB (destination) && p->prefixlen == 16)
12127: || (IN_CLASSA (destination) && p->prefixlen == 8)
12128: || p->u.prefix4.s_addr == 0)
12129: {
12130: /* Natural mask is not display. */
12131: }
12132: else
12133: vty_out (vty, " mask %s", inet_ntoa (netmask));
12134: }
12135: else
12136: {
12137: vty_out (vty, " network %s/%d",
12138: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12139: p->prefixlen);
12140: }
12141:
12142: if (bgp_static->rmap.name)
12143: vty_out (vty, " route-map %s", bgp_static->rmap.name);
12144: else
12145: {
12146: if (bgp_static->backdoor)
12147: vty_out (vty, " backdoor");
12148: }
12149:
12150: vty_out (vty, "%s", VTY_NEWLINE);
12151: }
12152:
12153: /* Aggregate-address configuration. */
12154: for (rn = bgp_table_top (bgp->aggregate[afi][safi]); rn; rn = bgp_route_next (rn))
12155: if ((bgp_aggregate = rn->info) != NULL)
12156: {
12157: p = &rn->p;
12158:
12159: /* "address-family" display. */
12160: bgp_config_write_family_header (vty, afi, safi, write);
12161:
12162: if (bgp_option_check (BGP_OPT_CONFIG_CISCO) && afi == AFI_IP)
12163: {
12164: struct in_addr netmask;
12165:
12166: masklen2ip (p->prefixlen, &netmask);
12167: vty_out (vty, " aggregate-address %s %s",
12168: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12169: inet_ntoa (netmask));
12170: }
12171: else
12172: {
12173: vty_out (vty, " aggregate-address %s/%d",
12174: inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
12175: p->prefixlen);
12176: }
12177:
12178: if (bgp_aggregate->as_set)
12179: vty_out (vty, " as-set");
12180:
12181: if (bgp_aggregate->summary_only)
12182: vty_out (vty, " summary-only");
12183:
12184: vty_out (vty, "%s", VTY_NEWLINE);
12185: }
12186:
12187: return 0;
12188: }
12189:
12190: int
12191: bgp_config_write_distance (struct vty *vty, struct bgp *bgp)
12192: {
12193: struct bgp_node *rn;
12194: struct bgp_distance *bdistance;
12195:
12196: /* Distance configuration. */
12197: if (bgp->distance_ebgp
12198: && bgp->distance_ibgp
12199: && bgp->distance_local
12200: && (bgp->distance_ebgp != ZEBRA_EBGP_DISTANCE_DEFAULT
12201: || bgp->distance_ibgp != ZEBRA_IBGP_DISTANCE_DEFAULT
12202: || bgp->distance_local != ZEBRA_IBGP_DISTANCE_DEFAULT))
12203: vty_out (vty, " distance bgp %d %d %d%s",
12204: bgp->distance_ebgp, bgp->distance_ibgp, bgp->distance_local,
12205: VTY_NEWLINE);
12206:
12207: for (rn = bgp_table_top (bgp_distance_table); rn; rn = bgp_route_next (rn))
12208: if ((bdistance = rn->info) != NULL)
12209: {
12210: vty_out (vty, " distance %d %s/%d %s%s", bdistance->distance,
12211: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
12212: bdistance->access_list ? bdistance->access_list : "",
12213: VTY_NEWLINE);
12214: }
12215:
12216: return 0;
12217: }
12218:
12219: /* Allocate routing table structure and install commands. */
12220: void
12221: bgp_route_init (void)
12222: {
12223: /* Init BGP distance table. */
12224: bgp_distance_table = bgp_table_init (AFI_IP, SAFI_UNICAST);
12225:
12226: /* IPv4 BGP commands. */
12227: install_element (BGP_NODE, &bgp_network_cmd);
12228: install_element (BGP_NODE, &bgp_network_mask_cmd);
12229: install_element (BGP_NODE, &bgp_network_mask_natural_cmd);
12230: install_element (BGP_NODE, &bgp_network_route_map_cmd);
12231: install_element (BGP_NODE, &bgp_network_mask_route_map_cmd);
12232: install_element (BGP_NODE, &bgp_network_mask_natural_route_map_cmd);
12233: install_element (BGP_NODE, &bgp_network_backdoor_cmd);
12234: install_element (BGP_NODE, &bgp_network_mask_backdoor_cmd);
12235: install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_cmd);
12236: install_element (BGP_NODE, &no_bgp_network_cmd);
12237: install_element (BGP_NODE, &no_bgp_network_mask_cmd);
12238: install_element (BGP_NODE, &no_bgp_network_mask_natural_cmd);
12239: install_element (BGP_NODE, &no_bgp_network_route_map_cmd);
12240: install_element (BGP_NODE, &no_bgp_network_mask_route_map_cmd);
12241: install_element (BGP_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12242: install_element (BGP_NODE, &no_bgp_network_backdoor_cmd);
12243: install_element (BGP_NODE, &no_bgp_network_mask_backdoor_cmd);
12244: install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_cmd);
12245:
12246: install_element (BGP_NODE, &aggregate_address_cmd);
12247: install_element (BGP_NODE, &aggregate_address_mask_cmd);
12248: install_element (BGP_NODE, &aggregate_address_summary_only_cmd);
12249: install_element (BGP_NODE, &aggregate_address_mask_summary_only_cmd);
12250: install_element (BGP_NODE, &aggregate_address_as_set_cmd);
12251: install_element (BGP_NODE, &aggregate_address_mask_as_set_cmd);
12252: install_element (BGP_NODE, &aggregate_address_as_set_summary_cmd);
12253: install_element (BGP_NODE, &aggregate_address_mask_as_set_summary_cmd);
12254: install_element (BGP_NODE, &aggregate_address_summary_as_set_cmd);
12255: install_element (BGP_NODE, &aggregate_address_mask_summary_as_set_cmd);
12256: install_element (BGP_NODE, &no_aggregate_address_cmd);
12257: install_element (BGP_NODE, &no_aggregate_address_summary_only_cmd);
12258: install_element (BGP_NODE, &no_aggregate_address_as_set_cmd);
12259: install_element (BGP_NODE, &no_aggregate_address_as_set_summary_cmd);
12260: install_element (BGP_NODE, &no_aggregate_address_summary_as_set_cmd);
12261: install_element (BGP_NODE, &no_aggregate_address_mask_cmd);
12262: install_element (BGP_NODE, &no_aggregate_address_mask_summary_only_cmd);
12263: install_element (BGP_NODE, &no_aggregate_address_mask_as_set_cmd);
12264: install_element (BGP_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12265: install_element (BGP_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12266:
12267: /* IPv4 unicast configuration. */
12268: install_element (BGP_IPV4_NODE, &bgp_network_cmd);
12269: install_element (BGP_IPV4_NODE, &bgp_network_mask_cmd);
12270: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_cmd);
12271: install_element (BGP_IPV4_NODE, &bgp_network_route_map_cmd);
12272: install_element (BGP_IPV4_NODE, &bgp_network_mask_route_map_cmd);
12273: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_route_map_cmd);
12274: install_element (BGP_IPV4_NODE, &no_bgp_network_cmd);
12275: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_cmd);
12276: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_cmd);
12277: install_element (BGP_IPV4_NODE, &no_bgp_network_route_map_cmd);
12278: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_route_map_cmd);
12279: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12280:
12281: install_element (BGP_IPV4_NODE, &aggregate_address_cmd);
12282: install_element (BGP_IPV4_NODE, &aggregate_address_mask_cmd);
12283: install_element (BGP_IPV4_NODE, &aggregate_address_summary_only_cmd);
12284: install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_only_cmd);
12285: install_element (BGP_IPV4_NODE, &aggregate_address_as_set_cmd);
12286: install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_cmd);
12287: install_element (BGP_IPV4_NODE, &aggregate_address_as_set_summary_cmd);
12288: install_element (BGP_IPV4_NODE, &aggregate_address_mask_as_set_summary_cmd);
12289: install_element (BGP_IPV4_NODE, &aggregate_address_summary_as_set_cmd);
12290: install_element (BGP_IPV4_NODE, &aggregate_address_mask_summary_as_set_cmd);
12291: install_element (BGP_IPV4_NODE, &no_aggregate_address_cmd);
12292: install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_only_cmd);
12293: install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_cmd);
12294: install_element (BGP_IPV4_NODE, &no_aggregate_address_as_set_summary_cmd);
12295: install_element (BGP_IPV4_NODE, &no_aggregate_address_summary_as_set_cmd);
12296: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_cmd);
12297: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_only_cmd);
12298: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_cmd);
12299: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12300: install_element (BGP_IPV4_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12301:
12302: /* IPv4 multicast configuration. */
12303: install_element (BGP_IPV4M_NODE, &bgp_network_cmd);
12304: install_element (BGP_IPV4M_NODE, &bgp_network_mask_cmd);
12305: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_cmd);
12306: install_element (BGP_IPV4M_NODE, &bgp_network_route_map_cmd);
12307: install_element (BGP_IPV4M_NODE, &bgp_network_mask_route_map_cmd);
12308: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_route_map_cmd);
12309: install_element (BGP_IPV4M_NODE, &no_bgp_network_cmd);
12310: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_cmd);
12311: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_cmd);
12312: install_element (BGP_IPV4M_NODE, &no_bgp_network_route_map_cmd);
12313: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_route_map_cmd);
12314: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_route_map_cmd);
12315: install_element (BGP_IPV4M_NODE, &aggregate_address_cmd);
12316: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_cmd);
12317: install_element (BGP_IPV4M_NODE, &aggregate_address_summary_only_cmd);
12318: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_only_cmd);
12319: install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_cmd);
12320: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_cmd);
12321: install_element (BGP_IPV4M_NODE, &aggregate_address_as_set_summary_cmd);
12322: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_as_set_summary_cmd);
12323: install_element (BGP_IPV4M_NODE, &aggregate_address_summary_as_set_cmd);
12324: install_element (BGP_IPV4M_NODE, &aggregate_address_mask_summary_as_set_cmd);
12325: install_element (BGP_IPV4M_NODE, &no_aggregate_address_cmd);
12326: install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_only_cmd);
12327: install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_cmd);
12328: install_element (BGP_IPV4M_NODE, &no_aggregate_address_as_set_summary_cmd);
12329: install_element (BGP_IPV4M_NODE, &no_aggregate_address_summary_as_set_cmd);
12330: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_cmd);
12331: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_only_cmd);
12332: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_cmd);
12333: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_as_set_summary_cmd);
12334: install_element (BGP_IPV4M_NODE, &no_aggregate_address_mask_summary_as_set_cmd);
12335:
12336: install_element (VIEW_NODE, &show_ip_bgp_cmd);
12337: install_element (VIEW_NODE, &show_ip_bgp_ipv4_cmd);
12338: install_element (VIEW_NODE, &show_bgp_ipv4_safi_cmd);
12339: install_element (VIEW_NODE, &show_ip_bgp_route_cmd);
12340: install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_cmd);
12341: install_element (VIEW_NODE, &show_bgp_ipv4_safi_route_cmd);
12342: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12343: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12344: install_element (VIEW_NODE, &show_ip_bgp_prefix_cmd);
12345: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_cmd);
12346: install_element (VIEW_NODE, &show_bgp_ipv4_safi_prefix_cmd);
12347: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12348: install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12349: install_element (VIEW_NODE, &show_ip_bgp_view_cmd);
12350: install_element (VIEW_NODE, &show_ip_bgp_view_route_cmd);
12351: install_element (VIEW_NODE, &show_ip_bgp_view_prefix_cmd);
12352: install_element (VIEW_NODE, &show_ip_bgp_regexp_cmd);
12353: install_element (VIEW_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12354: install_element (VIEW_NODE, &show_ip_bgp_prefix_list_cmd);
12355: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12356: install_element (VIEW_NODE, &show_ip_bgp_filter_list_cmd);
12357: install_element (VIEW_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12358: install_element (VIEW_NODE, &show_ip_bgp_route_map_cmd);
12359: install_element (VIEW_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12360: install_element (VIEW_NODE, &show_ip_bgp_cidr_only_cmd);
12361: install_element (VIEW_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12362: install_element (VIEW_NODE, &show_ip_bgp_community_all_cmd);
12363: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12364: install_element (VIEW_NODE, &show_ip_bgp_community_cmd);
12365: install_element (VIEW_NODE, &show_ip_bgp_community2_cmd);
12366: install_element (VIEW_NODE, &show_ip_bgp_community3_cmd);
12367: install_element (VIEW_NODE, &show_ip_bgp_community4_cmd);
12368: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_cmd);
12369: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_cmd);
12370: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_cmd);
12371: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_cmd);
12372: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12373: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community_cmd);
12374: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community2_cmd);
12375: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community3_cmd);
12376: install_element (VIEW_NODE, &show_bgp_view_afi_safi_community4_cmd);
12377: install_element (VIEW_NODE, &show_ip_bgp_community_exact_cmd);
12378: install_element (VIEW_NODE, &show_ip_bgp_community2_exact_cmd);
12379: install_element (VIEW_NODE, &show_ip_bgp_community3_exact_cmd);
12380: install_element (VIEW_NODE, &show_ip_bgp_community4_exact_cmd);
12381: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12382: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12383: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12384: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12385: install_element (VIEW_NODE, &show_ip_bgp_community_list_cmd);
12386: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12387: install_element (VIEW_NODE, &show_ip_bgp_community_list_exact_cmd);
12388: install_element (VIEW_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12389: install_element (VIEW_NODE, &show_ip_bgp_prefix_longer_cmd);
12390: install_element (VIEW_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12391: install_element (VIEW_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12392: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12393: install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12394: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
12395: install_element (VIEW_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
12396: install_element (VIEW_NODE, &show_ip_bgp_neighbor_routes_cmd);
12397: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12398: install_element (VIEW_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12399: install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12400: install_element (VIEW_NODE, &show_ip_bgp_dampened_paths_cmd);
12401: install_element (VIEW_NODE, &show_ip_bgp_flap_statistics_cmd);
12402: install_element (VIEW_NODE, &show_ip_bgp_flap_address_cmd);
12403: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_cmd);
12404: install_element (VIEW_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12405: install_element (VIEW_NODE, &show_ip_bgp_flap_regexp_cmd);
12406: install_element (VIEW_NODE, &show_ip_bgp_flap_filter_list_cmd);
12407: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12408: install_element (VIEW_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12409: install_element (VIEW_NODE, &show_ip_bgp_flap_route_map_cmd);
12410: install_element (VIEW_NODE, &show_ip_bgp_neighbor_flap_cmd);
12411: install_element (VIEW_NODE, &show_ip_bgp_neighbor_damp_cmd);
12412: install_element (VIEW_NODE, &show_ip_bgp_rsclient_cmd);
12413: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
12414: install_element (VIEW_NODE, &show_ip_bgp_rsclient_route_cmd);
12415: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
12416: install_element (VIEW_NODE, &show_ip_bgp_rsclient_prefix_cmd);
12417: install_element (VIEW_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
12418: install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12419: install_element (VIEW_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
12420: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_cmd);
12421: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
12422: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_route_cmd);
12423: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
12424: install_element (VIEW_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
12425: install_element (VIEW_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
12426:
12427: /* Restricted node: VIEW_NODE - (set of dangerous commands) */
12428: install_element (RESTRICTED_NODE, &show_ip_bgp_route_cmd);
12429: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_route_cmd);
12430: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_route_cmd);
12431: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12432: install_element (RESTRICTED_NODE, &show_ip_bgp_prefix_cmd);
12433: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_prefix_cmd);
12434: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_prefix_cmd);
12435: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12436: install_element (RESTRICTED_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12437: install_element (RESTRICTED_NODE, &show_ip_bgp_view_route_cmd);
12438: install_element (RESTRICTED_NODE, &show_ip_bgp_view_prefix_cmd);
12439: install_element (RESTRICTED_NODE, &show_ip_bgp_community_cmd);
12440: install_element (RESTRICTED_NODE, &show_ip_bgp_community2_cmd);
12441: install_element (RESTRICTED_NODE, &show_ip_bgp_community3_cmd);
12442: install_element (RESTRICTED_NODE, &show_ip_bgp_community4_cmd);
12443: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_cmd);
12444: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_cmd);
12445: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_cmd);
12446: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_cmd);
12447: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12448: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community_cmd);
12449: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community2_cmd);
12450: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community3_cmd);
12451: install_element (RESTRICTED_NODE, &show_bgp_view_afi_safi_community4_cmd);
12452: install_element (RESTRICTED_NODE, &show_ip_bgp_community_exact_cmd);
12453: install_element (RESTRICTED_NODE, &show_ip_bgp_community2_exact_cmd);
12454: install_element (RESTRICTED_NODE, &show_ip_bgp_community3_exact_cmd);
12455: install_element (RESTRICTED_NODE, &show_ip_bgp_community4_exact_cmd);
12456: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12457: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12458: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12459: install_element (RESTRICTED_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12460: install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_route_cmd);
12461: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
12462: install_element (RESTRICTED_NODE, &show_ip_bgp_rsclient_prefix_cmd);
12463: install_element (RESTRICTED_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
12464: install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_route_cmd);
12465: install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
12466: install_element (RESTRICTED_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
12467: install_element (RESTRICTED_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
12468:
12469: install_element (ENABLE_NODE, &show_ip_bgp_cmd);
12470: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cmd);
12471: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_cmd);
12472: install_element (ENABLE_NODE, &show_ip_bgp_route_cmd);
12473: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_cmd);
12474: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_route_cmd);
12475: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_route_cmd);
12476: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_route_cmd);
12477: install_element (ENABLE_NODE, &show_ip_bgp_prefix_cmd);
12478: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_cmd);
12479: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_prefix_cmd);
12480: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_prefix_cmd);
12481: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_prefix_cmd);
12482: install_element (ENABLE_NODE, &show_ip_bgp_view_cmd);
12483: install_element (ENABLE_NODE, &show_ip_bgp_view_route_cmd);
12484: install_element (ENABLE_NODE, &show_ip_bgp_view_prefix_cmd);
12485: install_element (ENABLE_NODE, &show_ip_bgp_regexp_cmd);
12486: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_regexp_cmd);
12487: install_element (ENABLE_NODE, &show_ip_bgp_prefix_list_cmd);
12488: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_list_cmd);
12489: install_element (ENABLE_NODE, &show_ip_bgp_filter_list_cmd);
12490: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_filter_list_cmd);
12491: install_element (ENABLE_NODE, &show_ip_bgp_route_map_cmd);
12492: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_route_map_cmd);
12493: install_element (ENABLE_NODE, &show_ip_bgp_cidr_only_cmd);
12494: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_cidr_only_cmd);
12495: install_element (ENABLE_NODE, &show_ip_bgp_community_all_cmd);
12496: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_all_cmd);
12497: install_element (ENABLE_NODE, &show_ip_bgp_community_cmd);
12498: install_element (ENABLE_NODE, &show_ip_bgp_community2_cmd);
12499: install_element (ENABLE_NODE, &show_ip_bgp_community3_cmd);
12500: install_element (ENABLE_NODE, &show_ip_bgp_community4_cmd);
12501: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_cmd);
12502: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_cmd);
12503: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_cmd);
12504: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_cmd);
12505: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_all_cmd);
12506: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community_cmd);
12507: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community2_cmd);
12508: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community3_cmd);
12509: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_community4_cmd);
12510: install_element (ENABLE_NODE, &show_ip_bgp_community_exact_cmd);
12511: install_element (ENABLE_NODE, &show_ip_bgp_community2_exact_cmd);
12512: install_element (ENABLE_NODE, &show_ip_bgp_community3_exact_cmd);
12513: install_element (ENABLE_NODE, &show_ip_bgp_community4_exact_cmd);
12514: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_exact_cmd);
12515: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community2_exact_cmd);
12516: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community3_exact_cmd);
12517: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community4_exact_cmd);
12518: install_element (ENABLE_NODE, &show_ip_bgp_community_list_cmd);
12519: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_cmd);
12520: install_element (ENABLE_NODE, &show_ip_bgp_community_list_exact_cmd);
12521: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_community_list_exact_cmd);
12522: install_element (ENABLE_NODE, &show_ip_bgp_prefix_longer_cmd);
12523: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_prefix_longer_cmd);
12524: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_advertised_route_cmd);
12525: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_advertised_route_cmd);
12526: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_routes_cmd);
12527: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_routes_cmd);
12528: install_element (ENABLE_NODE, &show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd);
12529: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_routes_cmd);
12530: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_routes_cmd);
12531: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_received_prefix_filter_cmd);
12532: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd);
12533: install_element (ENABLE_NODE, &show_ip_bgp_dampened_paths_cmd);
12534: install_element (ENABLE_NODE, &show_ip_bgp_flap_statistics_cmd);
12535: install_element (ENABLE_NODE, &show_ip_bgp_flap_address_cmd);
12536: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_cmd);
12537: install_element (ENABLE_NODE, &show_ip_bgp_flap_cidr_only_cmd);
12538: install_element (ENABLE_NODE, &show_ip_bgp_flap_regexp_cmd);
12539: install_element (ENABLE_NODE, &show_ip_bgp_flap_filter_list_cmd);
12540: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_list_cmd);
12541: install_element (ENABLE_NODE, &show_ip_bgp_flap_prefix_longer_cmd);
12542: install_element (ENABLE_NODE, &show_ip_bgp_flap_route_map_cmd);
12543: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_flap_cmd);
12544: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_damp_cmd);
12545: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_cmd);
12546: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_cmd);
12547: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_route_cmd);
12548: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_route_cmd);
12549: install_element (ENABLE_NODE, &show_ip_bgp_rsclient_prefix_cmd);
12550: install_element (ENABLE_NODE, &show_bgp_ipv4_safi_rsclient_prefix_cmd);
12551: install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_advertised_route_cmd);
12552: install_element (ENABLE_NODE, &show_ip_bgp_view_neighbor_received_routes_cmd);
12553: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_cmd);
12554: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_cmd);
12555: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_route_cmd);
12556: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_route_cmd);
12557: install_element (ENABLE_NODE, &show_ip_bgp_view_rsclient_prefix_cmd);
12558: install_element (ENABLE_NODE, &show_bgp_view_ipv4_safi_rsclient_prefix_cmd);
12559:
12560: /* BGP dampening clear commands */
12561: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_cmd);
12562: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_prefix_cmd);
12563: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_cmd);
12564: install_element (ENABLE_NODE, &clear_ip_bgp_dampening_address_mask_cmd);
12565:
12566: /* prefix count */
12567: install_element (ENABLE_NODE, &show_ip_bgp_neighbor_prefix_counts_cmd);
12568: install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
12569: install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
12570: #ifdef HAVE_IPV6
12571: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
12572:
12573: /* New config IPv6 BGP commands. */
12574: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_cmd);
12575: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_route_map_cmd);
12576: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_cmd);
12577: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_route_map_cmd);
12578:
12579: install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_cmd);
12580: install_element (BGP_IPV6_NODE, &ipv6_aggregate_address_summary_only_cmd);
12581: install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_cmd);
12582: install_element (BGP_IPV6_NODE, &no_ipv6_aggregate_address_summary_only_cmd);
12583:
12584: /* Old config IPv6 BGP commands. */
12585: install_element (BGP_NODE, &old_ipv6_bgp_network_cmd);
12586: install_element (BGP_NODE, &old_no_ipv6_bgp_network_cmd);
12587:
12588: install_element (BGP_NODE, &old_ipv6_aggregate_address_cmd);
12589: install_element (BGP_NODE, &old_ipv6_aggregate_address_summary_only_cmd);
12590: install_element (BGP_NODE, &old_no_ipv6_aggregate_address_cmd);
12591: install_element (BGP_NODE, &old_no_ipv6_aggregate_address_summary_only_cmd);
12592:
12593: install_element (VIEW_NODE, &show_bgp_cmd);
12594: install_element (VIEW_NODE, &show_bgp_ipv6_cmd);
12595: install_element (VIEW_NODE, &show_bgp_ipv6_safi_cmd);
12596: install_element (VIEW_NODE, &show_bgp_route_cmd);
12597: install_element (VIEW_NODE, &show_bgp_ipv6_route_cmd);
12598: install_element (VIEW_NODE, &show_bgp_ipv6_safi_route_cmd);
12599: install_element (VIEW_NODE, &show_bgp_prefix_cmd);
12600: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_cmd);
12601: install_element (VIEW_NODE, &show_bgp_ipv6_safi_prefix_cmd);
12602: install_element (VIEW_NODE, &show_bgp_regexp_cmd);
12603: install_element (VIEW_NODE, &show_bgp_ipv6_regexp_cmd);
12604: install_element (VIEW_NODE, &show_bgp_prefix_list_cmd);
12605: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_list_cmd);
12606: install_element (VIEW_NODE, &show_bgp_filter_list_cmd);
12607: install_element (VIEW_NODE, &show_bgp_ipv6_filter_list_cmd);
12608: install_element (VIEW_NODE, &show_bgp_route_map_cmd);
12609: install_element (VIEW_NODE, &show_bgp_ipv6_route_map_cmd);
12610: install_element (VIEW_NODE, &show_bgp_community_all_cmd);
12611: install_element (VIEW_NODE, &show_bgp_ipv6_community_all_cmd);
12612: install_element (VIEW_NODE, &show_bgp_community_cmd);
12613: install_element (VIEW_NODE, &show_bgp_ipv6_community_cmd);
12614: install_element (VIEW_NODE, &show_bgp_community2_cmd);
12615: install_element (VIEW_NODE, &show_bgp_ipv6_community2_cmd);
12616: install_element (VIEW_NODE, &show_bgp_community3_cmd);
12617: install_element (VIEW_NODE, &show_bgp_ipv6_community3_cmd);
12618: install_element (VIEW_NODE, &show_bgp_community4_cmd);
12619: install_element (VIEW_NODE, &show_bgp_ipv6_community4_cmd);
12620: install_element (VIEW_NODE, &show_bgp_community_exact_cmd);
12621: install_element (VIEW_NODE, &show_bgp_ipv6_community_exact_cmd);
12622: install_element (VIEW_NODE, &show_bgp_community2_exact_cmd);
12623: install_element (VIEW_NODE, &show_bgp_ipv6_community2_exact_cmd);
12624: install_element (VIEW_NODE, &show_bgp_community3_exact_cmd);
12625: install_element (VIEW_NODE, &show_bgp_ipv6_community3_exact_cmd);
12626: install_element (VIEW_NODE, &show_bgp_community4_exact_cmd);
12627: install_element (VIEW_NODE, &show_bgp_ipv6_community4_exact_cmd);
12628: install_element (VIEW_NODE, &show_bgp_community_list_cmd);
12629: install_element (VIEW_NODE, &show_bgp_ipv6_community_list_cmd);
12630: install_element (VIEW_NODE, &show_bgp_community_list_exact_cmd);
12631: install_element (VIEW_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12632: install_element (VIEW_NODE, &show_bgp_prefix_longer_cmd);
12633: install_element (VIEW_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12634: install_element (VIEW_NODE, &show_bgp_neighbor_advertised_route_cmd);
12635: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12636: install_element (VIEW_NODE, &show_bgp_neighbor_received_routes_cmd);
12637: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12638: install_element (VIEW_NODE, &show_bgp_neighbor_routes_cmd);
12639: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12640: install_element (VIEW_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12641: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
12642: install_element (VIEW_NODE, &show_bgp_neighbor_flap_cmd);
12643: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12644: install_element (VIEW_NODE, &show_bgp_neighbor_damp_cmd);
12645: install_element (VIEW_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
12646: install_element (VIEW_NODE, &show_bgp_rsclient_cmd);
12647: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
12648: install_element (VIEW_NODE, &show_bgp_rsclient_route_cmd);
12649: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
12650: install_element (VIEW_NODE, &show_bgp_rsclient_prefix_cmd);
12651: install_element (VIEW_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
12652: install_element (VIEW_NODE, &show_bgp_view_cmd);
12653: install_element (VIEW_NODE, &show_bgp_view_ipv6_cmd);
12654: install_element (VIEW_NODE, &show_bgp_view_route_cmd);
12655: install_element (VIEW_NODE, &show_bgp_view_ipv6_route_cmd);
12656: install_element (VIEW_NODE, &show_bgp_view_prefix_cmd);
12657: install_element (VIEW_NODE, &show_bgp_view_ipv6_prefix_cmd);
12658: install_element (VIEW_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12659: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12660: install_element (VIEW_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12661: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12662: install_element (VIEW_NODE, &show_bgp_view_neighbor_routes_cmd);
12663: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12664: install_element (VIEW_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12665: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12666: install_element (VIEW_NODE, &show_bgp_view_neighbor_flap_cmd);
12667: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12668: install_element (VIEW_NODE, &show_bgp_view_neighbor_damp_cmd);
12669: install_element (VIEW_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
12670: install_element (VIEW_NODE, &show_bgp_view_rsclient_cmd);
12671: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
12672: install_element (VIEW_NODE, &show_bgp_view_rsclient_route_cmd);
12673: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
12674: install_element (VIEW_NODE, &show_bgp_view_rsclient_prefix_cmd);
12675: install_element (VIEW_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
12676:
12677: /* Restricted:
12678: * VIEW_NODE - (set of dangerous commands) - (commands dependent on prev)
12679: */
12680: install_element (RESTRICTED_NODE, &show_bgp_route_cmd);
12681: install_element (RESTRICTED_NODE, &show_bgp_ipv6_route_cmd);
12682: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_route_cmd);
12683: install_element (RESTRICTED_NODE, &show_bgp_prefix_cmd);
12684: install_element (RESTRICTED_NODE, &show_bgp_ipv6_prefix_cmd);
12685: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_prefix_cmd);
12686: install_element (RESTRICTED_NODE, &show_bgp_community_cmd);
12687: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_cmd);
12688: install_element (RESTRICTED_NODE, &show_bgp_community2_cmd);
12689: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_cmd);
12690: install_element (RESTRICTED_NODE, &show_bgp_community3_cmd);
12691: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_cmd);
12692: install_element (RESTRICTED_NODE, &show_bgp_community4_cmd);
12693: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_cmd);
12694: install_element (RESTRICTED_NODE, &show_bgp_community_exact_cmd);
12695: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community_exact_cmd);
12696: install_element (RESTRICTED_NODE, &show_bgp_community2_exact_cmd);
12697: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community2_exact_cmd);
12698: install_element (RESTRICTED_NODE, &show_bgp_community3_exact_cmd);
12699: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community3_exact_cmd);
12700: install_element (RESTRICTED_NODE, &show_bgp_community4_exact_cmd);
12701: install_element (RESTRICTED_NODE, &show_bgp_ipv6_community4_exact_cmd);
12702: install_element (RESTRICTED_NODE, &show_bgp_rsclient_route_cmd);
12703: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
12704: install_element (RESTRICTED_NODE, &show_bgp_rsclient_prefix_cmd);
12705: install_element (RESTRICTED_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
12706: install_element (RESTRICTED_NODE, &show_bgp_view_route_cmd);
12707: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_route_cmd);
12708: install_element (RESTRICTED_NODE, &show_bgp_view_prefix_cmd);
12709: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_prefix_cmd);
12710: install_element (RESTRICTED_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12711: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12712: install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_route_cmd);
12713: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
12714: install_element (RESTRICTED_NODE, &show_bgp_view_rsclient_prefix_cmd);
12715: install_element (RESTRICTED_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
12716:
12717: install_element (ENABLE_NODE, &show_bgp_cmd);
12718: install_element (ENABLE_NODE, &show_bgp_ipv6_cmd);
12719: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_cmd);
12720: install_element (ENABLE_NODE, &show_bgp_route_cmd);
12721: install_element (ENABLE_NODE, &show_bgp_ipv6_route_cmd);
12722: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_route_cmd);
12723: install_element (ENABLE_NODE, &show_bgp_prefix_cmd);
12724: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_cmd);
12725: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_prefix_cmd);
12726: install_element (ENABLE_NODE, &show_bgp_regexp_cmd);
12727: install_element (ENABLE_NODE, &show_bgp_ipv6_regexp_cmd);
12728: install_element (ENABLE_NODE, &show_bgp_prefix_list_cmd);
12729: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_list_cmd);
12730: install_element (ENABLE_NODE, &show_bgp_filter_list_cmd);
12731: install_element (ENABLE_NODE, &show_bgp_ipv6_filter_list_cmd);
12732: install_element (ENABLE_NODE, &show_bgp_route_map_cmd);
12733: install_element (ENABLE_NODE, &show_bgp_ipv6_route_map_cmd);
12734: install_element (ENABLE_NODE, &show_bgp_community_all_cmd);
12735: install_element (ENABLE_NODE, &show_bgp_ipv6_community_all_cmd);
12736: install_element (ENABLE_NODE, &show_bgp_community_cmd);
12737: install_element (ENABLE_NODE, &show_bgp_ipv6_community_cmd);
12738: install_element (ENABLE_NODE, &show_bgp_community2_cmd);
12739: install_element (ENABLE_NODE, &show_bgp_ipv6_community2_cmd);
12740: install_element (ENABLE_NODE, &show_bgp_community3_cmd);
12741: install_element (ENABLE_NODE, &show_bgp_ipv6_community3_cmd);
12742: install_element (ENABLE_NODE, &show_bgp_community4_cmd);
12743: install_element (ENABLE_NODE, &show_bgp_ipv6_community4_cmd);
12744: install_element (ENABLE_NODE, &show_bgp_community_exact_cmd);
12745: install_element (ENABLE_NODE, &show_bgp_ipv6_community_exact_cmd);
12746: install_element (ENABLE_NODE, &show_bgp_community2_exact_cmd);
12747: install_element (ENABLE_NODE, &show_bgp_ipv6_community2_exact_cmd);
12748: install_element (ENABLE_NODE, &show_bgp_community3_exact_cmd);
12749: install_element (ENABLE_NODE, &show_bgp_ipv6_community3_exact_cmd);
12750: install_element (ENABLE_NODE, &show_bgp_community4_exact_cmd);
12751: install_element (ENABLE_NODE, &show_bgp_ipv6_community4_exact_cmd);
12752: install_element (ENABLE_NODE, &show_bgp_community_list_cmd);
12753: install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_cmd);
12754: install_element (ENABLE_NODE, &show_bgp_community_list_exact_cmd);
12755: install_element (ENABLE_NODE, &show_bgp_ipv6_community_list_exact_cmd);
12756: install_element (ENABLE_NODE, &show_bgp_prefix_longer_cmd);
12757: install_element (ENABLE_NODE, &show_bgp_ipv6_prefix_longer_cmd);
12758: install_element (ENABLE_NODE, &show_bgp_neighbor_advertised_route_cmd);
12759: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_advertised_route_cmd);
12760: install_element (ENABLE_NODE, &show_bgp_neighbor_received_routes_cmd);
12761: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_routes_cmd);
12762: install_element (ENABLE_NODE, &show_bgp_neighbor_routes_cmd);
12763: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_routes_cmd);
12764: install_element (ENABLE_NODE, &show_bgp_neighbor_received_prefix_filter_cmd);
12765: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_received_prefix_filter_cmd);
12766: install_element (ENABLE_NODE, &show_bgp_neighbor_flap_cmd);
12767: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_flap_cmd);
12768: install_element (ENABLE_NODE, &show_bgp_neighbor_damp_cmd);
12769: install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_damp_cmd);
12770: install_element (ENABLE_NODE, &show_bgp_rsclient_cmd);
12771: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_cmd);
12772: install_element (ENABLE_NODE, &show_bgp_rsclient_route_cmd);
12773: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_route_cmd);
12774: install_element (ENABLE_NODE, &show_bgp_rsclient_prefix_cmd);
12775: install_element (ENABLE_NODE, &show_bgp_ipv6_safi_rsclient_prefix_cmd);
12776: install_element (ENABLE_NODE, &show_bgp_view_cmd);
12777: install_element (ENABLE_NODE, &show_bgp_view_ipv6_cmd);
12778: install_element (ENABLE_NODE, &show_bgp_view_route_cmd);
12779: install_element (ENABLE_NODE, &show_bgp_view_ipv6_route_cmd);
12780: install_element (ENABLE_NODE, &show_bgp_view_prefix_cmd);
12781: install_element (ENABLE_NODE, &show_bgp_view_ipv6_prefix_cmd);
12782: install_element (ENABLE_NODE, &show_bgp_view_neighbor_advertised_route_cmd);
12783: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_advertised_route_cmd);
12784: install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_routes_cmd);
12785: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_routes_cmd);
12786: install_element (ENABLE_NODE, &show_bgp_view_neighbor_routes_cmd);
12787: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_routes_cmd);
12788: install_element (ENABLE_NODE, &show_bgp_view_neighbor_received_prefix_filter_cmd);
12789: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd);
12790: install_element (ENABLE_NODE, &show_bgp_view_neighbor_flap_cmd);
12791: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_flap_cmd);
12792: install_element (ENABLE_NODE, &show_bgp_view_neighbor_damp_cmd);
12793: install_element (ENABLE_NODE, &show_bgp_view_ipv6_neighbor_damp_cmd);
12794: install_element (ENABLE_NODE, &show_bgp_view_rsclient_cmd);
12795: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_cmd);
12796: install_element (ENABLE_NODE, &show_bgp_view_rsclient_route_cmd);
12797: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_route_cmd);
12798: install_element (ENABLE_NODE, &show_bgp_view_rsclient_prefix_cmd);
12799: install_element (ENABLE_NODE, &show_bgp_view_ipv6_safi_rsclient_prefix_cmd);
12800:
12801: /* Statistics */
12802: install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
12803: install_element (ENABLE_NODE, &show_bgp_statistics_vpnv4_cmd);
12804: install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
12805: install_element (ENABLE_NODE, &show_bgp_statistics_view_vpnv4_cmd);
12806:
12807: /* old command */
12808: install_element (VIEW_NODE, &show_ipv6_bgp_cmd);
12809: install_element (VIEW_NODE, &show_ipv6_bgp_route_cmd);
12810: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_cmd);
12811: install_element (VIEW_NODE, &show_ipv6_bgp_regexp_cmd);
12812: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_list_cmd);
12813: install_element (VIEW_NODE, &show_ipv6_bgp_filter_list_cmd);
12814: install_element (VIEW_NODE, &show_ipv6_bgp_community_all_cmd);
12815: install_element (VIEW_NODE, &show_ipv6_bgp_community_cmd);
12816: install_element (VIEW_NODE, &show_ipv6_bgp_community2_cmd);
12817: install_element (VIEW_NODE, &show_ipv6_bgp_community3_cmd);
12818: install_element (VIEW_NODE, &show_ipv6_bgp_community4_cmd);
12819: install_element (VIEW_NODE, &show_ipv6_bgp_community_exact_cmd);
12820: install_element (VIEW_NODE, &show_ipv6_bgp_community2_exact_cmd);
12821: install_element (VIEW_NODE, &show_ipv6_bgp_community3_exact_cmd);
12822: install_element (VIEW_NODE, &show_ipv6_bgp_community4_exact_cmd);
12823: install_element (VIEW_NODE, &show_ipv6_bgp_community_list_cmd);
12824: install_element (VIEW_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12825: install_element (VIEW_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12826: install_element (VIEW_NODE, &show_ipv6_mbgp_cmd);
12827: install_element (VIEW_NODE, &show_ipv6_mbgp_route_cmd);
12828: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_cmd);
12829: install_element (VIEW_NODE, &show_ipv6_mbgp_regexp_cmd);
12830: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12831: install_element (VIEW_NODE, &show_ipv6_mbgp_filter_list_cmd);
12832: install_element (VIEW_NODE, &show_ipv6_mbgp_community_all_cmd);
12833: install_element (VIEW_NODE, &show_ipv6_mbgp_community_cmd);
12834: install_element (VIEW_NODE, &show_ipv6_mbgp_community2_cmd);
12835: install_element (VIEW_NODE, &show_ipv6_mbgp_community3_cmd);
12836: install_element (VIEW_NODE, &show_ipv6_mbgp_community4_cmd);
12837: install_element (VIEW_NODE, &show_ipv6_mbgp_community_exact_cmd);
12838: install_element (VIEW_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12839: install_element (VIEW_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12840: install_element (VIEW_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12841: install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_cmd);
12842: install_element (VIEW_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12843: install_element (VIEW_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12844:
12845: /* old command */
12846: install_element (ENABLE_NODE, &show_ipv6_bgp_cmd);
12847: install_element (ENABLE_NODE, &show_ipv6_bgp_route_cmd);
12848: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_cmd);
12849: install_element (ENABLE_NODE, &show_ipv6_bgp_regexp_cmd);
12850: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_list_cmd);
12851: install_element (ENABLE_NODE, &show_ipv6_bgp_filter_list_cmd);
12852: install_element (ENABLE_NODE, &show_ipv6_bgp_community_all_cmd);
12853: install_element (ENABLE_NODE, &show_ipv6_bgp_community_cmd);
12854: install_element (ENABLE_NODE, &show_ipv6_bgp_community2_cmd);
12855: install_element (ENABLE_NODE, &show_ipv6_bgp_community3_cmd);
12856: install_element (ENABLE_NODE, &show_ipv6_bgp_community4_cmd);
12857: install_element (ENABLE_NODE, &show_ipv6_bgp_community_exact_cmd);
12858: install_element (ENABLE_NODE, &show_ipv6_bgp_community2_exact_cmd);
12859: install_element (ENABLE_NODE, &show_ipv6_bgp_community3_exact_cmd);
12860: install_element (ENABLE_NODE, &show_ipv6_bgp_community4_exact_cmd);
12861: install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_cmd);
12862: install_element (ENABLE_NODE, &show_ipv6_bgp_community_list_exact_cmd);
12863: install_element (ENABLE_NODE, &show_ipv6_bgp_prefix_longer_cmd);
12864: install_element (ENABLE_NODE, &show_ipv6_mbgp_cmd);
12865: install_element (ENABLE_NODE, &show_ipv6_mbgp_route_cmd);
12866: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_cmd);
12867: install_element (ENABLE_NODE, &show_ipv6_mbgp_regexp_cmd);
12868: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_list_cmd);
12869: install_element (ENABLE_NODE, &show_ipv6_mbgp_filter_list_cmd);
12870: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_all_cmd);
12871: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_cmd);
12872: install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_cmd);
12873: install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_cmd);
12874: install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_cmd);
12875: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_exact_cmd);
12876: install_element (ENABLE_NODE, &show_ipv6_mbgp_community2_exact_cmd);
12877: install_element (ENABLE_NODE, &show_ipv6_mbgp_community3_exact_cmd);
12878: install_element (ENABLE_NODE, &show_ipv6_mbgp_community4_exact_cmd);
12879: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_cmd);
12880: install_element (ENABLE_NODE, &show_ipv6_mbgp_community_list_exact_cmd);
12881: install_element (ENABLE_NODE, &show_ipv6_mbgp_prefix_longer_cmd);
12882:
12883: /* old command */
12884: install_element (VIEW_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12885: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_advertised_route_cmd);
12886: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12887: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_advertised_route_cmd);
12888:
12889: /* old command */
12890: install_element (VIEW_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12891: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_received_routes_cmd);
12892: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12893: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_received_routes_cmd);
12894:
12895: /* old command */
12896: install_element (VIEW_NODE, &ipv6_bgp_neighbor_routes_cmd);
12897: install_element (ENABLE_NODE, &ipv6_bgp_neighbor_routes_cmd);
12898: install_element (VIEW_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12899: install_element (ENABLE_NODE, &ipv6_mbgp_neighbor_routes_cmd);
12900: #endif /* HAVE_IPV6 */
12901:
12902: install_element (BGP_NODE, &bgp_distance_cmd);
12903: install_element (BGP_NODE, &no_bgp_distance_cmd);
12904: install_element (BGP_NODE, &no_bgp_distance2_cmd);
12905: install_element (BGP_NODE, &bgp_distance_source_cmd);
12906: install_element (BGP_NODE, &no_bgp_distance_source_cmd);
12907: install_element (BGP_NODE, &bgp_distance_source_access_list_cmd);
12908: install_element (BGP_NODE, &no_bgp_distance_source_access_list_cmd);
12909:
12910: install_element (BGP_NODE, &bgp_damp_set_cmd);
12911: install_element (BGP_NODE, &bgp_damp_set2_cmd);
12912: install_element (BGP_NODE, &bgp_damp_set3_cmd);
12913: install_element (BGP_NODE, &bgp_damp_unset_cmd);
12914: install_element (BGP_NODE, &bgp_damp_unset2_cmd);
12915: install_element (BGP_IPV4_NODE, &bgp_damp_set_cmd);
12916: install_element (BGP_IPV4_NODE, &bgp_damp_set2_cmd);
12917: install_element (BGP_IPV4_NODE, &bgp_damp_set3_cmd);
12918: install_element (BGP_IPV4_NODE, &bgp_damp_unset_cmd);
12919: install_element (BGP_IPV4_NODE, &bgp_damp_unset2_cmd);
12920:
12921: /* Deprecated AS-Pathlimit commands */
12922: install_element (BGP_NODE, &bgp_network_ttl_cmd);
12923: install_element (BGP_NODE, &bgp_network_mask_ttl_cmd);
12924: install_element (BGP_NODE, &bgp_network_mask_natural_ttl_cmd);
12925: install_element (BGP_NODE, &bgp_network_backdoor_ttl_cmd);
12926: install_element (BGP_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12927: install_element (BGP_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12928:
12929: install_element (BGP_NODE, &no_bgp_network_ttl_cmd);
12930: install_element (BGP_NODE, &no_bgp_network_mask_ttl_cmd);
12931: install_element (BGP_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12932: install_element (BGP_NODE, &no_bgp_network_backdoor_ttl_cmd);
12933: install_element (BGP_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12934: install_element (BGP_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12935:
12936: install_element (BGP_IPV4_NODE, &bgp_network_ttl_cmd);
12937: install_element (BGP_IPV4_NODE, &bgp_network_mask_ttl_cmd);
12938: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_ttl_cmd);
12939: install_element (BGP_IPV4_NODE, &bgp_network_backdoor_ttl_cmd);
12940: install_element (BGP_IPV4_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12941: install_element (BGP_IPV4_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12942:
12943: install_element (BGP_IPV4_NODE, &no_bgp_network_ttl_cmd);
12944: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_ttl_cmd);
12945: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12946: install_element (BGP_IPV4_NODE, &no_bgp_network_backdoor_ttl_cmd);
12947: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12948: install_element (BGP_IPV4_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12949:
12950: install_element (BGP_IPV4M_NODE, &bgp_network_ttl_cmd);
12951: install_element (BGP_IPV4M_NODE, &bgp_network_mask_ttl_cmd);
12952: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_ttl_cmd);
12953: install_element (BGP_IPV4M_NODE, &bgp_network_backdoor_ttl_cmd);
12954: install_element (BGP_IPV4M_NODE, &bgp_network_mask_backdoor_ttl_cmd);
12955: install_element (BGP_IPV4M_NODE, &bgp_network_mask_natural_backdoor_ttl_cmd);
12956:
12957: install_element (BGP_IPV4M_NODE, &no_bgp_network_ttl_cmd);
12958: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_ttl_cmd);
12959: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_ttl_cmd);
12960: install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd);
12961: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd);
12962: install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd);
12963:
12964: #ifdef HAVE_IPV6
12965: install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd);
12966: install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd);
12967: #endif
12968: }
12969:
12970: void
12971: bgp_route_finish (void)
12972: {
12973: bgp_table_unlock (bgp_distance_table);
12974: bgp_distance_table = NULL;
12975: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>