1 /* BGP-4, BGP-4+ daemon program
2 Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
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
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.
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
28 #include "sockunion.h"
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_table.h"
40 #include "bgpd/bgp_aspath.h"
41 #include "bgpd/bgp_route.h"
42 #include "bgpd/bgp_dump.h"
43 #include "bgpd/bgp_debug.h"
44 #include "bgpd/bgp_community.h"
45 #include "bgpd/bgp_attr.h"
46 #include "bgpd/bgp_regex.h"
47 #include "bgpd/bgp_clist.h"
48 #include "bgpd/bgp_fsm.h"
49 #include "bgpd/bgp_packet.h"
50 #include "bgpd/bgp_zebra.h"
51 #include "bgpd/bgp_open.h"
52 #include "bgpd/bgp_filter.h"
53 #include "bgpd/bgp_nexthop.h"
54 #include "bgpd/bgp_damp.h"
55 #include "bgpd/bgp_mplsvpn.h"
56 #include "bgpd/bgp_advertise.h"
57 #include "bgpd/bgp_network.h"
58 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_snmp.h"
61 #endif /* HAVE_SNMP */
63 /* BGP process wide configuration. */
64 static struct bgp_master bgp_master
;
66 /* BGP process wide configuration pointer to export. */
67 struct bgp_master
*bm
;
69 /* BGP community-list. */
70 struct community_list_handler
*bgp_clist
;
72 /* BGP global flag manipulation. */
74 bgp_option_set (int flag
)
79 case BGP_OPT_MULTIPLE_INSTANCE
:
80 case BGP_OPT_CONFIG_CISCO
:
81 SET_FLAG (bm
->options
, flag
);
84 return BGP_ERR_INVALID_FLAG
;
91 bgp_option_unset (int flag
)
95 case BGP_OPT_MULTIPLE_INSTANCE
:
96 if (listcount (bm
->bgp
) > 1)
97 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
100 case BGP_OPT_CONFIG_CISCO
:
101 UNSET_FLAG (bm
->options
, flag
);
104 return BGP_ERR_INVALID_FLAG
;
111 bgp_option_check (int flag
)
113 return CHECK_FLAG (bm
->options
, flag
);
116 /* BGP flag manipulation. */
118 bgp_flag_set (struct bgp
*bgp
, int flag
)
120 SET_FLAG (bgp
->flags
, flag
);
125 bgp_flag_unset (struct bgp
*bgp
, int flag
)
127 UNSET_FLAG (bgp
->flags
, flag
);
132 bgp_flag_check (struct bgp
*bgp
, int flag
)
134 return CHECK_FLAG (bgp
->flags
, flag
);
137 /* Internal function to set BGP structure configureation flag. */
139 bgp_config_set (struct bgp
*bgp
, int config
)
141 SET_FLAG (bgp
->config
, config
);
145 bgp_config_unset (struct bgp
*bgp
, int config
)
147 UNSET_FLAG (bgp
->config
, config
);
151 bgp_config_check (struct bgp
*bgp
, int config
)
153 return CHECK_FLAG (bgp
->config
, config
);
156 /* Set BGP router identifier. */
158 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
163 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
164 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
167 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
168 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
170 /* Set all peer's local identifier with this value. */
171 LIST_LOOP (bgp
->peer
, peer
, nn
)
173 IPV4_ADDR_COPY (&peer
->local_id
, id
);
175 if (peer
->status
== Established
)
176 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
177 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
182 /* Unset BGP router identifier. */
184 bgp_router_id_unset (struct bgp
*bgp
)
189 if (! bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
))
192 bgp
->router_id
.s_addr
= 0;
193 bgp_config_unset (bgp
, BGP_CONFIG_ROUTER_ID
);
195 /* Clear peer router id configuration. */
196 LIST_LOOP (bgp
->peer
, peer
, nn
)
198 peer
->local_id
.s_addr
= 0;
201 /* Set router-id from interface's address. */
202 bgp_if_update_all ();
204 /* Reset all BGP sessions to use new router-id. */
205 LIST_LOOP (bgp
->peer
, peer
, nn
)
207 if (peer
->status
== Established
)
208 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
209 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
215 /* BGP's cluster-id control. */
217 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
222 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
223 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
226 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
227 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
229 /* Clear all IBGP peer. */
230 LIST_LOOP (bgp
->peer
, peer
, nn
)
232 if (peer_sort (peer
) != BGP_PEER_IBGP
)
235 if (peer
->status
== Established
)
236 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
237 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
243 bgp_cluster_id_unset (struct bgp
*bgp
)
248 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
251 bgp
->cluster_id
.s_addr
= 0;
252 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
254 /* Clear all IBGP peer. */
255 LIST_LOOP (bgp
->peer
, peer
, nn
)
257 if (peer_sort (peer
) != BGP_PEER_IBGP
)
260 if (peer
->status
== Established
)
261 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
262 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
267 /* BGP timer configuration. */
269 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
271 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
272 ? keepalive
: holdtime
/ 3);
273 bgp
->default_holdtime
= holdtime
;
279 bgp_timers_unset (struct bgp
*bgp
)
281 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
282 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
287 /* BGP confederation configuration. */
289 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
296 return BGP_ERR_INVALID_AS
;
298 /* Remember - were we doing confederation before? */
299 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
301 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
303 /* If we were doing confederation already, this is just an external
304 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
305 were not doing confederation before, reset all EBGP sessions. */
306 LIST_LOOP (bgp
->peer
, peer
, nn
)
308 /* We're looking for peers who's AS is not local or part of our
312 if (peer_sort (peer
) == BGP_PEER_EBGP
)
315 if (peer
->status
== Established
)
316 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
317 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
319 BGP_EVENT_ADD (peer
, BGP_Stop
);
324 /* Not doign confederation before, so reset every non-local
326 if (peer_sort (peer
) != BGP_PEER_IBGP
)
328 /* Reset the local_as to be our EBGP one */
329 if (peer_sort (peer
) == BGP_PEER_EBGP
)
331 if (peer
->status
== Established
)
332 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
333 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
335 BGP_EVENT_ADD (peer
, BGP_Stop
);
343 bgp_confederation_id_unset (struct bgp
*bgp
)
349 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
351 LIST_LOOP (bgp
->peer
, peer
, nn
)
353 /* We're looking for peers who's AS is not local */
354 if (peer_sort (peer
) != BGP_PEER_IBGP
)
356 peer
->local_as
= bgp
->as
;
357 if (peer
->status
== Established
)
358 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
359 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
361 BGP_EVENT_ADD (peer
, BGP_Stop
);
367 /* Is an AS part of the confed or not? */
369 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
376 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
377 if (bgp
->confed_peers
[i
] == as
)
383 /* Add an AS to the confederation set. */
385 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
391 return BGP_ERR_INVALID_BGP
;
394 return BGP_ERR_INVALID_AS
;
396 if (bgp_confederation_peers_check (bgp
, as
))
399 if (bgp
->confed_peers
)
400 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
402 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
404 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
405 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
407 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
408 bgp
->confed_peers_cnt
++;
410 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
412 LIST_LOOP (bgp
->peer
, peer
, nn
)
416 peer
->local_as
= bgp
->as
;
417 if (peer
->status
== Established
)
418 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
419 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
421 BGP_EVENT_ADD (peer
, BGP_Stop
);
428 /* Delete an AS from the confederation set. */
430 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
440 if (! bgp_confederation_peers_check (bgp
, as
))
443 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
444 if (bgp
->confed_peers
[i
] == as
)
445 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
446 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
448 bgp
->confed_peers_cnt
--;
450 if (bgp
->confed_peers_cnt
== 0)
452 if (bgp
->confed_peers
)
453 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
454 bgp
->confed_peers
= NULL
;
457 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
459 bgp
->confed_peers_cnt
* sizeof (as_t
));
461 /* Now reset any peer who's remote AS has just been removed from the
463 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
465 LIST_LOOP (bgp
->peer
, peer
, nn
)
469 peer
->local_as
= bgp
->confed_id
;
470 if (peer
->status
== Established
)
471 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
472 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
474 BGP_EVENT_ADD (peer
, BGP_Stop
);
482 /* Local preference configuration. */
484 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
489 bgp_config_set (bgp
, BGP_CONFIG_DEFAULT_LOCAL_PREF
);
490 bgp
->default_local_pref
= local_pref
;
496 bgp_default_local_preference_unset (struct bgp
*bgp
)
501 bgp_config_unset (bgp
, BGP_CONFIG_DEFAULT_LOCAL_PREF
);
502 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
507 /* Peer comparison function for sorting. */
509 peer_cmp (struct peer
*p1
, struct peer
*p2
)
511 return sockunion_cmp (&p1
->su
, &p2
->su
);
515 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
517 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
520 /* Reset all address family specific configuration. */
522 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
525 struct bgp_filter
*filter
;
526 char orf_name
[BUFSIZ
];
528 filter
= &peer
->filter
[afi
][safi
];
530 /* Clear neighbor filter and route-map */
531 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
533 if (filter
->dlist
[i
].name
)
535 free (filter
->dlist
[i
].name
);
536 filter
->dlist
[i
].name
= NULL
;
538 if (filter
->plist
[i
].name
)
540 free (filter
->plist
[i
].name
);
541 filter
->plist
[i
].name
= NULL
;
543 if (filter
->aslist
[i
].name
)
545 free (filter
->aslist
[i
].name
);
546 filter
->aslist
[i
].name
= NULL
;
548 if (filter
->map
[i
].name
)
550 free (filter
->map
[i
].name
);
551 filter
->map
[i
].name
= NULL
;
555 /* Clear unsuppress map. */
556 if (filter
->usmap
.name
)
557 free (filter
->usmap
.name
);
558 filter
->usmap
.name
= NULL
;
559 filter
->usmap
.map
= NULL
;
561 /* Clear neighbor's all address family flags. */
562 peer
->af_flags
[afi
][safi
] = 0;
564 /* Clear neighbor's all address family sflags. */
565 peer
->af_sflags
[afi
][safi
] = 0;
567 /* Clear neighbor's all address family capabilities. */
568 peer
->af_cap
[afi
][safi
] = 0;
571 peer
->orf_plist
[afi
][safi
] = NULL
;
572 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
573 prefix_bgp_orf_remove_all (orf_name
);
575 /* Set default neighbor send-community. */
576 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
578 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
579 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
582 /* Clear neighbor default_originate_rmap */
583 if (peer
->default_rmap
[afi
][safi
].name
)
584 free (peer
->default_rmap
[afi
][safi
].name
);
585 peer
->default_rmap
[afi
][safi
].name
= NULL
;
586 peer
->default_rmap
[afi
][safi
].map
= NULL
;
588 /* Clear neighbor maximum-prefix */
589 peer
->pmax
[afi
][safi
] = 0;
592 /* peer global config reset */
594 peer_global_config_reset (struct peer
*peer
)
597 peer
->change_local_as
= 0;
598 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
599 if (peer
->update_source
)
601 sockunion_free (peer
->update_source
);
602 peer
->update_source
= NULL
;
606 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
607 peer
->update_if
= NULL
;
610 if (peer_sort (peer
) == BGP_PEER_IBGP
)
611 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
613 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
620 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
623 /* Check peer's AS number and determin is this peer IBGP or EBGP */
625 peer_sort (struct peer
*peer
)
632 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
635 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
639 peer1
= listnode_head (peer
->group
->peer
);
641 return (peer1
->local_as
== peer1
->as
642 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
644 return BGP_PEER_INTERNAL
;
648 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
650 if (peer
->local_as
== 0)
651 return BGP_PEER_INTERNAL
;
653 if (peer
->local_as
== peer
->as
)
655 if (peer
->local_as
== bgp
->confed_id
)
656 return BGP_PEER_EBGP
;
658 return BGP_PEER_IBGP
;
661 if (bgp_confederation_peers_check (bgp
, peer
->as
))
662 return BGP_PEER_CONFED
;
664 return BGP_PEER_EBGP
;
668 return (peer
->local_as
== 0
669 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
670 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
674 /* Allocate new peer object. */
683 /* Allocate new peer. */
684 peer
= XMALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
685 memset (peer
, 0, sizeof (struct peer
));
687 /* Set default value. */
689 peer
->v_start
= BGP_INIT_START_TIMER
;
690 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
691 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
693 peer
->ostatus
= Idle
;
694 peer
->version
= BGP_VERSION_4
;
697 /* Set default flags. */
698 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
699 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
701 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
703 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
704 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
706 peer
->orf_plist
[afi
][safi
] = NULL
;
708 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
710 /* Create buffers. */
711 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
712 peer
->obuf
= stream_fifo_new ();
713 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
);
715 bgp_sync_init (peer
);
717 /* Get service port number. */
718 sp
= getservbyname ("bgp", "tcp");
719 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
724 /* Create new BGP peer. */
726 peer_create (union sockunion
*su
, struct bgp
*bgp
, as_t local_as
,
727 as_t remote_as
, afi_t afi
, safi_t safi
)
731 char buf
[SU_ADDRSTRLEN
];
736 peer
->local_as
= local_as
;
737 peer
->as
= remote_as
;
738 peer
->local_id
= bgp
->router_id
;
739 peer
->v_holdtime
= bgp
->default_holdtime
;
740 peer
->v_keepalive
= bgp
->default_keepalive
;
741 if (peer_sort (peer
) == BGP_PEER_IBGP
)
742 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
744 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
745 listnode_add_sort (bgp
->peer
, peer
);
747 active
= peer_active (peer
);
750 peer
->afc
[afi
][safi
] = 1;
752 /* Last read time set */
753 peer
->readtime
= time (NULL
);
755 /* Default TTL set. */
756 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
758 /* Make peer's address string. */
759 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
760 peer
->host
= strdup (buf
);
762 /* Set up peer's events and timers. */
763 if (! active
&& peer_active (peer
))
764 bgp_timer_set (peer
);
769 /* Make accept BGP peer. Called from bgp_accept (). */
771 peer_create_accept (struct bgp
*bgp
)
777 listnode_add_sort (bgp
->peer
, peer
);
782 /* Change peer's AS number. */
784 peer_as_change (struct peer
*peer
, as_t as
)
789 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
791 if (peer
->status
== Established
)
792 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
793 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
795 BGP_EVENT_ADD (peer
, BGP_Stop
);
797 type
= peer_sort (peer
);
800 /* Advertisement-interval reset */
801 if (peer_sort (peer
) == BGP_PEER_IBGP
)
802 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
804 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
807 if (peer_sort (peer
) == BGP_PEER_IBGP
)
809 else if (type
== BGP_PEER_IBGP
)
812 /* reflector-client reset */
813 if (peer_sort (peer
) != BGP_PEER_IBGP
)
815 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
816 PEER_FLAG_REFLECTOR_CLIENT
);
817 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
818 PEER_FLAG_REFLECTOR_CLIENT
);
819 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
820 PEER_FLAG_REFLECTOR_CLIENT
);
821 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
822 PEER_FLAG_REFLECTOR_CLIENT
);
823 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
824 PEER_FLAG_REFLECTOR_CLIENT
);
828 if (peer_sort (peer
) != BGP_PEER_EBGP
)
830 peer
->change_local_as
= 0;
831 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
835 /* If peer does not exist, create new one. If peer already exists,
836 set AS number to the peer. */
838 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, as_t
*as
,
839 afi_t afi
, safi_t safi
)
844 peer
= peer_lookup (bgp
, su
);
848 /* When this peer is a member of peer-group. */
851 if (peer
->group
->conf
->as
)
853 /* Return peer group's AS number. */
854 *as
= peer
->group
->conf
->as
;
855 return BGP_ERR_PEER_GROUP_MEMBER
;
857 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
862 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
870 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
875 /* Existing peer's AS number change. */
877 peer_as_change (peer
, *as
);
882 /* If the peer is not part of our confederation, and its not an
883 iBGP peer then spoof the source AS */
884 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
885 && ! bgp_confederation_peers_check (bgp
, *as
)
887 local_as
= bgp
->confed_id
;
891 /* If this is IPv4 unicast configuration and "no bgp default
892 ipv4-unicast" is specified. */
894 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
895 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
896 peer
= peer_create (su
, bgp
, local_as
, *as
, 0, 0);
898 peer
= peer_create (su
, bgp
, local_as
, *as
, afi
, safi
);
904 /* Activate the peer or peer group for specified AFI and SAFI. */
906 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
910 if (peer
->afc
[afi
][safi
])
913 /* Activate the address family configuration. */
914 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
915 peer
->afc
[afi
][safi
] = 1;
918 active
= peer_active (peer
);
920 peer
->afc
[afi
][safi
] = 1;
922 if (! active
&& peer_active (peer
))
923 bgp_timer_set (peer
);
926 if (peer
->status
== Established
)
928 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
930 peer
->afc_adv
[afi
][safi
] = 1;
931 bgp_capability_send (peer
, afi
, safi
,
933 CAPABILITY_ACTION_SET
);
934 if (peer
->afc_recv
[afi
][safi
])
936 peer
->afc_nego
[afi
][safi
] = 1;
937 bgp_announce_route (peer
, afi
, safi
);
941 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
942 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
950 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
952 struct peer_group
*group
;
956 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
960 LIST_LOOP (group
->peer
, peer1
, nn
)
962 if (peer1
->af_group
[afi
][safi
])
963 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
968 if (peer
->af_group
[afi
][safi
])
969 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
972 if (! peer
->afc
[afi
][safi
])
975 /* De-activate the address family configuration. */
976 peer
->afc
[afi
][safi
] = 0;
977 peer_af_flag_reset (peer
, afi
, safi
);
979 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
981 if (peer
->status
== Established
)
983 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
985 peer
->afc_adv
[afi
][safi
] = 0;
986 peer
->afc_nego
[afi
][safi
] = 0;
988 if (peer_active_nego (peer
))
990 bgp_capability_send (peer
, afi
, safi
,
992 CAPABILITY_ACTION_UNSET
);
993 bgp_clear_route (peer
, afi
, safi
);
994 peer
->pcount
[afi
][safi
] = 0;
997 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
998 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1001 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1002 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1008 /* Delete peer from confguration. */
1010 peer_delete (struct peer
*peer
)
1016 struct bgp_filter
*filter
;
1020 /* If this peer belongs to peer group. Clearn up the
1024 listnode_delete (peer
->group
->peer
, peer
);
1028 /* Withdraw all information from routing table. We can not use
1029 BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1030 executed after peer structure is deleted. */
1032 bgp_fsm_change_status (peer
, Idle
);
1034 /* Stop all timers. */
1035 BGP_TIMER_OFF (peer
->t_start
);
1036 BGP_TIMER_OFF (peer
->t_connect
);
1037 BGP_TIMER_OFF (peer
->t_holdtime
);
1038 BGP_TIMER_OFF (peer
->t_keepalive
);
1039 BGP_TIMER_OFF (peer
->t_asorig
);
1040 BGP_TIMER_OFF (peer
->t_routeadv
);
1042 /* Delete from all peer list. */
1043 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1044 listnode_delete (bgp
->peer
, peer
);
1048 stream_free (peer
->ibuf
);
1051 stream_fifo_free (peer
->obuf
);
1054 stream_free (peer
->work
);
1056 /* Free allocated host character. */
1060 /* Local and remote addresses. */
1062 XFREE (MTYPE_TMP
, peer
->su_local
);
1063 if (peer
->su_remote
)
1064 XFREE (MTYPE_TMP
, peer
->su_remote
);
1066 /* Peer description string. */
1068 XFREE (MTYPE_TMP
, peer
->desc
);
1070 bgp_sync_delete (peer
);
1072 /* Free filter related memory. */
1073 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1074 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1076 filter
= &peer
->filter
[afi
][safi
];
1078 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1080 if (filter
->dlist
[i
].name
)
1081 free (filter
->dlist
[i
].name
);
1082 if (filter
->plist
[i
].name
)
1083 free (filter
->plist
[i
].name
);
1084 if (filter
->aslist
[i
].name
)
1085 free (filter
->aslist
[i
].name
);
1086 if (filter
->map
[i
].name
)
1087 free (filter
->map
[i
].name
);
1090 if (filter
->usmap
.name
)
1091 free (filter
->usmap
.name
);
1093 if (peer
->default_rmap
[afi
][safi
].name
)
1094 free (peer
->default_rmap
[afi
][safi
].name
);
1097 /* Update source configuration. */
1098 if (peer
->update_source
)
1100 sockunion_free (peer
->update_source
);
1101 peer
->update_source
= NULL
;
1103 if (peer
->update_if
)
1105 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1106 peer
->update_if
= NULL
;
1109 /* Free peer structure. */
1110 XFREE (MTYPE_BGP_PEER
, peer
);
1116 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1118 return strcmp (g1
->name
, g2
->name
);
1121 /* If peer is configured at least one address family return 1. */
1123 peer_group_active (struct peer
*peer
)
1125 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1126 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1127 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1128 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1129 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1134 /* Peer group cofiguration. */
1135 static struct peer_group
*
1138 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1139 sizeof (struct peer_group
));
1143 peer_group_free (struct peer_group
*group
)
1145 XFREE (MTYPE_PEER_GROUP
, group
);
1149 peer_group_lookup (struct bgp
*bgp
, char *name
)
1151 struct peer_group
*group
;
1152 struct listnode
*nn
;
1154 LIST_LOOP (bgp
->group
, group
, nn
)
1156 if (strcmp (group
->name
, name
) == 0)
1163 peer_group_get (struct bgp
*bgp
, char *name
)
1165 struct peer_group
*group
;
1167 group
= peer_group_lookup (bgp
, name
);
1171 group
= peer_group_new ();
1173 group
->name
= strdup (name
);
1174 group
->peer
= list_new ();
1175 group
->conf
= peer_new ();
1176 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1177 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1178 group
->conf
->host
= strdup (name
);
1179 group
->conf
->bgp
= bgp
;
1180 group
->conf
->group
= group
;
1181 group
->conf
->as
= 0;
1182 group
->conf
->ttl
= 1;
1183 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1184 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1185 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1186 group
->conf
->keepalive
= 0;
1187 group
->conf
->holdtime
= 0;
1188 group
->conf
->connect
= 0;
1189 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1190 listnode_add_sort (bgp
->group
, group
);
1196 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1197 afi_t afi
, safi_t safi
)
1200 int out
= FILTER_OUT
;
1202 struct bgp_filter
*pfilter
;
1203 struct bgp_filter
*gfilter
;
1206 pfilter
= &peer
->filter
[afi
][safi
];
1207 gfilter
= &conf
->filter
[afi
][safi
];
1211 peer
->as
= conf
->as
;
1214 if (conf
->change_local_as
)
1215 peer
->change_local_as
= conf
->change_local_as
;
1218 peer
->ttl
= conf
->ttl
;
1221 peer
->weight
= conf
->weight
;
1223 /* peer flags apply */
1224 peer
->flags
= conf
->flags
;
1225 /* peer af_flags apply */
1226 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1227 /* peer config apply */
1228 peer
->config
= conf
->config
;
1230 /* peer timers apply */
1231 peer
->holdtime
= conf
->holdtime
;
1232 peer
->keepalive
= conf
->keepalive
;
1233 peer
->connect
= conf
->connect
;
1234 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1235 peer
->v_connect
= conf
->connect
;
1237 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1239 /* advertisement-interval reset */
1240 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1241 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1243 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1245 /* maximum-prefix */
1246 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1249 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1251 /* default-originate route-map */
1252 if (conf
->default_rmap
[afi
][safi
].name
)
1254 if (peer
->default_rmap
[afi
][safi
].name
)
1255 free (peer
->default_rmap
[afi
][safi
].name
);
1256 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1257 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1260 /* update-source apply */
1261 if (conf
->update_source
)
1263 if (peer
->update_source
)
1264 sockunion_free (peer
->update_source
);
1265 if (peer
->update_if
)
1267 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1268 peer
->update_if
= NULL
;
1270 peer
->update_source
= sockunion_dup (conf
->update_source
);
1272 else if (conf
->update_if
)
1274 if (peer
->update_if
)
1275 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1276 if (peer
->update_source
)
1278 sockunion_free (peer
->update_source
);
1279 peer
->update_source
= NULL
;
1281 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1284 /* inbound filter apply */
1285 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1287 if (pfilter
->dlist
[in
].name
)
1288 free (pfilter
->dlist
[in
].name
);
1289 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1290 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1292 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1294 if (pfilter
->plist
[in
].name
)
1295 free (pfilter
->plist
[in
].name
);
1296 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1297 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1299 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1301 if (pfilter
->aslist
[in
].name
)
1302 free (pfilter
->aslist
[in
].name
);
1303 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1304 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1306 if (gfilter
->map
[in
].name
&& ! pfilter
->map
[in
].name
)
1308 if (pfilter
->map
[in
].name
)
1309 free (pfilter
->map
[in
].name
);
1310 pfilter
->map
[in
].name
= strdup (gfilter
->map
[in
].name
);
1311 pfilter
->map
[in
].map
= gfilter
->map
[in
].map
;
1314 /* outbound filter apply */
1315 if (gfilter
->dlist
[out
].name
)
1317 if (pfilter
->dlist
[out
].name
)
1318 free (pfilter
->dlist
[out
].name
);
1319 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1320 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1324 if (pfilter
->dlist
[out
].name
)
1325 free (pfilter
->dlist
[out
].name
);
1326 pfilter
->dlist
[out
].name
= NULL
;
1327 pfilter
->dlist
[out
].alist
= NULL
;
1329 if (gfilter
->plist
[out
].name
)
1331 if (pfilter
->plist
[out
].name
)
1332 free (pfilter
->plist
[out
].name
);
1333 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1334 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1338 if (pfilter
->plist
[out
].name
)
1339 free (pfilter
->plist
[out
].name
);
1340 pfilter
->plist
[out
].name
= NULL
;
1341 pfilter
->plist
[out
].plist
= NULL
;
1343 if (gfilter
->aslist
[out
].name
)
1345 if (pfilter
->aslist
[out
].name
)
1346 free (pfilter
->aslist
[out
].name
);
1347 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1348 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1352 if (pfilter
->aslist
[out
].name
)
1353 free (pfilter
->aslist
[out
].name
);
1354 pfilter
->aslist
[out
].name
= NULL
;
1355 pfilter
->aslist
[out
].aslist
= NULL
;
1357 if (gfilter
->map
[out
].name
)
1359 if (pfilter
->map
[out
].name
)
1360 free (pfilter
->map
[out
].name
);
1361 pfilter
->map
[out
].name
= strdup (gfilter
->map
[out
].name
);
1362 pfilter
->map
[out
].map
= gfilter
->map
[out
].map
;
1366 if (pfilter
->map
[out
].name
)
1367 free (pfilter
->map
[out
].name
);
1368 pfilter
->map
[out
].name
= NULL
;
1369 pfilter
->map
[out
].map
= NULL
;
1372 if (gfilter
->usmap
.name
)
1374 if (pfilter
->usmap
.name
)
1375 free (pfilter
->usmap
.name
);
1376 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1377 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1381 if (pfilter
->usmap
.name
)
1382 free (pfilter
->usmap
.name
);
1383 pfilter
->usmap
.name
= NULL
;
1384 pfilter
->usmap
.map
= NULL
;
1388 /* Peer group's remote AS configuration. */
1390 peer_group_remote_as (struct bgp
*bgp
, char *group_name
, as_t
*as
)
1392 struct peer_group
*group
;
1394 struct listnode
*nn
;
1396 group
= peer_group_lookup (bgp
, group_name
);
1400 if (group
->conf
->as
== *as
)
1403 /* When we setup peer-group AS number all peer group member's AS
1404 number must be updated to same number. */
1405 peer_as_change (group
->conf
, *as
);
1407 LIST_LOOP (group
->peer
, peer
, nn
)
1409 if (peer
->as
!= *as
)
1410 peer_as_change (peer
, *as
);
1417 peer_group_delete (struct peer_group
*group
)
1421 struct listnode
*nn
;
1425 LIST_LOOP (group
->peer
, peer
, nn
)
1430 list_delete (group
->peer
);
1435 group
->conf
->group
= NULL
;
1436 peer_delete (group
->conf
);
1438 /* Delete from all peer_group list. */
1439 listnode_delete (bgp
->group
, group
);
1441 peer_group_free (group
);
1447 peer_group_remote_as_delete (struct peer_group
*group
)
1450 struct listnode
*nn
;
1452 if (! group
->conf
->as
)
1455 LIST_LOOP (group
->peer
, peer
, nn
)
1460 list_delete_all_node (group
->peer
);
1462 group
->conf
->as
= 0;
1467 /* Bind specified peer to peer group. */
1469 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
,
1470 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1473 int first_member
= 0;
1475 /* Check peer group's address family. */
1476 if (! group
->conf
->afc
[afi
][safi
])
1477 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
1479 /* Lookup the peer. */
1480 peer
= peer_lookup (bgp
, su
);
1482 /* Create a new peer. */
1485 if (! group
->conf
->as
)
1486 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
1488 peer
= peer_create (su
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
1489 peer
->group
= group
;
1490 peer
->af_group
[afi
][safi
] = 1;
1491 listnode_add (group
->peer
, peer
);
1492 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1497 /* When the peer already belongs to peer group, check the consistency. */
1498 if (peer
->af_group
[afi
][safi
])
1500 if (strcmp (peer
->group
->name
, group
->name
) != 0)
1501 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
1506 /* Check current peer group configuration. */
1507 if (peer_group_active (peer
)
1508 && strcmp (peer
->group
->name
, group
->name
) != 0)
1509 return BGP_ERR_PEER_GROUP_MISMATCH
;
1511 if (! group
->conf
->as
)
1513 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
1514 && peer_sort (group
->conf
) != peer_sort (peer
))
1518 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1521 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
1525 peer
->af_group
[afi
][safi
] = 1;
1526 peer
->afc
[afi
][safi
] = 1;
1529 peer
->group
= group
;
1530 listnode_add (group
->peer
, peer
);
1535 /* Advertisement-interval reset */
1536 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1537 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1539 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1541 /* ebgp-multihop reset */
1542 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1543 group
->conf
->ttl
= 255;
1545 /* local-as reset */
1546 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
1548 group
->conf
->change_local_as
= 0;
1549 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1552 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1554 if (peer
->status
== Established
)
1555 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1556 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1558 BGP_EVENT_ADD (peer
, BGP_Stop
);
1564 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
1565 struct peer_group
*group
, afi_t afi
, safi_t safi
)
1567 if (! peer
->af_group
[afi
][safi
])
1570 if (group
!= peer
->group
)
1571 return BGP_ERR_PEER_GROUP_MISMATCH
;
1573 peer
->af_group
[afi
][safi
] = 0;
1574 peer
->afc
[afi
][safi
] = 0;
1575 peer_af_flag_reset (peer
, afi
, safi
);
1577 if (! peer_group_active (peer
))
1579 listnode_delete (group
->peer
, peer
);
1581 if (group
->conf
->as
)
1586 peer_global_config_reset (peer
);
1589 if (peer
->status
== Established
)
1590 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1591 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1593 BGP_EVENT_ADD (peer
, BGP_Stop
);
1598 /* BGP instance creation by `router bgp' commands. */
1600 bgp_create (as_t
*as
, char *name
)
1606 bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
));
1608 bgp
->peer_self
= peer_new ();
1609 bgp
->peer_self
->host
= "Static announcement";
1611 bgp
->peer
= list_new ();
1612 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
1614 bgp
->group
= list_new ();
1615 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
1617 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1618 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1620 bgp
->route
[afi
][safi
] = bgp_table_init ();
1621 bgp
->aggregate
[afi
][safi
] = bgp_table_init ();
1622 bgp
->rib
[afi
][safi
] = bgp_table_init ();
1625 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
1626 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
1627 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
1632 bgp
->name
= strdup (name
);
1637 /* Return first entry of BGP. */
1642 return bm
->bgp
->head
->data
;
1646 /* Lookup BGP entry. */
1648 bgp_lookup (as_t as
, char *name
)
1651 struct listnode
*nn
;
1653 LIST_LOOP (bm
->bgp
, bgp
, nn
)
1655 && ((bgp
->name
== NULL
&& name
== NULL
)
1656 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
1661 /* Lookup BGP structure by view name. */
1663 bgp_lookup_by_name (char *name
)
1666 struct listnode
*nn
;
1668 LIST_LOOP (bm
->bgp
, bgp
, nn
)
1669 if ((bgp
->name
== NULL
&& name
== NULL
)
1670 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
1675 /* Called from VTY commands. */
1677 bgp_get (struct bgp
**bgp_val
, as_t
*as
, char *name
)
1681 /* Multiple instance check. */
1682 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
1685 bgp
= bgp_lookup_by_name (name
);
1687 bgp
= bgp_get_default ();
1689 /* Already exists. */
1695 return BGP_ERR_INSTANCE_MISMATCH
;
1703 /* BGP instance name can not be specified for single instance. */
1705 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
1707 /* Get default BGP structure if exists. */
1708 bgp
= bgp_get_default ();
1715 return BGP_ERR_AS_MISMATCH
;
1722 bgp
= bgp_create (as
, name
);
1723 listnode_add (bm
->bgp
, bgp
);
1724 bgp_if_update_all ();
1730 /* Delete BGP instance. */
1732 bgp_delete (struct bgp
*bgp
)
1735 struct listnode
*nn
;
1736 struct listnode
*next
;
1741 /* Delete static route. */
1742 bgp_static_delete (bgp
);
1744 /* Unset redistribution. */
1745 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1746 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
1747 if (i
!= ZEBRA_ROUTE_BGP
)
1748 bgp_redistribute_unset (bgp
, afi
, i
);
1750 bgp
->group
->del
= (void (*)(void *)) peer_group_delete
;
1751 list_delete (bgp
->group
);
1753 for (nn
= bgp
->peer
->head
; nn
; nn
= next
)
1760 listnode_delete (bm
->bgp
, bgp
);
1765 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1766 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1768 if (bgp
->route
[afi
][safi
])
1769 XFREE (MTYPE_ROUTE_TABLE
, bgp
->route
[afi
][safi
]);
1770 if (bgp
->aggregate
[afi
][safi
])
1771 XFREE (MTYPE_ROUTE_TABLE
,bgp
->aggregate
[afi
][safi
]) ;
1772 if (bgp
->rib
[afi
][safi
])
1773 XFREE (MTYPE_ROUTE_TABLE
,bgp
->rib
[afi
][safi
]);
1775 XFREE (MTYPE_BGP
, bgp
);
1781 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
1784 struct listnode
*nn
;
1787 bgp
= bgp_get_default ();
1792 LIST_LOOP (bgp
->peer
, peer
, nn
)
1794 if (sockunion_same (&peer
->su
, su
)
1795 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1802 peer_lookup_with_open (union sockunion
*su
, as_t remote_as
,
1803 struct in_addr
*remote_id
, int *as
)
1806 struct listnode
*nn
;
1809 bgp
= bgp_get_default ();
1813 LIST_LOOP (bgp
->peer
, peer
, nn
)
1815 if (sockunion_same (&peer
->su
, su
)
1816 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1818 if (peer
->as
== remote_as
1819 && peer
->remote_id
.s_addr
== remote_id
->s_addr
)
1821 if (peer
->as
== remote_as
)
1825 LIST_LOOP (bgp
->peer
, peer
, nn
)
1827 if (sockunion_same (&peer
->su
, su
)
1828 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1830 if (peer
->as
== remote_as
1831 && peer
->remote_id
.s_addr
== 0)
1833 if (peer
->as
== remote_as
)
1840 /* If peer is configured at least one address family return 1. */
1842 peer_active (struct peer
*peer
)
1844 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
1845 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
1846 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
1847 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
1848 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
1853 /* If peer is negotiated at least one address family return 1. */
1855 peer_active_nego (struct peer
*peer
)
1857 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
1858 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
1859 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
1860 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
1861 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
1866 /* peer_flag_change_type. */
1867 enum peer_change_type
1871 peer_change_reset_in
,
1872 peer_change_reset_out
,
1876 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
1877 enum peer_change_type type
)
1879 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1882 if (type
== peer_change_reset
)
1883 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1884 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1885 else if (type
== peer_change_reset_in
)
1887 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
1888 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
1889 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
1891 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1892 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1894 else if (type
== peer_change_reset_out
)
1895 bgp_announce_route (peer
, afi
, safi
);
1898 struct peer_flag_action
1903 /* This flag can be set for peer-group member. */
1904 u_char not_for_member
;
1906 /* Action when the flag is changed. */
1907 enum peer_change_type type
;
1910 struct peer_flag_action peer_flag_action_list
[] =
1912 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
1913 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
1914 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
1915 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
1916 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
1917 { PEER_FLAG_NO_ROUTE_REFRESH_CAP
, 0, peer_change_reset
},
1918 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
1919 { PEER_FLAG_ENFORCE_MULTIHOP
, 0, peer_change_reset
},
1923 struct peer_flag_action peer_af_flag_action_list
[] =
1925 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
1926 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
1927 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
1928 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
1929 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
1930 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
1931 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
1932 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
1933 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
1934 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
1935 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
1936 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
1937 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
1941 /* Proper action set. */
1943 peer_flag_action_set (struct peer_flag_action
*action_list
, int size
,
1944 struct peer_flag_action
*action
, u_int32_t flag
)
1950 struct peer_flag_action
*match
= NULL
;
1952 /* Check peer's frag action. */
1953 for (i
= 0; i
< size
; i
++)
1955 match
= &action_list
[i
];
1957 if (match
->flag
== 0)
1960 if (match
->flag
& flag
)
1964 if (match
->type
== peer_change_reset_in
)
1966 if (match
->type
== peer_change_reset_out
)
1968 if (match
->type
== peer_change_reset
)
1973 if (match
->not_for_member
)
1974 action
->not_for_member
= 1;
1978 /* Set peer clear type. */
1979 if (reset_in
&& reset_out
)
1980 action
->type
= peer_change_reset
;
1982 action
->type
= peer_change_reset_in
;
1984 action
->type
= peer_change_reset_out
;
1986 action
->type
= peer_change_none
;
1992 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
1994 if (flag
== PEER_FLAG_SHUTDOWN
)
1996 if (CHECK_FLAG (peer
->flags
, flag
))
1998 if (peer
->status
== Established
)
1999 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2000 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2002 BGP_EVENT_ADD (peer
, BGP_Stop
);
2006 peer
->v_start
= BGP_INIT_START_TIMER
;
2007 BGP_EVENT_ADD (peer
, BGP_Stop
);
2010 else if (peer
->status
== Established
)
2012 if (flag
== PEER_FLAG_NO_ROUTE_REFRESH_CAP
2013 && CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
2015 if (CHECK_FLAG (peer
->flags
, flag
))
2016 UNSET_FLAG (peer
->cap
, PEER_CAP_REFRESH_ADV
);
2018 SET_FLAG (peer
->cap
, PEER_CAP_REFRESH_ADV
);
2020 bgp_capability_send (peer
, AFI_IP
, SAFI_UNICAST
,
2021 CAPABILITY_CODE_REFRESH
,
2022 CHECK_FLAG (peer
->flags
, flag
) ?
2023 CAPABILITY_ACTION_UNSET
: CAPABILITY_ACTION_SET
);
2026 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2027 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2030 BGP_EVENT_ADD (peer
, BGP_Stop
);
2033 /* Change specified peer flag. */
2035 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2039 struct peer_group
*group
;
2040 struct listnode
*nn
;
2041 struct peer_flag_action action
;
2043 memset (&action
, 0, sizeof (struct peer_flag_action
));
2044 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2046 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2048 /* No flag action is found. */
2050 return BGP_ERR_INVALID_FLAG
;
2052 /* Not for peer-group member. */
2053 if (action
.not_for_member
&& peer_group_active (peer
))
2054 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2056 /* When unset the peer-group member's flag we have to check
2057 peer-group configuration. */
2058 if (! set
&& peer_group_active (peer
))
2059 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2061 if (flag
== PEER_FLAG_SHUTDOWN
)
2062 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2064 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2067 /* Flag conflict check. */
2069 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2070 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2071 return BGP_ERR_PEER_FLAG_CONFLICT
;
2073 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2075 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2077 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2082 SET_FLAG (peer
->flags
, flag
);
2084 UNSET_FLAG (peer
->flags
, flag
);
2086 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2088 if (action
.type
== peer_change_reset
)
2089 peer_flag_modify_action (peer
, flag
);
2094 /* peer-group member updates. */
2095 group
= peer
->group
;
2097 LIST_LOOP (group
->peer
, peer
, nn
)
2099 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2102 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2106 SET_FLAG (peer
->flags
, flag
);
2108 UNSET_FLAG (peer
->flags
, flag
);
2110 if (action
.type
== peer_change_reset
)
2111 peer_flag_modify_action (peer
, flag
);
2117 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2119 return peer_flag_modify (peer
, flag
, 1);
2123 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2125 return peer_flag_modify (peer
, flag
, 0);
2129 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2131 if (peer
->af_group
[afi
][safi
])
2137 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2142 struct listnode
*nn
;
2143 struct peer_group
*group
;
2144 struct peer_flag_action action
;
2146 memset (&action
, 0, sizeof (struct peer_flag_action
));
2147 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2149 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2151 /* No flag action is found. */
2153 return BGP_ERR_INVALID_FLAG
;
2155 /* Adress family must be activated. */
2156 if (! peer
->afc
[afi
][safi
])
2157 return BGP_ERR_PEER_INACTIVE
;
2159 /* Not for peer-group member. */
2160 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2161 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2163 /* Spcecial check for reflector client. */
2164 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2165 && peer_sort (peer
) != BGP_PEER_IBGP
)
2166 return BGP_ERR_NOT_INTERNAL_PEER
;
2168 /* Spcecial check for remove-private-AS. */
2169 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2170 && peer_sort (peer
) == BGP_PEER_IBGP
)
2171 return BGP_ERR_REMOVE_PRIVATE_AS
;
2173 /* When unset the peer-group member's flag we have to check
2174 peer-group configuration. */
2175 if (! set
&& peer
->af_group
[afi
][safi
])
2176 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2177 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2179 /* When current flag configuration is same as requested one. */
2180 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2182 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2184 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2189 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2191 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2193 /* Execute action when peer is established. */
2194 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2195 && peer
->status
== Established
)
2197 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2198 bgp_clear_adj_in (peer
, afi
, safi
);
2200 peer_change_action (peer
, afi
, safi
, action
.type
);
2203 /* Peer group member updates. */
2204 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2206 group
= peer
->group
;
2208 LIST_LOOP (group
->peer
, peer
, nn
)
2210 if (! peer
->af_group
[afi
][safi
])
2213 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2216 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2220 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2222 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2224 if (peer
->status
== Established
)
2226 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2227 bgp_clear_adj_in (peer
, afi
, safi
);
2229 peer_change_action (peer
, afi
, safi
, action
.type
);
2237 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2239 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2243 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2245 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2248 /* EBGP multihop configuration. */
2250 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2252 struct peer_group
*group
;
2253 struct listnode
*nn
;
2255 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2260 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2262 if (peer
->fd
>= 0 && peer_sort (peer
) != BGP_PEER_IBGP
)
2263 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2267 group
= peer
->group
;
2268 LIST_LOOP (group
->peer
, peer
, nn
)
2270 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2273 peer
->ttl
= group
->conf
->ttl
;
2276 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2283 peer_ebgp_multihop_unset (struct peer
*peer
)
2285 struct peer_group
*group
;
2286 struct listnode
*nn
;
2288 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2291 if (peer_group_active (peer
))
2292 peer
->ttl
= peer
->group
->conf
->ttl
;
2296 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2298 if (peer
->fd
>= 0 && peer_sort (peer
) != BGP_PEER_IBGP
)
2299 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2303 group
= peer
->group
;
2304 LIST_LOOP (group
->peer
, peer
, nn
)
2306 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2312 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2318 /* Neighbor description. */
2320 peer_description_set (struct peer
*peer
, char *desc
)
2323 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2325 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
2331 peer_description_unset (struct peer
*peer
)
2334 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2341 /* Neighbor update-source. */
2343 peer_update_source_if_set (struct peer
*peer
, char *ifname
)
2345 struct peer_group
*group
;
2346 struct listnode
*nn
;
2348 if (peer
->update_if
)
2350 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2351 && strcmp (peer
->update_if
, ifname
) == 0)
2354 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2355 peer
->update_if
= NULL
;
2358 if (peer
->update_source
)
2360 sockunion_free (peer
->update_source
);
2361 peer
->update_source
= NULL
;
2364 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2366 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2368 if (peer
->status
== Established
)
2369 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2370 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2372 BGP_EVENT_ADD (peer
, BGP_Stop
);
2376 /* peer-group member updates. */
2377 group
= peer
->group
;
2378 LIST_LOOP (group
->peer
, peer
, nn
)
2380 if (peer
->update_if
)
2382 if (strcmp (peer
->update_if
, ifname
) == 0)
2385 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2386 peer
->update_if
= NULL
;
2389 if (peer
->update_source
)
2391 sockunion_free (peer
->update_source
);
2392 peer
->update_source
= NULL
;
2395 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2397 if (peer
->status
== Established
)
2398 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2399 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2401 BGP_EVENT_ADD (peer
, BGP_Stop
);
2407 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
2409 struct peer_group
*group
;
2410 struct listnode
*nn
;
2412 if (peer
->update_source
)
2414 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2415 && sockunion_cmp (peer
->update_source
, su
) == 0)
2417 sockunion_free (peer
->update_source
);
2418 peer
->update_source
= NULL
;
2421 if (peer
->update_if
)
2423 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2424 peer
->update_if
= NULL
;
2427 peer
->update_source
= sockunion_dup (su
);
2429 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2431 if (peer
->status
== Established
)
2432 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2433 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2435 BGP_EVENT_ADD (peer
, BGP_Stop
);
2439 /* peer-group member updates. */
2440 group
= peer
->group
;
2441 LIST_LOOP (group
->peer
, peer
, nn
)
2443 if (peer
->update_source
)
2445 if (sockunion_cmp (peer
->update_source
, su
) == 0)
2447 sockunion_free (peer
->update_source
);
2448 peer
->update_source
= NULL
;
2451 if (peer
->update_if
)
2453 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2454 peer
->update_if
= NULL
;
2457 peer
->update_source
= sockunion_dup (su
);
2459 if (peer
->status
== Established
)
2460 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2461 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2463 BGP_EVENT_ADD (peer
, BGP_Stop
);
2469 peer_update_source_unset (struct peer
*peer
)
2471 union sockunion
*su
;
2472 struct peer_group
*group
;
2473 struct listnode
*nn
;
2475 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2476 && ! peer
->update_source
2477 && ! peer
->update_if
)
2480 if (peer
->update_source
)
2482 sockunion_free (peer
->update_source
);
2483 peer
->update_source
= NULL
;
2485 if (peer
->update_if
)
2487 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2488 peer
->update_if
= NULL
;
2491 if (peer_group_active (peer
))
2493 group
= peer
->group
;
2495 if (group
->conf
->update_source
)
2497 su
= sockunion_dup (group
->conf
->update_source
);
2498 peer
->update_source
= su
;
2500 else if (group
->conf
->update_if
)
2502 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
2505 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2507 if (peer
->status
== Established
)
2508 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2509 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2511 BGP_EVENT_ADD (peer
, BGP_Stop
);
2515 /* peer-group member updates. */
2516 group
= peer
->group
;
2517 LIST_LOOP (group
->peer
, peer
, nn
)
2519 if (! peer
->update_source
&& ! peer
->update_if
)
2522 if (peer
->update_source
)
2524 sockunion_free (peer
->update_source
);
2525 peer
->update_source
= NULL
;
2528 if (peer
->update_if
)
2530 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2531 peer
->update_if
= NULL
;
2534 if (peer
->status
== Established
)
2535 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2536 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2538 BGP_EVENT_ADD (peer
, BGP_Stop
);
2544 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
2547 struct peer_group
*group
;
2548 struct listnode
*nn
;
2550 /* Adress family must be activated. */
2551 if (! peer
->afc
[afi
][safi
])
2552 return BGP_ERR_PEER_INACTIVE
;
2554 /* Default originate can't be used for peer group memeber. */
2555 if (peer_is_group_member (peer
, afi
, safi
))
2556 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2558 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
2559 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
2560 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
2562 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2566 if (peer
->default_rmap
[afi
][safi
].name
)
2567 free (peer
->default_rmap
[afi
][safi
].name
);
2568 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
2569 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
2573 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2575 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2576 bgp_default_originate (peer
, afi
, safi
, 0);
2580 /* peer-group member updates. */
2581 group
= peer
->group
;
2582 LIST_LOOP (group
->peer
, peer
, nn
)
2584 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2588 if (peer
->default_rmap
[afi
][safi
].name
)
2589 free (peer
->default_rmap
[afi
][safi
].name
);
2590 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
2591 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
2594 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2595 bgp_default_originate (peer
, afi
, safi
, 0);
2601 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
2603 struct peer_group
*group
;
2604 struct listnode
*nn
;
2606 /* Adress family must be activated. */
2607 if (! peer
->afc
[afi
][safi
])
2608 return BGP_ERR_PEER_INACTIVE
;
2610 /* Default originate can't be used for peer group memeber. */
2611 if (peer_is_group_member (peer
, afi
, safi
))
2612 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2614 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
2616 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2618 if (peer
->default_rmap
[afi
][safi
].name
)
2619 free (peer
->default_rmap
[afi
][safi
].name
);
2620 peer
->default_rmap
[afi
][safi
].name
= NULL
;
2621 peer
->default_rmap
[afi
][safi
].map
= NULL
;
2624 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2626 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2627 bgp_default_originate (peer
, afi
, safi
, 1);
2631 /* peer-group member updates. */
2632 group
= peer
->group
;
2633 LIST_LOOP (group
->peer
, peer
, nn
)
2635 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2637 if (peer
->default_rmap
[afi
][safi
].name
)
2638 free (peer
->default_rmap
[afi
][safi
].name
);
2639 peer
->default_rmap
[afi
][safi
].name
= NULL
;
2640 peer
->default_rmap
[afi
][safi
].map
= NULL
;
2642 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2643 bgp_default_originate (peer
, afi
, safi
, 1);
2649 peer_port_set (struct peer
*peer
, u_int16_t port
)
2656 peer_port_unset (struct peer
*peer
)
2658 peer
->port
= BGP_PORT_DEFAULT
;
2662 /* neighbor weight. */
2664 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
2666 struct peer_group
*group
;
2667 struct listnode
*nn
;
2669 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
2670 peer
->weight
= weight
;
2672 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2675 /* peer-group member updates. */
2676 group
= peer
->group
;
2677 LIST_LOOP (group
->peer
, peer
, nn
)
2679 peer
->weight
= group
->conf
->weight
;
2685 peer_weight_unset (struct peer
*peer
)
2687 struct peer_group
*group
;
2688 struct listnode
*nn
;
2690 /* Set default weight. */
2691 if (peer_group_active (peer
))
2692 peer
->weight
= peer
->group
->conf
->weight
;
2696 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
2698 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2701 /* peer-group member updates. */
2702 group
= peer
->group
;
2703 LIST_LOOP (group
->peer
, peer
, nn
)
2711 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
2713 struct peer_group
*group
;
2714 struct listnode
*nn
;
2716 /* Not for peer group memeber. */
2717 if (peer_group_active (peer
))
2718 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2720 /* keepalive value check. */
2721 if (keepalive
> 65535)
2722 return BGP_ERR_INVALID_VALUE
;
2724 /* Holdtime value check. */
2725 if (holdtime
> 65535)
2726 return BGP_ERR_INVALID_VALUE
;
2728 /* Holdtime value must be either 0 or greater than 3. */
2729 if (holdtime
< 3 && holdtime
!= 0)
2730 return BGP_ERR_INVALID_VALUE
;
2732 /* Set value to the configuration. */
2733 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2734 peer
->holdtime
= holdtime
;
2735 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
2737 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2740 /* peer-group member updates. */
2741 group
= peer
->group
;
2742 LIST_LOOP (group
->peer
, peer
, nn
)
2744 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2745 peer
->holdtime
= group
->conf
->holdtime
;
2746 peer
->keepalive
= group
->conf
->keepalive
;
2752 peer_timers_unset (struct peer
*peer
)
2754 struct peer_group
*group
;
2755 struct listnode
*nn
;
2757 if (peer_group_active (peer
))
2758 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2760 /* Clear configuration. */
2761 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2762 peer
->keepalive
= 0;
2765 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2768 /* peer-group member updates. */
2769 group
= peer
->group
;
2770 LIST_LOOP (group
->peer
, peer
, nn
)
2772 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2774 peer
->keepalive
= 0;
2781 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
2783 if (peer_group_active (peer
))
2784 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2786 if (connect
> 65535)
2787 return BGP_ERR_INVALID_VALUE
;
2789 /* Set value to the configuration. */
2790 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
2791 peer
->connect
= connect
;
2793 /* Set value to timer setting. */
2794 peer
->v_connect
= connect
;
2800 peer_timers_connect_unset (struct peer
*peer
)
2802 if (peer_group_active (peer
))
2803 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2805 /* Clear configuration. */
2806 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
2809 /* Set timer setting to default value. */
2810 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
2816 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
2818 if (peer_group_active (peer
))
2819 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2822 return BGP_ERR_INVALID_VALUE
;
2824 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
2825 peer
->routeadv
= routeadv
;
2826 peer
->v_routeadv
= routeadv
;
2832 peer_advertise_interval_unset (struct peer
*peer
)
2834 if (peer_group_active (peer
))
2835 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2837 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
2840 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2841 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2843 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2849 peer_version_set (struct peer
*peer
, int version
)
2851 if (version
!= BGP_VERSION_4
&& version
!= BGP_VERSION_MP_4_DRAFT_00
)
2852 return BGP_ERR_INVALID_VALUE
;
2854 peer
->version
= version
;
2860 peer_version_unset (struct peer
*peer
)
2862 peer
->version
= BGP_VERSION_4
;
2866 /* neighbor interface */
2868 peer_interface_set (struct peer
*peer
, char *str
)
2871 free (peer
->ifname
);
2872 peer
->ifname
= strdup (str
);
2878 peer_interface_unset (struct peer
*peer
)
2881 free (peer
->ifname
);
2882 peer
->ifname
= NULL
;
2889 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
2891 struct peer_group
*group
;
2892 struct listnode
*nn
;
2894 if (allow_num
< 1 || allow_num
> 10)
2895 return BGP_ERR_INVALID_VALUE
;
2897 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
2899 peer
->allowas_in
[afi
][safi
] = allow_num
;
2900 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
2901 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
2904 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2907 group
= peer
->group
;
2908 LIST_LOOP (group
->peer
, peer
, nn
)
2910 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
2912 peer
->allowas_in
[afi
][safi
] = allow_num
;
2913 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
2914 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
2922 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
2924 struct peer_group
*group
;
2925 struct listnode
*nn
;
2927 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
2929 peer
->allowas_in
[afi
][safi
] = 0;
2930 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
2933 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2936 group
= peer
->group
;
2937 LIST_LOOP (group
->peer
, peer
, nn
)
2939 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
2941 peer
->allowas_in
[afi
][safi
] = 0;
2942 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
2949 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
)
2951 struct bgp
*bgp
= peer
->bgp
;
2952 struct peer_group
*group
;
2953 struct listnode
*nn
;
2955 if (peer_sort (peer
) != BGP_PEER_EBGP
2956 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
2957 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
2960 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
2962 if (peer_group_active (peer
))
2963 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2965 if (peer
->change_local_as
== as
&&
2966 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
2967 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)))
2970 peer
->change_local_as
= as
;
2972 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2974 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2976 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2978 if (peer
->status
== Established
)
2979 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2980 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2982 BGP_EVENT_ADD (peer
, BGP_Stop
);
2987 group
= peer
->group
;
2988 LIST_LOOP (group
->peer
, peer
, nn
)
2990 peer
->change_local_as
= as
;
2992 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2994 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2996 if (peer
->status
== Established
)
2997 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2998 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3000 BGP_EVENT_ADD (peer
, BGP_Stop
);
3007 peer_local_as_unset (struct peer
*peer
)
3009 struct peer_group
*group
;
3010 struct listnode
*nn
;
3012 if (peer_group_active (peer
))
3013 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3015 if (! peer
->change_local_as
)
3018 peer
->change_local_as
= 0;
3019 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3021 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3023 if (peer
->status
== Established
)
3024 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3025 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3027 BGP_EVENT_ADD (peer
, BGP_Stop
);
3032 group
= peer
->group
;
3033 LIST_LOOP (group
->peer
, peer
, nn
)
3035 peer
->change_local_as
= 0;
3036 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3038 if (peer
->status
== Established
)
3039 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3040 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3042 BGP_EVENT_ADD (peer
, BGP_Stop
);
3047 /* Set distribute list to the peer. */
3049 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3052 struct bgp_filter
*filter
;
3053 struct peer_group
*group
;
3054 struct listnode
*nn
;
3056 if (! peer
->afc
[afi
][safi
])
3057 return BGP_ERR_PEER_INACTIVE
;
3059 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3060 return BGP_ERR_INVALID_VALUE
;
3062 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3063 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3065 filter
= &peer
->filter
[afi
][safi
];
3067 if (filter
->plist
[direct
].name
)
3068 return BGP_ERR_PEER_FILTER_CONFLICT
;
3070 if (filter
->dlist
[direct
].name
)
3071 free (filter
->dlist
[direct
].name
);
3072 filter
->dlist
[direct
].name
= strdup (name
);
3073 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3075 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3078 group
= peer
->group
;
3079 LIST_LOOP (group
->peer
, peer
, nn
)
3081 filter
= &peer
->filter
[afi
][safi
];
3083 if (! peer
->af_group
[afi
][safi
])
3086 if (filter
->dlist
[direct
].name
)
3087 free (filter
->dlist
[direct
].name
);
3088 filter
->dlist
[direct
].name
= strdup (name
);
3089 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3096 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3098 struct bgp_filter
*filter
;
3099 struct bgp_filter
*gfilter
;
3100 struct peer_group
*group
;
3101 struct listnode
*nn
;
3103 if (! peer
->afc
[afi
][safi
])
3104 return BGP_ERR_PEER_INACTIVE
;
3106 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3107 return BGP_ERR_INVALID_VALUE
;
3109 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3110 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3112 filter
= &peer
->filter
[afi
][safi
];
3114 /* apply peer-group filter */
3115 if (peer
->af_group
[afi
][safi
])
3117 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3119 if (gfilter
->dlist
[direct
].name
)
3121 if (filter
->dlist
[direct
].name
)
3122 free (filter
->dlist
[direct
].name
);
3123 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
3124 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
3129 if (filter
->dlist
[direct
].name
)
3130 free (filter
->dlist
[direct
].name
);
3131 filter
->dlist
[direct
].name
= NULL
;
3132 filter
->dlist
[direct
].alist
= NULL
;
3134 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3137 group
= peer
->group
;
3138 LIST_LOOP (group
->peer
, peer
, nn
)
3140 filter
= &peer
->filter
[afi
][safi
];
3142 if (! peer
->af_group
[afi
][safi
])
3145 if (filter
->dlist
[direct
].name
)
3146 free (filter
->dlist
[direct
].name
);
3147 filter
->dlist
[direct
].name
= NULL
;
3148 filter
->dlist
[direct
].alist
= NULL
;
3154 /* Update distribute list. */
3156 peer_distribute_update (struct access_list
*access
)
3161 struct listnode
*nn
, *nm
;
3164 struct peer_group
*group
;
3165 struct bgp_filter
*filter
;
3167 LIST_LOOP (bm
->bgp
, bgp
, nn
)
3169 LIST_LOOP (bgp
->peer
, peer
, nm
)
3171 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3172 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3174 filter
= &peer
->filter
[afi
][safi
];
3176 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3178 if (filter
->dlist
[direct
].name
)
3179 filter
->dlist
[direct
].alist
=
3180 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3182 filter
->dlist
[direct
].alist
= NULL
;
3186 LIST_LOOP (bgp
->group
, group
, nm
)
3188 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3189 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3191 filter
= &group
->conf
->filter
[afi
][safi
];
3193 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3195 if (filter
->dlist
[direct
].name
)
3196 filter
->dlist
[direct
].alist
=
3197 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3199 filter
->dlist
[direct
].alist
= NULL
;
3206 /* Set prefix list to the peer. */
3208 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3211 struct bgp_filter
*filter
;
3212 struct peer_group
*group
;
3213 struct listnode
*nn
;
3215 if (! peer
->afc
[afi
][safi
])
3216 return BGP_ERR_PEER_INACTIVE
;
3218 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3219 return BGP_ERR_INVALID_VALUE
;
3221 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3222 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3224 filter
= &peer
->filter
[afi
][safi
];
3226 if (filter
->dlist
[direct
].name
)
3227 return BGP_ERR_PEER_FILTER_CONFLICT
;
3229 if (filter
->plist
[direct
].name
)
3230 free (filter
->plist
[direct
].name
);
3231 filter
->plist
[direct
].name
= strdup (name
);
3232 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3234 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3237 group
= peer
->group
;
3238 LIST_LOOP (group
->peer
, peer
, nn
)
3240 filter
= &peer
->filter
[afi
][safi
];
3242 if (! peer
->af_group
[afi
][safi
])
3245 if (filter
->plist
[direct
].name
)
3246 free (filter
->plist
[direct
].name
);
3247 filter
->plist
[direct
].name
= strdup (name
);
3248 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3254 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3256 struct bgp_filter
*filter
;
3257 struct bgp_filter
*gfilter
;
3258 struct peer_group
*group
;
3259 struct listnode
*nn
;
3261 if (! peer
->afc
[afi
][safi
])
3262 return BGP_ERR_PEER_INACTIVE
;
3264 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3265 return BGP_ERR_INVALID_VALUE
;
3267 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3268 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3270 filter
= &peer
->filter
[afi
][safi
];
3272 /* apply peer-group filter */
3273 if (peer
->af_group
[afi
][safi
])
3275 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3277 if (gfilter
->plist
[direct
].name
)
3279 if (filter
->plist
[direct
].name
)
3280 free (filter
->plist
[direct
].name
);
3281 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
3282 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
3287 if (filter
->plist
[direct
].name
)
3288 free (filter
->plist
[direct
].name
);
3289 filter
->plist
[direct
].name
= NULL
;
3290 filter
->plist
[direct
].plist
= NULL
;
3292 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3295 group
= peer
->group
;
3296 LIST_LOOP (group
->peer
, peer
, nn
)
3298 filter
= &peer
->filter
[afi
][safi
];
3300 if (! peer
->af_group
[afi
][safi
])
3303 if (filter
->plist
[direct
].name
)
3304 free (filter
->plist
[direct
].name
);
3305 filter
->plist
[direct
].name
= NULL
;
3306 filter
->plist
[direct
].plist
= NULL
;
3312 /* Update prefix-list list. */
3314 peer_prefix_list_update (struct prefix_list
*plist
)
3316 struct listnode
*nn
, *nm
;
3319 struct peer_group
*group
;
3320 struct bgp_filter
*filter
;
3325 LIST_LOOP (bm
->bgp
, bgp
, nn
)
3327 LIST_LOOP (bgp
->peer
, peer
, nm
)
3329 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3330 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3332 filter
= &peer
->filter
[afi
][safi
];
3334 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3336 if (filter
->plist
[direct
].name
)
3337 filter
->plist
[direct
].plist
=
3338 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3340 filter
->plist
[direct
].plist
= NULL
;
3344 LIST_LOOP (bgp
->group
, group
, nm
)
3346 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3347 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3349 filter
= &group
->conf
->filter
[afi
][safi
];
3351 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3353 if (filter
->plist
[direct
].name
)
3354 filter
->plist
[direct
].plist
=
3355 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3357 filter
->plist
[direct
].plist
= NULL
;
3365 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3368 struct bgp_filter
*filter
;
3369 struct peer_group
*group
;
3370 struct listnode
*nn
;
3372 if (! peer
->afc
[afi
][safi
])
3373 return BGP_ERR_PEER_INACTIVE
;
3375 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3376 return BGP_ERR_INVALID_VALUE
;
3378 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3379 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3381 filter
= &peer
->filter
[afi
][safi
];
3383 if (filter
->aslist
[direct
].name
)
3384 free (filter
->aslist
[direct
].name
);
3385 filter
->aslist
[direct
].name
= strdup (name
);
3386 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
3388 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3391 group
= peer
->group
;
3392 LIST_LOOP (group
->peer
, peer
, nn
)
3394 filter
= &peer
->filter
[afi
][safi
];
3396 if (! peer
->af_group
[afi
][safi
])
3399 if (filter
->aslist
[direct
].name
)
3400 free (filter
->aslist
[direct
].name
);
3401 filter
->aslist
[direct
].name
= strdup (name
);
3402 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
3408 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
3410 struct bgp_filter
*filter
;
3411 struct bgp_filter
*gfilter
;
3412 struct peer_group
*group
;
3413 struct listnode
*nn
;
3415 if (! peer
->afc
[afi
][safi
])
3416 return BGP_ERR_PEER_INACTIVE
;
3418 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3419 return BGP_ERR_INVALID_VALUE
;
3421 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3422 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3424 filter
= &peer
->filter
[afi
][safi
];
3426 /* apply peer-group filter */
3427 if (peer
->af_group
[afi
][safi
])
3429 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3431 if (gfilter
->aslist
[direct
].name
)
3433 if (filter
->aslist
[direct
].name
)
3434 free (filter
->aslist
[direct
].name
);
3435 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
3436 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
3441 if (filter
->aslist
[direct
].name
)
3442 free (filter
->aslist
[direct
].name
);
3443 filter
->aslist
[direct
].name
= NULL
;
3444 filter
->aslist
[direct
].aslist
= NULL
;
3446 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3449 group
= peer
->group
;
3450 LIST_LOOP (group
->peer
, peer
, nn
)
3452 filter
= &peer
->filter
[afi
][safi
];
3454 if (! peer
->af_group
[afi
][safi
])
3457 if (filter
->aslist
[direct
].name
)
3458 free (filter
->aslist
[direct
].name
);
3459 filter
->aslist
[direct
].name
= NULL
;
3460 filter
->aslist
[direct
].aslist
= NULL
;
3467 peer_aslist_update ()
3472 struct listnode
*nn
, *nm
;
3475 struct peer_group
*group
;
3476 struct bgp_filter
*filter
;
3478 LIST_LOOP (bm
->bgp
, bgp
, nn
)
3480 LIST_LOOP (bgp
->peer
, peer
, nm
)
3482 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3483 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3485 filter
= &peer
->filter
[afi
][safi
];
3487 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3489 if (filter
->aslist
[direct
].name
)
3490 filter
->aslist
[direct
].aslist
=
3491 as_list_lookup (filter
->aslist
[direct
].name
);
3493 filter
->aslist
[direct
].aslist
= NULL
;
3497 LIST_LOOP (bgp
->group
, group
, nm
)
3499 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3500 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3502 filter
= &group
->conf
->filter
[afi
][safi
];
3504 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3506 if (filter
->aslist
[direct
].name
)
3507 filter
->aslist
[direct
].aslist
=
3508 as_list_lookup (filter
->aslist
[direct
].name
);
3510 filter
->aslist
[direct
].aslist
= NULL
;
3517 /* Set route-map to the peer. */
3519 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3522 struct bgp_filter
*filter
;
3523 struct peer_group
*group
;
3524 struct listnode
*nn
;
3526 if (! peer
->afc
[afi
][safi
])
3527 return BGP_ERR_PEER_INACTIVE
;
3529 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3530 return BGP_ERR_INVALID_VALUE
;
3532 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3533 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3535 filter
= &peer
->filter
[afi
][safi
];
3537 if (filter
->map
[direct
].name
)
3538 free (filter
->map
[direct
].name
);
3540 filter
->map
[direct
].name
= strdup (name
);
3541 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
3543 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3546 group
= peer
->group
;
3547 LIST_LOOP (group
->peer
, peer
, nn
)
3549 filter
= &peer
->filter
[afi
][safi
];
3551 if (! peer
->af_group
[afi
][safi
])
3554 if (filter
->map
[direct
].name
)
3555 free (filter
->map
[direct
].name
);
3556 filter
->map
[direct
].name
= strdup (name
);
3557 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
3562 /* Unset route-map from the peer. */
3564 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3566 struct bgp_filter
*filter
;
3567 struct bgp_filter
*gfilter
;
3568 struct peer_group
*group
;
3569 struct listnode
*nn
;
3571 if (! peer
->afc
[afi
][safi
])
3572 return BGP_ERR_PEER_INACTIVE
;
3574 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3575 return BGP_ERR_INVALID_VALUE
;
3577 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3578 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3580 filter
= &peer
->filter
[afi
][safi
];
3582 /* apply peer-group filter */
3583 if (peer
->af_group
[afi
][safi
])
3585 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3587 if (gfilter
->map
[direct
].name
)
3589 if (filter
->map
[direct
].name
)
3590 free (filter
->map
[direct
].name
);
3591 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
3592 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
3597 if (filter
->map
[direct
].name
)
3598 free (filter
->map
[direct
].name
);
3599 filter
->map
[direct
].name
= NULL
;
3600 filter
->map
[direct
].map
= NULL
;
3602 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3605 group
= peer
->group
;
3606 LIST_LOOP (group
->peer
, peer
, nn
)
3608 filter
= &peer
->filter
[afi
][safi
];
3610 if (! peer
->af_group
[afi
][safi
])
3613 if (filter
->map
[direct
].name
)
3614 free (filter
->map
[direct
].name
);
3615 filter
->map
[direct
].name
= NULL
;
3616 filter
->map
[direct
].map
= NULL
;
3621 /* Set unsuppress-map to the peer. */
3623 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, char *name
)
3625 struct bgp_filter
*filter
;
3626 struct peer_group
*group
;
3627 struct listnode
*nn
;
3629 if (! peer
->afc
[afi
][safi
])
3630 return BGP_ERR_PEER_INACTIVE
;
3632 if (peer_is_group_member (peer
, afi
, safi
))
3633 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3635 filter
= &peer
->filter
[afi
][safi
];
3637 if (filter
->usmap
.name
)
3638 free (filter
->usmap
.name
);
3640 filter
->usmap
.name
= strdup (name
);
3641 filter
->usmap
.map
= route_map_lookup_by_name (name
);
3643 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3646 group
= peer
->group
;
3647 LIST_LOOP (group
->peer
, peer
, nn
)
3649 filter
= &peer
->filter
[afi
][safi
];
3651 if (! peer
->af_group
[afi
][safi
])
3654 if (filter
->usmap
.name
)
3655 free (filter
->usmap
.name
);
3656 filter
->usmap
.name
= strdup (name
);
3657 filter
->usmap
.map
= route_map_lookup_by_name (name
);
3662 /* Unset route-map from the peer. */
3664 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3666 struct bgp_filter
*filter
;
3667 struct peer_group
*group
;
3668 struct listnode
*nn
;
3670 if (! peer
->afc
[afi
][safi
])
3671 return BGP_ERR_PEER_INACTIVE
;
3673 if (peer_is_group_member (peer
, afi
, safi
))
3674 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3676 filter
= &peer
->filter
[afi
][safi
];
3678 if (filter
->usmap
.name
)
3679 free (filter
->usmap
.name
);
3680 filter
->usmap
.name
= NULL
;
3681 filter
->usmap
.map
= NULL
;
3683 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3686 group
= peer
->group
;
3687 LIST_LOOP (group
->peer
, peer
, nn
)
3689 filter
= &peer
->filter
[afi
][safi
];
3691 if (! peer
->af_group
[afi
][safi
])
3694 if (filter
->usmap
.name
)
3695 free (filter
->usmap
.name
);
3696 filter
->usmap
.name
= NULL
;
3697 filter
->usmap
.map
= NULL
;
3703 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3704 u_int32_t max
, int warning
)
3706 struct peer_group
*group
;
3707 struct listnode
*nn
;
3709 if (! peer
->afc
[afi
][safi
])
3710 return BGP_ERR_PEER_INACTIVE
;
3712 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3713 peer
->pmax
[afi
][safi
] = max
;
3715 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3717 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3719 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3722 group
= peer
->group
;
3723 LIST_LOOP (group
->peer
, peer
, nn
)
3725 if (! peer
->af_group
[afi
][safi
])
3728 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3729 peer
->pmax
[afi
][safi
] = max
;
3731 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3733 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3739 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3741 struct peer_group
*group
;
3742 struct listnode
*nn
;
3744 if (! peer
->afc
[afi
][safi
])
3745 return BGP_ERR_PEER_INACTIVE
;
3747 /* apply peer-group config */
3748 if (peer
->af_group
[afi
][safi
])
3750 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
3751 PEER_FLAG_MAX_PREFIX
))
3752 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3754 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3756 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
3757 PEER_FLAG_MAX_PREFIX_WARNING
))
3758 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3760 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3762 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
3766 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3767 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3768 peer
->pmax
[afi
][safi
] = 0;
3770 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3773 group
= peer
->group
;
3774 LIST_LOOP (group
->peer
, peer
, nn
)
3776 if (! peer
->af_group
[afi
][safi
])
3779 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3780 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3781 peer
->pmax
[afi
][safi
] = 0;
3787 peer_clear (struct peer
*peer
)
3789 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
3791 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3792 peer
->v_start
= BGP_INIT_START_TIMER
;
3793 if (peer
->status
== Established
)
3794 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3795 BGP_NOTIFY_CEASE_ADMIN_RESET
);
3797 BGP_EVENT_ADD (peer
, BGP_Stop
);
3803 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
3804 enum bgp_clear_type stype
)
3806 if (peer
->status
!= Established
)
3809 if (! peer
->afc
[afi
][safi
])
3810 return BGP_ERR_AF_UNCONFIGURED
;
3812 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
3813 bgp_announce_route (peer
, afi
, safi
);
3815 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
3817 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
3818 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
3819 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
3821 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
3824 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
3825 prefix_type
= ORF_TYPE_PREFIX
;
3827 prefix_type
= ORF_TYPE_PREFIX_OLD
;
3829 if (filter
->plist
[FILTER_IN
].plist
)
3831 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
3832 bgp_route_refresh_send (peer
, afi
, safi
,
3833 prefix_type
, REFRESH_DEFER
, 1);
3834 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
3835 REFRESH_IMMEDIATE
, 0);
3839 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
3840 bgp_route_refresh_send (peer
, afi
, safi
,
3841 prefix_type
, REFRESH_IMMEDIATE
, 1);
3843 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3849 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
3850 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
3852 /* If neighbor has soft reconfiguration inbound flag.
3853 Use Adj-RIB-In database. */
3854 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
3855 bgp_soft_reconfig_in (peer
, afi
, safi
);
3858 /* If neighbor has route refresh capability, send route refresh
3859 message to the peer. */
3860 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3861 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3862 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3864 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
3870 /* Display peer uptime. */
3872 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
3877 /* Check buffer length. */
3878 if (len
< BGP_UPTIME_LEN
)
3880 zlog_warn ("peer_uptime (): buffer shortage %d", len
);
3884 /* If there is no connection has been done before print `never'. */
3887 snprintf (buf
, len
, "never ");
3891 /* Get current time. */
3892 uptime1
= time (NULL
);
3894 tm
= gmtime (&uptime1
);
3896 /* Making formatted timer strings. */
3897 #define ONE_DAY_SECOND 60*60*24
3898 #define ONE_WEEK_SECOND 60*60*24*7
3900 if (uptime1
< ONE_DAY_SECOND
)
3901 snprintf (buf
, len
, "%02d:%02d:%02d",
3902 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
3903 else if (uptime1
< ONE_WEEK_SECOND
)
3904 snprintf (buf
, len
, "%dd%02dh%02dm",
3905 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
3907 snprintf (buf
, len
, "%02dw%dd%02dh",
3908 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
3913 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
3914 afi_t afi
, safi_t safi
)
3916 struct bgp_filter
*filter
;
3917 struct bgp_filter
*gfilter
= NULL
;
3920 int out
= FILTER_OUT
;
3923 filter
= &peer
->filter
[afi
][safi
];
3924 if (peer
->af_group
[afi
][safi
])
3925 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3927 /* distribute-list. */
3928 if (filter
->dlist
[in
].name
)
3929 if (! gfilter
|| ! gfilter
->dlist
[in
].name
3930 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
3931 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
3932 filter
->dlist
[in
].name
, VTY_NEWLINE
);
3933 if (filter
->dlist
[out
].name
&& ! gfilter
)
3934 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
3935 filter
->dlist
[out
].name
, VTY_NEWLINE
);
3938 if (filter
->plist
[in
].name
)
3939 if (! gfilter
|| ! gfilter
->plist
[in
].name
3940 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
3941 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
3942 filter
->plist
[in
].name
, VTY_NEWLINE
);
3943 if (filter
->plist
[out
].name
&& ! gfilter
)
3944 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
3945 filter
->plist
[out
].name
, VTY_NEWLINE
);
3948 if (filter
->map
[in
].name
)
3949 if (! gfilter
|| ! gfilter
->map
[in
].name
3950 || strcmp (filter
->map
[in
].name
, gfilter
->map
[in
].name
) != 0)
3951 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
3952 filter
->map
[in
].name
, VTY_NEWLINE
);
3953 if (filter
->map
[out
].name
&& ! gfilter
)
3954 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
3955 filter
->map
[out
].name
, VTY_NEWLINE
);
3957 /* unsuppress-map */
3958 if (filter
->usmap
.name
&& ! gfilter
)
3959 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
3960 filter
->usmap
.name
, VTY_NEWLINE
);
3963 if (filter
->aslist
[in
].name
)
3964 if (! gfilter
|| ! gfilter
->aslist
[in
].name
3965 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
3966 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
3967 filter
->aslist
[in
].name
, VTY_NEWLINE
);
3968 if (filter
->aslist
[out
].name
&& ! gfilter
)
3969 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
3970 filter
->aslist
[out
].name
, VTY_NEWLINE
);
3973 /* BGP peer configuration display function. */
3975 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
3976 struct peer
*peer
, afi_t afi
, safi_t safi
)
3978 struct bgp_filter
*filter
;
3979 struct peer
*g_peer
= NULL
;
3980 char buf
[SU_ADDRSTRLEN
];
3983 filter
= &peer
->filter
[afi
][safi
];
3985 if (peer_group_active (peer
))
3986 g_peer
= peer
->group
->conf
;
3988 /************************************
3989 ****** Global to the neighbor ******
3990 ************************************/
3991 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
3994 if (! peer_group_active (peer
))
3996 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3997 vty_out (vty
, " neighbor %s peer-group%s", addr
,
4000 vty_out (vty
, " neighbor %s remote-as %d%s", addr
, peer
->as
,
4006 vty_out (vty
, " neighbor %s remote-as %d%s", addr
, peer
->as
,
4008 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4009 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4010 peer
->group
->name
, VTY_NEWLINE
);
4014 if (peer
->change_local_as
)
4015 if (! peer_group_active (peer
))
4016 vty_out (vty
, " neighbor %s local-as %d%s%s", addr
,
4017 peer
->change_local_as
,
4018 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
4019 " no-prepend" : "", VTY_NEWLINE
);
4023 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
4027 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4028 if (! peer_group_active (peer
) ||
4029 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
4030 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
4033 if (peer
->port
!= BGP_PORT_DEFAULT
)
4034 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
4037 /* Local interface name. */
4039 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
4043 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
4044 if (! peer_group_active (peer
) ||
4045 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
4046 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
4048 /* EBGP multihop. */
4049 if (peer_sort (peer
) != BGP_PEER_IBGP
&& peer
->ttl
!= 1)
4050 if (! peer_group_active (peer
) ||
4051 g_peer
->ttl
!= peer
->ttl
)
4052 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
4055 /* Enforce multihop. */
4056 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_ENFORCE_MULTIHOP
))
4057 if (! peer_group_active (peer
) ||
4058 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_ENFORCE_MULTIHOP
))
4059 vty_out (vty
, " neighbor %s enforce-multihop%s", addr
, VTY_NEWLINE
);
4061 /* Update-source. */
4062 if (peer
->update_if
)
4063 if (! peer_group_active (peer
) || ! g_peer
->update_if
4064 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
4065 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4066 peer
->update_if
, VTY_NEWLINE
);
4067 if (peer
->update_source
)
4068 if (! peer_group_active (peer
) || ! g_peer
->update_source
4069 || sockunion_cmp (g_peer
->update_source
,
4070 peer
->update_source
) != 0)
4071 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4072 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
4075 /* BGP version print. */
4076 if (peer
->version
== BGP_VERSION_MP_4_DRAFT_00
)
4077 vty_out (vty
, " neighbor %s version %s%s",
4078 addr
,"4-", VTY_NEWLINE
);
4080 /* advertisement-interval */
4081 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
4082 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
4083 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
4086 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
4087 && ! peer_group_active (peer
))
4088 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
4089 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
4091 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
))
4092 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
4093 peer
->connect
, VTY_NEWLINE
);
4095 /* Default weight. */
4096 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
4097 if (! peer_group_active (peer
) ||
4098 g_peer
->weight
!= peer
->weight
)
4099 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
4102 /* Route refresh. */
4103 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_NO_ROUTE_REFRESH_CAP
))
4104 if (! peer_group_active (peer
) ||
4105 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_NO_ROUTE_REFRESH_CAP
))
4106 vty_out (vty
, " no neighbor %s capability route-refresh%s", addr
,
4109 /* Dynamic capability. */
4110 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4111 if (! peer_group_active (peer
) ||
4112 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4113 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
4116 /* dont capability negotiation. */
4117 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4118 if (! peer_group_active (peer
) ||
4119 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4120 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
4123 /* override capability negotiation. */
4124 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4125 if (! peer_group_active (peer
) ||
4126 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4127 vty_out (vty
, " neighbor %s override-capability%s", addr
,
4130 /* strict capability negotiation. */
4131 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4132 if (! peer_group_active (peer
) ||
4133 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4134 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
4137 if (! peer_group_active (peer
))
4139 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4141 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4142 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4146 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4147 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
4153 /************************************
4154 ****** Per AF to the neighbor ******
4155 ************************************/
4157 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
4159 if (peer
->af_group
[afi
][safi
])
4160 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4161 peer
->group
->name
, VTY_NEWLINE
);
4163 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4166 /* ORF capability. */
4167 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4168 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4169 if (! peer
->af_group
[afi
][safi
])
4171 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
4173 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4174 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4175 vty_out (vty
, " both");
4176 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
4177 vty_out (vty
, " send");
4179 vty_out (vty
, " receive");
4180 vty_out (vty
, "%s", VTY_NEWLINE
);
4183 /* Route reflector client. */
4184 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
4185 && ! peer
->af_group
[afi
][safi
])
4186 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
4190 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
4191 && ! peer
->af_group
[afi
][safi
])
4192 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
4194 /* Remove private AS. */
4195 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
4196 && ! peer
->af_group
[afi
][safi
])
4197 vty_out (vty
, " neighbor %s remove-private-AS%s",
4200 /* send-community print. */
4201 if (! peer
->af_group
[afi
][safi
])
4203 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4205 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
4206 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4207 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
4208 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4209 vty_out (vty
, " neighbor %s send-community extended%s",
4211 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
4212 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
4216 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
4217 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4218 vty_out (vty
, " no neighbor %s send-community both%s",
4220 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4221 vty_out (vty
, " no neighbor %s send-community extended%s",
4223 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
4224 vty_out (vty
, " no neighbor %s send-community%s",
4229 /* Default information */
4230 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
4231 && ! peer
->af_group
[afi
][safi
])
4233 vty_out (vty
, " neighbor %s default-originate", addr
);
4234 if (peer
->default_rmap
[afi
][safi
].name
)
4235 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
4236 vty_out (vty
, "%s", VTY_NEWLINE
);
4239 /* Soft reconfiguration inbound. */
4240 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4241 if (! peer
->af_group
[afi
][safi
] ||
4242 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4243 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
4246 /* maximum-prefix. */
4247 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
4248 if (! peer
->af_group
[afi
][safi
]
4249 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
4250 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
4251 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
4252 vty_out (vty
, " neighbor %s maximum-prefix %ld%s%s",
4253 addr
, peer
->pmax
[afi
][safi
],
4254 CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
4255 ? " warning-only" : "", VTY_NEWLINE
);
4257 /* Route server client. */
4258 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
4259 && ! peer
->af_group
[afi
][safi
])
4260 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
4263 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
4264 if (! peer_group_active (peer
)
4265 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
4266 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
4268 if (peer
->allowas_in
[afi
][safi
] == 3)
4269 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
4271 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
4272 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
4276 bgp_config_write_filter (vty
, peer
, afi
, safi
);
4278 /* atribute-unchanged. */
4279 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
4280 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
4281 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
4282 && ! peer
->af_group
[afi
][safi
])
4284 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
4285 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
4286 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
4287 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
4289 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
4290 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
4292 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
4294 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
4295 " med" : "", VTY_NEWLINE
);
4299 /* Display "address-family" configuration header. */
4301 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
4307 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4310 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
4314 if (safi
== SAFI_MULTICAST
)
4315 vty_out (vty
, "ipv4 multicast");
4316 else if (safi
== SAFI_MPLS_VPN
)
4317 vty_out (vty
, "vpnv4 unicast");
4319 else if (afi
== AFI_IP6
)
4320 vty_out (vty
, "ipv6");
4322 vty_out (vty
, "%s", VTY_NEWLINE
);
4327 /* Address family based peer configuration display. */
4329 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
4334 struct peer_group
*group
;
4335 struct listnode
*nn
;
4337 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
4339 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
4341 LIST_LOOP (bgp
->group
, group
, nn
)
4343 if (group
->conf
->afc
[afi
][safi
])
4345 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
4346 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
4349 LIST_LOOP (bgp
->peer
, peer
, nn
)
4351 if (peer
->afc
[afi
][safi
])
4353 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
4355 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
4356 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
4361 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
4367 bgp_config_write (struct vty
*vty
)
4371 struct peer_group
*group
;
4373 struct listnode
*nn
, *nm
, *no
;
4375 /* BGP Multiple instance. */
4376 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
4378 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
4382 /* BGP Config type. */
4383 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4385 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
4389 /* BGP configuration. */
4390 LIST_LOOP (bm
->bgp
, bgp
, nn
)
4393 vty_out (vty
, "!%s", VTY_NEWLINE
);
4395 /* Router bgp ASN */
4396 vty_out (vty
, "router bgp %d", bgp
->as
);
4398 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
4401 vty_out (vty
, " view %s", bgp
->name
);
4403 vty_out (vty
, "%s", VTY_NEWLINE
);
4405 /* No Synchronization */
4406 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4407 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
4409 /* BGP fast-external-failover. */
4410 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
4411 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
4413 /* BGP router ID. */
4414 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
4415 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
4418 /* BGP configuration. */
4419 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
4420 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
4422 /* BGP default ipv4-unicast. */
4423 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4424 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
4426 /* BGP default local-preference. */
4427 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
4428 vty_out (vty
, " bgp default local-preference %d%s",
4429 bgp
->default_local_pref
, VTY_NEWLINE
);
4431 /* BGP client-to-client reflection. */
4432 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
4433 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
4435 /* BGP cluster ID. */
4436 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
4437 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
4440 /* Confederation Information */
4441 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
4443 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
4445 if (bgp
->confed_peers_cnt
> 0)
4449 vty_out (vty
, " bgp confederation peers");
4451 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
4454 vty_out(vty
, "%d", bgp
->confed_peers
[i
]);
4457 vty_out (vty
, "%s", VTY_NEWLINE
);
4461 /* BGP enforce-first-as. */
4462 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
4463 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
4465 /* BGP deterministic-med. */
4466 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
4467 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
4469 /* BGP bestpath method. */
4470 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
4471 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
4472 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
4473 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
4474 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
4475 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
4477 vty_out (vty
, " bgp bestpath med");
4478 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
4479 vty_out (vty
, " confed");
4480 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
4481 vty_out (vty
, " missing-as-worst");
4482 vty_out (vty
, "%s", VTY_NEWLINE
);
4485 /* BGP network import check. */
4486 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
4487 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
4489 /* BGP scan interval. */
4490 bgp_config_write_scan_time (vty
);
4492 /* BGP flag dampening. */
4493 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
4494 BGP_CONFIG_DAMPENING
))
4495 bgp_config_write_damp (vty
);
4497 /* BGP static route configuration. */
4498 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
4500 /* BGP redistribute configuration. */
4501 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
4503 /* BGP timers configuration. */
4504 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
4505 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
4506 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
4507 bgp
->default_holdtime
, VTY_NEWLINE
);
4510 LIST_LOOP (bgp
->group
, group
, nm
)
4512 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
4515 /* Normal neighbor configuration. */
4516 LIST_LOOP (bgp
->peer
, peer
, no
)
4518 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
4519 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
4522 /* Distance configuration. */
4523 bgp_config_write_distance (vty
, bgp
);
4525 /* No auto-summary */
4526 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4527 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
4529 /* IPv4 multicast configuration. */
4530 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
4532 /* IPv4 VPN configuration. */
4533 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
4535 /* IPv6 unicast configuration. */
4536 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
4546 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
4549 bm
->bgp
= list_new ();
4550 bm
->port
= BGP_PORT_DEFAULT
;
4551 bm
->master
= thread_master_create ();
4552 bm
->start_time
= time (NULL
);
4558 void bgp_zebra_init ();
4559 void bgp_route_map_init ();
4560 void bgp_filter_init ();
4562 /* BGP VTY commands installation. */
4565 /* Create BGP server socket. */
4566 bgp_socket (NULL
, bm
->port
);
4576 bgp_route_map_init ();
4578 bgp_mplsvpn_init ();
4580 /* Access list initialize. */
4581 access_list_init ();
4582 access_list_add_hook (peer_distribute_update
);
4583 access_list_delete_hook (peer_distribute_update
);
4585 /* Filter list initialize. */
4587 as_list_add_hook (peer_aslist_update
);
4588 as_list_delete_hook (peer_aslist_update
);
4590 /* Prefix list initialize.*/
4591 prefix_list_init ();
4592 prefix_list_add_hook (peer_prefix_list_update
);
4593 prefix_list_delete_hook (peer_prefix_list_update
);
4595 /* Community list initialize. */
4596 bgp_clist
= community_list_init ();
4600 #endif /* HAVE_SNMP */