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 "lib/sockopt.h"
47 #include "frr_pthread.h"
50 #include "bgpd/bgpd.h"
51 #include "bgpd/bgp_table.h"
52 #include "bgpd/bgp_aspath.h"
53 #include "bgpd/bgp_route.h"
54 #include "bgpd/bgp_dump.h"
55 #include "bgpd/bgp_debug.h"
56 #include "bgpd/bgp_errors.h"
57 #include "bgpd/bgp_community.h"
58 #include "bgpd/bgp_community_alias.h"
59 #include "bgpd/bgp_conditional_adv.h"
60 #include "bgpd/bgp_attr.h"
61 #include "bgpd/bgp_regex.h"
62 #include "bgpd/bgp_clist.h"
63 #include "bgpd/bgp_fsm.h"
64 #include "bgpd/bgp_packet.h"
65 #include "bgpd/bgp_zebra.h"
66 #include "bgpd/bgp_open.h"
67 #include "bgpd/bgp_filter.h"
68 #include "bgpd/bgp_nexthop.h"
69 #include "bgpd/bgp_damp.h"
70 #include "bgpd/bgp_mplsvpn.h"
72 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
73 #include "bgpd/rfapi/rfapi_backend.h"
75 #include "bgpd/bgp_evpn.h"
76 #include "bgpd/bgp_advertise.h"
77 #include "bgpd/bgp_network.h"
78 #include "bgpd/bgp_vty.h"
79 #include "bgpd/bgp_mpath.h"
80 #include "bgpd/bgp_nht.h"
81 #include "bgpd/bgp_updgrp.h"
82 #include "bgpd/bgp_bfd.h"
83 #include "bgpd/bgp_memory.h"
84 #include "bgpd/bgp_evpn_vty.h"
85 #include "bgpd/bgp_keepalives.h"
86 #include "bgpd/bgp_io.h"
87 #include "bgpd/bgp_ecommunity.h"
88 #include "bgpd/bgp_flowspec.h"
89 #include "bgpd/bgp_labelpool.h"
90 #include "bgpd/bgp_pbr.h"
91 #include "bgpd/bgp_addpath.h"
92 #include "bgpd/bgp_evpn_private.h"
93 #include "bgpd/bgp_evpn_mh.h"
94 #include "bgpd/bgp_mac.h"
96 DEFINE_MTYPE_STATIC(BGPD
, PEER_TX_SHUTDOWN_MSG
, "Peer shutdown message (TX)");
97 DEFINE_MTYPE_STATIC(BGPD
, BGP_EVPN_INFO
, "BGP EVPN instance information");
98 DEFINE_QOBJ_TYPE(bgp_master
);
99 DEFINE_QOBJ_TYPE(bgp
);
100 DEFINE_QOBJ_TYPE(peer
);
101 DEFINE_HOOK(bgp_inst_delete
, (struct bgp
*bgp
), (bgp
));
103 /* BGP process wide configuration. */
104 static struct bgp_master bgp_master
;
106 /* BGP process wide configuration pointer to export. */
107 struct bgp_master
*bm
;
109 /* BGP community-list. */
110 struct community_list_handler
*bgp_clist
;
112 unsigned int multipath_num
= MULTIPATH_NUM
;
114 /* Number of bgp instances configured for suppress fib config */
115 unsigned int bgp_suppress_fib_count
;
117 static void bgp_if_finish(struct bgp
*bgp
);
118 static void peer_drop_dynamic_neighbor(struct peer
*peer
);
120 extern struct zclient
*zclient
;
122 /* handle main socket creation or deletion */
123 static int bgp_check_main_socket(bool create
, struct bgp
*bgp
)
125 static int bgp_server_main_created
;
126 struct listnode
*node
;
130 if (bgp_server_main_created
)
132 if (list_isempty(bm
->addresses
)) {
133 if (bgp_socket(bgp
, bm
->port
, NULL
) < 0)
134 return BGP_ERR_INVALID_VALUE
;
136 for (ALL_LIST_ELEMENTS_RO(bm
->addresses
, node
, address
))
137 if (bgp_socket(bgp
, bm
->port
, address
) < 0)
138 return BGP_ERR_INVALID_VALUE
;
140 bgp_server_main_created
= 1;
143 if (!bgp_server_main_created
)
146 bgp_server_main_created
= 0;
150 void bgp_session_reset(struct peer
*peer
)
152 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
153 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
154 peer_delete(peer
->doppelganger
);
156 BGP_EVENT_ADD(peer
, BGP_Stop
);
160 * During session reset, we may delete the doppelganger peer, which would
161 * be the next node to the current node. If the session reset was invoked
162 * during walk of peer list, we would end up accessing the freed next
163 * node. This function moves the next node along.
165 static void bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
170 n
= (nnode
) ? *nnode
: NULL
;
171 npeer
= (n
) ? listgetdata(n
) : NULL
;
173 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
174 && !(CHECK_FLAG(peer
->doppelganger
->flags
,
175 PEER_FLAG_CONFIG_NODE
))) {
176 if (peer
->doppelganger
== npeer
)
177 /* nnode and *nnode are confirmed to be non-NULL here */
178 *nnode
= (*nnode
)->next
;
179 peer_delete(peer
->doppelganger
);
182 BGP_EVENT_ADD(peer
, BGP_Stop
);
185 /* BGP global flag manipulation. */
186 int bgp_option_set(int flag
)
190 case BGP_OPT_NO_LISTEN
:
191 case BGP_OPT_NO_ZEBRA
:
192 SET_FLAG(bm
->options
, flag
);
195 return BGP_ERR_INVALID_FLAG
;
200 int bgp_option_unset(int flag
)
204 case BGP_OPT_NO_ZEBRA
:
206 UNSET_FLAG(bm
->options
, flag
);
209 return BGP_ERR_INVALID_FLAG
;
214 int bgp_option_check(int flag
)
216 return CHECK_FLAG(bm
->options
, flag
);
219 /* set the bgp no-rib option during runtime and remove installed routes */
220 void bgp_option_norib_set_runtime(void)
223 struct listnode
*node
;
227 if (bgp_option_check(BGP_OPT_NO_FIB
))
230 bgp_option_set(BGP_OPT_NO_FIB
);
232 zlog_info("Disabled BGP route installation to RIB (Zebra)");
234 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
)) {
235 FOREACH_AFI_SAFI (afi
, safi
) {
237 * Stop a crash, more work is needed
238 * here to properly add/remove these types of
241 if (!bgp_fibupd_safi(safi
))
244 bgp_zebra_withdraw_table_all_subtypes(bgp
, afi
, safi
);
248 zlog_info("All routes have been withdrawn from RIB (Zebra)");
251 /* unset the bgp no-rib option during runtime and announce routes to Zebra */
252 void bgp_option_norib_unset_runtime(void)
255 struct listnode
*node
;
259 if (!bgp_option_check(BGP_OPT_NO_FIB
))
262 bgp_option_unset(BGP_OPT_NO_FIB
);
264 zlog_info("Enabled BGP route installation to RIB (Zebra)");
266 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
)) {
267 FOREACH_AFI_SAFI (afi
, safi
) {
269 * Stop a crash, more work is needed
270 * here to properly add/remove these types
271 * of routes from zebra
273 if (!bgp_fibupd_safi(safi
))
276 bgp_zebra_announce_table_all_subtypes(bgp
, afi
, safi
);
280 zlog_info("All routes have been installed in RIB (Zebra)");
283 /* Internal function to set BGP structure configureation flag. */
284 static void bgp_config_set(struct bgp
*bgp
, int config
)
286 SET_FLAG(bgp
->config
, config
);
289 static void bgp_config_unset(struct bgp
*bgp
, int config
)
291 UNSET_FLAG(bgp
->config
, config
);
294 static int bgp_config_check(struct bgp
*bgp
, int config
)
296 return CHECK_FLAG(bgp
->config
, config
);
299 /* Set BGP router identifier; distinguish between explicit config and other
302 static int bgp_router_id_set(struct bgp
*bgp
, const struct in_addr
*id
,
306 struct listnode
*node
, *nnode
;
308 if (IPV4_ADDR_SAME(&bgp
->router_id
, id
))
311 /* EVPN uses router id in RD, withdraw them */
312 if (is_evpn_enabled())
313 bgp_evpn_handle_router_id_update(bgp
, true);
315 vpn_handle_router_id_update(bgp
, true, is_config
);
317 IPV4_ADDR_COPY(&bgp
->router_id
, id
);
319 /* Set all peer's local identifier with this value. */
320 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
321 IPV4_ADDR_COPY(&peer
->local_id
, id
);
323 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
324 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
325 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
326 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
330 /* EVPN uses router id in RD, update them */
331 if (is_evpn_enabled())
332 bgp_evpn_handle_router_id_update(bgp
, false);
334 vpn_handle_router_id_update(bgp
, false, is_config
);
339 void bgp_router_id_zebra_bump(vrf_id_t vrf_id
, const struct prefix
*router_id
)
341 struct listnode
*node
, *nnode
;
343 struct in_addr
*addr
= NULL
;
345 if (router_id
!= NULL
)
346 addr
= (struct in_addr
*)&(router_id
->u
.prefix4
);
348 if (vrf_id
== VRF_DEFAULT
) {
349 /* Router-id change for default VRF has to also update all
351 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
352 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
356 bgp
->router_id_zebra
= *addr
;
358 addr
= &bgp
->router_id_zebra
;
360 if (!bgp
->router_id_static
.s_addr
) {
361 /* Router ID is updated if there are no active
364 if (bgp
->established_peers
== 0) {
365 if (BGP_DEBUG(zebra
, ZEBRA
))
367 "RID change : vrf %s(%u), RTR ID %pI4",
371 * if old router-id was 0x0, set flag
372 * to use this new value
374 bgp_router_id_set(bgp
, addr
,
375 (bgp
->router_id
.s_addr
383 bgp
= bgp_lookup_by_vrf_id(vrf_id
);
386 bgp
->router_id_zebra
= *addr
;
388 addr
= &bgp
->router_id_zebra
;
390 if (!bgp
->router_id_static
.s_addr
) {
391 /* Router ID is updated if there are no active
394 if (bgp
->established_peers
== 0) {
395 if (BGP_DEBUG(zebra
, ZEBRA
))
397 "RID change : vrf %s(%u), RTR ID %pI4",
401 * if old router-id was 0x0, set flag
402 * to use this new value
404 bgp_router_id_set(bgp
, addr
,
405 (bgp
->router_id
.s_addr
416 void bgp_router_id_static_set(struct bgp
*bgp
, struct in_addr id
)
418 bgp
->router_id_static
= id
;
419 bgp_router_id_set(bgp
,
420 id
.s_addr
!= INADDR_ANY
? &id
: &bgp
->router_id_zebra
,
421 true /* is config */);
424 void bm_wait_for_fib_set(bool set
)
426 bool send_msg
= false;
428 if (bm
->wait_for_fib
== set
)
431 bm
->wait_for_fib
= set
;
433 if (bgp_suppress_fib_count
== 0)
435 bgp_suppress_fib_count
++;
437 bgp_suppress_fib_count
--;
438 if (bgp_suppress_fib_count
== 0)
442 if (send_msg
&& zclient
)
443 zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST
,
447 /* Set the suppress fib pending for the bgp configuration */
448 void bgp_suppress_fib_pending_set(struct bgp
*bgp
, bool set
)
450 bool send_msg
= false;
452 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
456 SET_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_FIB_PENDING
);
457 /* Send msg to zebra for the first instance of bgp enabled
460 if (bgp_suppress_fib_count
== 0)
462 bgp_suppress_fib_count
++;
464 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_FIB_PENDING
);
465 bgp_suppress_fib_count
--;
467 /* Send msg to zebra if there are no instances enabled
470 if (bgp_suppress_fib_count
== 0)
473 /* Send route notify request to RIB */
475 if (BGP_DEBUG(zebra
, ZEBRA
))
476 zlog_debug("Sending ZEBRA_ROUTE_NOTIFY_REQUEST");
479 zebra_route_notify_send(ZEBRA_ROUTE_NOTIFY_REQUEST
,
484 /* BGP's cluster-id control. */
485 void bgp_cluster_id_set(struct bgp
*bgp
, struct in_addr
*cluster_id
)
488 struct listnode
*node
, *nnode
;
490 if (bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
)
491 && IPV4_ADDR_SAME(&bgp
->cluster_id
, cluster_id
))
494 IPV4_ADDR_COPY(&bgp
->cluster_id
, cluster_id
);
495 bgp_config_set(bgp
, BGP_CONFIG_CLUSTER_ID
);
497 /* Clear all IBGP peer. */
498 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
499 if (peer
->sort
!= BGP_PEER_IBGP
)
502 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
503 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
504 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
505 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
510 void bgp_cluster_id_unset(struct bgp
*bgp
)
513 struct listnode
*node
, *nnode
;
515 if (!bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
))
518 bgp
->cluster_id
.s_addr
= 0;
519 bgp_config_unset(bgp
, BGP_CONFIG_CLUSTER_ID
);
521 /* Clear all IBGP peer. */
522 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
523 if (peer
->sort
!= BGP_PEER_IBGP
)
526 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
527 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
528 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
529 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
534 /* BGP timer configuration. */
535 void bgp_timers_set(struct bgp
*bgp
, uint32_t keepalive
, uint32_t holdtime
,
536 uint32_t connect_retry
, uint32_t delayopen
)
538 bgp
->default_keepalive
=
539 (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
540 bgp
->default_holdtime
= holdtime
;
541 bgp
->default_connect_retry
= connect_retry
;
542 bgp
->default_delayopen
= delayopen
;
545 /* mostly for completeness - CLI uses its own defaults */
546 void bgp_timers_unset(struct bgp
*bgp
)
548 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
549 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
550 bgp
->default_connect_retry
= BGP_DEFAULT_CONNECT_RETRY
;
551 bgp
->default_delayopen
= BGP_DEFAULT_DELAYOPEN
;
554 /* BGP confederation configuration. */
555 void bgp_confederation_id_set(struct bgp
*bgp
, as_t as
)
558 struct listnode
*node
, *nnode
;
564 /* Remember - were we doing confederation before? */
565 already_confed
= bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
);
567 bgp_config_set(bgp
, BGP_CONFIG_CONFEDERATION
);
569 /* If we were doing confederation already, this is just an external
570 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
571 were not doing confederation before, reset all EBGP sessions. */
572 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
573 enum bgp_peer_sort ptype
= peer_sort(peer
);
575 /* We're looking for peers who's AS is not local or part of our
577 if (already_confed
) {
578 if (ptype
== BGP_PEER_EBGP
) {
580 if (BGP_IS_VALID_STATE_FOR_NOTIF(
583 PEER_DOWN_CONFED_ID_CHANGE
;
585 peer
, BGP_NOTIFY_CEASE
,
586 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
588 bgp_session_reset_safe(peer
, &nnode
);
591 /* Not doign confederation before, so reset every
594 if (ptype
!= BGP_PEER_IBGP
) {
595 /* Reset the local_as to be our EBGP one */
596 if (ptype
== BGP_PEER_EBGP
)
598 if (BGP_IS_VALID_STATE_FOR_NOTIF(
601 PEER_DOWN_CONFED_ID_CHANGE
;
603 peer
, BGP_NOTIFY_CEASE
,
604 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
606 bgp_session_reset_safe(peer
, &nnode
);
613 void bgp_confederation_id_unset(struct bgp
*bgp
)
616 struct listnode
*node
, *nnode
;
619 bgp_config_unset(bgp
, BGP_CONFIG_CONFEDERATION
);
621 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
622 /* We're looking for peers who's AS is not local */
623 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
624 peer
->local_as
= bgp
->as
;
625 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
626 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
627 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
628 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
632 bgp_session_reset_safe(peer
, &nnode
);
637 /* Is an AS part of the confed or not? */
638 bool bgp_confederation_peers_check(struct bgp
*bgp
, as_t as
)
645 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
646 if (bgp
->confed_peers
[i
] == as
)
652 /* Add an AS to the confederation set. */
653 void bgp_confederation_peers_add(struct bgp
*bgp
, as_t as
)
656 struct listnode
*node
, *nnode
;
661 if (bgp_confederation_peers_check(bgp
, as
))
665 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
666 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
668 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
669 bgp
->confed_peers_cnt
++;
671 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
672 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
673 if (peer
->as
== as
) {
674 (void)peer_sort(peer
);
675 peer
->local_as
= bgp
->as
;
676 if (BGP_IS_VALID_STATE_FOR_NOTIF(
679 PEER_DOWN_CONFED_PEER_CHANGE
;
681 peer
, BGP_NOTIFY_CEASE
,
682 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
684 bgp_session_reset_safe(peer
, &nnode
);
690 /* Delete an AS from the confederation set. */
691 void bgp_confederation_peers_remove(struct bgp
*bgp
, as_t as
)
696 struct listnode
*node
, *nnode
;
701 if (!bgp_confederation_peers_check(bgp
, as
))
704 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
705 if (bgp
->confed_peers
[i
] == as
)
706 for (j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
707 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
709 bgp
->confed_peers_cnt
--;
711 if (bgp
->confed_peers_cnt
== 0) {
712 if (bgp
->confed_peers
)
713 XFREE(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
714 bgp
->confed_peers
= NULL
;
717 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
718 bgp
->confed_peers_cnt
* sizeof(as_t
));
720 /* Now reset any peer who's remote AS has just been removed from the
722 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
723 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
724 if (peer
->as
== as
) {
725 (void)peer_sort(peer
);
726 peer
->local_as
= bgp
->confed_id
;
727 if (BGP_IS_VALID_STATE_FOR_NOTIF(
730 PEER_DOWN_CONFED_PEER_CHANGE
;
732 peer
, BGP_NOTIFY_CEASE
,
733 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
735 bgp_session_reset_safe(peer
, &nnode
);
741 /* Local preference configuration. */
742 void bgp_default_local_preference_set(struct bgp
*bgp
, uint32_t local_pref
)
747 bgp
->default_local_pref
= local_pref
;
750 void bgp_default_local_preference_unset(struct bgp
*bgp
)
755 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
758 /* Local preference configuration. */
759 void bgp_default_subgroup_pkt_queue_max_set(struct bgp
*bgp
,
765 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
768 void bgp_default_subgroup_pkt_queue_max_unset(struct bgp
*bgp
)
772 bgp
->default_subgroup_pkt_queue_max
=
773 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
776 /* Listen limit configuration. */
777 void bgp_listen_limit_set(struct bgp
*bgp
, int listen_limit
)
782 bgp
->dynamic_neighbors_limit
= listen_limit
;
785 void bgp_listen_limit_unset(struct bgp
*bgp
)
790 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
793 int bgp_map_afi_safi_iana2int(iana_afi_t pkt_afi
, iana_safi_t pkt_safi
,
794 afi_t
*afi
, safi_t
*safi
)
796 /* Map from IANA values to internal values, return error if
797 * values are unrecognized.
799 *afi
= afi_iana2int(pkt_afi
);
800 *safi
= safi_iana2int(pkt_safi
);
801 if (*afi
== AFI_MAX
|| *safi
== SAFI_MAX
)
807 int bgp_map_afi_safi_int2iana(afi_t afi
, safi_t safi
, iana_afi_t
*pkt_afi
,
808 iana_safi_t
*pkt_safi
)
810 /* Map from internal values to IANA values, return error if
811 * internal values are bad (unexpected).
813 if (afi
== AFI_MAX
|| safi
== SAFI_MAX
)
815 *pkt_afi
= afi_int2iana(afi
);
816 *pkt_safi
= safi_int2iana(safi
);
820 struct peer_af
*peer_af_create(struct peer
*peer
, afi_t afi
, safi_t safi
)
829 afid
= afindex(afi
, safi
);
830 if (afid
>= BGP_AF_MAX
)
834 assert(peer
->peer_af_array
[afid
] == NULL
);
836 /* Allocate new peer af */
837 af
= XCALLOC(MTYPE_BGP_PEER_AF
, sizeof(struct peer_af
));
839 peer
->peer_af_array
[afid
] = af
;
844 bgp
->af_peer_count
[afi
][safi
]++;
849 struct peer_af
*peer_af_find(struct peer
*peer
, afi_t afi
, safi_t safi
)
856 afid
= afindex(afi
, safi
);
857 if (afid
>= BGP_AF_MAX
)
860 return peer
->peer_af_array
[afid
];
863 int peer_af_delete(struct peer
*peer
, afi_t afi
, safi_t safi
)
872 afid
= afindex(afi
, safi
);
873 if (afid
>= BGP_AF_MAX
)
876 af
= peer
->peer_af_array
[afid
];
881 bgp_soft_reconfig_table_task_cancel(bgp
, bgp
->rib
[afi
][safi
], peer
);
883 bgp_stop_announce_route_timer(af
);
885 if (PAF_SUBGRP(af
)) {
886 if (BGP_DEBUG(update_groups
, UPDATE_GROUPS
))
887 zlog_debug("u%" PRIu64
":s%" PRIu64
" remove peer %s",
888 af
->subgroup
->update_group
->id
,
889 af
->subgroup
->id
, peer
->host
);
893 update_subgroup_remove_peer(af
->subgroup
, af
);
895 if (bgp
->af_peer_count
[afi
][safi
])
896 bgp
->af_peer_count
[afi
][safi
]--;
898 peer
->peer_af_array
[afid
] = NULL
;
899 XFREE(MTYPE_BGP_PEER_AF
, af
);
903 /* Peer comparison function for sorting. */
904 int peer_cmp(struct peer
*p1
, struct peer
*p2
)
906 if (p1
->group
&& !p2
->group
)
909 if (!p1
->group
&& p2
->group
)
912 if (p1
->group
== p2
->group
) {
913 if (p1
->conf_if
&& !p2
->conf_if
)
916 if (!p1
->conf_if
&& p2
->conf_if
)
919 if (p1
->conf_if
&& p2
->conf_if
)
920 return if_cmp_name_func(p1
->conf_if
, p2
->conf_if
);
922 return strcmp(p1
->group
->name
, p2
->group
->name
);
924 return sockunion_cmp(&p1
->su
, &p2
->su
);
927 static unsigned int peer_hash_key_make(const void *p
)
929 const struct peer
*peer
= p
;
930 return sockunion_hash(&peer
->su
);
933 static bool peer_hash_same(const void *p1
, const void *p2
)
935 const struct peer
*peer1
= p1
;
936 const struct peer
*peer2
= p2
;
937 return (sockunion_same(&peer1
->su
, &peer2
->su
)
938 && CHECK_FLAG(peer1
->flags
, PEER_FLAG_CONFIG_NODE
)
939 == CHECK_FLAG(peer2
->flags
, PEER_FLAG_CONFIG_NODE
));
942 void peer_flag_inherit(struct peer
*peer
, uint64_t flag
)
946 /* Skip if peer is not a peer-group member. */
947 if (!peer_group_active(peer
))
950 /* Unset override flag to signal inheritance from peer-group. */
951 UNSET_FLAG(peer
->flags_override
, flag
);
954 * Inherit flag state from peer-group. If the flag of the peer-group is
955 * not being inverted, the peer must inherit the inverse of the current
956 * peer-group flag state.
958 group_val
= CHECK_FLAG(peer
->group
->conf
->flags
, flag
);
959 if (!CHECK_FLAG(peer
->group
->conf
->flags_invert
, flag
)
960 && CHECK_FLAG(peer
->flags_invert
, flag
))
961 COND_FLAG(peer
->flags
, flag
, !group_val
);
963 COND_FLAG(peer
->flags
, flag
, group_val
);
966 int peer_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
968 return CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
);
971 void peer_af_flag_inherit(struct peer
*peer
, afi_t afi
, safi_t safi
,
976 /* Skip if peer is not a peer-group member. */
977 if (!peer_group_active(peer
))
980 /* Unset override flag to signal inheritance from peer-group. */
981 UNSET_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
984 * Inherit flag state from peer-group. If the flag of the peer-group is
985 * not being inverted, the peer must inherit the inverse of the current
986 * peer-group flag state.
988 group_val
= CHECK_FLAG(peer
->group
->conf
->af_flags
[afi
][safi
], flag
);
989 if (!CHECK_FLAG(peer
->group
->conf
->af_flags_invert
[afi
][safi
], flag
)
990 && CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
991 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, !group_val
);
993 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, group_val
);
996 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
997 static inline enum bgp_peer_sort
peer_calc_sort(struct peer
*peer
)
1004 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1005 if (peer
->as_type
== AS_INTERNAL
)
1006 return BGP_PEER_IBGP
;
1008 else if (peer
->as_type
== AS_EXTERNAL
)
1009 return BGP_PEER_EBGP
;
1011 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
) {
1013 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
1020 assert(peer
->group
);
1021 peer1
= listnode_head(peer
->group
->peer
);
1026 return BGP_PEER_INTERNAL
;
1030 if (bgp
&& CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)) {
1031 if (peer
->local_as
== 0)
1032 return BGP_PEER_INTERNAL
;
1034 if (peer
->local_as
== peer
->as
) {
1035 if (bgp
->as
== bgp
->confed_id
) {
1036 if (peer
->local_as
== bgp
->as
)
1037 return BGP_PEER_IBGP
;
1039 return BGP_PEER_EBGP
;
1041 if (peer
->local_as
== bgp
->confed_id
)
1042 return BGP_PEER_EBGP
;
1044 return BGP_PEER_IBGP
;
1048 if (bgp_confederation_peers_check(bgp
, peer
->as
))
1049 return BGP_PEER_CONFED
;
1051 return BGP_PEER_EBGP
;
1053 if (peer
->as_type
== AS_UNSPECIFIED
) {
1054 /* check if in peer-group with AS information */
1056 && (peer
->group
->conf
->as_type
!= AS_UNSPECIFIED
)) {
1057 if (peer
->group
->conf
->as_type
1060 == peer
->group
->conf
->as
)
1061 return BGP_PEER_IBGP
;
1063 return BGP_PEER_EBGP
;
1064 } else if (peer
->group
->conf
->as_type
1066 return BGP_PEER_IBGP
;
1068 return BGP_PEER_EBGP
;
1070 /* no AS information anywhere, let caller know */
1071 return BGP_PEER_UNSPECIFIED
;
1072 } else if (peer
->as_type
!= AS_SPECIFIED
)
1073 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
1076 return (peer
->local_as
== 0
1078 : peer
->local_as
== peer
->as
? BGP_PEER_IBGP
1083 /* Calculate and cache the peer "sort" */
1084 enum bgp_peer_sort
peer_sort(struct peer
*peer
)
1086 peer
->sort
= peer_calc_sort(peer
);
1090 enum bgp_peer_sort
peer_sort_lookup(struct peer
*peer
)
1095 static void peer_free(struct peer
*peer
)
1100 assert(peer
->status
== Deleted
);
1104 /* this /ought/ to have been done already through bgp_stop earlier,
1105 * but just to be sure..
1107 bgp_timer_set(peer
);
1108 bgp_reads_off(peer
);
1109 bgp_writes_off(peer
);
1110 assert(!peer
->t_write
);
1111 assert(!peer
->t_read
);
1112 BGP_EVENT_FLUSH(peer
);
1114 pthread_mutex_destroy(&peer
->io_mtx
);
1116 /* Free connected nexthop, if present */
1117 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
)
1118 && !peer_dynamic_neighbor(peer
))
1119 bgp_delete_connected_nexthop(family2afi(peer
->su
.sa
.sa_family
),
1122 FOREACH_AFI_SAFI (afi
, safi
) {
1123 if (peer
->filter
[afi
][safi
].advmap
.aname
)
1124 XFREE(MTYPE_BGP_FILTER_NAME
,
1125 peer
->filter
[afi
][safi
].advmap
.aname
);
1126 if (peer
->filter
[afi
][safi
].advmap
.cname
)
1127 XFREE(MTYPE_BGP_FILTER_NAME
,
1128 peer
->filter
[afi
][safi
].advmap
.cname
);
1131 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
1133 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
1134 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1135 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
1136 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
1138 /* Update source configuration. */
1139 if (peer
->update_source
) {
1140 sockunion_free(peer
->update_source
);
1141 peer
->update_source
= NULL
;
1144 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1146 XFREE(MTYPE_BGP_NOTIFICATION
, peer
->notify
.data
);
1147 memset(&peer
->notify
, 0, sizeof(struct bgp_notify
));
1149 if (peer
->clear_node_queue
)
1150 work_queue_free_and_null(&peer
->clear_node_queue
);
1152 bgp_sync_delete(peer
);
1154 XFREE(MTYPE_PEER_CONF_IF
, peer
->conf_if
);
1156 /* Remove BFD configuration. */
1157 if (peer
->bfd_config
)
1158 bgp_peer_remove_bfd_config(peer
);
1160 FOREACH_AFI_SAFI (afi
, safi
)
1161 bgp_addpath_set_peer_type(peer
, afi
, safi
, BGP_ADDPATH_NONE
);
1163 bgp_unlock(peer
->bgp
);
1165 memset(peer
, 0, sizeof(struct peer
));
1167 XFREE(MTYPE_BGP_PEER
, peer
);
1170 /* increase reference count on a struct peer */
1171 struct peer
*peer_lock_with_caller(const char *name
, struct peer
*peer
)
1173 assert(peer
&& (peer
->lock
>= 0));
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));
1189 if (peer
->lock
== 0) {
1196 /* BGP GR changes */
1198 int bgp_global_gr_init(struct bgp
*bgp
)
1200 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1201 zlog_debug("%s called ..", __func__
);
1203 int local_GLOBAL_GR_FSM
[BGP_GLOBAL_GR_MODE
][BGP_GLOBAL_GR_EVENT_CMD
] = {
1204 /* GLOBAL_HELPER Mode */
1207 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1208 GLOBAL_GR
, GLOBAL_INVALID
,
1209 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1210 GLOBAL_DISABLE
, GLOBAL_INVALID
1212 /* GLOBAL_GR Mode */
1215 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1216 GLOBAL_GR
, GLOBAL_HELPER
,
1217 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1218 GLOBAL_DISABLE
, GLOBAL_INVALID
1220 /* GLOBAL_DISABLE Mode */
1223 /*GLOBAL_GR_cmd */ /*no_Global_GR_cmd*/
1224 GLOBAL_GR
, GLOBAL_INVALID
,
1225 /*GLOBAL_DISABLE_cmd*//*no_Global_Disable_cmd*/
1226 GLOBAL_INVALID
, GLOBAL_HELPER
1228 /* GLOBAL_INVALID Mode */
1231 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1232 GLOBAL_INVALID
, GLOBAL_INVALID
,
1233 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1234 GLOBAL_INVALID
, GLOBAL_INVALID
1237 memcpy(bgp
->GLOBAL_GR_FSM
, local_GLOBAL_GR_FSM
,
1238 sizeof(local_GLOBAL_GR_FSM
));
1240 bgp
->global_gr_present_state
= GLOBAL_HELPER
;
1241 bgp
->present_zebra_gr_state
= ZEBRA_GR_DISABLE
;
1243 return BGP_GR_SUCCESS
;
1246 int bgp_peer_gr_init(struct peer
*peer
)
1248 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1249 zlog_debug("%s called ..", __func__
);
1251 struct bgp_peer_gr local_Peer_GR_FSM
[BGP_PEER_GR_MODE
]
1252 [BGP_PEER_GR_EVENT_CMD
] = {
1254 /* PEER_HELPER Mode */
1255 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1256 { PEER_GR
, bgp_peer_gr_action
}, {PEER_INVALID
, NULL
},
1257 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1258 {PEER_DISABLE
, bgp_peer_gr_action
}, {PEER_INVALID
, NULL
},
1259 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1260 { PEER_INVALID
, NULL
}, {PEER_GLOBAL_INHERIT
,
1261 bgp_peer_gr_action
}
1265 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1266 { PEER_INVALID
, NULL
}, { PEER_GLOBAL_INHERIT
,
1267 bgp_peer_gr_action
},
1268 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1269 {PEER_DISABLE
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1270 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1271 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1274 /* PEER_DISABLE Mode */
1275 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1276 { PEER_GR
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1277 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1278 { PEER_INVALID
, NULL
}, { PEER_GLOBAL_INHERIT
,
1279 bgp_peer_gr_action
},
1280 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1281 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1284 /* PEER_INVALID Mode */
1285 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1286 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1287 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1288 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1289 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1290 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1293 /* PEER_GLOBAL_INHERIT Mode */
1294 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1295 { PEER_GR
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1296 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1297 { PEER_DISABLE
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1298 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1299 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1302 memcpy(&peer
->PEER_GR_FSM
, local_Peer_GR_FSM
,
1303 sizeof(local_Peer_GR_FSM
));
1304 peer
->peer_gr_present_state
= PEER_GLOBAL_INHERIT
;
1305 bgp_peer_move_to_gr_mode(peer
, PEER_GLOBAL_INHERIT
);
1307 return BGP_GR_SUCCESS
;
1310 static void bgp_srv6_init(struct bgp
*bgp
)
1312 bgp
->srv6_enabled
= false;
1313 memset(bgp
->srv6_locator_name
, 0, sizeof(bgp
->srv6_locator_name
));
1314 bgp
->srv6_locator_chunks
= list_new();
1315 bgp
->srv6_functions
= list_new();
1318 static void bgp_srv6_cleanup(struct bgp
*bgp
)
1320 if (bgp
->srv6_locator_chunks
)
1321 list_delete(&bgp
->srv6_locator_chunks
);
1322 if (bgp
->srv6_functions
)
1323 list_delete(&bgp
->srv6_functions
);
1326 /* Allocate new peer object, implicitely locked. */
1327 struct peer
*peer_new(struct bgp
*bgp
)
1334 /* bgp argument is absolutely required */
1337 /* Allocate new peer. */
1338 peer
= XCALLOC(MTYPE_BGP_PEER
, sizeof(struct peer
));
1340 /* Set default value. */
1342 peer
->v_start
= BGP_INIT_START_TIMER
;
1343 peer
->v_connect
= bgp
->default_connect_retry
;
1344 peer
->status
= Idle
;
1345 peer
->ostatus
= Idle
;
1346 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1347 peer
->bgp
= bgp_lock(bgp
);
1348 peer
= peer_lock(peer
); /* initial reference */
1349 peer
->local_role
= ROLE_UNDEFINED
;
1350 peer
->remote_role
= ROLE_UNDEFINED
;
1351 peer
->password
= NULL
;
1352 peer
->max_packet_size
= BGP_STANDARD_MESSAGE_MAX_PACKET_SIZE
;
1354 /* Set default flags. */
1355 FOREACH_AFI_SAFI (afi
, safi
) {
1356 SET_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1357 SET_FLAG(peer
->af_flags
[afi
][safi
],
1358 PEER_FLAG_SEND_EXT_COMMUNITY
);
1359 SET_FLAG(peer
->af_flags
[afi
][safi
],
1360 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1362 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1363 PEER_FLAG_SEND_COMMUNITY
);
1364 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1365 PEER_FLAG_SEND_EXT_COMMUNITY
);
1366 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1367 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1368 peer
->addpath_type
[afi
][safi
] = BGP_ADDPATH_NONE
;
1369 peer
->soo
[afi
][safi
] = NULL
;
1372 /* set nexthop-unchanged for l2vpn evpn by default */
1373 SET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1374 PEER_FLAG_NEXTHOP_UNCHANGED
);
1376 SET_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1378 /* Initialize per peer bgp GR FSM */
1379 bgp_peer_gr_init(peer
);
1381 /* Create buffers. */
1382 peer
->ibuf
= stream_fifo_new();
1383 peer
->obuf
= stream_fifo_new();
1384 pthread_mutex_init(&peer
->io_mtx
, NULL
);
1386 /* We use a larger buffer for peer->obuf_work in the event that:
1387 * - We RX a BGP_UPDATE where the attributes alone are just
1388 * under BGP_EXTENDED_MESSAGE_MAX_PACKET_SIZE.
1389 * - The user configures an outbound route-map that does many as-path
1390 * prepends or adds many communities. At most they can have
1391 * CMD_ARGC_MAX args in a route-map so there is a finite limit on how
1392 * large they can make the attributes.
1394 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid
1395 * bounds checking for every single attribute as we construct an
1399 stream_new(BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1401 ringbuf_new(BGP_MAX_PACKET_SIZE
* BGP_READ_PACKET_MAX
);
1403 peer
->scratch
= stream_new(BGP_MAX_PACKET_SIZE
);
1405 bgp_sync_init(peer
);
1407 /* Get service port number. */
1408 sp
= getservbyname("bgp", "tcp");
1409 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
1411 QOBJ_REG(peer
, peer
);
1416 * This function is invoked when a duplicate peer structure associated with
1417 * a neighbor is being deleted. If this about-to-be-deleted structure is
1418 * the one with all the config, then we have to copy over the info.
1420 void peer_xfer_config(struct peer
*peer_dst
, struct peer
*peer_src
)
1422 struct peer_af
*paf
;
1430 /* The following function is used by both peer group config copy to
1431 * individual peer and when we transfer config
1433 if (peer_src
->change_local_as
)
1434 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1436 /* peer flags apply */
1437 peer_dst
->flags
= peer_src
->flags
;
1439 peer_dst
->peer_gr_present_state
= peer_src
->peer_gr_present_state
;
1440 peer_dst
->peer_gr_new_status_flag
= peer_src
->peer_gr_new_status_flag
;
1442 peer_dst
->local_as
= peer_src
->local_as
;
1443 peer_dst
->port
= peer_src
->port
;
1444 /* copy tcp_mss value */
1445 peer_dst
->tcp_mss
= peer_src
->tcp_mss
;
1446 (void)peer_sort(peer_dst
);
1447 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1448 peer_dst
->local_role
= peer_src
->local_role
;
1450 peer_dst
->max_packet_size
= peer_src
->max_packet_size
;
1453 peer_dst
->holdtime
= peer_src
->holdtime
;
1454 peer_dst
->keepalive
= peer_src
->keepalive
;
1455 peer_dst
->connect
= peer_src
->connect
;
1456 peer_dst
->delayopen
= peer_src
->delayopen
;
1457 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1458 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1459 peer_dst
->routeadv
= peer_src
->routeadv
;
1460 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1461 peer_dst
->v_delayopen
= peer_src
->v_delayopen
;
1463 /* password apply */
1464 if (peer_src
->password
&& !peer_dst
->password
)
1465 peer_dst
->password
=
1466 XSTRDUP(MTYPE_PEER_PASSWORD
, peer_src
->password
);
1468 FOREACH_AFI_SAFI (afi
, safi
) {
1469 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1470 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1471 peer_dst
->allowas_in
[afi
][safi
] =
1472 peer_src
->allowas_in
[afi
][safi
];
1473 peer_dst
->weight
[afi
][safi
] = peer_src
->weight
[afi
][safi
];
1474 peer_dst
->addpath_type
[afi
][safi
] =
1475 peer_src
->addpath_type
[afi
][safi
];
1478 for (afidx
= BGP_AF_START
; afidx
< BGP_AF_MAX
; afidx
++) {
1479 paf
= peer_src
->peer_af_array
[afidx
];
1481 if (!peer_af_find(peer_dst
, paf
->afi
, paf
->safi
))
1482 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1486 /* update-source apply */
1487 if (peer_src
->update_source
) {
1488 if (peer_dst
->update_source
)
1489 sockunion_free(peer_dst
->update_source
);
1490 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1491 peer_dst
->update_source
=
1492 sockunion_dup(peer_src
->update_source
);
1493 } else if (peer_src
->update_if
) {
1494 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1495 if (peer_dst
->update_source
) {
1496 sockunion_free(peer_dst
->update_source
);
1497 peer_dst
->update_source
= NULL
;
1499 peer_dst
->update_if
=
1500 XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1503 if (peer_src
->ifname
) {
1504 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1507 XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1511 static int bgp_peer_conf_if_to_su_update_v4(struct peer
*peer
,
1512 struct interface
*ifp
)
1514 struct connected
*ifc
;
1517 struct listnode
*node
;
1519 /* If our IPv4 address on the interface is /30 or /31, we can derive the
1520 * IPv4 address of the other end.
1522 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
)) {
1523 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
)) {
1524 prefix_copy(&p
, CONNECTED_PREFIX(ifc
));
1525 if (p
.prefixlen
== 30) {
1526 peer
->su
.sa
.sa_family
= AF_INET
;
1527 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1529 peer
->su
.sin
.sin_addr
.s_addr
=
1531 else if (addr
% 4 == 2)
1532 peer
->su
.sin
.sin_addr
.s_addr
=
1534 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1535 peer
->su
.sin
.sin_len
=
1536 sizeof(struct sockaddr_in
);
1537 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1539 } else if (p
.prefixlen
== 31) {
1540 peer
->su
.sa
.sa_family
= AF_INET
;
1541 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1543 peer
->su
.sin
.sin_addr
.s_addr
=
1546 peer
->su
.sin
.sin_addr
.s_addr
=
1548 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1549 peer
->su
.sin
.sin_len
=
1550 sizeof(struct sockaddr_in
);
1551 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1553 } else if (bgp_debug_neighbor_events(peer
))
1555 "%s: IPv4 interface address is not /30 or /31, v4 session not started",
1563 static bool bgp_peer_conf_if_to_su_update_v6(struct peer
*peer
,
1564 struct interface
*ifp
)
1566 struct nbr_connected
*ifc_nbr
;
1568 /* Have we learnt the peer's IPv6 link-local address? */
1569 if (ifp
->nbr_connected
1570 && (ifc_nbr
= listnode_head(ifp
->nbr_connected
))) {
1571 peer
->su
.sa
.sa_family
= AF_INET6
;
1572 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1573 sizeof(struct in6_addr
));
1575 peer
->su
.sin6
.sin6_len
= sizeof(struct sockaddr_in6
);
1577 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1585 * Set or reset the peer address socketunion structure based on the
1586 * learnt/derived peer address. If the address has changed, update the
1587 * password on the listen socket, if needed.
1589 void bgp_peer_conf_if_to_su_update(struct peer
*peer
)
1591 struct interface
*ifp
;
1593 int peer_addr_updated
= 0;
1599 * Our peer structure is stored in the bgp->peerhash
1600 * release it before we modify anything.
1602 hash_release(peer
->bgp
->peerhash
, peer
);
1604 prev_family
= peer
->su
.sa
.sa_family
;
1605 if ((ifp
= if_lookup_by_name(peer
->conf_if
, peer
->bgp
->vrf_id
))) {
1607 /* If BGP unnumbered is not "v6only", we first see if we can
1609 * peer's IPv4 address.
1611 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1613 bgp_peer_conf_if_to_su_update_v4(peer
, ifp
);
1615 /* If "v6only" or we can't derive peer's IPv4 address, see if
1617 * learnt the peer's IPv6 link-local address. This is from the
1619 * IPv6 address in router advertisement.
1621 if (!peer_addr_updated
)
1623 bgp_peer_conf_if_to_su_update_v6(peer
, ifp
);
1625 /* If we could derive the peer address, we may need to install the
1627 * configured for the peer, if any, on the listen socket. Otherwise,
1629 * that peer's address is not available and uninstall the password, if
1632 if (peer_addr_updated
) {
1633 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1634 && prev_family
== AF_UNSPEC
)
1637 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1638 && prev_family
!= AF_UNSPEC
)
1639 bgp_md5_unset(peer
);
1640 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1641 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof(struct in6_addr
));
1645 * Since our su changed we need to del/add peer to the peerhash
1647 (void)hash_get(peer
->bgp
->peerhash
, peer
, hash_alloc_intern
);
1650 void bgp_recalculate_afi_safi_bestpaths(struct bgp
*bgp
, afi_t afi
, safi_t safi
)
1652 struct bgp_dest
*dest
, *ndest
;
1653 struct bgp_table
*table
;
1655 for (dest
= bgp_table_top(bgp
->rib
[afi
][safi
]); dest
;
1656 dest
= bgp_route_next(dest
)) {
1657 table
= bgp_dest_get_bgp_table_info(dest
);
1658 if (table
!= NULL
) {
1659 /* Special handling for 2-level routing
1661 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
1662 || safi
== SAFI_EVPN
) {
1663 for (ndest
= bgp_table_top(table
); ndest
;
1664 ndest
= bgp_route_next(ndest
))
1665 bgp_process(bgp
, ndest
, afi
, safi
);
1667 bgp_process(bgp
, dest
, afi
, safi
);
1672 /* Force a bestpath recalculation for all prefixes. This is used
1673 * when 'bgp bestpath' commands are entered.
1675 void bgp_recalculate_all_bestpaths(struct bgp
*bgp
)
1680 FOREACH_AFI_SAFI (afi
, safi
) {
1681 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, safi
);
1686 * Create new BGP peer.
1688 * conf_if and su are mutually exclusive if configuring from the cli.
1689 * If we are handing a doppelganger, then we *must* pass in both
1690 * the original peer's su and conf_if, so that we can appropriately
1691 * track the bgp->peerhash( ie we don't want to remove the current
1692 * one from the config ).
1694 struct peer
*peer_create(union sockunion
*su
, const char *conf_if
,
1695 struct bgp
*bgp
, as_t local_as
, as_t remote_as
,
1696 int as_type
, struct peer_group
*group
)
1700 char buf
[SU_ADDRSTRLEN
];
1704 peer
= peer_new(bgp
);
1706 peer
->conf_if
= XSTRDUP(MTYPE_PEER_CONF_IF
, conf_if
);
1710 bgp_peer_conf_if_to_su_update(peer
);
1711 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1712 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, conf_if
);
1715 sockunion2str(su
, buf
, SU_ADDRSTRLEN
);
1716 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1717 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, buf
);
1719 peer
->local_as
= local_as
;
1720 peer
->as
= remote_as
;
1721 peer
->as_type
= as_type
;
1722 peer
->local_id
= bgp
->router_id
;
1723 peer
->v_holdtime
= bgp
->default_holdtime
;
1724 peer
->v_keepalive
= bgp
->default_keepalive
;
1725 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
1726 ? BGP_DEFAULT_IBGP_ROUTEADV
1727 : BGP_DEFAULT_EBGP_ROUTEADV
;
1728 if (bgp_config_inprocess())
1729 peer
->shut_during_cfg
= true;
1731 peer
= peer_lock(peer
); /* bgp peer list reference */
1732 peer
->group
= group
;
1733 listnode_add_sort(bgp
->peer
, peer
);
1734 (void)hash_get(bgp
->peerhash
, peer
, hash_alloc_intern
);
1736 /* Adjust update-group coalesce timer heuristics for # peers. */
1737 if (bgp
->heuristic_coalesce
) {
1738 long ct
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
1740 * BGP_PEER_ADJUST_SUBGROUP_COALESCE_TIME
);
1741 bgp
->coalesce_time
= MIN(BGP_MAX_SUBGROUP_COALESCE_TIME
, ct
);
1744 active
= peer_active(peer
);
1746 if (peer
->su
.sa
.sa_family
== AF_UNSPEC
)
1747 peer
->last_reset
= PEER_DOWN_NBR_ADDR
;
1749 peer
->last_reset
= PEER_DOWN_NOAFI_ACTIVATED
;
1752 /* Last read and reset time set */
1753 peer
->readtime
= peer
->resettime
= monotime(NULL
);
1755 /* Default TTL set. */
1756 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? MAXTTL
: BGP_DEFAULT_TTL
;
1758 /* Default configured keepalives count for shutdown rtt command */
1759 peer
->rtt_keepalive_conf
= 1;
1761 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1763 /* If 'bgp default <afi>-<safi>' is configured, then activate the
1764 * neighbor for the corresponding address family. IPv4 Unicast is
1765 * the only address family enabled by default without expliict
1768 FOREACH_AFI_SAFI (afi
, safi
) {
1769 if (bgp
->default_af
[afi
][safi
]) {
1770 peer
->afc
[afi
][safi
] = 1;
1771 peer_af_create(peer
, afi
, safi
);
1775 /* auto shutdown if configured */
1776 if (bgp
->autoshutdown
)
1777 peer_flag_set(peer
, PEER_FLAG_SHUTDOWN
);
1778 /* Set up peer's events and timers. */
1779 else if (!active
&& peer_active(peer
))
1780 bgp_timer_set(peer
);
1782 bgp_peer_gr_flags_update(peer
);
1783 BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
);
1788 /* Make accept BGP peer. This function is only called from the test code */
1789 struct peer
*peer_create_accept(struct bgp
*bgp
)
1793 peer
= peer_new(bgp
);
1795 peer
= peer_lock(peer
); /* bgp peer list reference */
1796 listnode_add_sort(bgp
->peer
, peer
);
1802 * Return true if we have a peer configured to use this afi/safi
1804 bool bgp_afi_safi_peer_exists(struct bgp
*bgp
, afi_t afi
, safi_t safi
)
1806 struct listnode
*node
;
1809 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
1810 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1813 if (peer
->afc
[afi
][safi
])
1820 /* Change peer's AS number. */
1821 void peer_as_change(struct peer
*peer
, as_t as
, int as_specified
)
1823 enum bgp_peer_sort origtype
, newtype
;
1826 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1827 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
1828 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1829 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
1830 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1832 bgp_session_reset(peer
);
1834 origtype
= peer_sort_lookup(peer
);
1836 peer
->as_type
= as_specified
;
1838 if (bgp_config_check(peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1839 && !bgp_confederation_peers_check(peer
->bgp
, as
)
1840 && peer
->bgp
->as
!= as
)
1841 peer
->local_as
= peer
->bgp
->confed_id
;
1843 peer
->local_as
= peer
->bgp
->as
;
1845 newtype
= peer_sort(peer
);
1846 /* Advertisement-interval reset */
1847 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_ROUTEADV
)) {
1848 peer
->v_routeadv
= (newtype
== BGP_PEER_IBGP
)
1849 ? BGP_DEFAULT_IBGP_ROUTEADV
1850 : BGP_DEFAULT_EBGP_ROUTEADV
;
1854 if (newtype
== BGP_PEER_IBGP
)
1856 else if (origtype
== BGP_PEER_IBGP
)
1857 peer
->ttl
= BGP_DEFAULT_TTL
;
1859 /* reflector-client reset */
1860 if (newtype
!= BGP_PEER_IBGP
) {
1861 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1862 PEER_FLAG_REFLECTOR_CLIENT
);
1863 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1864 PEER_FLAG_REFLECTOR_CLIENT
);
1865 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_LABELED_UNICAST
],
1866 PEER_FLAG_REFLECTOR_CLIENT
);
1867 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1868 PEER_FLAG_REFLECTOR_CLIENT
);
1869 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_ENCAP
],
1870 PEER_FLAG_REFLECTOR_CLIENT
);
1871 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_FLOWSPEC
],
1872 PEER_FLAG_REFLECTOR_CLIENT
);
1873 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1874 PEER_FLAG_REFLECTOR_CLIENT
);
1875 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1876 PEER_FLAG_REFLECTOR_CLIENT
);
1877 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_LABELED_UNICAST
],
1878 PEER_FLAG_REFLECTOR_CLIENT
);
1879 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MPLS_VPN
],
1880 PEER_FLAG_REFLECTOR_CLIENT
);
1881 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_ENCAP
],
1882 PEER_FLAG_REFLECTOR_CLIENT
);
1883 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_FLOWSPEC
],
1884 PEER_FLAG_REFLECTOR_CLIENT
);
1885 UNSET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1886 PEER_FLAG_REFLECTOR_CLIENT
);
1889 /* local-as reset */
1890 if (newtype
!= BGP_PEER_EBGP
) {
1891 peer
->change_local_as
= 0;
1892 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
1893 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1894 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1898 /* If peer does not exist, create new one. If peer already exists,
1899 set AS number to the peer. */
1900 int peer_remote_as(struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1901 as_t
*as
, int as_type
)
1907 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
1909 peer
= peer_lookup(bgp
, su
);
1912 /* Not allowed for a dynamic peer. */
1913 if (peer_dynamic_neighbor(peer
)) {
1915 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1918 /* When this peer is a member of peer-group. */
1920 /* peer-group already has AS number/internal/external */
1921 if (peer
->group
->conf
->as
1922 || peer
->group
->conf
->as_type
) {
1923 /* Return peer group's AS number. */
1924 *as
= peer
->group
->conf
->as
;
1925 return BGP_ERR_PEER_GROUP_MEMBER
;
1928 enum bgp_peer_sort peer_sort_type
=
1929 peer_sort(peer
->group
->conf
);
1931 /* Explicit AS numbers used, compare AS numbers */
1932 if (as_type
== AS_SPECIFIED
) {
1933 if (((peer_sort_type
== BGP_PEER_IBGP
)
1934 && (bgp
->as
!= *as
))
1935 || ((peer_sort_type
== BGP_PEER_EBGP
)
1936 && (bgp
->as
== *as
))) {
1938 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1941 /* internal/external used, compare as-types */
1942 if (((peer_sort_type
== BGP_PEER_IBGP
)
1943 && (as_type
!= AS_INTERNAL
))
1944 || ((peer_sort_type
== BGP_PEER_EBGP
)
1945 && (as_type
!= AS_EXTERNAL
))) {
1947 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1952 /* Existing peer's AS number change. */
1953 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
1954 || (peer
->as_type
!= as_type
))
1955 peer_as_change(peer
, *as
, as_type
);
1958 return BGP_ERR_NO_INTERFACE_CONFIG
;
1960 /* If the peer is not part of our confederation, and its not an
1961 iBGP peer then spoof the source AS */
1962 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)
1963 && !bgp_confederation_peers_check(bgp
, *as
)
1965 local_as
= bgp
->confed_id
;
1969 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
, NULL
);
1975 const char *bgp_get_name_by_role(uint8_t role
)
1980 case ROLE_RS_SERVER
:
1982 case ROLE_RS_CLIENT
:
1988 case ROLE_UNDEFINED
:
1994 static void peer_group2peer_config_copy_af(struct peer_group
*group
,
1995 struct peer
*peer
, afi_t afi
,
1999 int out
= FILTER_OUT
;
2001 uint64_t pflags_ovrd
;
2002 uint8_t *pfilter_ovrd
;
2006 pflags_ovrd
= peer
->af_flags_override
[afi
][safi
];
2007 pfilter_ovrd
= &peer
->filter_override
[afi
][safi
][in
];
2009 /* peer af_flags apply */
2010 flags_tmp
= conf
->af_flags
[afi
][safi
] & ~pflags_ovrd
;
2011 flags_tmp
^= conf
->af_flags_invert
[afi
][safi
]
2012 ^ peer
->af_flags_invert
[afi
][safi
];
2013 flags_tmp
&= ~pflags_ovrd
;
2015 UNSET_FLAG(peer
->af_flags
[afi
][safi
], ~pflags_ovrd
);
2016 SET_FLAG(peer
->af_flags
[afi
][safi
], flags_tmp
);
2017 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
2018 conf
->af_flags_invert
[afi
][safi
]);
2020 /* maximum-prefix */
2021 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_MAX_PREFIX
)) {
2022 PEER_ATTR_INHERIT(peer
, group
, pmax
[afi
][safi
]);
2023 PEER_ATTR_INHERIT(peer
, group
, pmax_threshold
[afi
][safi
]);
2024 PEER_ATTR_INHERIT(peer
, group
, pmax_restart
[afi
][safi
]);
2027 /* maximum-prefix-out */
2028 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_MAX_PREFIX_OUT
))
2029 PEER_ATTR_INHERIT(peer
, group
, pmax_out
[afi
][safi
]);
2032 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_ALLOWAS_IN
))
2033 PEER_ATTR_INHERIT(peer
, group
, allowas_in
[afi
][safi
]);
2036 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_SOO
))
2037 PEER_ATTR_INHERIT(peer
, group
, soo
[afi
][safi
]);
2040 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_WEIGHT
))
2041 PEER_ATTR_INHERIT(peer
, group
, weight
[afi
][safi
]);
2043 /* default-originate route-map */
2044 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_DEFAULT_ORIGINATE
)) {
2045 PEER_STR_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].name
,
2046 MTYPE_ROUTE_MAP_NAME
);
2047 PEER_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].map
);
2050 /* inbound filter apply */
2051 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_DISTRIBUTE_LIST
)) {
2052 PEER_STR_ATTR_INHERIT(peer
, group
,
2053 filter
[afi
][safi
].dlist
[in
].name
,
2054 MTYPE_BGP_FILTER_NAME
);
2055 PEER_ATTR_INHERIT(peer
, group
,
2056 filter
[afi
][safi
].dlist
[in
].alist
);
2059 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_PREFIX_LIST
)) {
2060 PEER_STR_ATTR_INHERIT(peer
, group
,
2061 filter
[afi
][safi
].plist
[in
].name
,
2062 MTYPE_BGP_FILTER_NAME
);
2063 PEER_ATTR_INHERIT(peer
, group
,
2064 filter
[afi
][safi
].plist
[in
].plist
);
2067 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_FILTER_LIST
)) {
2068 PEER_STR_ATTR_INHERIT(peer
, group
,
2069 filter
[afi
][safi
].aslist
[in
].name
,
2070 MTYPE_BGP_FILTER_NAME
);
2071 PEER_ATTR_INHERIT(peer
, group
,
2072 filter
[afi
][safi
].aslist
[in
].aslist
);
2075 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_IN
], PEER_FT_ROUTE_MAP
)) {
2076 PEER_STR_ATTR_INHERIT(peer
, group
,
2077 filter
[afi
][safi
].map
[in
].name
,
2078 MTYPE_BGP_FILTER_NAME
);
2079 PEER_ATTR_INHERIT(peer
, group
,
2080 filter
[afi
][safi
].map
[RMAP_IN
].map
);
2083 /* outbound filter apply */
2084 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_DISTRIBUTE_LIST
)) {
2085 PEER_STR_ATTR_INHERIT(peer
, group
,
2086 filter
[afi
][safi
].dlist
[out
].name
,
2087 MTYPE_BGP_FILTER_NAME
);
2088 PEER_ATTR_INHERIT(peer
, group
,
2089 filter
[afi
][safi
].dlist
[out
].alist
);
2092 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_PREFIX_LIST
)) {
2093 PEER_STR_ATTR_INHERIT(peer
, group
,
2094 filter
[afi
][safi
].plist
[out
].name
,
2095 MTYPE_BGP_FILTER_NAME
);
2096 PEER_ATTR_INHERIT(peer
, group
,
2097 filter
[afi
][safi
].plist
[out
].plist
);
2100 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_FILTER_LIST
)) {
2101 PEER_STR_ATTR_INHERIT(peer
, group
,
2102 filter
[afi
][safi
].aslist
[out
].name
,
2103 MTYPE_BGP_FILTER_NAME
);
2104 PEER_ATTR_INHERIT(peer
, group
,
2105 filter
[afi
][safi
].aslist
[out
].aslist
);
2108 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_OUT
], PEER_FT_ROUTE_MAP
)) {
2109 PEER_STR_ATTR_INHERIT(peer
, group
,
2110 filter
[afi
][safi
].map
[RMAP_OUT
].name
,
2111 MTYPE_BGP_FILTER_NAME
);
2112 PEER_ATTR_INHERIT(peer
, group
,
2113 filter
[afi
][safi
].map
[RMAP_OUT
].map
);
2116 /* nondirectional filter apply */
2117 if (!CHECK_FLAG(pfilter_ovrd
[0], PEER_FT_UNSUPPRESS_MAP
)) {
2118 PEER_STR_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.name
,
2119 MTYPE_BGP_FILTER_NAME
);
2120 PEER_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.map
);
2123 /* Conditional Advertisements */
2124 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_OUT
], PEER_FT_ADVERTISE_MAP
)) {
2125 PEER_STR_ATTR_INHERIT(peer
, group
,
2126 filter
[afi
][safi
].advmap
.aname
,
2127 MTYPE_BGP_FILTER_NAME
);
2128 PEER_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].advmap
.amap
);
2129 PEER_STR_ATTR_INHERIT(peer
, group
,
2130 filter
[afi
][safi
].advmap
.cname
,
2131 MTYPE_BGP_FILTER_NAME
);
2132 PEER_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].advmap
.cmap
);
2133 PEER_ATTR_INHERIT(peer
, group
,
2134 filter
[afi
][safi
].advmap
.condition
);
2137 if (peer
->addpath_type
[afi
][safi
] == BGP_ADDPATH_NONE
) {
2138 peer
->addpath_type
[afi
][safi
] = conf
->addpath_type
[afi
][safi
];
2139 bgp_addpath_type_changed(conf
->bgp
);
2143 static int peer_activate_af(struct peer
*peer
, afi_t afi
, safi_t safi
)
2148 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2149 flog_err(EC_BGP_PEER_GROUP
, "%s was called for peer-group %s",
2150 __func__
, peer
->host
);
2154 /* Do not activate a peer for both SAFI_UNICAST and SAFI_LABELED_UNICAST
2156 if ((safi
== SAFI_UNICAST
&& peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
2157 || (safi
== SAFI_LABELED_UNICAST
&& peer
->afc
[afi
][SAFI_UNICAST
]))
2158 return BGP_ERR_PEER_SAFI_CONFLICT
;
2160 /* Nothing to do if we've already activated this peer */
2161 if (peer
->afc
[afi
][safi
])
2164 if (peer_af_create(peer
, afi
, safi
) == NULL
)
2167 active
= peer_active(peer
);
2168 peer
->afc
[afi
][safi
] = 1;
2171 peer_group2peer_config_copy_af(peer
->group
, peer
, afi
, safi
);
2173 if (!active
&& peer_active(peer
)) {
2174 bgp_timer_set(peer
);
2176 if (peer_established(peer
)) {
2177 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2178 peer
->afc_adv
[afi
][safi
] = 1;
2179 bgp_capability_send(peer
, afi
, safi
,
2181 CAPABILITY_ACTION_SET
);
2182 if (peer
->afc_recv
[afi
][safi
]) {
2183 peer
->afc_nego
[afi
][safi
] = 1;
2184 bgp_announce_route(peer
, afi
, safi
,
2188 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2189 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2190 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2193 if (peer
->status
== OpenSent
|| peer
->status
== OpenConfirm
) {
2194 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2195 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2196 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2199 * If we are turning on a AFI/SAFI locally and we've
2200 * started bringing a peer up, we need to tell
2201 * the other peer to restart because we might loose
2202 * configuration here because when the doppelganger
2203 * gets to a established state due to how
2204 * we resolve we could just overwrite the afi/safi
2207 other
= peer
->doppelganger
;
2209 && (other
->status
== OpenSent
2210 || other
->status
== OpenConfirm
)) {
2211 other
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2212 bgp_notify_send(other
, BGP_NOTIFY_CEASE
,
2213 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2220 /* Activate the peer or peer group for specified AFI and SAFI. */
2221 int peer_activate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2224 struct peer_group
*group
;
2225 struct listnode
*node
, *nnode
;
2226 struct peer
*tmp_peer
;
2229 /* Nothing to do if we've already activated this peer */
2230 if (peer
->afc
[afi
][safi
])
2235 /* This is a peer-group so activate all of the members of the
2236 * peer-group as well */
2237 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2239 /* Do not activate a peer for both SAFI_UNICAST and
2240 * SAFI_LABELED_UNICAST */
2241 if ((safi
== SAFI_UNICAST
2242 && peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
2243 || (safi
== SAFI_LABELED_UNICAST
2244 && peer
->afc
[afi
][SAFI_UNICAST
]))
2245 return BGP_ERR_PEER_SAFI_CONFLICT
;
2247 peer
->afc
[afi
][safi
] = 1;
2248 group
= peer
->group
;
2250 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2251 ret
|= peer_activate_af(tmp_peer
, afi
, safi
);
2254 ret
|= peer_activate_af(peer
, afi
, safi
);
2257 /* If this is the first peer to be activated for this
2258 * afi/labeled-unicast recalc bestpaths to trigger label allocation */
2259 if (ret
!= BGP_ERR_PEER_SAFI_CONFLICT
&& safi
== SAFI_LABELED_UNICAST
2260 && !bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]) {
2262 if (BGP_DEBUG(zebra
, ZEBRA
))
2264 "peer(s) are now active for labeled-unicast, allocate MPLS labels");
2266 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 1;
2267 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2270 if (safi
== SAFI_FLOWSPEC
) {
2271 /* connect to table manager */
2272 bgp_zebra_init_tm_connect(bgp
);
2277 static bool non_peergroup_deactivate_af(struct peer
*peer
, afi_t afi
,
2280 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2281 flog_err(EC_BGP_PEER_GROUP
, "%s was called for peer-group %s",
2282 __func__
, peer
->host
);
2286 /* Nothing to do if we've already deactivated this peer */
2287 if (!peer
->afc
[afi
][safi
])
2290 /* De-activate the address family configuration. */
2291 peer
->afc
[afi
][safi
] = 0;
2293 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2294 flog_err(EC_BGP_PEER_DELETE
,
2295 "couldn't delete af structure for peer %s(%s, %s)",
2296 peer
->host
, afi2str(afi
), safi2str(safi
));
2300 if (peer_established(peer
)) {
2301 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2302 peer
->afc_adv
[afi
][safi
] = 0;
2303 peer
->afc_nego
[afi
][safi
] = 0;
2305 if (peer_active_nego(peer
)) {
2306 bgp_capability_send(peer
, afi
, safi
,
2308 CAPABILITY_ACTION_UNSET
);
2309 bgp_clear_route(peer
, afi
, safi
);
2310 peer
->pcount
[afi
][safi
] = 0;
2312 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2313 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2314 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2317 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2318 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2319 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2326 int peer_deactivate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2329 struct peer_group
*group
;
2330 struct peer
*tmp_peer
;
2331 struct listnode
*node
, *nnode
;
2334 /* Nothing to do if we've already de-activated this peer */
2335 if (!peer
->afc
[afi
][safi
])
2338 /* This is a peer-group so de-activate all of the members of the
2339 * peer-group as well */
2340 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2341 peer
->afc
[afi
][safi
] = 0;
2342 group
= peer
->group
;
2344 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2345 ret
|= non_peergroup_deactivate_af(tmp_peer
, afi
, safi
);
2348 ret
|= non_peergroup_deactivate_af(peer
, afi
, safi
);
2353 /* If this is the last peer to be deactivated for this
2354 * afi/labeled-unicast recalc bestpaths to trigger label deallocation */
2355 if (safi
== SAFI_LABELED_UNICAST
2356 && bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]
2357 && !bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
2359 if (BGP_DEBUG(zebra
, ZEBRA
))
2361 "peer(s) are no longer active for labeled-unicast, deallocate MPLS labels");
2363 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 0;
2364 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2369 void peer_nsf_stop(struct peer
*peer
)
2374 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
);
2375 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_MODE
);
2377 FOREACH_AFI_SAFI_NSF (afi
, safi
)
2378 peer
->nsf
[afi
][safi
] = 0;
2380 if (peer
->t_gr_restart
) {
2381 THREAD_OFF(peer
->t_gr_restart
);
2382 if (bgp_debug_neighbor_events(peer
))
2383 zlog_debug("%pBP graceful restart timer stopped", peer
);
2385 if (peer
->t_gr_stale
) {
2386 THREAD_OFF(peer
->t_gr_stale
);
2387 if (bgp_debug_neighbor_events(peer
))
2389 "%pBP graceful restart stalepath timer stopped",
2392 bgp_clear_route_all(peer
);
2395 /* Delete peer from confguration.
2397 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
2398 * it to "cool off" and refcounts to hit 0, at which state it is freed.
2400 * This function /should/ take care to be idempotent, to guard against
2401 * it being called multiple times through stray events that come in
2402 * that happen to result in this function being called again. That
2403 * said, getting here for a "Deleted" peer is a bug in the neighbour
2406 int peer_delete(struct peer
*peer
)
2412 struct bgp_filter
*filter
;
2413 struct listnode
*pn
;
2416 assert(peer
->status
!= Deleted
);
2419 accept_peer
= CHECK_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2421 bgp_soft_reconfig_table_task_cancel(bgp
, NULL
, peer
);
2423 bgp_keepalives_off(peer
);
2424 bgp_reads_off(peer
);
2425 bgp_writes_off(peer
);
2426 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_WRITES_ON
));
2427 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_READS_ON
));
2428 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_KEEPALIVES_ON
));
2430 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2431 peer_nsf_stop(peer
);
2433 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2435 /* Remove BFD settings. */
2436 if (peer
->bfd_config
)
2437 bgp_peer_remove_bfd_config(peer
);
2439 /* If this peer belongs to peer group, clear up the
2442 if (peer_dynamic_neighbor(peer
))
2443 peer_drop_dynamic_neighbor(peer
);
2445 if ((pn
= listnode_lookup(peer
->group
->peer
, peer
))) {
2447 peer
); /* group->peer list reference */
2448 list_delete_node(peer
->group
->peer
, pn
);
2453 /* Withdraw all information from routing table. We can not use
2454 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
2455 * executed after peer structure is deleted.
2457 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2459 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2461 if (peer
->doppelganger
) {
2462 peer
->doppelganger
->doppelganger
= NULL
;
2463 peer
->doppelganger
= NULL
;
2466 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2467 bgp_fsm_change_status(peer
, Deleted
);
2469 /* Remove from NHT */
2470 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
2471 bgp_unlink_nexthop_by_peer(peer
);
2473 /* Password configuration */
2474 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)) {
2475 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
2476 if (!accept_peer
&& !BGP_PEER_SU_UNSPEC(peer
)
2477 && !CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
2478 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
))
2479 bgp_md5_unset(peer
);
2482 bgp_timer_set(peer
); /* stops all timers for Deleted */
2484 /* Delete from all peer list. */
2485 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
2486 && (pn
= listnode_lookup(bgp
->peer
, peer
))) {
2487 peer_unlock(peer
); /* bgp peer list reference */
2488 list_delete_node(bgp
->peer
, pn
);
2489 hash_release(bgp
->peerhash
, peer
);
2494 stream_fifo_free(peer
->ibuf
);
2499 stream_fifo_free(peer
->obuf
);
2503 if (peer
->ibuf_work
) {
2504 ringbuf_del(peer
->ibuf_work
);
2505 peer
->ibuf_work
= NULL
;
2508 if (peer
->obuf_work
) {
2509 stream_free(peer
->obuf_work
);
2510 peer
->obuf_work
= NULL
;
2513 if (peer
->scratch
) {
2514 stream_free(peer
->scratch
);
2515 peer
->scratch
= NULL
;
2518 /* Local and remote addresses. */
2519 if (peer
->su_local
) {
2520 sockunion_free(peer
->su_local
);
2521 peer
->su_local
= NULL
;
2524 if (peer
->su_remote
) {
2525 sockunion_free(peer
->su_remote
);
2526 peer
->su_remote
= NULL
;
2529 /* Free filter related memory. */
2530 FOREACH_AFI_SAFI (afi
, safi
) {
2531 filter
= &peer
->filter
[afi
][safi
];
2533 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++) {
2534 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
2535 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
2536 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
2539 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++) {
2540 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
2543 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
2544 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
2545 ecommunity_free(&peer
->soo
[afi
][safi
]);
2548 FOREACH_AFI_SAFI (afi
, safi
)
2549 peer_af_delete(peer
, afi
, safi
);
2551 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
2552 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
2554 peer_unlock(peer
); /* initial reference */
2559 static int peer_group_cmp(struct peer_group
*g1
, struct peer_group
*g2
)
2561 return strcmp(g1
->name
, g2
->name
);
2564 /* Peer group cofiguration. */
2565 static struct peer_group
*peer_group_new(void)
2567 return XCALLOC(MTYPE_PEER_GROUP
, sizeof(struct peer_group
));
2570 static void peer_group_free(struct peer_group
*group
)
2572 XFREE(MTYPE_PEER_GROUP
, group
);
2575 struct peer_group
*peer_group_lookup(struct bgp
*bgp
, const char *name
)
2577 struct peer_group
*group
;
2578 struct listnode
*node
, *nnode
;
2580 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2581 if (strcmp(group
->name
, name
) == 0)
2587 struct peer_group
*peer_group_get(struct bgp
*bgp
, const char *name
)
2589 struct peer_group
*group
;
2593 group
= peer_group_lookup(bgp
, name
);
2597 group
= peer_group_new();
2599 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2600 group
->name
= XSTRDUP(MTYPE_PEER_GROUP_HOST
, name
);
2601 group
->peer
= list_new();
2602 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2603 group
->listen_range
[afi
] = list_new();
2604 group
->conf
= peer_new(bgp
);
2605 FOREACH_AFI_SAFI (afi
, safi
) {
2606 if (bgp
->default_af
[afi
][safi
])
2607 group
->conf
->afc
[afi
][safi
] = 1;
2609 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
2610 group
->conf
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, name
);
2611 group
->conf
->group
= group
;
2612 group
->conf
->as
= 0;
2613 group
->conf
->ttl
= BGP_DEFAULT_TTL
;
2614 group
->conf
->gtsm_hops
= BGP_GTSM_HOPS_DISABLED
;
2615 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2616 SET_FLAG(group
->conf
->sflags
, PEER_STATUS_GROUP
);
2617 listnode_add_sort(bgp
->group
, group
);
2622 static void peer_group2peer_config_copy(struct peer_group
*group
,
2632 peer
->as
= conf
->as
;
2635 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_LOCAL_AS
))
2636 peer
->change_local_as
= conf
->change_local_as
;
2638 /* If peer-group has configured TTL then override it */
2639 if (conf
->ttl
!= BGP_DEFAULT_TTL
)
2640 peer
->ttl
= conf
->ttl
;
2643 peer
->gtsm_hops
= conf
->gtsm_hops
;
2645 /* peer flags apply */
2646 flags_tmp
= conf
->flags
& ~peer
->flags_override
;
2647 flags_tmp
^= conf
->flags_invert
^ peer
->flags_invert
;
2648 flags_tmp
&= ~peer
->flags_override
;
2650 UNSET_FLAG(peer
->flags
, ~peer
->flags_override
);
2651 SET_FLAG(peer
->flags
, flags_tmp
);
2652 SET_FLAG(peer
->flags_invert
, conf
->flags_invert
);
2654 /* peer timers apply */
2655 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER
)) {
2656 PEER_ATTR_INHERIT(peer
, group
, holdtime
);
2657 PEER_ATTR_INHERIT(peer
, group
, keepalive
);
2660 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER_CONNECT
)) {
2661 PEER_ATTR_INHERIT(peer
, group
, connect
);
2662 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_TIMER_CONNECT
))
2663 peer
->v_connect
= conf
->connect
;
2665 peer
->v_connect
= peer
->bgp
->default_connect_retry
;
2668 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER_DELAYOPEN
)) {
2669 PEER_ATTR_INHERIT(peer
, group
, delayopen
);
2670 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_TIMER_DELAYOPEN
))
2671 peer
->v_delayopen
= conf
->delayopen
;
2673 peer
->v_delayopen
= peer
->bgp
->default_delayopen
;
2676 /* advertisement-interval apply */
2677 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_ROUTEADV
)) {
2678 PEER_ATTR_INHERIT(peer
, group
, routeadv
);
2679 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_ROUTEADV
))
2680 peer
->v_routeadv
= conf
->routeadv
;
2682 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
2683 ? BGP_DEFAULT_IBGP_ROUTEADV
2684 : BGP_DEFAULT_EBGP_ROUTEADV
;
2687 /* capability extended-nexthop apply */
2688 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
))
2689 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2690 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
2692 /* password apply */
2693 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_PASSWORD
))
2694 PEER_STR_ATTR_INHERIT(peer
, group
, password
,
2695 MTYPE_PEER_PASSWORD
);
2697 if (!BGP_PEER_SU_UNSPEC(peer
))
2700 /* update-source apply */
2701 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_UPDATE_SOURCE
)) {
2702 if (conf
->update_source
) {
2703 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2704 PEER_SU_ATTR_INHERIT(peer
, group
, update_source
);
2705 } else if (conf
->update_if
) {
2706 sockunion_free(peer
->update_source
);
2707 PEER_STR_ATTR_INHERIT(peer
, group
, update_if
,
2708 MTYPE_PEER_UPDATE_SOURCE
);
2713 PEER_ATTR_INHERIT(peer
, group
, local_role
);
2715 /* Update GR flags for the peer. */
2716 bgp_peer_gr_flags_update(peer
);
2718 /* Apply BFD settings from group to peer if it exists. */
2719 if (conf
->bfd_config
) {
2720 bgp_peer_configure_bfd(peer
, false);
2721 bgp_peer_config_apply(peer
, group
);
2725 /* Peer group's remote AS configuration. */
2726 int peer_group_remote_as(struct bgp
*bgp
, const char *group_name
, as_t
*as
,
2729 struct peer_group
*group
;
2731 struct listnode
*node
, *nnode
;
2733 group
= peer_group_lookup(bgp
, group_name
);
2737 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2741 /* When we setup peer-group AS number all peer group member's AS
2742 number must be updated to same number. */
2743 peer_as_change(group
->conf
, *as
, as_type
);
2745 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2746 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
2747 || (peer
->as_type
!= as_type
))
2748 peer_as_change(peer
, *as
, as_type
);
2754 void peer_notify_unconfig(struct peer
*peer
)
2756 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2757 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2758 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2761 void peer_group_notify_unconfig(struct peer_group
*group
)
2763 struct peer
*peer
, *other
;
2764 struct listnode
*node
, *nnode
;
2766 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2767 other
= peer
->doppelganger
;
2768 if (other
&& other
->status
!= Deleted
) {
2769 other
->group
= NULL
;
2770 peer_notify_unconfig(other
);
2772 peer_notify_unconfig(peer
);
2776 int peer_group_delete(struct peer_group
*group
)
2780 struct prefix
*prefix
;
2782 struct listnode
*node
, *nnode
;
2787 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2788 other
= peer
->doppelganger
;
2790 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2791 bgp_zebra_terminate_radv(bgp
, peer
);
2794 if (other
&& other
->status
!= Deleted
) {
2795 other
->group
= NULL
;
2799 list_delete(&group
->peer
);
2801 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2802 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
2804 prefix_free(&prefix
);
2806 list_delete(&group
->listen_range
[afi
]);
2809 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2812 if (group
->conf
->bfd_config
)
2813 bgp_peer_remove_bfd_config(group
->conf
);
2815 group
->conf
->group
= NULL
;
2816 peer_delete(group
->conf
);
2818 /* Delete from all peer_group list. */
2819 listnode_delete(bgp
->group
, group
);
2821 peer_group_free(group
);
2826 int peer_group_remote_as_delete(struct peer_group
*group
)
2828 struct peer
*peer
, *other
;
2829 struct listnode
*node
, *nnode
;
2831 if ((group
->conf
->as_type
== AS_UNSPECIFIED
)
2832 || ((!group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2835 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2836 other
= peer
->doppelganger
;
2838 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2839 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
2843 if (other
&& other
->status
!= Deleted
) {
2844 other
->group
= NULL
;
2848 list_delete_all_node(group
->peer
);
2850 group
->conf
->as
= 0;
2851 group
->conf
->as_type
= AS_UNSPECIFIED
;
2856 int peer_group_listen_range_add(struct peer_group
*group
, struct prefix
*range
)
2858 struct prefix
*prefix
;
2859 struct listnode
*node
, *nnode
;
2862 afi
= family2afi(range
->family
);
2864 /* Group needs remote AS configured. */
2865 if (group
->conf
->as_type
== AS_UNSPECIFIED
)
2866 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2868 /* Ensure no duplicates. Currently we don't care about overlaps. */
2869 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2870 if (prefix_same(range
, prefix
))
2874 prefix
= prefix_new();
2875 prefix_copy(prefix
, range
);
2876 listnode_add(group
->listen_range
[afi
], prefix
);
2878 /* Update passwords for new ranges */
2879 if (group
->conf
->password
)
2880 bgp_md5_set_prefix(group
->bgp
, prefix
, group
->conf
->password
);
2885 int peer_group_listen_range_del(struct peer_group
*group
, struct prefix
*range
)
2887 struct prefix
*prefix
, prefix2
;
2888 struct listnode
*node
, *nnode
;
2892 afi
= family2afi(range
->family
);
2894 /* Identify the listen range. */
2895 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2896 if (prefix_same(range
, prefix
))
2901 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2903 /* Dispose off any dynamic neighbors that exist due to this listen range
2905 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2906 if (!peer_dynamic_neighbor(peer
))
2909 if (sockunion2hostprefix(&peer
->su
, &prefix2
)
2910 && prefix_match(prefix
, &prefix2
)) {
2911 if (bgp_debug_neighbor_events(peer
))
2913 "Deleting dynamic neighbor %s group %s upon delete of listen range %pFX",
2914 peer
->host
, group
->name
, prefix
);
2919 /* Get rid of the listen range */
2920 listnode_delete(group
->listen_range
[afi
], prefix
);
2922 /* Remove passwords for deleted ranges */
2923 if (group
->conf
->password
)
2924 bgp_md5_unset_prefix(group
->bgp
, prefix
);
2929 /* Bind specified peer to peer group. */
2930 int peer_group_bind(struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2931 struct peer_group
*group
, as_t
*as
)
2933 int first_member
= 0;
2936 enum bgp_peer_sort ptype
, gtype
;
2938 /* Lookup the peer. */
2940 peer
= peer_lookup(bgp
, su
);
2942 /* The peer exist, bind it to the peer-group */
2944 /* When the peer already belongs to a peer-group, check the
2946 if (peer_group_active(peer
)) {
2948 /* The peer is already bound to the peer-group,
2951 if (strcmp(peer
->group
->name
, group
->name
) == 0)
2954 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2957 /* The peer has not specified a remote-as, inherit it from the
2959 if (peer
->as_type
== AS_UNSPECIFIED
) {
2960 peer
->as_type
= group
->conf
->as_type
;
2961 peer
->as
= group
->conf
->as
;
2962 peer
->sort
= group
->conf
->sort
;
2965 ptype
= peer_sort(peer
);
2966 if (!group
->conf
->as
&& ptype
!= BGP_PEER_UNSPECIFIED
) {
2967 gtype
= peer_sort(group
->conf
);
2968 if ((gtype
!= BGP_PEER_INTERNAL
) && (gtype
!= ptype
)) {
2971 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2974 if (gtype
== BGP_PEER_INTERNAL
)
2978 peer_group2peer_config_copy(group
, peer
);
2980 FOREACH_AFI_SAFI (afi
, safi
) {
2981 if (group
->conf
->afc
[afi
][safi
]) {
2982 peer
->afc
[afi
][safi
] = 1;
2984 if (peer_af_find(peer
, afi
, safi
)
2985 || peer_af_create(peer
, afi
, safi
)) {
2986 peer_group2peer_config_copy_af(
2987 group
, peer
, afi
, safi
);
2989 } else if (peer
->afc
[afi
][safi
])
2990 peer_deactivate(peer
, afi
, safi
);
2994 assert(group
&& peer
->group
== group
);
2996 listnode_delete(bgp
->peer
, peer
);
2998 peer
->group
= group
;
2999 listnode_add_sort(bgp
->peer
, peer
);
3001 peer
= peer_lock(peer
); /* group->peer list reference */
3002 listnode_add(group
->peer
, peer
);
3006 gtype
= peer_sort(group
->conf
);
3007 /* Advertisement-interval reset */
3008 if (!CHECK_FLAG(group
->conf
->flags
,
3009 PEER_FLAG_ROUTEADV
)) {
3010 group
->conf
->v_routeadv
=
3011 (gtype
== BGP_PEER_IBGP
)
3012 ? BGP_DEFAULT_IBGP_ROUTEADV
3013 : BGP_DEFAULT_EBGP_ROUTEADV
;
3016 /* ebgp-multihop reset */
3017 if (gtype
== BGP_PEER_IBGP
)
3018 group
->conf
->ttl
= MAXTTL
;
3020 /* local-as reset */
3021 if (gtype
!= BGP_PEER_EBGP
) {
3022 group
->conf
->change_local_as
= 0;
3023 peer_flag_unset(group
->conf
,
3024 PEER_FLAG_LOCAL_AS
);
3025 peer_flag_unset(group
->conf
,
3026 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3027 peer_flag_unset(group
->conf
,
3028 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3032 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3034 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
3035 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
3036 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3037 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3039 bgp_session_reset(peer
);
3043 /* Create a new peer. */
3045 if ((group
->conf
->as_type
== AS_SPECIFIED
)
3046 && (!group
->conf
->as
)) {
3047 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
3050 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
3051 group
->conf
->as_type
, group
);
3053 peer
= peer_lock(peer
); /* group->peer list reference */
3054 listnode_add(group
->peer
, peer
);
3056 peer_group2peer_config_copy(group
, peer
);
3058 /* If the peer-group is active for this afi/safi then activate
3060 FOREACH_AFI_SAFI (afi
, safi
) {
3061 if (group
->conf
->afc
[afi
][safi
]) {
3062 peer
->afc
[afi
][safi
] = 1;
3064 if (!peer_af_find(peer
, afi
, safi
))
3065 peer_af_create(peer
, afi
, safi
);
3067 peer_group2peer_config_copy_af(group
, peer
, afi
,
3069 } else if (peer
->afc
[afi
][safi
])
3070 peer_deactivate(peer
, afi
, safi
);
3073 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3075 /* Set up peer's events and timers. */
3076 if (peer_active(peer
))
3077 bgp_timer_set(peer
);
3083 static void bgp_startup_timer_expire(struct thread
*thread
)
3087 bgp
= THREAD_ARG(thread
);
3088 bgp
->t_startup
= NULL
;
3092 * On shutdown we call the cleanup function which
3093 * does a free of the link list nodes, free up
3094 * the data we are pointing at too.
3096 static void bgp_vrf_string_name_delete(void *data
)
3100 XFREE(MTYPE_TMP
, vname
);
3103 /* BGP instance creation by `router bgp' commands. */
3104 static struct bgp
*bgp_create(as_t
*as
, const char *name
,
3105 enum bgp_instance_type inst_type
)
3111 bgp
= XCALLOC(MTYPE_BGP
, sizeof(struct bgp
));
3113 if (BGP_DEBUG(zebra
, ZEBRA
)) {
3114 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3115 zlog_debug("Creating Default VRF, AS %u", *as
);
3117 zlog_debug("Creating %s %s, AS %u",
3118 (inst_type
== BGP_INSTANCE_TYPE_VRF
)
3124 /* Default the EVPN VRF to the default one */
3125 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
&& !bgp_master
.bgp_evpn
) {
3132 bgp
->allow_martian
= false;
3133 bgp_process_queue_init(bgp
);
3134 bgp
->heuristic_coalesce
= true;
3135 bgp
->inst_type
= inst_type
;
3136 bgp
->vrf_id
= (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) ? VRF_DEFAULT
3138 bgp
->peer_self
= peer_new(bgp
);
3139 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
3140 bgp
->peer_self
->host
=
3141 XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
3142 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->hostname
);
3143 if (cmd_hostname_get())
3144 bgp
->peer_self
->hostname
=
3145 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_hostname_get());
3147 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->domainname
);
3148 if (cmd_domainname_get())
3149 bgp
->peer_self
->domainname
=
3150 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_domainname_get());
3151 bgp
->peer
= list_new();
3152 bgp
->peer
->cmp
= (int (*)(void *, void *))peer_cmp
;
3153 bgp
->peerhash
= hash_create(peer_hash_key_make
, peer_hash_same
,
3155 bgp
->peerhash
->max_size
= BGP_PEER_MAX_HASH_SIZE
;
3157 bgp
->group
= list_new();
3158 bgp
->group
->cmp
= (int (*)(void *, void *))peer_group_cmp
;
3160 FOREACH_AFI_SAFI (afi
, safi
) {
3161 bgp
->route
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3162 bgp
->aggregate
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3163 bgp
->rib
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3165 /* Enable maximum-paths */
3166 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_EBGP
,
3168 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_IBGP
,
3170 /* Initialize graceful restart info */
3171 bgp
->gr_info
[afi
][safi
].eor_required
= 0;
3172 bgp
->gr_info
[afi
][safi
].eor_received
= 0;
3173 bgp
->gr_info
[afi
][safi
].t_select_deferral
= NULL
;
3174 bgp
->gr_info
[afi
][safi
].t_route_select
= NULL
;
3175 bgp
->gr_info
[afi
][safi
].gr_deferred
= 0;
3178 bgp
->v_update_delay
= bm
->v_update_delay
;
3179 bgp
->v_establish_wait
= bm
->v_establish_wait
;
3180 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
3181 bgp
->default_subgroup_pkt_queue_max
=
3182 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
3183 bgp_timers_unset(bgp
);
3184 bgp
->default_min_holdtime
= 0;
3185 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
3186 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
3187 bgp
->select_defer_time
= BGP_DEFAULT_SELECT_DEFERRAL_TIME
;
3188 bgp
->rib_stale_time
= BGP_DEFAULT_RIB_STALE_TIME
;
3189 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
3190 bgp
->dynamic_neighbors_count
= 0;
3191 bgp
->lb_ref_bw
= BGP_LINK_BW_REF_BW
;
3192 bgp
->lb_handling
= BGP_LINK_BW_ECMP
;
3193 bgp
->reject_as_sets
= false;
3194 bgp
->condition_check_period
= DEFAULT_CONDITIONAL_ROUTES_POLL_TIME
;
3195 bgp_addpath_init_bgp_data(&bgp
->tx_addpath
);
3196 bgp
->fast_convergence
= false;
3198 bgp
->llgr_stale_time
= BGP_DEFAULT_LLGR_STALE_TIME
;
3200 #ifdef ENABLE_BGP_VNC
3201 if (inst_type
!= BGP_INSTANCE_TYPE_VRF
) {
3202 bgp
->rfapi
= bgp_rfapi_new(bgp
);
3204 assert(bgp
->rfapi_cfg
);
3206 #endif /* ENABLE_BGP_VNC */
3208 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3209 bgp
->vpn_policy
[afi
].bgp
= bgp
;
3210 bgp
->vpn_policy
[afi
].afi
= afi
;
3211 bgp
->vpn_policy
[afi
].tovpn_label
= MPLS_LABEL_NONE
;
3212 bgp
->vpn_policy
[afi
].tovpn_zebra_vrf_label_last_sent
=
3215 bgp
->vpn_policy
[afi
].import_vrf
= list_new();
3216 bgp
->vpn_policy
[afi
].import_vrf
->del
=
3217 bgp_vrf_string_name_delete
;
3218 bgp
->vpn_policy
[afi
].export_vrf
= list_new();
3219 bgp
->vpn_policy
[afi
].export_vrf
->del
=
3220 bgp_vrf_string_name_delete
;
3221 SET_FLAG(bgp
->af_flags
[afi
][SAFI_MPLS_VPN
],
3222 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL
);
3225 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
3227 thread_add_timer(bm
->master
, bgp_startup_timer_expire
, bgp
,
3228 bgp
->restart_time
, &bgp
->t_startup
);
3230 /* printable name we can use in debug messages */
3231 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
3232 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
3242 len
= 4 + 1 + strlen(n
) + 1; /* "view foo\0" */
3244 bgp
->name_pretty
= XCALLOC(MTYPE_BGP
, len
);
3245 snprintf(bgp
->name_pretty
, len
, "%s %s",
3246 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3252 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
3253 memory_order_relaxed
);
3254 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
3255 memory_order_relaxed
);
3256 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
3257 bgp
->default_af
[AFI_IP
][SAFI_UNICAST
] = true;
3261 update_bgp_group_init(bgp
);
3263 /* assign a unique rd id for auto derivation of vrf's RD */
3264 bf_assign_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3266 bgp
->evpn_info
= XCALLOC(MTYPE_BGP_EVPN_INFO
,
3267 sizeof(struct bgp_evpn_info
));
3269 bgp_evpn_vrf_es_init(bgp
);
3273 /*initilize global GR FSM */
3274 bgp_global_gr_init(bgp
);
3276 memset(&bgp
->ebgprequirespolicywarning
, 0,
3277 sizeof(bgp
->ebgprequirespolicywarning
));
3282 /* Return the "default VRF" instance of BGP. */
3283 struct bgp
*bgp_get_default(void)
3286 struct listnode
*node
, *nnode
;
3288 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3289 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3294 /* Lookup BGP entry. */
3295 struct bgp
*bgp_lookup(as_t as
, const char *name
)
3298 struct listnode
*node
, *nnode
;
3300 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3302 && ((bgp
->name
== NULL
&& name
== NULL
)
3303 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0)))
3308 /* Lookup BGP structure by view name. */
3309 struct bgp
*bgp_lookup_by_name(const char *name
)
3312 struct listnode
*node
, *nnode
;
3314 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3315 if ((bgp
->name
== NULL
&& name
== NULL
)
3316 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0))
3321 /* Lookup BGP instance based on VRF id. */
3322 /* Note: Only to be used for incoming messages from Zebra. */
3323 struct bgp
*bgp_lookup_by_vrf_id(vrf_id_t vrf_id
)
3327 /* Lookup VRF (in tree) and follow link. */
3328 vrf
= vrf_lookup_by_id(vrf_id
);
3331 return (vrf
->info
) ? (struct bgp
*)vrf
->info
: NULL
;
3334 /* Sets the BGP instance where EVPN is enabled */
3335 void bgp_set_evpn(struct bgp
*bgp
)
3337 if (bm
->bgp_evpn
== bgp
)
3340 /* First, release the reference count we hold on the instance */
3342 bgp_unlock(bm
->bgp_evpn
);
3346 /* Increase the reference count on this new VRF */
3348 bgp_lock(bm
->bgp_evpn
);
3351 /* Returns the BGP instance where EVPN is enabled, if any */
3352 struct bgp
*bgp_get_evpn(void)
3354 return bm
->bgp_evpn
;
3357 /* handle socket creation or deletion, if necessary
3358 * this is called for all new BGP instances
3360 int bgp_handle_socket(struct bgp
*bgp
, struct vrf
*vrf
, vrf_id_t old_vrf_id
,
3363 struct listnode
*node
;
3366 /* Create BGP server socket, if listen mode not disabled */
3367 if (!bgp
|| bgp_option_check(BGP_OPT_NO_LISTEN
))
3369 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3371 * suppress vrf socket
3374 bgp_close_vrf_socket(bgp
);
3378 return BGP_ERR_INVALID_VALUE
;
3380 * if vrf_id did not change
3382 if (vrf
->vrf_id
== old_vrf_id
)
3384 if (old_vrf_id
!= VRF_UNKNOWN
) {
3385 /* look for old socket. close it. */
3386 bgp_close_vrf_socket(bgp
);
3388 /* if backend is not yet identified ( VRF_UNKNOWN) then
3389 * creation will be done later
3391 if (vrf
->vrf_id
== VRF_UNKNOWN
)
3393 if (list_isempty(bm
->addresses
)) {
3394 if (bgp_socket(bgp
, bm
->port
, NULL
) < 0)
3395 return BGP_ERR_INVALID_VALUE
;
3397 for (ALL_LIST_ELEMENTS_RO(bm
->addresses
, node
, address
))
3398 if (bgp_socket(bgp
, bm
->port
, address
) < 0)
3399 return BGP_ERR_INVALID_VALUE
;
3403 return bgp_check_main_socket(create
, bgp
);
3406 int bgp_lookup_by_as_name_type(struct bgp
**bgp_val
, as_t
*as
, const char *name
,
3407 enum bgp_instance_type inst_type
)
3411 /* Multiple instance check. */
3413 bgp
= bgp_lookup_by_name(name
);
3415 bgp
= bgp_get_default();
3419 if (bgp
->as
!= *as
) {
3421 return BGP_ERR_AS_MISMATCH
;
3423 if (bgp
->inst_type
!= inst_type
)
3424 return BGP_ERR_INSTANCE_MISMATCH
;
3432 /* Called from VTY commands. */
3433 int bgp_get(struct bgp
**bgp_val
, as_t
*as
, const char *name
,
3434 enum bgp_instance_type inst_type
)
3437 struct vrf
*vrf
= NULL
;
3440 ret
= bgp_lookup_by_as_name_type(bgp_val
, as
, name
, inst_type
);
3441 if (ret
|| *bgp_val
)
3444 bgp
= bgp_create(as
, name
, inst_type
);
3447 * view instances will never work inside of a vrf
3448 * as such they must always be in the VRF_DEFAULT
3449 * Also we must set this to something useful because
3450 * of the vrf socket code needing an actual useful
3451 * default value to send to the underlying OS.
3453 * This code is currently ignoring vrf based
3454 * code using the -Z option( and that is probably
3455 * best addressed elsewhere in the code )
3457 if (inst_type
== BGP_INSTANCE_TYPE_VIEW
)
3458 bgp
->vrf_id
= VRF_DEFAULT
;
3460 bgp_router_id_set(bgp
, &bgp
->router_id_zebra
, true);
3461 bgp_address_init(bgp
);
3462 bgp_tip_hash_init(bgp
);
3466 bgp
->t_rmap_def_originate_eval
= NULL
;
3468 /* If Default instance or VRF, link to the VRF structure, if present. */
3469 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
3470 || bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3471 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3473 bgp_vrf_link(bgp
, vrf
);
3475 /* BGP server socket already processed if BGP instance
3476 * already part of the list
3478 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, true);
3479 listnode_add(bm
->bgp
, bgp
);
3481 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
)) {
3482 if (BGP_DEBUG(zebra
, ZEBRA
))
3483 zlog_debug("%s: Registering BGP instance %s to zebra",
3485 bgp_zebra_instance_register(bgp
);
3491 static void bgp_zclient_set_redist(afi_t afi
, int type
, unsigned short instance
,
3492 vrf_id_t vrf_id
, bool set
)
3496 redist_add_instance(&zclient
->mi_redist
[afi
][type
],
3499 redist_del_instance(&zclient
->mi_redist
[afi
][type
],
3503 vrf_bitmap_set(zclient
->redist
[afi
][type
], vrf_id
);
3505 vrf_bitmap_unset(zclient
->redist
[afi
][type
], vrf_id
);
3509 static void bgp_set_redist_vrf_bitmaps(struct bgp
*bgp
, bool set
)
3513 struct list
*red_list
;
3514 struct listnode
*node
;
3515 struct bgp_redist
*red
;
3517 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3518 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
3520 red_list
= bgp
->redist
[afi
][i
];
3524 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
))
3525 bgp_zclient_set_redist(afi
, i
, red
->instance
,
3532 * Make BGP instance "up". Applies only to VRFs (non-default) and
3533 * implies the VRF has been learnt from Zebra.
3535 void bgp_instance_up(struct bgp
*bgp
)
3538 struct listnode
*node
, *next
;
3540 bgp_set_redist_vrf_bitmaps(bgp
, true);
3542 /* Register with zebra. */
3543 bgp_zebra_instance_register(bgp
);
3545 /* Kick off any peers that may have been configured. */
3546 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3547 if (!BGP_PEER_START_SUPPRESSED(peer
))
3548 BGP_EVENT_ADD(peer
, BGP_Start
);
3551 /* Process any networks that have been configured. */
3552 bgp_static_add(bgp
);
3556 * Make BGP instance "down". Applies only to VRFs (non-default) and
3557 * implies the VRF has been deleted by Zebra.
3559 void bgp_instance_down(struct bgp
*bgp
)
3562 struct listnode
*node
;
3563 struct listnode
*next
;
3566 if (bgp
->t_rmap_def_originate_eval
) {
3567 THREAD_OFF(bgp
->t_rmap_def_originate_eval
);
3568 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3572 /* Bring down peers, so corresponding routes are purged. */
3573 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3574 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3575 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3576 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3578 bgp_session_reset(peer
);
3581 /* Purge network and redistributed routes. */
3582 bgp_purge_static_redist_routes(bgp
);
3584 /* Cleanup registered nexthops (flags) */
3585 bgp_cleanup_nexthops(bgp
);
3587 bgp_zebra_instance_deregister(bgp
);
3589 bgp_set_redist_vrf_bitmaps(bgp
, false);
3592 /* Delete BGP instance. */
3593 int bgp_delete(struct bgp
*bgp
)
3596 struct peer_group
*group
;
3597 struct listnode
*node
, *next
;
3602 struct graceful_restart_info
*gr_info
;
3606 bgp_soft_reconfig_table_task_cancel(bgp
, NULL
, NULL
);
3608 /* make sure we withdraw any exported routes */
3609 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
, bgp_get_default(),
3611 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
, bgp_get_default(),
3614 bgp_vpn_leak_unimport(bgp
);
3616 hook_call(bgp_inst_delete
, bgp
);
3618 THREAD_OFF(bgp
->t_startup
);
3619 THREAD_OFF(bgp
->t_maxmed_onstartup
);
3620 THREAD_OFF(bgp
->t_update_delay
);
3621 THREAD_OFF(bgp
->t_establish_wait
);
3623 /* Set flag indicating bgp instance delete in progress */
3624 SET_FLAG(bgp
->flags
, BGP_FLAG_DELETE_IN_PROGRESS
);
3626 /* Delete the graceful restart info */
3627 FOREACH_AFI_SAFI (afi
, safi
) {
3630 gr_info
= &bgp
->gr_info
[afi
][safi
];
3634 THREAD_OFF(gr_info
->t_select_deferral
);
3636 t
= gr_info
->t_route_select
;
3638 void *info
= THREAD_ARG(t
);
3640 XFREE(MTYPE_TMP
, info
);
3642 THREAD_OFF(gr_info
->t_route_select
);
3645 if (BGP_DEBUG(zebra
, ZEBRA
)) {
3646 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3647 zlog_debug("Deleting Default VRF");
3649 zlog_debug("Deleting %s %s",
3650 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3656 /* unmap from RT list */
3657 bgp_evpn_vrf_delete(bgp
);
3659 /* unmap bgp vrf label */
3660 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
3661 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
3664 if (bgp
->t_rmap_def_originate_eval
) {
3665 THREAD_OFF(bgp
->t_rmap_def_originate_eval
);
3666 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3670 /* Inform peers we're going down. */
3671 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3672 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3673 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3674 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3677 /* Delete static routes (networks). */
3678 bgp_static_delete(bgp
);
3680 /* Unset redistribution. */
3681 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3682 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
3683 if (i
!= ZEBRA_ROUTE_BGP
)
3684 bgp_redistribute_unset(bgp
, afi
, i
, 0);
3686 /* Free peers and peer-groups. */
3687 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, next
, group
))
3688 peer_group_delete(group
);
3690 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
))
3693 if (bgp
->peer_self
) {
3694 peer_delete(bgp
->peer_self
);
3695 bgp
->peer_self
= NULL
;
3698 update_bgp_group_free(bgp
);
3700 /* TODO - Other memory may need to be freed - e.g., NHT */
3702 #ifdef ENABLE_BGP_VNC
3705 bgp_cleanup_routes(bgp
);
3707 for (afi
= 0; afi
< AFI_MAX
; ++afi
) {
3708 if (!bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
3711 &bgp
->vpn_policy
[afi
]
3712 .import_redirect_rtlist
);
3713 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
3716 /* Deregister from Zebra, if needed */
3717 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
)) {
3718 if (BGP_DEBUG(zebra
, ZEBRA
))
3720 "%s: deregistering this bgp %s instance from zebra",
3721 __func__
, bgp
->name
);
3722 bgp_zebra_instance_deregister(bgp
);
3725 /* Remove visibility via the master list - there may however still be
3726 * routes to be processed still referencing the struct bgp.
3728 listnode_delete(bm
->bgp
, bgp
);
3730 /* Free interfaces in this instance. */
3733 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3734 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
3736 bgp_vrf_unlink(bgp
, vrf
);
3738 /* Update EVPN VRF pointer */
3739 if (bm
->bgp_evpn
== bgp
) {
3740 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3743 bgp_set_evpn(bgp_get_default());
3746 if (bgp
->process_queue
)
3747 work_queue_free_and_null(&bgp
->process_queue
);
3749 thread_master_free_unused(bm
->master
);
3750 bgp_unlock(bgp
); /* initial reference */
3755 void bgp_free(struct bgp
*bgp
)
3759 struct bgp_table
*table
;
3760 struct bgp_dest
*dest
;
3761 struct bgp_rmap
*rmap
;
3765 list_delete(&bgp
->group
);
3766 list_delete(&bgp
->peer
);
3768 if (bgp
->peerhash
) {
3769 hash_free(bgp
->peerhash
);
3770 bgp
->peerhash
= NULL
;
3773 FOREACH_AFI_SAFI (afi
, safi
) {
3774 /* Special handling for 2-level routing tables. */
3775 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
3776 || safi
== SAFI_EVPN
) {
3777 for (dest
= bgp_table_top(bgp
->rib
[afi
][safi
]); dest
;
3778 dest
= bgp_route_next(dest
)) {
3779 table
= bgp_dest_get_bgp_table_info(dest
);
3780 bgp_table_finish(&table
);
3783 if (bgp
->route
[afi
][safi
])
3784 bgp_table_finish(&bgp
->route
[afi
][safi
]);
3785 if (bgp
->aggregate
[afi
][safi
])
3786 bgp_table_finish(&bgp
->aggregate
[afi
][safi
]);
3787 if (bgp
->rib
[afi
][safi
])
3788 bgp_table_finish(&bgp
->rib
[afi
][safi
]);
3789 rmap
= &bgp
->table_map
[afi
][safi
];
3790 XFREE(MTYPE_ROUTE_MAP_NAME
, rmap
->name
);
3793 bgp_scan_finish(bgp
);
3794 bgp_address_destroy(bgp
);
3795 bgp_tip_hash_destroy(bgp
);
3797 /* release the auto RD id */
3798 bf_release_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3800 bgp_evpn_cleanup(bgp
);
3801 bgp_pbr_cleanup(bgp
);
3802 bgp_srv6_cleanup(bgp
);
3803 XFREE(MTYPE_BGP_EVPN_INFO
, bgp
->evpn_info
);
3805 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3806 enum vpn_policy_direction dir
;
3808 if (bgp
->vpn_policy
[afi
].import_vrf
)
3809 list_delete(&bgp
->vpn_policy
[afi
].import_vrf
);
3810 if (bgp
->vpn_policy
[afi
].export_vrf
)
3811 list_delete(&bgp
->vpn_policy
[afi
].export_vrf
);
3813 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
3814 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3815 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3816 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
3817 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3818 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3821 XFREE(MTYPE_BGP
, bgp
->name
);
3822 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
3823 XFREE(MTYPE_BGP
, bgp
->snmp_stats
);
3825 XFREE(MTYPE_BGP
, bgp
);
3828 struct peer
*peer_lookup_by_conf_if(struct bgp
*bgp
, const char *conf_if
)
3831 struct listnode
*node
, *nnode
;
3837 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3838 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
3839 && !CHECK_FLAG(peer
->sflags
,
3840 PEER_STATUS_ACCEPT_PEER
))
3842 } else if (bm
->bgp
!= NULL
) {
3843 struct listnode
*bgpnode
, *nbgpnode
;
3845 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3846 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3848 && !strcmp(peer
->conf_if
, conf_if
)
3849 && !CHECK_FLAG(peer
->sflags
,
3850 PEER_STATUS_ACCEPT_PEER
))
3856 struct peer
*peer_lookup_by_hostname(struct bgp
*bgp
, const char *hostname
)
3859 struct listnode
*node
, *nnode
;
3865 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3866 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
3867 && !CHECK_FLAG(peer
->sflags
,
3868 PEER_STATUS_ACCEPT_PEER
))
3870 } else if (bm
->bgp
!= NULL
) {
3871 struct listnode
*bgpnode
, *nbgpnode
;
3873 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3874 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3876 && !strcmp(peer
->hostname
, hostname
)
3877 && !CHECK_FLAG(peer
->sflags
,
3878 PEER_STATUS_ACCEPT_PEER
))
3884 struct peer
*peer_lookup(struct bgp
*bgp
, union sockunion
*su
)
3886 struct peer
*peer
= NULL
;
3887 struct peer tmp_peer
;
3889 memset(&tmp_peer
, 0, sizeof(struct peer
));
3892 * We do not want to find the doppelganger peer so search for the peer
3894 * the hash that has PEER_FLAG_CONFIG_NODE
3896 SET_FLAG(tmp_peer
.flags
, PEER_FLAG_CONFIG_NODE
);
3901 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3902 } else if (bm
->bgp
!= NULL
) {
3903 struct listnode
*bgpnode
, *nbgpnode
;
3905 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
)) {
3906 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3915 struct peer
*peer_create_bind_dynamic_neighbor(struct bgp
*bgp
,
3916 union sockunion
*su
,
3917 struct peer_group
*group
)
3923 /* Create peer first; we've already checked group config is valid. */
3924 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
3925 group
->conf
->as_type
, group
);
3930 peer
= peer_lock(peer
);
3931 listnode_add(group
->peer
, peer
);
3933 peer_group2peer_config_copy(group
, peer
);
3936 * Bind peer for all AFs configured for the group. We don't call
3937 * peer_group_bind as that is sub-optimal and does some stuff we don't
3940 FOREACH_AFI_SAFI (afi
, safi
) {
3941 if (!group
->conf
->afc
[afi
][safi
])
3943 peer
->afc
[afi
][safi
] = 1;
3945 if (!peer_af_find(peer
, afi
, safi
))
3946 peer_af_create(peer
, afi
, safi
);
3948 peer_group2peer_config_copy_af(group
, peer
, afi
, safi
);
3951 /* Mark as dynamic, but also as a "config node" for other things to
3953 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
3954 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3960 peer_group_lookup_dynamic_neighbor_range(struct peer_group
*group
,
3961 struct prefix
*prefix
)
3963 struct listnode
*node
, *nnode
;
3964 struct prefix
*range
;
3967 afi
= family2afi(prefix
->family
);
3969 if (group
->listen_range
[afi
])
3970 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
3972 if (prefix_match(range
, prefix
))
3979 peer_group_lookup_dynamic_neighbor(struct bgp
*bgp
, struct prefix
*prefix
,
3980 struct prefix
**listen_range
)
3982 struct prefix
*range
= NULL
;
3983 struct peer_group
*group
= NULL
;
3984 struct listnode
*node
, *nnode
;
3986 *listen_range
= NULL
;
3988 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3989 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3992 } else if (bm
->bgp
!= NULL
) {
3993 struct listnode
*bgpnode
, *nbgpnode
;
3995 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3996 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3997 if ((range
= peer_group_lookup_dynamic_neighbor_range(
4003 *listen_range
= range
;
4004 return (group
&& range
) ? group
: NULL
;
4007 struct peer
*peer_lookup_dynamic_neighbor(struct bgp
*bgp
, union sockunion
*su
)
4009 struct peer_group
*group
;
4012 struct prefix prefix
;
4013 struct prefix
*listen_range
;
4016 if (!sockunion2hostprefix(su
, &prefix
))
4019 /* See if incoming connection matches a configured listen range. */
4020 group
= peer_group_lookup_dynamic_neighbor(bgp
, &prefix
, &listen_range
);
4031 if (bgp_debug_neighbor_events(NULL
))
4033 "Dynamic Neighbor %pFX matches group %s listen range %pFX",
4034 &prefix
, group
->name
, listen_range
);
4036 /* Are we within the listen limit? */
4037 dncount
= gbgp
->dynamic_neighbors_count
;
4039 if (dncount
>= gbgp
->dynamic_neighbors_limit
) {
4040 if (bgp_debug_neighbor_events(NULL
))
4042 "Dynamic Neighbor %pFX rejected - at limit %d",
4043 &prefix
, gbgp
->dynamic_neighbors_limit
);
4047 /* Ensure group is not disabled. */
4048 if (CHECK_FLAG(group
->conf
->flags
, PEER_FLAG_SHUTDOWN
)) {
4049 if (bgp_debug_neighbor_events(NULL
))
4051 "Dynamic Neighbor %pFX rejected - group %s disabled",
4052 &prefix
, group
->name
);
4056 /* Check that at least one AF is activated for the group. */
4057 if (!peer_group_af_configured(group
)) {
4058 if (bgp_debug_neighbor_events(NULL
))
4060 "Dynamic Neighbor %pFX rejected - no AF activated for group %s",
4061 &prefix
, group
->name
);
4065 /* Create dynamic peer and bind to associated group. */
4066 peer
= peer_create_bind_dynamic_neighbor(gbgp
, su
, group
);
4069 gbgp
->dynamic_neighbors_count
= ++dncount
;
4071 if (bgp_debug_neighbor_events(peer
))
4072 zlog_debug("%s Dynamic Neighbor added, group %s count %d",
4073 peer
->host
, group
->name
, dncount
);
4078 static void peer_drop_dynamic_neighbor(struct peer
*peer
)
4081 if (peer
->group
->bgp
) {
4082 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
4084 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
4086 if (bgp_debug_neighbor_events(peer
))
4087 zlog_debug("%s dropped from group %s, count %d", peer
->host
,
4088 peer
->group
->name
, dncount
);
4091 /* If peer is configured at least one address family return 1. */
4092 bool peer_active(struct peer
*peer
)
4094 if (BGP_PEER_SU_UNSPEC(peer
))
4096 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
] || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
4097 || peer
->afc
[AFI_IP
][SAFI_LABELED_UNICAST
]
4098 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
] || peer
->afc
[AFI_IP
][SAFI_ENCAP
]
4099 || peer
->afc
[AFI_IP
][SAFI_FLOWSPEC
]
4100 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
4101 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
]
4102 || peer
->afc
[AFI_IP6
][SAFI_LABELED_UNICAST
]
4103 || peer
->afc
[AFI_IP6
][SAFI_MPLS_VPN
]
4104 || peer
->afc
[AFI_IP6
][SAFI_ENCAP
]
4105 || peer
->afc
[AFI_IP6
][SAFI_FLOWSPEC
]
4106 || peer
->afc
[AFI_L2VPN
][SAFI_EVPN
])
4111 /* If peer is negotiated at least one address family return 1. */
4112 bool peer_active_nego(struct peer
*peer
)
4114 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
4115 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
4116 || peer
->afc_nego
[AFI_IP
][SAFI_LABELED_UNICAST
]
4117 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
4118 || peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
4119 || peer
->afc_nego
[AFI_IP
][SAFI_FLOWSPEC
]
4120 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
4121 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
4122 || peer
->afc_nego
[AFI_IP6
][SAFI_LABELED_UNICAST
]
4123 || peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
4124 || peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
4125 || peer
->afc_nego
[AFI_IP6
][SAFI_FLOWSPEC
]
4126 || peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
])
4131 /* If peer received at least one address family MP, return true */
4132 bool peer_afc_received(struct peer
*peer
)
4137 FOREACH_AFI_SAFI (afi
, safi
)
4138 if (peer
->afc_recv
[afi
][safi
])
4144 /* If peer advertised at least one address family MP, return true */
4145 bool peer_afc_advertised(struct peer
*peer
)
4150 FOREACH_AFI_SAFI (afi
, safi
)
4151 if (peer
->afc_adv
[afi
][safi
])
4157 void peer_change_action(struct peer
*peer
, afi_t afi
, safi_t safi
,
4158 enum peer_change_type type
)
4160 struct peer_af
*paf
;
4162 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4165 if (!peer_established(peer
))
4168 if (type
== peer_change_reset
) {
4169 /* If we're resetting session, we've to delete both peer struct
4171 if ((peer
->doppelganger
)
4172 && (peer
->doppelganger
->status
!= Deleted
)
4173 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
4174 PEER_FLAG_CONFIG_NODE
)))
4175 peer_delete(peer
->doppelganger
);
4177 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4178 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4179 } else if (type
== peer_change_reset_in
) {
4180 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4181 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4182 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0,
4183 BGP_ROUTE_REFRESH_NORMAL
);
4185 if ((peer
->doppelganger
)
4186 && (peer
->doppelganger
->status
!= Deleted
)
4187 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
4188 PEER_FLAG_CONFIG_NODE
)))
4189 peer_delete(peer
->doppelganger
);
4191 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4192 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4194 } else if (type
== peer_change_reset_out
) {
4195 paf
= peer_af_find(peer
, afi
, safi
);
4196 if (paf
&& paf
->subgroup
)
4197 SET_FLAG(paf
->subgroup
->sflags
,
4198 SUBGRP_STATUS_FORCE_UPDATES
);
4200 update_group_adjust_peer(paf
);
4201 bgp_announce_route(peer
, afi
, safi
, false);
4205 struct peer_flag_action
{
4209 /* This flag can be set for peer-group member. */
4210 uint8_t not_for_member
;
4212 /* Action when the flag is changed. */
4213 enum peer_change_type type
;
4216 static const struct peer_flag_action peer_flag_action_list
[] = {
4217 {PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
4218 {PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
4219 {PEER_FLAG_RTT_SHUTDOWN
, 0, peer_change_none
},
4220 {PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
4221 {PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
4222 {PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
4223 {PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
4224 {PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
4225 {PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
4226 {PEER_FLAG_ENFORCE_FIRST_AS
, 0, peer_change_reset_in
},
4227 {PEER_FLAG_IFPEER_V6ONLY
, 0, peer_change_reset
},
4228 {PEER_FLAG_ROUTEADV
, 0, peer_change_none
},
4229 {PEER_FLAG_TIMER
, 0, peer_change_none
},
4230 {PEER_FLAG_TIMER_CONNECT
, 0, peer_change_none
},
4231 {PEER_FLAG_TIMER_DELAYOPEN
, 0, peer_change_none
},
4232 {PEER_FLAG_PASSWORD
, 0, peer_change_none
},
4233 {PEER_FLAG_LOCAL_AS
, 0, peer_change_none
},
4234 {PEER_FLAG_LOCAL_AS_NO_PREPEND
, 0, peer_change_none
},
4235 {PEER_FLAG_LOCAL_AS_REPLACE_AS
, 0, peer_change_none
},
4236 {PEER_FLAG_UPDATE_SOURCE
, 0, peer_change_none
},
4237 {PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
, 0, peer_change_none
},
4238 {PEER_FLAG_EXTENDED_OPT_PARAMS
, 0, peer_change_reset
},
4239 {PEER_FLAG_ROLE_STRICT_MODE
, 0, peer_change_reset
},
4240 {PEER_FLAG_ROLE
, 0, peer_change_reset
},
4241 {PEER_FLAG_PORT
, 0, peer_change_reset
},
4244 static const struct peer_flag_action peer_af_flag_action_list
[] = {
4245 {PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
4246 {PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
4247 {PEER_FLAG_SEND_LARGE_COMMUNITY
, 1, peer_change_reset_out
},
4248 {PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
4249 {PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
4250 {PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
4251 {PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
4252 {PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
4253 {PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
4254 {PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
4255 {PEER_FLAG_DEFAULT_ORIGINATE
, 0, peer_change_none
},
4256 {PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
4257 {PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
4258 {PEER_FLAG_ALLOWAS_IN_ORIGIN
, 0, peer_change_reset_in
},
4259 {PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
4260 {PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
4261 {PEER_FLAG_MAX_PREFIX
, 0, peer_change_none
},
4262 {PEER_FLAG_MAX_PREFIX_WARNING
, 0, peer_change_none
},
4263 {PEER_FLAG_MAX_PREFIX_FORCE
, 0, peer_change_none
},
4264 {PEER_FLAG_MAX_PREFIX_OUT
, 0, peer_change_none
},
4265 {PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
4266 {PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
4267 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
4268 {PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
, 1, peer_change_reset_out
},
4269 {PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
4270 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
, 1, peer_change_reset_out
},
4271 {PEER_FLAG_WEIGHT
, 0, peer_change_reset_in
},
4272 {PEER_FLAG_DISABLE_ADDPATH_RX
, 0, peer_change_reset
},
4273 {PEER_FLAG_SOO
, 0, peer_change_reset
},
4276 /* Proper action set. */
4277 static int peer_flag_action_set(const struct peer_flag_action
*action_list
,
4278 int size
, struct peer_flag_action
*action
,
4285 const struct peer_flag_action
*match
= NULL
;
4287 /* Check peer's frag action. */
4288 for (i
= 0; i
< size
; i
++) {
4289 match
= &action_list
[i
];
4291 if (match
->flag
== 0)
4294 if (match
->flag
& flag
) {
4297 if (match
->type
== peer_change_reset_in
)
4299 if (match
->type
== peer_change_reset_out
)
4301 if (match
->type
== peer_change_reset
) {
4305 if (match
->not_for_member
)
4306 action
->not_for_member
= 1;
4310 /* Set peer clear type. */
4311 if (reset_in
&& reset_out
)
4312 action
->type
= peer_change_reset
;
4314 action
->type
= peer_change_reset_in
;
4316 action
->type
= peer_change_reset_out
;
4318 action
->type
= peer_change_none
;
4323 static void peer_flag_modify_action(struct peer
*peer
, uint32_t flag
)
4325 if (flag
== PEER_FLAG_SHUTDOWN
) {
4326 if (CHECK_FLAG(peer
->flags
, flag
)) {
4327 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
4328 peer_nsf_stop(peer
);
4330 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4332 if (peer
->t_pmax_restart
) {
4333 THREAD_OFF(peer
->t_pmax_restart
);
4334 if (bgp_debug_neighbor_events(peer
))
4336 "%pBP Maximum-prefix restart timer canceled",
4340 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4341 char *msg
= peer
->tx_shutdown_message
;
4343 uint8_t msgbuf
[BGP_ADMIN_SHUTDOWN_MSG_LEN
+ 1];
4345 if (!msg
&& peer_group_active(peer
))
4346 msg
= peer
->group
->conf
4347 ->tx_shutdown_message
;
4348 msglen
= msg
? strlen(msg
) : 0;
4349 if (msglen
> BGP_ADMIN_SHUTDOWN_MSG_LEN
)
4350 msglen
= BGP_ADMIN_SHUTDOWN_MSG_LEN
;
4354 memcpy(msgbuf
+ 1, msg
, msglen
);
4356 bgp_notify_send_with_data(
4357 peer
, BGP_NOTIFY_CEASE
,
4358 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
,
4359 msgbuf
, msglen
+ 1);
4362 peer
, BGP_NOTIFY_CEASE
,
4363 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
4365 bgp_session_reset(peer
);
4367 peer
->v_start
= BGP_INIT_START_TIMER
;
4368 BGP_EVENT_ADD(peer
, BGP_Stop
);
4370 } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4371 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
4372 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4373 else if (flag
== PEER_FLAG_PASSIVE
)
4374 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
4375 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
4376 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
4378 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4379 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4381 bgp_session_reset(peer
);
4384 /* Enable global administrative shutdown of all peers of BGP instance */
4385 void bgp_shutdown_enable(struct bgp
*bgp
, const char *msg
)
4388 struct listnode
*node
;
4389 /* length(1) + message(N) */
4390 uint8_t data
[BGP_ADMIN_SHUTDOWN_MSG_LEN
+ 1];
4392 /* do nothing if already shut down */
4393 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
))
4396 /* informational log message */
4397 zlog_info("Enabled administrative shutdown on BGP instance AS %u",
4400 /* iterate through peers of BGP instance */
4401 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
4402 /* continue, if peer is already in administrative shutdown. */
4403 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
4406 /* send a RFC 4486 notification message if necessary */
4407 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4409 size_t datalen
= strlen(msg
);
4411 if (datalen
> BGP_ADMIN_SHUTDOWN_MSG_LEN
)
4412 datalen
= BGP_ADMIN_SHUTDOWN_MSG_LEN
;
4415 memcpy(data
+ 1, msg
, datalen
);
4417 bgp_notify_send_with_data(
4418 peer
, BGP_NOTIFY_CEASE
,
4419 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
, data
,
4423 peer
, BGP_NOTIFY_CEASE
,
4424 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
4428 /* reset start timer to initial value */
4429 peer
->v_start
= BGP_INIT_START_TIMER
;
4431 /* trigger a RFC 4271 ManualStop event */
4432 BGP_EVENT_ADD(peer
, BGP_Stop
);
4435 /* set the BGP instances shutdown flag */
4436 SET_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
);
4439 /* Disable global administrative shutdown of all peers of BGP instance */
4440 void bgp_shutdown_disable(struct bgp
*bgp
)
4442 /* do nothing if not shut down. */
4443 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
))
4446 /* informational log message */
4447 zlog_info("Disabled administrative shutdown on BGP instance AS %u",
4450 /* clear the BGP instances shutdown flag */
4451 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
);
4454 /* Change specified peer flag. */
4455 static int peer_flag_modify(struct peer
*peer
, uint64_t flag
, int set
)
4459 bool invert
, member_invert
;
4460 struct peer
*member
;
4461 struct listnode
*node
, *nnode
;
4462 struct peer_flag_action action
;
4464 memset(&action
, 0, sizeof(struct peer_flag_action
));
4465 size
= sizeof(peer_flag_action_list
) / sizeof(struct peer_flag_action
);
4467 invert
= CHECK_FLAG(peer
->flags_invert
, flag
);
4468 found
= peer_flag_action_set(peer_flag_action_list
, size
, &action
,
4471 /* Abort if no flag action exists. */
4473 return BGP_ERR_INVALID_FLAG
;
4475 /* Check for flag conflict: STRICT_CAP_MATCH && OVERRIDE_CAPABILITY */
4476 if (set
&& CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
4477 && CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4478 return BGP_ERR_PEER_FLAG_CONFLICT
;
4480 /* Handle flag updates where desired state matches current state. */
4481 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4482 if (set
&& CHECK_FLAG(peer
->flags
, flag
)) {
4483 COND_FLAG(peer
->flags_override
, flag
, !invert
);
4487 if (!set
&& !CHECK_FLAG(peer
->flags
, flag
)) {
4488 COND_FLAG(peer
->flags_override
, flag
, invert
);
4493 /* Inherit from peer-group or set/unset flags accordingly. */
4494 if (peer_group_active(peer
) && set
== invert
)
4495 peer_flag_inherit(peer
, flag
);
4497 COND_FLAG(peer
->flags
, flag
, set
);
4499 /* Check if handling a regular peer. */
4500 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4501 /* Update flag override state accordingly. */
4502 COND_FLAG(peer
->flags_override
, flag
, set
!= invert
);
4505 * For the extended next-hop encoding flag we need to turn RAs
4506 * on if flag is being set, but only turn RAs off if the flag
4507 * is being unset on this peer and if this peer is a member of a
4508 * peer-group, the peer-group also doesn't have the flag set.
4510 if (flag
== PEER_FLAG_CAPABILITY_ENHE
) {
4512 bgp_zebra_initiate_radv(peer
->bgp
, peer
);
4513 } else if (peer_group_active(peer
)) {
4514 if (!CHECK_FLAG(peer
->group
->conf
->flags
,
4517 bgp_zebra_terminate_radv(peer
->bgp
,
4520 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4523 /* Execute flag action on peer. */
4524 if (action
.type
== peer_change_reset
)
4525 peer_flag_modify_action(peer
, flag
);
4527 /* Skip peer-group mechanics for regular peers. */
4532 * Update peer-group members, unless they are explicitly overriding
4533 * peer-group configuration.
4535 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4536 /* Skip peers with overridden configuration. */
4537 if (CHECK_FLAG(member
->flags_override
, flag
))
4540 /* Check if only member without group is inverted. */
4542 CHECK_FLAG(member
->flags_invert
, flag
) && !invert
;
4544 /* Skip peers with equivalent configuration. */
4545 if (set
!= member_invert
&& CHECK_FLAG(member
->flags
, flag
))
4548 if (set
== member_invert
&& !CHECK_FLAG(member
->flags
, flag
))
4551 /* Update flag on peer-group member. */
4552 COND_FLAG(member
->flags
, flag
, set
!= member_invert
);
4554 if (flag
== PEER_FLAG_CAPABILITY_ENHE
&& !member
->conf_if
)
4555 set
? bgp_zebra_initiate_radv(member
->bgp
, member
)
4556 : bgp_zebra_terminate_radv(member
->bgp
, member
);
4558 /* Execute flag action on peer-group member. */
4559 if (action
.type
== peer_change_reset
)
4560 peer_flag_modify_action(member
, flag
);
4566 int peer_flag_set(struct peer
*peer
, uint64_t flag
)
4568 return peer_flag_modify(peer
, flag
, 1);
4571 int peer_flag_unset(struct peer
*peer
, uint64_t flag
)
4573 return peer_flag_modify(peer
, flag
, 0);
4576 static int peer_af_flag_modify(struct peer
*peer
, afi_t afi
, safi_t safi
,
4577 uint64_t flag
, bool set
)
4581 bool invert
, member_invert
;
4582 struct peer
*member
;
4583 struct listnode
*node
, *nnode
;
4584 struct peer_flag_action action
;
4585 enum bgp_peer_sort ptype
;
4587 memset(&action
, 0, sizeof(struct peer_flag_action
));
4588 size
= sizeof(peer_af_flag_action_list
)
4589 / sizeof(struct peer_flag_action
);
4591 invert
= CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
);
4592 found
= peer_flag_action_set(peer_af_flag_action_list
, size
, &action
,
4595 /* Abort if flag action exists. */
4597 return BGP_ERR_INVALID_FLAG
;
4599 ptype
= peer_sort(peer
);
4600 /* Special check for reflector client. */
4601 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
&& ptype
!= BGP_PEER_IBGP
)
4602 return BGP_ERR_NOT_INTERNAL_PEER
;
4604 /* Special check for remove-private-AS. */
4605 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
&& ptype
== BGP_PEER_IBGP
)
4606 return BGP_ERR_REMOVE_PRIVATE_AS
;
4608 /* as-override is not allowed for IBGP peers */
4609 if (flag
& PEER_FLAG_AS_OVERRIDE
&& ptype
== BGP_PEER_IBGP
)
4610 return BGP_ERR_AS_OVERRIDE
;
4612 /* Handle flag updates where desired state matches current state. */
4613 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4614 if (set
&& CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4615 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4620 if (!set
&& !CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4621 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4628 * For EVPN we implicitly set the NEXTHOP_UNCHANGED flag,
4629 * if we are setting/unsetting flags which conflict with this flag
4630 * handle accordingly
4632 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
4636 * if we are setting NEXTHOP_SELF, we need to unset the
4637 * NEXTHOP_UNCHANGED flag
4639 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4640 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4641 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4642 PEER_FLAG_NEXTHOP_UNCHANGED
);
4646 * if we are unsetting NEXTHOP_SELF, we need to set the
4647 * NEXTHOP_UNCHANGED flag to reset the defaults for EVPN
4649 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4650 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4651 SET_FLAG(peer
->af_flags
[afi
][safi
],
4652 PEER_FLAG_NEXTHOP_UNCHANGED
);
4657 * If the peer is a route server client let's not
4658 * muck with the nexthop on the way out the door
4660 if (flag
& PEER_FLAG_RSERVER_CLIENT
) {
4662 SET_FLAG(peer
->af_flags
[afi
][safi
],
4663 PEER_FLAG_NEXTHOP_UNCHANGED
);
4665 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4666 PEER_FLAG_NEXTHOP_UNCHANGED
);
4669 /* Inherit from peer-group or set/unset flags accordingly. */
4670 if (peer_group_active(peer
) && set
== invert
)
4671 peer_af_flag_inherit(peer
, afi
, safi
, flag
);
4673 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, set
);
4675 /* Execute action when peer is established. */
4676 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
4677 && peer_established(peer
)) {
4678 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4679 bgp_clear_adj_in(peer
, afi
, safi
);
4681 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4682 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
4683 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
4684 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
4685 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
4686 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4687 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
4688 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4690 peer_change_action(peer
, afi
, safi
, action
.type
);
4694 /* Check if handling a regular peer. */
4695 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4696 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4700 * Update peer-group members, unless they are explicitly
4701 * overriding peer-group configuration.
4703 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
,
4705 /* Skip peers with overridden configuration. */
4706 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4710 /* Check if only member without group is inverted. */
4712 CHECK_FLAG(member
->af_flags_invert
[afi
][safi
],
4716 /* Skip peers with equivalent configuration. */
4717 if (set
!= member_invert
4718 && CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4721 if (set
== member_invert
4722 && !CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4725 /* Update flag on peer-group member. */
4726 COND_FLAG(member
->af_flags
[afi
][safi
], flag
,
4727 set
!= member_invert
);
4729 /* Execute flag action on peer-group member. */
4730 if (peer_established(member
)) {
4731 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4732 bgp_clear_adj_in(member
, afi
, safi
);
4734 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4735 member
->last_reset
=
4736 PEER_DOWN_RR_CLIENT_CHANGE
;
4738 == PEER_FLAG_RSERVER_CLIENT
)
4739 member
->last_reset
=
4740 PEER_DOWN_RS_CLIENT_CHANGE
;
4742 == PEER_FLAG_ORF_PREFIX_SM
)
4743 member
->last_reset
=
4744 PEER_DOWN_CAPABILITY_CHANGE
;
4746 == PEER_FLAG_ORF_PREFIX_RM
)
4747 member
->last_reset
=
4748 PEER_DOWN_CAPABILITY_CHANGE
;
4750 peer_change_action(member
, afi
, safi
,
4760 int peer_af_flag_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint64_t flag
)
4762 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 1);
4765 int peer_af_flag_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, uint64_t flag
)
4767 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 0);
4771 void peer_tx_shutdown_message_set(struct peer
*peer
, const char *msg
)
4773 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4774 peer
->tx_shutdown_message
=
4775 msg
? XSTRDUP(MTYPE_PEER_TX_SHUTDOWN_MSG
, msg
) : NULL
;
4778 void peer_tx_shutdown_message_unset(struct peer
*peer
)
4780 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4784 /* EBGP multihop configuration. */
4785 int peer_ebgp_multihop_set(struct peer
*peer
, int ttl
)
4787 struct peer_group
*group
;
4788 struct listnode
*node
, *nnode
;
4791 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
4794 /* is there anything to do? */
4795 if (peer
->ttl
== ttl
)
4798 /* see comment in peer_ttl_security_hops_set() */
4799 if (ttl
!= MAXTTL
) {
4800 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4801 group
= peer
->group
;
4802 if (group
->conf
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
)
4803 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4805 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
4807 if (peer1
->sort
== BGP_PEER_IBGP
)
4810 if (peer1
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
)
4811 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4814 if (peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
)
4815 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4821 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4822 if (peer
->sort
!= BGP_PEER_IBGP
) {
4823 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4824 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4825 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4827 bgp_session_reset(peer
);
4829 /* Reconfigure BFD peer with new TTL. */
4830 if (peer
->bfd_config
)
4831 bgp_peer_bfd_update_source(peer
);
4834 group
= peer
->group
;
4835 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4836 if (peer
->sort
== BGP_PEER_IBGP
)
4839 peer
->ttl
= group
->conf
->ttl
;
4841 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4842 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4843 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4845 bgp_session_reset(peer
);
4847 /* Reconfigure BFD peer with new TTL. */
4848 if (peer
->bfd_config
)
4849 bgp_peer_bfd_update_source(peer
);
4855 int peer_ebgp_multihop_unset(struct peer
*peer
)
4857 struct peer_group
*group
;
4858 struct listnode
*node
, *nnode
;
4861 if (peer
->sort
== BGP_PEER_IBGP
)
4864 if (peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
&& peer
->ttl
!= MAXTTL
)
4865 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4867 if (peer_group_active(peer
))
4868 ttl
= peer
->group
->conf
->ttl
;
4870 ttl
= BGP_DEFAULT_TTL
;
4872 if (ttl
== peer
->ttl
)
4877 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4878 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4879 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4880 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4882 bgp_session_reset(peer
);
4884 /* Reconfigure BFD peer with new TTL. */
4885 if (peer
->bfd_config
)
4886 bgp_peer_bfd_update_source(peer
);
4888 group
= peer
->group
;
4889 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4890 if (peer
->sort
== BGP_PEER_IBGP
)
4893 peer
->ttl
= BGP_DEFAULT_TTL
;
4895 if (peer
->fd
>= 0) {
4896 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4898 peer
, BGP_NOTIFY_CEASE
,
4899 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4901 bgp_session_reset(peer
);
4904 /* Reconfigure BFD peer with new TTL. */
4905 if (peer
->bfd_config
)
4906 bgp_peer_bfd_update_source(peer
);
4912 /* Set Open Policy Role and check its correctness */
4913 int peer_role_set(struct peer
*peer
, uint8_t role
, bool strict_mode
)
4915 struct peer
*member
;
4916 struct listnode
*node
, *nnode
;
4918 peer_flag_set(peer
, PEER_FLAG_ROLE
);
4920 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4921 if (peer
->sort
!= BGP_PEER_EBGP
)
4922 return BGP_ERR_INVALID_INTERNAL_ROLE
;
4924 if (peer
->local_role
== role
) {
4925 if (CHECK_FLAG(peer
->flags
,
4926 PEER_FLAG_ROLE_STRICT_MODE
) &&
4928 /* TODO: Is session restart needed if it was
4931 UNSET_FLAG(peer
->flags
,
4932 PEER_FLAG_ROLE_STRICT_MODE
);
4933 if (!CHECK_FLAG(peer
->flags
,
4934 PEER_FLAG_ROLE_STRICT_MODE
) &&
4936 SET_FLAG(peer
->flags
,
4937 PEER_FLAG_ROLE_STRICT_MODE
);
4938 /* Restart session to throw Role Mismatch
4941 if (peer
->remote_role
== ROLE_UNDEFINED
)
4942 bgp_session_reset(peer
);
4945 peer
->local_role
= role
;
4947 SET_FLAG(peer
->flags
,
4948 PEER_FLAG_ROLE_STRICT_MODE
);
4950 UNSET_FLAG(peer
->flags
,
4951 PEER_FLAG_ROLE_STRICT_MODE
);
4952 bgp_session_reset(peer
);
4958 peer
->local_role
= role
;
4959 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4960 if (member
->sort
!= BGP_PEER_EBGP
)
4961 return BGP_ERR_INVALID_INTERNAL_ROLE
;
4963 if (member
->local_role
== role
) {
4964 if (CHECK_FLAG(member
->flags
,
4965 PEER_FLAG_ROLE_STRICT_MODE
) &&
4967 /* TODO: Is session restart needed if it was
4970 UNSET_FLAG(member
->flags
,
4971 PEER_FLAG_ROLE_STRICT_MODE
);
4972 if (!CHECK_FLAG(member
->flags
,
4973 PEER_FLAG_ROLE_STRICT_MODE
) &&
4975 SET_FLAG(peer
->flags
,
4976 PEER_FLAG_ROLE_STRICT_MODE
);
4977 SET_FLAG(member
->flags
,
4978 PEER_FLAG_ROLE_STRICT_MODE
);
4979 /* Restart session to throw Role Mismatch
4982 if (member
->remote_role
== ROLE_UNDEFINED
)
4983 bgp_session_reset(member
);
4986 member
->local_role
= role
;
4989 SET_FLAG(peer
->flags
,
4990 PEER_FLAG_ROLE_STRICT_MODE
);
4991 SET_FLAG(member
->flags
,
4992 PEER_FLAG_ROLE_STRICT_MODE
);
4994 UNSET_FLAG(member
->flags
,
4995 PEER_FLAG_ROLE_STRICT_MODE
);
4997 bgp_session_reset(member
);
5004 int peer_role_unset(struct peer
*peer
)
5006 struct peer
*member
;
5007 struct listnode
*node
, *nnode
;
5009 peer_flag_unset(peer
, PEER_FLAG_ROLE
);
5011 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5012 return peer_role_set(peer
, ROLE_UNDEFINED
, 0);
5014 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
))
5015 peer_role_set(member
, ROLE_UNDEFINED
, 0);
5020 /* Neighbor description. */
5021 void peer_description_set(struct peer
*peer
, const char *desc
)
5023 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
5025 peer
->desc
= XSTRDUP(MTYPE_PEER_DESC
, desc
);
5028 void peer_description_unset(struct peer
*peer
)
5030 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
5033 /* Neighbor update-source. */
5034 int peer_update_source_if_set(struct peer
*peer
, const char *ifname
)
5036 struct peer
*member
;
5037 struct listnode
*node
, *nnode
;
5039 /* Set flag and configuration on peer. */
5040 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
5041 if (peer
->update_if
) {
5042 if (strcmp(peer
->update_if
, ifname
) == 0)
5044 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
5046 peer
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
5047 sockunion_free(peer
->update_source
);
5048 peer
->update_source
= NULL
;
5050 /* Check if handling a regular peer. */
5051 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5052 /* Send notification or reset peer depending on state. */
5053 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5054 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
5055 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5056 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5058 bgp_session_reset(peer
);
5060 /* Apply new source configuration to BFD session. */
5061 if (peer
->bfd_config
)
5062 bgp_peer_bfd_update_source(peer
);
5064 /* Skip peer-group mechanics for regular peers. */
5069 * Set flag and configuration on all peer-group members, unless they are
5070 * explicitly overriding peer-group configuration.
5072 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5073 /* Skip peers with overridden configuration. */
5074 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
5077 /* Skip peers with the same configuration. */
5078 if (member
->update_if
) {
5079 if (strcmp(member
->update_if
, ifname
) == 0)
5081 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
5084 /* Set flag and configuration on peer-group member. */
5085 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
5086 member
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
5087 sockunion_free(member
->update_source
);
5088 member
->update_source
= NULL
;
5090 /* Send notification or reset peer depending on state. */
5091 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5092 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
5093 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5094 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5096 bgp_session_reset(member
);
5098 /* Apply new source configuration to BFD session. */
5099 if (member
->bfd_config
)
5100 bgp_peer_bfd_update_source(member
);
5106 void peer_update_source_addr_set(struct peer
*peer
, const union sockunion
*su
)
5108 struct peer
*member
;
5109 struct listnode
*node
, *nnode
;
5111 /* Set flag and configuration on peer. */
5112 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
5113 if (peer
->update_source
) {
5114 if (sockunion_cmp(peer
->update_source
, su
) == 0)
5116 sockunion_free(peer
->update_source
);
5118 peer
->update_source
= sockunion_dup(su
);
5119 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
5121 /* Check if handling a regular peer. */
5122 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5123 /* Send notification or reset peer depending on state. */
5124 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5125 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
5126 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5127 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5129 bgp_session_reset(peer
);
5131 /* Apply new source configuration to BFD session. */
5132 if (peer
->bfd_config
)
5133 bgp_peer_bfd_update_source(peer
);
5135 /* Skip peer-group mechanics for regular peers. */
5140 * Set flag and configuration on all peer-group members, unless they are
5141 * explicitly overriding peer-group configuration.
5143 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5144 /* Skip peers with overridden configuration. */
5145 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
5148 /* Skip peers with the same configuration. */
5149 if (member
->update_source
) {
5150 if (sockunion_cmp(member
->update_source
, su
) == 0)
5152 sockunion_free(member
->update_source
);
5155 /* Set flag and configuration on peer-group member. */
5156 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
5157 member
->update_source
= sockunion_dup(su
);
5158 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
5160 /* Send notification or reset peer depending on state. */
5161 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5162 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
5163 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5164 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5166 bgp_session_reset(member
);
5168 /* Apply new source configuration to BFD session. */
5169 if (member
->bfd_config
)
5170 bgp_peer_bfd_update_source(member
);
5174 void peer_update_source_unset(struct peer
*peer
)
5176 struct peer
*member
;
5177 struct listnode
*node
, *nnode
;
5179 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_UPDATE_SOURCE
))
5182 /* Inherit configuration from peer-group if peer is member. */
5183 if (peer_group_active(peer
)) {
5184 peer_flag_inherit(peer
, PEER_FLAG_UPDATE_SOURCE
);
5185 PEER_SU_ATTR_INHERIT(peer
, peer
->group
, update_source
);
5186 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, update_if
,
5187 MTYPE_PEER_UPDATE_SOURCE
);
5189 /* Otherwise remove flag and configuration from peer. */
5190 peer_flag_unset(peer
, PEER_FLAG_UPDATE_SOURCE
);
5191 sockunion_free(peer
->update_source
);
5192 peer
->update_source
= NULL
;
5193 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
5196 /* Check if handling a regular peer. */
5197 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5198 /* Send notification or reset peer depending on state. */
5199 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5200 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
5201 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5202 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5204 bgp_session_reset(peer
);
5206 /* Apply new source configuration to BFD session. */
5207 if (peer
->bfd_config
)
5208 bgp_peer_bfd_update_source(peer
);
5210 /* Skip peer-group mechanics for regular peers. */
5215 * Set flag and configuration on all peer-group members, unless they are
5216 * explicitly overriding peer-group configuration.
5218 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5219 /* Skip peers with overridden configuration. */
5220 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
5223 /* Skip peers with the same configuration. */
5224 if (!CHECK_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
)
5225 && !member
->update_source
&& !member
->update_if
)
5228 /* Remove flag and configuration on peer-group member. */
5229 UNSET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
5230 sockunion_free(member
->update_source
);
5231 member
->update_source
= NULL
;
5232 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
5234 /* Send notification or reset peer depending on state. */
5235 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5236 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
5237 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5238 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5240 bgp_session_reset(member
);
5242 /* Apply new source configuration to BFD session. */
5243 if (member
->bfd_config
)
5244 bgp_peer_bfd_update_source(member
);
5248 int peer_default_originate_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
5249 const char *rmap
, struct route_map
*route_map
)
5251 struct peer
*member
;
5252 struct listnode
*node
, *nnode
;
5253 struct update_subgroup
*subgrp
;
5255 /* Set flag and configuration on peer. */
5256 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
);
5258 subgrp
= peer_subgroup(peer
, afi
, safi
);
5261 if (!peer
->default_rmap
[afi
][safi
].name
5262 || strcmp(rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0) {
5263 if (peer
->default_rmap
[afi
][safi
].name
)
5264 XFREE(MTYPE_ROUTE_MAP_NAME
,
5265 peer
->default_rmap
[afi
][safi
].name
);
5268 * When there is a change in route-map policy,
5269 * this flow gets triggered. Since, the default
5270 * route is already originated, the flag is set.
5271 * The flag should be unset here,
5272 * to trigger the flow of sending update message.
5275 UNSET_FLAG(subgrp
->sflags
,
5276 SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5278 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
5279 peer
->default_rmap
[afi
][safi
].name
=
5280 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
5281 peer
->default_rmap
[afi
][safi
].map
= route_map
;
5282 route_map_counter_increment(route_map
);
5285 if (peer
->default_rmap
[afi
][safi
].name
)
5286 XFREE(MTYPE_ROUTE_MAP_NAME
,
5287 peer
->default_rmap
[afi
][safi
].name
);
5290 * This is triggered in case of route-map deletion.
5291 * The flag needs to be unset, to trigger the flow
5292 * of sending an update message.
5295 UNSET_FLAG(subgrp
->sflags
,
5296 SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5298 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
5299 peer
->default_rmap
[afi
][safi
].name
= NULL
;
5300 peer
->default_rmap
[afi
][safi
].map
= NULL
;
5303 /* Check if handling a regular peer. */
5304 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5305 /* Update peer route announcements. */
5306 if (peer_established(peer
) && peer
->afc_nego
[afi
][safi
]) {
5307 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
5308 bgp_default_originate(peer
, afi
, safi
, 0);
5309 bgp_announce_route(peer
, afi
, safi
, false);
5312 /* Skip peer-group mechanics for regular peers. */
5317 * Set flag and configuration on all peer-group members, unless they are
5318 * explicitly overriding peer-group configuration.
5320 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5321 /* Skip peers with overridden configuration. */
5322 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5323 PEER_FLAG_DEFAULT_ORIGINATE
))
5326 /* Set flag and configuration on peer-group member. */
5327 SET_FLAG(member
->af_flags
[afi
][safi
],
5328 PEER_FLAG_DEFAULT_ORIGINATE
);
5330 if (member
->default_rmap
[afi
][safi
].name
)
5331 XFREE(MTYPE_ROUTE_MAP_NAME
,
5332 member
->default_rmap
[afi
][safi
].name
);
5333 route_map_counter_decrement(
5334 member
->default_rmap
[afi
][safi
].map
);
5335 member
->default_rmap
[afi
][safi
].name
=
5336 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
5337 member
->default_rmap
[afi
][safi
].map
= route_map
;
5338 route_map_counter_increment(route_map
);
5341 /* Update peer route announcements. */
5342 if (peer_established(member
) && member
->afc_nego
[afi
][safi
]) {
5343 update_group_adjust_peer(
5344 peer_af_find(member
, afi
, safi
));
5345 bgp_default_originate(member
, afi
, safi
, 0);
5346 bgp_announce_route(member
, afi
, safi
, false);
5353 int peer_default_originate_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
5355 struct peer
*member
;
5356 struct listnode
*node
, *nnode
;
5358 /* Inherit configuration from peer-group if peer is member. */
5359 if (peer_group_active(peer
)) {
5360 peer_af_flag_inherit(peer
, afi
, safi
,
5361 PEER_FLAG_DEFAULT_ORIGINATE
);
5362 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
5363 default_rmap
[afi
][safi
].name
,
5364 MTYPE_ROUTE_MAP_NAME
);
5365 PEER_ATTR_INHERIT(peer
, peer
->group
,
5366 default_rmap
[afi
][safi
].map
);
5368 /* Otherwise remove flag and configuration from peer. */
5369 peer_af_flag_unset(peer
, afi
, safi
,
5370 PEER_FLAG_DEFAULT_ORIGINATE
);
5371 if (peer
->default_rmap
[afi
][safi
].name
)
5372 XFREE(MTYPE_ROUTE_MAP_NAME
,
5373 peer
->default_rmap
[afi
][safi
].name
);
5374 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
5375 peer
->default_rmap
[afi
][safi
].name
= NULL
;
5376 peer
->default_rmap
[afi
][safi
].map
= NULL
;
5379 /* Check if handling a regular peer. */
5380 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5381 /* Update peer route announcements. */
5382 if (peer_established(peer
) && peer
->afc_nego
[afi
][safi
]) {
5383 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
5384 bgp_default_originate(peer
, afi
, safi
, 1);
5385 bgp_announce_route(peer
, afi
, safi
, false);
5388 /* Skip peer-group mechanics for regular peers. */
5393 * Remove flag and configuration from all peer-group members, unless
5394 * they are explicitly overriding peer-group configuration.
5396 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5397 /* Skip peers with overridden configuration. */
5398 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5399 PEER_FLAG_DEFAULT_ORIGINATE
))
5402 /* Remove flag and configuration on peer-group member. */
5403 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5404 PEER_FLAG_DEFAULT_ORIGINATE
);
5405 if (member
->default_rmap
[afi
][safi
].name
)
5406 XFREE(MTYPE_ROUTE_MAP_NAME
,
5407 member
->default_rmap
[afi
][safi
].name
);
5408 route_map_counter_decrement(member
->default_rmap
[afi
][safi
].map
);
5409 member
->default_rmap
[afi
][safi
].name
= NULL
;
5410 member
->default_rmap
[afi
][safi
].map
= NULL
;
5412 /* Update peer route announcements. */
5413 if (peer_established(member
) && member
->afc_nego
[afi
][safi
]) {
5414 update_group_adjust_peer(peer_af_find(member
, afi
, safi
));
5415 bgp_default_originate(member
, afi
, safi
, 1);
5416 bgp_announce_route(member
, afi
, safi
, false);
5423 void peer_port_set(struct peer
*peer
, uint16_t port
)
5426 peer_flag_set(peer
, PEER_FLAG_PORT
);
5429 void peer_port_unset(struct peer
*peer
)
5431 peer
->port
= BGP_PORT_DEFAULT
;
5432 peer_flag_unset(peer
, PEER_FLAG_PORT
);
5435 /* Set the TCP-MSS value in the peer structure,
5436 * This gets applied only after connection reset
5437 * So this value will be used in bgp_connect.
5439 void peer_tcp_mss_set(struct peer
*peer
, uint32_t tcp_mss
)
5441 peer
->tcp_mss
= tcp_mss
;
5442 SET_FLAG(peer
->flags
, PEER_FLAG_TCP_MSS
);
5445 /* Reset the TCP-MSS value in the peer structure,
5446 * This gets applied only after connection reset
5447 * So this value will be used in bgp_connect.
5449 void peer_tcp_mss_unset(struct peer
*peer
)
5451 UNSET_FLAG(peer
->flags
, PEER_FLAG_TCP_MSS
);
5456 * Helper function that is called after the name of the policy
5457 * being used by a peer has changed (AF specific). Automatically
5458 * initiates inbound or outbound processing as needed.
5460 static void peer_on_policy_change(struct peer
*peer
, afi_t afi
, safi_t safi
,
5464 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
5465 if (peer_established(peer
))
5466 bgp_announce_route(peer
, afi
, safi
, false);
5468 if (!peer_established(peer
))
5471 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5472 PEER_FLAG_SOFT_RECONFIG
)) {
5473 bgp_soft_reconfig_in(peer
, afi
, safi
);
5474 } else if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
) ||
5475 CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
)) {
5476 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
5477 PEER_CAP_ORF_PREFIX_SM_ADV
) &&
5478 (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
5479 PEER_CAP_ORF_PREFIX_RM_RCV
) ||
5480 CHECK_FLAG(peer
->af_cap
[afi
][safi
],
5481 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5482 peer_clear_soft(peer
, afi
, safi
,
5483 BGP_CLEAR_SOFT_IN_ORF_PREFIX
);
5485 bgp_route_refresh_send(
5486 peer
, afi
, safi
, 0, 0, 0,
5487 BGP_ROUTE_REFRESH_NORMAL
);
5493 /* neighbor weight. */
5494 int peer_weight_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint16_t weight
)
5496 struct peer
*member
;
5497 struct listnode
*node
, *nnode
;
5499 /* Set flag and configuration on peer. */
5500 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
5501 if (peer
->weight
[afi
][safi
] != weight
) {
5502 peer
->weight
[afi
][safi
] = weight
;
5503 peer_on_policy_change(peer
, afi
, safi
, 0);
5506 /* Skip peer-group mechanics for regular peers. */
5507 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5511 * Set flag and configuration on all peer-group members, unless they are
5512 * explicitly overriding peer-group configuration.
5514 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5515 /* Skip peers with overridden configuration. */
5516 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5520 /* Set flag and configuration on peer-group member. */
5521 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
5522 if (member
->weight
[afi
][safi
] != weight
) {
5523 member
->weight
[afi
][safi
] = weight
;
5524 peer_on_policy_change(member
, afi
, safi
, 0);
5531 int peer_weight_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
5533 struct peer
*member
;
5534 struct listnode
*node
, *nnode
;
5536 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
5539 /* Inherit configuration from peer-group if peer is member. */
5540 if (peer_group_active(peer
)) {
5541 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
5542 PEER_ATTR_INHERIT(peer
, peer
->group
, weight
[afi
][safi
]);
5544 peer_on_policy_change(peer
, afi
, safi
, 0);
5548 /* Remove flag and configuration from peer. */
5549 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
5550 peer
->weight
[afi
][safi
] = 0;
5551 peer_on_policy_change(peer
, afi
, safi
, 0);
5553 /* Skip peer-group mechanics for regular peers. */
5554 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5558 * Remove flag and configuration from all peer-group members, unless
5559 * they are explicitly overriding peer-group configuration.
5561 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5562 /* Skip peers with overridden configuration. */
5563 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5567 /* Skip peers where flag is already disabled. */
5568 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
5571 /* Remove flag and configuration on peer-group member. */
5572 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
5573 member
->weight
[afi
][safi
] = 0;
5574 peer_on_policy_change(member
, afi
, safi
, 0);
5580 int peer_timers_set(struct peer
*peer
, uint32_t keepalive
, uint32_t holdtime
)
5582 struct peer
*member
;
5583 struct listnode
*node
, *nnode
;
5585 if (keepalive
> UINT16_MAX
)
5586 return BGP_ERR_INVALID_VALUE
;
5588 if (holdtime
> UINT16_MAX
)
5589 return BGP_ERR_INVALID_VALUE
;
5591 if (holdtime
< 3 && holdtime
!= 0)
5592 return BGP_ERR_INVALID_VALUE
;
5594 /* Set flag and configuration on peer. */
5595 peer_flag_set(peer
, PEER_FLAG_TIMER
);
5596 peer
->holdtime
= holdtime
;
5597 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
5599 /* Skip peer-group mechanics for regular peers. */
5600 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5604 * Set flag and configuration on all peer-group members, unless they are
5605 * explicitly overriding peer-group configuration.
5607 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5608 /* Skip peers with overridden configuration. */
5609 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
5612 /* Set flag and configuration on peer-group member. */
5613 SET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
5614 PEER_ATTR_INHERIT(member
, peer
->group
, holdtime
);
5615 PEER_ATTR_INHERIT(member
, peer
->group
, keepalive
);
5621 int peer_timers_unset(struct peer
*peer
)
5623 struct peer
*member
;
5624 struct listnode
*node
, *nnode
;
5626 /* Inherit configuration from peer-group if peer is member. */
5627 if (peer_group_active(peer
)) {
5628 peer_flag_inherit(peer
, PEER_FLAG_TIMER
);
5629 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
5630 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
5632 /* Otherwise remove flag and configuration from peer. */
5633 peer_flag_unset(peer
, PEER_FLAG_TIMER
);
5635 peer
->keepalive
= 0;
5638 /* Skip peer-group mechanics for regular peers. */
5639 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5643 * Remove flag and configuration from all peer-group members, unless
5644 * they are explicitly overriding peer-group configuration.
5646 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5647 /* Skip peers with overridden configuration. */
5648 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
5651 /* Remove flag and configuration on peer-group member. */
5652 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
5653 member
->holdtime
= 0;
5654 member
->keepalive
= 0;
5660 int peer_timers_connect_set(struct peer
*peer
, uint32_t connect
)
5662 struct peer
*member
;
5663 struct listnode
*node
, *nnode
;
5665 if (connect
> UINT16_MAX
)
5666 return BGP_ERR_INVALID_VALUE
;
5668 /* Set flag and configuration on peer. */
5669 peer_flag_set(peer
, PEER_FLAG_TIMER_CONNECT
);
5670 peer
->connect
= connect
;
5671 peer
->v_connect
= connect
;
5673 /* Skip peer-group mechanics for regular peers. */
5674 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5675 if (!peer_established(peer
)) {
5676 if (peer_active(peer
))
5677 BGP_EVENT_ADD(peer
, BGP_Stop
);
5678 BGP_EVENT_ADD(peer
, BGP_Start
);
5683 * Set flag and configuration on all peer-group members, unless they are
5684 * explicitly overriding peer-group configuration.
5686 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5687 /* Skip peers with overridden configuration. */
5688 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5691 /* Set flag and configuration on peer-group member. */
5692 SET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5693 member
->connect
= connect
;
5694 member
->v_connect
= connect
;
5696 if (!peer_established(member
)) {
5697 if (peer_active(member
))
5698 BGP_EVENT_ADD(member
, BGP_Stop
);
5699 BGP_EVENT_ADD(member
, BGP_Start
);
5706 int peer_timers_connect_unset(struct peer
*peer
)
5708 struct peer
*member
;
5709 struct listnode
*node
, *nnode
;
5711 /* Inherit configuration from peer-group if peer is member. */
5712 if (peer_group_active(peer
)) {
5713 peer_flag_inherit(peer
, PEER_FLAG_TIMER_CONNECT
);
5714 PEER_ATTR_INHERIT(peer
, peer
->group
, connect
);
5716 /* Otherwise remove flag and configuration from peer. */
5717 peer_flag_unset(peer
, PEER_FLAG_TIMER_CONNECT
);
5721 /* Set timer with fallback to default value. */
5723 peer
->v_connect
= peer
->connect
;
5725 peer
->v_connect
= peer
->bgp
->default_connect_retry
;
5727 /* Skip peer-group mechanics for regular peers. */
5728 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5729 if (!peer_established(peer
)) {
5730 if (peer_active(peer
))
5731 BGP_EVENT_ADD(peer
, BGP_Stop
);
5732 BGP_EVENT_ADD(peer
, BGP_Start
);
5737 * Remove flag and configuration from all peer-group members, unless
5738 * they are explicitly overriding peer-group configuration.
5740 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5741 /* Skip peers with overridden configuration. */
5742 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5745 /* Remove flag and configuration on peer-group member. */
5746 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5747 member
->connect
= 0;
5748 member
->v_connect
= peer
->bgp
->default_connect_retry
;
5750 if (!peer_established(member
)) {
5751 if (peer_active(member
))
5752 BGP_EVENT_ADD(member
, BGP_Stop
);
5753 BGP_EVENT_ADD(member
, BGP_Start
);
5760 int peer_advertise_interval_set(struct peer
*peer
, uint32_t routeadv
)
5762 struct peer
*member
;
5763 struct listnode
*node
, *nnode
;
5766 return BGP_ERR_INVALID_VALUE
;
5768 /* Set flag and configuration on peer. */
5769 peer_flag_set(peer
, PEER_FLAG_ROUTEADV
);
5770 peer
->routeadv
= routeadv
;
5771 peer
->v_routeadv
= routeadv
;
5773 /* Check if handling a regular peer. */
5774 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5775 /* Update peer route announcements. */
5776 update_group_adjust_peer_afs(peer
);
5777 if (peer_established(peer
))
5778 bgp_announce_route_all(peer
);
5780 /* Skip peer-group mechanics for regular peers. */
5785 * Set flag and configuration on all peer-group members, unless they are
5786 * explicitly overriding peer-group configuration.
5788 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5789 /* Skip peers with overridden configuration. */
5790 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5793 /* Set flag and configuration on peer-group member. */
5794 SET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5795 member
->routeadv
= routeadv
;
5796 member
->v_routeadv
= routeadv
;
5798 /* Update peer route announcements. */
5799 update_group_adjust_peer_afs(member
);
5800 if (peer_established(member
))
5801 bgp_announce_route_all(member
);
5807 int peer_advertise_interval_unset(struct peer
*peer
)
5809 struct peer
*member
;
5810 struct listnode
*node
, *nnode
;
5812 /* Inherit configuration from peer-group if peer is member. */
5813 if (peer_group_active(peer
)) {
5814 peer_flag_inherit(peer
, PEER_FLAG_ROUTEADV
);
5815 PEER_ATTR_INHERIT(peer
, peer
->group
, routeadv
);
5817 /* Otherwise remove flag and configuration from peer. */
5818 peer_flag_unset(peer
, PEER_FLAG_ROUTEADV
);
5822 /* Set timer with fallback to default value. */
5824 peer
->v_routeadv
= peer
->routeadv
;
5826 peer
->v_routeadv
= (peer
->sort
== BGP_PEER_IBGP
)
5827 ? BGP_DEFAULT_IBGP_ROUTEADV
5828 : BGP_DEFAULT_EBGP_ROUTEADV
;
5830 /* Check if handling a regular peer. */
5831 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5832 /* Update peer route announcements. */
5833 update_group_adjust_peer_afs(peer
);
5834 if (peer_established(peer
))
5835 bgp_announce_route_all(peer
);
5837 /* Skip peer-group mechanics for regular peers. */
5842 * Remove flag and configuration from all peer-group members, unless
5843 * they are explicitly overriding peer-group configuration.
5845 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5846 /* Skip peers with overridden configuration. */
5847 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5850 /* Remove flag and configuration on peer-group member. */
5851 UNSET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5852 member
->routeadv
= 0;
5853 member
->v_routeadv
= (member
->sort
== BGP_PEER_IBGP
)
5854 ? BGP_DEFAULT_IBGP_ROUTEADV
5855 : BGP_DEFAULT_EBGP_ROUTEADV
;
5857 /* Update peer route announcements. */
5858 update_group_adjust_peer_afs(member
);
5859 if (peer_established(member
))
5860 bgp_announce_route_all(member
);
5866 /* set the peers RFC 4271 DelayOpen session attribute flag and DelayOpenTimer
5869 int peer_timers_delayopen_set(struct peer
*peer
, uint32_t delayopen
)
5871 struct peer
*member
;
5872 struct listnode
*node
;
5874 /* Set peers session attribute flag and timer interval. */
5875 peer_flag_set(peer
, PEER_FLAG_TIMER_DELAYOPEN
);
5876 peer
->delayopen
= delayopen
;
5877 peer
->v_delayopen
= delayopen
;
5879 /* Skip group mechanics for regular peers. */
5880 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5883 /* Set flag and configuration on all peer-group members, unless they are
5884 * explicitly overriding peer-group configuration.
5886 for (ALL_LIST_ELEMENTS_RO(peer
->group
->peer
, node
, member
)) {
5887 /* Skip peers with overridden configuration. */
5888 if (CHECK_FLAG(member
->flags_override
,
5889 PEER_FLAG_TIMER_DELAYOPEN
))
5892 /* Set session attribute flag and timer intervals on peer-group
5895 SET_FLAG(member
->flags
, PEER_FLAG_TIMER_DELAYOPEN
);
5896 member
->delayopen
= delayopen
;
5897 member
->v_delayopen
= delayopen
;
5903 /* unset the peers RFC 4271 DelayOpen session attribute flag and reset the
5904 * DelayOpenTimer interval to the default value.
5906 int peer_timers_delayopen_unset(struct peer
*peer
)
5908 struct peer
*member
;
5909 struct listnode
*node
;
5911 /* Inherit configuration from peer-group if peer is member. */
5912 if (peer_group_active(peer
)) {
5913 peer_flag_inherit(peer
, PEER_FLAG_TIMER_DELAYOPEN
);
5914 PEER_ATTR_INHERIT(peer
, peer
->group
, delayopen
);
5916 /* Otherwise remove session attribute flag and set timer
5917 * interval to default value.
5919 peer_flag_unset(peer
, PEER_FLAG_TIMER_DELAYOPEN
);
5920 peer
->delayopen
= peer
->bgp
->default_delayopen
;
5923 /* Set timer value to zero */
5924 peer
->v_delayopen
= 0;
5926 /* Skip peer-group mechanics for regular peers. */
5927 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5930 /* Remove flag and configuration from all peer-group members, unless
5931 * they are explicitly overriding peer-group configuration.
5933 for (ALL_LIST_ELEMENTS_RO(peer
->group
->peer
, node
, member
)) {
5934 /* Skip peers with overridden configuration. */
5935 if (CHECK_FLAG(member
->flags_override
,
5936 PEER_FLAG_TIMER_DELAYOPEN
))
5939 /* Remove session attribute flag, reset the timer interval to
5940 * the default value and set the timer value to zero.
5942 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER_DELAYOPEN
);
5943 member
->delayopen
= peer
->bgp
->default_delayopen
;
5944 member
->v_delayopen
= 0;
5950 /* neighbor interface */
5951 void peer_interface_set(struct peer
*peer
, const char *str
)
5953 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5954 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
5957 void peer_interface_unset(struct peer
*peer
)
5959 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5963 int peer_allowas_in_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
5964 int allow_num
, int origin
)
5966 struct peer
*member
;
5967 struct listnode
*node
, *nnode
;
5969 if (!origin
&& (allow_num
< 1 || allow_num
> 10))
5970 return BGP_ERR_INVALID_VALUE
;
5972 /* Set flag and configuration on peer. */
5973 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5975 if (peer
->allowas_in
[afi
][safi
] != 0
5976 || !CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5977 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5978 peer_af_flag_set(peer
, afi
, safi
,
5979 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5980 peer
->allowas_in
[afi
][safi
] = 0;
5981 peer_on_policy_change(peer
, afi
, safi
, 0);
5984 if (peer
->allowas_in
[afi
][safi
] != allow_num
5985 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5986 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5988 peer_af_flag_unset(peer
, afi
, safi
,
5989 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5990 peer
->allowas_in
[afi
][safi
] = allow_num
;
5991 peer_on_policy_change(peer
, afi
, safi
, 0);
5995 /* Skip peer-group mechanics for regular peers. */
5996 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
6000 * Set flag and configuration on all peer-group members, unless
6001 * they are explicitly overriding peer-group configuration.
6003 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6004 /* Skip peers with overridden configuration. */
6005 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6006 PEER_FLAG_ALLOWAS_IN
))
6009 /* Set flag and configuration on peer-group member. */
6010 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
6012 if (member
->allowas_in
[afi
][safi
] != 0
6013 || !CHECK_FLAG(member
->af_flags
[afi
][safi
],
6014 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
6015 SET_FLAG(member
->af_flags
[afi
][safi
],
6016 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
6017 member
->allowas_in
[afi
][safi
] = 0;
6018 peer_on_policy_change(peer
, afi
, safi
, 0);
6021 if (member
->allowas_in
[afi
][safi
] != allow_num
6022 || CHECK_FLAG(member
->af_flags
[afi
][safi
],
6023 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
6024 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6025 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
6026 member
->allowas_in
[afi
][safi
] = allow_num
;
6027 peer_on_policy_change(peer
, afi
, safi
, 0);
6035 int peer_allowas_in_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6037 struct peer
*member
;
6038 struct listnode
*node
, *nnode
;
6040 /* Skip peer if flag is already disabled. */
6041 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
6044 /* Inherit configuration from peer-group if peer is member. */
6045 if (peer_group_active(peer
)) {
6046 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
6047 peer_af_flag_inherit(peer
, afi
, safi
,
6048 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
6049 PEER_ATTR_INHERIT(peer
, peer
->group
, allowas_in
[afi
][safi
]);
6050 peer_on_policy_change(peer
, afi
, safi
, 0);
6055 /* Remove flag and configuration from peer. */
6056 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
6057 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN_ORIGIN
);
6058 peer
->allowas_in
[afi
][safi
] = 0;
6059 peer_on_policy_change(peer
, afi
, safi
, 0);
6061 /* Skip peer-group mechanics if handling a regular peer. */
6062 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
6066 * Remove flags and configuration from all peer-group members, unless
6067 * they are explicitly overriding peer-group configuration.
6069 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6070 /* Skip peers with overridden configuration. */
6071 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6072 PEER_FLAG_ALLOWAS_IN
))
6075 /* Remove flags and configuration on peer-group member. */
6076 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
6077 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6078 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
6079 member
->allowas_in
[afi
][safi
] = 0;
6080 peer_on_policy_change(member
, afi
, safi
, 0);
6086 int peer_local_as_set(struct peer
*peer
, as_t as
, bool no_prepend
,
6089 bool old_no_prepend
, old_replace_as
;
6090 struct bgp
*bgp
= peer
->bgp
;
6091 struct peer
*member
;
6092 struct listnode
*node
, *nnode
;
6093 enum bgp_peer_sort ptype
= peer_sort(peer
);
6095 if (ptype
!= BGP_PEER_EBGP
&& ptype
!= BGP_PEER_INTERNAL
)
6096 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
6099 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
6102 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
6104 /* Save previous flag states. */
6106 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
6108 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
6110 /* Set flag and configuration on peer. */
6111 peer_flag_set(peer
, PEER_FLAG_LOCAL_AS
);
6112 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
, no_prepend
);
6113 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
, replace_as
);
6115 if (peer
->change_local_as
== as
&& old_no_prepend
== no_prepend
6116 && old_replace_as
== replace_as
)
6118 peer
->change_local_as
= as
;
6120 /* Check if handling a regular peer. */
6121 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6122 /* Send notification or reset peer depending on state. */
6123 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
6124 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
6125 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
6126 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6128 bgp_session_reset(peer
);
6130 /* Skip peer-group mechanics for regular peers. */
6135 * Set flag and configuration on all peer-group members, unless they are
6136 * explicitly overriding peer-group configuration.
6138 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6139 /* Skip peers with overridden configuration. */
6140 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
6143 /* Skip peers with the same configuration. */
6144 old_no_prepend
= CHECK_FLAG(member
->flags
,
6145 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
6146 old_replace_as
= CHECK_FLAG(member
->flags
,
6147 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
6148 if (member
->change_local_as
== as
6149 && CHECK_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
)
6150 && old_no_prepend
== no_prepend
6151 && old_replace_as
== replace_as
)
6154 /* Set flag and configuration on peer-group member. */
6155 SET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
6156 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
,
6158 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
,
6160 member
->change_local_as
= as
;
6162 /* Send notification or stop peer depending on state. */
6163 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
6164 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
6165 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
6166 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6168 BGP_EVENT_ADD(member
, BGP_Stop
);
6174 int peer_local_as_unset(struct peer
*peer
)
6176 struct peer
*member
;
6177 struct listnode
*node
, *nnode
;
6179 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS
))
6182 /* Inherit configuration from peer-group if peer is member. */
6183 if (peer_group_active(peer
)) {
6184 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS
);
6185 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
6186 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
6187 PEER_ATTR_INHERIT(peer
, peer
->group
, change_local_as
);
6189 /* Otherwise remove flag and configuration from peer. */
6190 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
6191 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
6192 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
6193 peer
->change_local_as
= 0;
6196 /* Check if handling a regular peer. */
6197 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6198 /* Send notification or stop peer depending on state. */
6199 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
6200 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
6201 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
6202 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6204 BGP_EVENT_ADD(peer
, BGP_Stop
);
6206 /* Skip peer-group mechanics for regular peers. */
6211 * Remove flag and configuration from all peer-group members, unless
6212 * they are explicitly overriding peer-group configuration.
6214 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6215 /* Skip peers with overridden configuration. */
6216 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
6219 /* Remove flag and configuration on peer-group member. */
6220 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
6221 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
6222 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
6223 member
->change_local_as
= 0;
6225 /* Send notification or stop peer depending on state. */
6226 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
6227 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
6228 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
6229 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6231 bgp_session_reset(member
);
6237 /* Set password for authenticating with the peer. */
6238 int peer_password_set(struct peer
*peer
, const char *password
)
6240 struct peer
*member
;
6241 struct listnode
*node
, *nnode
;
6242 int len
= password
? strlen(password
) : 0;
6243 int ret
= BGP_SUCCESS
;
6245 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
6246 return BGP_ERR_INVALID_VALUE
;
6248 /* Set flag and configuration on peer. */
6249 peer_flag_set(peer
, PEER_FLAG_PASSWORD
);
6250 if (peer
->password
&& strcmp(peer
->password
, password
) == 0)
6252 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
6253 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
6255 /* Check if handling a regular peer. */
6256 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6257 /* Send notification or reset peer depending on state. */
6258 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
6259 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
6260 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6262 bgp_session_reset(peer
);
6265 * Attempt to install password on socket and skip peer-group
6268 if (BGP_PEER_SU_UNSPEC(peer
))
6270 return (bgp_md5_set(peer
) >= 0) ? BGP_SUCCESS
6271 : BGP_ERR_TCPSIG_FAILED
;
6275 * Set flag and configuration on all peer-group members, unless they are
6276 * explicitly overriding peer-group configuration.
6278 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6279 /* Skip peers with overridden configuration. */
6280 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
6283 /* Skip peers with the same password. */
6284 if (member
->password
&& strcmp(member
->password
, password
) == 0)
6287 /* Set flag and configuration on peer-group member. */
6288 SET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
6289 if (member
->password
)
6290 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
6291 member
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
6293 /* Send notification or reset peer depending on state. */
6294 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
6295 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
6296 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6298 bgp_session_reset(member
);
6300 /* Attempt to install password on socket. */
6301 if (!BGP_PEER_SU_UNSPEC(member
) && bgp_md5_set(member
) < 0)
6302 ret
= BGP_ERR_TCPSIG_FAILED
;
6305 /* Set flag and configuration on all peer-group listen ranges */
6306 struct listnode
*ln
;
6309 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP
], ln
, lr
))
6310 bgp_md5_set_prefix(peer
->bgp
, lr
, password
);
6311 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP6
], ln
, lr
))
6312 bgp_md5_set_prefix(peer
->bgp
, lr
, password
);
6317 int peer_password_unset(struct peer
*peer
)
6319 struct peer
*member
;
6320 struct listnode
*node
, *nnode
;
6322 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
))
6325 /* Inherit configuration from peer-group if peer is member. */
6326 if (peer_group_active(peer
)) {
6327 peer_flag_inherit(peer
, PEER_FLAG_PASSWORD
);
6328 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, password
,
6329 MTYPE_PEER_PASSWORD
);
6331 /* Otherwise remove flag and configuration from peer. */
6332 peer_flag_unset(peer
, PEER_FLAG_PASSWORD
);
6333 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
6336 /* Check if handling a regular peer. */
6337 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6338 /* Send notification or reset peer depending on state. */
6339 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
6340 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
6341 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6343 bgp_session_reset(peer
);
6345 /* Attempt to uninstall password on socket. */
6346 if (!BGP_PEER_SU_UNSPEC(peer
))
6347 bgp_md5_unset(peer
);
6348 /* Skip peer-group mechanics for regular peers. */
6353 * Remove flag and configuration from all peer-group members, unless
6354 * they are explicitly overriding peer-group configuration.
6356 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6357 /* Skip peers with overridden configuration. */
6358 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
6361 /* Remove flag and configuration on peer-group member. */
6362 UNSET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
6363 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
6365 /* Send notification or reset peer depending on state. */
6366 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
6367 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
6368 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
6370 bgp_session_reset(member
);
6372 /* Attempt to uninstall password on socket. */
6373 if (!BGP_PEER_SU_UNSPEC(member
))
6374 bgp_md5_unset(member
);
6377 /* Set flag and configuration on all peer-group listen ranges */
6378 struct listnode
*ln
;
6381 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP
], ln
, lr
))
6382 bgp_md5_unset_prefix(peer
->bgp
, lr
);
6383 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP6
], ln
, lr
))
6384 bgp_md5_unset_prefix(peer
->bgp
, lr
);
6390 /* Set distribute list to the peer. */
6391 int peer_distribute_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6394 struct peer
*member
;
6395 struct bgp_filter
*filter
;
6396 struct listnode
*node
, *nnode
;
6398 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6399 return BGP_ERR_INVALID_VALUE
;
6401 /* Set configuration on peer. */
6402 filter
= &peer
->filter
[afi
][safi
];
6403 if (filter
->plist
[direct
].name
)
6404 return BGP_ERR_PEER_FILTER_CONFLICT
;
6405 if (filter
->dlist
[direct
].name
)
6406 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
6407 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6408 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
6410 /* Check if handling a regular peer. */
6411 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6412 /* Set override-flag and process peer route updates. */
6413 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6414 PEER_FT_DISTRIBUTE_LIST
);
6415 peer_on_policy_change(peer
, afi
, safi
,
6416 (direct
== FILTER_OUT
) ? 1 : 0);
6418 /* Skip peer-group mechanics for regular peers. */
6423 * Set configuration on all peer-group members, un less they are
6424 * explicitly overriding peer-group configuration.
6426 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6427 /* Skip peers with overridden configuration. */
6428 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6429 PEER_FT_DISTRIBUTE_LIST
))
6432 /* Set configuration on peer-group member. */
6433 filter
= &member
->filter
[afi
][safi
];
6434 if (filter
->dlist
[direct
].name
)
6435 XFREE(MTYPE_BGP_FILTER_NAME
,
6436 filter
->dlist
[direct
].name
);
6437 filter
->dlist
[direct
].name
=
6438 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6439 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
6441 /* Process peer route updates. */
6442 peer_on_policy_change(member
, afi
, safi
,
6443 (direct
== FILTER_OUT
) ? 1 : 0);
6449 int peer_distribute_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6451 struct peer
*member
;
6452 struct bgp_filter
*filter
;
6453 struct listnode
*node
, *nnode
;
6455 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6456 return BGP_ERR_INVALID_VALUE
;
6458 /* Unset override-flag unconditionally. */
6459 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6460 PEER_FT_DISTRIBUTE_LIST
);
6462 /* Inherit configuration from peer-group if peer is member. */
6463 if (peer_group_active(peer
)) {
6464 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6465 filter
[afi
][safi
].dlist
[direct
].name
,
6466 MTYPE_BGP_FILTER_NAME
);
6467 PEER_ATTR_INHERIT(peer
, peer
->group
,
6468 filter
[afi
][safi
].dlist
[direct
].alist
);
6470 /* Otherwise remove configuration from peer. */
6471 filter
= &peer
->filter
[afi
][safi
];
6472 if (filter
->dlist
[direct
].name
)
6473 XFREE(MTYPE_BGP_FILTER_NAME
,
6474 filter
->dlist
[direct
].name
);
6475 filter
->dlist
[direct
].name
= NULL
;
6476 filter
->dlist
[direct
].alist
= NULL
;
6479 /* Check if handling a regular peer. */
6480 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6481 /* Process peer route updates. */
6482 peer_on_policy_change(peer
, afi
, safi
,
6483 (direct
== FILTER_OUT
) ? 1 : 0);
6485 /* Skip peer-group mechanics for regular peers. */
6490 * Remove configuration on all peer-group members, unless they are
6491 * explicitly overriding peer-group configuration.
6493 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6494 /* Skip peers with overridden configuration. */
6495 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6496 PEER_FT_DISTRIBUTE_LIST
))
6499 /* Remove configuration on peer-group member. */
6500 filter
= &member
->filter
[afi
][safi
];
6501 if (filter
->dlist
[direct
].name
)
6502 XFREE(MTYPE_BGP_FILTER_NAME
,
6503 filter
->dlist
[direct
].name
);
6504 filter
->dlist
[direct
].name
= NULL
;
6505 filter
->dlist
[direct
].alist
= NULL
;
6507 /* Process peer route updates. */
6508 peer_on_policy_change(member
, afi
, safi
,
6509 (direct
== FILTER_OUT
) ? 1 : 0);
6515 /* Update distribute list. */
6516 static void peer_distribute_update(struct access_list
*access
)
6521 struct listnode
*mnode
, *mnnode
;
6522 struct listnode
*node
, *nnode
;
6525 struct peer_group
*group
;
6526 struct bgp_filter
*filter
;
6528 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6530 update_group_policy_update(bgp
,
6531 BGP_POLICY_DISTRIBUTE_LIST
,
6532 access
->name
, true, 0);
6533 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6534 FOREACH_AFI_SAFI (afi
, safi
) {
6535 filter
= &peer
->filter
[afi
][safi
];
6537 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6539 if (filter
->dlist
[direct
].name
)
6540 filter
->dlist
[direct
]
6541 .alist
= access_list_lookup(
6543 filter
->dlist
[direct
]
6546 filter
->dlist
[direct
].alist
=
6551 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6552 FOREACH_AFI_SAFI (afi
, safi
) {
6553 filter
= &group
->conf
->filter
[afi
][safi
];
6555 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6557 if (filter
->dlist
[direct
].name
)
6558 filter
->dlist
[direct
]
6559 .alist
= access_list_lookup(
6561 filter
->dlist
[direct
]
6564 filter
->dlist
[direct
].alist
=
6569 #ifdef ENABLE_BGP_VNC
6570 vnc_prefix_list_update(bgp
);
6575 /* Set prefix list to the peer. */
6576 int peer_prefix_list_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6579 struct peer
*member
;
6580 struct bgp_filter
*filter
;
6581 struct listnode
*node
, *nnode
;
6583 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6584 return BGP_ERR_INVALID_VALUE
;
6586 /* Set configuration on peer. */
6587 filter
= &peer
->filter
[afi
][safi
];
6588 if (filter
->dlist
[direct
].name
)
6589 return BGP_ERR_PEER_FILTER_CONFLICT
;
6590 if (filter
->plist
[direct
].name
)
6591 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
6592 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6593 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
6595 /* Check if handling a regular peer. */
6596 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6597 /* Set override-flag and process peer route updates. */
6598 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6599 PEER_FT_PREFIX_LIST
);
6600 peer_on_policy_change(peer
, afi
, safi
,
6601 (direct
== FILTER_OUT
) ? 1 : 0);
6603 /* Skip peer-group mechanics for regular peers. */
6608 * Set configuration on all peer-group members, unless they are
6609 * explicitly overriding peer-group configuration.
6611 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6612 /* Skip peers with overridden configuration. */
6613 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6614 PEER_FT_PREFIX_LIST
))
6617 /* Set configuration on peer-group member. */
6618 filter
= &member
->filter
[afi
][safi
];
6619 if (filter
->plist
[direct
].name
)
6620 XFREE(MTYPE_BGP_FILTER_NAME
,
6621 filter
->plist
[direct
].name
);
6622 filter
->plist
[direct
].name
=
6623 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6624 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
6626 /* Process peer route updates. */
6627 peer_on_policy_change(member
, afi
, safi
,
6628 (direct
== FILTER_OUT
) ? 1 : 0);
6634 int peer_prefix_list_unset(struct peer
*peer
, afi_t afi
, safi_t safi
,
6637 struct peer
*member
;
6638 struct bgp_filter
*filter
;
6639 struct listnode
*node
, *nnode
;
6641 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6642 return BGP_ERR_INVALID_VALUE
;
6644 /* Unset override-flag unconditionally. */
6645 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6646 PEER_FT_PREFIX_LIST
);
6648 /* Inherit configuration from peer-group if peer is member. */
6649 if (peer_group_active(peer
)) {
6650 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6651 filter
[afi
][safi
].plist
[direct
].name
,
6652 MTYPE_BGP_FILTER_NAME
);
6653 PEER_ATTR_INHERIT(peer
, peer
->group
,
6654 filter
[afi
][safi
].plist
[direct
].plist
);
6656 /* Otherwise remove configuration from peer. */
6657 filter
= &peer
->filter
[afi
][safi
];
6658 if (filter
->plist
[direct
].name
)
6659 XFREE(MTYPE_BGP_FILTER_NAME
,
6660 filter
->plist
[direct
].name
);
6661 filter
->plist
[direct
].name
= NULL
;
6662 filter
->plist
[direct
].plist
= NULL
;
6665 /* Check if handling a regular peer. */
6666 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6667 /* Process peer route updates. */
6668 peer_on_policy_change(peer
, afi
, safi
,
6669 (direct
== FILTER_OUT
) ? 1 : 0);
6671 /* Skip peer-group mechanics for regular peers. */
6676 * Remove configuration on all peer-group members, unless they are
6677 * explicitly overriding peer-group configuration.
6679 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6680 /* Skip peers with overridden configuration. */
6681 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6682 PEER_FT_PREFIX_LIST
))
6685 /* Remove configuration on peer-group member. */
6686 filter
= &member
->filter
[afi
][safi
];
6687 if (filter
->plist
[direct
].name
)
6688 XFREE(MTYPE_BGP_FILTER_NAME
,
6689 filter
->plist
[direct
].name
);
6690 filter
->plist
[direct
].name
= NULL
;
6691 filter
->plist
[direct
].plist
= NULL
;
6693 /* Process peer route updates. */
6694 peer_on_policy_change(member
, afi
, safi
,
6695 (direct
== FILTER_OUT
) ? 1 : 0);
6701 /* Update prefix-list list. */
6702 static void peer_prefix_list_update(struct prefix_list
*plist
)
6704 struct listnode
*mnode
, *mnnode
;
6705 struct listnode
*node
, *nnode
;
6708 struct peer_group
*group
;
6709 struct bgp_filter
*filter
;
6714 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6717 * Update the prefix-list on update groups.
6719 update_group_policy_update(
6720 bgp
, BGP_POLICY_PREFIX_LIST
,
6721 plist
? prefix_list_name(plist
) : NULL
, true, 0);
6723 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6724 FOREACH_AFI_SAFI (afi
, safi
) {
6725 filter
= &peer
->filter
[afi
][safi
];
6727 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6729 if (filter
->plist
[direct
].name
)
6730 filter
->plist
[direct
]
6731 .plist
= prefix_list_lookup(
6733 filter
->plist
[direct
]
6736 filter
->plist
[direct
].plist
=
6740 /* If we touch prefix-list, we need to process
6741 * new updates. This is important for ORF to
6742 * work correctly as well.
6744 if (peer
->afc_nego
[afi
][safi
])
6745 peer_on_policy_change(peer
, afi
, safi
,
6749 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6750 FOREACH_AFI_SAFI (afi
, safi
) {
6751 filter
= &group
->conf
->filter
[afi
][safi
];
6753 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6755 if (filter
->plist
[direct
].name
)
6756 filter
->plist
[direct
]
6757 .plist
= prefix_list_lookup(
6759 filter
->plist
[direct
]
6762 filter
->plist
[direct
].plist
=
6770 int peer_aslist_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6773 struct peer
*member
;
6774 struct bgp_filter
*filter
;
6775 struct listnode
*node
, *nnode
;
6777 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6778 return BGP_ERR_INVALID_VALUE
;
6780 /* Set configuration on peer. */
6781 filter
= &peer
->filter
[afi
][safi
];
6782 if (filter
->aslist
[direct
].name
)
6783 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
6784 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6785 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6787 /* Check if handling a regular peer. */
6788 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6789 /* Set override-flag and process peer route updates. */
6790 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6791 PEER_FT_FILTER_LIST
);
6792 peer_on_policy_change(peer
, afi
, safi
,
6793 (direct
== FILTER_OUT
) ? 1 : 0);
6795 /* Skip peer-group mechanics for regular peers. */
6800 * Set configuration on all peer-group members, unless they are
6801 * explicitly overriding peer-group configuration.
6803 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6804 /* Skip peers with overridden configuration. */
6805 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6806 PEER_FT_FILTER_LIST
))
6809 /* Set configuration on peer-group member. */
6810 filter
= &member
->filter
[afi
][safi
];
6811 if (filter
->aslist
[direct
].name
)
6812 XFREE(MTYPE_BGP_FILTER_NAME
,
6813 filter
->aslist
[direct
].name
);
6814 filter
->aslist
[direct
].name
=
6815 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6816 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6818 /* Process peer route updates. */
6819 peer_on_policy_change(member
, afi
, safi
,
6820 (direct
== FILTER_OUT
) ? 1 : 0);
6826 int peer_aslist_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6828 struct peer
*member
;
6829 struct bgp_filter
*filter
;
6830 struct listnode
*node
, *nnode
;
6832 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6833 return BGP_ERR_INVALID_VALUE
;
6835 /* Unset override-flag unconditionally. */
6836 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6837 PEER_FT_FILTER_LIST
);
6839 /* Inherit configuration from peer-group if peer is member. */
6840 if (peer_group_active(peer
)) {
6841 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6842 filter
[afi
][safi
].aslist
[direct
].name
,
6843 MTYPE_BGP_FILTER_NAME
);
6844 PEER_ATTR_INHERIT(peer
, peer
->group
,
6845 filter
[afi
][safi
].aslist
[direct
].aslist
);
6847 /* Otherwise remove configuration from peer. */
6848 filter
= &peer
->filter
[afi
][safi
];
6849 if (filter
->aslist
[direct
].name
)
6850 XFREE(MTYPE_BGP_FILTER_NAME
,
6851 filter
->aslist
[direct
].name
);
6852 filter
->aslist
[direct
].name
= NULL
;
6853 filter
->aslist
[direct
].aslist
= NULL
;
6856 /* Check if handling a regular peer. */
6857 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6858 /* Process peer route updates. */
6859 peer_on_policy_change(peer
, afi
, safi
,
6860 (direct
== FILTER_OUT
) ? 1 : 0);
6862 /* Skip peer-group mechanics for regular peers. */
6867 * Remove configuration on all peer-group members, unless they are
6868 * explicitly overriding peer-group configuration.
6870 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6871 /* Skip peers with overridden configuration. */
6872 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6873 PEER_FT_FILTER_LIST
))
6876 /* Remove configuration on peer-group member. */
6877 filter
= &member
->filter
[afi
][safi
];
6878 if (filter
->aslist
[direct
].name
)
6879 XFREE(MTYPE_BGP_FILTER_NAME
,
6880 filter
->aslist
[direct
].name
);
6881 filter
->aslist
[direct
].name
= NULL
;
6882 filter
->aslist
[direct
].aslist
= NULL
;
6884 /* Process peer route updates. */
6885 peer_on_policy_change(member
, afi
, safi
,
6886 (direct
== FILTER_OUT
) ? 1 : 0);
6892 static void peer_aslist_update(const char *aslist_name
)
6897 struct listnode
*mnode
, *mnnode
;
6898 struct listnode
*node
, *nnode
;
6901 struct peer_group
*group
;
6902 struct bgp_filter
*filter
;
6904 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6905 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
6906 aslist_name
, true, 0);
6908 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6909 FOREACH_AFI_SAFI (afi
, safi
) {
6910 filter
= &peer
->filter
[afi
][safi
];
6912 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6914 if (filter
->aslist
[direct
].name
)
6915 filter
->aslist
[direct
]
6916 .aslist
= as_list_lookup(
6917 filter
->aslist
[direct
]
6920 filter
->aslist
[direct
].aslist
=
6925 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6926 FOREACH_AFI_SAFI (afi
, safi
) {
6927 filter
= &group
->conf
->filter
[afi
][safi
];
6929 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6931 if (filter
->aslist
[direct
].name
)
6932 filter
->aslist
[direct
]
6933 .aslist
= as_list_lookup(
6934 filter
->aslist
[direct
]
6937 filter
->aslist
[direct
].aslist
=
6945 static void peer_aslist_add(char *aslist_name
)
6947 peer_aslist_update(aslist_name
);
6948 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
6951 static void peer_aslist_del(const char *aslist_name
)
6953 peer_aslist_update(aslist_name
);
6954 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
6958 int peer_route_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6959 const char *name
, struct route_map
*route_map
)
6961 struct peer
*member
;
6962 struct bgp_filter
*filter
;
6963 struct listnode
*node
, *nnode
;
6965 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6966 return BGP_ERR_INVALID_VALUE
;
6968 /* Set configuration on peer. */
6969 filter
= &peer
->filter
[afi
][safi
];
6970 if (filter
->map
[direct
].name
) {
6971 /* If the neighbor is configured with the same route-map
6972 * again then, ignore the duplicate configuration.
6974 if (strcmp(filter
->map
[direct
].name
, name
) == 0)
6977 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6979 route_map_counter_decrement(filter
->map
[direct
].map
);
6980 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6981 filter
->map
[direct
].map
= route_map
;
6982 route_map_counter_increment(route_map
);
6984 /* Check if handling a regular peer. */
6985 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6986 /* Set override-flag and process peer route updates. */
6987 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6989 peer_on_policy_change(peer
, afi
, safi
,
6990 (direct
== RMAP_OUT
) ? 1 : 0);
6992 /* Skip peer-group mechanics for regular peers. */
6997 * Set configuration on all peer-group members, unless they are
6998 * explicitly overriding peer-group configuration.
7000 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7001 /* Skip peers with overridden configuration. */
7002 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
7006 /* Set configuration on peer-group member. */
7007 filter
= &member
->filter
[afi
][safi
];
7008 if (filter
->map
[direct
].name
)
7009 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
7010 route_map_counter_decrement(filter
->map
[direct
].map
);
7011 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
7012 filter
->map
[direct
].map
= route_map
;
7013 route_map_counter_increment(route_map
);
7015 /* Process peer route updates. */
7016 peer_on_policy_change(member
, afi
, safi
,
7017 (direct
== RMAP_OUT
) ? 1 : 0);
7022 /* Unset route-map from the peer. */
7023 int peer_route_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
7025 struct peer
*member
;
7026 struct bgp_filter
*filter
;
7027 struct listnode
*node
, *nnode
;
7029 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
7030 return BGP_ERR_INVALID_VALUE
;
7032 /* Unset override-flag unconditionally. */
7033 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
], PEER_FT_ROUTE_MAP
);
7035 /* Inherit configuration from peer-group if peer is member. */
7036 if (peer_group_active(peer
)) {
7037 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
7038 filter
[afi
][safi
].map
[direct
].name
,
7039 MTYPE_BGP_FILTER_NAME
);
7040 PEER_ATTR_INHERIT(peer
, peer
->group
,
7041 filter
[afi
][safi
].map
[direct
].map
);
7043 /* Otherwise remove configuration from peer. */
7044 filter
= &peer
->filter
[afi
][safi
];
7045 if (filter
->map
[direct
].name
)
7046 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
7047 route_map_counter_decrement(filter
->map
[direct
].map
);
7048 filter
->map
[direct
].name
= NULL
;
7049 filter
->map
[direct
].map
= NULL
;
7052 /* Check if handling a regular peer. */
7053 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7054 /* Process peer route updates. */
7055 peer_on_policy_change(peer
, afi
, safi
,
7056 (direct
== RMAP_OUT
) ? 1 : 0);
7058 /* Skip peer-group mechanics for regular peers. */
7063 * Remove configuration on all peer-group members, unless they are
7064 * explicitly overriding peer-group configuration.
7066 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7067 /* Skip peers with overridden configuration. */
7068 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
7072 /* Remove configuration on peer-group member. */
7073 filter
= &member
->filter
[afi
][safi
];
7074 if (filter
->map
[direct
].name
)
7075 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
7076 route_map_counter_decrement(filter
->map
[direct
].map
);
7077 filter
->map
[direct
].name
= NULL
;
7078 filter
->map
[direct
].map
= NULL
;
7080 /* Process peer route updates. */
7081 peer_on_policy_change(member
, afi
, safi
,
7082 (direct
== RMAP_OUT
) ? 1 : 0);
7088 /* Set unsuppress-map to the peer. */
7089 int peer_unsuppress_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
7090 const char *name
, struct route_map
*route_map
)
7092 struct peer
*member
;
7093 struct bgp_filter
*filter
;
7094 struct listnode
*node
, *nnode
;
7096 /* Set configuration on peer. */
7097 filter
= &peer
->filter
[afi
][safi
];
7098 if (filter
->usmap
.name
)
7099 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
7100 route_map_counter_decrement(filter
->usmap
.map
);
7101 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
7102 filter
->usmap
.map
= route_map
;
7103 route_map_counter_increment(route_map
);
7105 /* Check if handling a regular peer. */
7106 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7107 /* Set override-flag and process peer route updates. */
7108 SET_FLAG(peer
->filter_override
[afi
][safi
][0],
7109 PEER_FT_UNSUPPRESS_MAP
);
7110 peer_on_policy_change(peer
, afi
, safi
, 1);
7112 /* Skip peer-group mechanics for regular peers. */
7117 * Set configuration on all peer-group members, unless they are
7118 * explicitly overriding peer-group configuration.
7120 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7121 /* Skip peers with overridden configuration. */
7122 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
7123 PEER_FT_UNSUPPRESS_MAP
))
7126 /* Set configuration on peer-group member. */
7127 filter
= &member
->filter
[afi
][safi
];
7128 if (filter
->usmap
.name
)
7129 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
7130 route_map_counter_decrement(filter
->usmap
.map
);
7131 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
7132 filter
->usmap
.map
= route_map
;
7133 route_map_counter_increment(route_map
);
7135 /* Process peer route updates. */
7136 peer_on_policy_change(member
, afi
, safi
, 1);
7142 /* Unset route-map from the peer. */
7143 int peer_unsuppress_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
7145 struct peer
*member
;
7146 struct bgp_filter
*filter
;
7147 struct listnode
*node
, *nnode
;
7149 /* Unset override-flag unconditionally. */
7150 UNSET_FLAG(peer
->filter_override
[afi
][safi
][0], PEER_FT_UNSUPPRESS_MAP
);
7152 /* Inherit configuration from peer-group if peer is member. */
7153 if (peer_group_active(peer
)) {
7154 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
7155 filter
[afi
][safi
].usmap
.name
,
7156 MTYPE_BGP_FILTER_NAME
);
7157 PEER_ATTR_INHERIT(peer
, peer
->group
,
7158 filter
[afi
][safi
].usmap
.map
);
7160 /* Otherwise remove configuration from peer. */
7161 filter
= &peer
->filter
[afi
][safi
];
7162 if (filter
->usmap
.name
)
7163 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
7164 route_map_counter_decrement(filter
->usmap
.map
);
7165 filter
->usmap
.name
= NULL
;
7166 filter
->usmap
.map
= NULL
;
7169 /* Check if handling a regular peer. */
7170 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7171 /* Process peer route updates. */
7172 peer_on_policy_change(peer
, afi
, safi
, 1);
7174 /* Skip peer-group mechanics for regular peers. */
7179 * Remove configuration on all peer-group members, unless they are
7180 * explicitly overriding peer-group configuration.
7182 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7183 /* Skip peers with overridden configuration. */
7184 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
7185 PEER_FT_UNSUPPRESS_MAP
))
7188 /* Remove configuration on peer-group member. */
7189 filter
= &member
->filter
[afi
][safi
];
7190 if (filter
->usmap
.name
)
7191 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
7192 route_map_counter_decrement(filter
->usmap
.map
);
7193 filter
->usmap
.name
= NULL
;
7194 filter
->usmap
.map
= NULL
;
7196 /* Process peer route updates. */
7197 peer_on_policy_change(member
, afi
, safi
, 1);
7203 static void peer_advertise_map_filter_update(struct peer
*peer
, afi_t afi
,
7204 safi_t safi
, const char *amap_name
,
7205 struct route_map
*amap
,
7206 const char *cmap_name
,
7207 struct route_map
*cmap
,
7208 bool condition
, bool set
)
7210 struct bgp_filter
*filter
;
7211 bool filter_exists
= false;
7213 filter
= &peer
->filter
[afi
][safi
];
7215 /* advertise-map is already configured. */
7216 if (filter
->advmap
.aname
) {
7217 filter_exists
= true;
7218 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->advmap
.aname
);
7219 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->advmap
.cname
);
7222 route_map_counter_decrement(filter
->advmap
.amap
);
7224 /* Removed advertise-map configuration */
7226 memset(&filter
->advmap
, 0, sizeof(filter
->advmap
));
7228 /* decrement condition_filter_count delete timer if
7229 * this is the last advertise-map to be removed.
7232 bgp_conditional_adv_disable(peer
, afi
, safi
);
7237 /* Update filter data with newly configured values. */
7238 filter
->advmap
.aname
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, amap_name
);
7239 filter
->advmap
.cname
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, cmap_name
);
7240 filter
->advmap
.amap
= amap
;
7241 filter
->advmap
.cmap
= cmap
;
7242 filter
->advmap
.condition
= condition
;
7243 route_map_counter_increment(filter
->advmap
.amap
);
7244 peer
->advmap_config_change
[afi
][safi
] = true;
7246 /* Increment condition_filter_count and/or create timer. */
7247 if (!filter_exists
) {
7248 filter
->advmap
.update_type
= UPDATE_TYPE_ADVERTISE
;
7249 bgp_conditional_adv_enable(peer
, afi
, safi
);
7252 /* Process peer route updates. */
7253 peer_on_policy_change(peer
, afi
, safi
, 1);
7256 /* Set advertise-map to the peer. */
7257 int peer_advertise_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
7258 const char *advertise_name
,
7259 struct route_map
*advertise_map
,
7260 const char *condition_name
,
7261 struct route_map
*condition_map
, bool condition
)
7263 struct peer
*member
;
7264 struct listnode
*node
, *nnode
;
7266 /* Set configuration on peer. */
7267 peer_advertise_map_filter_update(peer
, afi
, safi
, advertise_name
,
7268 advertise_map
, condition_name
,
7269 condition_map
, condition
, true);
7271 /* Check if handling a regular peer & Skip peer-group mechanics. */
7272 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7273 /* Set override-flag and process peer route updates. */
7274 SET_FLAG(peer
->filter_override
[afi
][safi
][RMAP_OUT
],
7275 PEER_FT_ADVERTISE_MAP
);
7280 * Set configuration on all peer-group members, unless they are
7281 * explicitly overriding peer-group configuration.
7283 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7284 /* Skip peers with overridden configuration. */
7285 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][RMAP_OUT
],
7286 PEER_FT_ADVERTISE_MAP
))
7289 /* Set configuration on peer-group member. */
7290 peer_advertise_map_filter_update(
7291 member
, afi
, safi
, advertise_name
, advertise_map
,
7292 condition_name
, condition_map
, condition
, true);
7298 /* Unset advertise-map from the peer. */
7299 int peer_advertise_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
,
7300 const char *advertise_name
,
7301 struct route_map
*advertise_map
,
7302 const char *condition_name
,
7303 struct route_map
*condition_map
, bool condition
)
7305 struct peer
*member
;
7306 struct listnode
*node
, *nnode
;
7308 /* advertise-map is not configured */
7309 if (!peer
->filter
[afi
][safi
].advmap
.aname
)
7312 /* Unset override-flag unconditionally. */
7313 UNSET_FLAG(peer
->filter_override
[afi
][safi
][RMAP_OUT
],
7314 PEER_FT_ADVERTISE_MAP
);
7316 /* Inherit configuration from peer-group if peer is member. */
7317 if (peer_group_active(peer
)) {
7318 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
7319 filter
[afi
][safi
].advmap
.aname
,
7320 MTYPE_BGP_FILTER_NAME
);
7321 PEER_ATTR_INHERIT(peer
, peer
->group
,
7322 filter
[afi
][safi
].advmap
.amap
);
7324 peer_advertise_map_filter_update(
7325 peer
, afi
, safi
, advertise_name
, advertise_map
,
7326 condition_name
, condition_map
, condition
, false);
7328 /* Check if handling a regular peer and skip peer-group mechanics. */
7329 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7330 /* Process peer route updates. */
7331 if (BGP_DEBUG(update
, UPDATE_OUT
))
7332 zlog_debug("%s: Send normal update to %s for %s",
7333 __func__
, peer
->host
,
7334 get_afi_safi_str(afi
, safi
, false));
7340 * Remove configuration on all peer-group members, unless they are
7341 * explicitly overriding peer-group configuration.
7343 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7344 /* Skip peers with overridden configuration. */
7345 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][RMAP_OUT
],
7346 PEER_FT_ADVERTISE_MAP
))
7348 /* Remove configuration on peer-group member. */
7349 peer_advertise_map_filter_update(
7350 member
, afi
, safi
, advertise_name
, advertise_map
,
7351 condition_name
, condition_map
, condition
, false);
7353 /* Process peer route updates. */
7354 if (BGP_DEBUG(update
, UPDATE_OUT
))
7355 zlog_debug("%s: Send normal update to %s for %s ",
7356 __func__
, member
->host
,
7357 get_afi_safi_str(afi
, safi
, false));
7363 static bool peer_maximum_prefix_clear_overflow(struct peer
*peer
)
7365 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
7368 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
7369 if (peer
->t_pmax_restart
) {
7370 THREAD_OFF(peer
->t_pmax_restart
);
7371 if (bgp_debug_neighbor_events(peer
))
7373 "%pBP Maximum-prefix restart timer cancelled",
7376 BGP_EVENT_ADD(peer
, BGP_Start
);
7380 int peer_maximum_prefix_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
7381 uint32_t max
, uint8_t threshold
, int warning
,
7382 uint16_t restart
, bool force
)
7384 struct peer
*member
;
7385 struct listnode
*node
, *nnode
;
7387 /* Set flags and configuration on peer. */
7388 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
7391 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_FORCE
);
7393 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_FORCE
);
7396 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
7398 peer_af_flag_unset(peer
, afi
, safi
,
7399 PEER_FLAG_MAX_PREFIX_WARNING
);
7401 peer
->pmax
[afi
][safi
] = max
;
7402 peer
->pmax_threshold
[afi
][safi
] = threshold
;
7403 peer
->pmax_restart
[afi
][safi
] = restart
;
7405 /* Check if handling a regular peer. */
7406 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7407 /* Re-check if peer violates maximum-prefix. */
7408 if ((peer_established(peer
)) && (peer
->afc
[afi
][safi
]))
7409 bgp_maximum_prefix_overflow(peer
, afi
, safi
, 1);
7411 /* Skip peer-group mechanics for regular peers. */
7416 * Set flags and configuration on all peer-group members, unless they
7417 * are explicitly overriding peer-group configuration.
7419 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7420 /* Skip peers with overridden configuration. */
7421 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
7422 PEER_FLAG_MAX_PREFIX
))
7425 /* Set flag and configuration on peer-group member. */
7426 member
->pmax
[afi
][safi
] = max
;
7427 member
->pmax_threshold
[afi
][safi
] = threshold
;
7428 member
->pmax_restart
[afi
][safi
] = restart
;
7431 SET_FLAG(member
->af_flags
[afi
][safi
],
7432 PEER_FLAG_MAX_PREFIX_FORCE
);
7434 UNSET_FLAG(member
->af_flags
[afi
][safi
],
7435 PEER_FLAG_MAX_PREFIX_FORCE
);
7438 SET_FLAG(member
->af_flags
[afi
][safi
],
7439 PEER_FLAG_MAX_PREFIX_WARNING
);
7441 UNSET_FLAG(member
->af_flags
[afi
][safi
],
7442 PEER_FLAG_MAX_PREFIX_WARNING
);
7444 /* Re-check if peer violates maximum-prefix. */
7445 if ((peer_established(member
)) && (member
->afc
[afi
][safi
]))
7446 bgp_maximum_prefix_overflow(member
, afi
, safi
, 1);
7452 int peer_maximum_prefix_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
7454 /* Inherit configuration from peer-group if peer is member. */
7455 if (peer_group_active(peer
)) {
7456 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
7457 peer_af_flag_inherit(peer
, afi
, safi
,
7458 PEER_FLAG_MAX_PREFIX_FORCE
);
7459 peer_af_flag_inherit(peer
, afi
, safi
,
7460 PEER_FLAG_MAX_PREFIX_WARNING
);
7461 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax
[afi
][safi
]);
7462 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_threshold
[afi
][safi
]);
7463 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_restart
[afi
][safi
]);
7468 /* Remove flags and configuration from peer. */
7469 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
7470 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_FORCE
);
7471 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
7472 peer
->pmax
[afi
][safi
] = 0;
7473 peer
->pmax_threshold
[afi
][safi
] = 0;
7474 peer
->pmax_restart
[afi
][safi
] = 0;
7477 * Remove flags and configuration from all peer-group members, unless
7478 * they are explicitly overriding peer-group configuration.
7480 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7481 struct peer
*member
;
7482 struct listnode
*node
;
7484 for (ALL_LIST_ELEMENTS_RO(peer
->group
->peer
, node
, member
)) {
7485 /* Skip peers with overridden configuration. */
7486 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
7487 PEER_FLAG_MAX_PREFIX
))
7490 /* Remove flag and configuration on peer-group member.
7492 UNSET_FLAG(member
->af_flags
[afi
][safi
],
7493 PEER_FLAG_MAX_PREFIX
);
7494 UNSET_FLAG(member
->af_flags
[afi
][safi
],
7495 PEER_FLAG_MAX_PREFIX_FORCE
);
7496 UNSET_FLAG(member
->af_flags
[afi
][safi
],
7497 PEER_FLAG_MAX_PREFIX_WARNING
);
7498 member
->pmax
[afi
][safi
] = 0;
7499 member
->pmax_threshold
[afi
][safi
] = 0;
7500 member
->pmax_restart
[afi
][safi
] = 0;
7502 peer_maximum_prefix_clear_overflow(member
);
7505 peer_maximum_prefix_clear_overflow(peer
);
7511 void peer_maximum_prefix_out_refresh_routes(struct peer
*peer
, afi_t afi
,
7514 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
7516 if (peer_established(peer
))
7517 bgp_announce_route(peer
, afi
, safi
, false);
7520 int peer_maximum_prefix_out_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
7523 struct peer
*member
;
7524 struct listnode
*node
, *nnode
;
7526 /* Set flag on peer and peer-group member if any */
7527 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_OUT
);
7528 /* Set configuration on peer. */
7529 peer
->pmax_out
[afi
][safi
] = max
;
7531 /* Check if handling a regular peer. */
7532 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7533 /* Skip peer-group mechanics for regular peers. */
7534 peer_maximum_prefix_out_refresh_routes(peer
, afi
, safi
);
7539 * Set flag and configuration on all peer-group members, unless they
7540 * are explicitly overriding peer-group configuration.
7542 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
7543 /* Skip peers with overridden configuration. */
7544 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
7545 PEER_FLAG_MAX_PREFIX_OUT
))
7548 /* Set configuration on peer-group member. */
7549 member
->pmax_out
[afi
][safi
] = max
;
7551 peer_maximum_prefix_out_refresh_routes(member
, afi
, safi
);
7556 int peer_maximum_prefix_out_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
7558 struct peer
*member
;
7559 struct listnode
*node
;
7560 /* Inherit configuration from peer-group if peer is member. */
7561 if (peer_group_active(peer
)) {
7562 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_OUT
);
7563 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_out
[afi
][safi
]);
7565 peer_maximum_prefix_out_refresh_routes(peer
, afi
, safi
);
7569 /* Remove flag and configuration from peer. */
7570 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_OUT
);
7571 peer
->pmax_out
[afi
][safi
] = 0;
7573 /* Check if handling a regular peer. */
7574 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7575 /* Skip peer-group mechanics for regular peers. */
7576 peer_maximum_prefix_out_refresh_routes(peer
, afi
, safi
);
7581 * Remove flag and configuration from all peer-group members, unless
7582 * they are explicitly overriding peer-group configuration.
7584 for (ALL_LIST_ELEMENTS_RO(peer
->group
->peer
, node
, member
)) {
7585 /* Skip peers with overridden configuration. */
7586 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
7587 PEER_FLAG_MAX_PREFIX_OUT
))
7590 /* Remove flag and configuration on peer-group member.
7592 UNSET_FLAG(member
->af_flags
[afi
][safi
],
7593 PEER_FLAG_MAX_PREFIX_OUT
);
7594 member
->pmax_out
[afi
][safi
] = 0;
7596 peer_maximum_prefix_out_refresh_routes(member
, afi
, safi
);
7601 int is_ebgp_multihop_configured(struct peer
*peer
)
7603 struct peer_group
*group
;
7604 struct listnode
*node
, *nnode
;
7607 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7608 group
= peer
->group
;
7609 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
7610 && (group
->conf
->ttl
!= BGP_DEFAULT_TTL
))
7613 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer1
)) {
7614 if ((peer_sort(peer1
) != BGP_PEER_IBGP
)
7615 && (peer1
->ttl
!= BGP_DEFAULT_TTL
))
7619 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
7620 && (peer
->ttl
!= BGP_DEFAULT_TTL
))
7626 /* Set # of hops between us and BGP peer. */
7627 int peer_ttl_security_hops_set(struct peer
*peer
, int gtsm_hops
)
7629 struct peer_group
*group
;
7631 struct listnode
*node
, *nnode
;
7634 zlog_debug("%s: set gtsm_hops to %d for %s", __func__
, gtsm_hops
,
7637 /* We cannot configure ttl-security hops when ebgp-multihop is already
7638 set. For non peer-groups, the check is simple. For peer-groups,
7640 slightly messy, because we need to check both the peer-group
7642 and all peer-group members for any trace of ebgp-multihop
7644 before actually applying the ttl-security rules. Cisco really made a
7645 mess of this configuration parameter, and OpenBGPD got it right.
7648 if ((peer
->gtsm_hops
== BGP_GTSM_HOPS_DISABLED
)
7649 && (peer
->sort
!= BGP_PEER_IBGP
)) {
7650 if (is_ebgp_multihop_configured(peer
))
7651 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
7653 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7654 peer
->gtsm_hops
= gtsm_hops
;
7656 /* Calling ebgp multihop also resets the session.
7657 * On restart, NHT will get setup correctly as will the
7658 * min & max ttls on the socket. The return value is
7661 ret
= peer_ebgp_multihop_set(peer
, MAXTTL
);
7666 group
= peer
->group
;
7667 group
->conf
->gtsm_hops
= gtsm_hops
;
7668 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
7670 gpeer
->gtsm_hops
= group
->conf
->gtsm_hops
;
7672 /* Calling ebgp multihop also resets the
7674 * On restart, NHT will get setup correctly as
7676 * min & max ttls on the socket. The return
7680 peer_ebgp_multihop_set(gpeer
, MAXTTL
);
7684 /* Post the first gtsm setup or if its ibgp, maxttl setting
7686 * necessary, just set the minttl.
7688 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7689 peer
->gtsm_hops
= gtsm_hops
;
7692 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
7693 MAXTTL
+ 1 - gtsm_hops
);
7694 if ((peer
->status
< Established
) && peer
->doppelganger
7695 && (peer
->doppelganger
->fd
>= 0))
7696 sockopt_minttl(peer
->su
.sa
.sa_family
,
7697 peer
->doppelganger
->fd
,
7698 MAXTTL
+ 1 - gtsm_hops
);
7700 group
= peer
->group
;
7701 group
->conf
->gtsm_hops
= gtsm_hops
;
7702 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
7704 gpeer
->gtsm_hops
= group
->conf
->gtsm_hops
;
7706 /* Change setting of existing peer
7707 * established then change value (may break
7709 * not established yet (teardown session and
7711 * no session then do nothing (will get
7712 * handled by next connection)
7716 != BGP_GTSM_HOPS_DISABLED
)
7718 gpeer
->su
.sa
.sa_family
,
7720 MAXTTL
+ 1 - gpeer
->gtsm_hops
);
7721 if ((gpeer
->status
< Established
)
7722 && gpeer
->doppelganger
7723 && (gpeer
->doppelganger
->fd
>= 0))
7724 sockopt_minttl(gpeer
->su
.sa
.sa_family
,
7725 gpeer
->doppelganger
->fd
,
7726 MAXTTL
+ 1 - gtsm_hops
);
7734 int peer_ttl_security_hops_unset(struct peer
*peer
)
7736 struct peer_group
*group
;
7737 struct listnode
*node
, *nnode
;
7740 zlog_debug("%s: set gtsm_hops to zero for %s", __func__
, peer
->host
);
7742 /* if a peer-group member, then reset to peer-group default rather than
7744 if (peer_group_active(peer
))
7745 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
7747 peer
->gtsm_hops
= BGP_GTSM_HOPS_DISABLED
;
7749 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7750 /* Invoking ebgp_multihop_set will set the TTL back to the
7752 * value as well as restting the NHT and such. The session is
7755 if (peer
->sort
== BGP_PEER_EBGP
)
7756 ret
= peer_ebgp_multihop_unset(peer
);
7759 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
7762 if ((peer
->status
< Established
) && peer
->doppelganger
7763 && (peer
->doppelganger
->fd
>= 0))
7764 sockopt_minttl(peer
->su
.sa
.sa_family
,
7765 peer
->doppelganger
->fd
, 0);
7768 group
= peer
->group
;
7769 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
7770 peer
->gtsm_hops
= BGP_GTSM_HOPS_DISABLED
;
7771 if (peer
->sort
== BGP_PEER_EBGP
)
7772 ret
= peer_ebgp_multihop_unset(peer
);
7775 sockopt_minttl(peer
->su
.sa
.sa_family
,
7778 if ((peer
->status
< Established
)
7779 && peer
->doppelganger
7780 && (peer
->doppelganger
->fd
>= 0))
7781 sockopt_minttl(peer
->su
.sa
.sa_family
,
7782 peer
->doppelganger
->fd
,
7791 static void peer_reset_message_stats(struct peer
*peer
)
7794 atomic_store_explicit(&peer
->open_in
, 0, memory_order_relaxed
);
7795 atomic_store_explicit(&peer
->open_out
, 0, memory_order_relaxed
);
7796 atomic_store_explicit(&peer
->update_in
, 0,
7797 memory_order_relaxed
);
7798 atomic_store_explicit(&peer
->update_out
, 0,
7799 memory_order_relaxed
);
7800 atomic_store_explicit(&peer
->keepalive_in
, 0,
7801 memory_order_relaxed
);
7802 atomic_store_explicit(&peer
->keepalive_out
, 0,
7803 memory_order_relaxed
);
7804 atomic_store_explicit(&peer
->notify_in
, 0,
7805 memory_order_relaxed
);
7806 atomic_store_explicit(&peer
->notify_out
, 0,
7807 memory_order_relaxed
);
7808 atomic_store_explicit(&peer
->refresh_in
, 0,
7809 memory_order_relaxed
);
7810 atomic_store_explicit(&peer
->refresh_out
, 0,
7811 memory_order_relaxed
);
7812 atomic_store_explicit(&peer
->dynamic_cap_in
, 0,
7813 memory_order_relaxed
);
7814 atomic_store_explicit(&peer
->dynamic_cap_out
, 0,
7815 memory_order_relaxed
);
7820 * If peer clear is invoked in a loop for all peers on the BGP instance,
7821 * it may end up freeing the doppelganger, and if this was the next node
7822 * to the current node, we would end up accessing the freed next node.
7823 * Pass along additional parameter which can be updated if next node
7824 * is freed; only required when walking the peer list on BGP instance.
7826 int peer_clear(struct peer
*peer
, struct listnode
**nnode
)
7828 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
7829 || !CHECK_FLAG(peer
->bgp
->flags
, BGP_FLAG_SHUTDOWN
)) {
7830 if (peer_maximum_prefix_clear_overflow(peer
))
7833 peer
->v_start
= BGP_INIT_START_TIMER
;
7834 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
7835 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
7836 BGP_NOTIFY_CEASE_ADMIN_RESET
);
7838 bgp_session_reset_safe(peer
, nnode
);
7843 int peer_clear_soft(struct peer
*peer
, afi_t afi
, safi_t safi
,
7844 enum bgp_clear_type stype
)
7846 struct peer_af
*paf
;
7848 if (!peer_established(peer
))
7851 if (!peer
->afc
[afi
][safi
])
7852 return BGP_ERR_AF_UNCONFIGURED
;
7854 peer
->rtt
= sockopt_tcp_rtt(peer
->fd
);
7856 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
) {
7857 /* Clear the "neighbor x.x.x.x default-originate" flag */
7858 paf
= peer_af_find(peer
, afi
, safi
);
7859 if (paf
&& paf
->subgroup
7860 && CHECK_FLAG(paf
->subgroup
->sflags
,
7861 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
7862 UNSET_FLAG(paf
->subgroup
->sflags
,
7863 SUBGRP_STATUS_DEFAULT_ORIGINATE
);
7865 bgp_announce_route(peer
, afi
, safi
, false);
7868 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
7869 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7870 PEER_CAP_ORF_PREFIX_SM_ADV
)
7871 && (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7872 PEER_CAP_ORF_PREFIX_RM_RCV
)
7873 || CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7874 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))) {
7875 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
7876 uint8_t prefix_type
;
7878 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7879 PEER_CAP_ORF_PREFIX_RM_RCV
))
7880 prefix_type
= ORF_TYPE_PREFIX
;
7882 prefix_type
= ORF_TYPE_PREFIX_OLD
;
7884 if (filter
->plist
[FILTER_IN
].plist
) {
7885 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
7886 PEER_STATUS_ORF_PREFIX_SEND
))
7887 bgp_route_refresh_send(
7888 peer
, afi
, safi
, prefix_type
,
7890 BGP_ROUTE_REFRESH_NORMAL
);
7891 bgp_route_refresh_send(
7892 peer
, afi
, safi
, prefix_type
,
7893 REFRESH_IMMEDIATE
, 0,
7894 BGP_ROUTE_REFRESH_NORMAL
);
7896 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
7897 PEER_STATUS_ORF_PREFIX_SEND
))
7898 bgp_route_refresh_send(
7899 peer
, afi
, safi
, prefix_type
,
7900 REFRESH_IMMEDIATE
, 1,
7901 BGP_ROUTE_REFRESH_NORMAL
);
7903 bgp_route_refresh_send(
7904 peer
, afi
, safi
, 0, 0, 0,
7905 BGP_ROUTE_REFRESH_NORMAL
);
7911 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
7912 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
7913 /* If neighbor has soft reconfiguration inbound flag.
7914 Use Adj-RIB-In database. */
7915 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
7916 PEER_FLAG_SOFT_RECONFIG
))
7917 bgp_soft_reconfig_in(peer
, afi
, safi
);
7919 /* If neighbor has route refresh capability, send route
7921 message to the peer. */
7922 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
7923 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
7924 bgp_route_refresh_send(
7925 peer
, afi
, safi
, 0, 0, 0,
7926 BGP_ROUTE_REFRESH_NORMAL
);
7928 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
7932 if (stype
== BGP_CLEAR_MESSAGE_STATS
)
7933 peer_reset_message_stats(peer
);
7938 /* Display peer uptime.*/
7939 char *peer_uptime(time_t uptime2
, char *buf
, size_t len
, bool use_json
,
7942 time_t uptime1
, epoch_tbuf
;
7945 /* If there is no connection has been done before print `never'. */
7948 json_object_string_add(json
, "peerUptime", "never");
7949 json_object_int_add(json
, "peerUptimeMsec", 0);
7951 snprintf(buf
, len
, "never");
7955 /* Get current time. */
7956 uptime1
= monotime(NULL
);
7958 gmtime_r(&uptime1
, &tm
);
7960 if (uptime1
< ONE_DAY_SECOND
)
7961 snprintf(buf
, len
, "%02d:%02d:%02d", tm
.tm_hour
, tm
.tm_min
,
7963 else if (uptime1
< ONE_WEEK_SECOND
)
7964 snprintf(buf
, len
, "%dd%02dh%02dm", tm
.tm_yday
, tm
.tm_hour
,
7966 else if (uptime1
< ONE_YEAR_SECOND
)
7967 snprintf(buf
, len
, "%02dw%dd%02dh", tm
.tm_yday
/ 7,
7968 tm
.tm_yday
- ((tm
.tm_yday
/ 7) * 7), tm
.tm_hour
);
7970 snprintf(buf
, len
, "%02dy%02dw%dd", tm
.tm_year
- 70,
7972 tm
.tm_yday
- ((tm
.tm_yday
/ 7) * 7));
7975 epoch_tbuf
= time(NULL
) - uptime1
;
7976 json_object_string_add(json
, "peerUptime", buf
);
7977 json_object_int_add(json
, "peerUptimeMsec", uptime1
* 1000);
7978 json_object_int_add(json
, "peerUptimeEstablishedEpoch",
7985 void bgp_master_init(struct thread_master
*master
, const int buffer_size
,
7986 struct list
*addresses
)
7990 memset(&bgp_master
, 0, sizeof(bgp_master
));
7993 bm
->bgp
= list_new();
7994 bm
->listen_sockets
= list_new();
7995 bm
->port
= BGP_PORT_DEFAULT
;
7996 bm
->addresses
= addresses
;
7997 bm
->master
= master
;
7998 bm
->start_time
= monotime(NULL
);
7999 bm
->t_rmap_update
= NULL
;
8000 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
8001 bm
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
8002 bm
->v_establish_wait
= BGP_UPDATE_DELAY_DEF
;
8003 bm
->terminating
= false;
8004 bm
->socket_buffer
= buffer_size
;
8005 bm
->wait_for_fib
= false;
8006 bm
->tcp_dscp
= IPTOS_PREC_INTERNETCONTROL
;
8009 /* init the rd id space.
8010 assign 0th index in the bitfield,
8011 so that we start with id 1
8013 bf_init(bm
->rd_idspace
, UINT16_MAX
);
8014 bf_assign_zero_index(bm
->rd_idspace
);
8016 /* mpls label dynamic allocation pool */
8017 bgp_lp_init(bm
->master
, &bm
->labelpool
);
8021 QOBJ_REG(bm
, bgp_master
);
8025 * Free up connected routes and interfaces for a BGP instance. Invoked upon
8026 * instance delete (non-default only) or BGP exit.
8028 static void bgp_if_finish(struct bgp
*bgp
)
8031 struct interface
*ifp
;
8033 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
8035 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
|| !vrf
)
8038 FOR_ALL_INTERFACES (vrf
, ifp
) {
8039 struct listnode
*c_node
, *c_nnode
;
8040 struct connected
*c
;
8042 for (ALL_LIST_ELEMENTS(ifp
->connected
, c_node
, c_nnode
, c
))
8043 bgp_connected_delete(bgp
, c
);
8047 static void bgp_viewvrf_autocomplete(vector comps
, struct cmd_token
*token
)
8049 struct vrf
*vrf
= NULL
;
8050 struct listnode
*next
;
8053 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
8054 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, vrf
->name
));
8056 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
8057 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_VIEW
)
8060 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, bgp
->name
));
8064 static void bgp_instasn_autocomplete(vector comps
, struct cmd_token
*token
)
8066 struct listnode
*next
, *next2
;
8067 struct bgp
*bgp
, *bgp2
;
8070 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
8072 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next2
, bgp2
)) {
8073 if (bgp2
->as
== bgp
->as
)
8081 snprintf(buf
, sizeof(buf
), "%u", bgp
->as
);
8082 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, buf
));
8086 static const struct cmd_variable_handler bgp_viewvrf_var_handlers
[] = {
8087 {.tokenname
= "VIEWVRFNAME", .completions
= bgp_viewvrf_autocomplete
},
8088 {.varname
= "instasn", .completions
= bgp_instasn_autocomplete
},
8089 {.completions
= NULL
},
8092 struct frr_pthread
*bgp_pth_io
;
8093 struct frr_pthread
*bgp_pth_ka
;
8095 static void bgp_pthreads_init(void)
8097 assert(!bgp_pth_io
);
8098 assert(!bgp_pth_ka
);
8100 struct frr_pthread_attr io
= {
8101 .start
= frr_pthread_attr_default
.start
,
8102 .stop
= frr_pthread_attr_default
.stop
,
8104 struct frr_pthread_attr ka
= {
8105 .start
= bgp_keepalives_start
,
8106 .stop
= bgp_keepalives_stop
,
8108 bgp_pth_io
= frr_pthread_new(&io
, "BGP I/O thread", "bgpd_io");
8109 bgp_pth_ka
= frr_pthread_new(&ka
, "BGP Keepalives thread", "bgpd_ka");
8112 void bgp_pthreads_run(void)
8114 frr_pthread_run(bgp_pth_io
, NULL
);
8115 frr_pthread_run(bgp_pth_ka
, NULL
);
8117 /* Wait until threads are ready. */
8118 frr_pthread_wait_running(bgp_pth_io
);
8119 frr_pthread_wait_running(bgp_pth_ka
);
8122 void bgp_pthreads_finish(void)
8124 frr_pthread_stop_all();
8127 static int peer_unshut_after_cfg(struct bgp
*bgp
)
8129 struct listnode
*node
;
8132 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
8133 if (!peer
->shut_during_cfg
)
8136 if (bgp_debug_neighbor_events(peer
))
8137 zlog_debug("%s: released from config-pending hold",
8140 peer
->shut_during_cfg
= false;
8141 if (peer_active(peer
) && peer
->status
!= Established
) {
8142 if (peer
->status
!= Idle
)
8143 BGP_EVENT_ADD(peer
, BGP_Stop
);
8144 BGP_EVENT_ADD(peer
, BGP_Start
);
8151 void bgp_init(unsigned short instance
)
8153 hook_register(bgp_config_end
, peer_unshut_after_cfg
);
8155 /* allocates some vital data structures used by peer commands in
8158 /* pre-init pthreads */
8159 bgp_pthreads_init();
8162 bgp_zebra_init(bm
->master
, instance
);
8164 #ifdef ENABLE_BGP_VNC
8165 vnc_zebra_init(bm
->master
);
8168 /* BGP VTY commands installation. */
8174 bgp_community_alias_init();
8177 bgp_route_map_init();
8178 bgp_scan_vty_init();
8180 #ifdef ENABLE_BGP_VNC
8183 bgp_ethernetvpn_init();
8184 bgp_flowspec_vty_init();
8186 /* Access list initialize. */
8188 access_list_add_hook(peer_distribute_update
);
8189 access_list_delete_hook(peer_distribute_update
);
8191 /* Filter list initialize. */
8193 as_list_add_hook(peer_aslist_add
);
8194 as_list_delete_hook(peer_aslist_del
);
8196 /* Prefix list initialize.*/
8198 prefix_list_add_hook(peer_prefix_list_update
);
8199 prefix_list_delete_hook(peer_prefix_list_update
);
8201 /* Community list initialize. */
8202 bgp_clist
= community_list_init();
8205 bgp_bfd_init(bm
->master
);
8209 cmd_variable_handler_register(bgp_viewvrf_var_handlers
);
8212 void bgp_terminate(void)
8216 struct listnode
*node
, *nnode
;
8217 struct listnode
*mnode
, *mnnode
;
8221 /* Close the listener sockets first as this prevents peers from
8223 * to reconnect on receiving the peer unconfig message. In the presence
8224 * of a large number of peers this will ensure that no peer is left with
8225 * a dangling connection
8229 /* reverse bgp_master_init */
8230 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
8231 bgp_close_vrf_socket(bgp
);
8232 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
8233 if (peer_established(peer
) || peer
->status
== OpenSent
8234 || peer
->status
== OpenConfirm
)
8235 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
8236 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
8239 if (bm
->listen_sockets
)
8240 list_delete(&bm
->listen_sockets
);
8242 THREAD_OFF(bm
->t_rmap_update
);
8247 struct peer
*peer_lookup_in_view(struct vty
*vty
, struct bgp
*bgp
,
8248 const char *ip_str
, bool use_json
)
8254 /* Get peer sockunion. */
8255 ret
= str2sockunion(ip_str
, &su
);
8257 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
8259 peer
= peer_lookup_by_hostname(bgp
, ip_str
);
8263 json_object
*json_no
= NULL
;
8264 json_no
= json_object_new_object();
8265 json_object_string_add(
8267 "malformedAddressOrName",
8269 vty_json(vty
, json_no
);
8272 "%% Malformed address or name: %s\n",
8280 /* Peer structure lookup. */
8281 peer
= peer_lookup(bgp
, &su
);
8284 json_object
*json_no
= NULL
;
8285 json_no
= json_object_new_object();
8286 json_object_string_add(json_no
, "warning",
8287 "No such neighbor in this view/vrf");
8288 vty_json(vty
, json_no
);
8290 vty_out(vty
, "No such neighbor in this view/vrf\n");
8297 void bgp_gr_apply_running_config(void)
8299 struct peer
*peer
= NULL
;
8300 struct bgp
*bgp
= NULL
;
8301 struct listnode
*node
, *nnode
;
8302 bool gr_router_detected
= false;
8304 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
8305 zlog_debug("[BGP_GR] %s called !", __func__
);
8307 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8308 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8309 bgp_peer_gr_flags_update(peer
);
8310 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
8311 gr_router_detected
= true;
8314 if (gr_router_detected
8315 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
8316 bgp_zebra_send_capabilities(bgp
, true);
8317 } else if (!gr_router_detected
8318 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
8319 bgp_zebra_send_capabilities(bgp
, false);
8322 gr_router_detected
= false;
8326 printfrr_ext_autoreg_p("BP", printfrr_bp
);
8327 static ssize_t
printfrr_bp(struct fbuf
*buf
, struct printfrr_eargs
*ea
,
8330 const struct peer
*peer
= ptr
;
8333 return bputs(buf
, "(null)");
8335 return bprintfrr(buf
, "%s(%s)", peer
->host
,
8336 peer
->hostname
? peer
->hostname
: "Unknown");