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 along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "sockunion.h"
38 #include "workqueue.h"
46 #include "frr_pthread.h"
49 #include "bgpd/bgpd.h"
50 #include "bgpd/bgp_table.h"
51 #include "bgpd/bgp_aspath.h"
52 #include "bgpd/bgp_route.h"
53 #include "bgpd/bgp_dump.h"
54 #include "bgpd/bgp_debug.h"
55 #include "bgpd/bgp_community.h"
56 #include "bgpd/bgp_attr.h"
57 #include "bgpd/bgp_regex.h"
58 #include "bgpd/bgp_clist.h"
59 #include "bgpd/bgp_fsm.h"
60 #include "bgpd/bgp_packet.h"
61 #include "bgpd/bgp_zebra.h"
62 #include "bgpd/bgp_open.h"
63 #include "bgpd/bgp_filter.h"
64 #include "bgpd/bgp_nexthop.h"
65 #include "bgpd/bgp_damp.h"
66 #include "bgpd/bgp_mplsvpn.h"
68 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
69 #include "bgpd/rfapi/rfapi_backend.h"
71 #include "bgpd/bgp_evpn.h"
72 #include "bgpd/bgp_advertise.h"
73 #include "bgpd/bgp_network.h"
74 #include "bgpd/bgp_vty.h"
75 #include "bgpd/bgp_mpath.h"
76 #include "bgpd/bgp_nht.h"
77 #include "bgpd/bgp_updgrp.h"
78 #include "bgpd/bgp_bfd.h"
79 #include "bgpd/bgp_memory.h"
80 #include "bgpd/bgp_evpn_vty.h"
81 #include "bgpd/bgp_keepalives.h"
82 #include "bgpd/bgp_io.h"
83 #include "bgpd/bgp_ecommunity.h"
84 #include "bgpd/bgp_flowspec.h"
85 #include "bgpd/bgp_labelpool.h"
86 #include "bgpd/bgp_pbr.h"
88 DEFINE_MTYPE_STATIC(BGPD
, PEER_TX_SHUTDOWN_MSG
, "Peer shutdown message (TX)");
89 DEFINE_QOBJ_TYPE(bgp_master
)
91 DEFINE_QOBJ_TYPE(peer
)
93 /* BGP process wide configuration. */
94 static struct bgp_master bgp_master
;
96 /* BGP process wide configuration pointer to export. */
97 struct bgp_master
*bm
;
99 /* BGP community-list. */
100 struct community_list_handler
*bgp_clist
;
102 unsigned int multipath_num
= MULTIPATH_NUM
;
104 static void bgp_if_finish(struct bgp
*bgp
);
105 static void peer_drop_dynamic_neighbor(struct peer
*peer
);
107 extern struct zclient
*zclient
;
109 /* handle main socket creation or deletion */
110 static int bgp_check_main_socket(bool create
, struct bgp
*bgp
)
112 static int bgp_server_main_created
;
114 if (create
== true) {
115 if (bgp_server_main_created
)
117 if (bgp_socket(bgp
, bm
->port
, bm
->address
) < 0)
118 return BGP_ERR_INVALID_VALUE
;
119 bgp_server_main_created
= 1;
122 if (!bgp_server_main_created
)
125 bgp_server_main_created
= 0;
129 void bgp_session_reset(struct peer
*peer
)
131 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
132 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
133 peer_delete(peer
->doppelganger
);
135 BGP_EVENT_ADD(peer
, BGP_Stop
);
139 * During session reset, we may delete the doppelganger peer, which would
140 * be the next node to the current node. If the session reset was invoked
141 * during walk of peer list, we would end up accessing the freed next
142 * node. This function moves the next node along.
144 static void bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
149 n
= (nnode
) ? *nnode
: NULL
;
150 npeer
= (n
) ? listgetdata(n
) : NULL
;
152 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
153 && !(CHECK_FLAG(peer
->doppelganger
->flags
,
154 PEER_FLAG_CONFIG_NODE
))) {
155 if (peer
->doppelganger
== npeer
)
156 /* nnode and *nnode are confirmed to be non-NULL here */
157 *nnode
= (*nnode
)->next
;
158 peer_delete(peer
->doppelganger
);
161 BGP_EVENT_ADD(peer
, BGP_Stop
);
164 /* BGP global flag manipulation. */
165 int bgp_option_set(int flag
)
169 case BGP_OPT_MULTIPLE_INSTANCE
:
170 case BGP_OPT_CONFIG_CISCO
:
171 case BGP_OPT_NO_LISTEN
:
172 SET_FLAG(bm
->options
, flag
);
175 return BGP_ERR_INVALID_FLAG
;
180 int bgp_option_unset(int flag
)
183 case BGP_OPT_MULTIPLE_INSTANCE
:
184 if (listcount(bm
->bgp
) > 1)
185 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
188 case BGP_OPT_CONFIG_CISCO
:
189 UNSET_FLAG(bm
->options
, flag
);
192 return BGP_ERR_INVALID_FLAG
;
197 int bgp_option_check(int flag
)
199 return CHECK_FLAG(bm
->options
, flag
);
202 /* BGP flag manipulation. */
203 int bgp_flag_set(struct bgp
*bgp
, int flag
)
205 SET_FLAG(bgp
->flags
, flag
);
209 int bgp_flag_unset(struct bgp
*bgp
, int flag
)
211 UNSET_FLAG(bgp
->flags
, flag
);
215 int bgp_flag_check(struct bgp
*bgp
, int flag
)
217 return CHECK_FLAG(bgp
->flags
, flag
);
220 /* Internal function to set BGP structure configureation flag. */
221 static void bgp_config_set(struct bgp
*bgp
, int config
)
223 SET_FLAG(bgp
->config
, config
);
226 static void bgp_config_unset(struct bgp
*bgp
, int config
)
228 UNSET_FLAG(bgp
->config
, config
);
231 static int bgp_config_check(struct bgp
*bgp
, int config
)
233 return CHECK_FLAG(bgp
->config
, config
);
236 /* Set BGP router identifier. */
237 static int bgp_router_id_set(struct bgp
*bgp
, const struct in_addr
*id
)
240 struct listnode
*node
, *nnode
;
242 if (IPV4_ADDR_SAME(&bgp
->router_id
, id
))
245 /* EVPN uses router id in RD, withdraw them */
246 if (is_evpn_enabled())
247 bgp_evpn_handle_router_id_update(bgp
, TRUE
);
249 IPV4_ADDR_COPY(&bgp
->router_id
, id
);
251 /* Set all peer's local identifier with this value. */
252 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
253 IPV4_ADDR_COPY(&peer
->local_id
, id
);
255 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
256 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
257 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
258 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
262 /* EVPN uses router id in RD, update them */
263 if (is_evpn_enabled())
264 bgp_evpn_handle_router_id_update(bgp
, FALSE
);
269 void bgp_router_id_zebra_bump(vrf_id_t vrf_id
, const struct prefix
*router_id
)
271 struct listnode
*node
, *nnode
;
274 if (vrf_id
== VRF_DEFAULT
) {
275 /* Router-id change for default VRF has to also update all
277 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
278 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
281 bgp
->router_id_zebra
= router_id
->u
.prefix4
;
282 if (!bgp
->router_id_static
.s_addr
)
283 bgp_router_id_set(bgp
, &router_id
->u
.prefix4
);
286 bgp
= bgp_lookup_by_vrf_id(vrf_id
);
288 bgp
->router_id_zebra
= router_id
->u
.prefix4
;
290 if (!bgp
->router_id_static
.s_addr
)
291 bgp_router_id_set(bgp
, &router_id
->u
.prefix4
);
296 int bgp_router_id_static_set(struct bgp
*bgp
, struct in_addr id
)
298 bgp
->router_id_static
= id
;
299 bgp_router_id_set(bgp
, id
.s_addr
? &id
: &bgp
->router_id_zebra
);
303 /* BGP's cluster-id control. */
304 int bgp_cluster_id_set(struct bgp
*bgp
, struct in_addr
*cluster_id
)
307 struct listnode
*node
, *nnode
;
309 if (bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
)
310 && IPV4_ADDR_SAME(&bgp
->cluster_id
, cluster_id
))
313 IPV4_ADDR_COPY(&bgp
->cluster_id
, cluster_id
);
314 bgp_config_set(bgp
, BGP_CONFIG_CLUSTER_ID
);
316 /* Clear all IBGP peer. */
317 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
318 if (peer
->sort
!= BGP_PEER_IBGP
)
321 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
322 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
323 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
324 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
330 int bgp_cluster_id_unset(struct bgp
*bgp
)
333 struct listnode
*node
, *nnode
;
335 if (!bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
))
338 bgp
->cluster_id
.s_addr
= 0;
339 bgp_config_unset(bgp
, BGP_CONFIG_CLUSTER_ID
);
341 /* Clear all IBGP peer. */
342 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
343 if (peer
->sort
!= BGP_PEER_IBGP
)
346 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
347 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
348 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
349 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
355 /* time_t value that is monotonicly increasing
356 * and uneffected by adjustments to system clock
358 time_t bgp_clock(void)
366 /* BGP timer configuration. */
367 int bgp_timers_set(struct bgp
*bgp
, uint32_t keepalive
, uint32_t holdtime
)
369 bgp
->default_keepalive
=
370 (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
371 bgp
->default_holdtime
= holdtime
;
376 int bgp_timers_unset(struct bgp
*bgp
)
378 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
379 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
384 /* BGP confederation configuration. */
385 int bgp_confederation_id_set(struct bgp
*bgp
, as_t as
)
388 struct listnode
*node
, *nnode
;
392 return BGP_ERR_INVALID_AS
;
394 /* Remember - were we doing confederation before? */
395 already_confed
= bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
);
397 bgp_config_set(bgp
, BGP_CONFIG_CONFEDERATION
);
399 /* If we were doing confederation already, this is just an external
400 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
401 were not doing confederation before, reset all EBGP sessions. */
402 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
403 /* We're looking for peers who's AS is not local or part of our
405 if (already_confed
) {
406 if (peer_sort(peer
) == BGP_PEER_EBGP
) {
408 if (BGP_IS_VALID_STATE_FOR_NOTIF(
411 PEER_DOWN_CONFED_ID_CHANGE
;
413 peer
, BGP_NOTIFY_CEASE
,
414 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
416 bgp_session_reset_safe(peer
, &nnode
);
419 /* Not doign confederation before, so reset every
422 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
423 /* Reset the local_as to be our EBGP one */
424 if (peer_sort(peer
) == BGP_PEER_EBGP
)
426 if (BGP_IS_VALID_STATE_FOR_NOTIF(
429 PEER_DOWN_CONFED_ID_CHANGE
;
431 peer
, BGP_NOTIFY_CEASE
,
432 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
434 bgp_session_reset_safe(peer
, &nnode
);
441 int bgp_confederation_id_unset(struct bgp
*bgp
)
444 struct listnode
*node
, *nnode
;
447 bgp_config_unset(bgp
, BGP_CONFIG_CONFEDERATION
);
449 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
450 /* We're looking for peers who's AS is not local */
451 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
452 peer
->local_as
= bgp
->as
;
453 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
454 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
455 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
456 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
460 bgp_session_reset_safe(peer
, &nnode
);
466 /* Is an AS part of the confed or not? */
467 int bgp_confederation_peers_check(struct bgp
*bgp
, as_t as
)
474 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
475 if (bgp
->confed_peers
[i
] == as
)
481 /* Add an AS to the confederation set. */
482 int bgp_confederation_peers_add(struct bgp
*bgp
, as_t as
)
485 struct listnode
*node
, *nnode
;
488 return BGP_ERR_INVALID_BGP
;
491 return BGP_ERR_INVALID_AS
;
493 if (bgp_confederation_peers_check(bgp
, as
))
496 if (bgp
->confed_peers
)
498 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
499 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
502 XMALLOC(MTYPE_BGP_CONFED_LIST
,
503 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
505 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
506 bgp
->confed_peers_cnt
++;
508 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
509 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
510 if (peer
->as
== as
) {
511 peer
->local_as
= bgp
->as
;
512 if (BGP_IS_VALID_STATE_FOR_NOTIF(
515 PEER_DOWN_CONFED_PEER_CHANGE
;
517 peer
, BGP_NOTIFY_CEASE
,
518 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
520 bgp_session_reset_safe(peer
, &nnode
);
527 /* Delete an AS from the confederation set. */
528 int bgp_confederation_peers_remove(struct bgp
*bgp
, as_t as
)
533 struct listnode
*node
, *nnode
;
538 if (!bgp_confederation_peers_check(bgp
, as
))
541 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
542 if (bgp
->confed_peers
[i
] == as
)
543 for (j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
544 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
546 bgp
->confed_peers_cnt
--;
548 if (bgp
->confed_peers_cnt
== 0) {
549 if (bgp
->confed_peers
)
550 XFREE(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
551 bgp
->confed_peers
= NULL
;
554 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
555 bgp
->confed_peers_cnt
* sizeof(as_t
));
557 /* Now reset any peer who's remote AS has just been removed from the
559 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
560 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
561 if (peer
->as
== as
) {
562 peer
->local_as
= bgp
->confed_id
;
563 if (BGP_IS_VALID_STATE_FOR_NOTIF(
566 PEER_DOWN_CONFED_PEER_CHANGE
;
568 peer
, BGP_NOTIFY_CEASE
,
569 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
571 bgp_session_reset_safe(peer
, &nnode
);
579 /* Local preference configuration. */
580 int bgp_default_local_preference_set(struct bgp
*bgp
, uint32_t local_pref
)
585 bgp
->default_local_pref
= local_pref
;
590 int bgp_default_local_preference_unset(struct bgp
*bgp
)
595 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
600 /* Local preference configuration. */
601 int bgp_default_subgroup_pkt_queue_max_set(struct bgp
*bgp
, uint32_t queue_size
)
606 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
611 int bgp_default_subgroup_pkt_queue_max_unset(struct bgp
*bgp
)
615 bgp
->default_subgroup_pkt_queue_max
=
616 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
621 /* Listen limit configuration. */
622 int bgp_listen_limit_set(struct bgp
*bgp
, int listen_limit
)
627 bgp
->dynamic_neighbors_limit
= listen_limit
;
632 int bgp_listen_limit_unset(struct bgp
*bgp
)
637 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
642 int bgp_map_afi_safi_iana2int(iana_afi_t pkt_afi
, iana_safi_t pkt_safi
,
643 afi_t
*afi
, safi_t
*safi
)
645 /* Map from IANA values to internal values, return error if
646 * values are unrecognized.
648 *afi
= afi_iana2int(pkt_afi
);
649 *safi
= safi_iana2int(pkt_safi
);
650 if (*afi
== AFI_MAX
|| *safi
== SAFI_MAX
)
656 int bgp_map_afi_safi_int2iana(afi_t afi
, safi_t safi
, iana_afi_t
*pkt_afi
,
657 iana_safi_t
*pkt_safi
)
659 /* Map from internal values to IANA values, return error if
660 * internal values are bad (unexpected).
662 if (afi
== AFI_MAX
|| safi
== SAFI_MAX
)
664 *pkt_afi
= afi_int2iana(afi
);
665 *pkt_safi
= safi_int2iana(safi
);
669 struct peer_af
*peer_af_create(struct peer
*peer
, afi_t afi
, safi_t safi
)
677 afid
= afindex(afi
, safi
);
678 if (afid
>= BGP_AF_MAX
)
681 assert(peer
->peer_af_array
[afid
] == NULL
);
683 /* Allocate new peer af */
684 af
= XCALLOC(MTYPE_BGP_PEER_AF
, sizeof(struct peer_af
));
687 zlog_err("Could not create af structure for peer %s",
692 peer
->peer_af_array
[afid
] = af
;
701 struct peer_af
*peer_af_find(struct peer
*peer
, afi_t afi
, safi_t safi
)
708 afid
= afindex(afi
, safi
);
709 if (afid
>= BGP_AF_MAX
)
712 return peer
->peer_af_array
[afid
];
715 int peer_af_delete(struct peer
*peer
, afi_t afi
, safi_t safi
)
723 afid
= afindex(afi
, safi
);
724 if (afid
>= BGP_AF_MAX
)
727 af
= peer
->peer_af_array
[afid
];
731 bgp_stop_announce_route_timer(af
);
733 if (PAF_SUBGRP(af
)) {
734 if (BGP_DEBUG(update_groups
, UPDATE_GROUPS
))
735 zlog_debug("u%" PRIu64
":s%" PRIu64
" remove peer %s",
736 af
->subgroup
->update_group
->id
,
737 af
->subgroup
->id
, peer
->host
);
740 update_subgroup_remove_peer(af
->subgroup
, af
);
742 peer
->peer_af_array
[afid
] = NULL
;
743 XFREE(MTYPE_BGP_PEER_AF
, af
);
747 /* Peer comparison function for sorting. */
748 int peer_cmp(struct peer
*p1
, struct peer
*p2
)
750 if (p1
->group
&& !p2
->group
)
753 if (!p1
->group
&& p2
->group
)
756 if (p1
->group
== p2
->group
) {
757 if (p1
->conf_if
&& !p2
->conf_if
)
760 if (!p1
->conf_if
&& p2
->conf_if
)
763 if (p1
->conf_if
&& p2
->conf_if
)
764 return if_cmp_name_func(p1
->conf_if
, p2
->conf_if
);
766 return strcmp(p1
->group
->name
, p2
->group
->name
);
768 return sockunion_cmp(&p1
->su
, &p2
->su
);
771 static unsigned int peer_hash_key_make(void *p
)
773 struct peer
*peer
= p
;
774 return sockunion_hash(&peer
->su
);
777 static int peer_hash_same(const void *p1
, const void *p2
)
779 const struct peer
*peer1
= p1
;
780 const struct peer
*peer2
= p2
;
781 return (sockunion_same(&peer1
->su
, &peer2
->su
)
782 && CHECK_FLAG(peer1
->flags
, PEER_FLAG_CONFIG_NODE
)
783 == CHECK_FLAG(peer2
->flags
, PEER_FLAG_CONFIG_NODE
));
786 void peer_flag_inherit(struct peer
*peer
, uint32_t flag
)
790 /* Skip if peer is not a peer-group member. */
791 if (!peer_group_active(peer
))
794 /* Unset override flag to signal inheritance from peer-group. */
795 UNSET_FLAG(peer
->flags_override
, flag
);
798 * Inherit flag state from peer-group. If the flag of the peer-group is
799 * not being inverted, the peer must inherit the inverse of the current
800 * peer-group flag state.
802 group_val
= CHECK_FLAG(peer
->group
->conf
->flags
, flag
);
803 if (!CHECK_FLAG(peer
->group
->conf
->flags_invert
, flag
)
804 && CHECK_FLAG(peer
->flags_invert
, flag
))
805 COND_FLAG(peer
->flags
, flag
, !group_val
);
807 COND_FLAG(peer
->flags
, flag
, group_val
);
810 int peer_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
812 return CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
);
815 void peer_af_flag_inherit(struct peer
*peer
, afi_t afi
, safi_t safi
,
820 /* Skip if peer is not a peer-group member. */
821 if (!peer_group_active(peer
))
824 /* Unset override flag to signal inheritance from peer-group. */
825 UNSET_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
828 * Inherit flag state from peer-group. If the flag of the peer-group is
829 * not being inverted, the peer must inherit the inverse of the current
830 * peer-group flag state.
832 group_val
= CHECK_FLAG(peer
->group
->conf
->af_flags
[afi
][safi
], flag
);
833 if (!CHECK_FLAG(peer
->group
->conf
->af_flags_invert
[afi
][safi
], flag
)
834 && CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
835 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, !group_val
);
837 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, group_val
);
840 static bool peergroup_flag_check(struct peer
*peer
, uint32_t flag
)
842 if (!peer_group_active(peer
)) {
843 if (CHECK_FLAG(peer
->flags_invert
, flag
))
844 return !CHECK_FLAG(peer
->flags
, flag
);
846 return !!CHECK_FLAG(peer
->flags
, flag
);
849 return !!CHECK_FLAG(peer
->flags_override
, flag
);
852 static bool peergroup_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
855 if (!peer_group_active(peer
)) {
856 if (CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
857 return !peer_af_flag_check(peer
, afi
, safi
, flag
);
859 return !!peer_af_flag_check(peer
, afi
, safi
, flag
);
862 return !!CHECK_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
865 static bool peergroup_filter_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
866 uint8_t type
, int direct
)
868 struct bgp_filter
*filter
;
870 if (peer_group_active(peer
))
871 return !!CHECK_FLAG(peer
->filter_override
[afi
][safi
][direct
],
874 filter
= &peer
->filter
[afi
][safi
];
876 case PEER_FT_DISTRIBUTE_LIST
:
877 return !!(filter
->dlist
[direct
].name
);
878 case PEER_FT_FILTER_LIST
:
879 return !!(filter
->aslist
[direct
].name
);
880 case PEER_FT_PREFIX_LIST
:
881 return !!(filter
->plist
[direct
].name
);
882 case PEER_FT_ROUTE_MAP
:
883 return !!(filter
->map
[direct
].name
);
884 case PEER_FT_UNSUPPRESS_MAP
:
885 return !!(filter
->usmap
.name
);
891 /* Reset all address family specific configuration. */
892 static void peer_af_flag_reset(struct peer
*peer
, afi_t afi
, safi_t safi
)
895 struct bgp_filter
*filter
;
896 char orf_name
[BUFSIZ
];
898 filter
= &peer
->filter
[afi
][safi
];
900 /* Clear neighbor filter and route-map */
901 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++) {
902 if (filter
->dlist
[i
].name
) {
903 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
904 filter
->dlist
[i
].name
= NULL
;
906 if (filter
->plist
[i
].name
) {
907 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
908 filter
->plist
[i
].name
= NULL
;
910 if (filter
->aslist
[i
].name
) {
911 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
912 filter
->aslist
[i
].name
= NULL
;
915 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++) {
916 if (filter
->map
[i
].name
) {
917 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
918 filter
->map
[i
].name
= NULL
;
922 /* Clear unsuppress map. */
923 if (filter
->usmap
.name
)
924 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
925 filter
->usmap
.name
= NULL
;
926 filter
->usmap
.map
= NULL
;
928 /* Clear neighbor's all address family flags. */
929 peer
->af_flags
[afi
][safi
] = 0;
931 /* Clear neighbor's all address family sflags. */
932 peer
->af_sflags
[afi
][safi
] = 0;
934 /* Clear neighbor's all address family capabilities. */
935 peer
->af_cap
[afi
][safi
] = 0;
938 peer
->orf_plist
[afi
][safi
] = NULL
;
939 sprintf(orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
940 prefix_bgp_orf_remove_all(afi
, orf_name
);
942 /* Set default neighbor send-community. */
943 if (!bgp_option_check(BGP_OPT_CONFIG_CISCO
)) {
944 SET_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
945 SET_FLAG(peer
->af_flags
[afi
][safi
],
946 PEER_FLAG_SEND_EXT_COMMUNITY
);
947 SET_FLAG(peer
->af_flags
[afi
][safi
],
948 PEER_FLAG_SEND_LARGE_COMMUNITY
);
950 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
951 PEER_FLAG_SEND_COMMUNITY
);
952 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
953 PEER_FLAG_SEND_EXT_COMMUNITY
);
954 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
955 PEER_FLAG_SEND_LARGE_COMMUNITY
);
958 /* Clear neighbor default_originate_rmap */
959 if (peer
->default_rmap
[afi
][safi
].name
)
960 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
961 peer
->default_rmap
[afi
][safi
].name
= NULL
;
962 peer
->default_rmap
[afi
][safi
].map
= NULL
;
964 /* Clear neighbor maximum-prefix */
965 peer
->pmax
[afi
][safi
] = 0;
966 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
969 /* peer global config reset */
970 static void peer_global_config_reset(struct peer
*peer
)
974 peer
->change_local_as
= 0;
975 peer
->ttl
= (peer_sort(peer
) == BGP_PEER_IBGP
? MAXTTL
: 1);
976 if (peer
->update_source
) {
977 sockunion_free(peer
->update_source
);
978 peer
->update_source
= NULL
;
980 if (peer
->update_if
) {
981 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
982 peer
->update_if
= NULL
;
985 if (peer_sort(peer
) == BGP_PEER_IBGP
)
986 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
988 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
990 /* These are per-peer specific flags and so we must preserve them */
991 saved_flags
|= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
992 saved_flags
|= CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
);
994 SET_FLAG(peer
->flags
, saved_flags
);
999 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1001 /* Reset some other configs back to defaults. */
1002 peer
->v_start
= BGP_INIT_START_TIMER
;
1003 peer
->password
= NULL
;
1004 peer
->local_id
= peer
->bgp
->router_id
;
1005 peer
->v_holdtime
= peer
->bgp
->default_holdtime
;
1006 peer
->v_keepalive
= peer
->bgp
->default_keepalive
;
1008 bfd_info_free(&(peer
->bfd_info
));
1010 /* Set back the CONFIG_NODE flag. */
1011 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1014 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
1015 static inline bgp_peer_sort_t
peer_calc_sort(struct peer
*peer
)
1022 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1023 if (peer
->as_type
== AS_INTERNAL
)
1024 return BGP_PEER_IBGP
;
1026 else if (peer
->as_type
== AS_EXTERNAL
)
1027 return BGP_PEER_EBGP
;
1029 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
)
1030 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
1035 peer1
= listnode_head(peer
->group
->peer
);
1040 return BGP_PEER_INTERNAL
;
1044 if (bgp
&& CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)) {
1045 if (peer
->local_as
== 0)
1046 return BGP_PEER_INTERNAL
;
1048 if (peer
->local_as
== peer
->as
) {
1049 if (bgp
->as
== bgp
->confed_id
) {
1050 if (peer
->local_as
== bgp
->as
)
1051 return BGP_PEER_IBGP
;
1053 return BGP_PEER_EBGP
;
1055 if (peer
->local_as
== bgp
->confed_id
)
1056 return BGP_PEER_EBGP
;
1058 return BGP_PEER_IBGP
;
1062 if (bgp_confederation_peers_check(bgp
, peer
->as
))
1063 return BGP_PEER_CONFED
;
1065 return BGP_PEER_EBGP
;
1067 if (peer
->as_type
!= AS_SPECIFIED
)
1068 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
1071 return (peer
->local_as
== 0
1073 : peer
->local_as
== peer
->as
? BGP_PEER_IBGP
1078 /* Calculate and cache the peer "sort" */
1079 bgp_peer_sort_t
peer_sort(struct peer
*peer
)
1081 peer
->sort
= peer_calc_sort(peer
);
1085 static void peer_free(struct peer
*peer
)
1087 assert(peer
->status
== Deleted
);
1091 /* this /ought/ to have been done already through bgp_stop earlier,
1092 * but just to be sure..
1094 bgp_timer_set(peer
);
1095 bgp_reads_off(peer
);
1096 bgp_writes_off(peer
);
1097 assert(!peer
->t_write
);
1098 assert(!peer
->t_read
);
1099 BGP_EVENT_FLUSH(peer
);
1101 pthread_mutex_destroy(&peer
->io_mtx
);
1103 /* Free connected nexthop, if present */
1104 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
)
1105 && !peer_dynamic_neighbor(peer
))
1106 bgp_delete_connected_nexthop(family2afi(peer
->su
.sa
.sa_family
),
1109 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
1112 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
1116 /* Free allocated host character. */
1118 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1122 if (peer
->domainname
) {
1123 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
1124 peer
->domainname
= NULL
;
1128 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
1129 peer
->ifname
= NULL
;
1132 /* Update source configuration. */
1133 if (peer
->update_source
) {
1134 sockunion_free(peer
->update_source
);
1135 peer
->update_source
= NULL
;
1138 if (peer
->update_if
) {
1139 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1140 peer
->update_if
= NULL
;
1143 if (peer
->notify
.data
)
1144 XFREE(MTYPE_TMP
, peer
->notify
.data
);
1145 memset(&peer
->notify
, 0, sizeof(struct bgp_notify
));
1147 if (peer
->clear_node_queue
)
1148 work_queue_free_and_null(&peer
->clear_node_queue
);
1150 bgp_sync_delete(peer
);
1152 if (peer
->conf_if
) {
1153 XFREE(MTYPE_PEER_CONF_IF
, peer
->conf_if
);
1154 peer
->conf_if
= NULL
;
1157 bfd_info_free(&(peer
->bfd_info
));
1159 bgp_unlock(peer
->bgp
);
1161 memset(peer
, 0, sizeof(struct peer
));
1163 XFREE(MTYPE_BGP_PEER
, peer
);
1166 /* increase reference count on a struct peer */
1167 struct peer
*peer_lock_with_caller(const char *name
, struct peer
*peer
)
1169 assert(peer
&& (peer
->lock
>= 0));
1172 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
1180 /* decrease reference count on a struct peer
1181 * struct peer is freed and NULL returned if last reference
1183 struct peer
*peer_unlock_with_caller(const char *name
, struct peer
*peer
)
1185 assert(peer
&& (peer
->lock
> 0));
1188 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1193 if (peer
->lock
== 0) {
1201 /* Allocate new peer object, implicitely locked. */
1202 struct peer
*peer_new(struct bgp
*bgp
)
1209 /* bgp argument is absolutely required */
1214 /* Allocate new peer. */
1215 peer
= XCALLOC(MTYPE_BGP_PEER
, sizeof(struct peer
));
1217 /* Set default value. */
1219 peer
->v_start
= BGP_INIT_START_TIMER
;
1220 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1221 peer
->status
= Idle
;
1222 peer
->ostatus
= Idle
;
1223 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1224 peer
->bgp
= bgp_lock(bgp
);
1225 peer
= peer_lock(peer
); /* initial reference */
1226 peer
->password
= NULL
;
1228 /* Set default flags. */
1229 FOREACH_AFI_SAFI (afi
, safi
) {
1230 if (!bgp_option_check(BGP_OPT_CONFIG_CISCO
)) {
1231 SET_FLAG(peer
->af_flags
[afi
][safi
],
1232 PEER_FLAG_SEND_COMMUNITY
);
1233 SET_FLAG(peer
->af_flags
[afi
][safi
],
1234 PEER_FLAG_SEND_EXT_COMMUNITY
);
1235 SET_FLAG(peer
->af_flags
[afi
][safi
],
1236 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1238 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1239 PEER_FLAG_SEND_COMMUNITY
);
1240 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1241 PEER_FLAG_SEND_EXT_COMMUNITY
);
1242 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1243 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1247 /* set nexthop-unchanged for l2vpn evpn by default */
1248 SET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1249 PEER_FLAG_NEXTHOP_UNCHANGED
);
1251 SET_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1253 /* Create buffers. */
1254 peer
->ibuf
= stream_fifo_new();
1255 peer
->obuf
= stream_fifo_new();
1256 pthread_mutex_init(&peer
->io_mtx
, NULL
);
1258 /* We use a larger buffer for peer->obuf_work in the event that:
1259 * - We RX a BGP_UPDATE where the attributes alone are just
1260 * under BGP_MAX_PACKET_SIZE
1261 * - The user configures an outbound route-map that does many as-path
1262 * prepends or adds many communities. At most they can have
1263 * CMD_ARGC_MAX args in a route-map so there is a finite limit on how
1264 * large they can make the attributes.
1266 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid
1267 * bounds checking for every single attribute as we construct an
1271 stream_new(BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1273 ringbuf_new(BGP_MAX_PACKET_SIZE
* BGP_READ_PACKET_MAX
);
1275 peer
->scratch
= stream_new(BGP_MAX_PACKET_SIZE
);
1277 bgp_sync_init(peer
);
1279 /* Get service port number. */
1280 sp
= getservbyname("bgp", "tcp");
1281 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
1283 QOBJ_REG(peer
, peer
);
1288 * This function is invoked when a duplicate peer structure associated with
1289 * a neighbor is being deleted. If this about-to-be-deleted structure is
1290 * the one with all the config, then we have to copy over the info.
1292 void peer_xfer_config(struct peer
*peer_dst
, struct peer
*peer_src
)
1294 struct peer_af
*paf
;
1302 /* The following function is used by both peer group config copy to
1303 * individual peer and when we transfer config
1305 if (peer_src
->change_local_as
)
1306 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1308 /* peer flags apply */
1309 peer_dst
->flags
= peer_src
->flags
;
1310 peer_dst
->cap
= peer_src
->cap
;
1312 peer_dst
->local_as
= peer_src
->local_as
;
1313 peer_dst
->port
= peer_src
->port
;
1314 (void)peer_sort(peer_dst
);
1315 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1318 peer_dst
->holdtime
= peer_src
->holdtime
;
1319 peer_dst
->keepalive
= peer_src
->keepalive
;
1320 peer_dst
->connect
= peer_src
->connect
;
1321 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1322 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1323 peer_dst
->routeadv
= peer_src
->routeadv
;
1324 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1326 /* password apply */
1327 if (peer_src
->password
&& !peer_dst
->password
)
1328 peer_dst
->password
=
1329 XSTRDUP(MTYPE_PEER_PASSWORD
, peer_src
->password
);
1331 FOREACH_AFI_SAFI (afi
, safi
) {
1332 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1333 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1334 peer_dst
->allowas_in
[afi
][safi
] =
1335 peer_src
->allowas_in
[afi
][safi
];
1336 peer_dst
->weight
[afi
][safi
] = peer_src
->weight
[afi
][safi
];
1339 for (afidx
= BGP_AF_START
; afidx
< BGP_AF_MAX
; afidx
++) {
1340 paf
= peer_src
->peer_af_array
[afidx
];
1342 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1345 /* update-source apply */
1346 if (peer_src
->update_source
) {
1347 if (peer_dst
->update_source
)
1348 sockunion_free(peer_dst
->update_source
);
1349 if (peer_dst
->update_if
) {
1350 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1351 peer_dst
->update_if
= NULL
;
1353 peer_dst
->update_source
=
1354 sockunion_dup(peer_src
->update_source
);
1355 } else if (peer_src
->update_if
) {
1356 if (peer_dst
->update_if
)
1357 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1358 if (peer_dst
->update_source
) {
1359 sockunion_free(peer_dst
->update_source
);
1360 peer_dst
->update_source
= NULL
;
1362 peer_dst
->update_if
=
1363 XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1366 if (peer_src
->ifname
) {
1367 if (peer_dst
->ifname
)
1368 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1371 XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1375 static int bgp_peer_conf_if_to_su_update_v4(struct peer
*peer
,
1376 struct interface
*ifp
)
1378 struct connected
*ifc
;
1381 struct listnode
*node
;
1383 /* If our IPv4 address on the interface is /30 or /31, we can derive the
1384 * IPv4 address of the other end.
1386 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
)) {
1387 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
)) {
1388 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1389 if (p
.prefixlen
== 30) {
1390 peer
->su
.sa
.sa_family
= AF_INET
;
1391 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1393 peer
->su
.sin
.sin_addr
.s_addr
=
1395 else if (addr
% 4 == 2)
1396 peer
->su
.sin
.sin_addr
.s_addr
=
1398 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1399 peer
->su
.sin
.sin_len
=
1400 sizeof(struct sockaddr_in
);
1401 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1403 } else if (p
.prefixlen
== 31) {
1404 peer
->su
.sa
.sa_family
= AF_INET
;
1405 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1407 peer
->su
.sin
.sin_addr
.s_addr
=
1410 peer
->su
.sin
.sin_addr
.s_addr
=
1412 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1413 peer
->su
.sin
.sin_len
=
1414 sizeof(struct sockaddr_in
);
1415 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1417 } else if (bgp_debug_neighbor_events(peer
))
1419 "%s: IPv4 interface address is not /30 or /31, v4 session not started",
1427 static int bgp_peer_conf_if_to_su_update_v6(struct peer
*peer
,
1428 struct interface
*ifp
)
1430 struct nbr_connected
*ifc_nbr
;
1432 /* Have we learnt the peer's IPv6 link-local address? */
1433 if (ifp
->nbr_connected
1434 && (ifc_nbr
= listnode_head(ifp
->nbr_connected
))) {
1435 peer
->su
.sa
.sa_family
= AF_INET6
;
1436 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1437 sizeof(struct in6_addr
));
1439 peer
->su
.sin6
.sin6_len
= sizeof(struct sockaddr_in6
);
1441 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1449 * Set or reset the peer address socketunion structure based on the
1450 * learnt/derived peer address. If the address has changed, update the
1451 * password on the listen socket, if needed.
1453 void bgp_peer_conf_if_to_su_update(struct peer
*peer
)
1455 struct interface
*ifp
;
1457 int peer_addr_updated
= 0;
1463 * Our peer structure is stored in the bgp->peerhash
1464 * release it before we modify anything.
1466 hash_release(peer
->bgp
->peerhash
, peer
);
1468 prev_family
= peer
->su
.sa
.sa_family
;
1469 if ((ifp
= if_lookup_by_name(peer
->conf_if
, peer
->bgp
->vrf_id
))) {
1471 /* If BGP unnumbered is not "v6only", we first see if we can
1473 * peer's IPv4 address.
1475 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1477 bgp_peer_conf_if_to_su_update_v4(peer
, ifp
);
1479 /* If "v6only" or we can't derive peer's IPv4 address, see if
1481 * learnt the peer's IPv6 link-local address. This is from the
1483 * IPv6 address in router advertisement.
1485 if (!peer_addr_updated
)
1487 bgp_peer_conf_if_to_su_update_v6(peer
, ifp
);
1489 /* If we could derive the peer address, we may need to install the
1491 * configured for the peer, if any, on the listen socket. Otherwise,
1493 * that peer's address is not available and uninstall the password, if
1496 if (peer_addr_updated
) {
1497 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1498 && prev_family
== AF_UNSPEC
)
1501 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1502 && prev_family
!= AF_UNSPEC
)
1503 bgp_md5_unset(peer
);
1504 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1505 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof(struct in6_addr
));
1509 * Since our su changed we need to del/add peer to the peerhash
1511 hash_get(peer
->bgp
->peerhash
, peer
, hash_alloc_intern
);
1514 static void bgp_recalculate_afi_safi_bestpaths(struct bgp
*bgp
, afi_t afi
,
1517 struct bgp_node
*rn
, *nrn
;
1519 for (rn
= bgp_table_top(bgp
->rib
[afi
][safi
]); rn
;
1520 rn
= bgp_route_next(rn
)) {
1521 if (rn
->info
!= NULL
) {
1522 /* Special handling for 2-level routing
1524 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
1525 || safi
== SAFI_EVPN
) {
1526 for (nrn
= bgp_table_top(
1527 (struct bgp_table
*)(rn
->info
));
1528 nrn
; nrn
= bgp_route_next(nrn
))
1529 bgp_process(bgp
, nrn
, afi
, safi
);
1531 bgp_process(bgp
, rn
, afi
, safi
);
1536 /* Force a bestpath recalculation for all prefixes. This is used
1537 * when 'bgp bestpath' commands are entered.
1539 void bgp_recalculate_all_bestpaths(struct bgp
*bgp
)
1544 FOREACH_AFI_SAFI (afi
, safi
) {
1545 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, safi
);
1549 /* Create new BGP peer. */
1550 struct peer
*peer_create(union sockunion
*su
, const char *conf_if
,
1551 struct bgp
*bgp
, as_t local_as
, as_t remote_as
,
1552 int as_type
, afi_t afi
, safi_t safi
,
1553 struct peer_group
*group
)
1557 char buf
[SU_ADDRSTRLEN
];
1559 peer
= peer_new(bgp
);
1561 peer
->conf_if
= XSTRDUP(MTYPE_PEER_CONF_IF
, conf_if
);
1562 bgp_peer_conf_if_to_su_update(peer
);
1564 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1565 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, conf_if
);
1568 sockunion2str(su
, buf
, SU_ADDRSTRLEN
);
1570 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1571 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, buf
);
1573 peer
->local_as
= local_as
;
1574 peer
->as
= remote_as
;
1575 peer
->as_type
= as_type
;
1576 peer
->local_id
= bgp
->router_id
;
1577 peer
->v_holdtime
= bgp
->default_holdtime
;
1578 peer
->v_keepalive
= bgp
->default_keepalive
;
1579 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
1580 ? BGP_DEFAULT_IBGP_ROUTEADV
1581 : BGP_DEFAULT_EBGP_ROUTEADV
;
1583 peer
= peer_lock(peer
); /* bgp peer list reference */
1584 peer
->group
= group
;
1585 listnode_add_sort(bgp
->peer
, peer
);
1586 hash_get(bgp
->peerhash
, peer
, hash_alloc_intern
);
1588 /* Adjust update-group coalesce timer heuristics for # peers. */
1589 if (bgp
->heuristic_coalesce
) {
1590 long ct
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
1592 * BGP_PEER_ADJUST_SUBGROUP_COALESCE_TIME
);
1593 bgp
->coalesce_time
= MIN(BGP_MAX_SUBGROUP_COALESCE_TIME
, ct
);
1596 active
= peer_active(peer
);
1598 /* Last read and reset time set */
1599 peer
->readtime
= peer
->resettime
= bgp_clock();
1601 /* Default TTL set. */
1602 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? MAXTTL
: 1;
1604 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1607 peer
->afc
[afi
][safi
] = 1;
1608 peer_af_create(peer
, afi
, safi
);
1611 /* auto shutdown if configured */
1612 if (bgp
->autoshutdown
)
1613 peer_flag_set(peer
, PEER_FLAG_SHUTDOWN
);
1614 /* Set up peer's events and timers. */
1615 else if (!active
&& peer_active(peer
))
1616 bgp_timer_set(peer
);
1621 /* Make accept BGP peer. This function is only called from the test code */
1622 struct peer
*peer_create_accept(struct bgp
*bgp
)
1626 peer
= peer_new(bgp
);
1628 peer
= peer_lock(peer
); /* bgp peer list reference */
1629 listnode_add_sort(bgp
->peer
, peer
);
1635 * Return true if we have a peer configured to use this afi/safi
1637 int bgp_afi_safi_peer_exists(struct bgp
*bgp
, afi_t afi
, safi_t safi
)
1639 struct listnode
*node
;
1642 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
1643 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1646 if (peer
->afc
[afi
][safi
])
1653 /* Change peer's AS number. */
1654 void peer_as_change(struct peer
*peer
, as_t as
, int as_specified
)
1656 bgp_peer_sort_t type
;
1659 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1660 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
1661 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1662 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
1663 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1665 bgp_session_reset(peer
);
1667 type
= peer_sort(peer
);
1669 peer
->as_type
= as_specified
;
1671 if (bgp_config_check(peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1672 && !bgp_confederation_peers_check(peer
->bgp
, as
)
1673 && peer
->bgp
->as
!= as
)
1674 peer
->local_as
= peer
->bgp
->confed_id
;
1676 peer
->local_as
= peer
->bgp
->as
;
1678 /* Advertisement-interval reset */
1679 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_ROUTEADV
)) {
1680 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
1681 ? BGP_DEFAULT_IBGP_ROUTEADV
1682 : BGP_DEFAULT_EBGP_ROUTEADV
;
1686 if (peer_sort(peer
) == BGP_PEER_IBGP
)
1688 else if (type
== BGP_PEER_IBGP
)
1691 /* reflector-client reset */
1692 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
1693 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1694 PEER_FLAG_REFLECTOR_CLIENT
);
1695 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1696 PEER_FLAG_REFLECTOR_CLIENT
);
1697 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_LABELED_UNICAST
],
1698 PEER_FLAG_REFLECTOR_CLIENT
);
1699 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1700 PEER_FLAG_REFLECTOR_CLIENT
);
1701 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_ENCAP
],
1702 PEER_FLAG_REFLECTOR_CLIENT
);
1703 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_FLOWSPEC
],
1704 PEER_FLAG_REFLECTOR_CLIENT
);
1705 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1706 PEER_FLAG_REFLECTOR_CLIENT
);
1707 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1708 PEER_FLAG_REFLECTOR_CLIENT
);
1709 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_LABELED_UNICAST
],
1710 PEER_FLAG_REFLECTOR_CLIENT
);
1711 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MPLS_VPN
],
1712 PEER_FLAG_REFLECTOR_CLIENT
);
1713 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_ENCAP
],
1714 PEER_FLAG_REFLECTOR_CLIENT
);
1715 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_FLOWSPEC
],
1716 PEER_FLAG_REFLECTOR_CLIENT
);
1717 UNSET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1718 PEER_FLAG_REFLECTOR_CLIENT
);
1721 /* local-as reset */
1722 if (peer_sort(peer
) != BGP_PEER_EBGP
) {
1723 peer
->change_local_as
= 0;
1724 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
1725 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1726 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1730 /* If peer does not exist, create new one. If peer already exists,
1731 set AS number to the peer. */
1732 int peer_remote_as(struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1733 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1739 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
1741 peer
= peer_lookup(bgp
, su
);
1744 /* Not allowed for a dynamic peer. */
1745 if (peer_dynamic_neighbor(peer
)) {
1747 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1750 /* When this peer is a member of peer-group. */
1752 if (peer
->group
->conf
->as
) {
1753 /* Return peer group's AS number. */
1754 *as
= peer
->group
->conf
->as
;
1755 return BGP_ERR_PEER_GROUP_MEMBER
;
1757 if (peer_sort(peer
->group
->conf
) == BGP_PEER_IBGP
) {
1758 if ((as_type
!= AS_INTERNAL
)
1759 && (bgp
->as
!= *as
)) {
1761 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1764 if ((as_type
!= AS_EXTERNAL
)
1765 && (bgp
->as
== *as
)) {
1767 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1772 /* Existing peer's AS number change. */
1773 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
1774 || (peer
->as_type
!= as_type
))
1775 peer_as_change(peer
, *as
, as_type
);
1778 return BGP_ERR_NO_INTERFACE_CONFIG
;
1780 /* If the peer is not part of our confederation, and its not an
1781 iBGP peer then spoof the source AS */
1782 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)
1783 && !bgp_confederation_peers_check(bgp
, *as
)
1785 local_as
= bgp
->confed_id
;
1789 /* If this is IPv4 unicast configuration and "no bgp default
1790 ipv4-unicast" is specified. */
1792 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1793 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1794 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0,
1797 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
,
1804 static void peer_group2peer_config_copy_af(struct peer_group
*group
,
1805 struct peer
*peer
, afi_t afi
,
1809 int out
= FILTER_OUT
;
1810 uint32_t pflags_ovrd
;
1811 uint8_t *pfilter_ovrd
;
1815 pflags_ovrd
= peer
->af_flags_override
[afi
][safi
];
1816 pfilter_ovrd
= &peer
->filter_override
[afi
][safi
][in
];
1818 /* peer af_flags apply */
1819 peer
->af_flags
[afi
][safi
] |= conf
->af_flags
[afi
][safi
] & ~pflags_ovrd
;
1820 peer
->af_flags_invert
[afi
][safi
] |= conf
->af_flags_invert
[afi
][safi
];
1822 /* maximum-prefix */
1823 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_MAX_PREFIX
)) {
1824 PEER_ATTR_INHERIT(peer
, group
, pmax
[afi
][safi
]);
1825 PEER_ATTR_INHERIT(peer
, group
, pmax_threshold
[afi
][safi
]);
1826 PEER_ATTR_INHERIT(peer
, group
, pmax_restart
[afi
][safi
]);
1830 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_ALLOWAS_IN
))
1831 PEER_ATTR_INHERIT(peer
, group
, allowas_in
[afi
][safi
]);
1834 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_WEIGHT
))
1835 PEER_ATTR_INHERIT(peer
, group
, weight
[afi
][safi
]);
1837 /* default-originate route-map */
1838 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_DEFAULT_ORIGINATE
)) {
1839 PEER_STR_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].name
,
1840 MTYPE_ROUTE_MAP_NAME
);
1841 PEER_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].map
);
1844 /* inbound filter apply */
1845 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_DISTRIBUTE_LIST
)) {
1846 PEER_STR_ATTR_INHERIT(peer
, group
,
1847 filter
[afi
][safi
].dlist
[in
].name
,
1848 MTYPE_BGP_FILTER_NAME
);
1849 PEER_ATTR_INHERIT(peer
, group
,
1850 filter
[afi
][safi
].dlist
[in
].alist
);
1853 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_PREFIX_LIST
)) {
1854 PEER_STR_ATTR_INHERIT(peer
, group
,
1855 filter
[afi
][safi
].plist
[in
].name
,
1856 MTYPE_BGP_FILTER_NAME
);
1857 PEER_ATTR_INHERIT(peer
, group
,
1858 filter
[afi
][safi
].plist
[in
].plist
);
1861 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_FILTER_LIST
)) {
1862 PEER_STR_ATTR_INHERIT(peer
, group
,
1863 filter
[afi
][safi
].aslist
[in
].name
,
1864 MTYPE_BGP_FILTER_NAME
);
1865 PEER_ATTR_INHERIT(peer
, group
,
1866 filter
[afi
][safi
].aslist
[in
].aslist
);
1869 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_IN
], PEER_FT_ROUTE_MAP
)) {
1870 PEER_STR_ATTR_INHERIT(peer
, group
,
1871 filter
[afi
][safi
].map
[in
].name
,
1872 MTYPE_BGP_FILTER_NAME
);
1873 PEER_ATTR_INHERIT(peer
, group
,
1874 filter
[afi
][safi
].map
[RMAP_IN
].map
);
1877 /* outbound filter apply */
1878 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_DISTRIBUTE_LIST
)) {
1879 PEER_STR_ATTR_INHERIT(peer
, group
,
1880 filter
[afi
][safi
].dlist
[out
].name
,
1881 MTYPE_BGP_FILTER_NAME
);
1882 PEER_ATTR_INHERIT(peer
, group
,
1883 filter
[afi
][safi
].dlist
[out
].alist
);
1886 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_PREFIX_LIST
)) {
1887 PEER_STR_ATTR_INHERIT(peer
, group
,
1888 filter
[afi
][safi
].plist
[out
].name
,
1889 MTYPE_BGP_FILTER_NAME
);
1890 PEER_ATTR_INHERIT(peer
, group
,
1891 filter
[afi
][safi
].plist
[out
].plist
);
1894 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_FILTER_LIST
)) {
1895 PEER_STR_ATTR_INHERIT(peer
, group
,
1896 filter
[afi
][safi
].aslist
[out
].name
,
1897 MTYPE_BGP_FILTER_NAME
);
1898 PEER_ATTR_INHERIT(peer
, group
,
1899 filter
[afi
][safi
].aslist
[out
].aslist
);
1902 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_OUT
], PEER_FT_ROUTE_MAP
)) {
1903 PEER_STR_ATTR_INHERIT(peer
, group
,
1904 filter
[afi
][safi
].map
[RMAP_OUT
].name
,
1905 MTYPE_BGP_FILTER_NAME
);
1906 PEER_ATTR_INHERIT(peer
, group
,
1907 filter
[afi
][safi
].map
[RMAP_OUT
].map
);
1910 /* nondirectional filter apply */
1911 if (!CHECK_FLAG(pfilter_ovrd
[0], PEER_FT_UNSUPPRESS_MAP
)) {
1912 PEER_STR_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.name
,
1913 MTYPE_BGP_FILTER_NAME
);
1914 PEER_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.map
);
1918 static int peer_activate_af(struct peer
*peer
, afi_t afi
, safi_t safi
)
1922 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1923 zlog_err("%s was called for peer-group %s", __func__
,
1928 /* Do not activate a peer for both SAFI_UNICAST and SAFI_LABELED_UNICAST
1930 if ((safi
== SAFI_UNICAST
&& peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
1931 || (safi
== SAFI_LABELED_UNICAST
&& peer
->afc
[afi
][SAFI_UNICAST
]))
1932 return BGP_ERR_PEER_SAFI_CONFLICT
;
1934 /* Nothing to do if we've already activated this peer */
1935 if (peer
->afc
[afi
][safi
])
1938 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1941 active
= peer_active(peer
);
1942 peer
->afc
[afi
][safi
] = 1;
1945 peer_group2peer_config_copy_af(peer
->group
, peer
, afi
, safi
);
1947 if (!active
&& peer_active(peer
)) {
1948 bgp_timer_set(peer
);
1950 if (peer
->status
== Established
) {
1951 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
1952 peer
->afc_adv
[afi
][safi
] = 1;
1953 bgp_capability_send(peer
, afi
, safi
,
1955 CAPABILITY_ACTION_SET
);
1956 if (peer
->afc_recv
[afi
][safi
]) {
1957 peer
->afc_nego
[afi
][safi
] = 1;
1958 bgp_announce_route(peer
, afi
, safi
);
1961 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1962 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
1963 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1966 if (peer
->status
== OpenSent
|| peer
->status
== OpenConfirm
) {
1967 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1968 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
1969 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1976 /* Activate the peer or peer group for specified AFI and SAFI. */
1977 int peer_activate(struct peer
*peer
, afi_t afi
, safi_t safi
)
1980 struct peer_group
*group
;
1981 struct listnode
*node
, *nnode
;
1982 struct peer
*tmp_peer
;
1985 /* Nothing to do if we've already activated this peer */
1986 if (peer
->afc
[afi
][safi
])
1991 /* This is a peer-group so activate all of the members of the
1992 * peer-group as well */
1993 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1995 /* Do not activate a peer for both SAFI_UNICAST and
1996 * SAFI_LABELED_UNICAST */
1997 if ((safi
== SAFI_UNICAST
1998 && peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
1999 || (safi
== SAFI_LABELED_UNICAST
2000 && peer
->afc
[afi
][SAFI_UNICAST
]))
2001 return BGP_ERR_PEER_SAFI_CONFLICT
;
2003 peer
->afc
[afi
][safi
] = 1;
2004 group
= peer
->group
;
2006 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2007 ret
|= peer_activate_af(tmp_peer
, afi
, safi
);
2010 ret
|= peer_activate_af(peer
, afi
, safi
);
2013 /* If this is the first peer to be activated for this
2014 * afi/labeled-unicast recalc bestpaths to trigger label allocation */
2015 if (safi
== SAFI_LABELED_UNICAST
2016 && !bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]) {
2018 if (BGP_DEBUG(zebra
, ZEBRA
))
2020 "peer(s) are now active for labeled-unicast, allocate MPLS labels");
2022 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 1;
2023 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2026 if (safi
== SAFI_FLOWSPEC
) {
2027 /* connect to table manager */
2028 bgp_zebra_init_tm_connect(bgp
);
2033 static int non_peergroup_deactivate_af(struct peer
*peer
, afi_t afi
,
2036 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2037 zlog_err("%s was called for peer-group %s", __func__
,
2042 /* Nothing to do if we've already deactivated this peer */
2043 if (!peer
->afc
[afi
][safi
])
2046 /* De-activate the address family configuration. */
2047 peer
->afc
[afi
][safi
] = 0;
2049 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2050 zlog_err("couldn't delete af structure for peer %s",
2055 if (peer
->status
== Established
) {
2056 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2057 peer
->afc_adv
[afi
][safi
] = 0;
2058 peer
->afc_nego
[afi
][safi
] = 0;
2060 if (peer_active_nego(peer
)) {
2061 bgp_capability_send(peer
, afi
, safi
,
2063 CAPABILITY_ACTION_UNSET
);
2064 bgp_clear_route(peer
, afi
, safi
);
2065 peer
->pcount
[afi
][safi
] = 0;
2067 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2068 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2069 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2072 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2073 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2074 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2081 int peer_deactivate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2084 struct peer_group
*group
;
2085 struct peer
*tmp_peer
;
2086 struct listnode
*node
, *nnode
;
2089 /* Nothing to do if we've already de-activated this peer */
2090 if (!peer
->afc
[afi
][safi
])
2093 /* This is a peer-group so de-activate all of the members of the
2094 * peer-group as well */
2095 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2096 peer
->afc
[afi
][safi
] = 0;
2097 group
= peer
->group
;
2099 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2100 zlog_err("couldn't delete af structure for peer %s",
2104 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2105 ret
|= non_peergroup_deactivate_af(tmp_peer
, afi
, safi
);
2108 ret
|= non_peergroup_deactivate_af(peer
, afi
, safi
);
2113 /* If this is the last peer to be deactivated for this
2114 * afi/labeled-unicast recalc bestpaths to trigger label deallocation */
2115 if (safi
== SAFI_LABELED_UNICAST
2116 && bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]
2117 && !bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
2119 if (BGP_DEBUG(zebra
, ZEBRA
))
2121 "peer(s) are no longer active for labeled-unicast, deallocate MPLS labels");
2123 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 0;
2124 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2129 int peer_afc_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int enable
)
2132 return peer_activate(peer
, afi
, safi
);
2134 return peer_deactivate(peer
, afi
, safi
);
2137 static void peer_nsf_stop(struct peer
*peer
)
2142 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
);
2143 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_MODE
);
2145 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2146 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MPLS_VPN
; safi
++)
2147 peer
->nsf
[afi
][safi
] = 0;
2149 if (peer
->t_gr_restart
) {
2150 BGP_TIMER_OFF(peer
->t_gr_restart
);
2151 if (bgp_debug_neighbor_events(peer
))
2152 zlog_debug("%s graceful restart timer stopped",
2155 if (peer
->t_gr_stale
) {
2156 BGP_TIMER_OFF(peer
->t_gr_stale
);
2157 if (bgp_debug_neighbor_events(peer
))
2159 "%s graceful restart stalepath timer stopped",
2162 bgp_clear_route_all(peer
);
2165 /* Delete peer from confguration.
2167 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
2168 * it to "cool off" and refcounts to hit 0, at which state it is freed.
2170 * This function /should/ take care to be idempotent, to guard against
2171 * it being called multiple times through stray events that come in
2172 * that happen to result in this function being called again. That
2173 * said, getting here for a "Deleted" peer is a bug in the neighbour
2176 int peer_delete(struct peer
*peer
)
2182 struct bgp_filter
*filter
;
2183 struct listnode
*pn
;
2186 assert(peer
->status
!= Deleted
);
2189 accept_peer
= CHECK_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2191 bgp_reads_off(peer
);
2192 bgp_writes_off(peer
);
2193 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_WRITES_ON
));
2194 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_READS_ON
));
2196 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2197 peer_nsf_stop(peer
);
2199 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2201 /* If this peer belongs to peer group, clear up the
2204 if (peer_dynamic_neighbor(peer
))
2205 peer_drop_dynamic_neighbor(peer
);
2207 if ((pn
= listnode_lookup(peer
->group
->peer
, peer
))) {
2209 peer
); /* group->peer list reference */
2210 list_delete_node(peer
->group
->peer
, pn
);
2215 /* Withdraw all information from routing table. We can not use
2216 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
2217 * executed after peer structure is deleted.
2219 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2221 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2223 if (peer
->doppelganger
) {
2224 peer
->doppelganger
->doppelganger
= NULL
;
2225 peer
->doppelganger
= NULL
;
2228 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2229 bgp_fsm_change_status(peer
, Deleted
);
2231 /* Remove from NHT */
2232 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
2233 bgp_unlink_nexthop_by_peer(peer
);
2235 /* Password configuration */
2236 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)) {
2237 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
2239 if (!accept_peer
&& !BGP_PEER_SU_UNSPEC(peer
)
2240 && !CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
2241 bgp_md5_unset(peer
);
2244 bgp_timer_set(peer
); /* stops all timers for Deleted */
2246 /* Delete from all peer list. */
2247 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
2248 && (pn
= listnode_lookup(bgp
->peer
, peer
))) {
2249 peer_unlock(peer
); /* bgp peer list reference */
2250 list_delete_node(bgp
->peer
, pn
);
2251 hash_release(bgp
->peerhash
, peer
);
2256 stream_fifo_free(peer
->ibuf
);
2261 stream_fifo_free(peer
->obuf
);
2265 if (peer
->ibuf_work
) {
2266 ringbuf_del(peer
->ibuf_work
);
2267 peer
->ibuf_work
= NULL
;
2270 if (peer
->obuf_work
) {
2271 stream_free(peer
->obuf_work
);
2272 peer
->obuf_work
= NULL
;
2275 if (peer
->scratch
) {
2276 stream_free(peer
->scratch
);
2277 peer
->scratch
= NULL
;
2280 /* Local and remote addresses. */
2281 if (peer
->su_local
) {
2282 sockunion_free(peer
->su_local
);
2283 peer
->su_local
= NULL
;
2286 if (peer
->su_remote
) {
2287 sockunion_free(peer
->su_remote
);
2288 peer
->su_remote
= NULL
;
2291 /* Free filter related memory. */
2292 FOREACH_AFI_SAFI (afi
, safi
) {
2293 filter
= &peer
->filter
[afi
][safi
];
2295 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++) {
2296 if (filter
->dlist
[i
].name
) {
2297 XFREE(MTYPE_BGP_FILTER_NAME
,
2298 filter
->dlist
[i
].name
);
2299 filter
->dlist
[i
].name
= NULL
;
2302 if (filter
->plist
[i
].name
) {
2303 XFREE(MTYPE_BGP_FILTER_NAME
,
2304 filter
->plist
[i
].name
);
2305 filter
->plist
[i
].name
= NULL
;
2308 if (filter
->aslist
[i
].name
) {
2309 XFREE(MTYPE_BGP_FILTER_NAME
,
2310 filter
->aslist
[i
].name
);
2311 filter
->aslist
[i
].name
= NULL
;
2315 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++) {
2316 if (filter
->map
[i
].name
) {
2317 XFREE(MTYPE_BGP_FILTER_NAME
,
2318 filter
->map
[i
].name
);
2319 filter
->map
[i
].name
= NULL
;
2323 if (filter
->usmap
.name
) {
2324 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
2325 filter
->usmap
.name
= NULL
;
2328 if (peer
->default_rmap
[afi
][safi
].name
) {
2329 XFREE(MTYPE_ROUTE_MAP_NAME
,
2330 peer
->default_rmap
[afi
][safi
].name
);
2331 peer
->default_rmap
[afi
][safi
].name
= NULL
;
2335 FOREACH_AFI_SAFI (afi
, safi
)
2336 peer_af_delete(peer
, afi
, safi
);
2338 if (peer
->hostname
) {
2339 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
2340 peer
->hostname
= NULL
;
2343 if (peer
->domainname
) {
2344 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
2345 peer
->domainname
= NULL
;
2348 peer_unlock(peer
); /* initial reference */
2353 static int peer_group_cmp(struct peer_group
*g1
, struct peer_group
*g2
)
2355 return strcmp(g1
->name
, g2
->name
);
2358 /* Peer group cofiguration. */
2359 static struct peer_group
*peer_group_new(void)
2361 return (struct peer_group
*)XCALLOC(MTYPE_PEER_GROUP
,
2362 sizeof(struct peer_group
));
2365 static void peer_group_free(struct peer_group
*group
)
2367 XFREE(MTYPE_PEER_GROUP
, group
);
2370 struct peer_group
*peer_group_lookup(struct bgp
*bgp
, const char *name
)
2372 struct peer_group
*group
;
2373 struct listnode
*node
, *nnode
;
2375 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2376 if (strcmp(group
->name
, name
) == 0)
2382 struct peer_group
*peer_group_get(struct bgp
*bgp
, const char *name
)
2384 struct peer_group
*group
;
2387 group
= peer_group_lookup(bgp
, name
);
2391 group
= peer_group_new();
2394 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2395 group
->name
= XSTRDUP(MTYPE_PEER_GROUP_HOST
, name
);
2396 group
->peer
= list_new();
2397 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2398 group
->listen_range
[afi
] = list_new();
2399 group
->conf
= peer_new(bgp
);
2400 if (!bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
2401 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
2402 if (group
->conf
->host
)
2403 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
2404 group
->conf
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, name
);
2405 group
->conf
->group
= group
;
2406 group
->conf
->as
= 0;
2407 group
->conf
->ttl
= 1;
2408 group
->conf
->gtsm_hops
= 0;
2409 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2410 SET_FLAG(group
->conf
->sflags
, PEER_STATUS_GROUP
);
2411 listnode_add_sort(bgp
->group
, group
);
2416 static void peer_group2peer_config_copy(struct peer_group
*group
,
2425 peer
->as
= conf
->as
;
2428 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_LOCAL_AS
))
2429 peer
->change_local_as
= conf
->change_local_as
;
2432 peer
->ttl
= conf
->ttl
;
2435 peer
->gtsm_hops
= conf
->gtsm_hops
;
2437 /* These are per-peer specific flags and so we must preserve them */
2438 peer
->flags
|= conf
->flags
& ~peer
->flags_override
;
2439 peer
->flags_invert
|= conf
->flags_invert
;
2441 /* peer timers apply */
2442 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER
)) {
2443 PEER_ATTR_INHERIT(peer
, group
, holdtime
);
2444 PEER_ATTR_INHERIT(peer
, group
, keepalive
);
2447 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER_CONNECT
)) {
2448 PEER_ATTR_INHERIT(peer
, group
, connect
);
2449 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_TIMER_CONNECT
))
2450 peer
->v_connect
= conf
->connect
;
2452 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
2455 /* advertisement-interval apply */
2456 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_ROUTEADV
)) {
2457 PEER_ATTR_INHERIT(peer
, group
, routeadv
);
2458 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_ROUTEADV
))
2459 peer
->v_routeadv
= conf
->routeadv
;
2461 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
2462 ? BGP_DEFAULT_IBGP_ROUTEADV
2463 : BGP_DEFAULT_EBGP_ROUTEADV
;
2466 /* password apply */
2467 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_PASSWORD
))
2468 PEER_STR_ATTR_INHERIT(peer
, group
, password
,
2469 MTYPE_PEER_PASSWORD
);
2471 if (!BGP_PEER_SU_UNSPEC(peer
))
2474 /* update-source apply */
2475 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_UPDATE_SOURCE
)) {
2476 if (conf
->update_source
) {
2477 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2478 PEER_SU_ATTR_INHERIT(peer
, group
, update_source
);
2479 } else if (conf
->update_if
) {
2480 sockunion_free(peer
->update_source
);
2481 PEER_STR_ATTR_INHERIT(peer
, group
, update_if
,
2482 MTYPE_PEER_UPDATE_SOURCE
);
2486 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2489 /* Peer group's remote AS configuration. */
2490 int peer_group_remote_as(struct bgp
*bgp
, const char *group_name
, as_t
*as
,
2493 struct peer_group
*group
;
2495 struct listnode
*node
, *nnode
;
2497 group
= peer_group_lookup(bgp
, group_name
);
2501 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2505 /* When we setup peer-group AS number all peer group member's AS
2506 number must be updated to same number. */
2507 peer_as_change(group
->conf
, *as
, as_type
);
2509 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2510 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
2511 || (peer
->as_type
!= as_type
))
2512 peer_as_change(peer
, *as
, as_type
);
2518 int peer_group_delete(struct peer_group
*group
)
2522 struct prefix
*prefix
;
2524 struct listnode
*node
, *nnode
;
2529 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2530 other
= peer
->doppelganger
;
2532 if (other
&& other
->status
!= Deleted
) {
2533 other
->group
= NULL
;
2537 list_delete_and_null(&group
->peer
);
2539 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2540 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
2542 prefix_free(prefix
);
2544 list_delete_and_null(&group
->listen_range
[afi
]);
2547 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2550 bfd_info_free(&(group
->conf
->bfd_info
));
2552 group
->conf
->group
= NULL
;
2553 peer_delete(group
->conf
);
2555 /* Delete from all peer_group list. */
2556 listnode_delete(bgp
->group
, group
);
2558 peer_group_free(group
);
2563 int peer_group_remote_as_delete(struct peer_group
*group
)
2565 struct peer
*peer
, *other
;
2566 struct listnode
*node
, *nnode
;
2568 if ((group
->conf
->as_type
== AS_UNSPECIFIED
)
2569 || ((!group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2572 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2573 other
= peer
->doppelganger
;
2577 if (other
&& other
->status
!= Deleted
) {
2578 other
->group
= NULL
;
2582 list_delete_all_node(group
->peer
);
2584 group
->conf
->as
= 0;
2585 group
->conf
->as_type
= AS_UNSPECIFIED
;
2590 int peer_group_listen_range_add(struct peer_group
*group
, struct prefix
*range
)
2592 struct prefix
*prefix
;
2593 struct listnode
*node
, *nnode
;
2596 afi
= family2afi(range
->family
);
2598 /* Group needs remote AS configured. */
2599 if (group
->conf
->as_type
== AS_UNSPECIFIED
)
2600 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2602 /* Ensure no duplicates. Currently we don't care about overlaps. */
2603 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2604 if (prefix_same(range
, prefix
))
2608 prefix
= prefix_new();
2609 prefix_copy(prefix
, range
);
2610 listnode_add(group
->listen_range
[afi
], prefix
);
2614 int peer_group_listen_range_del(struct peer_group
*group
, struct prefix
*range
)
2616 struct prefix
*prefix
, prefix2
;
2617 struct listnode
*node
, *nnode
;
2620 char buf
[PREFIX2STR_BUFFER
];
2622 afi
= family2afi(range
->family
);
2624 /* Identify the listen range. */
2625 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2626 if (prefix_same(range
, prefix
))
2631 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2633 prefix2str(prefix
, buf
, sizeof(buf
));
2635 /* Dispose off any dynamic neighbors that exist due to this listen range
2637 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2638 if (!peer_dynamic_neighbor(peer
))
2641 sockunion2hostprefix(&peer
->su
, &prefix2
);
2642 if (prefix_match(prefix
, &prefix2
)) {
2643 if (bgp_debug_neighbor_events(peer
))
2645 "Deleting dynamic neighbor %s group %s upon "
2646 "delete of listen range %s",
2647 peer
->host
, group
->name
, buf
);
2652 /* Get rid of the listen range */
2653 listnode_delete(group
->listen_range
[afi
], prefix
);
2658 /* Bind specified peer to peer group. */
2659 int peer_group_bind(struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2660 struct peer_group
*group
, as_t
*as
)
2662 int first_member
= 0;
2665 int cap_enhe_preset
= 0;
2667 /* Lookup the peer. */
2669 peer
= peer_lookup(bgp
, su
);
2671 /* The peer exist, bind it to the peer-group */
2673 /* When the peer already belongs to a peer-group, check the
2675 if (peer_group_active(peer
)) {
2677 /* The peer is already bound to the peer-group,
2680 if (strcmp(peer
->group
->name
, group
->name
) == 0)
2683 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2686 /* The peer has not specified a remote-as, inherit it from the
2688 if (peer
->as_type
== AS_UNSPECIFIED
) {
2689 peer
->as_type
= group
->conf
->as_type
;
2690 peer
->as
= group
->conf
->as
;
2693 if (!group
->conf
->as
) {
2694 if (peer_sort(group
->conf
) != BGP_PEER_INTERNAL
2695 && peer_sort(group
->conf
) != peer_sort(peer
)) {
2698 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2701 if (peer_sort(group
->conf
) == BGP_PEER_INTERNAL
)
2705 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2706 cap_enhe_preset
= 1;
2708 peer_group2peer_config_copy(group
, peer
);
2711 * Capability extended-nexthop is enabled for an interface
2713 * default. So, fix that up here.
2715 if (peer
->conf_if
&& cap_enhe_preset
)
2716 peer_flag_set(peer
, PEER_FLAG_CAPABILITY_ENHE
);
2718 FOREACH_AFI_SAFI (afi
, safi
) {
2719 if (group
->conf
->afc
[afi
][safi
]) {
2720 peer
->afc
[afi
][safi
] = 1;
2722 if (peer_af_find(peer
, afi
, safi
)
2723 || peer_af_create(peer
, afi
, safi
)) {
2724 peer_group2peer_config_copy_af(
2725 group
, peer
, afi
, safi
);
2727 } else if (peer
->afc
[afi
][safi
])
2728 peer_deactivate(peer
, afi
, safi
);
2732 assert(group
&& peer
->group
== group
);
2734 struct listnode
*pn
;
2735 pn
= listnode_lookup(bgp
->peer
, peer
);
2736 list_delete_node(bgp
->peer
, pn
);
2737 peer
->group
= group
;
2738 listnode_add_sort(bgp
->peer
, peer
);
2740 peer
= peer_lock(peer
); /* group->peer list reference */
2741 listnode_add(group
->peer
, peer
);
2745 /* Advertisement-interval reset */
2746 if (!CHECK_FLAG(group
->conf
->flags
,
2747 PEER_FLAG_ROUTEADV
)) {
2748 group
->conf
->v_routeadv
=
2749 (peer_sort(group
->conf
)
2751 ? BGP_DEFAULT_IBGP_ROUTEADV
2752 : BGP_DEFAULT_EBGP_ROUTEADV
;
2755 /* ebgp-multihop reset */
2756 if (peer_sort(group
->conf
) == BGP_PEER_IBGP
)
2757 group
->conf
->ttl
= MAXTTL
;
2759 /* local-as reset */
2760 if (peer_sort(group
->conf
) != BGP_PEER_EBGP
) {
2761 group
->conf
->change_local_as
= 0;
2762 peer_flag_unset(group
->conf
,
2763 PEER_FLAG_LOCAL_AS
);
2764 peer_flag_unset(group
->conf
,
2765 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2766 peer_flag_unset(group
->conf
,
2767 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2771 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2773 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2774 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2775 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2776 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2778 bgp_session_reset(peer
);
2782 /* Create a new peer. */
2784 if ((group
->conf
->as_type
== AS_SPECIFIED
)
2785 && (!group
->conf
->as
)) {
2786 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2789 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
2790 group
->conf
->as_type
, 0, 0, group
);
2792 peer
= peer_lock(peer
); /* group->peer list reference */
2793 listnode_add(group
->peer
, peer
);
2795 peer_group2peer_config_copy(group
, peer
);
2797 /* If the peer-group is active for this afi/safi then activate
2799 FOREACH_AFI_SAFI (afi
, safi
) {
2800 if (group
->conf
->afc
[afi
][safi
]) {
2801 peer
->afc
[afi
][safi
] = 1;
2802 peer_af_create(peer
, afi
, safi
);
2803 peer_group2peer_config_copy_af(group
, peer
, afi
,
2805 } else if (peer
->afc
[afi
][safi
])
2806 peer_deactivate(peer
, afi
, safi
);
2809 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2811 /* Set up peer's events and timers. */
2812 if (peer_active(peer
))
2813 bgp_timer_set(peer
);
2819 int peer_group_unbind(struct bgp
*bgp
, struct peer
*peer
,
2820 struct peer_group
*group
)
2826 if (group
!= peer
->group
)
2827 return BGP_ERR_PEER_GROUP_MISMATCH
;
2829 FOREACH_AFI_SAFI (afi
, safi
) {
2830 if (peer
->afc
[afi
][safi
]) {
2831 peer
->afc
[afi
][safi
] = 0;
2832 peer_af_flag_reset(peer
, afi
, safi
);
2834 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2836 "couldn't delete af structure for peer %s",
2842 assert(listnode_lookup(group
->peer
, peer
));
2843 peer_unlock(peer
); /* peer group list reference */
2844 listnode_delete(group
->peer
, peer
);
2846 other
= peer
->doppelganger
;
2848 if (group
->conf
->as
) {
2850 if (other
&& other
->status
!= Deleted
) {
2853 listnode_delete(group
->peer
, other
);
2855 other
->group
= NULL
;
2861 bgp_bfd_deregister_peer(peer
);
2862 peer_global_config_reset(peer
);
2864 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2865 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2866 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2867 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2869 bgp_session_reset(peer
);
2874 static int bgp_startup_timer_expire(struct thread
*thread
)
2878 bgp
= THREAD_ARG(thread
);
2879 bgp
->t_startup
= NULL
;
2885 * On shutdown we call the cleanup function which
2886 * does a free of the link list nodes, free up
2887 * the data we are pointing at too.
2889 static void bgp_vrf_string_name_delete(void *data
)
2893 XFREE(MTYPE_TMP
, vname
);
2896 /* BGP instance creation by `router bgp' commands. */
2897 static struct bgp
*bgp_create(as_t
*as
, const char *name
,
2898 enum bgp_instance_type inst_type
)
2904 if ((bgp
= XCALLOC(MTYPE_BGP
, sizeof(struct bgp
))) == NULL
)
2907 if (BGP_DEBUG(zebra
, ZEBRA
)) {
2908 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
2909 zlog_debug("Creating Default VRF, AS %u", *as
);
2911 zlog_debug("Creating %s %s, AS %u",
2912 (inst_type
== BGP_INSTANCE_TYPE_VRF
)
2919 bgp
->heuristic_coalesce
= true;
2920 bgp
->inst_type
= inst_type
;
2921 bgp
->vrf_id
= (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) ? VRF_DEFAULT
2923 bgp
->peer_self
= peer_new(bgp
);
2924 if (bgp
->peer_self
->host
)
2925 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
2926 bgp
->peer_self
->host
=
2927 XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
2928 if (bgp
->peer_self
->hostname
!= NULL
) {
2929 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->hostname
);
2930 bgp
->peer_self
->hostname
= NULL
;
2932 if (cmd_hostname_get())
2933 bgp
->peer_self
->hostname
=
2934 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_hostname_get());
2936 if (bgp
->peer_self
->domainname
!= NULL
) {
2937 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->domainname
);
2938 bgp
->peer_self
->domainname
= NULL
;
2940 if (cmd_domainname_get())
2941 bgp
->peer_self
->domainname
=
2942 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_domainname_get());
2943 bgp
->peer
= list_new();
2944 bgp
->peer
->cmp
= (int (*)(void *, void *))peer_cmp
;
2945 bgp
->peerhash
= hash_create(peer_hash_key_make
, peer_hash_same
,
2947 bgp
->peerhash
->max_size
= BGP_PEER_MAX_HASH_SIZE
;
2949 bgp
->group
= list_new();
2950 bgp
->group
->cmp
= (int (*)(void *, void *))peer_group_cmp
;
2952 FOREACH_AFI_SAFI (afi
, safi
) {
2953 bgp
->route
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
2954 bgp
->aggregate
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
2955 bgp
->rib
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
2957 /* Enable maximum-paths */
2958 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_EBGP
,
2960 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_IBGP
,
2964 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2965 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2966 bgp
->default_subgroup_pkt_queue_max
=
2967 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
2968 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2969 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2970 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2971 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2972 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
2973 bgp
->dynamic_neighbors_count
= 0;
2974 #if DFLT_BGP_IMPORT_CHECK
2975 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2977 #if DFLT_BGP_SHOW_HOSTNAME
2978 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2980 #if DFLT_BGP_LOG_NEIGHBOR_CHANGES
2981 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2983 #if DFLT_BGP_DETERMINISTIC_MED
2984 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
2986 bgp
->addpath_tx_id
= BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE
;
2991 if (inst_type
!= BGP_INSTANCE_TYPE_VRF
) {
2992 bgp
->rfapi
= bgp_rfapi_new(bgp
);
2994 assert(bgp
->rfapi_cfg
);
2996 #endif /* ENABLE_BGP_VNC */
2998 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2999 bgp
->vpn_policy
[afi
].bgp
= bgp
;
3000 bgp
->vpn_policy
[afi
].afi
= afi
;
3001 bgp
->vpn_policy
[afi
].tovpn_label
= MPLS_LABEL_NONE
;
3002 bgp
->vpn_policy
[afi
].tovpn_zebra_vrf_label_last_sent
=
3005 bgp
->vpn_policy
[afi
].import_vrf
= list_new();
3006 bgp
->vpn_policy
[afi
].import_vrf
->del
=
3007 bgp_vrf_string_name_delete
;
3008 bgp
->vpn_policy
[afi
].export_vrf
= list_new();
3009 bgp
->vpn_policy
[afi
].export_vrf
->del
=
3010 bgp_vrf_string_name_delete
;
3013 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
3015 /* TODO - The startup timer needs to be run for the whole of BGP
3017 thread_add_timer(bm
->master
, bgp_startup_timer_expire
, bgp
,
3018 bgp
->restart_time
, &bgp
->t_startup
);
3021 /* printable name we can use in debug messages */
3022 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
3023 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
3033 len
= 4 + 1 + strlen(n
) + 1; /* "view foo\0" */
3035 bgp
->name_pretty
= XCALLOC(MTYPE_BGP
, len
);
3036 snprintf(bgp
->name_pretty
, len
, "%s %s",
3037 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3043 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
3044 memory_order_relaxed
);
3045 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
3046 memory_order_relaxed
);
3047 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
3051 update_bgp_group_init(bgp
);
3053 /* assign a unique rd id for auto derivation of vrf's RD */
3054 bf_assign_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3061 /* Return the "default VRF" instance of BGP. */
3062 struct bgp
*bgp_get_default(void)
3065 struct listnode
*node
, *nnode
;
3067 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3068 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3073 /* Lookup BGP entry. */
3074 struct bgp
*bgp_lookup(as_t as
, const char *name
)
3077 struct listnode
*node
, *nnode
;
3079 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3081 && ((bgp
->name
== NULL
&& name
== NULL
)
3082 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0)))
3087 /* Lookup BGP structure by view name. */
3088 struct bgp
*bgp_lookup_by_name(const char *name
)
3091 struct listnode
*node
, *nnode
;
3093 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3094 if ((bgp
->name
== NULL
&& name
== NULL
)
3095 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0))
3100 /* Lookup BGP instance based on VRF id. */
3101 /* Note: Only to be used for incoming messages from Zebra. */
3102 struct bgp
*bgp_lookup_by_vrf_id(vrf_id_t vrf_id
)
3106 /* Lookup VRF (in tree) and follow link. */
3107 vrf
= vrf_lookup_by_id(vrf_id
);
3110 return (vrf
->info
) ? (struct bgp
*)vrf
->info
: NULL
;
3113 /* handle socket creation or deletion, if necessary
3114 * this is called for all new BGP instances
3116 int bgp_handle_socket(struct bgp
*bgp
, struct vrf
*vrf
, vrf_id_t old_vrf_id
,
3121 /* Create BGP server socket, if listen mode not disabled */
3122 if (!bgp
|| bgp_option_check(BGP_OPT_NO_LISTEN
))
3124 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3126 * suppress vrf socket
3128 if (create
== FALSE
) {
3129 bgp_close_vrf_socket(bgp
);
3133 return BGP_ERR_INVALID_VALUE
;
3135 * if vrf_id did not change
3137 if (vrf
->vrf_id
== old_vrf_id
)
3139 if (old_vrf_id
!= VRF_UNKNOWN
) {
3140 /* look for old socket. close it. */
3141 bgp_close_vrf_socket(bgp
);
3143 /* if backend is not yet identified ( VRF_UNKNOWN) then
3144 * creation will be done later
3146 if (vrf
->vrf_id
== VRF_UNKNOWN
)
3148 ret
= bgp_socket(bgp
, bm
->port
, bm
->address
);
3150 return BGP_ERR_INVALID_VALUE
;
3153 return bgp_check_main_socket(create
, bgp
);
3156 /* Called from VTY commands. */
3157 int bgp_get(struct bgp
**bgp_val
, as_t
*as
, const char *name
,
3158 enum bgp_instance_type inst_type
)
3161 struct vrf
*vrf
= NULL
;
3163 /* Multiple instance check. */
3164 if (bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
3166 bgp
= bgp_lookup_by_name(name
);
3168 bgp
= bgp_get_default();
3170 /* Already exists. */
3172 if (bgp
->as
!= *as
) {
3174 return BGP_ERR_INSTANCE_MISMATCH
;
3176 if (bgp
->inst_type
!= inst_type
)
3177 return BGP_ERR_INSTANCE_MISMATCH
;
3182 /* BGP instance name can not be specified for single instance.
3185 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
3187 /* Get default BGP structure if exists. */
3188 bgp
= bgp_get_default();
3191 if (bgp
->as
!= *as
) {
3193 return BGP_ERR_AS_MISMATCH
;
3200 bgp
= bgp_create(as
, name
, inst_type
);
3201 bgp_router_id_set(bgp
, &bgp
->router_id_zebra
);
3202 bgp_address_init(bgp
);
3203 bgp_tip_hash_init(bgp
);
3207 bgp
->t_rmap_def_originate_eval
= NULL
;
3209 /* If Default instance or VRF, link to the VRF structure, if present. */
3210 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
3211 || bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3212 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3214 bgp_vrf_link(bgp
, vrf
);
3216 /* BGP server socket already processed if BGP instance
3217 * already part of the list
3219 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, true);
3220 listnode_add(bm
->bgp
, bgp
);
3222 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
))
3223 bgp_zebra_instance_register(bgp
);
3230 * Make BGP instance "up". Applies only to VRFs (non-default) and
3231 * implies the VRF has been learnt from Zebra.
3233 void bgp_instance_up(struct bgp
*bgp
)
3236 struct listnode
*node
, *next
;
3238 /* Register with zebra. */
3239 bgp_zebra_instance_register(bgp
);
3241 /* Kick off any peers that may have been configured. */
3242 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3243 if (!BGP_PEER_START_SUPPRESSED(peer
))
3244 BGP_EVENT_ADD(peer
, BGP_Start
);
3247 /* Process any networks that have been configured. */
3248 bgp_static_add(bgp
);
3252 * Make BGP instance "down". Applies only to VRFs (non-default) and
3253 * implies the VRF has been deleted by Zebra.
3255 void bgp_instance_down(struct bgp
*bgp
)
3258 struct listnode
*node
;
3259 struct listnode
*next
;
3262 if (bgp
->t_rmap_def_originate_eval
) {
3263 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
3264 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3268 /* Bring down peers, so corresponding routes are purged. */
3269 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3270 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3271 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3272 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3274 bgp_session_reset(peer
);
3277 /* Purge network and redistributed routes. */
3278 bgp_purge_static_redist_routes(bgp
);
3280 /* Cleanup registered nexthops (flags) */
3281 bgp_cleanup_nexthops(bgp
);
3284 /* Delete BGP instance. */
3285 int bgp_delete(struct bgp
*bgp
)
3288 struct peer_group
*group
;
3289 struct listnode
*node
, *next
;
3295 THREAD_OFF(bgp
->t_startup
);
3297 if (BGP_DEBUG(zebra
, ZEBRA
)) {
3298 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3299 zlog_debug("Deleting Default VRF");
3301 zlog_debug("Deleting %s %s",
3302 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3308 /* unmap from RT list */
3309 bgp_evpn_vrf_delete(bgp
);
3312 if (bgp
->t_rmap_def_originate_eval
) {
3313 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
3314 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3318 /* Inform peers we're going down. */
3319 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3320 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3321 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3322 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3325 /* Delete static routes (networks). */
3326 bgp_static_delete(bgp
);
3328 /* Unset redistribution. */
3329 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3330 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
3331 if (i
!= ZEBRA_ROUTE_BGP
)
3332 bgp_redistribute_unset(bgp
, afi
, i
, 0);
3334 /* Free peers and peer-groups. */
3335 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, next
, group
))
3336 peer_group_delete(group
);
3338 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
))
3341 if (bgp
->peer_self
) {
3342 peer_delete(bgp
->peer_self
);
3343 bgp
->peer_self
= NULL
;
3346 update_bgp_group_free(bgp
);
3348 /* TODO - Other memory may need to be freed - e.g., NHT */
3353 bgp_cleanup_routes(bgp
);
3355 for (afi
= 0; afi
< AFI_MAX
; ++afi
) {
3356 if (!bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
3359 &bgp
->vpn_policy
[afi
]
3360 .import_redirect_rtlist
);
3361 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
3363 /* Remove visibility via the master list - there may however still be
3364 * routes to be processed still referencing the struct bgp.
3366 listnode_delete(bm
->bgp
, bgp
);
3368 /* Deregister from Zebra, if needed */
3369 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
))
3370 bgp_zebra_instance_deregister(bgp
);
3372 /* Free interfaces in this instance. */
3375 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3376 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
3378 bgp_vrf_unlink(bgp
, vrf
);
3380 thread_master_free_unused(bm
->master
);
3381 bgp_unlock(bgp
); /* initial reference */
3386 void bgp_free(struct bgp
*bgp
)
3390 struct bgp_table
*table
;
3391 struct bgp_node
*rn
;
3392 struct bgp_rmap
*rmap
;
3396 list_delete_and_null(&bgp
->group
);
3397 list_delete_and_null(&bgp
->peer
);
3399 if (bgp
->peerhash
) {
3400 hash_free(bgp
->peerhash
);
3401 bgp
->peerhash
= NULL
;
3404 FOREACH_AFI_SAFI (afi
, safi
) {
3405 /* Special handling for 2-level routing tables. */
3406 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
3407 || safi
== SAFI_EVPN
) {
3408 for (rn
= bgp_table_top(bgp
->rib
[afi
][safi
]); rn
;
3409 rn
= bgp_route_next(rn
)) {
3410 table
= (struct bgp_table
*)rn
->info
;
3411 bgp_table_finish(&table
);
3414 if (bgp
->route
[afi
][safi
])
3415 bgp_table_finish(&bgp
->route
[afi
][safi
]);
3416 if (bgp
->aggregate
[afi
][safi
])
3417 bgp_table_finish(&bgp
->aggregate
[afi
][safi
]);
3418 if (bgp
->rib
[afi
][safi
])
3419 bgp_table_finish(&bgp
->rib
[afi
][safi
]);
3420 rmap
= &bgp
->table_map
[afi
][safi
];
3422 XFREE(MTYPE_ROUTE_MAP_NAME
, rmap
->name
);
3425 bgp_scan_finish(bgp
);
3426 bgp_address_destroy(bgp
);
3427 bgp_tip_hash_destroy(bgp
);
3429 /* release the auto RD id */
3430 bf_release_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3432 bgp_evpn_cleanup(bgp
);
3433 bgp_pbr_cleanup(bgp
);
3435 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3436 vpn_policy_direction_t dir
;
3438 if (bgp
->vpn_policy
[afi
].import_vrf
)
3439 list_delete_and_null(&bgp
->vpn_policy
[afi
].import_vrf
);
3440 if (bgp
->vpn_policy
[afi
].export_vrf
)
3441 list_delete_and_null(&bgp
->vpn_policy
[afi
].export_vrf
);
3443 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
3444 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3445 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3446 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
3447 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3448 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3452 XFREE(MTYPE_BGP
, bgp
->name
);
3453 if (bgp
->name_pretty
)
3454 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
3456 XFREE(MTYPE_BGP
, bgp
);
3459 struct peer
*peer_lookup_by_conf_if(struct bgp
*bgp
, const char *conf_if
)
3462 struct listnode
*node
, *nnode
;
3468 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3469 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
3470 && !CHECK_FLAG(peer
->sflags
,
3471 PEER_STATUS_ACCEPT_PEER
))
3473 } else if (bm
->bgp
!= NULL
) {
3474 struct listnode
*bgpnode
, *nbgpnode
;
3476 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3477 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3479 && !strcmp(peer
->conf_if
, conf_if
)
3480 && !CHECK_FLAG(peer
->sflags
,
3481 PEER_STATUS_ACCEPT_PEER
))
3487 struct peer
*peer_lookup_by_hostname(struct bgp
*bgp
, const char *hostname
)
3490 struct listnode
*node
, *nnode
;
3496 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3497 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
3498 && !CHECK_FLAG(peer
->sflags
,
3499 PEER_STATUS_ACCEPT_PEER
))
3501 } else if (bm
->bgp
!= NULL
) {
3502 struct listnode
*bgpnode
, *nbgpnode
;
3504 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3505 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3507 && !strcmp(peer
->hostname
, hostname
)
3508 && !CHECK_FLAG(peer
->sflags
,
3509 PEER_STATUS_ACCEPT_PEER
))
3515 struct peer
*peer_lookup(struct bgp
*bgp
, union sockunion
*su
)
3517 struct peer
*peer
= NULL
;
3518 struct peer tmp_peer
;
3520 memset(&tmp_peer
, 0, sizeof(struct peer
));
3523 * We do not want to find the doppelganger peer so search for the peer
3525 * the hash that has PEER_FLAG_CONFIG_NODE
3527 SET_FLAG(tmp_peer
.flags
, PEER_FLAG_CONFIG_NODE
);
3532 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3533 } else if (bm
->bgp
!= NULL
) {
3534 struct listnode
*bgpnode
, *nbgpnode
;
3536 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
)) {
3537 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3546 struct peer
*peer_create_bind_dynamic_neighbor(struct bgp
*bgp
,
3547 union sockunion
*su
,
3548 struct peer_group
*group
)
3554 /* Create peer first; we've already checked group config is valid. */
3555 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
3556 group
->conf
->as_type
, 0, 0, group
);
3561 peer
= peer_lock(peer
);
3562 listnode_add(group
->peer
, peer
);
3564 peer_group2peer_config_copy(group
, peer
);
3567 * Bind peer for all AFs configured for the group. We don't call
3568 * peer_group_bind as that is sub-optimal and does some stuff we don't
3571 FOREACH_AFI_SAFI (afi
, safi
) {
3572 if (!group
->conf
->afc
[afi
][safi
])
3574 peer
->afc
[afi
][safi
] = 1;
3576 if (!peer_af_find(peer
, afi
, safi
))
3577 peer_af_create(peer
, afi
, safi
);
3579 peer_group2peer_config_copy_af(group
, peer
, afi
, safi
);
3582 /* Mark as dynamic, but also as a "config node" for other things to
3584 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
3585 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3591 peer_group_lookup_dynamic_neighbor_range(struct peer_group
*group
,
3592 struct prefix
*prefix
)
3594 struct listnode
*node
, *nnode
;
3595 struct prefix
*range
;
3598 afi
= family2afi(prefix
->family
);
3600 if (group
->listen_range
[afi
])
3601 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
3603 if (prefix_match(range
, prefix
))
3610 peer_group_lookup_dynamic_neighbor(struct bgp
*bgp
, struct prefix
*prefix
,
3611 struct prefix
**listen_range
)
3613 struct prefix
*range
= NULL
;
3614 struct peer_group
*group
= NULL
;
3615 struct listnode
*node
, *nnode
;
3617 *listen_range
= NULL
;
3619 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3620 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3623 } else if (bm
->bgp
!= NULL
) {
3624 struct listnode
*bgpnode
, *nbgpnode
;
3626 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3627 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3628 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3634 *listen_range
= range
;
3635 return (group
&& range
) ? group
: NULL
;
3638 struct peer
*peer_lookup_dynamic_neighbor(struct bgp
*bgp
, union sockunion
*su
)
3640 struct peer_group
*group
;
3643 struct prefix prefix
;
3644 struct prefix
*listen_range
;
3646 char buf
[PREFIX2STR_BUFFER
];
3647 char buf1
[PREFIX2STR_BUFFER
];
3649 sockunion2hostprefix(su
, &prefix
);
3651 /* See if incoming connection matches a configured listen range. */
3652 group
= peer_group_lookup_dynamic_neighbor(bgp
, &prefix
, &listen_range
);
3663 prefix2str(&prefix
, buf
, sizeof(buf
));
3664 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3666 if (bgp_debug_neighbor_events(NULL
))
3668 "Dynamic Neighbor %s matches group %s listen range %s",
3669 buf
, group
->name
, buf1
);
3671 /* Are we within the listen limit? */
3672 dncount
= gbgp
->dynamic_neighbors_count
;
3674 if (dncount
>= gbgp
->dynamic_neighbors_limit
) {
3675 if (bgp_debug_neighbor_events(NULL
))
3676 zlog_debug("Dynamic Neighbor %s rejected - at limit %d",
3677 inet_sutop(su
, buf
),
3678 gbgp
->dynamic_neighbors_limit
);
3682 /* Ensure group is not disabled. */
3683 if (CHECK_FLAG(group
->conf
->flags
, PEER_FLAG_SHUTDOWN
)) {
3684 if (bgp_debug_neighbor_events(NULL
))
3686 "Dynamic Neighbor %s rejected - group %s disabled",
3691 /* Check that at least one AF is activated for the group. */
3692 if (!peer_group_af_configured(group
)) {
3693 if (bgp_debug_neighbor_events(NULL
))
3695 "Dynamic Neighbor %s rejected - no AF activated for group %s",
3700 /* Create dynamic peer and bind to associated group. */
3701 peer
= peer_create_bind_dynamic_neighbor(gbgp
, su
, group
);
3704 gbgp
->dynamic_neighbors_count
= ++dncount
;
3706 if (bgp_debug_neighbor_events(peer
))
3707 zlog_debug("%s Dynamic Neighbor added, group %s count %d",
3708 peer
->host
, group
->name
, dncount
);
3713 static void peer_drop_dynamic_neighbor(struct peer
*peer
)
3716 if (peer
->group
->bgp
) {
3717 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3719 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3721 if (bgp_debug_neighbor_events(peer
))
3722 zlog_debug("%s dropped from group %s, count %d", peer
->host
,
3723 peer
->group
->name
, dncount
);
3726 /* If peer is configured at least one address family return 1. */
3727 int peer_active(struct peer
*peer
)
3729 if (BGP_PEER_SU_UNSPEC(peer
))
3731 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
] || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3732 || peer
->afc
[AFI_IP
][SAFI_LABELED_UNICAST
]
3733 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
] || peer
->afc
[AFI_IP
][SAFI_ENCAP
]
3734 || peer
->afc
[AFI_IP
][SAFI_FLOWSPEC
]
3735 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3736 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
]
3737 || peer
->afc
[AFI_IP6
][SAFI_LABELED_UNICAST
]
3738 || peer
->afc
[AFI_IP6
][SAFI_MPLS_VPN
]
3739 || peer
->afc
[AFI_IP6
][SAFI_ENCAP
]
3740 || peer
->afc
[AFI_IP6
][SAFI_FLOWSPEC
]
3741 || peer
->afc
[AFI_L2VPN
][SAFI_EVPN
])
3746 /* If peer is negotiated at least one address family return 1. */
3747 int peer_active_nego(struct peer
*peer
)
3749 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3750 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3751 || peer
->afc_nego
[AFI_IP
][SAFI_LABELED_UNICAST
]
3752 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3753 || peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
3754 || peer
->afc_nego
[AFI_IP
][SAFI_FLOWSPEC
]
3755 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3756 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
3757 || peer
->afc_nego
[AFI_IP6
][SAFI_LABELED_UNICAST
]
3758 || peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
3759 || peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
3760 || peer
->afc_nego
[AFI_IP6
][SAFI_FLOWSPEC
]
3761 || peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
])
3766 /* peer_flag_change_type. */
3767 enum peer_change_type
{
3770 peer_change_reset_in
,
3771 peer_change_reset_out
,
3774 static void peer_change_action(struct peer
*peer
, afi_t afi
, safi_t safi
,
3775 enum peer_change_type type
)
3777 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
3780 if (peer
->status
!= Established
)
3783 if (type
== peer_change_reset
) {
3784 /* If we're resetting session, we've to delete both peer struct
3786 if ((peer
->doppelganger
)
3787 && (peer
->doppelganger
->status
!= Deleted
)
3788 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3789 PEER_FLAG_CONFIG_NODE
)))
3790 peer_delete(peer
->doppelganger
);
3792 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3793 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3794 } else if (type
== peer_change_reset_in
) {
3795 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3796 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3797 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0);
3799 if ((peer
->doppelganger
)
3800 && (peer
->doppelganger
->status
!= Deleted
)
3801 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3802 PEER_FLAG_CONFIG_NODE
)))
3803 peer_delete(peer
->doppelganger
);
3805 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3806 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3808 } else if (type
== peer_change_reset_out
) {
3809 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3810 bgp_announce_route(peer
, afi
, safi
);
3814 struct peer_flag_action
{
3818 /* This flag can be set for peer-group member. */
3819 uint8_t not_for_member
;
3821 /* Action when the flag is changed. */
3822 enum peer_change_type type
;
3824 /* Peer down cause */
3828 static const struct peer_flag_action peer_flag_action_list
[] = {
3829 {PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3830 {PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3831 {PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3832 {PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3833 {PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3834 {PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3835 {PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3836 {PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3837 {PEER_FLAG_ENFORCE_FIRST_AS
, 0, peer_change_reset_in
},
3838 {PEER_FLAG_ROUTEADV
, 0, peer_change_none
},
3839 {PEER_FLAG_TIMER
, 0, peer_change_none
},
3840 {PEER_FLAG_TIMER_CONNECT
, 0, peer_change_none
},
3841 {PEER_FLAG_PASSWORD
, 0, peer_change_none
},
3842 {PEER_FLAG_LOCAL_AS
, 0, peer_change_none
},
3843 {PEER_FLAG_LOCAL_AS_NO_PREPEND
, 0, peer_change_none
},
3844 {PEER_FLAG_LOCAL_AS_REPLACE_AS
, 0, peer_change_none
},
3845 {PEER_FLAG_UPDATE_SOURCE
, 0, peer_change_none
},
3848 static const struct peer_flag_action peer_af_flag_action_list
[] = {
3849 {PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3850 {PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3851 {PEER_FLAG_SEND_LARGE_COMMUNITY
, 1, peer_change_reset_out
},
3852 {PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3853 {PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3854 {PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3855 {PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3856 {PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3857 {PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3858 {PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3859 {PEER_FLAG_DEFAULT_ORIGINATE
, 0, peer_change_none
},
3860 {PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3861 {PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3862 {PEER_FLAG_ALLOWAS_IN_ORIGIN
, 0, peer_change_reset_in
},
3863 {PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3864 {PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3865 {PEER_FLAG_MAX_PREFIX
, 0, peer_change_none
},
3866 {PEER_FLAG_MAX_PREFIX_WARNING
, 0, peer_change_none
},
3867 {PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3868 {PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3869 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3870 {PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
, 1, peer_change_reset_out
},
3871 {PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3872 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
, 1, peer_change_reset_out
},
3873 {PEER_FLAG_ADDPATH_TX_ALL_PATHS
, 1, peer_change_reset
},
3874 {PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
, 1, peer_change_reset
},
3875 {PEER_FLAG_WEIGHT
, 0, peer_change_reset_in
},
3878 /* Proper action set. */
3879 static int peer_flag_action_set(const struct peer_flag_action
*action_list
,
3880 int size
, struct peer_flag_action
*action
,
3887 const struct peer_flag_action
*match
= NULL
;
3889 /* Check peer's frag action. */
3890 for (i
= 0; i
< size
; i
++) {
3891 match
= &action_list
[i
];
3893 if (match
->flag
== 0)
3896 if (match
->flag
& flag
) {
3899 if (match
->type
== peer_change_reset_in
)
3901 if (match
->type
== peer_change_reset_out
)
3903 if (match
->type
== peer_change_reset
) {
3907 if (match
->not_for_member
)
3908 action
->not_for_member
= 1;
3912 /* Set peer clear type. */
3913 if (reset_in
&& reset_out
)
3914 action
->type
= peer_change_reset
;
3916 action
->type
= peer_change_reset_in
;
3918 action
->type
= peer_change_reset_out
;
3920 action
->type
= peer_change_none
;
3925 static void peer_flag_modify_action(struct peer
*peer
, uint32_t flag
)
3927 if (flag
== PEER_FLAG_SHUTDOWN
) {
3928 if (CHECK_FLAG(peer
->flags
, flag
)) {
3929 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3930 peer_nsf_stop(peer
);
3932 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3933 if (peer
->t_pmax_restart
) {
3934 BGP_TIMER_OFF(peer
->t_pmax_restart
);
3935 if (bgp_debug_neighbor_events(peer
))
3937 "%s Maximum-prefix restart timer canceled",
3941 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3942 peer_nsf_stop(peer
);
3944 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
3945 char *msg
= peer
->tx_shutdown_message
;
3948 if (!msg
&& peer_group_active(peer
))
3949 msg
= peer
->group
->conf
3950 ->tx_shutdown_message
;
3951 msglen
= msg
? strlen(msg
) : 0;
3956 uint8_t msgbuf
[129];
3959 memcpy(msgbuf
+ 1, msg
, msglen
);
3961 bgp_notify_send_with_data(
3962 peer
, BGP_NOTIFY_CEASE
,
3963 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
,
3964 msgbuf
, msglen
+ 1);
3967 peer
, BGP_NOTIFY_CEASE
,
3968 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3970 bgp_session_reset(peer
);
3972 peer
->v_start
= BGP_INIT_START_TIMER
;
3973 BGP_EVENT_ADD(peer
, BGP_Stop
);
3975 } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
3976 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
3977 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3978 else if (flag
== PEER_FLAG_PASSIVE
)
3979 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
3980 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
3981 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
3983 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3984 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3986 bgp_session_reset(peer
);
3989 /* Change specified peer flag. */
3990 static int peer_flag_modify(struct peer
*peer
, uint32_t flag
, int set
)
3994 bool invert
, member_invert
;
3995 struct peer
*member
;
3996 struct listnode
*node
, *nnode
;
3997 struct peer_flag_action action
;
3999 memset(&action
, 0, sizeof(struct peer_flag_action
));
4000 size
= sizeof peer_flag_action_list
/ sizeof(struct peer_flag_action
);
4002 invert
= CHECK_FLAG(peer
->flags_invert
, flag
);
4003 found
= peer_flag_action_set(peer_flag_action_list
, size
, &action
,
4006 /* Abort if no flag action exists. */
4008 return BGP_ERR_INVALID_FLAG
;
4010 /* Check for flag conflict: STRICT_CAP_MATCH && OVERRIDE_CAPABILITY */
4011 if (set
&& CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
4012 && CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4013 return BGP_ERR_PEER_FLAG_CONFLICT
;
4015 /* Handle flag updates where desired state matches current state. */
4016 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4017 if (set
&& CHECK_FLAG(peer
->flags
, flag
)) {
4018 COND_FLAG(peer
->flags_override
, flag
, !invert
);
4022 if (!set
&& !CHECK_FLAG(peer
->flags
, flag
)) {
4023 COND_FLAG(peer
->flags_override
, flag
, invert
);
4028 /* Inherit from peer-group or set/unset flags accordingly. */
4029 if (peer_group_active(peer
) && set
== invert
)
4030 peer_flag_inherit(peer
, flag
);
4032 COND_FLAG(peer
->flags
, flag
, set
);
4034 /* Check if handling a regular peer. */
4035 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4036 /* Update flag override state accordingly. */
4037 COND_FLAG(peer
->flags_override
, flag
, set
!= invert
);
4039 /* Execute flag action on peer. */
4040 if (action
.type
== peer_change_reset
)
4041 peer_flag_modify_action(peer
, flag
);
4043 /* Skip peer-group mechanics for regular peers. */
4048 * Update peer-group members, unless they are explicitely overriding
4049 * peer-group configuration.
4051 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4052 /* Skip peers with overridden configuration. */
4053 if (CHECK_FLAG(member
->flags_override
, flag
))
4056 /* Check if only member without group is inverted. */
4058 CHECK_FLAG(member
->flags_invert
, flag
) && !invert
;
4060 /* Skip peers with equivalent configuration. */
4061 if (set
!= member_invert
&& CHECK_FLAG(member
->flags
, flag
))
4064 if (set
== member_invert
&& !CHECK_FLAG(member
->flags
, flag
))
4067 /* Update flag on peer-group member. */
4068 COND_FLAG(member
->flags
, flag
, set
!= member_invert
);
4070 /* Execute flag action on peer-group member. */
4071 if (action
.type
== peer_change_reset
)
4072 peer_flag_modify_action(member
, flag
);
4078 int peer_flag_set(struct peer
*peer
, uint32_t flag
)
4080 return peer_flag_modify(peer
, flag
, 1);
4083 int peer_flag_unset(struct peer
*peer
, uint32_t flag
)
4085 return peer_flag_modify(peer
, flag
, 0);
4088 static int peer_af_flag_modify(struct peer
*peer
, afi_t afi
, safi_t safi
,
4089 uint32_t flag
, bool set
)
4093 int addpath_tx_used
;
4094 bool invert
, member_invert
;
4096 struct peer
*member
;
4097 struct listnode
*node
, *nnode
;
4098 struct peer_flag_action action
;
4100 memset(&action
, 0, sizeof(struct peer_flag_action
));
4101 size
= sizeof peer_af_flag_action_list
4102 / sizeof(struct peer_flag_action
);
4104 invert
= CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
);
4105 found
= peer_flag_action_set(peer_af_flag_action_list
, size
, &action
,
4108 /* Abort if flag action exists. */
4110 return BGP_ERR_INVALID_FLAG
;
4112 /* Special check for reflector client. */
4113 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
4114 && peer_sort(peer
) != BGP_PEER_IBGP
)
4115 return BGP_ERR_NOT_INTERNAL_PEER
;
4117 /* Special check for remove-private-AS. */
4118 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
4119 && peer_sort(peer
) == BGP_PEER_IBGP
)
4120 return BGP_ERR_REMOVE_PRIVATE_AS
;
4122 /* as-override is not allowed for IBGP peers */
4123 if (flag
& PEER_FLAG_AS_OVERRIDE
&& peer_sort(peer
) == BGP_PEER_IBGP
)
4124 return BGP_ERR_AS_OVERRIDE
;
4126 /* Handle flag updates where desired state matches current state. */
4127 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4128 if (set
&& CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4129 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4134 if (!set
&& !CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4135 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4142 * For EVPN we implicitly set the NEXTHOP_UNCHANGED flag,
4143 * if we are setting/unsetting flags which conflict with this flag
4144 * handle accordingly
4146 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
4150 * if we are setting NEXTHOP_SELF, we need to unset the
4151 * NEXTHOP_UNCHANGED flag
4153 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4154 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4155 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4156 PEER_FLAG_NEXTHOP_UNCHANGED
);
4160 * if we are unsetting NEXTHOP_SELF, we need to set the
4161 * NEXTHOP_UNCHANGED flag to reset the defaults for EVPN
4163 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4164 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4165 SET_FLAG(peer
->af_flags
[afi
][safi
],
4166 PEER_FLAG_NEXTHOP_UNCHANGED
);
4170 /* Inherit from peer-group or set/unset flags accordingly. */
4171 if (peer_group_active(peer
) && set
== invert
)
4172 peer_af_flag_inherit(peer
, afi
, safi
, flag
);
4174 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, set
);
4176 /* Execute action when peer is established. */
4177 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
4178 && peer
->status
== Established
) {
4179 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4180 bgp_clear_adj_in(peer
, afi
, safi
);
4182 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4183 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
4184 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
4185 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
4186 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
4187 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4188 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
4189 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4191 peer_change_action(peer
, afi
, safi
, action
.type
);
4195 /* Check if handling a regular peer. */
4196 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4197 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4201 * Update peer-group members, unless they are explicitely
4202 * overriding peer-group configuration.
4204 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
,
4206 /* Skip peers with overridden configuration. */
4207 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4211 /* Check if only member without group is inverted. */
4213 CHECK_FLAG(member
->af_flags_invert
[afi
][safi
],
4217 /* Skip peers with equivalent configuration. */
4218 if (set
!= member_invert
4219 && CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4222 if (set
== member_invert
4223 && !CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4226 /* Update flag on peer-group member. */
4227 COND_FLAG(member
->af_flags
[afi
][safi
], flag
,
4228 set
!= member_invert
);
4230 /* Execute flag action on peer-group member. */
4231 if (member
->status
== Established
) {
4232 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4233 bgp_clear_adj_in(member
, afi
, safi
);
4235 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4236 member
->last_reset
=
4237 PEER_DOWN_RR_CLIENT_CHANGE
;
4239 == PEER_FLAG_RSERVER_CLIENT
)
4240 member
->last_reset
=
4241 PEER_DOWN_RS_CLIENT_CHANGE
;
4243 == PEER_FLAG_ORF_PREFIX_SM
)
4244 member
->last_reset
=
4245 PEER_DOWN_CAPABILITY_CHANGE
;
4247 == PEER_FLAG_ORF_PREFIX_RM
)
4248 member
->last_reset
=
4249 PEER_DOWN_CAPABILITY_CHANGE
;
4251 peer_change_action(member
, afi
, safi
,
4258 /* Track if addpath TX is in use */
4259 if (flag
& (PEER_FLAG_ADDPATH_TX_ALL_PATHS
4260 | PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
)) {
4262 addpath_tx_used
= 0;
4265 addpath_tx_used
= 1;
4267 if (flag
& PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
) {
4268 if (!bgp_flag_check(
4269 bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
4271 "%s: enabling bgp deterministic-med, this is required"
4272 " for addpath-tx-bestpath-per-AS",
4276 BGP_FLAG_DETERMINISTIC_MED
);
4277 bgp_recalculate_all_bestpaths(bgp
);
4281 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
,
4283 if (CHECK_FLAG(member
->af_flags
[afi
][safi
],
4284 PEER_FLAG_ADDPATH_TX_ALL_PATHS
)
4286 member
->af_flags
[afi
][safi
],
4287 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
)) {
4288 addpath_tx_used
= 1;
4294 bgp
->addpath_tx_used
[afi
][safi
] = addpath_tx_used
;
4300 int peer_af_flag_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
4302 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 1);
4305 int peer_af_flag_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
4307 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 0);
4311 int peer_tx_shutdown_message_set(struct peer
*peer
, const char *msg
)
4313 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4314 peer
->tx_shutdown_message
=
4315 msg
? XSTRDUP(MTYPE_PEER_TX_SHUTDOWN_MSG
, msg
) : NULL
;
4319 int peer_tx_shutdown_message_unset(struct peer
*peer
)
4321 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4326 /* EBGP multihop configuration. */
4327 int peer_ebgp_multihop_set(struct peer
*peer
, int ttl
)
4329 struct peer_group
*group
;
4330 struct listnode
*node
, *nnode
;
4333 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
4336 /* see comment in peer_ttl_security_hops_set() */
4337 if (ttl
!= MAXTTL
) {
4338 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4339 group
= peer
->group
;
4340 if (group
->conf
->gtsm_hops
!= 0)
4341 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4343 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
4345 if (peer1
->sort
== BGP_PEER_IBGP
)
4348 if (peer1
->gtsm_hops
!= 0)
4349 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4352 if (peer
->gtsm_hops
!= 0)
4353 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4359 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4360 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
) {
4361 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4362 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4363 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4365 bgp_session_reset(peer
);
4368 group
= peer
->group
;
4369 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4370 if (peer
->sort
== BGP_PEER_IBGP
)
4373 peer
->ttl
= group
->conf
->ttl
;
4375 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4376 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4377 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4379 bgp_session_reset(peer
);
4385 int peer_ebgp_multihop_unset(struct peer
*peer
)
4387 struct peer_group
*group
;
4388 struct listnode
*node
, *nnode
;
4390 if (peer
->sort
== BGP_PEER_IBGP
)
4393 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
4394 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4396 if (peer_group_active(peer
))
4397 peer
->ttl
= peer
->group
->conf
->ttl
;
4401 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4402 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4403 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4404 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4406 bgp_session_reset(peer
);
4408 group
= peer
->group
;
4409 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4410 if (peer
->sort
== BGP_PEER_IBGP
)
4415 if (peer
->fd
>= 0) {
4416 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4418 peer
, BGP_NOTIFY_CEASE
,
4419 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4421 bgp_session_reset(peer
);
4428 /* Neighbor description. */
4429 int peer_description_set(struct peer
*peer
, const char *desc
)
4432 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
4434 peer
->desc
= XSTRDUP(MTYPE_PEER_DESC
, desc
);
4439 int peer_description_unset(struct peer
*peer
)
4442 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
4449 /* Neighbor update-source. */
4450 int peer_update_source_if_set(struct peer
*peer
, const char *ifname
)
4452 struct peer
*member
;
4453 struct listnode
*node
, *nnode
;
4455 /* Set flag and configuration on peer. */
4456 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
4457 if (peer
->update_if
) {
4458 if (strcmp(peer
->update_if
, ifname
) == 0)
4460 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4462 peer
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
4463 sockunion_free(peer
->update_source
);
4464 peer
->update_source
= NULL
;
4466 /* Check if handling a regular peer. */
4467 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4468 /* Send notification or reset peer depending on state. */
4469 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4470 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4471 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4472 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4474 bgp_session_reset(peer
);
4476 /* Skip peer-group mechanics for regular peers. */
4481 * Set flag and configuration on all peer-group members, unless they are
4482 * explicitely overriding peer-group configuration.
4484 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4485 /* Skip peers with overridden configuration. */
4486 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4489 /* Skip peers with the same configuration. */
4490 if (member
->update_if
) {
4491 if (strcmp(member
->update_if
, ifname
) == 0)
4493 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4496 /* Set flag and configuration on peer-group member. */
4497 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4498 member
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
4499 sockunion_free(member
->update_source
);
4500 member
->update_source
= NULL
;
4502 /* Send notification or reset peer depending on state. */
4503 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4504 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4505 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4506 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4508 bgp_session_reset(member
);
4514 int peer_update_source_addr_set(struct peer
*peer
, const union sockunion
*su
)
4516 struct peer
*member
;
4517 struct listnode
*node
, *nnode
;
4519 /* Set flag and configuration on peer. */
4520 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
4521 if (peer
->update_source
) {
4522 if (sockunion_cmp(peer
->update_source
, su
) == 0)
4524 sockunion_free(peer
->update_source
);
4526 peer
->update_source
= sockunion_dup(su
);
4527 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4529 /* Check if handling a regular peer. */
4530 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4531 /* Send notification or reset peer depending on state. */
4532 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4533 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4534 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4535 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4537 bgp_session_reset(peer
);
4539 /* Skip peer-group mechanics for regular peers. */
4544 * Set flag and configuration on all peer-group members, unless they are
4545 * explicitely overriding peer-group configuration.
4547 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4548 /* Skip peers with overridden configuration. */
4549 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4552 /* Skip peers with the same configuration. */
4553 if (member
->update_source
) {
4554 if (sockunion_cmp(member
->update_source
, su
) == 0)
4556 sockunion_free(member
->update_source
);
4559 /* Set flag and configuration on peer-group member. */
4560 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4561 member
->update_source
= sockunion_dup(su
);
4562 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4564 /* Send notification or reset peer depending on state. */
4565 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4566 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4567 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4568 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4570 bgp_session_reset(member
);
4576 int peer_update_source_unset(struct peer
*peer
)
4578 struct peer
*member
;
4579 struct listnode
*node
, *nnode
;
4581 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_UPDATE_SOURCE
))
4584 /* Inherit configuration from peer-group if peer is member. */
4585 if (peer_group_active(peer
)) {
4586 peer_flag_inherit(peer
, PEER_FLAG_UPDATE_SOURCE
);
4587 PEER_SU_ATTR_INHERIT(peer
, peer
->group
, update_source
);
4588 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, update_if
,
4589 MTYPE_PEER_UPDATE_SOURCE
);
4591 /* Otherwise remove flag and configuration from peer. */
4592 peer_flag_unset(peer
, PEER_FLAG_UPDATE_SOURCE
);
4593 sockunion_free(peer
->update_source
);
4594 peer
->update_source
= NULL
;
4595 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4598 /* Check if handling a regular peer. */
4599 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4600 /* Send notification or reset peer depending on state. */
4601 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4602 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4603 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4604 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4606 bgp_session_reset(peer
);
4608 /* Skip peer-group mechanics for regular peers. */
4613 * Set flag and configuration on all peer-group members, unless they are
4614 * explicitely overriding peer-group configuration.
4616 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4617 /* Skip peers with overridden configuration. */
4618 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4621 /* Skip peers with the same configuration. */
4622 if (!CHECK_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
)
4623 && !member
->update_source
&& !member
->update_if
)
4626 /* Remove flag and configuration on peer-group member. */
4627 UNSET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4628 sockunion_free(member
->update_source
);
4629 member
->update_source
= NULL
;
4630 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4632 /* Send notification or reset peer depending on state. */
4633 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4634 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4635 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4636 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4638 bgp_session_reset(member
);
4644 int peer_default_originate_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
4647 struct peer
*member
;
4648 struct listnode
*node
, *nnode
;
4650 /* Set flag and configuration on peer. */
4651 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
);
4653 if (!peer
->default_rmap
[afi
][safi
].name
4654 || strcmp(rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0) {
4655 if (peer
->default_rmap
[afi
][safi
].name
)
4656 XFREE(MTYPE_ROUTE_MAP_NAME
,
4657 peer
->default_rmap
[afi
][safi
].name
);
4659 peer
->default_rmap
[afi
][safi
].name
=
4660 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4661 peer
->default_rmap
[afi
][safi
].map
=
4662 route_map_lookup_by_name(rmap
);
4665 if (peer
->default_rmap
[afi
][safi
].name
)
4666 XFREE(MTYPE_ROUTE_MAP_NAME
,
4667 peer
->default_rmap
[afi
][safi
].name
);
4669 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4670 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4673 /* Check if handling a regular peer. */
4674 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4675 /* Update peer route announcements. */
4676 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4677 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4678 bgp_default_originate(peer
, afi
, safi
, 0);
4679 bgp_announce_route(peer
, afi
, safi
);
4682 /* Skip peer-group mechanics for regular peers. */
4687 * Set flag and configuration on all peer-group members, unless they are
4688 * explicitely overriding peer-group configuration.
4690 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4691 /* Skip peers with overridden configuration. */
4692 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4693 PEER_FLAG_DEFAULT_ORIGINATE
))
4696 /* Set flag and configuration on peer-group member. */
4697 SET_FLAG(member
->af_flags
[afi
][safi
],
4698 PEER_FLAG_DEFAULT_ORIGINATE
);
4700 if (member
->default_rmap
[afi
][safi
].name
)
4701 XFREE(MTYPE_ROUTE_MAP_NAME
,
4702 member
->default_rmap
[afi
][safi
].name
);
4704 member
->default_rmap
[afi
][safi
].name
=
4705 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4706 member
->default_rmap
[afi
][safi
].map
=
4707 route_map_lookup_by_name(rmap
);
4710 /* Update peer route announcements. */
4711 if (member
->status
== Established
4712 && member
->afc_nego
[afi
][safi
]) {
4713 update_group_adjust_peer(
4714 peer_af_find(member
, afi
, safi
));
4715 bgp_default_originate(member
, afi
, safi
, 0);
4716 bgp_announce_route(member
, afi
, safi
);
4723 int peer_default_originate_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
4725 struct peer
*member
;
4726 struct listnode
*node
, *nnode
;
4728 /* Inherit configuration from peer-group if peer is member. */
4729 if (peer_group_active(peer
)) {
4730 peer_af_flag_inherit(peer
, afi
, safi
,
4731 PEER_FLAG_DEFAULT_ORIGINATE
);
4732 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
4733 default_rmap
[afi
][safi
].name
,
4734 MTYPE_ROUTE_MAP_NAME
);
4735 PEER_ATTR_INHERIT(peer
, peer
->group
,
4736 default_rmap
[afi
][safi
].map
);
4738 /* Otherwise remove flag and configuration from peer. */
4739 peer_af_flag_unset(peer
, afi
, safi
,
4740 PEER_FLAG_DEFAULT_ORIGINATE
);
4741 if (peer
->default_rmap
[afi
][safi
].name
)
4742 XFREE(MTYPE_ROUTE_MAP_NAME
,
4743 peer
->default_rmap
[afi
][safi
].name
);
4744 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4745 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4748 /* Check if handling a regular peer. */
4749 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4750 /* Update peer route announcements. */
4751 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4752 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4753 bgp_default_originate(peer
, afi
, safi
, 1);
4754 bgp_announce_route(peer
, afi
, safi
);
4757 /* Skip peer-group mechanics for regular peers. */
4762 * Remove flag and configuration from all peer-group members, unless
4763 * they are explicitely overriding peer-group configuration.
4765 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4766 /* Skip peers with overridden configuration. */
4767 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4768 PEER_FLAG_DEFAULT_ORIGINATE
))
4771 /* Remove flag and configuration on peer-group member. */
4772 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4773 PEER_FLAG_DEFAULT_ORIGINATE
);
4774 if (peer
->default_rmap
[afi
][safi
].name
)
4775 XFREE(MTYPE_ROUTE_MAP_NAME
,
4776 peer
->default_rmap
[afi
][safi
].name
);
4777 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4778 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4780 /* Update peer route announcements. */
4781 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4782 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4783 bgp_default_originate(peer
, afi
, safi
, 1);
4784 bgp_announce_route(peer
, afi
, safi
);
4791 int peer_port_set(struct peer
*peer
, uint16_t port
)
4797 int peer_port_unset(struct peer
*peer
)
4799 peer
->port
= BGP_PORT_DEFAULT
;
4804 * Helper function that is called after the name of the policy
4805 * being used by a peer has changed (AF specific). Automatically
4806 * initiates inbound or outbound processing as needed.
4808 static void peer_on_policy_change(struct peer
*peer
, afi_t afi
, safi_t safi
,
4812 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4813 if (peer
->status
== Established
)
4814 bgp_announce_route(peer
, afi
, safi
);
4816 if (peer
->status
!= Established
)
4819 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
4820 PEER_FLAG_SOFT_RECONFIG
))
4821 bgp_soft_reconfig_in(peer
, afi
, safi
);
4822 else if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4823 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4824 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0);
4829 /* neighbor weight. */
4830 int peer_weight_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint16_t weight
)
4832 struct peer
*member
;
4833 struct listnode
*node
, *nnode
;
4835 /* Set flag and configuration on peer. */
4836 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4837 if (peer
->weight
[afi
][safi
] != weight
) {
4838 peer
->weight
[afi
][safi
] = weight
;
4839 peer_on_policy_change(peer
, afi
, safi
, 0);
4842 /* Skip peer-group mechanics for regular peers. */
4843 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4847 * Set flag and configuration on all peer-group members, unless they are
4848 * explicitely overriding peer-group configuration.
4850 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4851 /* Skip peers with overridden configuration. */
4852 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4856 /* Set flag and configuration on peer-group member. */
4857 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
4858 if (member
->weight
[afi
][safi
] != weight
) {
4859 member
->weight
[afi
][safi
] = weight
;
4860 peer_on_policy_change(member
, afi
, safi
, 0);
4867 int peer_weight_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
4869 struct peer
*member
;
4870 struct listnode
*node
, *nnode
;
4872 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
4875 /* Inherit configuration from peer-group if peer is member. */
4876 if (peer_group_active(peer
)) {
4877 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4878 PEER_ATTR_INHERIT(peer
, peer
->group
, weight
[afi
][safi
]);
4880 peer_on_policy_change(peer
, afi
, safi
, 0);
4884 /* Remove flag and configuration from peer. */
4885 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4886 peer
->weight
[afi
][safi
] = 0;
4887 peer_on_policy_change(peer
, afi
, safi
, 0);
4889 /* Skip peer-group mechanics for regular peers. */
4890 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4894 * Remove flag and configuration from all peer-group members, unless
4895 * they are explicitely overriding peer-group configuration.
4897 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4898 /* Skip peers with overridden configuration. */
4899 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4903 /* Skip peers where flag is already disabled. */
4904 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
4907 /* Remove flag and configuration on peer-group member. */
4908 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
4909 member
->weight
[afi
][safi
] = 0;
4910 peer_on_policy_change(member
, afi
, safi
, 0);
4916 int peer_timers_set(struct peer
*peer
, uint32_t keepalive
, uint32_t holdtime
)
4918 struct peer
*member
;
4919 struct listnode
*node
, *nnode
;
4921 if (keepalive
> 65535)
4922 return BGP_ERR_INVALID_VALUE
;
4924 if (holdtime
> 65535)
4925 return BGP_ERR_INVALID_VALUE
;
4927 if (holdtime
< 3 && holdtime
!= 0)
4928 return BGP_ERR_INVALID_VALUE
;
4930 /* Set flag and configuration on peer. */
4931 peer_flag_set(peer
, PEER_FLAG_TIMER
);
4932 peer
->holdtime
= holdtime
;
4933 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
4935 /* Skip peer-group mechanics for regular peers. */
4936 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4940 * Set flag and configuration on all peer-group members, unless they are
4941 * explicitely overriding peer-group configuration.
4943 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4944 /* Skip peers with overridden configuration. */
4945 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
4948 /* Set flag and configuration on peer-group member. */
4949 SET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
4950 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
4951 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
4957 int peer_timers_unset(struct peer
*peer
)
4959 struct peer
*member
;
4960 struct listnode
*node
, *nnode
;
4962 /* Inherit configuration from peer-group if peer is member. */
4963 if (peer_group_active(peer
)) {
4964 peer_flag_inherit(peer
, PEER_FLAG_TIMER
);
4965 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
4966 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
4968 /* Otherwise remove flag and configuration from peer. */
4969 peer_flag_unset(peer
, PEER_FLAG_TIMER
);
4971 peer
->keepalive
= 0;
4974 /* Skip peer-group mechanics for regular peers. */
4975 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4979 * Remove flag and configuration from all peer-group members, unless
4980 * they are explicitely overriding peer-group configuration.
4982 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4983 /* Skip peers with overridden configuration. */
4984 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
4987 /* Remove flag and configuration on peer-group member. */
4988 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
4989 member
->holdtime
= 0;
4990 member
->keepalive
= 0;
4996 int peer_timers_connect_set(struct peer
*peer
, uint32_t connect
)
4998 struct peer
*member
;
4999 struct listnode
*node
, *nnode
;
5001 if (connect
> 65535)
5002 return BGP_ERR_INVALID_VALUE
;
5004 /* Set flag and configuration on peer. */
5005 peer_flag_set(peer
, PEER_FLAG_TIMER_CONNECT
);
5006 peer
->connect
= connect
;
5007 peer
->v_connect
= connect
;
5009 /* Skip peer-group mechanics for regular peers. */
5010 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5014 * Set flag and configuration on all peer-group members, unless they are
5015 * explicitely overriding peer-group configuration.
5017 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5018 /* Skip peers with overridden configuration. */
5019 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5022 /* Set flag and configuration on peer-group member. */
5023 SET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5024 member
->connect
= connect
;
5025 member
->v_connect
= connect
;
5031 int peer_timers_connect_unset(struct peer
*peer
)
5033 struct peer
*member
;
5034 struct listnode
*node
, *nnode
;
5036 /* Inherit configuration from peer-group if peer is member. */
5037 if (peer_group_active(peer
)) {
5038 peer_flag_inherit(peer
, PEER_FLAG_TIMER_CONNECT
);
5039 PEER_ATTR_INHERIT(peer
, peer
->group
, connect
);
5041 /* Otherwise remove flag and configuration from peer. */
5042 peer_flag_unset(peer
, PEER_FLAG_TIMER_CONNECT
);
5046 /* Set timer with fallback to default value. */
5048 peer
->v_connect
= peer
->connect
;
5050 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
5052 /* Skip peer-group mechanics for regular peers. */
5053 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5057 * Remove flag and configuration from all peer-group members, unless
5058 * they are explicitely overriding peer-group configuration.
5060 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5061 /* Skip peers with overridden configuration. */
5062 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5065 /* Remove flag and configuration on peer-group member. */
5066 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5067 member
->connect
= 0;
5068 member
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
5074 int peer_advertise_interval_set(struct peer
*peer
, uint32_t routeadv
)
5076 struct peer
*member
;
5077 struct listnode
*node
, *nnode
;
5080 return BGP_ERR_INVALID_VALUE
;
5082 /* Set flag and configuration on peer. */
5083 peer_flag_set(peer
, PEER_FLAG_ROUTEADV
);
5084 peer
->routeadv
= routeadv
;
5085 peer
->v_routeadv
= routeadv
;
5087 /* Check if handling a regular peer. */
5088 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5089 /* Update peer route announcements. */
5090 update_group_adjust_peer_afs(peer
);
5091 if (peer
->status
== Established
)
5092 bgp_announce_route_all(peer
);
5094 /* Skip peer-group mechanics for regular peers. */
5099 * Set flag and configuration on all peer-group members, unless they are
5100 * explicitely overriding peer-group configuration.
5102 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5103 /* Skip peers with overridden configuration. */
5104 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5107 /* Set flag and configuration on peer-group member. */
5108 SET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5109 member
->routeadv
= routeadv
;
5110 member
->v_routeadv
= routeadv
;
5112 /* Update peer route announcements. */
5113 update_group_adjust_peer_afs(member
);
5114 if (member
->status
== Established
)
5115 bgp_announce_route_all(member
);
5121 int peer_advertise_interval_unset(struct peer
*peer
)
5123 struct peer
*member
;
5124 struct listnode
*node
, *nnode
;
5126 /* Inherit configuration from peer-group if peer is member. */
5127 if (peer_group_active(peer
)) {
5128 peer_flag_inherit(peer
, PEER_FLAG_ROUTEADV
);
5129 PEER_ATTR_INHERIT(peer
, peer
->group
, routeadv
);
5131 /* Otherwise remove flag and configuration from peer. */
5132 peer_flag_unset(peer
, PEER_FLAG_ROUTEADV
);
5136 /* Set timer with fallback to default value. */
5138 peer
->v_routeadv
= peer
->routeadv
;
5140 peer
->v_routeadv
= (peer
->sort
== BGP_PEER_IBGP
)
5141 ? BGP_DEFAULT_IBGP_ROUTEADV
5142 : BGP_DEFAULT_EBGP_ROUTEADV
;
5144 /* Check if handling a regular peer. */
5145 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5146 /* Update peer route announcements. */
5147 update_group_adjust_peer_afs(peer
);
5148 if (peer
->status
== Established
)
5149 bgp_announce_route_all(peer
);
5151 /* Skip peer-group mechanics for regular peers. */
5156 * Remove flag and configuration from all peer-group members, unless
5157 * they are explicitely overriding peer-group configuration.
5159 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5160 /* Skip peers with overridden configuration. */
5161 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5164 /* Remove flag and configuration on peer-group member. */
5165 UNSET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5166 member
->routeadv
= 0;
5167 member
->v_routeadv
= (member
->sort
== BGP_PEER_IBGP
)
5168 ? BGP_DEFAULT_IBGP_ROUTEADV
5169 : BGP_DEFAULT_EBGP_ROUTEADV
;
5171 /* Update peer route announcements. */
5172 update_group_adjust_peer_afs(member
);
5173 if (member
->status
== Established
)
5174 bgp_announce_route_all(member
);
5180 /* neighbor interface */
5181 void peer_interface_set(struct peer
*peer
, const char *str
)
5184 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5185 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
5188 void peer_interface_unset(struct peer
*peer
)
5191 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5192 peer
->ifname
= NULL
;
5196 int peer_allowas_in_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
5197 int allow_num
, int origin
)
5199 struct peer
*member
;
5200 struct listnode
*node
, *nnode
;
5202 if (!origin
&& (allow_num
< 1 || allow_num
> 10))
5203 return BGP_ERR_INVALID_VALUE
;
5205 /* Set flag and configuration on peer. */
5206 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5208 if (peer
->allowas_in
[afi
][safi
] != 0
5209 || !CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5210 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5211 peer_af_flag_set(peer
, afi
, safi
,
5212 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5213 peer
->allowas_in
[afi
][safi
] = 0;
5214 peer_on_policy_change(peer
, afi
, safi
, 0);
5217 if (peer
->allowas_in
[afi
][safi
] != allow_num
5218 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5219 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5221 peer_af_flag_unset(peer
, afi
, safi
,
5222 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5223 peer
->allowas_in
[afi
][safi
] = allow_num
;
5224 peer_on_policy_change(peer
, afi
, safi
, 0);
5228 /* Skip peer-group mechanics for regular peers. */
5229 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5233 * Set flag and configuration on all peer-group members, unless
5234 * they are explicitely overriding peer-group configuration.
5236 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5237 /* Skip peers with overridden configuration. */
5238 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5239 PEER_FLAG_ALLOWAS_IN
))
5242 /* Set flag and configuration on peer-group member. */
5243 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
5245 if (member
->allowas_in
[afi
][safi
] != 0
5246 || !CHECK_FLAG(member
->af_flags
[afi
][safi
],
5247 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5248 SET_FLAG(member
->af_flags
[afi
][safi
],
5249 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5250 member
->allowas_in
[afi
][safi
] = 0;
5251 peer_on_policy_change(peer
, afi
, safi
, 0);
5254 if (member
->allowas_in
[afi
][safi
] != allow_num
5255 || CHECK_FLAG(member
->af_flags
[afi
][safi
],
5256 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5257 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5258 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5259 member
->allowas_in
[afi
][safi
] = allow_num
;
5260 peer_on_policy_change(peer
, afi
, safi
, 0);
5268 int peer_allowas_in_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
5270 struct peer
*member
;
5271 struct listnode
*node
, *nnode
;
5273 /* Skip peer if flag is already disabled. */
5274 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
5277 /* Inherit configuration from peer-group if peer is member. */
5278 if (peer_group_active(peer
)) {
5279 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5280 peer_af_flag_inherit(peer
, afi
, safi
,
5281 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5282 PEER_ATTR_INHERIT(peer
, peer
->group
, allowas_in
[afi
][safi
]);
5283 peer_on_policy_change(peer
, afi
, safi
, 0);
5288 /* Remove flag and configuration from peer. */
5289 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5290 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5291 peer
->allowas_in
[afi
][safi
] = 0;
5292 peer_on_policy_change(peer
, afi
, safi
, 0);
5294 /* Skip peer-group mechanics if handling a regular peer. */
5295 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5299 * Remove flags and configuration from all peer-group members, unless
5300 * they are explicitely overriding peer-group configuration.
5302 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5303 /* Skip peers with overridden configuration. */
5304 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5305 PEER_FLAG_ALLOWAS_IN
))
5308 /* Skip peers where flag is already disabled. */
5309 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
],
5310 PEER_FLAG_ALLOWAS_IN
))
5313 /* Remove flags and configuration on peer-group member. */
5314 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
5315 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5316 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5317 member
->allowas_in
[afi
][safi
] = 0;
5318 peer_on_policy_change(member
, afi
, safi
, 0);
5324 int peer_local_as_set(struct peer
*peer
, as_t as
, int no_prepend
,
5327 bool old_no_prepend
, old_replace_as
;
5328 struct bgp
*bgp
= peer
->bgp
;
5329 struct peer
*member
;
5330 struct listnode
*node
, *nnode
;
5332 if (peer_sort(peer
) != BGP_PEER_EBGP
5333 && peer_sort(peer
) != BGP_PEER_INTERNAL
)
5334 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
5337 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
5340 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
5342 /* Save previous flag states. */
5344 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5346 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5348 /* Set flag and configuration on peer. */
5349 peer_flag_set(peer
, PEER_FLAG_LOCAL_AS
);
5350 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
, no_prepend
);
5351 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
, replace_as
);
5353 if (peer
->change_local_as
== as
&& old_no_prepend
== no_prepend
5354 && old_replace_as
== replace_as
)
5356 peer
->change_local_as
= as
;
5358 /* Check if handling a regular peer. */
5359 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5360 /* Send notification or reset peer depending on state. */
5361 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5362 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5363 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5364 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5366 bgp_session_reset(peer
);
5368 /* Skip peer-group mechanics for regular peers. */
5373 * Set flag and configuration on all peer-group members, unless they are
5374 * explicitely overriding peer-group configuration.
5376 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5377 /* Skip peers with overridden configuration. */
5378 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
5381 /* Skip peers with the same configuration. */
5382 old_no_prepend
= CHECK_FLAG(member
->flags
,
5383 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5384 old_replace_as
= CHECK_FLAG(member
->flags
,
5385 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5386 if (member
->change_local_as
== as
5387 && CHECK_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
)
5388 && old_no_prepend
== no_prepend
5389 && old_replace_as
== replace_as
)
5392 /* Set flag and configuration on peer-group member. */
5393 SET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
5394 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
,
5396 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
,
5398 member
->change_local_as
= as
;
5400 /* Send notification or stop peer depending on state. */
5401 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5402 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5403 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5404 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5406 BGP_EVENT_ADD(member
, BGP_Stop
);
5412 int peer_local_as_unset(struct peer
*peer
)
5414 struct peer
*member
;
5415 struct listnode
*node
, *nnode
;
5417 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS
))
5420 /* Inherit configuration from peer-group if peer is member. */
5421 if (peer_group_active(peer
)) {
5422 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS
);
5423 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5424 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5425 PEER_ATTR_INHERIT(peer
, peer
->group
, change_local_as
);
5427 /* Otherwise remove flag and configuration from peer. */
5428 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
5429 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5430 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5431 peer
->change_local_as
= 0;
5434 /* Check if handling a regular peer. */
5435 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5436 /* Send notification or stop peer depending on state. */
5437 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5438 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5439 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5440 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5442 BGP_EVENT_ADD(peer
, BGP_Stop
);
5444 /* Skip peer-group mechanics for regular peers. */
5449 * Remove flag and configuration from all peer-group members, unless
5450 * they are explicitely overriding peer-group configuration.
5452 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5453 /* Skip peers with overridden configuration. */
5454 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
5457 /* Remove flag and configuration on peer-group member. */
5458 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
5459 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5460 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5461 member
->change_local_as
= 0;
5463 /* Send notification or stop peer depending on state. */
5464 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5465 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5466 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5467 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5469 bgp_session_reset(member
);
5475 /* Set password for authenticating with the peer. */
5476 int peer_password_set(struct peer
*peer
, const char *password
)
5478 struct peer
*member
;
5479 struct listnode
*node
, *nnode
;
5480 int len
= password
? strlen(password
) : 0;
5481 int ret
= BGP_SUCCESS
;
5483 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
5484 return BGP_ERR_INVALID_VALUE
;
5486 /* Set flag and configuration on peer. */
5487 peer_flag_set(peer
, PEER_FLAG_PASSWORD
);
5488 if (peer
->password
&& strcmp(peer
->password
, password
) == 0)
5490 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
5491 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
5493 /* Check if handling a regular peer. */
5494 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5495 /* Send notification or reset peer depending on state. */
5496 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5497 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5498 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5500 bgp_session_reset(peer
);
5503 * Attempt to install password on socket and skip peer-group
5506 if (BGP_PEER_SU_UNSPEC(peer
))
5508 return (bgp_md5_set(peer
) >= 0) ? BGP_SUCCESS
5509 : BGP_ERR_TCPSIG_FAILED
;
5513 * Set flag and configuration on all peer-group members, unless they are
5514 * explicitely overriding peer-group configuration.
5516 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5517 /* Skip peers with overridden configuration. */
5518 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
5521 /* Skip peers with the same password. */
5522 if (member
->password
&& strcmp(member
->password
, password
) == 0)
5525 /* Set flag and configuration on peer-group member. */
5526 SET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
5527 if (member
->password
)
5528 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
5529 member
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
5531 /* Send notification or reset peer depending on state. */
5532 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
5533 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5534 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5536 bgp_session_reset(member
);
5538 /* Attempt to install password on socket. */
5539 if (!BGP_PEER_SU_UNSPEC(member
) && bgp_md5_set(member
) < 0)
5540 ret
= BGP_ERR_TCPSIG_FAILED
;
5546 int peer_password_unset(struct peer
*peer
)
5548 struct peer
*member
;
5549 struct listnode
*node
, *nnode
;
5551 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
))
5554 /* Inherit configuration from peer-group if peer is member. */
5555 if (peer_group_active(peer
)) {
5556 peer_flag_inherit(peer
, PEER_FLAG_PASSWORD
);
5557 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, password
,
5558 MTYPE_PEER_PASSWORD
);
5560 /* Otherwise remove flag and configuration from peer. */
5561 peer_flag_unset(peer
, PEER_FLAG_PASSWORD
);
5562 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
5565 /* Check if handling a regular peer. */
5566 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5567 /* Send notification or reset peer depending on state. */
5568 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5569 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5570 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5572 bgp_session_reset(peer
);
5574 /* Attempt to uninstall password on socket. */
5575 if (!BGP_PEER_SU_UNSPEC(peer
))
5576 bgp_md5_unset(peer
);
5578 /* Skip peer-group mechanics for regular peers. */
5583 * Remove flag and configuration from all peer-group members, unless
5584 * they are explicitely overriding peer-group configuration.
5586 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5587 /* Skip peers with overridden configuration. */
5588 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
5591 /* Remove flag and configuration on peer-group member. */
5592 UNSET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
5593 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
5595 /* Send notification or reset peer depending on state. */
5596 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
5597 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5598 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5600 bgp_session_reset(member
);
5602 /* Attempt to uninstall password on socket. */
5603 if (!BGP_PEER_SU_UNSPEC(member
))
5604 bgp_md5_unset(member
);
5611 /* Set distribute list to the peer. */
5612 int peer_distribute_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5615 struct peer
*member
;
5616 struct bgp_filter
*filter
;
5617 struct listnode
*node
, *nnode
;
5619 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5620 return BGP_ERR_INVALID_VALUE
;
5622 /* Set configuration on peer. */
5623 filter
= &peer
->filter
[afi
][safi
];
5624 if (filter
->plist
[direct
].name
)
5625 return BGP_ERR_PEER_FILTER_CONFLICT
;
5626 if (filter
->dlist
[direct
].name
)
5627 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
5628 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5629 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
5631 /* Check if handling a regular peer. */
5632 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5633 /* Set override-flag and process peer route updates. */
5634 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5635 PEER_FT_DISTRIBUTE_LIST
);
5636 peer_on_policy_change(peer
, afi
, safi
,
5637 (direct
== FILTER_OUT
) ? 1 : 0);
5639 /* Skip peer-group mechanics for regular peers. */
5644 * Set configuration on all peer-group members, un less they are
5645 * explicitely overriding peer-group configuration.
5647 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5648 /* Skip peers with overridden configuration. */
5649 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5650 PEER_FT_DISTRIBUTE_LIST
))
5653 /* Set configuration on peer-group member. */
5654 filter
= &member
->filter
[afi
][safi
];
5655 if (filter
->dlist
[direct
].name
)
5656 XFREE(MTYPE_BGP_FILTER_NAME
,
5657 filter
->dlist
[direct
].name
);
5658 filter
->dlist
[direct
].name
=
5659 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5660 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
5662 /* Process peer route updates. */
5663 peer_on_policy_change(member
, afi
, safi
,
5664 (direct
== FILTER_OUT
) ? 1 : 0);
5670 int peer_distribute_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5672 struct peer
*member
;
5673 struct bgp_filter
*filter
;
5674 struct listnode
*node
, *nnode
;
5676 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5677 return BGP_ERR_INVALID_VALUE
;
5679 /* Unset override-flag unconditionally. */
5680 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5681 PEER_FT_DISTRIBUTE_LIST
);
5683 /* Inherit configuration from peer-group if peer is member. */
5684 if (peer_group_active(peer
)) {
5685 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
5686 filter
[afi
][safi
].dlist
[direct
].name
,
5687 MTYPE_BGP_FILTER_NAME
);
5688 PEER_ATTR_INHERIT(peer
, peer
->group
,
5689 filter
[afi
][safi
].dlist
[direct
].alist
);
5691 /* Otherwise remove configuration from peer. */
5692 filter
= &peer
->filter
[afi
][safi
];
5693 if (filter
->dlist
[direct
].name
)
5694 XFREE(MTYPE_BGP_FILTER_NAME
,
5695 filter
->dlist
[direct
].name
);
5696 filter
->dlist
[direct
].name
= NULL
;
5697 filter
->dlist
[direct
].alist
= NULL
;
5700 /* Check if handling a regular peer. */
5701 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5702 /* Process peer route updates. */
5703 peer_on_policy_change(peer
, afi
, safi
,
5704 (direct
== FILTER_OUT
) ? 1 : 0);
5706 /* Skip peer-group mechanics for regular peers. */
5711 * Remove configuration on all peer-group members, unless they are
5712 * explicitely overriding peer-group configuration.
5714 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5715 /* Skip peers with overridden configuration. */
5716 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5717 PEER_FT_DISTRIBUTE_LIST
))
5720 /* Remove configuration on peer-group member. */
5721 filter
= &member
->filter
[afi
][safi
];
5722 if (filter
->dlist
[direct
].name
)
5723 XFREE(MTYPE_BGP_FILTER_NAME
,
5724 filter
->dlist
[direct
].name
);
5725 filter
->dlist
[direct
].name
= NULL
;
5726 filter
->dlist
[direct
].alist
= NULL
;
5728 /* Process peer route updates. */
5729 peer_on_policy_change(member
, afi
, safi
,
5730 (direct
== FILTER_OUT
) ? 1 : 0);
5736 /* Update distribute list. */
5737 static void peer_distribute_update(struct access_list
*access
)
5742 struct listnode
*mnode
, *mnnode
;
5743 struct listnode
*node
, *nnode
;
5746 struct peer_group
*group
;
5747 struct bgp_filter
*filter
;
5749 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
5751 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
5752 access
->name
, 0, 0);
5753 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
5754 FOREACH_AFI_SAFI (afi
, safi
) {
5755 filter
= &peer
->filter
[afi
][safi
];
5757 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5759 if (filter
->dlist
[direct
].name
)
5760 filter
->dlist
[direct
]
5761 .alist
= access_list_lookup(
5763 filter
->dlist
[direct
]
5766 filter
->dlist
[direct
].alist
=
5771 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
5772 FOREACH_AFI_SAFI (afi
, safi
) {
5773 filter
= &group
->conf
->filter
[afi
][safi
];
5775 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5777 if (filter
->dlist
[direct
].name
)
5778 filter
->dlist
[direct
]
5779 .alist
= access_list_lookup(
5781 filter
->dlist
[direct
]
5784 filter
->dlist
[direct
].alist
=
5790 vnc_prefix_list_update(bgp
);
5795 /* Set prefix list to the peer. */
5796 int peer_prefix_list_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5799 struct peer
*member
;
5800 struct bgp_filter
*filter
;
5801 struct listnode
*node
, *nnode
;
5803 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5804 return BGP_ERR_INVALID_VALUE
;
5806 /* Set configuration on peer. */
5807 filter
= &peer
->filter
[afi
][safi
];
5808 if (filter
->dlist
[direct
].name
)
5809 return BGP_ERR_PEER_FILTER_CONFLICT
;
5810 if (filter
->plist
[direct
].name
)
5811 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5812 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5813 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
5815 /* Check if handling a regular peer. */
5816 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5817 /* Set override-flag and process peer route updates. */
5818 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5819 PEER_FT_PREFIX_LIST
);
5820 peer_on_policy_change(peer
, afi
, safi
,
5821 (direct
== FILTER_OUT
) ? 1 : 0);
5823 /* Skip peer-group mechanics for regular peers. */
5828 * Set configuration on all peer-group members, unless they are
5829 * explicitely overriding peer-group configuration.
5831 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5832 /* Skip peers with overridden configuration. */
5833 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5834 PEER_FT_PREFIX_LIST
))
5837 /* Set configuration on peer-group member. */
5838 filter
= &member
->filter
[afi
][safi
];
5839 if (filter
->plist
[direct
].name
)
5840 XFREE(MTYPE_BGP_FILTER_NAME
,
5841 filter
->plist
[direct
].name
);
5842 filter
->plist
[direct
].name
=
5843 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5844 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
5846 /* Process peer route updates. */
5847 peer_on_policy_change(member
, afi
, safi
,
5848 (direct
== FILTER_OUT
) ? 1 : 0);
5854 int peer_prefix_list_unset(struct peer
*peer
, afi_t afi
, safi_t safi
,
5857 struct peer
*member
;
5858 struct bgp_filter
*filter
;
5859 struct listnode
*node
, *nnode
;
5861 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5862 return BGP_ERR_INVALID_VALUE
;
5864 /* Unset override-flag unconditionally. */
5865 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5866 PEER_FT_PREFIX_LIST
);
5868 /* Inherit configuration from peer-group if peer is member. */
5869 if (peer_group_active(peer
)) {
5870 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
5871 filter
[afi
][safi
].plist
[direct
].name
,
5872 MTYPE_BGP_FILTER_NAME
);
5873 PEER_ATTR_INHERIT(peer
, peer
->group
,
5874 filter
[afi
][safi
].plist
[direct
].plist
);
5876 /* Otherwise remove configuration from peer. */
5877 filter
= &peer
->filter
[afi
][safi
];
5878 if (filter
->plist
[direct
].name
)
5879 XFREE(MTYPE_BGP_FILTER_NAME
,
5880 filter
->plist
[direct
].name
);
5881 filter
->plist
[direct
].name
= NULL
;
5882 filter
->plist
[direct
].plist
= NULL
;
5885 /* Check if handling a regular peer. */
5886 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5887 /* Process peer route updates. */
5888 peer_on_policy_change(peer
, afi
, safi
,
5889 (direct
== FILTER_OUT
) ? 1 : 0);
5891 /* Skip peer-group mechanics for regular peers. */
5896 * Remove configuration on all peer-group members, unless they are
5897 * explicitely overriding peer-group configuration.
5899 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5900 /* Skip peers with overridden configuration. */
5901 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5902 PEER_FT_PREFIX_LIST
))
5905 /* Remove configuration on peer-group member. */
5906 filter
= &member
->filter
[afi
][safi
];
5907 if (filter
->plist
[direct
].name
)
5908 XFREE(MTYPE_BGP_FILTER_NAME
,
5909 filter
->plist
[direct
].name
);
5910 filter
->plist
[direct
].name
= NULL
;
5911 filter
->plist
[direct
].plist
= NULL
;
5913 /* Process peer route updates. */
5914 peer_on_policy_change(member
, afi
, safi
,
5915 (direct
== FILTER_OUT
) ? 1 : 0);
5921 /* Update prefix-list list. */
5922 static void peer_prefix_list_update(struct prefix_list
*plist
)
5924 struct listnode
*mnode
, *mnnode
;
5925 struct listnode
*node
, *nnode
;
5928 struct peer_group
*group
;
5929 struct bgp_filter
*filter
;
5934 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
5937 * Update the prefix-list on update groups.
5939 update_group_policy_update(
5940 bgp
, BGP_POLICY_PREFIX_LIST
,
5941 plist
? prefix_list_name(plist
) : NULL
, 0, 0);
5943 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
5944 FOREACH_AFI_SAFI (afi
, safi
) {
5945 filter
= &peer
->filter
[afi
][safi
];
5947 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5949 if (filter
->plist
[direct
].name
)
5950 filter
->plist
[direct
]
5951 .plist
= prefix_list_lookup(
5953 filter
->plist
[direct
]
5956 filter
->plist
[direct
].plist
=
5961 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
5962 FOREACH_AFI_SAFI (afi
, safi
) {
5963 filter
= &group
->conf
->filter
[afi
][safi
];
5965 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5967 if (filter
->plist
[direct
].name
)
5968 filter
->plist
[direct
]
5969 .plist
= prefix_list_lookup(
5971 filter
->plist
[direct
]
5974 filter
->plist
[direct
].plist
=
5982 int peer_aslist_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5985 struct peer
*member
;
5986 struct bgp_filter
*filter
;
5987 struct listnode
*node
, *nnode
;
5989 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5990 return BGP_ERR_INVALID_VALUE
;
5992 /* Set configuration on peer. */
5993 filter
= &peer
->filter
[afi
][safi
];
5994 if (filter
->aslist
[direct
].name
)
5995 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5996 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5997 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
5999 /* Check if handling a regular peer. */
6000 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6001 /* Set override-flag and process peer route updates. */
6002 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6003 PEER_FT_FILTER_LIST
);
6004 peer_on_policy_change(peer
, afi
, safi
,
6005 (direct
== FILTER_OUT
) ? 1 : 0);
6007 /* Skip peer-group mechanics for regular peers. */
6012 * Set configuration on all peer-group members, unless they are
6013 * explicitely overriding peer-group configuration.
6015 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6016 /* Skip peers with overridden configuration. */
6017 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6018 PEER_FT_FILTER_LIST
))
6021 /* Set configuration on peer-group member. */
6022 filter
= &member
->filter
[afi
][safi
];
6023 if (filter
->aslist
[direct
].name
)
6024 XFREE(MTYPE_BGP_FILTER_NAME
,
6025 filter
->aslist
[direct
].name
);
6026 filter
->aslist
[direct
].name
=
6027 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6028 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6030 /* Process peer route updates. */
6031 peer_on_policy_change(member
, afi
, safi
,
6032 (direct
== FILTER_OUT
) ? 1 : 0);
6038 int peer_aslist_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6040 struct peer
*member
;
6041 struct bgp_filter
*filter
;
6042 struct listnode
*node
, *nnode
;
6044 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6045 return BGP_ERR_INVALID_VALUE
;
6047 /* Unset override-flag unconditionally. */
6048 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6049 PEER_FT_FILTER_LIST
);
6051 /* Inherit configuration from peer-group if peer is member. */
6052 if (peer_group_active(peer
)) {
6053 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6054 filter
[afi
][safi
].aslist
[direct
].name
,
6055 MTYPE_BGP_FILTER_NAME
);
6056 PEER_ATTR_INHERIT(peer
, peer
->group
,
6057 filter
[afi
][safi
].aslist
[direct
].aslist
);
6059 /* Otherwise remove configuration from peer. */
6060 filter
= &peer
->filter
[afi
][safi
];
6061 if (filter
->aslist
[direct
].name
)
6062 XFREE(MTYPE_BGP_FILTER_NAME
,
6063 filter
->aslist
[direct
].name
);
6064 filter
->aslist
[direct
].name
= NULL
;
6065 filter
->aslist
[direct
].aslist
= NULL
;
6068 /* Check if handling a regular peer. */
6069 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6070 /* Process peer route updates. */
6071 peer_on_policy_change(peer
, afi
, safi
,
6072 (direct
== FILTER_OUT
) ? 1 : 0);
6074 /* Skip peer-group mechanics for regular peers. */
6079 * Remove configuration on all peer-group members, unless they are
6080 * explicitely overriding peer-group configuration.
6082 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6083 /* Skip peers with overridden configuration. */
6084 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6085 PEER_FT_FILTER_LIST
))
6088 /* Remove configuration on peer-group member. */
6089 filter
= &member
->filter
[afi
][safi
];
6090 if (filter
->aslist
[direct
].name
)
6091 XFREE(MTYPE_BGP_FILTER_NAME
,
6092 filter
->aslist
[direct
].name
);
6093 filter
->aslist
[direct
].name
= NULL
;
6094 filter
->aslist
[direct
].aslist
= NULL
;
6096 /* Process peer route updates. */
6097 peer_on_policy_change(member
, afi
, safi
,
6098 (direct
== FILTER_OUT
) ? 1 : 0);
6104 static void peer_aslist_update(const char *aslist_name
)
6109 struct listnode
*mnode
, *mnnode
;
6110 struct listnode
*node
, *nnode
;
6113 struct peer_group
*group
;
6114 struct bgp_filter
*filter
;
6116 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6117 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
6120 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6121 FOREACH_AFI_SAFI (afi
, safi
) {
6122 filter
= &peer
->filter
[afi
][safi
];
6124 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6126 if (filter
->aslist
[direct
].name
)
6127 filter
->aslist
[direct
]
6128 .aslist
= as_list_lookup(
6129 filter
->aslist
[direct
]
6132 filter
->aslist
[direct
].aslist
=
6137 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6138 FOREACH_AFI_SAFI (afi
, safi
) {
6139 filter
= &group
->conf
->filter
[afi
][safi
];
6141 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6143 if (filter
->aslist
[direct
].name
)
6144 filter
->aslist
[direct
]
6145 .aslist
= as_list_lookup(
6146 filter
->aslist
[direct
]
6149 filter
->aslist
[direct
].aslist
=
6157 static void peer_aslist_add(char *aslist_name
)
6159 peer_aslist_update(aslist_name
);
6160 route_map_notify_dependencies((char *)aslist_name
,
6161 RMAP_EVENT_ASLIST_ADDED
);
6164 static void peer_aslist_del(const char *aslist_name
)
6166 peer_aslist_update(aslist_name
);
6167 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
6171 int peer_route_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6174 struct peer
*member
;
6175 struct bgp_filter
*filter
;
6176 struct listnode
*node
, *nnode
;
6178 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6179 return BGP_ERR_INVALID_VALUE
;
6181 /* Set configuration on peer. */
6182 filter
= &peer
->filter
[afi
][safi
];
6183 if (filter
->map
[direct
].name
)
6184 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6185 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6186 filter
->map
[direct
].map
= route_map_lookup_by_name(name
);
6188 /* Check if handling a regular peer. */
6189 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6190 /* Set override-flag and process peer route updates. */
6191 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6193 peer_on_policy_change(peer
, afi
, safi
,
6194 (direct
== RMAP_OUT
) ? 1 : 0);
6196 /* Skip peer-group mechanics for regular peers. */
6201 * Set configuration on all peer-group members, unless they are
6202 * explicitely overriding peer-group configuration.
6204 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6205 /* Skip peers with overridden configuration. */
6206 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6210 /* Set configuration on peer-group member. */
6211 filter
= &member
->filter
[afi
][safi
];
6212 if (filter
->map
[direct
].name
)
6213 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6214 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6215 filter
->map
[direct
].map
= route_map_lookup_by_name(name
);
6217 /* Process peer route updates. */
6218 peer_on_policy_change(member
, afi
, safi
,
6219 (direct
== RMAP_OUT
) ? 1 : 0);
6224 /* Unset route-map from the peer. */
6225 int peer_route_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6227 struct peer
*member
;
6228 struct bgp_filter
*filter
;
6229 struct listnode
*node
, *nnode
;
6231 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6232 return BGP_ERR_INVALID_VALUE
;
6234 /* Unset override-flag unconditionally. */
6235 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
], PEER_FT_ROUTE_MAP
);
6237 /* Inherit configuration from peer-group if peer is member. */
6238 if (peer_group_active(peer
)) {
6239 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6240 filter
[afi
][safi
].map
[direct
].name
,
6241 MTYPE_BGP_FILTER_NAME
);
6242 PEER_ATTR_INHERIT(peer
, peer
->group
,
6243 filter
[afi
][safi
].map
[direct
].map
);
6245 /* Otherwise remove configuration from peer. */
6246 filter
= &peer
->filter
[afi
][safi
];
6247 if (filter
->map
[direct
].name
)
6248 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6249 filter
->map
[direct
].name
= NULL
;
6250 filter
->map
[direct
].map
= NULL
;
6253 /* Check if handling a regular peer. */
6254 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6255 /* Process peer route updates. */
6256 peer_on_policy_change(peer
, afi
, safi
,
6257 (direct
== RMAP_OUT
) ? 1 : 0);
6259 /* Skip peer-group mechanics for regular peers. */
6264 * Remove configuration on all peer-group members, unless they are
6265 * explicitely overriding peer-group configuration.
6267 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6268 /* Skip peers with overridden configuration. */
6269 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6273 /* Remove configuration on peer-group member. */
6274 filter
= &member
->filter
[afi
][safi
];
6275 if (filter
->map
[direct
].name
)
6276 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6277 filter
->map
[direct
].name
= NULL
;
6278 filter
->map
[direct
].map
= NULL
;
6280 /* Process peer route updates. */
6281 peer_on_policy_change(member
, afi
, safi
,
6282 (direct
== RMAP_OUT
) ? 1 : 0);
6288 /* Set unsuppress-map to the peer. */
6289 int peer_unsuppress_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6292 struct peer
*member
;
6293 struct bgp_filter
*filter
;
6294 struct listnode
*node
, *nnode
;
6296 /* Set configuration on peer. */
6297 filter
= &peer
->filter
[afi
][safi
];
6298 if (filter
->usmap
.name
)
6299 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6300 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6301 filter
->usmap
.map
= route_map_lookup_by_name(name
);
6303 /* Check if handling a regular peer. */
6304 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6305 /* Set override-flag and process peer route updates. */
6306 SET_FLAG(peer
->filter_override
[afi
][safi
][0],
6307 PEER_FT_UNSUPPRESS_MAP
);
6308 peer_on_policy_change(peer
, afi
, safi
, 1);
6310 /* Skip peer-group mechanics for regular peers. */
6315 * Set configuration on all peer-group members, unless they are
6316 * explicitely overriding peer-group configuration.
6318 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6319 /* Skip peers with overridden configuration. */
6320 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
6321 PEER_FT_UNSUPPRESS_MAP
))
6324 /* Set configuration on peer-group member. */
6325 filter
= &member
->filter
[afi
][safi
];
6326 if (filter
->usmap
.name
)
6327 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6328 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6329 filter
->usmap
.map
= route_map_lookup_by_name(name
);
6331 /* Process peer route updates. */
6332 peer_on_policy_change(member
, afi
, safi
, 1);
6338 /* Unset route-map from the peer. */
6339 int peer_unsuppress_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6341 struct peer
*member
;
6342 struct bgp_filter
*filter
;
6343 struct listnode
*node
, *nnode
;
6345 /* Unset override-flag unconditionally. */
6346 UNSET_FLAG(peer
->filter_override
[afi
][safi
][0], PEER_FT_UNSUPPRESS_MAP
);
6348 /* Inherit configuration from peer-group if peer is member. */
6349 if (peer_group_active(peer
)) {
6350 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6351 filter
[afi
][safi
].usmap
.name
,
6352 MTYPE_BGP_FILTER_NAME
);
6353 PEER_ATTR_INHERIT(peer
, peer
->group
,
6354 filter
[afi
][safi
].usmap
.map
);
6356 /* Otherwise remove configuration from peer. */
6357 filter
= &peer
->filter
[afi
][safi
];
6358 if (filter
->usmap
.name
)
6359 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6360 filter
->usmap
.name
= NULL
;
6361 filter
->usmap
.map
= NULL
;
6364 /* Check if handling a regular peer. */
6365 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6366 /* Process peer route updates. */
6367 peer_on_policy_change(peer
, afi
, safi
, 1);
6369 /* Skip peer-group mechanics for regular peers. */
6374 * Remove configuration on all peer-group members, unless they are
6375 * explicitely overriding peer-group configuration.
6377 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6378 /* Skip peers with overridden configuration. */
6379 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
6380 PEER_FT_UNSUPPRESS_MAP
))
6383 /* Remove configuration on peer-group member. */
6384 filter
= &member
->filter
[afi
][safi
];
6385 if (filter
->usmap
.name
)
6386 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6387 filter
->usmap
.name
= NULL
;
6388 filter
->usmap
.map
= NULL
;
6390 /* Process peer route updates. */
6391 peer_on_policy_change(member
, afi
, safi
, 1);
6397 int peer_maximum_prefix_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6398 uint32_t max
, uint8_t threshold
, int warning
,
6401 struct peer
*member
;
6402 struct listnode
*node
, *nnode
;
6404 /* Set flags and configuration on peer. */
6405 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6407 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
6409 peer_af_flag_unset(peer
, afi
, safi
,
6410 PEER_FLAG_MAX_PREFIX_WARNING
);
6412 peer
->pmax
[afi
][safi
] = max
;
6413 peer
->pmax_threshold
[afi
][safi
] = threshold
;
6414 peer
->pmax_restart
[afi
][safi
] = restart
;
6416 /* Check if handling a regular peer. */
6417 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6418 /* Re-check if peer violates maximum-prefix. */
6419 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
6420 bgp_maximum_prefix_overflow(peer
, afi
, safi
, 1);
6422 /* Skip peer-group mechanics for regular peers. */
6427 * Set flags and configuration on all peer-group members, unless they
6428 * are explicitely overriding peer-group configuration.
6430 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6431 /* Skip peers with overridden configuration. */
6432 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6433 PEER_FLAG_MAX_PREFIX
))
6436 /* Set flag and configuration on peer-group member. */
6437 member
->pmax
[afi
][safi
] = max
;
6438 member
->pmax_threshold
[afi
][safi
] = threshold
;
6439 member
->pmax_restart
[afi
][safi
] = restart
;
6441 SET_FLAG(member
->af_flags
[afi
][safi
],
6442 PEER_FLAG_MAX_PREFIX_WARNING
);
6444 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6445 PEER_FLAG_MAX_PREFIX_WARNING
);
6447 /* Re-check if peer violates maximum-prefix. */
6448 if ((member
->status
== Established
) && (member
->afc
[afi
][safi
]))
6449 bgp_maximum_prefix_overflow(member
, afi
, safi
, 1);
6455 int peer_maximum_prefix_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6457 struct peer
*member
;
6458 struct listnode
*node
, *nnode
;
6460 /* Inherit configuration from peer-group if peer is member. */
6461 if (peer_group_active(peer
)) {
6462 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6463 peer_af_flag_inherit(peer
, afi
, safi
,
6464 PEER_FLAG_MAX_PREFIX_WARNING
);
6465 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax
[afi
][safi
]);
6466 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_threshold
[afi
][safi
]);
6467 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_restart
[afi
][safi
]);
6472 /* Remove flags and configuration from peer. */
6473 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6474 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
6475 peer
->pmax
[afi
][safi
] = 0;
6476 peer
->pmax_threshold
[afi
][safi
] = 0;
6477 peer
->pmax_restart
[afi
][safi
] = 0;
6480 * Remove flags and configuration from all peer-group members, unless
6481 * they are explicitely overriding peer-group configuration.
6483 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6484 /* Skip peers with overridden configuration. */
6485 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6486 PEER_FLAG_MAX_PREFIX
))
6489 /* Remove flag and configuration on peer-group member. */
6490 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
6491 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6492 PEER_FLAG_MAX_PREFIX_WARNING
);
6493 member
->pmax
[afi
][safi
] = 0;
6494 member
->pmax_threshold
[afi
][safi
] = 0;
6495 member
->pmax_restart
[afi
][safi
] = 0;
6501 int is_ebgp_multihop_configured(struct peer
*peer
)
6503 struct peer_group
*group
;
6504 struct listnode
*node
, *nnode
;
6507 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6508 group
= peer
->group
;
6509 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
6510 && (group
->conf
->ttl
!= 1))
6513 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer1
)) {
6514 if ((peer_sort(peer1
) != BGP_PEER_IBGP
)
6515 && (peer1
->ttl
!= 1))
6519 if ((peer_sort(peer
) != BGP_PEER_IBGP
) && (peer
->ttl
!= 1))
6525 /* Set # of hops between us and BGP peer. */
6526 int peer_ttl_security_hops_set(struct peer
*peer
, int gtsm_hops
)
6528 struct peer_group
*group
;
6529 struct listnode
*node
, *nnode
;
6532 zlog_debug("peer_ttl_security_hops_set: set gtsm_hops to %d for %s",
6533 gtsm_hops
, peer
->host
);
6535 /* We cannot configure ttl-security hops when ebgp-multihop is already
6536 set. For non peer-groups, the check is simple. For peer-groups,
6538 slightly messy, because we need to check both the peer-group
6540 and all peer-group members for any trace of ebgp-multihop
6542 before actually applying the ttl-security rules. Cisco really made a
6543 mess of this configuration parameter, and OpenBGPD got it right.
6546 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
)) {
6547 if (is_ebgp_multihop_configured(peer
))
6548 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
6550 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6551 peer
->gtsm_hops
= gtsm_hops
;
6553 /* Calling ebgp multihop also resets the session.
6554 * On restart, NHT will get setup correctly as will the
6555 * min & max ttls on the socket. The return value is
6558 ret
= peer_ebgp_multihop_set(peer
, MAXTTL
);
6563 group
= peer
->group
;
6564 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
6566 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
6568 /* Calling ebgp multihop also resets the
6570 * On restart, NHT will get setup correctly as
6572 * min & max ttls on the socket. The return
6576 peer_ebgp_multihop_set(peer
, MAXTTL
);
6580 /* Post the first gtsm setup or if its ibgp, maxttl setting
6582 * necessary, just set the minttl.
6584 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6585 peer
->gtsm_hops
= gtsm_hops
;
6588 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
6589 MAXTTL
+ 1 - gtsm_hops
);
6590 if ((peer
->status
< Established
) && peer
->doppelganger
6591 && (peer
->doppelganger
->fd
>= 0))
6592 sockopt_minttl(peer
->su
.sa
.sa_family
,
6593 peer
->doppelganger
->fd
,
6594 MAXTTL
+ 1 - gtsm_hops
);
6596 group
= peer
->group
;
6597 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
6599 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
6601 /* Change setting of existing peer
6602 * established then change value (may break
6604 * not established yet (teardown session and
6606 * no session then do nothing (will get
6607 * handled by next connection)
6609 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
6611 peer
->su
.sa
.sa_family
, peer
->fd
,
6612 MAXTTL
+ 1 - peer
->gtsm_hops
);
6613 if ((peer
->status
< Established
)
6614 && peer
->doppelganger
6615 && (peer
->doppelganger
->fd
>= 0))
6616 sockopt_minttl(peer
->su
.sa
.sa_family
,
6617 peer
->doppelganger
->fd
,
6618 MAXTTL
+ 1 - gtsm_hops
);
6626 int peer_ttl_security_hops_unset(struct peer
*peer
)
6628 struct peer_group
*group
;
6629 struct listnode
*node
, *nnode
;
6632 zlog_debug("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s",
6635 /* if a peer-group member, then reset to peer-group default rather than
6637 if (peer_group_active(peer
))
6638 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
6640 peer
->gtsm_hops
= 0;
6642 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6643 /* Invoking ebgp_multihop_set will set the TTL back to the
6645 * value as well as restting the NHT and such. The session is
6648 if (peer
->sort
== BGP_PEER_EBGP
)
6649 ret
= peer_ebgp_multihop_unset(peer
);
6652 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
6655 if ((peer
->status
< Established
) && peer
->doppelganger
6656 && (peer
->doppelganger
->fd
>= 0))
6657 sockopt_minttl(peer
->su
.sa
.sa_family
,
6658 peer
->doppelganger
->fd
, 0);
6661 group
= peer
->group
;
6662 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
6663 peer
->gtsm_hops
= 0;
6664 if (peer
->sort
== BGP_PEER_EBGP
)
6665 ret
= peer_ebgp_multihop_unset(peer
);
6668 sockopt_minttl(peer
->su
.sa
.sa_family
,
6671 if ((peer
->status
< Established
)
6672 && peer
->doppelganger
6673 && (peer
->doppelganger
->fd
>= 0))
6674 sockopt_minttl(peer
->su
.sa
.sa_family
,
6675 peer
->doppelganger
->fd
,
6685 * If peer clear is invoked in a loop for all peers on the BGP instance,
6686 * it may end up freeing the doppelganger, and if this was the next node
6687 * to the current node, we would end up accessing the freed next node.
6688 * Pass along additional parameter which can be updated if next node
6689 * is freed; only required when walking the peer list on BGP instance.
6691 int peer_clear(struct peer
*peer
, struct listnode
**nnode
)
6693 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)) {
6694 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
6695 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
6696 if (peer
->t_pmax_restart
) {
6697 BGP_TIMER_OFF(peer
->t_pmax_restart
);
6698 if (bgp_debug_neighbor_events(peer
))
6700 "%s Maximum-prefix restart timer canceled",
6703 BGP_EVENT_ADD(peer
, BGP_Start
);
6707 peer
->v_start
= BGP_INIT_START_TIMER
;
6708 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
6709 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
6710 BGP_NOTIFY_CEASE_ADMIN_RESET
);
6712 bgp_session_reset_safe(peer
, nnode
);
6717 int peer_clear_soft(struct peer
*peer
, afi_t afi
, safi_t safi
,
6718 enum bgp_clear_type stype
)
6720 struct peer_af
*paf
;
6722 if (peer
->status
!= Established
)
6725 if (!peer
->afc
[afi
][safi
])
6726 return BGP_ERR_AF_UNCONFIGURED
;
6728 peer
->rtt
= sockopt_tcp_rtt(peer
->fd
);
6730 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
) {
6731 /* Clear the "neighbor x.x.x.x default-originate" flag */
6732 paf
= peer_af_find(peer
, afi
, safi
);
6733 if (paf
&& paf
->subgroup
6734 && CHECK_FLAG(paf
->subgroup
->sflags
,
6735 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
6736 UNSET_FLAG(paf
->subgroup
->sflags
,
6737 SUBGRP_STATUS_DEFAULT_ORIGINATE
);
6739 bgp_announce_route(peer
, afi
, safi
);
6742 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
6743 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6744 PEER_CAP_ORF_PREFIX_SM_ADV
)
6745 && (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6746 PEER_CAP_ORF_PREFIX_RM_RCV
)
6747 || CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6748 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))) {
6749 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
6750 uint8_t prefix_type
;
6752 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6753 PEER_CAP_ORF_PREFIX_RM_RCV
))
6754 prefix_type
= ORF_TYPE_PREFIX
;
6756 prefix_type
= ORF_TYPE_PREFIX_OLD
;
6758 if (filter
->plist
[FILTER_IN
].plist
) {
6759 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
6760 PEER_STATUS_ORF_PREFIX_SEND
))
6761 bgp_route_refresh_send(
6762 peer
, afi
, safi
, prefix_type
,
6764 bgp_route_refresh_send(peer
, afi
, safi
,
6766 REFRESH_IMMEDIATE
, 0);
6768 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
6769 PEER_STATUS_ORF_PREFIX_SEND
))
6770 bgp_route_refresh_send(
6771 peer
, afi
, safi
, prefix_type
,
6772 REFRESH_IMMEDIATE
, 1);
6774 bgp_route_refresh_send(peer
, afi
, safi
,
6781 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
6782 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
6783 /* If neighbor has soft reconfiguration inbound flag.
6784 Use Adj-RIB-In database. */
6785 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
6786 PEER_FLAG_SOFT_RECONFIG
))
6787 bgp_soft_reconfig_in(peer
, afi
, safi
);
6789 /* If neighbor has route refresh capability, send route
6791 message to the peer. */
6792 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
6793 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
6794 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0,
6797 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
6803 /* Display peer uptime.*/
6804 char *peer_uptime(time_t uptime2
, char *buf
, size_t len
, uint8_t use_json
,
6807 time_t uptime1
, epoch_tbuf
;
6810 /* Check buffer length. */
6811 if (len
< BGP_UPTIME_LEN
) {
6813 zlog_warn("peer_uptime (): buffer shortage %lu",
6814 (unsigned long)len
);
6815 /* XXX: should return status instead of buf... */
6816 snprintf(buf
, len
, "<error> ");
6821 /* If there is no connection has been done before print `never'. */
6824 json_object_string_add(json
, "peerUptime", "never");
6825 json_object_int_add(json
, "peerUptimeMsec", 0);
6827 snprintf(buf
, len
, "never");
6831 /* Get current time. */
6832 uptime1
= bgp_clock();
6834 tm
= gmtime(&uptime1
);
6836 if (uptime1
< ONE_DAY_SECOND
)
6837 snprintf(buf
, len
, "%02d:%02d:%02d", tm
->tm_hour
, tm
->tm_min
,
6839 else if (uptime1
< ONE_WEEK_SECOND
)
6840 snprintf(buf
, len
, "%dd%02dh%02dm", tm
->tm_yday
, tm
->tm_hour
,
6842 else if (uptime1
< ONE_YEAR_SECOND
)
6843 snprintf(buf
, len
, "%02dw%dd%02dh", tm
->tm_yday
/ 7,
6844 tm
->tm_yday
- ((tm
->tm_yday
/ 7) * 7), tm
->tm_hour
);
6846 snprintf(buf
, len
, "%02dy%02dw%dd", tm
->tm_year
- 70,
6848 tm
->tm_yday
- ((tm
->tm_yday
/ 7) * 7));
6851 epoch_tbuf
= time(NULL
) - uptime1
;
6852 json_object_string_add(json
, "peerUptime", buf
);
6853 json_object_int_add(json
, "peerUptimeMsec", uptime1
* 1000);
6854 json_object_int_add(json
, "peerUptimeEstablishedEpoch",
6861 static void bgp_config_write_filter(struct vty
*vty
, struct peer
*peer
,
6862 afi_t afi
, safi_t safi
)
6864 struct bgp_filter
*filter
;
6868 filter
= &peer
->filter
[afi
][safi
];
6870 /* distribute-list. */
6871 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
6873 vty_out(vty
, " neighbor %s distribute-list %s in\n", addr
,
6874 filter
->dlist
[FILTER_IN
].name
);
6876 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
6878 vty_out(vty
, " neighbor %s distribute-list %s out\n", addr
,
6879 filter
->dlist
[FILTER_OUT
].name
);
6882 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
6884 vty_out(vty
, " neighbor %s prefix-list %s in\n", addr
,
6885 filter
->plist
[FILTER_IN
].name
);
6887 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
6889 vty_out(vty
, " neighbor %s prefix-list %s out\n", addr
,
6890 filter
->plist
[FILTER_OUT
].name
);
6893 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
, RMAP_IN
))
6894 vty_out(vty
, " neighbor %s route-map %s in\n", addr
,
6895 filter
->map
[RMAP_IN
].name
);
6897 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
,
6899 vty_out(vty
, " neighbor %s route-map %s out\n", addr
,
6900 filter
->map
[RMAP_OUT
].name
);
6902 /* unsuppress-map */
6903 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_UNSUPPRESS_MAP
, 0))
6904 vty_out(vty
, " neighbor %s unsuppress-map %s\n", addr
,
6905 filter
->usmap
.name
);
6908 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
6910 vty_out(vty
, " neighbor %s filter-list %s in\n", addr
,
6911 filter
->aslist
[FILTER_IN
].name
);
6913 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
6915 vty_out(vty
, " neighbor %s filter-list %s out\n", addr
,
6916 filter
->aslist
[FILTER_OUT
].name
);
6919 /* BGP peer configuration display function. */
6920 static void bgp_config_write_peer_global(struct vty
*vty
, struct bgp
*bgp
,
6923 struct peer
*g_peer
= NULL
;
6924 char buf
[SU_ADDRSTRLEN
];
6926 int if_pg_printed
= FALSE
;
6927 int if_ras_printed
= FALSE
;
6929 /* Skip dynamic neighbors. */
6930 if (peer_dynamic_neighbor(peer
))
6934 addr
= peer
->conf_if
;
6938 /************************************
6939 ****** Global to the neighbor ******
6940 ************************************/
6941 if (peer
->conf_if
) {
6942 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
6943 vty_out(vty
, " neighbor %s interface v6only", addr
);
6945 vty_out(vty
, " neighbor %s interface", addr
);
6947 if (peer_group_active(peer
)) {
6948 vty_out(vty
, " peer-group %s", peer
->group
->name
);
6949 if_pg_printed
= TRUE
;
6950 } else if (peer
->as_type
== AS_SPECIFIED
) {
6951 vty_out(vty
, " remote-as %u", peer
->as
);
6952 if_ras_printed
= TRUE
;
6953 } else if (peer
->as_type
== AS_INTERNAL
) {
6954 vty_out(vty
, " remote-as internal");
6955 if_ras_printed
= TRUE
;
6956 } else if (peer
->as_type
== AS_EXTERNAL
) {
6957 vty_out(vty
, " remote-as external");
6958 if_ras_printed
= TRUE
;
6964 /* remote-as and peer-group */
6965 /* peer is a member of a peer-group */
6966 if (peer_group_active(peer
)) {
6967 g_peer
= peer
->group
->conf
;
6969 if (g_peer
->as_type
== AS_UNSPECIFIED
&& !if_ras_printed
) {
6970 if (peer
->as_type
== AS_SPECIFIED
) {
6971 vty_out(vty
, " neighbor %s remote-as %u\n",
6973 } else if (peer
->as_type
== AS_INTERNAL
) {
6975 " neighbor %s remote-as internal\n",
6977 } else if (peer
->as_type
== AS_EXTERNAL
) {
6979 " neighbor %s remote-as external\n",
6984 /* For swpX peers we displayed the peer-group
6985 * via 'neighbor swpX interface peer-group WORD' */
6987 vty_out(vty
, " neighbor %s peer-group %s\n", addr
,
6991 /* peer is NOT a member of a peer-group */
6993 /* peer is a peer-group, declare the peer-group */
6994 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6995 vty_out(vty
, " neighbor %s peer-group\n", addr
);
6998 if (!if_ras_printed
) {
6999 if (peer
->as_type
== AS_SPECIFIED
) {
7000 vty_out(vty
, " neighbor %s remote-as %u\n",
7002 } else if (peer
->as_type
== AS_INTERNAL
) {
7004 " neighbor %s remote-as internal\n",
7006 } else if (peer
->as_type
== AS_EXTERNAL
) {
7008 " neighbor %s remote-as external\n",
7015 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS
)) {
7016 vty_out(vty
, " neighbor %s local-as %u", addr
,
7017 peer
->change_local_as
);
7018 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
7019 vty_out(vty
, " no-prepend");
7020 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
7021 vty_out(vty
, " replace-as");
7027 vty_out(vty
, " neighbor %s description %s\n", addr
, peer
->desc
);
7031 if (peergroup_flag_check(peer
, PEER_FLAG_SHUTDOWN
)) {
7032 if (peer
->tx_shutdown_message
)
7033 vty_out(vty
, " neighbor %s shutdown message %s\n", addr
,
7034 peer
->tx_shutdown_message
);
7036 vty_out(vty
, " neighbor %s shutdown\n", addr
);
7040 if (peer
->bfd_info
) {
7041 if (!peer_group_active(peer
) || !g_peer
->bfd_info
) {
7042 bgp_bfd_peer_config_write(vty
, peer
, addr
);
7047 if (peergroup_flag_check(peer
, PEER_FLAG_PASSWORD
))
7048 vty_out(vty
, " neighbor %s password %s\n", addr
,
7052 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
)) {
7053 if (!peer_group_active(peer
)) {
7054 vty_out(vty
, " neighbor %s solo\n", addr
);
7059 if (peer
->port
!= BGP_PORT_DEFAULT
) {
7060 vty_out(vty
, " neighbor %s port %d\n", addr
, peer
->port
);
7063 /* Local interface name */
7065 vty_out(vty
, " neighbor %s interface %s\n", addr
, peer
->ifname
);
7069 if (peergroup_flag_check(peer
, PEER_FLAG_PASSIVE
))
7070 vty_out(vty
, " neighbor %s passive\n", addr
);
7073 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1
7074 && !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
)) {
7075 if (!peer_group_active(peer
) || g_peer
->ttl
!= peer
->ttl
) {
7076 vty_out(vty
, " neighbor %s ebgp-multihop %d\n", addr
,
7081 /* ttl-security hops */
7082 if (peer
->gtsm_hops
!= 0) {
7083 if (!peer_group_active(peer
)
7084 || g_peer
->gtsm_hops
!= peer
->gtsm_hops
) {
7085 vty_out(vty
, " neighbor %s ttl-security hops %d\n",
7086 addr
, peer
->gtsm_hops
);
7090 /* disable-connected-check */
7091 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
7092 vty_out(vty
, " neighbor %s disable-connected-check\n", addr
);
7094 /* enforce-first-as */
7095 if (peergroup_flag_check(peer
, PEER_FLAG_ENFORCE_FIRST_AS
))
7096 vty_out(vty
, " neighbor %s enforce-first-as\n", addr
);
7099 if (peergroup_flag_check(peer
, PEER_FLAG_UPDATE_SOURCE
)) {
7100 if (peer
->update_source
)
7101 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
7102 sockunion2str(peer
->update_source
, buf
,
7104 else if (peer
->update_if
)
7105 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
7109 /* advertisement-interval */
7110 if (peergroup_flag_check(peer
, PEER_FLAG_ROUTEADV
))
7111 vty_out(vty
, " neighbor %s advertisement-interval %u\n", addr
,
7115 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER
))
7116 vty_out(vty
, " neighbor %s timers %u %u\n", addr
,
7117 peer
->keepalive
, peer
->holdtime
);
7119 /* timers connect */
7120 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_CONNECT
))
7121 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
7124 /* capability dynamic */
7125 if (peergroup_flag_check(peer
, PEER_FLAG_DYNAMIC_CAPABILITY
))
7126 vty_out(vty
, " neighbor %s capability dynamic\n", addr
);
7128 /* capability extended-nexthop */
7129 if (peergroup_flag_check(peer
, PEER_FLAG_CAPABILITY_ENHE
)) {
7130 if (CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
))
7132 " no neighbor %s capability extended-nexthop\n",
7136 " neighbor %s capability extended-nexthop\n",
7140 /* dont-capability-negotiation */
7141 if (peergroup_flag_check(peer
, PEER_FLAG_DONT_CAPABILITY
))
7142 vty_out(vty
, " neighbor %s dont-capability-negotiate\n", addr
);
7144 /* override-capability */
7145 if (peergroup_flag_check(peer
, PEER_FLAG_OVERRIDE_CAPABILITY
))
7146 vty_out(vty
, " neighbor %s override-capability\n", addr
);
7148 /* strict-capability-match */
7149 if (peergroup_flag_check(peer
, PEER_FLAG_STRICT_CAP_MATCH
))
7150 vty_out(vty
, " neighbor %s strict-capability-match\n", addr
);
7153 /* BGP peer configuration display function. */
7154 static void bgp_config_write_peer_af(struct vty
*vty
, struct bgp
*bgp
,
7155 struct peer
*peer
, afi_t afi
, safi_t safi
)
7157 struct peer
*g_peer
= NULL
;
7159 bool flag_scomm
, flag_secomm
, flag_slcomm
;
7161 /* Skip dynamic neighbors. */
7162 if (peer_dynamic_neighbor(peer
))
7166 addr
= peer
->conf_if
;
7170 /************************************
7171 ****** Per AF to the neighbor ******
7172 ************************************/
7173 if (peer_group_active(peer
)) {
7174 g_peer
= peer
->group
->conf
;
7176 /* If the peer-group is active but peer is not, print a 'no
7178 if (g_peer
->afc
[afi
][safi
] && !peer
->afc
[afi
][safi
]) {
7179 vty_out(vty
, " no neighbor %s activate\n", addr
);
7182 /* If the peer-group is not active but peer is, print an
7184 else if (!g_peer
->afc
[afi
][safi
] && peer
->afc
[afi
][safi
]) {
7185 vty_out(vty
, " neighbor %s activate\n", addr
);
7188 if (peer
->afc
[afi
][safi
]) {
7189 if ((afi
== AFI_IP
) && (safi
== SAFI_UNICAST
)) {
7190 if (bgp_flag_check(bgp
,
7191 BGP_FLAG_NO_DEFAULT_IPV4
)) {
7192 vty_out(vty
, " neighbor %s activate\n",
7196 vty_out(vty
, " neighbor %s activate\n", addr
);
7198 if ((afi
== AFI_IP
) && (safi
== SAFI_UNICAST
)) {
7199 if (!bgp_flag_check(bgp
,
7200 BGP_FLAG_NO_DEFAULT_IPV4
)) {
7202 " no neighbor %s activate\n",
7209 /* addpath TX knobs */
7210 if (peergroup_af_flag_check(peer
, afi
, safi
,
7211 PEER_FLAG_ADDPATH_TX_ALL_PATHS
)) {
7212 vty_out(vty
, " neighbor %s addpath-tx-all-paths\n", addr
);
7215 if (peergroup_af_flag_check(peer
, afi
, safi
,
7216 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
)) {
7217 vty_out(vty
, " neighbor %s addpath-tx-bestpath-per-AS\n",
7221 /* ORF capability. */
7222 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ORF_PREFIX_SM
)
7223 || peergroup_af_flag_check(peer
, afi
, safi
,
7224 PEER_FLAG_ORF_PREFIX_RM
)) {
7225 vty_out(vty
, " neighbor %s capability orf prefix-list", addr
);
7227 if (peergroup_af_flag_check(peer
, afi
, safi
,
7228 PEER_FLAG_ORF_PREFIX_SM
)
7229 && peergroup_af_flag_check(peer
, afi
, safi
,
7230 PEER_FLAG_ORF_PREFIX_RM
))
7231 vty_out(vty
, " both");
7232 else if (peergroup_af_flag_check(peer
, afi
, safi
,
7233 PEER_FLAG_ORF_PREFIX_SM
))
7234 vty_out(vty
, " send");
7236 vty_out(vty
, " receive");
7240 /* Route reflector client. */
7241 if (peergroup_af_flag_check(peer
, afi
, safi
,
7242 PEER_FLAG_REFLECTOR_CLIENT
)) {
7243 vty_out(vty
, " neighbor %s route-reflector-client\n", addr
);
7246 /* next-hop-self force */
7247 if (peergroup_af_flag_check(peer
, afi
, safi
,
7248 PEER_FLAG_FORCE_NEXTHOP_SELF
)) {
7249 vty_out(vty
, " neighbor %s next-hop-self force\n", addr
);
7253 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)) {
7254 vty_out(vty
, " neighbor %s next-hop-self\n", addr
);
7257 /* remove-private-AS */
7258 if (peergroup_af_flag_check(peer
, afi
, safi
,
7259 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
)) {
7260 vty_out(vty
, " neighbor %s remove-private-AS all replace-AS\n",
7264 else if (peergroup_af_flag_check(peer
, afi
, safi
,
7265 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
)) {
7266 vty_out(vty
, " neighbor %s remove-private-AS replace-AS\n",
7270 else if (peergroup_af_flag_check(peer
, afi
, safi
,
7271 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
)) {
7272 vty_out(vty
, " neighbor %s remove-private-AS all\n", addr
);
7275 else if (peergroup_af_flag_check(peer
, afi
, safi
,
7276 PEER_FLAG_REMOVE_PRIVATE_AS
)) {
7277 vty_out(vty
, " neighbor %s remove-private-AS\n", addr
);
7281 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
)) {
7282 vty_out(vty
, " neighbor %s as-override\n", addr
);
7285 /* send-community print. */
7286 flag_scomm
= peergroup_af_flag_check(peer
, afi
, safi
,
7287 PEER_FLAG_SEND_COMMUNITY
);
7288 flag_secomm
= peergroup_af_flag_check(peer
, afi
, safi
,
7289 PEER_FLAG_SEND_EXT_COMMUNITY
);
7290 flag_slcomm
= peergroup_af_flag_check(peer
, afi
, safi
,
7291 PEER_FLAG_SEND_LARGE_COMMUNITY
);
7293 if (!bgp_option_check(BGP_OPT_CONFIG_CISCO
)) {
7294 if (flag_scomm
&& flag_secomm
&& flag_slcomm
) {
7295 vty_out(vty
, " no neighbor %s send-community all\n",
7300 " no neighbor %s send-community\n",
7304 " no neighbor %s send-community extended\n",
7309 " no neighbor %s send-community large\n",
7313 if (flag_scomm
&& flag_secomm
&& flag_slcomm
) {
7314 vty_out(vty
, " neighbor %s send-community all\n",
7316 } else if (flag_scomm
&& flag_secomm
) {
7317 vty_out(vty
, " neighbor %s send-community both\n",
7321 vty_out(vty
, " neighbor %s send-community\n",
7325 " neighbor %s send-community extended\n",
7329 " neighbor %s send-community large\n",
7334 /* Default information */
7335 if (peergroup_af_flag_check(peer
, afi
, safi
,
7336 PEER_FLAG_DEFAULT_ORIGINATE
)) {
7337 vty_out(vty
, " neighbor %s default-originate", addr
);
7339 if (peer
->default_rmap
[afi
][safi
].name
)
7340 vty_out(vty
, " route-map %s",
7341 peer
->default_rmap
[afi
][safi
].name
);
7346 /* Soft reconfiguration inbound. */
7347 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_SOFT_RECONFIG
)) {
7348 vty_out(vty
, " neighbor %s soft-reconfiguration inbound\n",
7352 /* maximum-prefix. */
7353 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
)) {
7354 vty_out(vty
, " neighbor %s maximum-prefix %lu", addr
,
7355 peer
->pmax
[afi
][safi
]);
7357 if (peer
->pmax_threshold
[afi
][safi
]
7358 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
7359 vty_out(vty
, " %u", peer
->pmax_threshold
[afi
][safi
]);
7360 if (peer_af_flag_check(peer
, afi
, safi
,
7361 PEER_FLAG_MAX_PREFIX_WARNING
))
7362 vty_out(vty
, " warning-only");
7363 if (peer
->pmax_restart
[afi
][safi
])
7364 vty_out(vty
, " restart %u",
7365 peer
->pmax_restart
[afi
][safi
]);
7370 /* Route server client. */
7371 if (peergroup_af_flag_check(peer
, afi
, safi
,
7372 PEER_FLAG_RSERVER_CLIENT
)) {
7373 vty_out(vty
, " neighbor %s route-server-client\n", addr
);
7376 /* Nexthop-local unchanged. */
7377 if (peergroup_af_flag_check(peer
, afi
, safi
,
7378 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)) {
7379 vty_out(vty
, " neighbor %s nexthop-local unchanged\n", addr
);
7382 /* allowas-in <1-10> */
7383 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)) {
7384 if (peer_af_flag_check(peer
, afi
, safi
,
7385 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
7386 vty_out(vty
, " neighbor %s allowas-in origin\n", addr
);
7387 } else if (peer
->allowas_in
[afi
][safi
] == 3) {
7388 vty_out(vty
, " neighbor %s allowas-in\n", addr
);
7390 vty_out(vty
, " neighbor %s allowas-in %d\n", addr
,
7391 peer
->allowas_in
[afi
][safi
]);
7396 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_WEIGHT
))
7397 vty_out(vty
, " neighbor %s weight %lu\n", addr
,
7398 peer
->weight
[afi
][safi
]);
7401 bgp_config_write_filter(vty
, peer
, afi
, safi
);
7403 /* atribute-unchanged. */
7404 if (peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_PATH_UNCHANGED
)
7405 || (safi
!= SAFI_EVPN
7406 && peer_af_flag_check(peer
, afi
, safi
,
7407 PEER_FLAG_NEXTHOP_UNCHANGED
))
7408 || peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MED_UNCHANGED
)) {
7410 if (!peer_group_active(peer
)
7411 || peergroup_af_flag_check(peer
, afi
, safi
,
7412 PEER_FLAG_AS_PATH_UNCHANGED
)
7413 || peergroup_af_flag_check(peer
, afi
, safi
,
7414 PEER_FLAG_NEXTHOP_UNCHANGED
)
7415 || peergroup_af_flag_check(peer
, afi
, safi
,
7416 PEER_FLAG_MED_UNCHANGED
)) {
7419 " neighbor %s attribute-unchanged%s%s%s\n",
7421 peer_af_flag_check(peer
, afi
, safi
,
7422 PEER_FLAG_AS_PATH_UNCHANGED
)
7425 peer_af_flag_check(peer
, afi
, safi
,
7426 PEER_FLAG_NEXTHOP_UNCHANGED
)
7429 peer_af_flag_check(peer
, afi
, safi
,
7430 PEER_FLAG_MED_UNCHANGED
)
7437 /* Address family based peer configuration display. */
7438 static void bgp_config_write_family(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
7442 struct peer_group
*group
;
7443 struct listnode
*node
, *nnode
;
7446 vty_frame(vty
, " !\n address-family ");
7447 if (afi
== AFI_IP
) {
7448 if (safi
== SAFI_UNICAST
)
7449 vty_frame(vty
, "ipv4 unicast");
7450 else if (safi
== SAFI_LABELED_UNICAST
)
7451 vty_frame(vty
, "ipv4 labeled-unicast");
7452 else if (safi
== SAFI_MULTICAST
)
7453 vty_frame(vty
, "ipv4 multicast");
7454 else if (safi
== SAFI_MPLS_VPN
)
7455 vty_frame(vty
, "ipv4 vpn");
7456 else if (safi
== SAFI_ENCAP
)
7457 vty_frame(vty
, "ipv4 encap");
7458 else if (safi
== SAFI_FLOWSPEC
)
7459 vty_frame(vty
, "ipv4 flowspec");
7460 } else if (afi
== AFI_IP6
) {
7461 if (safi
== SAFI_UNICAST
)
7462 vty_frame(vty
, "ipv6 unicast");
7463 else if (safi
== SAFI_LABELED_UNICAST
)
7464 vty_frame(vty
, "ipv6 labeled-unicast");
7465 else if (safi
== SAFI_MULTICAST
)
7466 vty_frame(vty
, "ipv6 multicast");
7467 else if (safi
== SAFI_MPLS_VPN
)
7468 vty_frame(vty
, "ipv6 vpn");
7469 else if (safi
== SAFI_ENCAP
)
7470 vty_frame(vty
, "ipv6 encap");
7471 else if (safi
== SAFI_FLOWSPEC
)
7472 vty_frame(vty
, "ipv6 flowspec");
7473 } else if (afi
== AFI_L2VPN
) {
7474 if (safi
== SAFI_EVPN
)
7475 vty_frame(vty
, "l2vpn evpn");
7477 vty_frame(vty
, "\n");
7479 bgp_config_write_distance(vty
, bgp
, afi
, safi
);
7481 bgp_config_write_network(vty
, bgp
, afi
, safi
);
7483 bgp_config_write_redistribute(vty
, bgp
, afi
, safi
);
7485 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
7486 bgp_config_write_peer_af(vty
, bgp
, group
->conf
, afi
, safi
);
7488 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7489 /* Skip dynamic neighbors. */
7490 if (peer_dynamic_neighbor(peer
))
7493 /* Do not display doppelganger peers */
7494 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7495 bgp_config_write_peer_af(vty
, bgp
, peer
, afi
, safi
);
7498 bgp_config_write_maxpaths(vty
, bgp
, afi
, safi
);
7499 bgp_config_write_table_map(vty
, bgp
, afi
, safi
);
7501 if (safi
== SAFI_EVPN
)
7502 bgp_config_write_evpn_info(vty
, bgp
, afi
, safi
);
7504 if (safi
== SAFI_FLOWSPEC
)
7505 bgp_fs_config_write_pbr(vty
, bgp
, afi
, safi
);
7507 if (safi
== SAFI_UNICAST
) {
7508 bgp_vpn_policy_config_write_afi(vty
, bgp
, afi
);
7509 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7510 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)) {
7512 vty_out(vty
, " export vpn\n");
7514 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7515 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
7517 vty_out(vty
, " import vpn\n");
7519 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7520 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
7521 struct listnode
*node
;
7524 for (ALL_LIST_ELEMENTS_RO(
7525 bgp
->vpn_policy
[afi
].import_vrf
, node
,
7527 vty_out(vty
, " import vrf %s\n", name
);
7531 vty_endframe(vty
, " exit-address-family\n");
7534 /* clang-format off */
7535 #if defined(VERSION_TYPE_DEV) && CONFDATE > 20180517
7536 CPP_NOTICE("bgpd: remove 'bgp enforce-first-as' config migration from bgp_config_write")
7538 /* clang-format on */
7540 int bgp_config_write(struct vty
*vty
)
7544 struct peer_group
*group
;
7546 struct listnode
*node
, *nnode
;
7547 struct listnode
*mnode
, *mnnode
;
7549 /* BGP Multiple instance. */
7550 if (!bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
7551 vty_out(vty
, "no bgp multiple-instance\n");
7555 /* BGP Config type. */
7556 if (bgp_option_check(BGP_OPT_CONFIG_CISCO
)) {
7557 vty_out(vty
, "bgp config-type cisco\n");
7561 if (bm
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
7562 vty_out(vty
, "bgp route-map delay-timer %u\n",
7563 bm
->rmap_update_timer
);
7566 vty_out(vty
, "!\n");
7568 /* BGP configuration. */
7569 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
7571 /* skip all auto created vrf as they dont have user config */
7572 if (CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
))
7575 /* Migrate deprecated 'bgp enforce-first-as'
7576 * config to 'neighbor * enforce-first-as' configs
7578 if (bgp_flag_check(bgp
, BGP_FLAG_ENFORCE_FIRST_AS
)) {
7579 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
7580 peer_flag_set(peer
, PEER_FLAG_ENFORCE_FIRST_AS
);
7581 bgp_flag_unset(bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
7584 /* Router bgp ASN */
7585 vty_out(vty
, "router bgp %u", bgp
->as
);
7587 if (bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
7589 vty_out(vty
, " %s %s",
7591 == BGP_INSTANCE_TYPE_VIEW
)
7598 /* No Synchronization */
7599 if (bgp_option_check(BGP_OPT_CONFIG_CISCO
))
7600 vty_out(vty
, " no synchronization\n");
7602 /* BGP fast-external-failover. */
7603 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
7604 vty_out(vty
, " no bgp fast-external-failover\n");
7606 /* BGP router ID. */
7607 if (bgp
->router_id_static
.s_addr
!= 0)
7608 vty_out(vty
, " bgp router-id %s\n",
7609 inet_ntoa(bgp
->router_id_static
));
7611 /* BGP log-neighbor-changes. */
7612 if (!!bgp_flag_check(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
7613 != DFLT_BGP_LOG_NEIGHBOR_CHANGES
)
7614 vty_out(vty
, " %sbgp log-neighbor-changes\n",
7616 BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
7620 /* BGP configuration. */
7621 if (bgp_flag_check(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
7622 vty_out(vty
, " bgp always-compare-med\n");
7624 /* BGP default ipv4-unicast. */
7625 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
7626 vty_out(vty
, " no bgp default ipv4-unicast\n");
7628 /* BGP default local-preference. */
7629 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
7630 vty_out(vty
, " bgp default local-preference %u\n",
7631 bgp
->default_local_pref
);
7633 /* BGP default show-hostname */
7634 if (!!bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
)
7635 != DFLT_BGP_SHOW_HOSTNAME
)
7636 vty_out(vty
, " %sbgp default show-hostname\n",
7637 bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
)
7641 /* BGP default subgroup-pkt-queue-max. */
7642 if (bgp
->default_subgroup_pkt_queue_max
7643 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
7644 vty_out(vty
, " bgp default subgroup-pkt-queue-max %u\n",
7645 bgp
->default_subgroup_pkt_queue_max
);
7647 /* BGP default autoshutdown neighbors */
7648 if (bgp
->autoshutdown
)
7649 vty_out(vty
, " bgp default shutdown\n");
7651 /* BGP client-to-client reflection. */
7652 if (bgp_flag_check(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
7653 vty_out(vty
, " no bgp client-to-client reflection\n");
7655 /* BGP cluster ID. */
7656 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
7657 vty_out(vty
, " bgp cluster-id %s\n",
7658 inet_ntoa(bgp
->cluster_id
));
7660 /* Disable ebgp connected nexthop check */
7661 if (bgp_flag_check(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
7663 " bgp disable-ebgp-connected-route-check\n");
7665 /* Confederation identifier*/
7666 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
7667 vty_out(vty
, " bgp confederation identifier %i\n",
7670 /* Confederation peer */
7671 if (bgp
->confed_peers_cnt
> 0) {
7674 vty_out(vty
, " bgp confederation peers");
7676 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
7677 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
7682 /* BGP deterministic-med. */
7683 if (!!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)
7684 != DFLT_BGP_DETERMINISTIC_MED
)
7685 vty_out(vty
, " %sbgp deterministic-med\n",
7686 bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)
7690 /* BGP update-delay. */
7691 bgp_config_write_update_delay(vty
, bgp
);
7693 if (bgp
->v_maxmed_onstartup
7694 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED
) {
7695 vty_out(vty
, " bgp max-med on-startup %u",
7696 bgp
->v_maxmed_onstartup
);
7697 if (bgp
->maxmed_onstartup_value
7698 != BGP_MAXMED_VALUE_DEFAULT
)
7700 bgp
->maxmed_onstartup_value
);
7703 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
) {
7704 vty_out(vty
, " bgp max-med administrative");
7705 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
7706 vty_out(vty
, " %u", bgp
->maxmed_admin_value
);
7711 bgp_config_write_wpkt_quanta(vty
, bgp
);
7713 bgp_config_write_rpkt_quanta(vty
, bgp
);
7716 bgp_config_write_coalesce_time(vty
, bgp
);
7718 /* BGP graceful-restart. */
7719 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
7721 " bgp graceful-restart stalepath-time %u\n",
7722 bgp
->stalepath_time
);
7723 if (bgp
->restart_time
!= BGP_DEFAULT_RESTART_TIME
)
7724 vty_out(vty
, " bgp graceful-restart restart-time %u\n",
7726 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_RESTART
))
7727 vty_out(vty
, " bgp graceful-restart\n");
7729 /* BGP graceful-shutdown */
7730 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
))
7731 vty_out(vty
, " bgp graceful-shutdown\n");
7733 /* BGP graceful-restart Preserve State F bit. */
7734 if (bgp_flag_check(bgp
, BGP_FLAG_GR_PRESERVE_FWD
))
7736 " bgp graceful-restart preserve-fw-state\n");
7738 /* BGP bestpath method. */
7739 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7740 vty_out(vty
, " bgp bestpath as-path ignore\n");
7741 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7742 vty_out(vty
, " bgp bestpath as-path confed\n");
7744 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7745 if (bgp_flag_check(bgp
,
7746 BGP_FLAG_MULTIPATH_RELAX_AS_SET
)) {
7748 " bgp bestpath as-path multipath-relax as-set\n");
7751 " bgp bestpath as-path multipath-relax\n");
7755 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
7757 " bgp route-reflector allow-outbound-policy\n");
7759 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7760 vty_out(vty
, " bgp bestpath compare-routerid\n");
7761 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7762 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7763 vty_out(vty
, " bgp bestpath med");
7764 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7765 vty_out(vty
, " confed");
7766 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7767 vty_out(vty
, " missing-as-worst");
7771 /* BGP network import check. */
7772 if (!!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)
7773 != DFLT_BGP_IMPORT_CHECK
)
7774 vty_out(vty
, " %sbgp network import-check\n",
7775 bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)
7779 /* BGP flag dampening. */
7780 if (CHECK_FLAG(bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
7781 BGP_CONFIG_DAMPENING
))
7782 bgp_config_write_damp(vty
);
7784 /* BGP timers configuration. */
7785 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
7786 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
7787 vty_out(vty
, " timers bgp %u %u\n",
7788 bgp
->default_keepalive
, bgp
->default_holdtime
);
7791 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
7792 bgp_config_write_peer_global(vty
, bgp
, group
->conf
);
7795 /* Normal neighbor configuration. */
7796 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7797 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7798 bgp_config_write_peer_global(vty
, bgp
, peer
);
7801 /* listen range and limit for dynamic BGP neighbors */
7802 bgp_config_write_listen(vty
, bgp
);
7804 /* No auto-summary */
7805 if (bgp_option_check(BGP_OPT_CONFIG_CISCO
))
7806 vty_out(vty
, " no auto-summary\n");
7808 /* IPv4 unicast configuration. */
7809 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_UNICAST
);
7811 /* IPv4 multicast configuration. */
7812 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
7814 /* IPv4 labeled-unicast configuration. */
7815 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_LABELED_UNICAST
);
7817 /* IPv4 VPN configuration. */
7818 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
7820 /* ENCAPv4 configuration. */
7821 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_ENCAP
);
7823 /* FLOWSPEC v4 configuration. */
7824 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_FLOWSPEC
);
7826 /* IPv6 unicast configuration. */
7827 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
7829 /* IPv6 multicast configuration. */
7830 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
7832 /* IPv6 labeled-unicast configuration. */
7833 bgp_config_write_family(vty
, bgp
, AFI_IP6
,
7834 SAFI_LABELED_UNICAST
);
7836 /* IPv6 VPN configuration. */
7837 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MPLS_VPN
);
7839 /* ENCAPv6 configuration. */
7840 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_ENCAP
);
7842 /* FLOWSPEC v6 configuration. */
7843 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_FLOWSPEC
);
7845 /* EVPN configuration. */
7846 bgp_config_write_family(vty
, bgp
, AFI_L2VPN
, SAFI_EVPN
);
7849 bgp_rfapi_cfg_write(vty
, bgp
);
7852 vty_out(vty
, "!\n");
7857 void bgp_master_init(struct thread_master
*master
)
7861 memset(&bgp_master
, 0, sizeof(struct bgp_master
));
7864 bm
->bgp
= list_new();
7865 bm
->listen_sockets
= list_new();
7866 bm
->port
= BGP_PORT_DEFAULT
;
7867 bm
->master
= master
;
7868 bm
->start_time
= bgp_clock();
7869 bm
->t_rmap_update
= NULL
;
7870 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
7871 bm
->terminating
= false;
7873 bgp_process_queue_init();
7875 /* init the rd id space.
7876 assign 0th index in the bitfield,
7877 so that we start with id 1
7879 bf_init(bm
->rd_idspace
, UINT16_MAX
);
7880 bf_assign_zero_index(bm
->rd_idspace
);
7882 /* Enable multiple instances by default. */
7883 bgp_option_set(BGP_OPT_MULTIPLE_INSTANCE
);
7885 /* mpls label dynamic allocation pool */
7886 bgp_lp_init(bm
->master
, &bm
->labelpool
);
7888 QOBJ_REG(bm
, bgp_master
);
7892 * Free up connected routes and interfaces for a BGP instance. Invoked upon
7893 * instance delete (non-default only) or BGP exit.
7895 static void bgp_if_finish(struct bgp
*bgp
)
7897 struct vrf
*vrf
= vrf_lookup_by_id(bgp
->vrf_id
);
7898 struct interface
*ifp
;
7900 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
|| !vrf
)
7903 FOR_ALL_INTERFACES (vrf
, ifp
) {
7904 struct listnode
*c_node
, *c_nnode
;
7905 struct connected
*c
;
7907 for (ALL_LIST_ELEMENTS(ifp
->connected
, c_node
, c_nnode
, c
))
7908 bgp_connected_delete(bgp
, c
);
7912 extern void bgp_snmp_init(void);
7914 static void bgp_viewvrf_autocomplete(vector comps
, struct cmd_token
*token
)
7916 struct vrf
*vrf
= NULL
;
7917 struct listnode
*next
;
7920 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
7921 if (vrf
->vrf_id
!= VRF_DEFAULT
)
7922 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, vrf
->name
));
7925 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
7926 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_VIEW
)
7929 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, bgp
->name
));
7933 static const struct cmd_variable_handler bgp_viewvrf_var_handlers
[] = {
7934 {.tokenname
= "VIEWVRFNAME", .completions
= bgp_viewvrf_autocomplete
},
7935 {.completions
= NULL
},
7938 static void bgp_pthreads_init()
7942 struct frr_pthread_attr io
= {
7944 .start
= frr_pthread_attr_default
.start
,
7945 .stop
= frr_pthread_attr_default
.stop
,
7947 struct frr_pthread_attr ka
= {
7948 .id
= PTHREAD_KEEPALIVES
,
7949 .start
= bgp_keepalives_start
,
7950 .stop
= bgp_keepalives_stop
,
7952 frr_pthread_new(&io
, "BGP I/O thread");
7953 frr_pthread_new(&ka
, "BGP Keepalives thread");
7956 void bgp_pthreads_run()
7958 struct frr_pthread
*io
= frr_pthread_get(PTHREAD_IO
);
7959 struct frr_pthread
*ka
= frr_pthread_get(PTHREAD_KEEPALIVES
);
7961 frr_pthread_run(io
, NULL
);
7962 frr_pthread_run(ka
, NULL
);
7964 /* Wait until threads are ready. */
7965 frr_pthread_wait_running(io
);
7966 frr_pthread_wait_running(ka
);
7969 void bgp_pthreads_finish()
7971 frr_pthread_stop_all();
7972 frr_pthread_finish();
7978 /* allocates some vital data structures used by peer commands in
7981 /* pre-init pthreads */
7982 bgp_pthreads_init();
7985 bgp_zebra_init(bm
->master
);
7988 vnc_zebra_init(bm
->master
);
7991 /* BGP VTY commands installation. */
7999 bgp_route_map_init();
8000 bgp_scan_vty_init();
8005 bgp_ethernetvpn_init();
8006 bgp_flowspec_vty_init();
8008 /* Access list initialize. */
8010 access_list_add_hook(peer_distribute_update
);
8011 access_list_delete_hook(peer_distribute_update
);
8013 /* Filter list initialize. */
8015 as_list_add_hook(peer_aslist_add
);
8016 as_list_delete_hook(peer_aslist_del
);
8018 /* Prefix list initialize.*/
8020 prefix_list_add_hook(peer_prefix_list_update
);
8021 prefix_list_delete_hook(peer_prefix_list_update
);
8023 /* Community list initialize. */
8024 bgp_clist
= community_list_init();
8029 cmd_variable_handler_register(bgp_viewvrf_var_handlers
);
8032 void bgp_terminate(void)
8036 struct listnode
*node
, *nnode
;
8037 struct listnode
*mnode
, *mnnode
;
8041 /* Close the listener sockets first as this prevents peers from
8043 * to reconnect on receiving the peer unconfig message. In the presence
8044 * of a large number of peers this will ensure that no peer is left with
8045 * a dangling connection
8047 /* reverse bgp_master_init */
8050 if (bm
->listen_sockets
)
8051 list_delete_and_null(&bm
->listen_sockets
);
8053 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
))
8054 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
8055 if (peer
->status
== Established
8056 || peer
->status
== OpenSent
8057 || peer
->status
== OpenConfirm
)
8058 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
8059 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
8061 if (bm
->process_main_queue
)
8062 work_queue_free_and_null(&bm
->process_main_queue
);
8064 if (bm
->t_rmap_update
)
8065 BGP_TIMER_OFF(bm
->t_rmap_update
);