1 /* BGP-4, BGP-4+ daemon program
2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "sockunion.h"
38 #include "workqueue.h"
46 #include "frr_pthread.h"
49 #include "bgpd/bgpd.h"
50 #include "bgpd/bgp_table.h"
51 #include "bgpd/bgp_aspath.h"
52 #include "bgpd/bgp_route.h"
53 #include "bgpd/bgp_dump.h"
54 #include "bgpd/bgp_debug.h"
55 #include "bgpd/bgp_errors.h"
56 #include "bgpd/bgp_community.h"
57 #include "bgpd/bgp_conditional_adv.h"
58 #include "bgpd/bgp_attr.h"
59 #include "bgpd/bgp_regex.h"
60 #include "bgpd/bgp_clist.h"
61 #include "bgpd/bgp_fsm.h"
62 #include "bgpd/bgp_packet.h"
63 #include "bgpd/bgp_zebra.h"
64 #include "bgpd/bgp_open.h"
65 #include "bgpd/bgp_filter.h"
66 #include "bgpd/bgp_nexthop.h"
67 #include "bgpd/bgp_damp.h"
68 #include "bgpd/bgp_mplsvpn.h"
70 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
71 #include "bgpd/rfapi/rfapi_backend.h"
73 #include "bgpd/bgp_evpn.h"
74 #include "bgpd/bgp_advertise.h"
75 #include "bgpd/bgp_network.h"
76 #include "bgpd/bgp_vty.h"
77 #include "bgpd/bgp_mpath.h"
78 #include "bgpd/bgp_nht.h"
79 #include "bgpd/bgp_updgrp.h"
80 #include "bgpd/bgp_bfd.h"
81 #include "bgpd/bgp_memory.h"
82 #include "bgpd/bgp_evpn_vty.h"
83 #include "bgpd/bgp_keepalives.h"
84 #include "bgpd/bgp_io.h"
85 #include "bgpd/bgp_ecommunity.h"
86 #include "bgpd/bgp_flowspec.h"
87 #include "bgpd/bgp_labelpool.h"
88 #include "bgpd/bgp_pbr.h"
89 #include "bgpd/bgp_addpath.h"
90 #include "bgpd/bgp_evpn_private.h"
91 #include "bgpd/bgp_evpn_mh.h"
92 #include "bgpd/bgp_mac.h"
94 DEFINE_MTYPE_STATIC(BGPD
, PEER_TX_SHUTDOWN_MSG
, "Peer shutdown message (TX)");
95 DEFINE_MTYPE_STATIC(BGPD
, BGP_EVPN_INFO
, "BGP EVPN instance information");
96 DEFINE_QOBJ_TYPE(bgp_master
)
98 DEFINE_QOBJ_TYPE(peer
)
99 DEFINE_HOOK(bgp_inst_delete
, (struct bgp
*bgp
), (bgp
))
101 /* BGP process wide configuration. */
102 static struct bgp_master bgp_master
;
104 /* BGP process wide configuration pointer to export. */
105 struct bgp_master
*bm
;
107 /* BGP community-list. */
108 struct community_list_handler
*bgp_clist
;
110 unsigned int multipath_num
= MULTIPATH_NUM
;
112 static void bgp_if_finish(struct bgp
*bgp
);
113 static void peer_drop_dynamic_neighbor(struct peer
*peer
);
115 extern struct zclient
*zclient
;
117 /* handle main socket creation or deletion */
118 static int bgp_check_main_socket(bool create
, struct bgp
*bgp
)
120 static int bgp_server_main_created
;
123 if (bgp_server_main_created
)
125 if (bgp_socket(bgp
, bm
->port
, bm
->address
) < 0)
126 return BGP_ERR_INVALID_VALUE
;
127 bgp_server_main_created
= 1;
130 if (!bgp_server_main_created
)
133 bgp_server_main_created
= 0;
137 void bgp_session_reset(struct peer
*peer
)
139 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
140 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
141 peer_delete(peer
->doppelganger
);
143 BGP_EVENT_ADD(peer
, BGP_Stop
);
147 * During session reset, we may delete the doppelganger peer, which would
148 * be the next node to the current node. If the session reset was invoked
149 * during walk of peer list, we would end up accessing the freed next
150 * node. This function moves the next node along.
152 static void bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
157 n
= (nnode
) ? *nnode
: NULL
;
158 npeer
= (n
) ? listgetdata(n
) : NULL
;
160 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
161 && !(CHECK_FLAG(peer
->doppelganger
->flags
,
162 PEER_FLAG_CONFIG_NODE
))) {
163 if (peer
->doppelganger
== npeer
)
164 /* nnode and *nnode are confirmed to be non-NULL here */
165 *nnode
= (*nnode
)->next
;
166 peer_delete(peer
->doppelganger
);
169 BGP_EVENT_ADD(peer
, BGP_Stop
);
172 /* BGP global flag manipulation. */
173 int bgp_option_set(int flag
)
177 case BGP_OPT_NO_LISTEN
:
178 case BGP_OPT_NO_ZEBRA
:
179 SET_FLAG(bm
->options
, flag
);
182 return BGP_ERR_INVALID_FLAG
;
187 int bgp_option_unset(int flag
)
191 case BGP_OPT_NO_ZEBRA
:
193 UNSET_FLAG(bm
->options
, flag
);
196 return BGP_ERR_INVALID_FLAG
;
201 int bgp_option_check(int flag
)
203 return CHECK_FLAG(bm
->options
, flag
);
206 /* set the bgp no-rib option during runtime and remove installed routes */
207 void bgp_option_norib_set_runtime(void)
210 struct listnode
*node
;
214 if (bgp_option_check(BGP_OPT_NO_FIB
))
217 bgp_option_set(BGP_OPT_NO_FIB
);
219 zlog_info("Disabled BGP route installation to RIB (Zebra)");
221 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
)) {
222 FOREACH_AFI_SAFI(afi
, safi
)
223 bgp_zebra_withdraw_table_all_subtypes(bgp
, afi
, safi
);
226 zlog_info("All routes have been withdrawn from RIB (Zebra)");
229 /* unset the bgp no-rib option during runtime and announce routes to Zebra */
230 void bgp_option_norib_unset_runtime(void)
233 struct listnode
*node
;
237 if (!bgp_option_check(BGP_OPT_NO_FIB
))
240 bgp_option_unset(BGP_OPT_NO_FIB
);
242 zlog_info("Enabled BGP route installation to RIB (Zebra)");
244 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
)) {
245 FOREACH_AFI_SAFI(afi
, safi
)
246 bgp_zebra_announce_table_all_subtypes(bgp
, afi
, safi
);
249 zlog_info("All routes have been installed in RIB (Zebra)");
252 /* Internal function to set BGP structure configureation flag. */
253 static void bgp_config_set(struct bgp
*bgp
, int config
)
255 SET_FLAG(bgp
->config
, config
);
258 static void bgp_config_unset(struct bgp
*bgp
, int config
)
260 UNSET_FLAG(bgp
->config
, config
);
263 static int bgp_config_check(struct bgp
*bgp
, int config
)
265 return CHECK_FLAG(bgp
->config
, config
);
268 /* Set BGP router identifier; distinguish between explicit config and other
271 static int bgp_router_id_set(struct bgp
*bgp
, const struct in_addr
*id
,
275 struct listnode
*node
, *nnode
;
277 if (IPV4_ADDR_SAME(&bgp
->router_id
, id
))
280 /* EVPN uses router id in RD, withdraw them */
281 if (is_evpn_enabled())
282 bgp_evpn_handle_router_id_update(bgp
, true);
284 vpn_handle_router_id_update(bgp
, true, is_config
);
286 IPV4_ADDR_COPY(&bgp
->router_id
, id
);
288 /* Set all peer's local identifier with this value. */
289 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
290 IPV4_ADDR_COPY(&peer
->local_id
, id
);
292 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
293 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
294 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
295 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
299 /* EVPN uses router id in RD, update them */
300 if (is_evpn_enabled())
301 bgp_evpn_handle_router_id_update(bgp
, false);
303 vpn_handle_router_id_update(bgp
, false, is_config
);
308 void bgp_router_id_zebra_bump(vrf_id_t vrf_id
, const struct prefix
*router_id
)
310 struct listnode
*node
, *nnode
;
312 struct in_addr
*addr
= NULL
;
314 if (router_id
!= NULL
)
315 addr
= (struct in_addr
*)&(router_id
->u
.prefix4
);
317 if (vrf_id
== VRF_DEFAULT
) {
318 /* Router-id change for default VRF has to also update all
320 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
321 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
325 bgp
->router_id_zebra
= *addr
;
327 addr
= &bgp
->router_id_zebra
;
329 if (!bgp
->router_id_static
.s_addr
) {
330 /* Router ID is updated if there are no active
333 if (bgp
->established_peers
== 0) {
334 if (BGP_DEBUG(zebra
, ZEBRA
))
336 "RID change : vrf %s(%u), RTR ID %pI4",
340 * if old router-id was 0x0, set flag
341 * to use this new value
343 bgp_router_id_set(bgp
, addr
,
344 (bgp
->router_id
.s_addr
352 bgp
= bgp_lookup_by_vrf_id(vrf_id
);
355 bgp
->router_id_zebra
= *addr
;
357 addr
= &bgp
->router_id_zebra
;
359 if (!bgp
->router_id_static
.s_addr
) {
360 /* Router ID is updated if there are no active
363 if (bgp
->established_peers
== 0) {
364 if (BGP_DEBUG(zebra
, ZEBRA
))
366 "RID change : vrf %s(%u), RTR ID %pI4",
370 * if old router-id was 0x0, set flag
371 * to use this new value
373 bgp_router_id_set(bgp
, addr
,
374 (bgp
->router_id
.s_addr
385 void bgp_router_id_static_set(struct bgp
*bgp
, struct in_addr id
)
387 bgp
->router_id_static
= id
;
388 bgp_router_id_set(bgp
,
389 id
.s_addr
!= INADDR_ANY
? &id
: &bgp
->router_id_zebra
,
390 true /* is config */);
393 /* BGP's cluster-id control. */
394 int bgp_cluster_id_set(struct bgp
*bgp
, struct in_addr
*cluster_id
)
397 struct listnode
*node
, *nnode
;
399 IPV4_ADDR_COPY(&bgp
->cluster_id
, cluster_id
);
400 bgp_config_set(bgp
, BGP_CONFIG_CLUSTER_ID
);
402 /* Clear all IBGP peer. */
403 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
404 if (peer
->sort
!= BGP_PEER_IBGP
)
407 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
408 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
409 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
410 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
416 int bgp_cluster_id_unset(struct bgp
*bgp
)
419 struct listnode
*node
, *nnode
;
421 if (!bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
))
424 bgp
->cluster_id
.s_addr
= 0;
425 bgp_config_unset(bgp
, BGP_CONFIG_CLUSTER_ID
);
427 /* Clear all IBGP peer. */
428 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
429 if (peer
->sort
!= BGP_PEER_IBGP
)
432 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
433 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
434 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
435 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
441 /* time_t value that is monotonicly increasing
442 * and uneffected by adjustments to system clock
444 time_t bgp_clock(void)
452 /* BGP timer configuration. */
453 void bgp_timers_set(struct bgp
*bgp
, uint32_t keepalive
, uint32_t holdtime
,
454 uint32_t connect_retry
)
456 bgp
->default_keepalive
=
457 (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
458 bgp
->default_holdtime
= holdtime
;
459 bgp
->default_connect_retry
= connect_retry
;
462 /* mostly for completeness - CLI uses its own defaults */
463 void bgp_timers_unset(struct bgp
*bgp
)
465 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
466 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
467 bgp
->default_connect_retry
= BGP_DEFAULT_CONNECT_RETRY
;
470 /* BGP confederation configuration. */
471 void bgp_confederation_id_set(struct bgp
*bgp
, as_t as
)
474 struct listnode
*node
, *nnode
;
480 /* Remember - were we doing confederation before? */
481 already_confed
= bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
);
483 bgp_config_set(bgp
, BGP_CONFIG_CONFEDERATION
);
485 /* If we were doing confederation already, this is just an external
486 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
487 were not doing confederation before, reset all EBGP sessions. */
488 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
489 bgp_peer_sort_t ptype
= peer_sort(peer
);
491 /* We're looking for peers who's AS is not local or part of our
493 if (already_confed
) {
494 if (ptype
== BGP_PEER_EBGP
) {
496 if (BGP_IS_VALID_STATE_FOR_NOTIF(
499 PEER_DOWN_CONFED_ID_CHANGE
;
501 peer
, BGP_NOTIFY_CEASE
,
502 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
504 bgp_session_reset_safe(peer
, &nnode
);
507 /* Not doign confederation before, so reset every
510 if (ptype
!= BGP_PEER_IBGP
) {
511 /* Reset the local_as to be our EBGP one */
512 if (ptype
== BGP_PEER_EBGP
)
514 if (BGP_IS_VALID_STATE_FOR_NOTIF(
517 PEER_DOWN_CONFED_ID_CHANGE
;
519 peer
, BGP_NOTIFY_CEASE
,
520 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
522 bgp_session_reset_safe(peer
, &nnode
);
529 int bgp_confederation_id_unset(struct bgp
*bgp
)
532 struct listnode
*node
, *nnode
;
535 bgp_config_unset(bgp
, BGP_CONFIG_CONFEDERATION
);
537 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
538 /* We're looking for peers who's AS is not local */
539 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
540 peer
->local_as
= bgp
->as
;
541 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
542 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
543 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
544 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
548 bgp_session_reset_safe(peer
, &nnode
);
554 /* Is an AS part of the confed or not? */
555 bool bgp_confederation_peers_check(struct bgp
*bgp
, as_t as
)
562 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
563 if (bgp
->confed_peers
[i
] == as
)
569 /* Add an AS to the confederation set. */
570 int bgp_confederation_peers_add(struct bgp
*bgp
, as_t as
)
573 struct listnode
*node
, *nnode
;
576 return BGP_ERR_INVALID_BGP
;
579 return BGP_ERR_INVALID_AS
;
581 if (bgp_confederation_peers_check(bgp
, as
))
584 if (bgp
->confed_peers
)
586 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
587 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
590 XMALLOC(MTYPE_BGP_CONFED_LIST
,
591 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
593 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
594 bgp
->confed_peers_cnt
++;
596 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
597 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
598 if (peer
->as
== as
) {
599 peer
->local_as
= bgp
->as
;
600 if (BGP_IS_VALID_STATE_FOR_NOTIF(
603 PEER_DOWN_CONFED_PEER_CHANGE
;
605 peer
, BGP_NOTIFY_CEASE
,
606 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
608 bgp_session_reset_safe(peer
, &nnode
);
615 /* Delete an AS from the confederation set. */
616 int bgp_confederation_peers_remove(struct bgp
*bgp
, as_t as
)
621 struct listnode
*node
, *nnode
;
626 if (!bgp_confederation_peers_check(bgp
, as
))
629 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
630 if (bgp
->confed_peers
[i
] == as
)
631 for (j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
632 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
634 bgp
->confed_peers_cnt
--;
636 if (bgp
->confed_peers_cnt
== 0) {
637 if (bgp
->confed_peers
)
638 XFREE(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
639 bgp
->confed_peers
= NULL
;
642 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
643 bgp
->confed_peers_cnt
* sizeof(as_t
));
645 /* Now reset any peer who's remote AS has just been removed from the
647 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
648 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
649 if (peer
->as
== as
) {
650 peer
->local_as
= bgp
->confed_id
;
651 if (BGP_IS_VALID_STATE_FOR_NOTIF(
654 PEER_DOWN_CONFED_PEER_CHANGE
;
656 peer
, BGP_NOTIFY_CEASE
,
657 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
659 bgp_session_reset_safe(peer
, &nnode
);
667 /* Local preference configuration. */
668 int bgp_default_local_preference_set(struct bgp
*bgp
, uint32_t local_pref
)
673 bgp
->default_local_pref
= local_pref
;
678 int bgp_default_local_preference_unset(struct bgp
*bgp
)
683 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
688 /* Local preference configuration. */
689 int bgp_default_subgroup_pkt_queue_max_set(struct bgp
*bgp
, uint32_t queue_size
)
694 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
699 int bgp_default_subgroup_pkt_queue_max_unset(struct bgp
*bgp
)
703 bgp
->default_subgroup_pkt_queue_max
=
704 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
709 /* Listen limit configuration. */
710 int bgp_listen_limit_set(struct bgp
*bgp
, int listen_limit
)
715 bgp
->dynamic_neighbors_limit
= listen_limit
;
720 int bgp_listen_limit_unset(struct bgp
*bgp
)
725 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
730 int bgp_map_afi_safi_iana2int(iana_afi_t pkt_afi
, iana_safi_t pkt_safi
,
731 afi_t
*afi
, safi_t
*safi
)
733 /* Map from IANA values to internal values, return error if
734 * values are unrecognized.
736 *afi
= afi_iana2int(pkt_afi
);
737 *safi
= safi_iana2int(pkt_safi
);
738 if (*afi
== AFI_MAX
|| *safi
== SAFI_MAX
)
744 int bgp_map_afi_safi_int2iana(afi_t afi
, safi_t safi
, iana_afi_t
*pkt_afi
,
745 iana_safi_t
*pkt_safi
)
747 /* Map from internal values to IANA values, return error if
748 * internal values are bad (unexpected).
750 if (afi
== AFI_MAX
|| safi
== SAFI_MAX
)
752 *pkt_afi
= afi_int2iana(afi
);
753 *pkt_safi
= safi_int2iana(safi
);
757 struct peer_af
*peer_af_create(struct peer
*peer
, afi_t afi
, safi_t safi
)
766 afid
= afindex(afi
, safi
);
767 if (afid
>= BGP_AF_MAX
)
771 assert(peer
->peer_af_array
[afid
] == NULL
);
773 /* Allocate new peer af */
774 af
= XCALLOC(MTYPE_BGP_PEER_AF
, sizeof(struct peer_af
));
776 peer
->peer_af_array
[afid
] = af
;
781 bgp
->af_peer_count
[afi
][safi
]++;
786 struct peer_af
*peer_af_find(struct peer
*peer
, afi_t afi
, safi_t safi
)
793 afid
= afindex(afi
, safi
);
794 if (afid
>= BGP_AF_MAX
)
797 return peer
->peer_af_array
[afid
];
800 int peer_af_delete(struct peer
*peer
, afi_t afi
, safi_t safi
)
809 afid
= afindex(afi
, safi
);
810 if (afid
>= BGP_AF_MAX
)
813 af
= peer
->peer_af_array
[afid
];
818 bgp_stop_announce_route_timer(af
);
820 if (PAF_SUBGRP(af
)) {
821 if (BGP_DEBUG(update_groups
, UPDATE_GROUPS
))
822 zlog_debug("u%" PRIu64
":s%" PRIu64
" remove peer %s",
823 af
->subgroup
->update_group
->id
,
824 af
->subgroup
->id
, peer
->host
);
828 update_subgroup_remove_peer(af
->subgroup
, af
);
830 if (bgp
->af_peer_count
[afi
][safi
])
831 bgp
->af_peer_count
[afi
][safi
]--;
833 peer
->peer_af_array
[afid
] = NULL
;
834 XFREE(MTYPE_BGP_PEER_AF
, af
);
838 /* Peer comparison function for sorting. */
839 int peer_cmp(struct peer
*p1
, struct peer
*p2
)
841 if (p1
->group
&& !p2
->group
)
844 if (!p1
->group
&& p2
->group
)
847 if (p1
->group
== p2
->group
) {
848 if (p1
->conf_if
&& !p2
->conf_if
)
851 if (!p1
->conf_if
&& p2
->conf_if
)
854 if (p1
->conf_if
&& p2
->conf_if
)
855 return if_cmp_name_func(p1
->conf_if
, p2
->conf_if
);
857 return strcmp(p1
->group
->name
, p2
->group
->name
);
859 return sockunion_cmp(&p1
->su
, &p2
->su
);
862 static unsigned int peer_hash_key_make(const void *p
)
864 const struct peer
*peer
= p
;
865 return sockunion_hash(&peer
->su
);
868 static bool peer_hash_same(const void *p1
, const void *p2
)
870 const struct peer
*peer1
= p1
;
871 const struct peer
*peer2
= p2
;
872 return (sockunion_same(&peer1
->su
, &peer2
->su
)
873 && CHECK_FLAG(peer1
->flags
, PEER_FLAG_CONFIG_NODE
)
874 == CHECK_FLAG(peer2
->flags
, PEER_FLAG_CONFIG_NODE
));
877 void peer_flag_inherit(struct peer
*peer
, uint32_t flag
)
881 /* Skip if peer is not a peer-group member. */
882 if (!peer_group_active(peer
))
885 /* Unset override flag to signal inheritance from peer-group. */
886 UNSET_FLAG(peer
->flags_override
, flag
);
889 * Inherit flag state from peer-group. If the flag of the peer-group is
890 * not being inverted, the peer must inherit the inverse of the current
891 * peer-group flag state.
893 group_val
= CHECK_FLAG(peer
->group
->conf
->flags
, flag
);
894 if (!CHECK_FLAG(peer
->group
->conf
->flags_invert
, flag
)
895 && CHECK_FLAG(peer
->flags_invert
, flag
))
896 COND_FLAG(peer
->flags
, flag
, !group_val
);
898 COND_FLAG(peer
->flags
, flag
, group_val
);
901 int peer_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
903 return CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
);
906 void peer_af_flag_inherit(struct peer
*peer
, afi_t afi
, safi_t safi
,
911 /* Skip if peer is not a peer-group member. */
912 if (!peer_group_active(peer
))
915 /* Unset override flag to signal inheritance from peer-group. */
916 UNSET_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
919 * Inherit flag state from peer-group. If the flag of the peer-group is
920 * not being inverted, the peer must inherit the inverse of the current
921 * peer-group flag state.
923 group_val
= CHECK_FLAG(peer
->group
->conf
->af_flags
[afi
][safi
], flag
);
924 if (!CHECK_FLAG(peer
->group
->conf
->af_flags_invert
[afi
][safi
], flag
)
925 && CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
926 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, !group_val
);
928 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, group_val
);
931 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
932 static inline bgp_peer_sort_t
peer_calc_sort(struct peer
*peer
)
939 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
940 if (peer
->as_type
== AS_INTERNAL
)
941 return BGP_PEER_IBGP
;
943 else if (peer
->as_type
== AS_EXTERNAL
)
944 return BGP_PEER_EBGP
;
946 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
) {
948 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
956 peer1
= listnode_head(peer
->group
->peer
);
961 return BGP_PEER_INTERNAL
;
965 if (bgp
&& CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)) {
966 if (peer
->local_as
== 0)
967 return BGP_PEER_INTERNAL
;
969 if (peer
->local_as
== peer
->as
) {
970 if (bgp
->as
== bgp
->confed_id
) {
971 if (peer
->local_as
== bgp
->as
)
972 return BGP_PEER_IBGP
;
974 return BGP_PEER_EBGP
;
976 if (peer
->local_as
== bgp
->confed_id
)
977 return BGP_PEER_EBGP
;
979 return BGP_PEER_IBGP
;
983 if (bgp_confederation_peers_check(bgp
, peer
->as
))
984 return BGP_PEER_CONFED
;
986 return BGP_PEER_EBGP
;
988 if (peer
->as_type
== AS_UNSPECIFIED
) {
989 /* check if in peer-group with AS information */
991 && (peer
->group
->conf
->as_type
!= AS_UNSPECIFIED
)) {
992 if (peer
->group
->conf
->as_type
995 == peer
->group
->conf
->as
)
996 return BGP_PEER_IBGP
;
998 return BGP_PEER_EBGP
;
999 } else if (peer
->group
->conf
->as_type
1001 return BGP_PEER_IBGP
;
1003 return BGP_PEER_EBGP
;
1005 /* no AS information anywhere, let caller know */
1006 return BGP_PEER_UNSPECIFIED
;
1007 } else if (peer
->as_type
!= AS_SPECIFIED
)
1008 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
1011 return (peer
->local_as
== 0
1013 : peer
->local_as
== peer
->as
? BGP_PEER_IBGP
1018 /* Calculate and cache the peer "sort" */
1019 bgp_peer_sort_t
peer_sort(struct peer
*peer
)
1021 peer
->sort
= peer_calc_sort(peer
);
1025 bgp_peer_sort_t
peer_sort_lookup(struct peer
*peer
)
1030 static void peer_free(struct peer
*peer
)
1035 assert(peer
->status
== Deleted
);
1039 /* this /ought/ to have been done already through bgp_stop earlier,
1040 * but just to be sure..
1042 bgp_timer_set(peer
);
1043 bgp_reads_off(peer
);
1044 bgp_writes_off(peer
);
1045 assert(!peer
->t_write
);
1046 assert(!peer
->t_read
);
1047 BGP_EVENT_FLUSH(peer
);
1049 pthread_mutex_destroy(&peer
->io_mtx
);
1051 /* Free connected nexthop, if present */
1052 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
)
1053 && !peer_dynamic_neighbor(peer
))
1054 bgp_delete_connected_nexthop(family2afi(peer
->su
.sa
.sa_family
),
1057 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
1059 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
1060 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1061 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
1062 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
1064 /* Update source configuration. */
1065 if (peer
->update_source
) {
1066 sockunion_free(peer
->update_source
);
1067 peer
->update_source
= NULL
;
1070 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1072 XFREE(MTYPE_TMP
, peer
->notify
.data
);
1073 memset(&peer
->notify
, 0, sizeof(struct bgp_notify
));
1075 if (peer
->clear_node_queue
)
1076 work_queue_free_and_null(&peer
->clear_node_queue
);
1078 bgp_sync_delete(peer
);
1080 XFREE(MTYPE_PEER_CONF_IF
, peer
->conf_if
);
1082 bfd_info_free(&(peer
->bfd_info
));
1084 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
1085 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++) {
1086 bgp_addpath_set_peer_type(peer
, afi
, safi
,
1091 bgp_unlock(peer
->bgp
);
1093 memset(peer
, 0, sizeof(struct peer
));
1095 XFREE(MTYPE_BGP_PEER
, peer
);
1098 /* increase reference count on a struct peer */
1099 struct peer
*peer_lock_with_caller(const char *name
, struct peer
*peer
)
1101 assert(peer
&& (peer
->lock
>= 0));
1104 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
1112 /* decrease reference count on a struct peer
1113 * struct peer is freed and NULL returned if last reference
1115 struct peer
*peer_unlock_with_caller(const char *name
, struct peer
*peer
)
1117 assert(peer
&& (peer
->lock
> 0));
1120 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1125 if (peer
->lock
== 0) {
1132 /* BGP GR changes */
1134 int bgp_global_gr_init(struct bgp
*bgp
)
1136 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1137 zlog_debug("%s called ..", __func__
);
1139 int local_GLOBAL_GR_FSM
[BGP_GLOBAL_GR_MODE
][BGP_GLOBAL_GR_EVENT_CMD
] = {
1140 /* GLOBAL_HELPER Mode */
1143 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1144 GLOBAL_GR
, GLOBAL_INVALID
,
1145 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1146 GLOBAL_DISABLE
, GLOBAL_INVALID
1148 /* GLOBAL_GR Mode */
1151 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1152 GLOBAL_INVALID
, GLOBAL_HELPER
,
1153 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1154 GLOBAL_DISABLE
, GLOBAL_INVALID
1156 /* GLOBAL_DISABLE Mode */
1159 /*GLOBAL_GR_cmd */ /*no_Global_GR_cmd*/
1160 GLOBAL_GR
, GLOBAL_INVALID
,
1161 /*GLOBAL_DISABLE_cmd*//*no_Global_Disable_cmd*/
1162 GLOBAL_INVALID
, GLOBAL_HELPER
1164 /* GLOBAL_INVALID Mode */
1167 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1168 GLOBAL_INVALID
, GLOBAL_INVALID
,
1169 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1170 GLOBAL_INVALID
, GLOBAL_INVALID
1173 memcpy(bgp
->GLOBAL_GR_FSM
, local_GLOBAL_GR_FSM
,
1174 sizeof(local_GLOBAL_GR_FSM
));
1176 bgp
->global_gr_present_state
= GLOBAL_HELPER
;
1177 bgp
->present_zebra_gr_state
= ZEBRA_GR_DISABLE
;
1179 return BGP_GR_SUCCESS
;
1182 int bgp_peer_gr_init(struct peer
*peer
)
1184 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1185 zlog_debug("%s called ..", __func__
);
1187 struct bgp_peer_gr local_Peer_GR_FSM
[BGP_PEER_GR_MODE
]
1188 [BGP_PEER_GR_EVENT_CMD
] = {
1190 /* PEER_HELPER Mode */
1191 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1192 { PEER_GR
, bgp_peer_gr_action
}, {PEER_INVALID
, NULL
},
1193 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1194 {PEER_DISABLE
, bgp_peer_gr_action
}, {PEER_INVALID
, NULL
},
1195 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1196 { PEER_INVALID
, NULL
}, {PEER_GLOBAL_INHERIT
,
1197 bgp_peer_gr_action
}
1201 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1202 { PEER_INVALID
, NULL
}, { PEER_GLOBAL_INHERIT
,
1203 bgp_peer_gr_action
},
1204 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1205 {PEER_DISABLE
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1206 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1207 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1210 /* PEER_DISABLE Mode */
1211 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1212 { PEER_GR
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1213 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1214 { PEER_INVALID
, NULL
}, { PEER_GLOBAL_INHERIT
,
1215 bgp_peer_gr_action
},
1216 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1217 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1220 /* PEER_INVALID Mode */
1221 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1222 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1223 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1224 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1225 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1226 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1229 /* PEER_GLOBAL_INHERIT Mode */
1230 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1231 { PEER_GR
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1232 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1233 { PEER_DISABLE
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1234 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1235 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1238 memcpy(&peer
->PEER_GR_FSM
, local_Peer_GR_FSM
,
1239 sizeof(local_Peer_GR_FSM
));
1240 peer
->peer_gr_present_state
= PEER_GLOBAL_INHERIT
;
1241 bgp_peer_move_to_gr_mode(peer
, PEER_GLOBAL_INHERIT
);
1243 return BGP_GR_SUCCESS
;
1246 /* Allocate new peer object, implicitely locked. */
1247 struct peer
*peer_new(struct bgp
*bgp
)
1254 /* bgp argument is absolutely required */
1257 /* Allocate new peer. */
1258 peer
= XCALLOC(MTYPE_BGP_PEER
, sizeof(struct peer
));
1260 /* Set default value. */
1262 peer
->v_start
= BGP_INIT_START_TIMER
;
1263 peer
->v_connect
= bgp
->default_connect_retry
;
1264 peer
->status
= Idle
;
1265 peer
->ostatus
= Idle
;
1266 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1267 peer
->bgp
= bgp_lock(bgp
);
1268 peer
= peer_lock(peer
); /* initial reference */
1269 peer
->password
= NULL
;
1271 /* Set default flags. */
1272 FOREACH_AFI_SAFI (afi
, safi
) {
1273 SET_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1274 SET_FLAG(peer
->af_flags
[afi
][safi
],
1275 PEER_FLAG_SEND_EXT_COMMUNITY
);
1276 SET_FLAG(peer
->af_flags
[afi
][safi
],
1277 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1279 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1280 PEER_FLAG_SEND_COMMUNITY
);
1281 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1282 PEER_FLAG_SEND_EXT_COMMUNITY
);
1283 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1284 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1285 peer
->addpath_type
[afi
][safi
] = BGP_ADDPATH_NONE
;
1288 /* set nexthop-unchanged for l2vpn evpn by default */
1289 SET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1290 PEER_FLAG_NEXTHOP_UNCHANGED
);
1292 SET_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1294 /* Initialize per peer bgp GR FSM */
1295 bgp_peer_gr_init(peer
);
1297 /* Create buffers. */
1298 peer
->ibuf
= stream_fifo_new();
1299 peer
->obuf
= stream_fifo_new();
1300 pthread_mutex_init(&peer
->io_mtx
, NULL
);
1302 /* We use a larger buffer for peer->obuf_work in the event that:
1303 * - We RX a BGP_UPDATE where the attributes alone are just
1304 * under BGP_MAX_PACKET_SIZE
1305 * - The user configures an outbound route-map that does many as-path
1306 * prepends or adds many communities. At most they can have
1307 * CMD_ARGC_MAX args in a route-map so there is a finite limit on how
1308 * large they can make the attributes.
1310 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid
1311 * bounds checking for every single attribute as we construct an
1315 stream_new(BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1317 ringbuf_new(BGP_MAX_PACKET_SIZE
* BGP_READ_PACKET_MAX
);
1319 peer
->scratch
= stream_new(BGP_MAX_PACKET_SIZE
);
1321 bgp_sync_init(peer
);
1323 /* Get service port number. */
1324 sp
= getservbyname("bgp", "tcp");
1325 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
1327 QOBJ_REG(peer
, peer
);
1332 * This function is invoked when a duplicate peer structure associated with
1333 * a neighbor is being deleted. If this about-to-be-deleted structure is
1334 * the one with all the config, then we have to copy over the info.
1336 void peer_xfer_config(struct peer
*peer_dst
, struct peer
*peer_src
)
1338 struct peer_af
*paf
;
1346 /* The following function is used by both peer group config copy to
1347 * individual peer and when we transfer config
1349 if (peer_src
->change_local_as
)
1350 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1352 /* peer flags apply */
1353 peer_dst
->flags
= peer_src
->flags
;
1354 peer_dst
->cap
= peer_src
->cap
;
1356 peer_dst
->peer_gr_present_state
= peer_src
->peer_gr_present_state
;
1357 peer_dst
->peer_gr_new_status_flag
= peer_src
->peer_gr_new_status_flag
;
1359 peer_dst
->local_as
= peer_src
->local_as
;
1360 peer_dst
->port
= peer_src
->port
;
1361 (void)peer_sort(peer_dst
);
1362 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1365 peer_dst
->holdtime
= peer_src
->holdtime
;
1366 peer_dst
->keepalive
= peer_src
->keepalive
;
1367 peer_dst
->connect
= peer_src
->connect
;
1368 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1369 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1370 peer_dst
->routeadv
= peer_src
->routeadv
;
1371 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1373 /* password apply */
1374 if (peer_src
->password
&& !peer_dst
->password
)
1375 peer_dst
->password
=
1376 XSTRDUP(MTYPE_PEER_PASSWORD
, peer_src
->password
);
1378 FOREACH_AFI_SAFI (afi
, safi
) {
1379 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1380 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1381 peer_dst
->allowas_in
[afi
][safi
] =
1382 peer_src
->allowas_in
[afi
][safi
];
1383 peer_dst
->weight
[afi
][safi
] = peer_src
->weight
[afi
][safi
];
1384 peer_dst
->addpath_type
[afi
][safi
] =
1385 peer_src
->addpath_type
[afi
][safi
];
1388 for (afidx
= BGP_AF_START
; afidx
< BGP_AF_MAX
; afidx
++) {
1389 paf
= peer_src
->peer_af_array
[afidx
];
1391 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1394 /* update-source apply */
1395 if (peer_src
->update_source
) {
1396 if (peer_dst
->update_source
)
1397 sockunion_free(peer_dst
->update_source
);
1398 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1399 peer_dst
->update_source
=
1400 sockunion_dup(peer_src
->update_source
);
1401 } else if (peer_src
->update_if
) {
1402 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1403 if (peer_dst
->update_source
) {
1404 sockunion_free(peer_dst
->update_source
);
1405 peer_dst
->update_source
= NULL
;
1407 peer_dst
->update_if
=
1408 XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1411 if (peer_src
->ifname
) {
1412 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1415 XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1419 static int bgp_peer_conf_if_to_su_update_v4(struct peer
*peer
,
1420 struct interface
*ifp
)
1422 struct connected
*ifc
;
1425 struct listnode
*node
;
1427 /* If our IPv4 address on the interface is /30 or /31, we can derive the
1428 * IPv4 address of the other end.
1430 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
)) {
1431 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
)) {
1432 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1433 if (p
.prefixlen
== 30) {
1434 peer
->su
.sa
.sa_family
= AF_INET
;
1435 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1437 peer
->su
.sin
.sin_addr
.s_addr
=
1439 else if (addr
% 4 == 2)
1440 peer
->su
.sin
.sin_addr
.s_addr
=
1442 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1443 peer
->su
.sin
.sin_len
=
1444 sizeof(struct sockaddr_in
);
1445 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1447 } else if (p
.prefixlen
== 31) {
1448 peer
->su
.sa
.sa_family
= AF_INET
;
1449 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1451 peer
->su
.sin
.sin_addr
.s_addr
=
1454 peer
->su
.sin
.sin_addr
.s_addr
=
1456 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1457 peer
->su
.sin
.sin_len
=
1458 sizeof(struct sockaddr_in
);
1459 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1461 } else if (bgp_debug_neighbor_events(peer
))
1463 "%s: IPv4 interface address is not /30 or /31, v4 session not started",
1471 static bool bgp_peer_conf_if_to_su_update_v6(struct peer
*peer
,
1472 struct interface
*ifp
)
1474 struct nbr_connected
*ifc_nbr
;
1476 /* Have we learnt the peer's IPv6 link-local address? */
1477 if (ifp
->nbr_connected
1478 && (ifc_nbr
= listnode_head(ifp
->nbr_connected
))) {
1479 peer
->su
.sa
.sa_family
= AF_INET6
;
1480 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1481 sizeof(struct in6_addr
));
1483 peer
->su
.sin6
.sin6_len
= sizeof(struct sockaddr_in6
);
1485 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1493 * Set or reset the peer address socketunion structure based on the
1494 * learnt/derived peer address. If the address has changed, update the
1495 * password on the listen socket, if needed.
1497 void bgp_peer_conf_if_to_su_update(struct peer
*peer
)
1499 struct interface
*ifp
;
1501 int peer_addr_updated
= 0;
1507 * Our peer structure is stored in the bgp->peerhash
1508 * release it before we modify anything.
1510 hash_release(peer
->bgp
->peerhash
, peer
);
1512 prev_family
= peer
->su
.sa
.sa_family
;
1513 if ((ifp
= if_lookup_by_name(peer
->conf_if
, peer
->bgp
->vrf_id
))) {
1515 /* If BGP unnumbered is not "v6only", we first see if we can
1517 * peer's IPv4 address.
1519 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1521 bgp_peer_conf_if_to_su_update_v4(peer
, ifp
);
1523 /* If "v6only" or we can't derive peer's IPv4 address, see if
1525 * learnt the peer's IPv6 link-local address. This is from the
1527 * IPv6 address in router advertisement.
1529 if (!peer_addr_updated
)
1531 bgp_peer_conf_if_to_su_update_v6(peer
, ifp
);
1533 /* If we could derive the peer address, we may need to install the
1535 * configured for the peer, if any, on the listen socket. Otherwise,
1537 * that peer's address is not available and uninstall the password, if
1540 if (peer_addr_updated
) {
1541 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1542 && prev_family
== AF_UNSPEC
)
1545 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1546 && prev_family
!= AF_UNSPEC
)
1547 bgp_md5_unset(peer
);
1548 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1549 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof(struct in6_addr
));
1553 * Since our su changed we need to del/add peer to the peerhash
1555 hash_get(peer
->bgp
->peerhash
, peer
, hash_alloc_intern
);
1558 static void bgp_recalculate_afi_safi_bestpaths(struct bgp
*bgp
, afi_t afi
,
1561 struct bgp_dest
*dest
, *ndest
;
1562 struct bgp_table
*table
;
1564 for (dest
= bgp_table_top(bgp
->rib
[afi
][safi
]); dest
;
1565 dest
= bgp_route_next(dest
)) {
1566 table
= bgp_dest_get_bgp_table_info(dest
);
1567 if (table
!= NULL
) {
1568 /* Special handling for 2-level routing
1570 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
1571 || safi
== SAFI_EVPN
) {
1572 for (ndest
= bgp_table_top(table
); ndest
;
1573 ndest
= bgp_route_next(ndest
))
1574 bgp_process(bgp
, ndest
, afi
, safi
);
1576 bgp_process(bgp
, dest
, afi
, safi
);
1581 /* Force a bestpath recalculation for all prefixes. This is used
1582 * when 'bgp bestpath' commands are entered.
1584 void bgp_recalculate_all_bestpaths(struct bgp
*bgp
)
1589 FOREACH_AFI_SAFI (afi
, safi
) {
1590 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, safi
);
1595 * Create new BGP peer.
1597 * conf_if and su are mutually exclusive if configuring from the cli.
1598 * If we are handing a doppelganger, then we *must* pass in both
1599 * the original peer's su and conf_if, so that we can appropriately
1600 * track the bgp->peerhash( ie we don't want to remove the current
1601 * one from the config ).
1603 struct peer
*peer_create(union sockunion
*su
, const char *conf_if
,
1604 struct bgp
*bgp
, as_t local_as
, as_t remote_as
,
1605 int as_type
, afi_t afi
, safi_t safi
,
1606 struct peer_group
*group
)
1610 char buf
[SU_ADDRSTRLEN
];
1612 peer
= peer_new(bgp
);
1614 peer
->conf_if
= XSTRDUP(MTYPE_PEER_CONF_IF
, conf_if
);
1618 bgp_peer_conf_if_to_su_update(peer
);
1619 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1620 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, conf_if
);
1623 sockunion2str(su
, buf
, SU_ADDRSTRLEN
);
1624 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1625 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, buf
);
1627 peer
->local_as
= local_as
;
1628 peer
->as
= remote_as
;
1629 peer
->as_type
= as_type
;
1630 peer
->local_id
= bgp
->router_id
;
1631 peer
->v_holdtime
= bgp
->default_holdtime
;
1632 peer
->v_keepalive
= bgp
->default_keepalive
;
1633 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
1634 ? BGP_DEFAULT_IBGP_ROUTEADV
1635 : BGP_DEFAULT_EBGP_ROUTEADV
;
1637 peer
= peer_lock(peer
); /* bgp peer list reference */
1638 peer
->group
= group
;
1639 listnode_add_sort(bgp
->peer
, peer
);
1640 hash_get(bgp
->peerhash
, peer
, hash_alloc_intern
);
1642 /* Adjust update-group coalesce timer heuristics for # peers. */
1643 if (bgp
->heuristic_coalesce
) {
1644 long ct
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
1646 * BGP_PEER_ADJUST_SUBGROUP_COALESCE_TIME
);
1647 bgp
->coalesce_time
= MIN(BGP_MAX_SUBGROUP_COALESCE_TIME
, ct
);
1650 active
= peer_active(peer
);
1652 if (peer
->su
.sa
.sa_family
== AF_UNSPEC
)
1653 peer
->last_reset
= PEER_DOWN_NBR_ADDR
;
1655 peer
->last_reset
= PEER_DOWN_NOAFI_ACTIVATED
;
1658 /* Last read and reset time set */
1659 peer
->readtime
= peer
->resettime
= bgp_clock();
1661 /* Default TTL set. */
1662 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? MAXTTL
: BGP_DEFAULT_TTL
;
1664 /* Default configured keepalives count for shutdown rtt command */
1665 peer
->rtt_keepalive_conf
= 1;
1667 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1670 peer
->afc
[afi
][safi
] = 1;
1671 peer_af_create(peer
, afi
, safi
);
1674 /* auto shutdown if configured */
1675 if (bgp
->autoshutdown
)
1676 peer_flag_set(peer
, PEER_FLAG_SHUTDOWN
);
1677 /* Set up peer's events and timers. */
1678 else if (!active
&& peer_active(peer
))
1679 bgp_timer_set(peer
);
1681 bgp_peer_gr_flags_update(peer
);
1682 BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
);
1687 /* Make accept BGP peer. This function is only called from the test code */
1688 struct peer
*peer_create_accept(struct bgp
*bgp
)
1692 peer
= peer_new(bgp
);
1694 peer
= peer_lock(peer
); /* bgp peer list reference */
1695 listnode_add_sort(bgp
->peer
, peer
);
1701 * Return true if we have a peer configured to use this afi/safi
1703 int bgp_afi_safi_peer_exists(struct bgp
*bgp
, afi_t afi
, safi_t safi
)
1705 struct listnode
*node
;
1708 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
1709 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1712 if (peer
->afc
[afi
][safi
])
1719 /* Change peer's AS number. */
1720 void peer_as_change(struct peer
*peer
, as_t as
, int as_specified
)
1722 bgp_peer_sort_t origtype
, newtype
;
1725 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1726 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
1727 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1728 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
1729 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1731 bgp_session_reset(peer
);
1733 origtype
= peer_sort_lookup(peer
);
1735 peer
->as_type
= as_specified
;
1737 if (bgp_config_check(peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1738 && !bgp_confederation_peers_check(peer
->bgp
, as
)
1739 && peer
->bgp
->as
!= as
)
1740 peer
->local_as
= peer
->bgp
->confed_id
;
1742 peer
->local_as
= peer
->bgp
->as
;
1744 newtype
= peer_sort(peer
);
1745 /* Advertisement-interval reset */
1746 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_ROUTEADV
)) {
1747 peer
->v_routeadv
= (newtype
== BGP_PEER_IBGP
)
1748 ? BGP_DEFAULT_IBGP_ROUTEADV
1749 : BGP_DEFAULT_EBGP_ROUTEADV
;
1753 if (newtype
== BGP_PEER_IBGP
)
1755 else if (origtype
== BGP_PEER_IBGP
)
1756 peer
->ttl
= BGP_DEFAULT_TTL
;
1758 /* reflector-client reset */
1759 if (newtype
!= BGP_PEER_IBGP
) {
1760 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1761 PEER_FLAG_REFLECTOR_CLIENT
);
1762 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1763 PEER_FLAG_REFLECTOR_CLIENT
);
1764 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_LABELED_UNICAST
],
1765 PEER_FLAG_REFLECTOR_CLIENT
);
1766 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1767 PEER_FLAG_REFLECTOR_CLIENT
);
1768 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_ENCAP
],
1769 PEER_FLAG_REFLECTOR_CLIENT
);
1770 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_FLOWSPEC
],
1771 PEER_FLAG_REFLECTOR_CLIENT
);
1772 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1773 PEER_FLAG_REFLECTOR_CLIENT
);
1774 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1775 PEER_FLAG_REFLECTOR_CLIENT
);
1776 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_LABELED_UNICAST
],
1777 PEER_FLAG_REFLECTOR_CLIENT
);
1778 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MPLS_VPN
],
1779 PEER_FLAG_REFLECTOR_CLIENT
);
1780 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_ENCAP
],
1781 PEER_FLAG_REFLECTOR_CLIENT
);
1782 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_FLOWSPEC
],
1783 PEER_FLAG_REFLECTOR_CLIENT
);
1784 UNSET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1785 PEER_FLAG_REFLECTOR_CLIENT
);
1788 /* local-as reset */
1789 if (newtype
!= BGP_PEER_EBGP
) {
1790 peer
->change_local_as
= 0;
1791 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
1792 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1793 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1797 /* If peer does not exist, create new one. If peer already exists,
1798 set AS number to the peer. */
1799 int peer_remote_as(struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1800 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1806 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
1808 peer
= peer_lookup(bgp
, su
);
1811 /* Not allowed for a dynamic peer. */
1812 if (peer_dynamic_neighbor(peer
)) {
1814 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1817 /* When this peer is a member of peer-group. */
1819 /* peer-group already has AS number/internal/external */
1820 if (peer
->group
->conf
->as
1821 || peer
->group
->conf
->as_type
) {
1822 /* Return peer group's AS number. */
1823 *as
= peer
->group
->conf
->as
;
1824 return BGP_ERR_PEER_GROUP_MEMBER
;
1827 bgp_peer_sort_t peer_sort_type
=
1828 peer_sort(peer
->group
->conf
);
1830 /* Explicit AS numbers used, compare AS numbers */
1831 if (as_type
== AS_SPECIFIED
) {
1832 if (((peer_sort_type
== BGP_PEER_IBGP
)
1833 && (bgp
->as
!= *as
))
1834 || ((peer_sort_type
== BGP_PEER_EBGP
)
1835 && (bgp
->as
== *as
))) {
1837 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1840 /* internal/external used, compare as-types */
1841 if (((peer_sort_type
== BGP_PEER_IBGP
)
1842 && (as_type
!= AS_INTERNAL
))
1843 || ((peer_sort_type
== BGP_PEER_EBGP
)
1844 && (as_type
!= AS_EXTERNAL
))) {
1846 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1851 /* Existing peer's AS number change. */
1852 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
1853 || (peer
->as_type
!= as_type
))
1854 peer_as_change(peer
, *as
, as_type
);
1857 return BGP_ERR_NO_INTERFACE_CONFIG
;
1859 /* If the peer is not part of our confederation, and its not an
1860 iBGP peer then spoof the source AS */
1861 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)
1862 && !bgp_confederation_peers_check(bgp
, *as
)
1864 local_as
= bgp
->confed_id
;
1868 /* If this is IPv4 unicast configuration and "no bgp default
1869 ipv4-unicast" is specified. */
1871 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_DEFAULT_IPV4
)
1872 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1873 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0,
1876 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
,
1883 static void peer_group2peer_config_copy_af(struct peer_group
*group
,
1884 struct peer
*peer
, afi_t afi
,
1888 int out
= FILTER_OUT
;
1890 uint32_t pflags_ovrd
;
1891 uint8_t *pfilter_ovrd
;
1895 pflags_ovrd
= peer
->af_flags_override
[afi
][safi
];
1896 pfilter_ovrd
= &peer
->filter_override
[afi
][safi
][in
];
1898 /* peer af_flags apply */
1899 flags_tmp
= conf
->af_flags
[afi
][safi
] & ~pflags_ovrd
;
1900 flags_tmp
^= conf
->af_flags_invert
[afi
][safi
]
1901 ^ peer
->af_flags_invert
[afi
][safi
];
1902 flags_tmp
&= ~pflags_ovrd
;
1904 UNSET_FLAG(peer
->af_flags
[afi
][safi
], ~pflags_ovrd
);
1905 SET_FLAG(peer
->af_flags
[afi
][safi
], flags_tmp
);
1906 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1907 conf
->af_flags_invert
[afi
][safi
]);
1909 /* maximum-prefix */
1910 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_MAX_PREFIX
)) {
1911 PEER_ATTR_INHERIT(peer
, group
, pmax
[afi
][safi
]);
1912 PEER_ATTR_INHERIT(peer
, group
, pmax_threshold
[afi
][safi
]);
1913 PEER_ATTR_INHERIT(peer
, group
, pmax_restart
[afi
][safi
]);
1917 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_ALLOWAS_IN
))
1918 PEER_ATTR_INHERIT(peer
, group
, allowas_in
[afi
][safi
]);
1921 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_WEIGHT
))
1922 PEER_ATTR_INHERIT(peer
, group
, weight
[afi
][safi
]);
1924 /* default-originate route-map */
1925 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_DEFAULT_ORIGINATE
)) {
1926 PEER_STR_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].name
,
1927 MTYPE_ROUTE_MAP_NAME
);
1928 PEER_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].map
);
1931 /* inbound filter apply */
1932 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_DISTRIBUTE_LIST
)) {
1933 PEER_STR_ATTR_INHERIT(peer
, group
,
1934 filter
[afi
][safi
].dlist
[in
].name
,
1935 MTYPE_BGP_FILTER_NAME
);
1936 PEER_ATTR_INHERIT(peer
, group
,
1937 filter
[afi
][safi
].dlist
[in
].alist
);
1940 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_PREFIX_LIST
)) {
1941 PEER_STR_ATTR_INHERIT(peer
, group
,
1942 filter
[afi
][safi
].plist
[in
].name
,
1943 MTYPE_BGP_FILTER_NAME
);
1944 PEER_ATTR_INHERIT(peer
, group
,
1945 filter
[afi
][safi
].plist
[in
].plist
);
1948 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_FILTER_LIST
)) {
1949 PEER_STR_ATTR_INHERIT(peer
, group
,
1950 filter
[afi
][safi
].aslist
[in
].name
,
1951 MTYPE_BGP_FILTER_NAME
);
1952 PEER_ATTR_INHERIT(peer
, group
,
1953 filter
[afi
][safi
].aslist
[in
].aslist
);
1956 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_IN
], PEER_FT_ROUTE_MAP
)) {
1957 PEER_STR_ATTR_INHERIT(peer
, group
,
1958 filter
[afi
][safi
].map
[in
].name
,
1959 MTYPE_BGP_FILTER_NAME
);
1960 PEER_ATTR_INHERIT(peer
, group
,
1961 filter
[afi
][safi
].map
[RMAP_IN
].map
);
1964 /* outbound filter apply */
1965 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_DISTRIBUTE_LIST
)) {
1966 PEER_STR_ATTR_INHERIT(peer
, group
,
1967 filter
[afi
][safi
].dlist
[out
].name
,
1968 MTYPE_BGP_FILTER_NAME
);
1969 PEER_ATTR_INHERIT(peer
, group
,
1970 filter
[afi
][safi
].dlist
[out
].alist
);
1973 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_PREFIX_LIST
)) {
1974 PEER_STR_ATTR_INHERIT(peer
, group
,
1975 filter
[afi
][safi
].plist
[out
].name
,
1976 MTYPE_BGP_FILTER_NAME
);
1977 PEER_ATTR_INHERIT(peer
, group
,
1978 filter
[afi
][safi
].plist
[out
].plist
);
1981 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_FILTER_LIST
)) {
1982 PEER_STR_ATTR_INHERIT(peer
, group
,
1983 filter
[afi
][safi
].aslist
[out
].name
,
1984 MTYPE_BGP_FILTER_NAME
);
1985 PEER_ATTR_INHERIT(peer
, group
,
1986 filter
[afi
][safi
].aslist
[out
].aslist
);
1989 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_OUT
], PEER_FT_ROUTE_MAP
)) {
1990 PEER_STR_ATTR_INHERIT(peer
, group
,
1991 filter
[afi
][safi
].map
[RMAP_OUT
].name
,
1992 MTYPE_BGP_FILTER_NAME
);
1993 PEER_ATTR_INHERIT(peer
, group
,
1994 filter
[afi
][safi
].map
[RMAP_OUT
].map
);
1997 /* nondirectional filter apply */
1998 if (!CHECK_FLAG(pfilter_ovrd
[0], PEER_FT_UNSUPPRESS_MAP
)) {
1999 PEER_STR_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.name
,
2000 MTYPE_BGP_FILTER_NAME
);
2001 PEER_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.map
);
2004 if (peer
->addpath_type
[afi
][safi
] == BGP_ADDPATH_NONE
) {
2005 peer
->addpath_type
[afi
][safi
] = conf
->addpath_type
[afi
][safi
];
2006 bgp_addpath_type_changed(conf
->bgp
);
2010 static int peer_activate_af(struct peer
*peer
, afi_t afi
, safi_t safi
)
2015 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2016 flog_err(EC_BGP_PEER_GROUP
, "%s was called for peer-group %s",
2017 __func__
, peer
->host
);
2021 /* Do not activate a peer for both SAFI_UNICAST and SAFI_LABELED_UNICAST
2023 if ((safi
== SAFI_UNICAST
&& peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
2024 || (safi
== SAFI_LABELED_UNICAST
&& peer
->afc
[afi
][SAFI_UNICAST
]))
2025 return BGP_ERR_PEER_SAFI_CONFLICT
;
2027 /* Nothing to do if we've already activated this peer */
2028 if (peer
->afc
[afi
][safi
])
2031 if (peer_af_create(peer
, afi
, safi
) == NULL
)
2034 active
= peer_active(peer
);
2035 peer
->afc
[afi
][safi
] = 1;
2038 peer_group2peer_config_copy_af(peer
->group
, peer
, afi
, safi
);
2040 if (!active
&& peer_active(peer
)) {
2041 bgp_timer_set(peer
);
2043 if (peer
->status
== Established
) {
2044 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2045 peer
->afc_adv
[afi
][safi
] = 1;
2046 bgp_capability_send(peer
, afi
, safi
,
2048 CAPABILITY_ACTION_SET
);
2049 if (peer
->afc_recv
[afi
][safi
]) {
2050 peer
->afc_nego
[afi
][safi
] = 1;
2051 bgp_announce_route(peer
, afi
, safi
);
2054 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2055 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2056 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2059 if (peer
->status
== OpenSent
|| peer
->status
== OpenConfirm
) {
2060 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2061 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2062 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2065 * If we are turning on a AFI/SAFI locally and we've
2066 * started bringing a peer up, we need to tell
2067 * the other peer to restart because we might loose
2068 * configuration here because when the doppelganger
2069 * gets to a established state due to how
2070 * we resolve we could just overwrite the afi/safi
2073 other
= peer
->doppelganger
;
2075 && (other
->status
== OpenSent
2076 || other
->status
== OpenConfirm
)) {
2077 other
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2078 bgp_notify_send(other
, BGP_NOTIFY_CEASE
,
2079 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2086 /* Activate the peer or peer group for specified AFI and SAFI. */
2087 int peer_activate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2090 struct peer_group
*group
;
2091 struct listnode
*node
, *nnode
;
2092 struct peer
*tmp_peer
;
2095 /* Nothing to do if we've already activated this peer */
2096 if (peer
->afc
[afi
][safi
])
2101 /* This is a peer-group so activate all of the members of the
2102 * peer-group as well */
2103 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2105 /* Do not activate a peer for both SAFI_UNICAST and
2106 * SAFI_LABELED_UNICAST */
2107 if ((safi
== SAFI_UNICAST
2108 && peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
2109 || (safi
== SAFI_LABELED_UNICAST
2110 && peer
->afc
[afi
][SAFI_UNICAST
]))
2111 return BGP_ERR_PEER_SAFI_CONFLICT
;
2113 peer
->afc
[afi
][safi
] = 1;
2114 group
= peer
->group
;
2116 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2117 ret
|= peer_activate_af(tmp_peer
, afi
, safi
);
2120 ret
|= peer_activate_af(peer
, afi
, safi
);
2123 /* If this is the first peer to be activated for this
2124 * afi/labeled-unicast recalc bestpaths to trigger label allocation */
2125 if (safi
== SAFI_LABELED_UNICAST
2126 && !bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]) {
2128 if (BGP_DEBUG(zebra
, ZEBRA
))
2130 "peer(s) are now active for labeled-unicast, allocate MPLS labels");
2132 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 1;
2133 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2136 if (safi
== SAFI_FLOWSPEC
) {
2137 /* connect to table manager */
2138 bgp_zebra_init_tm_connect(bgp
);
2143 static bool non_peergroup_deactivate_af(struct peer
*peer
, afi_t afi
,
2146 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2147 flog_err(EC_BGP_PEER_GROUP
, "%s was called for peer-group %s",
2148 __func__
, peer
->host
);
2152 /* Nothing to do if we've already deactivated this peer */
2153 if (!peer
->afc
[afi
][safi
])
2156 /* De-activate the address family configuration. */
2157 peer
->afc
[afi
][safi
] = 0;
2159 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2160 flog_err(EC_BGP_PEER_DELETE
,
2161 "couldn't delete af structure for peer %s(%s, %s)",
2162 peer
->host
, afi2str(afi
), safi2str(safi
));
2166 if (peer
->status
== Established
) {
2167 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2168 peer
->afc_adv
[afi
][safi
] = 0;
2169 peer
->afc_nego
[afi
][safi
] = 0;
2171 if (peer_active_nego(peer
)) {
2172 bgp_capability_send(peer
, afi
, safi
,
2174 CAPABILITY_ACTION_UNSET
);
2175 bgp_clear_route(peer
, afi
, safi
);
2176 peer
->pcount
[afi
][safi
] = 0;
2178 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2179 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2180 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2183 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2184 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2185 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2192 int peer_deactivate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2195 struct peer_group
*group
;
2196 struct peer
*tmp_peer
;
2197 struct listnode
*node
, *nnode
;
2200 /* Nothing to do if we've already de-activated this peer */
2201 if (!peer
->afc
[afi
][safi
])
2204 /* This is a peer-group so de-activate all of the members of the
2205 * peer-group as well */
2206 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2207 peer
->afc
[afi
][safi
] = 0;
2208 group
= peer
->group
;
2210 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2213 "couldn't delete af structure for peer %s(%s, %s)",
2214 peer
->host
, afi2str(afi
), safi2str(safi
));
2217 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2218 ret
|= non_peergroup_deactivate_af(tmp_peer
, afi
, safi
);
2221 ret
|= non_peergroup_deactivate_af(peer
, afi
, safi
);
2226 /* If this is the last peer to be deactivated for this
2227 * afi/labeled-unicast recalc bestpaths to trigger label deallocation */
2228 if (safi
== SAFI_LABELED_UNICAST
2229 && bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]
2230 && !bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
2232 if (BGP_DEBUG(zebra
, ZEBRA
))
2234 "peer(s) are no longer active for labeled-unicast, deallocate MPLS labels");
2236 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 0;
2237 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2242 void peer_nsf_stop(struct peer
*peer
)
2247 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
);
2248 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_MODE
);
2250 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2251 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MPLS_VPN
; safi
++)
2252 peer
->nsf
[afi
][safi
] = 0;
2254 if (peer
->t_gr_restart
) {
2255 BGP_TIMER_OFF(peer
->t_gr_restart
);
2256 if (bgp_debug_neighbor_events(peer
))
2257 zlog_debug("%s graceful restart timer stopped",
2260 if (peer
->t_gr_stale
) {
2261 BGP_TIMER_OFF(peer
->t_gr_stale
);
2262 if (bgp_debug_neighbor_events(peer
))
2264 "%s graceful restart stalepath timer stopped",
2267 bgp_clear_route_all(peer
);
2270 /* Delete peer from confguration.
2272 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
2273 * it to "cool off" and refcounts to hit 0, at which state it is freed.
2275 * This function /should/ take care to be idempotent, to guard against
2276 * it being called multiple times through stray events that come in
2277 * that happen to result in this function being called again. That
2278 * said, getting here for a "Deleted" peer is a bug in the neighbour
2281 int peer_delete(struct peer
*peer
)
2287 struct bgp_filter
*filter
;
2288 struct listnode
*pn
;
2291 assert(peer
->status
!= Deleted
);
2294 accept_peer
= CHECK_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2296 bgp_keepalives_off(peer
);
2297 bgp_reads_off(peer
);
2298 bgp_writes_off(peer
);
2299 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_WRITES_ON
));
2300 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_READS_ON
));
2301 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_KEEPALIVES_ON
));
2303 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2304 peer_nsf_stop(peer
);
2306 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2308 bgp_bfd_deregister_peer(peer
);
2310 /* If this peer belongs to peer group, clear up the
2313 if (peer_dynamic_neighbor(peer
))
2314 peer_drop_dynamic_neighbor(peer
);
2316 if ((pn
= listnode_lookup(peer
->group
->peer
, peer
))) {
2318 peer
); /* group->peer list reference */
2319 list_delete_node(peer
->group
->peer
, pn
);
2324 /* Withdraw all information from routing table. We can not use
2325 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
2326 * executed after peer structure is deleted.
2328 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2330 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2332 if (peer
->doppelganger
) {
2333 peer
->doppelganger
->doppelganger
= NULL
;
2334 peer
->doppelganger
= NULL
;
2337 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2338 bgp_fsm_change_status(peer
, Deleted
);
2340 /* Remove from NHT */
2341 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
2342 bgp_unlink_nexthop_by_peer(peer
);
2344 /* Password configuration */
2345 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)) {
2346 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
2347 if (!accept_peer
&& !BGP_PEER_SU_UNSPEC(peer
)
2348 && !CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
2349 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
))
2350 bgp_md5_unset(peer
);
2353 bgp_timer_set(peer
); /* stops all timers for Deleted */
2355 /* Delete from all peer list. */
2356 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
2357 && (pn
= listnode_lookup(bgp
->peer
, peer
))) {
2358 peer_unlock(peer
); /* bgp peer list reference */
2359 list_delete_node(bgp
->peer
, pn
);
2360 hash_release(bgp
->peerhash
, peer
);
2365 stream_fifo_free(peer
->ibuf
);
2370 stream_fifo_free(peer
->obuf
);
2374 if (peer
->ibuf_work
) {
2375 ringbuf_del(peer
->ibuf_work
);
2376 peer
->ibuf_work
= NULL
;
2379 if (peer
->obuf_work
) {
2380 stream_free(peer
->obuf_work
);
2381 peer
->obuf_work
= NULL
;
2384 if (peer
->scratch
) {
2385 stream_free(peer
->scratch
);
2386 peer
->scratch
= NULL
;
2389 /* Local and remote addresses. */
2390 if (peer
->su_local
) {
2391 sockunion_free(peer
->su_local
);
2392 peer
->su_local
= NULL
;
2395 if (peer
->su_remote
) {
2396 sockunion_free(peer
->su_remote
);
2397 peer
->su_remote
= NULL
;
2400 /* Free filter related memory. */
2401 FOREACH_AFI_SAFI (afi
, safi
) {
2402 filter
= &peer
->filter
[afi
][safi
];
2404 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++) {
2405 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
2406 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
2407 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
2410 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++) {
2411 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
2414 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
2415 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
2418 FOREACH_AFI_SAFI (afi
, safi
)
2419 peer_af_delete(peer
, afi
, safi
);
2421 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
2422 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
2424 peer_unlock(peer
); /* initial reference */
2429 static int peer_group_cmp(struct peer_group
*g1
, struct peer_group
*g2
)
2431 return strcmp(g1
->name
, g2
->name
);
2434 /* Peer group cofiguration. */
2435 static struct peer_group
*peer_group_new(void)
2437 return XCALLOC(MTYPE_PEER_GROUP
, sizeof(struct peer_group
));
2440 static void peer_group_free(struct peer_group
*group
)
2442 XFREE(MTYPE_PEER_GROUP
, group
);
2445 struct peer_group
*peer_group_lookup(struct bgp
*bgp
, const char *name
)
2447 struct peer_group
*group
;
2448 struct listnode
*node
, *nnode
;
2450 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2451 if (strcmp(group
->name
, name
) == 0)
2457 struct peer_group
*peer_group_get(struct bgp
*bgp
, const char *name
)
2459 struct peer_group
*group
;
2462 group
= peer_group_lookup(bgp
, name
);
2466 group
= peer_group_new();
2468 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2469 group
->name
= XSTRDUP(MTYPE_PEER_GROUP_HOST
, name
);
2470 group
->peer
= list_new();
2471 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2472 group
->listen_range
[afi
] = list_new();
2473 group
->conf
= peer_new(bgp
);
2474 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_DEFAULT_IPV4
))
2475 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
2476 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
2477 group
->conf
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, name
);
2478 group
->conf
->group
= group
;
2479 group
->conf
->as
= 0;
2480 group
->conf
->ttl
= BGP_DEFAULT_TTL
;
2481 group
->conf
->gtsm_hops
= BGP_GTSM_HOPS_DISABLED
;
2482 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2483 SET_FLAG(group
->conf
->sflags
, PEER_STATUS_GROUP
);
2484 listnode_add_sort(bgp
->group
, group
);
2489 static void peer_group2peer_config_copy(struct peer_group
*group
,
2499 peer
->as
= conf
->as
;
2502 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_LOCAL_AS
))
2503 peer
->change_local_as
= conf
->change_local_as
;
2505 /* If peer-group has configured TTL then override it */
2506 if (conf
->ttl
!= BGP_DEFAULT_TTL
)
2507 peer
->ttl
= conf
->ttl
;
2510 peer
->gtsm_hops
= conf
->gtsm_hops
;
2512 /* peer flags apply */
2513 flags_tmp
= conf
->flags
& ~peer
->flags_override
;
2514 flags_tmp
^= conf
->flags_invert
^ peer
->flags_invert
;
2515 flags_tmp
&= ~peer
->flags_override
;
2517 UNSET_FLAG(peer
->flags
, ~peer
->flags_override
);
2518 SET_FLAG(peer
->flags
, flags_tmp
);
2519 SET_FLAG(peer
->flags_invert
, conf
->flags_invert
);
2521 /* peer timers apply */
2522 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER
)) {
2523 PEER_ATTR_INHERIT(peer
, group
, holdtime
);
2524 PEER_ATTR_INHERIT(peer
, group
, keepalive
);
2527 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER_CONNECT
)) {
2528 PEER_ATTR_INHERIT(peer
, group
, connect
);
2529 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_TIMER_CONNECT
))
2530 peer
->v_connect
= conf
->connect
;
2532 peer
->v_connect
= peer
->bgp
->default_connect_retry
;
2535 /* advertisement-interval apply */
2536 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_ROUTEADV
)) {
2537 PEER_ATTR_INHERIT(peer
, group
, routeadv
);
2538 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_ROUTEADV
))
2539 peer
->v_routeadv
= conf
->routeadv
;
2541 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
2542 ? BGP_DEFAULT_IBGP_ROUTEADV
2543 : BGP_DEFAULT_EBGP_ROUTEADV
;
2546 /* capability extended-nexthop apply */
2547 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
))
2548 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2549 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
2551 /* password apply */
2552 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_PASSWORD
))
2553 PEER_STR_ATTR_INHERIT(peer
, group
, password
,
2554 MTYPE_PEER_PASSWORD
);
2556 if (!BGP_PEER_SU_UNSPEC(peer
))
2559 /* update-source apply */
2560 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_UPDATE_SOURCE
)) {
2561 if (conf
->update_source
) {
2562 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2563 PEER_SU_ATTR_INHERIT(peer
, group
, update_source
);
2564 } else if (conf
->update_if
) {
2565 sockunion_free(peer
->update_source
);
2566 PEER_STR_ATTR_INHERIT(peer
, group
, update_if
,
2567 MTYPE_PEER_UPDATE_SOURCE
);
2571 /* Update GR flags for the peer. */
2572 bgp_peer_gr_flags_update(peer
);
2574 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2577 /* Peer group's remote AS configuration. */
2578 int peer_group_remote_as(struct bgp
*bgp
, const char *group_name
, as_t
*as
,
2581 struct peer_group
*group
;
2583 struct listnode
*node
, *nnode
;
2585 group
= peer_group_lookup(bgp
, group_name
);
2589 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2593 /* When we setup peer-group AS number all peer group member's AS
2594 number must be updated to same number. */
2595 peer_as_change(group
->conf
, *as
, as_type
);
2597 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2598 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
2599 || (peer
->as_type
!= as_type
))
2600 peer_as_change(peer
, *as
, as_type
);
2606 void peer_notify_unconfig(struct peer
*peer
)
2608 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2609 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2610 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2613 void peer_group_notify_unconfig(struct peer_group
*group
)
2615 struct peer
*peer
, *other
;
2616 struct listnode
*node
, *nnode
;
2618 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2619 other
= peer
->doppelganger
;
2620 if (other
&& other
->status
!= Deleted
) {
2621 other
->group
= NULL
;
2622 peer_notify_unconfig(other
);
2624 peer_notify_unconfig(peer
);
2628 int peer_group_delete(struct peer_group
*group
)
2632 struct prefix
*prefix
;
2634 struct listnode
*node
, *nnode
;
2639 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2640 other
= peer
->doppelganger
;
2642 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2643 bgp_zebra_terminate_radv(bgp
, peer
);
2646 if (other
&& other
->status
!= Deleted
) {
2647 other
->group
= NULL
;
2651 list_delete(&group
->peer
);
2653 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2654 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
2656 prefix_free(&prefix
);
2658 list_delete(&group
->listen_range
[afi
]);
2661 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2664 bfd_info_free(&(group
->conf
->bfd_info
));
2666 group
->conf
->group
= NULL
;
2667 peer_delete(group
->conf
);
2669 /* Delete from all peer_group list. */
2670 listnode_delete(bgp
->group
, group
);
2672 peer_group_free(group
);
2677 int peer_group_remote_as_delete(struct peer_group
*group
)
2679 struct peer
*peer
, *other
;
2680 struct listnode
*node
, *nnode
;
2682 if ((group
->conf
->as_type
== AS_UNSPECIFIED
)
2683 || ((!group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2686 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2687 other
= peer
->doppelganger
;
2689 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2690 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
2694 if (other
&& other
->status
!= Deleted
) {
2695 other
->group
= NULL
;
2699 list_delete_all_node(group
->peer
);
2701 group
->conf
->as
= 0;
2702 group
->conf
->as_type
= AS_UNSPECIFIED
;
2707 int peer_group_listen_range_add(struct peer_group
*group
, struct prefix
*range
)
2709 struct prefix
*prefix
;
2710 struct listnode
*node
, *nnode
;
2713 afi
= family2afi(range
->family
);
2715 /* Group needs remote AS configured. */
2716 if (group
->conf
->as_type
== AS_UNSPECIFIED
)
2717 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2719 /* Ensure no duplicates. Currently we don't care about overlaps. */
2720 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2721 if (prefix_same(range
, prefix
))
2725 prefix
= prefix_new();
2726 prefix_copy(prefix
, range
);
2727 listnode_add(group
->listen_range
[afi
], prefix
);
2729 /* Update passwords for new ranges */
2730 if (group
->conf
->password
)
2731 bgp_md5_set_prefix(group
->bgp
, prefix
, group
->conf
->password
);
2736 int peer_group_listen_range_del(struct peer_group
*group
, struct prefix
*range
)
2738 struct prefix
*prefix
, prefix2
;
2739 struct listnode
*node
, *nnode
;
2743 afi
= family2afi(range
->family
);
2745 /* Identify the listen range. */
2746 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2747 if (prefix_same(range
, prefix
))
2752 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2754 /* Dispose off any dynamic neighbors that exist due to this listen range
2756 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2757 if (!peer_dynamic_neighbor(peer
))
2760 sockunion2hostprefix(&peer
->su
, &prefix2
);
2761 if (prefix_match(prefix
, &prefix2
)) {
2762 if (bgp_debug_neighbor_events(peer
))
2764 "Deleting dynamic neighbor %s group %s upon delete of listen range %pFX",
2765 peer
->host
, group
->name
, prefix
);
2770 /* Get rid of the listen range */
2771 listnode_delete(group
->listen_range
[afi
], prefix
);
2773 /* Remove passwords for deleted ranges */
2774 if (group
->conf
->password
)
2775 bgp_md5_unset_prefix(group
->bgp
, prefix
);
2780 /* Bind specified peer to peer group. */
2781 int peer_group_bind(struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2782 struct peer_group
*group
, as_t
*as
)
2784 int first_member
= 0;
2787 bgp_peer_sort_t ptype
, gtype
;
2789 /* Lookup the peer. */
2791 peer
= peer_lookup(bgp
, su
);
2793 /* The peer exist, bind it to the peer-group */
2795 /* When the peer already belongs to a peer-group, check the
2797 if (peer_group_active(peer
)) {
2799 /* The peer is already bound to the peer-group,
2802 if (strcmp(peer
->group
->name
, group
->name
) == 0)
2805 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2808 /* The peer has not specified a remote-as, inherit it from the
2810 if (peer
->as_type
== AS_UNSPECIFIED
) {
2811 peer
->as_type
= group
->conf
->as_type
;
2812 peer
->as
= group
->conf
->as
;
2813 peer
->sort
= group
->conf
->sort
;
2816 ptype
= peer_sort(peer
);
2817 if (!group
->conf
->as
&& ptype
!= BGP_PEER_UNSPECIFIED
) {
2818 gtype
= peer_sort(group
->conf
);
2819 if ((gtype
!= BGP_PEER_INTERNAL
) && (gtype
!= ptype
)) {
2822 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2825 if (gtype
== BGP_PEER_INTERNAL
)
2829 peer_group2peer_config_copy(group
, peer
);
2831 FOREACH_AFI_SAFI (afi
, safi
) {
2832 if (group
->conf
->afc
[afi
][safi
]) {
2833 peer
->afc
[afi
][safi
] = 1;
2835 if (peer_af_find(peer
, afi
, safi
)
2836 || peer_af_create(peer
, afi
, safi
)) {
2837 peer_group2peer_config_copy_af(
2838 group
, peer
, afi
, safi
);
2840 } else if (peer
->afc
[afi
][safi
])
2841 peer_deactivate(peer
, afi
, safi
);
2845 assert(group
&& peer
->group
== group
);
2847 listnode_delete(bgp
->peer
, peer
);
2849 peer
->group
= group
;
2850 listnode_add_sort(bgp
->peer
, peer
);
2852 peer
= peer_lock(peer
); /* group->peer list reference */
2853 listnode_add(group
->peer
, peer
);
2857 gtype
= peer_sort(group
->conf
);
2858 /* Advertisement-interval reset */
2859 if (!CHECK_FLAG(group
->conf
->flags
,
2860 PEER_FLAG_ROUTEADV
)) {
2861 group
->conf
->v_routeadv
=
2862 (gtype
== BGP_PEER_IBGP
)
2863 ? BGP_DEFAULT_IBGP_ROUTEADV
2864 : BGP_DEFAULT_EBGP_ROUTEADV
;
2867 /* ebgp-multihop reset */
2868 if (gtype
== BGP_PEER_IBGP
)
2869 group
->conf
->ttl
= MAXTTL
;
2871 /* local-as reset */
2872 if (gtype
!= BGP_PEER_EBGP
) {
2873 group
->conf
->change_local_as
= 0;
2874 peer_flag_unset(group
->conf
,
2875 PEER_FLAG_LOCAL_AS
);
2876 peer_flag_unset(group
->conf
,
2877 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2878 peer_flag_unset(group
->conf
,
2879 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2883 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2885 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2886 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2887 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2888 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2890 bgp_session_reset(peer
);
2894 /* Create a new peer. */
2896 if ((group
->conf
->as_type
== AS_SPECIFIED
)
2897 && (!group
->conf
->as
)) {
2898 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2901 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
2902 group
->conf
->as_type
, 0, 0, group
);
2904 peer
= peer_lock(peer
); /* group->peer list reference */
2905 listnode_add(group
->peer
, peer
);
2907 peer_group2peer_config_copy(group
, peer
);
2909 /* If the peer-group is active for this afi/safi then activate
2911 FOREACH_AFI_SAFI (afi
, safi
) {
2912 if (group
->conf
->afc
[afi
][safi
]) {
2913 peer
->afc
[afi
][safi
] = 1;
2914 peer_af_create(peer
, afi
, safi
);
2915 peer_group2peer_config_copy_af(group
, peer
, afi
,
2917 } else if (peer
->afc
[afi
][safi
])
2918 peer_deactivate(peer
, afi
, safi
);
2921 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2923 /* Set up peer's events and timers. */
2924 if (peer_active(peer
))
2925 bgp_timer_set(peer
);
2931 static int bgp_startup_timer_expire(struct thread
*thread
)
2935 bgp
= THREAD_ARG(thread
);
2936 bgp
->t_startup
= NULL
;
2942 * On shutdown we call the cleanup function which
2943 * does a free of the link list nodes, free up
2944 * the data we are pointing at too.
2946 static void bgp_vrf_string_name_delete(void *data
)
2950 XFREE(MTYPE_TMP
, vname
);
2953 /* BGP instance creation by `router bgp' commands. */
2954 static struct bgp
*bgp_create(as_t
*as
, const char *name
,
2955 enum bgp_instance_type inst_type
)
2961 if ((bgp
= XCALLOC(MTYPE_BGP
, sizeof(struct bgp
))) == NULL
)
2964 if (BGP_DEBUG(zebra
, ZEBRA
)) {
2965 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
2966 zlog_debug("Creating Default VRF, AS %u", *as
);
2968 zlog_debug("Creating %s %s, AS %u",
2969 (inst_type
== BGP_INSTANCE_TYPE_VRF
)
2975 /* Default the EVPN VRF to the default one */
2976 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
&& !bgp_master
.bgp_evpn
) {
2983 bgp_process_queue_init(bgp
);
2984 bgp
->heuristic_coalesce
= true;
2985 bgp
->inst_type
= inst_type
;
2986 bgp
->vrf_id
= (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) ? VRF_DEFAULT
2988 bgp
->peer_self
= peer_new(bgp
);
2989 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
2990 bgp
->peer_self
->host
=
2991 XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
2992 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->hostname
);
2993 if (cmd_hostname_get())
2994 bgp
->peer_self
->hostname
=
2995 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_hostname_get());
2997 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->domainname
);
2998 if (cmd_domainname_get())
2999 bgp
->peer_self
->domainname
=
3000 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_domainname_get());
3001 bgp
->peer
= list_new();
3002 bgp
->peer
->cmp
= (int (*)(void *, void *))peer_cmp
;
3003 bgp
->peerhash
= hash_create(peer_hash_key_make
, peer_hash_same
,
3005 bgp
->peerhash
->max_size
= BGP_PEER_MAX_HASH_SIZE
;
3007 bgp
->group
= list_new();
3008 bgp
->group
->cmp
= (int (*)(void *, void *))peer_group_cmp
;
3010 FOREACH_AFI_SAFI (afi
, safi
) {
3011 bgp
->route
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3012 bgp
->aggregate
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3013 bgp
->rib
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3015 /* Enable maximum-paths */
3016 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_EBGP
,
3018 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_IBGP
,
3020 /* Initialize graceful restart info */
3021 bgp
->gr_info
[afi
][safi
].eor_required
= 0;
3022 bgp
->gr_info
[afi
][safi
].eor_received
= 0;
3023 bgp
->gr_info
[afi
][safi
].t_select_deferral
= NULL
;
3024 bgp
->gr_info
[afi
][safi
].t_route_select
= NULL
;
3025 bgp
->gr_info
[afi
][safi
].route_list
= list_new();
3028 bgp
->v_update_delay
= bm
->v_update_delay
;
3029 bgp
->v_establish_wait
= bm
->v_establish_wait
;
3030 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
3031 bgp
->default_subgroup_pkt_queue_max
=
3032 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
3033 bgp_timers_unset(bgp
);
3034 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
3035 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
3036 bgp
->select_defer_time
= BGP_DEFAULT_SELECT_DEFERRAL_TIME
;
3037 bgp
->rib_stale_time
= BGP_DEFAULT_RIB_STALE_TIME
;
3038 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
3039 bgp
->dynamic_neighbors_count
= 0;
3040 bgp
->lb_ref_bw
= BGP_LINK_BW_REF_BW
;
3041 bgp
->lb_handling
= BGP_LINK_BW_ECMP
;
3042 bgp
->reject_as_sets
= false;
3043 bgp_addpath_init_bgp_data(&bgp
->tx_addpath
);
3047 #ifdef ENABLE_BGP_VNC
3048 if (inst_type
!= BGP_INSTANCE_TYPE_VRF
) {
3049 bgp
->rfapi
= bgp_rfapi_new(bgp
);
3051 assert(bgp
->rfapi_cfg
);
3053 #endif /* ENABLE_BGP_VNC */
3055 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3056 bgp
->vpn_policy
[afi
].bgp
= bgp
;
3057 bgp
->vpn_policy
[afi
].afi
= afi
;
3058 bgp
->vpn_policy
[afi
].tovpn_label
= MPLS_LABEL_NONE
;
3059 bgp
->vpn_policy
[afi
].tovpn_zebra_vrf_label_last_sent
=
3062 bgp
->vpn_policy
[afi
].import_vrf
= list_new();
3063 bgp
->vpn_policy
[afi
].import_vrf
->del
=
3064 bgp_vrf_string_name_delete
;
3065 bgp
->vpn_policy
[afi
].export_vrf
= list_new();
3066 bgp
->vpn_policy
[afi
].export_vrf
->del
=
3067 bgp_vrf_string_name_delete
;
3070 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
3072 thread_add_timer(bm
->master
, bgp_startup_timer_expire
, bgp
,
3073 bgp
->restart_time
, &bgp
->t_startup
);
3075 /* printable name we can use in debug messages */
3076 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
3077 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
3087 len
= 4 + 1 + strlen(n
) + 1; /* "view foo\0" */
3089 bgp
->name_pretty
= XCALLOC(MTYPE_BGP
, len
);
3090 snprintf(bgp
->name_pretty
, len
, "%s %s",
3091 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3097 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
3098 memory_order_relaxed
);
3099 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
3100 memory_order_relaxed
);
3101 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
3105 update_bgp_group_init(bgp
);
3107 /* assign a unique rd id for auto derivation of vrf's RD */
3108 bf_assign_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3110 bgp
->evpn_info
= XCALLOC(MTYPE_BGP_EVPN_INFO
,
3111 sizeof(struct bgp_evpn_info
));
3116 /*initilize global GR FSM */
3117 bgp_global_gr_init(bgp
);
3121 /* Return the "default VRF" instance of BGP. */
3122 struct bgp
*bgp_get_default(void)
3125 struct listnode
*node
, *nnode
;
3127 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3128 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3133 /* Lookup BGP entry. */
3134 struct bgp
*bgp_lookup(as_t as
, const char *name
)
3137 struct listnode
*node
, *nnode
;
3139 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3141 && ((bgp
->name
== NULL
&& name
== NULL
)
3142 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0)))
3147 /* Lookup BGP structure by view name. */
3148 struct bgp
*bgp_lookup_by_name(const char *name
)
3151 struct listnode
*node
, *nnode
;
3153 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3154 if ((bgp
->name
== NULL
&& name
== NULL
)
3155 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0))
3160 /* Lookup BGP instance based on VRF id. */
3161 /* Note: Only to be used for incoming messages from Zebra. */
3162 struct bgp
*bgp_lookup_by_vrf_id(vrf_id_t vrf_id
)
3166 /* Lookup VRF (in tree) and follow link. */
3167 vrf
= vrf_lookup_by_id(vrf_id
);
3170 return (vrf
->info
) ? (struct bgp
*)vrf
->info
: NULL
;
3173 /* Sets the BGP instance where EVPN is enabled */
3174 void bgp_set_evpn(struct bgp
*bgp
)
3176 if (bm
->bgp_evpn
== bgp
)
3179 /* First, release the reference count we hold on the instance */
3181 bgp_unlock(bm
->bgp_evpn
);
3185 /* Increase the reference count on this new VRF */
3187 bgp_lock(bm
->bgp_evpn
);
3190 /* Returns the BGP instance where EVPN is enabled, if any */
3191 struct bgp
*bgp_get_evpn(void)
3193 return bm
->bgp_evpn
;
3196 /* handle socket creation or deletion, if necessary
3197 * this is called for all new BGP instances
3199 int bgp_handle_socket(struct bgp
*bgp
, struct vrf
*vrf
, vrf_id_t old_vrf_id
,
3204 /* Create BGP server socket, if listen mode not disabled */
3205 if (!bgp
|| bgp_option_check(BGP_OPT_NO_LISTEN
))
3207 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3209 * suppress vrf socket
3212 bgp_close_vrf_socket(bgp
);
3216 return BGP_ERR_INVALID_VALUE
;
3218 * if vrf_id did not change
3220 if (vrf
->vrf_id
== old_vrf_id
)
3222 if (old_vrf_id
!= VRF_UNKNOWN
) {
3223 /* look for old socket. close it. */
3224 bgp_close_vrf_socket(bgp
);
3226 /* if backend is not yet identified ( VRF_UNKNOWN) then
3227 * creation will be done later
3229 if (vrf
->vrf_id
== VRF_UNKNOWN
)
3231 ret
= bgp_socket(bgp
, bm
->port
, bm
->address
);
3233 return BGP_ERR_INVALID_VALUE
;
3236 return bgp_check_main_socket(create
, bgp
);
3239 int bgp_lookup_by_as_name_type(struct bgp
**bgp_val
, as_t
*as
, const char *name
,
3240 enum bgp_instance_type inst_type
)
3244 /* Multiple instance check. */
3246 bgp
= bgp_lookup_by_name(name
);
3248 bgp
= bgp_get_default();
3251 if (bgp
->as
!= *as
) {
3253 return BGP_ERR_INSTANCE_MISMATCH
;
3255 if (bgp
->inst_type
!= inst_type
)
3256 return BGP_ERR_INSTANCE_MISMATCH
;
3265 /* Called from VTY commands. */
3266 int bgp_get(struct bgp
**bgp_val
, as_t
*as
, const char *name
,
3267 enum bgp_instance_type inst_type
)
3270 struct vrf
*vrf
= NULL
;
3273 ret
= bgp_lookup_by_as_name_type(bgp_val
, as
, name
, inst_type
);
3275 case BGP_ERR_INSTANCE_MISMATCH
:
3282 bgp
= bgp_create(as
, name
, inst_type
);
3283 if (bgp_option_check(BGP_OPT_NO_ZEBRA
) && name
)
3284 bgp
->vrf_id
= vrf_generate_id();
3285 bgp_router_id_set(bgp
, &bgp
->router_id_zebra
, true);
3286 bgp_address_init(bgp
);
3287 bgp_tip_hash_init(bgp
);
3291 bgp
->t_rmap_def_originate_eval
= NULL
;
3293 /* If Default instance or VRF, link to the VRF structure, if present. */
3294 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
3295 || bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3296 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3298 bgp_vrf_link(bgp
, vrf
);
3300 /* BGP server socket already processed if BGP instance
3301 * already part of the list
3303 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, true);
3304 listnode_add(bm
->bgp
, bgp
);
3306 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
)) {
3307 if (BGP_DEBUG(zebra
, ZEBRA
))
3308 zlog_debug("%s: Registering BGP instance %s to zebra",
3310 bgp_zebra_instance_register(bgp
);
3317 * Make BGP instance "up". Applies only to VRFs (non-default) and
3318 * implies the VRF has been learnt from Zebra.
3320 void bgp_instance_up(struct bgp
*bgp
)
3323 struct listnode
*node
, *next
;
3325 /* Register with zebra. */
3326 bgp_zebra_instance_register(bgp
);
3328 /* Kick off any peers that may have been configured. */
3329 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3330 if (!BGP_PEER_START_SUPPRESSED(peer
))
3331 BGP_EVENT_ADD(peer
, BGP_Start
);
3334 /* Process any networks that have been configured. */
3335 bgp_static_add(bgp
);
3339 * Make BGP instance "down". Applies only to VRFs (non-default) and
3340 * implies the VRF has been deleted by Zebra.
3342 void bgp_instance_down(struct bgp
*bgp
)
3345 struct listnode
*node
;
3346 struct listnode
*next
;
3349 if (bgp
->t_rmap_def_originate_eval
) {
3350 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
3351 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3355 /* Bring down peers, so corresponding routes are purged. */
3356 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3357 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3358 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3359 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3361 bgp_session_reset(peer
);
3364 /* Purge network and redistributed routes. */
3365 bgp_purge_static_redist_routes(bgp
);
3367 /* Cleanup registered nexthops (flags) */
3368 bgp_cleanup_nexthops(bgp
);
3371 /* Delete BGP instance. */
3372 int bgp_delete(struct bgp
*bgp
)
3375 struct peer_group
*group
;
3376 struct listnode
*node
, *next
;
3381 struct graceful_restart_info
*gr_info
;
3385 hook_call(bgp_inst_delete
, bgp
);
3387 THREAD_OFF(bgp
->t_startup
);
3388 THREAD_OFF(bgp
->t_maxmed_onstartup
);
3389 THREAD_OFF(bgp
->t_update_delay
);
3390 THREAD_OFF(bgp
->t_establish_wait
);
3392 /* Set flag indicating bgp instance delete in progress */
3393 SET_FLAG(bgp
->flags
, BGP_FLAG_DELETE_IN_PROGRESS
);
3395 /* Delete the graceful restart info */
3396 FOREACH_AFI_SAFI (afi
, safi
) {
3397 gr_info
= &bgp
->gr_info
[afi
][safi
];
3401 BGP_TIMER_OFF(gr_info
->t_select_deferral
);
3402 BGP_TIMER_OFF(gr_info
->t_route_select
);
3403 if (gr_info
->route_list
)
3404 list_delete(&gr_info
->route_list
);
3407 if (BGP_DEBUG(zebra
, ZEBRA
)) {
3408 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3409 zlog_debug("Deleting Default VRF");
3411 zlog_debug("Deleting %s %s",
3412 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3418 /* unmap from RT list */
3419 bgp_evpn_vrf_delete(bgp
);
3421 /* unmap bgp vrf label */
3422 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
3423 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
3426 if (bgp
->t_rmap_def_originate_eval
) {
3427 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
3428 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3432 /* Inform peers we're going down. */
3433 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3434 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3435 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3436 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3439 /* Delete static routes (networks). */
3440 bgp_static_delete(bgp
);
3442 /* Unset redistribution. */
3443 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3444 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
3445 if (i
!= ZEBRA_ROUTE_BGP
)
3446 bgp_redistribute_unset(bgp
, afi
, i
, 0);
3448 /* Free peers and peer-groups. */
3449 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, next
, group
))
3450 peer_group_delete(group
);
3452 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
))
3455 if (bgp
->peer_self
) {
3456 peer_delete(bgp
->peer_self
);
3457 bgp
->peer_self
= NULL
;
3460 update_bgp_group_free(bgp
);
3462 /* TODO - Other memory may need to be freed - e.g., NHT */
3464 #ifdef ENABLE_BGP_VNC
3467 bgp_cleanup_routes(bgp
);
3469 for (afi
= 0; afi
< AFI_MAX
; ++afi
) {
3470 if (!bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
3473 &bgp
->vpn_policy
[afi
]
3474 .import_redirect_rtlist
);
3475 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
3478 /* Deregister from Zebra, if needed */
3479 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
)) {
3480 if (BGP_DEBUG(zebra
, ZEBRA
))
3482 "%s: deregistering this bgp %s instance from zebra",
3483 __func__
, bgp
->name
);
3484 bgp_zebra_instance_deregister(bgp
);
3487 /* Remove visibility via the master list - there may however still be
3488 * routes to be processed still referencing the struct bgp.
3490 listnode_delete(bm
->bgp
, bgp
);
3492 /* Free interfaces in this instance. */
3495 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3496 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
3498 bgp_vrf_unlink(bgp
, vrf
);
3500 /* Update EVPN VRF pointer */
3501 if (bm
->bgp_evpn
== bgp
) {
3502 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3505 bgp_set_evpn(bgp_get_default());
3508 if (bgp
->process_queue
)
3509 work_queue_free_and_null(&bgp
->process_queue
);
3511 thread_master_free_unused(bm
->master
);
3512 bgp_unlock(bgp
); /* initial reference */
3517 void bgp_free(struct bgp
*bgp
)
3521 struct bgp_table
*table
;
3522 struct bgp_dest
*dest
;
3523 struct bgp_rmap
*rmap
;
3527 list_delete(&bgp
->group
);
3528 list_delete(&bgp
->peer
);
3530 if (bgp
->peerhash
) {
3531 hash_free(bgp
->peerhash
);
3532 bgp
->peerhash
= NULL
;
3535 FOREACH_AFI_SAFI (afi
, safi
) {
3536 /* Special handling for 2-level routing tables. */
3537 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
3538 || safi
== SAFI_EVPN
) {
3539 for (dest
= bgp_table_top(bgp
->rib
[afi
][safi
]); dest
;
3540 dest
= bgp_route_next(dest
)) {
3541 table
= bgp_dest_get_bgp_table_info(dest
);
3542 bgp_table_finish(&table
);
3545 if (bgp
->route
[afi
][safi
])
3546 bgp_table_finish(&bgp
->route
[afi
][safi
]);
3547 if (bgp
->aggregate
[afi
][safi
])
3548 bgp_table_finish(&bgp
->aggregate
[afi
][safi
]);
3549 if (bgp
->rib
[afi
][safi
])
3550 bgp_table_finish(&bgp
->rib
[afi
][safi
]);
3551 rmap
= &bgp
->table_map
[afi
][safi
];
3552 XFREE(MTYPE_ROUTE_MAP_NAME
, rmap
->name
);
3555 bgp_scan_finish(bgp
);
3556 bgp_address_destroy(bgp
);
3557 bgp_tip_hash_destroy(bgp
);
3559 /* release the auto RD id */
3560 bf_release_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3562 bgp_evpn_cleanup(bgp
);
3563 bgp_pbr_cleanup(bgp
);
3564 XFREE(MTYPE_BGP_EVPN_INFO
, bgp
->evpn_info
);
3566 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3567 vpn_policy_direction_t dir
;
3569 if (bgp
->vpn_policy
[afi
].import_vrf
)
3570 list_delete(&bgp
->vpn_policy
[afi
].import_vrf
);
3571 if (bgp
->vpn_policy
[afi
].export_vrf
)
3572 list_delete(&bgp
->vpn_policy
[afi
].export_vrf
);
3574 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
3575 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3576 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3577 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
3578 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3579 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3582 XFREE(MTYPE_BGP
, bgp
->name
);
3583 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
3585 XFREE(MTYPE_BGP
, bgp
);
3588 struct peer
*peer_lookup_by_conf_if(struct bgp
*bgp
, const char *conf_if
)
3591 struct listnode
*node
, *nnode
;
3597 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3598 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
3599 && !CHECK_FLAG(peer
->sflags
,
3600 PEER_STATUS_ACCEPT_PEER
))
3602 } else if (bm
->bgp
!= NULL
) {
3603 struct listnode
*bgpnode
, *nbgpnode
;
3605 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3606 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3608 && !strcmp(peer
->conf_if
, conf_if
)
3609 && !CHECK_FLAG(peer
->sflags
,
3610 PEER_STATUS_ACCEPT_PEER
))
3616 struct peer
*peer_lookup_by_hostname(struct bgp
*bgp
, const char *hostname
)
3619 struct listnode
*node
, *nnode
;
3625 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3626 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
3627 && !CHECK_FLAG(peer
->sflags
,
3628 PEER_STATUS_ACCEPT_PEER
))
3630 } else if (bm
->bgp
!= NULL
) {
3631 struct listnode
*bgpnode
, *nbgpnode
;
3633 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3634 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3636 && !strcmp(peer
->hostname
, hostname
)
3637 && !CHECK_FLAG(peer
->sflags
,
3638 PEER_STATUS_ACCEPT_PEER
))
3644 struct peer
*peer_lookup(struct bgp
*bgp
, union sockunion
*su
)
3646 struct peer
*peer
= NULL
;
3647 struct peer tmp_peer
;
3649 memset(&tmp_peer
, 0, sizeof(struct peer
));
3652 * We do not want to find the doppelganger peer so search for the peer
3654 * the hash that has PEER_FLAG_CONFIG_NODE
3656 SET_FLAG(tmp_peer
.flags
, PEER_FLAG_CONFIG_NODE
);
3661 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3662 } else if (bm
->bgp
!= NULL
) {
3663 struct listnode
*bgpnode
, *nbgpnode
;
3665 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
)) {
3666 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3675 struct peer
*peer_create_bind_dynamic_neighbor(struct bgp
*bgp
,
3676 union sockunion
*su
,
3677 struct peer_group
*group
)
3683 /* Create peer first; we've already checked group config is valid. */
3684 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
3685 group
->conf
->as_type
, 0, 0, group
);
3690 peer
= peer_lock(peer
);
3691 listnode_add(group
->peer
, peer
);
3693 peer_group2peer_config_copy(group
, peer
);
3696 * Bind peer for all AFs configured for the group. We don't call
3697 * peer_group_bind as that is sub-optimal and does some stuff we don't
3700 FOREACH_AFI_SAFI (afi
, safi
) {
3701 if (!group
->conf
->afc
[afi
][safi
])
3703 peer
->afc
[afi
][safi
] = 1;
3705 if (!peer_af_find(peer
, afi
, safi
))
3706 peer_af_create(peer
, afi
, safi
);
3708 peer_group2peer_config_copy_af(group
, peer
, afi
, safi
);
3711 /* Mark as dynamic, but also as a "config node" for other things to
3713 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
3714 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3720 peer_group_lookup_dynamic_neighbor_range(struct peer_group
*group
,
3721 struct prefix
*prefix
)
3723 struct listnode
*node
, *nnode
;
3724 struct prefix
*range
;
3727 afi
= family2afi(prefix
->family
);
3729 if (group
->listen_range
[afi
])
3730 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
3732 if (prefix_match(range
, prefix
))
3739 peer_group_lookup_dynamic_neighbor(struct bgp
*bgp
, struct prefix
*prefix
,
3740 struct prefix
**listen_range
)
3742 struct prefix
*range
= NULL
;
3743 struct peer_group
*group
= NULL
;
3744 struct listnode
*node
, *nnode
;
3746 *listen_range
= NULL
;
3748 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3749 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3752 } else if (bm
->bgp
!= NULL
) {
3753 struct listnode
*bgpnode
, *nbgpnode
;
3755 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3756 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3757 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3763 *listen_range
= range
;
3764 return (group
&& range
) ? group
: NULL
;
3767 struct peer
*peer_lookup_dynamic_neighbor(struct bgp
*bgp
, union sockunion
*su
)
3769 struct peer_group
*group
;
3772 struct prefix prefix
;
3773 struct prefix
*listen_range
;
3775 char buf
[PREFIX2STR_BUFFER
];
3777 sockunion2hostprefix(su
, &prefix
);
3779 /* See if incoming connection matches a configured listen range. */
3780 group
= peer_group_lookup_dynamic_neighbor(bgp
, &prefix
, &listen_range
);
3791 prefix2str(&prefix
, buf
, sizeof(buf
));
3793 if (bgp_debug_neighbor_events(NULL
))
3795 "Dynamic Neighbor %s matches group %s listen range %pFX",
3796 buf
, group
->name
, listen_range
);
3798 /* Are we within the listen limit? */
3799 dncount
= gbgp
->dynamic_neighbors_count
;
3801 if (dncount
>= gbgp
->dynamic_neighbors_limit
) {
3802 if (bgp_debug_neighbor_events(NULL
))
3803 zlog_debug("Dynamic Neighbor %s rejected - at limit %d",
3804 inet_sutop(su
, buf
),
3805 gbgp
->dynamic_neighbors_limit
);
3809 /* Ensure group is not disabled. */
3810 if (CHECK_FLAG(group
->conf
->flags
, PEER_FLAG_SHUTDOWN
)) {
3811 if (bgp_debug_neighbor_events(NULL
))
3813 "Dynamic Neighbor %s rejected - group %s disabled",
3818 /* Check that at least one AF is activated for the group. */
3819 if (!peer_group_af_configured(group
)) {
3820 if (bgp_debug_neighbor_events(NULL
))
3822 "Dynamic Neighbor %s rejected - no AF activated for group %s",
3827 /* Create dynamic peer and bind to associated group. */
3828 peer
= peer_create_bind_dynamic_neighbor(gbgp
, su
, group
);
3831 gbgp
->dynamic_neighbors_count
= ++dncount
;
3833 if (bgp_debug_neighbor_events(peer
))
3834 zlog_debug("%s Dynamic Neighbor added, group %s count %d",
3835 peer
->host
, group
->name
, dncount
);
3840 static void peer_drop_dynamic_neighbor(struct peer
*peer
)
3843 if (peer
->group
->bgp
) {
3844 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3846 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3848 if (bgp_debug_neighbor_events(peer
))
3849 zlog_debug("%s dropped from group %s, count %d", peer
->host
,
3850 peer
->group
->name
, dncount
);
3853 /* If peer is configured at least one address family return 1. */
3854 bool peer_active(struct peer
*peer
)
3856 if (BGP_PEER_SU_UNSPEC(peer
))
3858 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
] || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3859 || peer
->afc
[AFI_IP
][SAFI_LABELED_UNICAST
]
3860 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
] || peer
->afc
[AFI_IP
][SAFI_ENCAP
]
3861 || peer
->afc
[AFI_IP
][SAFI_FLOWSPEC
]
3862 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3863 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
]
3864 || peer
->afc
[AFI_IP6
][SAFI_LABELED_UNICAST
]
3865 || peer
->afc
[AFI_IP6
][SAFI_MPLS_VPN
]
3866 || peer
->afc
[AFI_IP6
][SAFI_ENCAP
]
3867 || peer
->afc
[AFI_IP6
][SAFI_FLOWSPEC
]
3868 || peer
->afc
[AFI_L2VPN
][SAFI_EVPN
])
3873 /* If peer is negotiated at least one address family return 1. */
3874 bool peer_active_nego(struct peer
*peer
)
3876 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3877 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3878 || peer
->afc_nego
[AFI_IP
][SAFI_LABELED_UNICAST
]
3879 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3880 || peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
3881 || peer
->afc_nego
[AFI_IP
][SAFI_FLOWSPEC
]
3882 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3883 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
3884 || peer
->afc_nego
[AFI_IP6
][SAFI_LABELED_UNICAST
]
3885 || peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
3886 || peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
3887 || peer
->afc_nego
[AFI_IP6
][SAFI_FLOWSPEC
]
3888 || peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
])
3893 void peer_change_action(struct peer
*peer
, afi_t afi
, safi_t safi
,
3894 enum peer_change_type type
)
3896 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
3899 if (peer
->status
!= Established
)
3902 if (type
== peer_change_reset
) {
3903 /* If we're resetting session, we've to delete both peer struct
3905 if ((peer
->doppelganger
)
3906 && (peer
->doppelganger
->status
!= Deleted
)
3907 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3908 PEER_FLAG_CONFIG_NODE
)))
3909 peer_delete(peer
->doppelganger
);
3911 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3912 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3913 } else if (type
== peer_change_reset_in
) {
3914 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3915 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3916 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0);
3918 if ((peer
->doppelganger
)
3919 && (peer
->doppelganger
->status
!= Deleted
)
3920 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3921 PEER_FLAG_CONFIG_NODE
)))
3922 peer_delete(peer
->doppelganger
);
3924 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3925 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3927 } else if (type
== peer_change_reset_out
) {
3928 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3929 bgp_announce_route(peer
, afi
, safi
);
3933 struct peer_flag_action
{
3937 /* This flag can be set for peer-group member. */
3938 uint8_t not_for_member
;
3940 /* Action when the flag is changed. */
3941 enum peer_change_type type
;
3944 static const struct peer_flag_action peer_flag_action_list
[] = {
3945 {PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3946 {PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3947 {PEER_FLAG_RTT_SHUTDOWN
, 0, peer_change_none
},
3948 {PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3949 {PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3950 {PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3951 {PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3952 {PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3953 {PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3954 {PEER_FLAG_ENFORCE_FIRST_AS
, 0, peer_change_reset_in
},
3955 {PEER_FLAG_IFPEER_V6ONLY
, 0, peer_change_reset
},
3956 {PEER_FLAG_ROUTEADV
, 0, peer_change_none
},
3957 {PEER_FLAG_TIMER
, 0, peer_change_none
},
3958 {PEER_FLAG_TIMER_CONNECT
, 0, peer_change_none
},
3959 {PEER_FLAG_PASSWORD
, 0, peer_change_none
},
3960 {PEER_FLAG_LOCAL_AS
, 0, peer_change_none
},
3961 {PEER_FLAG_LOCAL_AS_NO_PREPEND
, 0, peer_change_none
},
3962 {PEER_FLAG_LOCAL_AS_REPLACE_AS
, 0, peer_change_none
},
3963 {PEER_FLAG_UPDATE_SOURCE
, 0, peer_change_none
},
3966 static const struct peer_flag_action peer_af_flag_action_list
[] = {
3967 {PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3968 {PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3969 {PEER_FLAG_SEND_LARGE_COMMUNITY
, 1, peer_change_reset_out
},
3970 {PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3971 {PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3972 {PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3973 {PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3974 {PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3975 {PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3976 {PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3977 {PEER_FLAG_DEFAULT_ORIGINATE
, 0, peer_change_none
},
3978 {PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3979 {PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3980 {PEER_FLAG_ALLOWAS_IN_ORIGIN
, 0, peer_change_reset_in
},
3981 {PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3982 {PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3983 {PEER_FLAG_MAX_PREFIX
, 0, peer_change_none
},
3984 {PEER_FLAG_MAX_PREFIX_WARNING
, 0, peer_change_none
},
3985 {PEER_FLAG_MAX_PREFIX_FORCE
, 0, peer_change_none
},
3986 {PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3987 {PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3988 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3989 {PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
, 1, peer_change_reset_out
},
3990 {PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3991 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
, 1, peer_change_reset_out
},
3992 {PEER_FLAG_WEIGHT
, 0, peer_change_reset_in
},
3995 /* Proper action set. */
3996 static int peer_flag_action_set(const struct peer_flag_action
*action_list
,
3997 int size
, struct peer_flag_action
*action
,
4004 const struct peer_flag_action
*match
= NULL
;
4006 /* Check peer's frag action. */
4007 for (i
= 0; i
< size
; i
++) {
4008 match
= &action_list
[i
];
4010 if (match
->flag
== 0)
4013 if (match
->flag
& flag
) {
4016 if (match
->type
== peer_change_reset_in
)
4018 if (match
->type
== peer_change_reset_out
)
4020 if (match
->type
== peer_change_reset
) {
4024 if (match
->not_for_member
)
4025 action
->not_for_member
= 1;
4029 /* Set peer clear type. */
4030 if (reset_in
&& reset_out
)
4031 action
->type
= peer_change_reset
;
4033 action
->type
= peer_change_reset_in
;
4035 action
->type
= peer_change_reset_out
;
4037 action
->type
= peer_change_none
;
4042 static void peer_flag_modify_action(struct peer
*peer
, uint32_t flag
)
4044 if (flag
== PEER_FLAG_SHUTDOWN
) {
4045 if (CHECK_FLAG(peer
->flags
, flag
)) {
4046 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
4047 peer_nsf_stop(peer
);
4049 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4051 if (peer
->t_pmax_restart
) {
4052 BGP_TIMER_OFF(peer
->t_pmax_restart
);
4053 if (bgp_debug_neighbor_events(peer
))
4055 "%s Maximum-prefix restart timer canceled",
4059 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4060 char *msg
= peer
->tx_shutdown_message
;
4063 if (!msg
&& peer_group_active(peer
))
4064 msg
= peer
->group
->conf
4065 ->tx_shutdown_message
;
4066 msglen
= msg
? strlen(msg
) : 0;
4071 uint8_t msgbuf
[129];
4074 memcpy(msgbuf
+ 1, msg
, msglen
);
4076 bgp_notify_send_with_data(
4077 peer
, BGP_NOTIFY_CEASE
,
4078 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
,
4079 msgbuf
, msglen
+ 1);
4082 peer
, BGP_NOTIFY_CEASE
,
4083 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
4085 bgp_session_reset(peer
);
4087 peer
->v_start
= BGP_INIT_START_TIMER
;
4088 BGP_EVENT_ADD(peer
, BGP_Stop
);
4090 } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4091 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
4092 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4093 else if (flag
== PEER_FLAG_PASSIVE
)
4094 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
4095 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
4096 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
4098 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4099 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4101 bgp_session_reset(peer
);
4104 /* Enable global administrative shutdown of all peers of BGP instance */
4105 void bgp_shutdown_enable(struct bgp
*bgp
, const char *msg
)
4108 struct listnode
*node
;
4110 /* do nothing if already shut down */
4111 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
))
4114 /* informational log message */
4115 zlog_info("Enabled administrative shutdown on BGP instance AS %u",
4118 /* iterate through peers of BGP instance */
4119 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
4120 /* continue, if peer is already in administrative shutdown. */
4121 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
4124 /* send a RFC 4486 notification message if necessary */
4125 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4127 bgp_notify_send_with_data(
4128 peer
, BGP_NOTIFY_CEASE
,
4129 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
,
4130 (uint8_t *)(msg
), strlen(msg
));
4133 peer
, BGP_NOTIFY_CEASE
,
4134 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
4137 /* reset start timer to initial value */
4138 peer
->v_start
= BGP_INIT_START_TIMER
;
4140 /* trigger a RFC 4271 ManualStop event */
4141 BGP_EVENT_ADD(peer
, BGP_Stop
);
4144 /* set the BGP instances shutdown flag */
4145 SET_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
);
4148 /* Disable global administrative shutdown of all peers of BGP instance */
4149 void bgp_shutdown_disable(struct bgp
*bgp
)
4151 /* do nothing if not shut down. */
4152 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
))
4155 /* informational log message */
4156 zlog_info("Disabled administrative shutdown on BGP instance AS %u",
4159 /* clear the BGP instances shutdown flag */
4160 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
);
4163 /* Change specified peer flag. */
4164 static int peer_flag_modify(struct peer
*peer
, uint32_t flag
, int set
)
4168 bool invert
, member_invert
;
4169 struct peer
*member
;
4170 struct listnode
*node
, *nnode
;
4171 struct peer_flag_action action
;
4173 memset(&action
, 0, sizeof(struct peer_flag_action
));
4174 size
= sizeof(peer_flag_action_list
) / sizeof(struct peer_flag_action
);
4176 invert
= CHECK_FLAG(peer
->flags_invert
, flag
);
4177 found
= peer_flag_action_set(peer_flag_action_list
, size
, &action
,
4180 /* Abort if no flag action exists. */
4182 return BGP_ERR_INVALID_FLAG
;
4184 /* Check for flag conflict: STRICT_CAP_MATCH && OVERRIDE_CAPABILITY */
4185 if (set
&& CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
4186 && CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4187 return BGP_ERR_PEER_FLAG_CONFLICT
;
4189 /* Handle flag updates where desired state matches current state. */
4190 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4191 if (set
&& CHECK_FLAG(peer
->flags
, flag
)) {
4192 COND_FLAG(peer
->flags_override
, flag
, !invert
);
4196 if (!set
&& !CHECK_FLAG(peer
->flags
, flag
)) {
4197 COND_FLAG(peer
->flags_override
, flag
, invert
);
4202 /* Inherit from peer-group or set/unset flags accordingly. */
4203 if (peer_group_active(peer
) && set
== invert
)
4204 peer_flag_inherit(peer
, flag
);
4206 COND_FLAG(peer
->flags
, flag
, set
);
4208 /* Check if handling a regular peer. */
4209 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4210 /* Update flag override state accordingly. */
4211 COND_FLAG(peer
->flags_override
, flag
, set
!= invert
);
4214 * For the extended next-hop encoding flag we need to turn RAs
4215 * on if flag is being set, but only turn RAs off if the flag
4216 * is being unset on this peer and if this peer is a member of a
4217 * peer-group, the peer-group also doesn't have the flag set.
4219 if (flag
== PEER_FLAG_CAPABILITY_ENHE
) {
4221 bgp_zebra_initiate_radv(peer
->bgp
, peer
);
4222 } else if (peer_group_active(peer
)) {
4223 if (!CHECK_FLAG(peer
->group
->conf
->flags
, flag
))
4224 bgp_zebra_terminate_radv(peer
->bgp
,
4227 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4230 /* Execute flag action on peer. */
4231 if (action
.type
== peer_change_reset
)
4232 peer_flag_modify_action(peer
, flag
);
4234 /* Skip peer-group mechanics for regular peers. */
4239 * Update peer-group members, unless they are explicitely overriding
4240 * peer-group configuration.
4242 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4243 /* Skip peers with overridden configuration. */
4244 if (CHECK_FLAG(member
->flags_override
, flag
))
4247 /* Check if only member without group is inverted. */
4249 CHECK_FLAG(member
->flags_invert
, flag
) && !invert
;
4251 /* Skip peers with equivalent configuration. */
4252 if (set
!= member_invert
&& CHECK_FLAG(member
->flags
, flag
))
4255 if (set
== member_invert
&& !CHECK_FLAG(member
->flags
, flag
))
4258 /* Update flag on peer-group member. */
4259 COND_FLAG(member
->flags
, flag
, set
!= member_invert
);
4261 if (flag
== PEER_FLAG_CAPABILITY_ENHE
)
4262 set
? bgp_zebra_initiate_radv(member
->bgp
, member
)
4263 : bgp_zebra_terminate_radv(member
->bgp
, member
);
4265 /* Execute flag action on peer-group member. */
4266 if (action
.type
== peer_change_reset
)
4267 peer_flag_modify_action(member
, flag
);
4273 int peer_flag_set(struct peer
*peer
, uint32_t flag
)
4275 return peer_flag_modify(peer
, flag
, 1);
4278 int peer_flag_unset(struct peer
*peer
, uint32_t flag
)
4280 return peer_flag_modify(peer
, flag
, 0);
4283 static int peer_af_flag_modify(struct peer
*peer
, afi_t afi
, safi_t safi
,
4284 uint32_t flag
, bool set
)
4288 bool invert
, member_invert
;
4289 struct peer
*member
;
4290 struct listnode
*node
, *nnode
;
4291 struct peer_flag_action action
;
4292 bgp_peer_sort_t ptype
;
4294 memset(&action
, 0, sizeof(struct peer_flag_action
));
4295 size
= sizeof(peer_af_flag_action_list
)
4296 / sizeof(struct peer_flag_action
);
4298 invert
= CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
);
4299 found
= peer_flag_action_set(peer_af_flag_action_list
, size
, &action
,
4302 /* Abort if flag action exists. */
4304 return BGP_ERR_INVALID_FLAG
;
4306 ptype
= peer_sort(peer
);
4307 /* Special check for reflector client. */
4308 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
&& ptype
!= BGP_PEER_IBGP
)
4309 return BGP_ERR_NOT_INTERNAL_PEER
;
4311 /* Special check for remove-private-AS. */
4312 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
&& ptype
== BGP_PEER_IBGP
)
4313 return BGP_ERR_REMOVE_PRIVATE_AS
;
4315 /* as-override is not allowed for IBGP peers */
4316 if (flag
& PEER_FLAG_AS_OVERRIDE
&& ptype
== BGP_PEER_IBGP
)
4317 return BGP_ERR_AS_OVERRIDE
;
4319 /* Handle flag updates where desired state matches current state. */
4320 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4321 if (set
&& CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4322 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4327 if (!set
&& !CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4328 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4335 * For EVPN we implicitly set the NEXTHOP_UNCHANGED flag,
4336 * if we are setting/unsetting flags which conflict with this flag
4337 * handle accordingly
4339 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
4343 * if we are setting NEXTHOP_SELF, we need to unset the
4344 * NEXTHOP_UNCHANGED flag
4346 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4347 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4348 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4349 PEER_FLAG_NEXTHOP_UNCHANGED
);
4353 * if we are unsetting NEXTHOP_SELF, we need to set the
4354 * NEXTHOP_UNCHANGED flag to reset the defaults for EVPN
4356 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4357 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4358 SET_FLAG(peer
->af_flags
[afi
][safi
],
4359 PEER_FLAG_NEXTHOP_UNCHANGED
);
4364 * If the peer is a route server client let's not
4365 * muck with the nexthop on the way out the door
4367 if (flag
& PEER_FLAG_RSERVER_CLIENT
) {
4369 SET_FLAG(peer
->af_flags
[afi
][safi
],
4370 PEER_FLAG_NEXTHOP_UNCHANGED
);
4372 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4373 PEER_FLAG_NEXTHOP_UNCHANGED
);
4376 /* Inherit from peer-group or set/unset flags accordingly. */
4377 if (peer_group_active(peer
) && set
== invert
)
4378 peer_af_flag_inherit(peer
, afi
, safi
, flag
);
4380 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, set
);
4382 /* Execute action when peer is established. */
4383 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
4384 && peer
->status
== Established
) {
4385 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4386 bgp_clear_adj_in(peer
, afi
, safi
);
4388 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4389 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
4390 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
4391 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
4392 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
4393 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4394 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
4395 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4397 peer_change_action(peer
, afi
, safi
, action
.type
);
4401 /* Check if handling a regular peer. */
4402 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4403 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4407 * Update peer-group members, unless they are explicitely
4408 * overriding peer-group configuration.
4410 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
,
4412 /* Skip peers with overridden configuration. */
4413 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4417 /* Check if only member without group is inverted. */
4419 CHECK_FLAG(member
->af_flags_invert
[afi
][safi
],
4423 /* Skip peers with equivalent configuration. */
4424 if (set
!= member_invert
4425 && CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4428 if (set
== member_invert
4429 && !CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4432 /* Update flag on peer-group member. */
4433 COND_FLAG(member
->af_flags
[afi
][safi
], flag
,
4434 set
!= member_invert
);
4436 /* Execute flag action on peer-group member. */
4437 if (member
->status
== Established
) {
4438 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4439 bgp_clear_adj_in(member
, afi
, safi
);
4441 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4442 member
->last_reset
=
4443 PEER_DOWN_RR_CLIENT_CHANGE
;
4445 == PEER_FLAG_RSERVER_CLIENT
)
4446 member
->last_reset
=
4447 PEER_DOWN_RS_CLIENT_CHANGE
;
4449 == PEER_FLAG_ORF_PREFIX_SM
)
4450 member
->last_reset
=
4451 PEER_DOWN_CAPABILITY_CHANGE
;
4453 == PEER_FLAG_ORF_PREFIX_RM
)
4454 member
->last_reset
=
4455 PEER_DOWN_CAPABILITY_CHANGE
;
4457 peer_change_action(member
, afi
, safi
,
4467 int peer_af_flag_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
4469 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 1);
4472 int peer_af_flag_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
4474 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 0);
4478 void peer_tx_shutdown_message_set(struct peer
*peer
, const char *msg
)
4480 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4481 peer
->tx_shutdown_message
=
4482 msg
? XSTRDUP(MTYPE_PEER_TX_SHUTDOWN_MSG
, msg
) : NULL
;
4485 void peer_tx_shutdown_message_unset(struct peer
*peer
)
4487 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4491 /* EBGP multihop configuration. */
4492 int peer_ebgp_multihop_set(struct peer
*peer
, int ttl
)
4494 struct peer_group
*group
;
4495 struct listnode
*node
, *nnode
;
4498 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
4501 /* see comment in peer_ttl_security_hops_set() */
4502 if (ttl
!= MAXTTL
) {
4503 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4504 group
= peer
->group
;
4505 if (group
->conf
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
)
4506 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4508 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
4510 if (peer1
->sort
== BGP_PEER_IBGP
)
4513 if (peer1
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
)
4514 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4517 if (peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
)
4518 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4524 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4525 if (peer
->sort
!= BGP_PEER_IBGP
) {
4526 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4527 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4528 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4530 bgp_session_reset(peer
);
4533 group
= peer
->group
;
4534 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4535 if (peer
->sort
== BGP_PEER_IBGP
)
4538 peer
->ttl
= group
->conf
->ttl
;
4540 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4541 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4542 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4544 bgp_session_reset(peer
);
4550 int peer_ebgp_multihop_unset(struct peer
*peer
)
4552 struct peer_group
*group
;
4553 struct listnode
*node
, *nnode
;
4555 if (peer
->sort
== BGP_PEER_IBGP
)
4558 if (peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
&& peer
->ttl
!= MAXTTL
)
4559 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4561 if (peer_group_active(peer
))
4562 peer
->ttl
= peer
->group
->conf
->ttl
;
4564 peer
->ttl
= BGP_DEFAULT_TTL
;
4566 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4567 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4568 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4569 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4571 bgp_session_reset(peer
);
4573 group
= peer
->group
;
4574 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4575 if (peer
->sort
== BGP_PEER_IBGP
)
4578 peer
->ttl
= BGP_DEFAULT_TTL
;
4580 if (peer
->fd
>= 0) {
4581 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4583 peer
, BGP_NOTIFY_CEASE
,
4584 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4586 bgp_session_reset(peer
);
4593 /* Neighbor description. */
4594 void peer_description_set(struct peer
*peer
, const char *desc
)
4596 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
4598 peer
->desc
= XSTRDUP(MTYPE_PEER_DESC
, desc
);
4601 void peer_description_unset(struct peer
*peer
)
4603 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
4606 /* Neighbor update-source. */
4607 int peer_update_source_if_set(struct peer
*peer
, const char *ifname
)
4609 struct peer
*member
;
4610 struct listnode
*node
, *nnode
;
4612 /* Set flag and configuration on peer. */
4613 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
4614 if (peer
->update_if
) {
4615 if (strcmp(peer
->update_if
, ifname
) == 0)
4617 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4619 peer
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
4620 sockunion_free(peer
->update_source
);
4621 peer
->update_source
= NULL
;
4623 /* Check if handling a regular peer. */
4624 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4625 /* Send notification or reset peer depending on state. */
4626 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4627 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4628 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4629 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4631 bgp_session_reset(peer
);
4633 /* Skip peer-group mechanics for regular peers. */
4638 * Set flag and configuration on all peer-group members, unless they are
4639 * explicitely overriding peer-group configuration.
4641 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4642 /* Skip peers with overridden configuration. */
4643 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4646 /* Skip peers with the same configuration. */
4647 if (member
->update_if
) {
4648 if (strcmp(member
->update_if
, ifname
) == 0)
4650 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4653 /* Set flag and configuration on peer-group member. */
4654 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4655 member
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
4656 sockunion_free(member
->update_source
);
4657 member
->update_source
= NULL
;
4659 /* Send notification or reset peer depending on state. */
4660 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4661 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4662 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4663 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4665 bgp_session_reset(member
);
4671 int peer_update_source_addr_set(struct peer
*peer
, const union sockunion
*su
)
4673 struct peer
*member
;
4674 struct listnode
*node
, *nnode
;
4676 /* Set flag and configuration on peer. */
4677 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
4678 if (peer
->update_source
) {
4679 if (sockunion_cmp(peer
->update_source
, su
) == 0)
4681 sockunion_free(peer
->update_source
);
4683 peer
->update_source
= sockunion_dup(su
);
4684 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4686 /* Check if handling a regular peer. */
4687 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4688 /* Send notification or reset peer depending on state. */
4689 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4690 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4691 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4692 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4694 bgp_session_reset(peer
);
4696 /* Skip peer-group mechanics for regular peers. */
4701 * Set flag and configuration on all peer-group members, unless they are
4702 * explicitely overriding peer-group configuration.
4704 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4705 /* Skip peers with overridden configuration. */
4706 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4709 /* Skip peers with the same configuration. */
4710 if (member
->update_source
) {
4711 if (sockunion_cmp(member
->update_source
, su
) == 0)
4713 sockunion_free(member
->update_source
);
4716 /* Set flag and configuration on peer-group member. */
4717 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4718 member
->update_source
= sockunion_dup(su
);
4719 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4721 /* Send notification or reset peer depending on state. */
4722 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4723 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4724 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4725 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4727 bgp_session_reset(member
);
4733 int peer_update_source_unset(struct peer
*peer
)
4735 struct peer
*member
;
4736 struct listnode
*node
, *nnode
;
4738 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_UPDATE_SOURCE
))
4741 /* Inherit configuration from peer-group if peer is member. */
4742 if (peer_group_active(peer
)) {
4743 peer_flag_inherit(peer
, PEER_FLAG_UPDATE_SOURCE
);
4744 PEER_SU_ATTR_INHERIT(peer
, peer
->group
, update_source
);
4745 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, update_if
,
4746 MTYPE_PEER_UPDATE_SOURCE
);
4748 /* Otherwise remove flag and configuration from peer. */
4749 peer_flag_unset(peer
, PEER_FLAG_UPDATE_SOURCE
);
4750 sockunion_free(peer
->update_source
);
4751 peer
->update_source
= NULL
;
4752 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4755 /* Check if handling a regular peer. */
4756 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4757 /* Send notification or reset peer depending on state. */
4758 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4759 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4760 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4761 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4763 bgp_session_reset(peer
);
4765 /* Skip peer-group mechanics for regular peers. */
4770 * Set flag and configuration on all peer-group members, unless they are
4771 * explicitely overriding peer-group configuration.
4773 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4774 /* Skip peers with overridden configuration. */
4775 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4778 /* Skip peers with the same configuration. */
4779 if (!CHECK_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
)
4780 && !member
->update_source
&& !member
->update_if
)
4783 /* Remove flag and configuration on peer-group member. */
4784 UNSET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4785 sockunion_free(member
->update_source
);
4786 member
->update_source
= NULL
;
4787 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4789 /* Send notification or reset peer depending on state. */
4790 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4791 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4792 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4793 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4795 bgp_session_reset(member
);
4801 int peer_default_originate_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
4802 const char *rmap
, struct route_map
*route_map
)
4804 struct peer
*member
;
4805 struct listnode
*node
, *nnode
;
4807 /* Set flag and configuration on peer. */
4808 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
);
4810 if (!peer
->default_rmap
[afi
][safi
].name
4811 || strcmp(rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0) {
4812 if (peer
->default_rmap
[afi
][safi
].name
)
4813 XFREE(MTYPE_ROUTE_MAP_NAME
,
4814 peer
->default_rmap
[afi
][safi
].name
);
4816 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4817 peer
->default_rmap
[afi
][safi
].name
=
4818 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4819 peer
->default_rmap
[afi
][safi
].map
= route_map
;
4820 route_map_counter_increment(route_map
);
4823 if (peer
->default_rmap
[afi
][safi
].name
)
4824 XFREE(MTYPE_ROUTE_MAP_NAME
,
4825 peer
->default_rmap
[afi
][safi
].name
);
4827 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4828 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4829 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4832 /* Check if handling a regular peer. */
4833 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4834 /* Update peer route announcements. */
4835 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4836 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4837 bgp_default_originate(peer
, afi
, safi
, 0);
4838 bgp_announce_route(peer
, afi
, safi
);
4841 /* Skip peer-group mechanics for regular peers. */
4846 * Set flag and configuration on all peer-group members, unless they are
4847 * explicitely overriding peer-group configuration.
4849 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4850 /* Skip peers with overridden configuration. */
4851 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4852 PEER_FLAG_DEFAULT_ORIGINATE
))
4855 /* Set flag and configuration on peer-group member. */
4856 SET_FLAG(member
->af_flags
[afi
][safi
],
4857 PEER_FLAG_DEFAULT_ORIGINATE
);
4859 if (member
->default_rmap
[afi
][safi
].name
)
4860 XFREE(MTYPE_ROUTE_MAP_NAME
,
4861 member
->default_rmap
[afi
][safi
].name
);
4862 route_map_counter_decrement(
4863 member
->default_rmap
[afi
][safi
].map
);
4864 member
->default_rmap
[afi
][safi
].name
=
4865 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4866 member
->default_rmap
[afi
][safi
].map
= route_map
;
4867 route_map_counter_increment(route_map
);
4870 /* Update peer route announcements. */
4871 if (member
->status
== Established
4872 && member
->afc_nego
[afi
][safi
]) {
4873 update_group_adjust_peer(
4874 peer_af_find(member
, afi
, safi
));
4875 bgp_default_originate(member
, afi
, safi
, 0);
4876 bgp_announce_route(member
, afi
, safi
);
4883 int peer_default_originate_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
4885 struct peer
*member
;
4886 struct listnode
*node
, *nnode
;
4888 /* Inherit configuration from peer-group if peer is member. */
4889 if (peer_group_active(peer
)) {
4890 peer_af_flag_inherit(peer
, afi
, safi
,
4891 PEER_FLAG_DEFAULT_ORIGINATE
);
4892 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
4893 default_rmap
[afi
][safi
].name
,
4894 MTYPE_ROUTE_MAP_NAME
);
4895 PEER_ATTR_INHERIT(peer
, peer
->group
,
4896 default_rmap
[afi
][safi
].map
);
4898 /* Otherwise remove flag and configuration from peer. */
4899 peer_af_flag_unset(peer
, afi
, safi
,
4900 PEER_FLAG_DEFAULT_ORIGINATE
);
4901 if (peer
->default_rmap
[afi
][safi
].name
)
4902 XFREE(MTYPE_ROUTE_MAP_NAME
,
4903 peer
->default_rmap
[afi
][safi
].name
);
4904 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4905 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4906 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4909 /* Check if handling a regular peer. */
4910 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4911 /* Update peer route announcements. */
4912 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4913 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4914 bgp_default_originate(peer
, afi
, safi
, 1);
4915 bgp_announce_route(peer
, afi
, safi
);
4918 /* Skip peer-group mechanics for regular peers. */
4923 * Remove flag and configuration from all peer-group members, unless
4924 * they are explicitely overriding peer-group configuration.
4926 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4927 /* Skip peers with overridden configuration. */
4928 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4929 PEER_FLAG_DEFAULT_ORIGINATE
))
4932 /* Remove flag and configuration on peer-group member. */
4933 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4934 PEER_FLAG_DEFAULT_ORIGINATE
);
4935 if (peer
->default_rmap
[afi
][safi
].name
)
4936 XFREE(MTYPE_ROUTE_MAP_NAME
,
4937 peer
->default_rmap
[afi
][safi
].name
);
4938 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4939 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4940 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4942 /* Update peer route announcements. */
4943 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4944 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4945 bgp_default_originate(peer
, afi
, safi
, 1);
4946 bgp_announce_route(peer
, afi
, safi
);
4953 void peer_port_set(struct peer
*peer
, uint16_t port
)
4958 void peer_port_unset(struct peer
*peer
)
4960 peer
->port
= BGP_PORT_DEFAULT
;
4964 * Helper function that is called after the name of the policy
4965 * being used by a peer has changed (AF specific). Automatically
4966 * initiates inbound or outbound processing as needed.
4968 static void peer_on_policy_change(struct peer
*peer
, afi_t afi
, safi_t safi
,
4972 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4973 if (peer
->status
== Established
)
4974 bgp_announce_route(peer
, afi
, safi
);
4976 if (peer
->status
!= Established
)
4979 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
4980 PEER_FLAG_SOFT_RECONFIG
))
4981 bgp_soft_reconfig_in(peer
, afi
, safi
);
4982 else if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4983 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4984 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0);
4989 /* neighbor weight. */
4990 int peer_weight_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint16_t weight
)
4992 struct peer
*member
;
4993 struct listnode
*node
, *nnode
;
4995 /* Set flag and configuration on peer. */
4996 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4997 if (peer
->weight
[afi
][safi
] != weight
) {
4998 peer
->weight
[afi
][safi
] = weight
;
4999 peer_on_policy_change(peer
, afi
, safi
, 0);
5002 /* Skip peer-group mechanics for regular peers. */
5003 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5007 * Set flag and configuration on all peer-group members, unless they are
5008 * explicitely overriding peer-group configuration.
5010 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5011 /* Skip peers with overridden configuration. */
5012 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5016 /* Set flag and configuration on peer-group member. */
5017 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
5018 if (member
->weight
[afi
][safi
] != weight
) {
5019 member
->weight
[afi
][safi
] = weight
;
5020 peer_on_policy_change(member
, afi
, safi
, 0);
5027 int peer_weight_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
5029 struct peer
*member
;
5030 struct listnode
*node
, *nnode
;
5032 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
5035 /* Inherit configuration from peer-group if peer is member. */
5036 if (peer_group_active(peer
)) {
5037 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
5038 PEER_ATTR_INHERIT(peer
, peer
->group
, weight
[afi
][safi
]);
5040 peer_on_policy_change(peer
, afi
, safi
, 0);
5044 /* Remove flag and configuration from peer. */
5045 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
5046 peer
->weight
[afi
][safi
] = 0;
5047 peer_on_policy_change(peer
, afi
, safi
, 0);
5049 /* Skip peer-group mechanics for regular peers. */
5050 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5054 * Remove flag and configuration from all peer-group members, unless
5055 * they are explicitely overriding peer-group configuration.
5057 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5058 /* Skip peers with overridden configuration. */
5059 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5063 /* Skip peers where flag is already disabled. */
5064 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
5067 /* Remove flag and configuration on peer-group member. */
5068 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
5069 member
->weight
[afi
][safi
] = 0;
5070 peer_on_policy_change(member
, afi
, safi
, 0);
5076 int peer_timers_set(struct peer
*peer
, uint32_t keepalive
, uint32_t holdtime
)
5078 struct peer
*member
;
5079 struct listnode
*node
, *nnode
;
5081 if (keepalive
> 65535)
5082 return BGP_ERR_INVALID_VALUE
;
5084 if (holdtime
> 65535)
5085 return BGP_ERR_INVALID_VALUE
;
5087 if (holdtime
< 3 && holdtime
!= 0)
5088 return BGP_ERR_INVALID_VALUE
;
5090 /* Set flag and configuration on peer. */
5091 peer_flag_set(peer
, PEER_FLAG_TIMER
);
5092 peer
->holdtime
= holdtime
;
5093 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
5095 /* Skip peer-group mechanics for regular peers. */
5096 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5100 * Set flag and configuration on all peer-group members, unless they are
5101 * explicitely overriding peer-group configuration.
5103 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5104 /* Skip peers with overridden configuration. */
5105 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
5108 /* Set flag and configuration on peer-group member. */
5109 SET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
5110 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
5111 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
5117 int peer_timers_unset(struct peer
*peer
)
5119 struct peer
*member
;
5120 struct listnode
*node
, *nnode
;
5122 /* Inherit configuration from peer-group if peer is member. */
5123 if (peer_group_active(peer
)) {
5124 peer_flag_inherit(peer
, PEER_FLAG_TIMER
);
5125 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
5126 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
5128 /* Otherwise remove flag and configuration from peer. */
5129 peer_flag_unset(peer
, PEER_FLAG_TIMER
);
5131 peer
->keepalive
= 0;
5134 /* Skip peer-group mechanics for regular peers. */
5135 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5139 * Remove flag and configuration from all peer-group members, unless
5140 * they are explicitely overriding peer-group configuration.
5142 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5143 /* Skip peers with overridden configuration. */
5144 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
5147 /* Remove flag and configuration on peer-group member. */
5148 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
5149 member
->holdtime
= 0;
5150 member
->keepalive
= 0;
5156 int peer_timers_connect_set(struct peer
*peer
, uint32_t connect
)
5158 struct peer
*member
;
5159 struct listnode
*node
, *nnode
;
5161 if (connect
> 65535)
5162 return BGP_ERR_INVALID_VALUE
;
5164 /* Set flag and configuration on peer. */
5165 peer_flag_set(peer
, PEER_FLAG_TIMER_CONNECT
);
5166 peer
->connect
= connect
;
5167 peer
->v_connect
= connect
;
5169 /* Skip peer-group mechanics for regular peers. */
5170 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5174 * Set flag and configuration on all peer-group members, unless they are
5175 * explicitely overriding peer-group configuration.
5177 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5178 /* Skip peers with overridden configuration. */
5179 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5182 /* Set flag and configuration on peer-group member. */
5183 SET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5184 member
->connect
= connect
;
5185 member
->v_connect
= connect
;
5191 int peer_timers_connect_unset(struct peer
*peer
)
5193 struct peer
*member
;
5194 struct listnode
*node
, *nnode
;
5196 /* Inherit configuration from peer-group if peer is member. */
5197 if (peer_group_active(peer
)) {
5198 peer_flag_inherit(peer
, PEER_FLAG_TIMER_CONNECT
);
5199 PEER_ATTR_INHERIT(peer
, peer
->group
, connect
);
5201 /* Otherwise remove flag and configuration from peer. */
5202 peer_flag_unset(peer
, PEER_FLAG_TIMER_CONNECT
);
5206 /* Set timer with fallback to default value. */
5208 peer
->v_connect
= peer
->connect
;
5210 peer
->v_connect
= peer
->bgp
->default_connect_retry
;
5212 /* Skip peer-group mechanics for regular peers. */
5213 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5217 * Remove flag and configuration from all peer-group members, unless
5218 * they are explicitely overriding peer-group configuration.
5220 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5221 /* Skip peers with overridden configuration. */
5222 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5225 /* Remove flag and configuration on peer-group member. */
5226 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5227 member
->connect
= 0;
5228 member
->v_connect
= peer
->bgp
->default_connect_retry
;
5234 int peer_advertise_interval_set(struct peer
*peer
, uint32_t routeadv
)
5236 struct peer
*member
;
5237 struct listnode
*node
, *nnode
;
5240 return BGP_ERR_INVALID_VALUE
;
5242 /* Set flag and configuration on peer. */
5243 peer_flag_set(peer
, PEER_FLAG_ROUTEADV
);
5244 peer
->routeadv
= routeadv
;
5245 peer
->v_routeadv
= routeadv
;
5247 /* Check if handling a regular peer. */
5248 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5249 /* Update peer route announcements. */
5250 update_group_adjust_peer_afs(peer
);
5251 if (peer
->status
== Established
)
5252 bgp_announce_route_all(peer
);
5254 /* Skip peer-group mechanics for regular peers. */
5259 * Set flag and configuration on all peer-group members, unless they are
5260 * explicitely overriding peer-group configuration.
5262 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5263 /* Skip peers with overridden configuration. */
5264 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5267 /* Set flag and configuration on peer-group member. */
5268 SET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5269 member
->routeadv
= routeadv
;
5270 member
->v_routeadv
= routeadv
;
5272 /* Update peer route announcements. */
5273 update_group_adjust_peer_afs(member
);
5274 if (member
->status
== Established
)
5275 bgp_announce_route_all(member
);
5281 int peer_advertise_interval_unset(struct peer
*peer
)
5283 struct peer
*member
;
5284 struct listnode
*node
, *nnode
;
5286 /* Inherit configuration from peer-group if peer is member. */
5287 if (peer_group_active(peer
)) {
5288 peer_flag_inherit(peer
, PEER_FLAG_ROUTEADV
);
5289 PEER_ATTR_INHERIT(peer
, peer
->group
, routeadv
);
5291 /* Otherwise remove flag and configuration from peer. */
5292 peer_flag_unset(peer
, PEER_FLAG_ROUTEADV
);
5296 /* Set timer with fallback to default value. */
5298 peer
->v_routeadv
= peer
->routeadv
;
5300 peer
->v_routeadv
= (peer
->sort
== BGP_PEER_IBGP
)
5301 ? BGP_DEFAULT_IBGP_ROUTEADV
5302 : BGP_DEFAULT_EBGP_ROUTEADV
;
5304 /* Check if handling a regular peer. */
5305 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5306 /* Update peer route announcements. */
5307 update_group_adjust_peer_afs(peer
);
5308 if (peer
->status
== Established
)
5309 bgp_announce_route_all(peer
);
5311 /* Skip peer-group mechanics for regular peers. */
5316 * Remove flag and configuration from all peer-group members, unless
5317 * they are explicitely overriding peer-group configuration.
5319 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5320 /* Skip peers with overridden configuration. */
5321 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5324 /* Remove flag and configuration on peer-group member. */
5325 UNSET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5326 member
->routeadv
= 0;
5327 member
->v_routeadv
= (member
->sort
== BGP_PEER_IBGP
)
5328 ? BGP_DEFAULT_IBGP_ROUTEADV
5329 : BGP_DEFAULT_EBGP_ROUTEADV
;
5331 /* Update peer route announcements. */
5332 update_group_adjust_peer_afs(member
);
5333 if (member
->status
== Established
)
5334 bgp_announce_route_all(member
);
5340 /* neighbor interface */
5341 void peer_interface_set(struct peer
*peer
, const char *str
)
5343 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5344 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
5347 void peer_interface_unset(struct peer
*peer
)
5349 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5353 int peer_allowas_in_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
5354 int allow_num
, int origin
)
5356 struct peer
*member
;
5357 struct listnode
*node
, *nnode
;
5359 if (!origin
&& (allow_num
< 1 || allow_num
> 10))
5360 return BGP_ERR_INVALID_VALUE
;
5362 /* Set flag and configuration on peer. */
5363 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5365 if (peer
->allowas_in
[afi
][safi
] != 0
5366 || !CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5367 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5368 peer_af_flag_set(peer
, afi
, safi
,
5369 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5370 peer
->allowas_in
[afi
][safi
] = 0;
5371 peer_on_policy_change(peer
, afi
, safi
, 0);
5374 if (peer
->allowas_in
[afi
][safi
] != allow_num
5375 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5376 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5378 peer_af_flag_unset(peer
, afi
, safi
,
5379 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5380 peer
->allowas_in
[afi
][safi
] = allow_num
;
5381 peer_on_policy_change(peer
, afi
, safi
, 0);
5385 /* Skip peer-group mechanics for regular peers. */
5386 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5390 * Set flag and configuration on all peer-group members, unless
5391 * they are explicitely overriding peer-group configuration.
5393 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5394 /* Skip peers with overridden configuration. */
5395 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5396 PEER_FLAG_ALLOWAS_IN
))
5399 /* Set flag and configuration on peer-group member. */
5400 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
5402 if (member
->allowas_in
[afi
][safi
] != 0
5403 || !CHECK_FLAG(member
->af_flags
[afi
][safi
],
5404 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5405 SET_FLAG(member
->af_flags
[afi
][safi
],
5406 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5407 member
->allowas_in
[afi
][safi
] = 0;
5408 peer_on_policy_change(peer
, afi
, safi
, 0);
5411 if (member
->allowas_in
[afi
][safi
] != allow_num
5412 || CHECK_FLAG(member
->af_flags
[afi
][safi
],
5413 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5414 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5415 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5416 member
->allowas_in
[afi
][safi
] = allow_num
;
5417 peer_on_policy_change(peer
, afi
, safi
, 0);
5425 int peer_allowas_in_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
5427 struct peer
*member
;
5428 struct listnode
*node
, *nnode
;
5430 /* Skip peer if flag is already disabled. */
5431 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
5434 /* Inherit configuration from peer-group if peer is member. */
5435 if (peer_group_active(peer
)) {
5436 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5437 peer_af_flag_inherit(peer
, afi
, safi
,
5438 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5439 PEER_ATTR_INHERIT(peer
, peer
->group
, allowas_in
[afi
][safi
]);
5440 peer_on_policy_change(peer
, afi
, safi
, 0);
5445 /* Remove flag and configuration from peer. */
5446 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5447 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5448 peer
->allowas_in
[afi
][safi
] = 0;
5449 peer_on_policy_change(peer
, afi
, safi
, 0);
5451 /* Skip peer-group mechanics if handling a regular peer. */
5452 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5456 * Remove flags and configuration from all peer-group members, unless
5457 * they are explicitely overriding peer-group configuration.
5459 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5460 /* Skip peers with overridden configuration. */
5461 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5462 PEER_FLAG_ALLOWAS_IN
))
5465 /* Skip peers where flag is already disabled. */
5466 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
],
5467 PEER_FLAG_ALLOWAS_IN
))
5470 /* Remove flags and configuration on peer-group member. */
5471 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
5472 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5473 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5474 member
->allowas_in
[afi
][safi
] = 0;
5475 peer_on_policy_change(member
, afi
, safi
, 0);
5481 int peer_local_as_set(struct peer
*peer
, as_t as
, bool no_prepend
,
5484 bool old_no_prepend
, old_replace_as
;
5485 struct bgp
*bgp
= peer
->bgp
;
5486 struct peer
*member
;
5487 struct listnode
*node
, *nnode
;
5488 bgp_peer_sort_t ptype
= peer_sort(peer
);
5490 if (ptype
!= BGP_PEER_EBGP
&& ptype
!= BGP_PEER_INTERNAL
)
5491 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
5494 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
5497 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
5499 /* Save previous flag states. */
5501 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5503 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5505 /* Set flag and configuration on peer. */
5506 peer_flag_set(peer
, PEER_FLAG_LOCAL_AS
);
5507 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
, no_prepend
);
5508 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
, replace_as
);
5510 if (peer
->change_local_as
== as
&& old_no_prepend
== no_prepend
5511 && old_replace_as
== replace_as
)
5513 peer
->change_local_as
= as
;
5515 /* Check if handling a regular peer. */
5516 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5517 /* Send notification or reset peer depending on state. */
5518 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5519 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5520 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5521 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5523 bgp_session_reset(peer
);
5525 /* Skip peer-group mechanics for regular peers. */
5530 * Set flag and configuration on all peer-group members, unless they are
5531 * explicitely overriding peer-group configuration.
5533 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5534 /* Skip peers with overridden configuration. */
5535 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
5538 /* Skip peers with the same configuration. */
5539 old_no_prepend
= CHECK_FLAG(member
->flags
,
5540 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5541 old_replace_as
= CHECK_FLAG(member
->flags
,
5542 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5543 if (member
->change_local_as
== as
5544 && CHECK_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
)
5545 && old_no_prepend
== no_prepend
5546 && old_replace_as
== replace_as
)
5549 /* Set flag and configuration on peer-group member. */
5550 SET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
5551 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
,
5553 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
,
5555 member
->change_local_as
= as
;
5557 /* Send notification or stop peer depending on state. */
5558 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5559 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5560 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5561 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5563 BGP_EVENT_ADD(member
, BGP_Stop
);
5569 int peer_local_as_unset(struct peer
*peer
)
5571 struct peer
*member
;
5572 struct listnode
*node
, *nnode
;
5574 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS
))
5577 /* Inherit configuration from peer-group if peer is member. */
5578 if (peer_group_active(peer
)) {
5579 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS
);
5580 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5581 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5582 PEER_ATTR_INHERIT(peer
, peer
->group
, change_local_as
);
5584 /* Otherwise remove flag and configuration from peer. */
5585 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
5586 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5587 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5588 peer
->change_local_as
= 0;
5591 /* Check if handling a regular peer. */
5592 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5593 /* Send notification or stop peer depending on state. */
5594 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5595 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5596 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5597 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5599 BGP_EVENT_ADD(peer
, BGP_Stop
);
5601 /* Skip peer-group mechanics for regular peers. */
5606 * Remove flag and configuration from all peer-group members, unless
5607 * they are explicitely overriding peer-group configuration.
5609 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5610 /* Skip peers with overridden configuration. */
5611 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
5614 /* Remove flag and configuration on peer-group member. */
5615 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
5616 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5617 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5618 member
->change_local_as
= 0;
5620 /* Send notification or stop peer depending on state. */
5621 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5622 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5623 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5624 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5626 bgp_session_reset(member
);
5632 /* Set password for authenticating with the peer. */
5633 int peer_password_set(struct peer
*peer
, const char *password
)
5635 struct peer
*member
;
5636 struct listnode
*node
, *nnode
;
5637 int len
= password
? strlen(password
) : 0;
5638 int ret
= BGP_SUCCESS
;
5640 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
5641 return BGP_ERR_INVALID_VALUE
;
5643 /* Set flag and configuration on peer. */
5644 peer_flag_set(peer
, PEER_FLAG_PASSWORD
);
5645 if (peer
->password
&& strcmp(peer
->password
, password
) == 0)
5647 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
5648 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
5650 /* Check if handling a regular peer. */
5651 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5652 /* Send notification or reset peer depending on state. */
5653 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5654 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5655 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5657 bgp_session_reset(peer
);
5660 * Attempt to install password on socket and skip peer-group
5663 if (BGP_PEER_SU_UNSPEC(peer
))
5665 return (bgp_md5_set(peer
) >= 0) ? BGP_SUCCESS
5666 : BGP_ERR_TCPSIG_FAILED
;
5670 * Set flag and configuration on all peer-group members, unless they are
5671 * explicitely overriding peer-group configuration.
5673 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5674 /* Skip peers with overridden configuration. */
5675 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
5678 /* Skip peers with the same password. */
5679 if (member
->password
&& strcmp(member
->password
, password
) == 0)
5682 /* Set flag and configuration on peer-group member. */
5683 SET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
5684 if (member
->password
)
5685 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
5686 member
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
5688 /* Send notification or reset peer depending on state. */
5689 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
5690 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5691 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5693 bgp_session_reset(member
);
5695 /* Attempt to install password on socket. */
5696 if (!BGP_PEER_SU_UNSPEC(member
) && bgp_md5_set(member
) < 0)
5697 ret
= BGP_ERR_TCPSIG_FAILED
;
5700 /* Set flag and configuration on all peer-group listen ranges */
5701 struct listnode
*ln
;
5704 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP
], ln
, lr
))
5705 bgp_md5_set_prefix(peer
->bgp
, lr
, password
);
5706 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP6
], ln
, lr
))
5707 bgp_md5_set_prefix(peer
->bgp
, lr
, password
);
5712 int peer_password_unset(struct peer
*peer
)
5714 struct peer
*member
;
5715 struct listnode
*node
, *nnode
;
5717 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
))
5720 /* Inherit configuration from peer-group if peer is member. */
5721 if (peer_group_active(peer
)) {
5722 peer_flag_inherit(peer
, PEER_FLAG_PASSWORD
);
5723 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, password
,
5724 MTYPE_PEER_PASSWORD
);
5726 /* Otherwise remove flag and configuration from peer. */
5727 peer_flag_unset(peer
, PEER_FLAG_PASSWORD
);
5728 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
5731 /* Check if handling a regular peer. */
5732 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5733 /* Send notification or reset peer depending on state. */
5734 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5735 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5736 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5738 bgp_session_reset(peer
);
5740 /* Attempt to uninstall password on socket. */
5741 if (!BGP_PEER_SU_UNSPEC(peer
))
5742 bgp_md5_unset(peer
);
5743 /* Skip peer-group mechanics for regular peers. */
5748 * Remove flag and configuration from all peer-group members, unless
5749 * they are explicitely overriding peer-group configuration.
5751 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5752 /* Skip peers with overridden configuration. */
5753 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
5756 /* Remove flag and configuration on peer-group member. */
5757 UNSET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
5758 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
5760 /* Send notification or reset peer depending on state. */
5761 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
5762 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5763 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5765 bgp_session_reset(member
);
5767 /* Attempt to uninstall password on socket. */
5768 if (!BGP_PEER_SU_UNSPEC(member
))
5769 bgp_md5_unset(member
);
5772 /* Set flag and configuration on all peer-group listen ranges */
5773 struct listnode
*ln
;
5776 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP
], ln
, lr
))
5777 bgp_md5_unset_prefix(peer
->bgp
, lr
);
5778 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP6
], ln
, lr
))
5779 bgp_md5_unset_prefix(peer
->bgp
, lr
);
5785 /* Set distribute list to the peer. */
5786 int peer_distribute_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5789 struct peer
*member
;
5790 struct bgp_filter
*filter
;
5791 struct listnode
*node
, *nnode
;
5793 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5794 return BGP_ERR_INVALID_VALUE
;
5796 /* Set configuration on peer. */
5797 filter
= &peer
->filter
[afi
][safi
];
5798 if (filter
->plist
[direct
].name
)
5799 return BGP_ERR_PEER_FILTER_CONFLICT
;
5800 if (filter
->dlist
[direct
].name
)
5801 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
5802 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5803 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
5805 /* Check if handling a regular peer. */
5806 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5807 /* Set override-flag and process peer route updates. */
5808 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5809 PEER_FT_DISTRIBUTE_LIST
);
5810 peer_on_policy_change(peer
, afi
, safi
,
5811 (direct
== FILTER_OUT
) ? 1 : 0);
5813 /* Skip peer-group mechanics for regular peers. */
5818 * Set configuration on all peer-group members, un less they are
5819 * explicitely overriding peer-group configuration.
5821 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5822 /* Skip peers with overridden configuration. */
5823 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5824 PEER_FT_DISTRIBUTE_LIST
))
5827 /* Set configuration on peer-group member. */
5828 filter
= &member
->filter
[afi
][safi
];
5829 if (filter
->dlist
[direct
].name
)
5830 XFREE(MTYPE_BGP_FILTER_NAME
,
5831 filter
->dlist
[direct
].name
);
5832 filter
->dlist
[direct
].name
=
5833 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5834 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
5836 /* Process peer route updates. */
5837 peer_on_policy_change(member
, afi
, safi
,
5838 (direct
== FILTER_OUT
) ? 1 : 0);
5844 int peer_distribute_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5846 struct peer
*member
;
5847 struct bgp_filter
*filter
;
5848 struct listnode
*node
, *nnode
;
5850 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5851 return BGP_ERR_INVALID_VALUE
;
5853 /* Unset override-flag unconditionally. */
5854 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5855 PEER_FT_DISTRIBUTE_LIST
);
5857 /* Inherit configuration from peer-group if peer is member. */
5858 if (peer_group_active(peer
)) {
5859 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
5860 filter
[afi
][safi
].dlist
[direct
].name
,
5861 MTYPE_BGP_FILTER_NAME
);
5862 PEER_ATTR_INHERIT(peer
, peer
->group
,
5863 filter
[afi
][safi
].dlist
[direct
].alist
);
5865 /* Otherwise remove configuration from peer. */
5866 filter
= &peer
->filter
[afi
][safi
];
5867 if (filter
->dlist
[direct
].name
)
5868 XFREE(MTYPE_BGP_FILTER_NAME
,
5869 filter
->dlist
[direct
].name
);
5870 filter
->dlist
[direct
].name
= NULL
;
5871 filter
->dlist
[direct
].alist
= NULL
;
5874 /* Check if handling a regular peer. */
5875 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5876 /* Process peer route updates. */
5877 peer_on_policy_change(peer
, afi
, safi
,
5878 (direct
== FILTER_OUT
) ? 1 : 0);
5880 /* Skip peer-group mechanics for regular peers. */
5885 * Remove configuration on all peer-group members, unless they are
5886 * explicitely overriding peer-group configuration.
5888 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5889 /* Skip peers with overridden configuration. */
5890 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5891 PEER_FT_DISTRIBUTE_LIST
))
5894 /* Remove configuration on peer-group member. */
5895 filter
= &member
->filter
[afi
][safi
];
5896 if (filter
->dlist
[direct
].name
)
5897 XFREE(MTYPE_BGP_FILTER_NAME
,
5898 filter
->dlist
[direct
].name
);
5899 filter
->dlist
[direct
].name
= NULL
;
5900 filter
->dlist
[direct
].alist
= NULL
;
5902 /* Process peer route updates. */
5903 peer_on_policy_change(member
, afi
, safi
,
5904 (direct
== FILTER_OUT
) ? 1 : 0);
5910 /* Update distribute list. */
5911 static void peer_distribute_update(struct access_list
*access
)
5916 struct listnode
*mnode
, *mnnode
;
5917 struct listnode
*node
, *nnode
;
5920 struct peer_group
*group
;
5921 struct bgp_filter
*filter
;
5923 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
5925 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
5926 access
->name
, 0, 0);
5927 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
5928 FOREACH_AFI_SAFI (afi
, safi
) {
5929 filter
= &peer
->filter
[afi
][safi
];
5931 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5933 if (filter
->dlist
[direct
].name
)
5934 filter
->dlist
[direct
]
5935 .alist
= access_list_lookup(
5937 filter
->dlist
[direct
]
5940 filter
->dlist
[direct
].alist
=
5945 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
5946 FOREACH_AFI_SAFI (afi
, safi
) {
5947 filter
= &group
->conf
->filter
[afi
][safi
];
5949 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5951 if (filter
->dlist
[direct
].name
)
5952 filter
->dlist
[direct
]
5953 .alist
= access_list_lookup(
5955 filter
->dlist
[direct
]
5958 filter
->dlist
[direct
].alist
=
5963 #ifdef ENABLE_BGP_VNC
5964 vnc_prefix_list_update(bgp
);
5969 /* Set prefix list to the peer. */
5970 int peer_prefix_list_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5973 struct peer
*member
;
5974 struct bgp_filter
*filter
;
5975 struct listnode
*node
, *nnode
;
5977 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5978 return BGP_ERR_INVALID_VALUE
;
5980 /* Set configuration on peer. */
5981 filter
= &peer
->filter
[afi
][safi
];
5982 if (filter
->dlist
[direct
].name
)
5983 return BGP_ERR_PEER_FILTER_CONFLICT
;
5984 if (filter
->plist
[direct
].name
)
5985 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5986 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5987 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
5989 /* Check if handling a regular peer. */
5990 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5991 /* Set override-flag and process peer route updates. */
5992 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5993 PEER_FT_PREFIX_LIST
);
5994 peer_on_policy_change(peer
, afi
, safi
,
5995 (direct
== FILTER_OUT
) ? 1 : 0);
5997 /* Skip peer-group mechanics for regular peers. */
6002 * Set configuration on all peer-group members, unless they are
6003 * explicitely overriding peer-group configuration.
6005 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6006 /* Skip peers with overridden configuration. */
6007 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6008 PEER_FT_PREFIX_LIST
))
6011 /* Set configuration on peer-group member. */
6012 filter
= &member
->filter
[afi
][safi
];
6013 if (filter
->plist
[direct
].name
)
6014 XFREE(MTYPE_BGP_FILTER_NAME
,
6015 filter
->plist
[direct
].name
);
6016 filter
->plist
[direct
].name
=
6017 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6018 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
6020 /* Process peer route updates. */
6021 peer_on_policy_change(member
, afi
, safi
,
6022 (direct
== FILTER_OUT
) ? 1 : 0);
6028 int peer_prefix_list_unset(struct peer
*peer
, afi_t afi
, safi_t safi
,
6031 struct peer
*member
;
6032 struct bgp_filter
*filter
;
6033 struct listnode
*node
, *nnode
;
6035 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6036 return BGP_ERR_INVALID_VALUE
;
6038 /* Unset override-flag unconditionally. */
6039 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6040 PEER_FT_PREFIX_LIST
);
6042 /* Inherit configuration from peer-group if peer is member. */
6043 if (peer_group_active(peer
)) {
6044 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6045 filter
[afi
][safi
].plist
[direct
].name
,
6046 MTYPE_BGP_FILTER_NAME
);
6047 PEER_ATTR_INHERIT(peer
, peer
->group
,
6048 filter
[afi
][safi
].plist
[direct
].plist
);
6050 /* Otherwise remove configuration from peer. */
6051 filter
= &peer
->filter
[afi
][safi
];
6052 if (filter
->plist
[direct
].name
)
6053 XFREE(MTYPE_BGP_FILTER_NAME
,
6054 filter
->plist
[direct
].name
);
6055 filter
->plist
[direct
].name
= NULL
;
6056 filter
->plist
[direct
].plist
= NULL
;
6059 /* Check if handling a regular peer. */
6060 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6061 /* Process peer route updates. */
6062 peer_on_policy_change(peer
, afi
, safi
,
6063 (direct
== FILTER_OUT
) ? 1 : 0);
6065 /* Skip peer-group mechanics for regular peers. */
6070 * Remove configuration on all peer-group members, unless they are
6071 * explicitely overriding peer-group configuration.
6073 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6074 /* Skip peers with overridden configuration. */
6075 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6076 PEER_FT_PREFIX_LIST
))
6079 /* Remove configuration on peer-group member. */
6080 filter
= &member
->filter
[afi
][safi
];
6081 if (filter
->plist
[direct
].name
)
6082 XFREE(MTYPE_BGP_FILTER_NAME
,
6083 filter
->plist
[direct
].name
);
6084 filter
->plist
[direct
].name
= NULL
;
6085 filter
->plist
[direct
].plist
= NULL
;
6087 /* Process peer route updates. */
6088 peer_on_policy_change(member
, afi
, safi
,
6089 (direct
== FILTER_OUT
) ? 1 : 0);
6095 /* Update prefix-list list. */
6096 static void peer_prefix_list_update(struct prefix_list
*plist
)
6098 struct listnode
*mnode
, *mnnode
;
6099 struct listnode
*node
, *nnode
;
6102 struct peer_group
*group
;
6103 struct bgp_filter
*filter
;
6108 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6111 * Update the prefix-list on update groups.
6113 update_group_policy_update(
6114 bgp
, BGP_POLICY_PREFIX_LIST
,
6115 plist
? prefix_list_name(plist
) : NULL
, 0, 0);
6117 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6118 FOREACH_AFI_SAFI (afi
, safi
) {
6119 filter
= &peer
->filter
[afi
][safi
];
6121 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6123 if (filter
->plist
[direct
].name
)
6124 filter
->plist
[direct
]
6125 .plist
= prefix_list_lookup(
6127 filter
->plist
[direct
]
6130 filter
->plist
[direct
].plist
=
6135 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6136 FOREACH_AFI_SAFI (afi
, safi
) {
6137 filter
= &group
->conf
->filter
[afi
][safi
];
6139 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6141 if (filter
->plist
[direct
].name
)
6142 filter
->plist
[direct
]
6143 .plist
= prefix_list_lookup(
6145 filter
->plist
[direct
]
6148 filter
->plist
[direct
].plist
=
6156 int peer_aslist_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6159 struct peer
*member
;
6160 struct bgp_filter
*filter
;
6161 struct listnode
*node
, *nnode
;
6163 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6164 return BGP_ERR_INVALID_VALUE
;
6166 /* Set configuration on peer. */
6167 filter
= &peer
->filter
[afi
][safi
];
6168 if (filter
->aslist
[direct
].name
)
6169 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
6170 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6171 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6173 /* Check if handling a regular peer. */
6174 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6175 /* Set override-flag and process peer route updates. */
6176 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6177 PEER_FT_FILTER_LIST
);
6178 peer_on_policy_change(peer
, afi
, safi
,
6179 (direct
== FILTER_OUT
) ? 1 : 0);
6181 /* Skip peer-group mechanics for regular peers. */
6186 * Set configuration on all peer-group members, unless they are
6187 * explicitely overriding peer-group configuration.
6189 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6190 /* Skip peers with overridden configuration. */
6191 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6192 PEER_FT_FILTER_LIST
))
6195 /* Set configuration on peer-group member. */
6196 filter
= &member
->filter
[afi
][safi
];
6197 if (filter
->aslist
[direct
].name
)
6198 XFREE(MTYPE_BGP_FILTER_NAME
,
6199 filter
->aslist
[direct
].name
);
6200 filter
->aslist
[direct
].name
=
6201 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6202 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6204 /* Process peer route updates. */
6205 peer_on_policy_change(member
, afi
, safi
,
6206 (direct
== FILTER_OUT
) ? 1 : 0);
6212 int peer_aslist_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6214 struct peer
*member
;
6215 struct bgp_filter
*filter
;
6216 struct listnode
*node
, *nnode
;
6218 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6219 return BGP_ERR_INVALID_VALUE
;
6221 /* Unset override-flag unconditionally. */
6222 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6223 PEER_FT_FILTER_LIST
);
6225 /* Inherit configuration from peer-group if peer is member. */
6226 if (peer_group_active(peer
)) {
6227 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6228 filter
[afi
][safi
].aslist
[direct
].name
,
6229 MTYPE_BGP_FILTER_NAME
);
6230 PEER_ATTR_INHERIT(peer
, peer
->group
,
6231 filter
[afi
][safi
].aslist
[direct
].aslist
);
6233 /* Otherwise remove configuration from peer. */
6234 filter
= &peer
->filter
[afi
][safi
];
6235 if (filter
->aslist
[direct
].name
)
6236 XFREE(MTYPE_BGP_FILTER_NAME
,
6237 filter
->aslist
[direct
].name
);
6238 filter
->aslist
[direct
].name
= NULL
;
6239 filter
->aslist
[direct
].aslist
= NULL
;
6242 /* Check if handling a regular peer. */
6243 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6244 /* Process peer route updates. */
6245 peer_on_policy_change(peer
, afi
, safi
,
6246 (direct
== FILTER_OUT
) ? 1 : 0);
6248 /* Skip peer-group mechanics for regular peers. */
6253 * Remove configuration on all peer-group members, unless they are
6254 * explicitely overriding peer-group configuration.
6256 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6257 /* Skip peers with overridden configuration. */
6258 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6259 PEER_FT_FILTER_LIST
))
6262 /* Remove configuration on peer-group member. */
6263 filter
= &member
->filter
[afi
][safi
];
6264 if (filter
->aslist
[direct
].name
)
6265 XFREE(MTYPE_BGP_FILTER_NAME
,
6266 filter
->aslist
[direct
].name
);
6267 filter
->aslist
[direct
].name
= NULL
;
6268 filter
->aslist
[direct
].aslist
= NULL
;
6270 /* Process peer route updates. */
6271 peer_on_policy_change(member
, afi
, safi
,
6272 (direct
== FILTER_OUT
) ? 1 : 0);
6278 static void peer_aslist_update(const char *aslist_name
)
6283 struct listnode
*mnode
, *mnnode
;
6284 struct listnode
*node
, *nnode
;
6287 struct peer_group
*group
;
6288 struct bgp_filter
*filter
;
6290 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6291 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
6294 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6295 FOREACH_AFI_SAFI (afi
, safi
) {
6296 filter
= &peer
->filter
[afi
][safi
];
6298 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6300 if (filter
->aslist
[direct
].name
)
6301 filter
->aslist
[direct
]
6302 .aslist
= as_list_lookup(
6303 filter
->aslist
[direct
]
6306 filter
->aslist
[direct
].aslist
=
6311 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6312 FOREACH_AFI_SAFI (afi
, safi
) {
6313 filter
= &group
->conf
->filter
[afi
][safi
];
6315 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6317 if (filter
->aslist
[direct
].name
)
6318 filter
->aslist
[direct
]
6319 .aslist
= as_list_lookup(
6320 filter
->aslist
[direct
]
6323 filter
->aslist
[direct
].aslist
=
6331 static void peer_aslist_add(char *aslist_name
)
6333 peer_aslist_update(aslist_name
);
6334 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
6337 static void peer_aslist_del(const char *aslist_name
)
6339 peer_aslist_update(aslist_name
);
6340 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
6344 int peer_route_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6345 const char *name
, struct route_map
*route_map
)
6347 struct peer
*member
;
6348 struct bgp_filter
*filter
;
6349 struct listnode
*node
, *nnode
;
6351 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6352 return BGP_ERR_INVALID_VALUE
;
6354 /* Set configuration on peer. */
6355 filter
= &peer
->filter
[afi
][safi
];
6356 if (filter
->map
[direct
].name
) {
6357 /* If the neighbor is configured with the same route-map
6358 * again then, ignore the duplicate configuration.
6360 if (strcmp(filter
->map
[direct
].name
, name
) == 0)
6363 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6365 route_map_counter_decrement(filter
->map
[direct
].map
);
6366 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6367 filter
->map
[direct
].map
= route_map
;
6368 route_map_counter_increment(route_map
);
6370 /* Check if handling a regular peer. */
6371 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6372 /* Set override-flag and process peer route updates. */
6373 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6375 peer_on_policy_change(peer
, afi
, safi
,
6376 (direct
== RMAP_OUT
) ? 1 : 0);
6378 /* Skip peer-group mechanics for regular peers. */
6383 * Set configuration on all peer-group members, unless they are
6384 * explicitely overriding peer-group configuration.
6386 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6387 /* Skip peers with overridden configuration. */
6388 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6392 /* Set configuration on peer-group member. */
6393 filter
= &member
->filter
[afi
][safi
];
6394 if (filter
->map
[direct
].name
)
6395 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6396 route_map_counter_decrement(filter
->map
[direct
].map
);
6397 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6398 filter
->map
[direct
].map
= route_map
;
6399 route_map_counter_increment(route_map
);
6401 /* Process peer route updates. */
6402 peer_on_policy_change(member
, afi
, safi
,
6403 (direct
== RMAP_OUT
) ? 1 : 0);
6408 /* Unset route-map from the peer. */
6409 int peer_route_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6411 struct peer
*member
;
6412 struct bgp_filter
*filter
;
6413 struct listnode
*node
, *nnode
;
6415 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6416 return BGP_ERR_INVALID_VALUE
;
6418 /* Unset override-flag unconditionally. */
6419 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
], PEER_FT_ROUTE_MAP
);
6421 /* Inherit configuration from peer-group if peer is member. */
6422 if (peer_group_active(peer
)) {
6423 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6424 filter
[afi
][safi
].map
[direct
].name
,
6425 MTYPE_BGP_FILTER_NAME
);
6426 PEER_ATTR_INHERIT(peer
, peer
->group
,
6427 filter
[afi
][safi
].map
[direct
].map
);
6429 /* Otherwise remove configuration from peer. */
6430 filter
= &peer
->filter
[afi
][safi
];
6431 if (filter
->map
[direct
].name
)
6432 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6433 route_map_counter_decrement(filter
->map
[direct
].map
);
6434 filter
->map
[direct
].name
= NULL
;
6435 filter
->map
[direct
].map
= NULL
;
6438 /* Check if handling a regular peer. */
6439 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6440 /* Process peer route updates. */
6441 peer_on_policy_change(peer
, afi
, safi
,
6442 (direct
== RMAP_OUT
) ? 1 : 0);
6444 /* Skip peer-group mechanics for regular peers. */
6449 * Remove configuration on all peer-group members, unless they are
6450 * explicitely overriding peer-group configuration.
6452 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6453 /* Skip peers with overridden configuration. */
6454 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6458 /* Remove configuration on peer-group member. */
6459 filter
= &member
->filter
[afi
][safi
];
6460 if (filter
->map
[direct
].name
)
6461 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6462 route_map_counter_decrement(filter
->map
[direct
].map
);
6463 filter
->map
[direct
].name
= NULL
;
6464 filter
->map
[direct
].map
= NULL
;
6466 /* Process peer route updates. */
6467 peer_on_policy_change(member
, afi
, safi
,
6468 (direct
== RMAP_OUT
) ? 1 : 0);
6474 /* Set unsuppress-map to the peer. */
6475 int peer_unsuppress_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6476 const char *name
, struct route_map
*route_map
)
6478 struct peer
*member
;
6479 struct bgp_filter
*filter
;
6480 struct listnode
*node
, *nnode
;
6482 /* Set configuration on peer. */
6483 filter
= &peer
->filter
[afi
][safi
];
6484 if (filter
->usmap
.name
)
6485 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6486 route_map_counter_decrement(filter
->usmap
.map
);
6487 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6488 filter
->usmap
.map
= route_map
;
6489 route_map_counter_increment(route_map
);
6491 /* Check if handling a regular peer. */
6492 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6493 /* Set override-flag and process peer route updates. */
6494 SET_FLAG(peer
->filter_override
[afi
][safi
][0],
6495 PEER_FT_UNSUPPRESS_MAP
);
6496 peer_on_policy_change(peer
, afi
, safi
, 1);
6498 /* Skip peer-group mechanics for regular peers. */
6503 * Set configuration on all peer-group members, unless they are
6504 * explicitely overriding peer-group configuration.
6506 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6507 /* Skip peers with overridden configuration. */
6508 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
6509 PEER_FT_UNSUPPRESS_MAP
))
6512 /* Set configuration on peer-group member. */
6513 filter
= &member
->filter
[afi
][safi
];
6514 if (filter
->usmap
.name
)
6515 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6516 route_map_counter_decrement(filter
->usmap
.map
);
6517 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6518 filter
->usmap
.map
= route_map
;
6519 route_map_counter_increment(route_map
);
6521 /* Process peer route updates. */
6522 peer_on_policy_change(member
, afi
, safi
, 1);
6528 /* Unset route-map from the peer. */
6529 int peer_unsuppress_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6531 struct peer
*member
;
6532 struct bgp_filter
*filter
;
6533 struct listnode
*node
, *nnode
;
6535 /* Unset override-flag unconditionally. */
6536 UNSET_FLAG(peer
->filter_override
[afi
][safi
][0], PEER_FT_UNSUPPRESS_MAP
);
6538 /* Inherit configuration from peer-group if peer is member. */
6539 if (peer_group_active(peer
)) {
6540 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6541 filter
[afi
][safi
].usmap
.name
,
6542 MTYPE_BGP_FILTER_NAME
);
6543 PEER_ATTR_INHERIT(peer
, peer
->group
,
6544 filter
[afi
][safi
].usmap
.map
);
6546 /* Otherwise remove configuration from peer. */
6547 filter
= &peer
->filter
[afi
][safi
];
6548 if (filter
->usmap
.name
)
6549 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6550 route_map_counter_decrement(filter
->usmap
.map
);
6551 filter
->usmap
.name
= NULL
;
6552 filter
->usmap
.map
= NULL
;
6555 /* Check if handling a regular peer. */
6556 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6557 /* Process peer route updates. */
6558 peer_on_policy_change(peer
, afi
, safi
, 1);
6560 /* Skip peer-group mechanics for regular peers. */
6565 * Remove configuration on all peer-group members, unless they are
6566 * explicitely overriding peer-group configuration.
6568 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6569 /* Skip peers with overridden configuration. */
6570 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
6571 PEER_FT_UNSUPPRESS_MAP
))
6574 /* Remove configuration on peer-group member. */
6575 filter
= &member
->filter
[afi
][safi
];
6576 if (filter
->usmap
.name
)
6577 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6578 route_map_counter_decrement(filter
->usmap
.map
);
6579 filter
->usmap
.name
= NULL
;
6580 filter
->usmap
.map
= NULL
;
6582 /* Process peer route updates. */
6583 peer_on_policy_change(member
, afi
, safi
, 1);
6589 static void peer_advertise_map_filter_update(struct peer
*peer
, afi_t afi
,
6590 safi_t safi
, const char *amap_name
,
6591 struct route_map
*amap
,
6592 const char *cmap_name
,
6593 struct route_map
*cmap
,
6594 bool condition
, bool set
)
6596 struct bgp_filter
*filter
;
6597 bool filter_exists
= false;
6599 filter
= &peer
->filter
[afi
][safi
];
6601 /* advertise-map is already configured. */
6602 if (filter
->advmap
.aname
) {
6603 filter_exists
= true;
6604 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->advmap
.aname
);
6605 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->advmap
.cname
);
6608 route_map_counter_decrement(filter
->advmap
.amap
);
6610 /* Removed advertise-map configuration */
6612 memset(filter
, 0, sizeof(struct bgp_filter
));
6614 /* decrement condition_filter_count delete timer if
6615 * this is the last advertise-map to be removed.
6618 bgp_conditional_adv_disable(peer
, afi
, safi
);
6623 /* Update filter data with newly configured values. */
6624 filter
->advmap
.aname
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, amap_name
);
6625 filter
->advmap
.cname
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, cmap_name
);
6626 filter
->advmap
.amap
= amap
;
6627 filter
->advmap
.cmap
= cmap
;
6628 filter
->advmap
.condition
= condition
;
6629 route_map_counter_increment(filter
->advmap
.amap
);
6630 peer
->advmap_config_change
[afi
][safi
] = true;
6632 /* Increment condition_filter_count and/or create timer. */
6633 if (!filter_exists
) {
6634 filter
->advmap
.update_type
= ADVERTISE
;
6635 bgp_conditional_adv_enable(peer
, afi
, safi
);
6639 /* Set advertise-map to the peer but do not process peer route updates here. *
6640 * Hold filter changes until the conditional routes polling thread is called *
6641 * AS we need to advertise/withdraw prefixes (in advertise-map) based on the *
6642 * condition (exist-map/non-exist-map) and routes(specified in condition-map) *
6643 * in BGP table. So do not call peer_on_policy_change() here, only create *
6644 * polling timer thread, update filters and increment condition_filter_count.
6646 int peer_advertise_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6647 const char *advertise_name
,
6648 struct route_map
*advertise_map
,
6649 const char *condition_name
,
6650 struct route_map
*condition_map
, bool condition
)
6652 struct peer
*member
;
6653 struct listnode
*node
, *nnode
;
6655 /* Set configuration on peer. */
6656 peer_advertise_map_filter_update(peer
, afi
, safi
, advertise_name
,
6657 advertise_map
, condition_name
,
6658 condition_map
, condition
, true);
6660 /* Check if handling a regular peer & Skip peer-group mechanics. */
6661 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6662 /* Set override-flag and process peer route updates. */
6663 SET_FLAG(peer
->filter_override
[afi
][safi
][RMAP_OUT
],
6664 PEER_FT_ADVERTISE_MAP
);
6669 * Set configuration on all peer-group members, unless they are
6670 * explicitely overriding peer-group configuration.
6672 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6673 /* Skip peers with overridden configuration. */
6674 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][RMAP_OUT
],
6675 PEER_FT_ADVERTISE_MAP
))
6678 /* Set configuration on peer-group member. */
6679 peer_advertise_map_filter_update(
6680 member
, afi
, safi
, advertise_name
, advertise_map
,
6681 condition_name
, condition_map
, condition
, true);
6687 /* Unset advertise-map from the peer. */
6688 int peer_advertise_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
,
6689 const char *advertise_name
,
6690 struct route_map
*advertise_map
,
6691 const char *condition_name
,
6692 struct route_map
*condition_map
, bool condition
)
6694 struct peer
*member
;
6695 struct listnode
*node
, *nnode
;
6697 /* advertise-map is not configured */
6698 if (!peer
->filter
[afi
][safi
].advmap
.aname
)
6701 /* Unset override-flag unconditionally. */
6702 UNSET_FLAG(peer
->filter_override
[afi
][safi
][RMAP_OUT
],
6703 PEER_FT_ADVERTISE_MAP
);
6705 /* Inherit configuration from peer-group if peer is member. */
6706 if (peer_group_active(peer
)) {
6707 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6708 filter
[afi
][safi
].advmap
.aname
,
6709 MTYPE_BGP_FILTER_NAME
);
6710 PEER_ATTR_INHERIT(peer
, peer
->group
,
6711 filter
[afi
][safi
].advmap
.amap
);
6713 peer_advertise_map_filter_update(
6714 peer
, afi
, safi
, advertise_name
, advertise_map
,
6715 condition_name
, condition_map
, condition
, false);
6717 /* Check if handling a regular peer and skip peer-group mechanics. */
6718 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6719 /* Process peer route updates. */
6720 if (BGP_DEBUG(update
, UPDATE_OUT
))
6721 zlog_debug("%s: Send normal update to %s for %s",
6722 __func__
, peer
->host
,
6723 get_afi_safi_str(afi
, safi
, false));
6725 peer_on_policy_change(peer
, afi
, safi
, 1);
6730 * Remove configuration on all peer-group members, unless they are
6731 * explicitely overriding peer-group configuration.
6733 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6734 /* Skip peers with overridden configuration. */
6735 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][RMAP_OUT
],
6736 PEER_FT_ADVERTISE_MAP
))
6738 /* Remove configuration on peer-group member. */
6739 peer_advertise_map_filter_update(
6740 member
, afi
, safi
, advertise_name
, advertise_map
,
6741 condition_name
, condition_map
, condition
, false);
6743 /* Process peer route updates. */
6744 if (BGP_DEBUG(update
, UPDATE_OUT
))
6745 zlog_debug("%s: Send normal update to %s for %s ",
6746 __func__
, member
->host
,
6747 get_afi_safi_str(afi
, safi
, false));
6749 peer_on_policy_change(member
, afi
, safi
, 1);
6755 int peer_maximum_prefix_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6756 uint32_t max
, uint8_t threshold
, int warning
,
6757 uint16_t restart
, bool force
)
6759 struct peer
*member
;
6760 struct listnode
*node
, *nnode
;
6762 /* Set flags and configuration on peer. */
6763 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6766 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_FORCE
);
6768 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_FORCE
);
6771 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
6773 peer_af_flag_unset(peer
, afi
, safi
,
6774 PEER_FLAG_MAX_PREFIX_WARNING
);
6776 peer
->pmax
[afi
][safi
] = max
;
6777 peer
->pmax_threshold
[afi
][safi
] = threshold
;
6778 peer
->pmax_restart
[afi
][safi
] = restart
;
6780 /* Check if handling a regular peer. */
6781 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6782 /* Re-check if peer violates maximum-prefix. */
6783 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
6784 bgp_maximum_prefix_overflow(peer
, afi
, safi
, 1);
6786 /* Skip peer-group mechanics for regular peers. */
6791 * Set flags and configuration on all peer-group members, unless they
6792 * are explicitely overriding peer-group configuration.
6794 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6795 /* Skip peers with overridden configuration. */
6796 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6797 PEER_FLAG_MAX_PREFIX
))
6800 /* Set flag and configuration on peer-group member. */
6801 member
->pmax
[afi
][safi
] = max
;
6802 member
->pmax_threshold
[afi
][safi
] = threshold
;
6803 member
->pmax_restart
[afi
][safi
] = restart
;
6806 SET_FLAG(member
->af_flags
[afi
][safi
],
6807 PEER_FLAG_MAX_PREFIX_FORCE
);
6809 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6810 PEER_FLAG_MAX_PREFIX_FORCE
);
6813 SET_FLAG(member
->af_flags
[afi
][safi
],
6814 PEER_FLAG_MAX_PREFIX_WARNING
);
6816 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6817 PEER_FLAG_MAX_PREFIX_WARNING
);
6819 /* Re-check if peer violates maximum-prefix. */
6820 if ((member
->status
== Established
) && (member
->afc
[afi
][safi
]))
6821 bgp_maximum_prefix_overflow(member
, afi
, safi
, 1);
6827 int peer_maximum_prefix_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6829 /* Inherit configuration from peer-group if peer is member. */
6830 if (peer_group_active(peer
)) {
6831 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6832 peer_af_flag_inherit(peer
, afi
, safi
,
6833 PEER_FLAG_MAX_PREFIX_FORCE
);
6834 peer_af_flag_inherit(peer
, afi
, safi
,
6835 PEER_FLAG_MAX_PREFIX_WARNING
);
6836 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax
[afi
][safi
]);
6837 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_threshold
[afi
][safi
]);
6838 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_restart
[afi
][safi
]);
6843 /* Remove flags and configuration from peer. */
6844 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6845 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_FORCE
);
6846 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
6847 peer
->pmax
[afi
][safi
] = 0;
6848 peer
->pmax_threshold
[afi
][safi
] = 0;
6849 peer
->pmax_restart
[afi
][safi
] = 0;
6852 * Remove flags and configuration from all peer-group members, unless
6853 * they are explicitely overriding peer-group configuration.
6855 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6856 struct peer
*member
;
6857 struct listnode
*node
;
6859 for (ALL_LIST_ELEMENTS_RO(peer
->group
->peer
, node
, member
)) {
6860 /* Skip peers with overridden configuration. */
6861 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6862 PEER_FLAG_MAX_PREFIX
))
6865 /* Remove flag and configuration on peer-group member.
6867 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6868 PEER_FLAG_MAX_PREFIX
);
6869 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6870 PEER_FLAG_MAX_PREFIX_FORCE
);
6871 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6872 PEER_FLAG_MAX_PREFIX_WARNING
);
6873 member
->pmax
[afi
][safi
] = 0;
6874 member
->pmax_threshold
[afi
][safi
] = 0;
6875 member
->pmax_restart
[afi
][safi
] = 0;
6882 int is_ebgp_multihop_configured(struct peer
*peer
)
6884 struct peer_group
*group
;
6885 struct listnode
*node
, *nnode
;
6888 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6889 group
= peer
->group
;
6890 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
6891 && (group
->conf
->ttl
!= BGP_DEFAULT_TTL
))
6894 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer1
)) {
6895 if ((peer_sort(peer1
) != BGP_PEER_IBGP
)
6896 && (peer1
->ttl
!= BGP_DEFAULT_TTL
))
6900 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
6901 && (peer
->ttl
!= BGP_DEFAULT_TTL
))
6907 /* Set # of hops between us and BGP peer. */
6908 int peer_ttl_security_hops_set(struct peer
*peer
, int gtsm_hops
)
6910 struct peer_group
*group
;
6911 struct listnode
*node
, *nnode
;
6914 zlog_debug("peer_ttl_security_hops_set: set gtsm_hops to %d for %s",
6915 gtsm_hops
, peer
->host
);
6917 /* We cannot configure ttl-security hops when ebgp-multihop is already
6918 set. For non peer-groups, the check is simple. For peer-groups,
6920 slightly messy, because we need to check both the peer-group
6922 and all peer-group members for any trace of ebgp-multihop
6924 before actually applying the ttl-security rules. Cisco really made a
6925 mess of this configuration parameter, and OpenBGPD got it right.
6928 if ((peer
->gtsm_hops
== BGP_GTSM_HOPS_DISABLED
)
6929 && (peer
->sort
!= BGP_PEER_IBGP
)) {
6930 if (is_ebgp_multihop_configured(peer
))
6931 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
6933 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6934 peer
->gtsm_hops
= gtsm_hops
;
6936 /* Calling ebgp multihop also resets the session.
6937 * On restart, NHT will get setup correctly as will the
6938 * min & max ttls on the socket. The return value is
6941 ret
= peer_ebgp_multihop_set(peer
, MAXTTL
);
6946 group
= peer
->group
;
6947 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
6949 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
6951 /* Calling ebgp multihop also resets the
6953 * On restart, NHT will get setup correctly as
6955 * min & max ttls on the socket. The return
6959 peer_ebgp_multihop_set(peer
, MAXTTL
);
6963 /* Post the first gtsm setup or if its ibgp, maxttl setting
6965 * necessary, just set the minttl.
6967 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6968 peer
->gtsm_hops
= gtsm_hops
;
6971 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
6972 MAXTTL
+ 1 - gtsm_hops
);
6973 if ((peer
->status
< Established
) && peer
->doppelganger
6974 && (peer
->doppelganger
->fd
>= 0))
6975 sockopt_minttl(peer
->su
.sa
.sa_family
,
6976 peer
->doppelganger
->fd
,
6977 MAXTTL
+ 1 - gtsm_hops
);
6979 group
= peer
->group
;
6980 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
6982 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
6984 /* Change setting of existing peer
6985 * established then change value (may break
6987 * not established yet (teardown session and
6989 * no session then do nothing (will get
6990 * handled by next connection)
6994 != BGP_GTSM_HOPS_DISABLED
)
6996 peer
->su
.sa
.sa_family
, peer
->fd
,
6997 MAXTTL
+ 1 - peer
->gtsm_hops
);
6998 if ((peer
->status
< Established
)
6999 && peer
->doppelganger
7000 && (peer
->doppelganger
->fd
>= 0))
7001 sockopt_minttl(peer
->su
.sa
.sa_family
,
7002 peer
->doppelganger
->fd
,
7003 MAXTTL
+ 1 - gtsm_hops
);
7011 int peer_ttl_security_hops_unset(struct peer
*peer
)
7013 struct peer_group
*group
;
7014 struct listnode
*node
, *nnode
;
7017 zlog_debug("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s",
7020 /* if a peer-group member, then reset to peer-group default rather than
7022 if (peer_group_active(peer
))
7023 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
7025 peer
->gtsm_hops
= BGP_GTSM_HOPS_DISABLED
;
7027 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
7028 /* Invoking ebgp_multihop_set will set the TTL back to the
7030 * value as well as restting the NHT and such. The session is
7033 if (peer
->sort
== BGP_PEER_EBGP
)
7034 ret
= peer_ebgp_multihop_unset(peer
);
7037 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
7040 if ((peer
->status
< Established
) && peer
->doppelganger
7041 && (peer
->doppelganger
->fd
>= 0))
7042 sockopt_minttl(peer
->su
.sa
.sa_family
,
7043 peer
->doppelganger
->fd
, 0);
7046 group
= peer
->group
;
7047 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
7048 peer
->gtsm_hops
= BGP_GTSM_HOPS_DISABLED
;
7049 if (peer
->sort
== BGP_PEER_EBGP
)
7050 ret
= peer_ebgp_multihop_unset(peer
);
7053 sockopt_minttl(peer
->su
.sa
.sa_family
,
7056 if ((peer
->status
< Established
)
7057 && peer
->doppelganger
7058 && (peer
->doppelganger
->fd
>= 0))
7059 sockopt_minttl(peer
->su
.sa
.sa_family
,
7060 peer
->doppelganger
->fd
,
7070 * If peer clear is invoked in a loop for all peers on the BGP instance,
7071 * it may end up freeing the doppelganger, and if this was the next node
7072 * to the current node, we would end up accessing the freed next node.
7073 * Pass along additional parameter which can be updated if next node
7074 * is freed; only required when walking the peer list on BGP instance.
7076 int peer_clear(struct peer
*peer
, struct listnode
**nnode
)
7078 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
7079 || !CHECK_FLAG(peer
->bgp
->flags
, BGP_FLAG_SHUTDOWN
)) {
7080 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
7081 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
7082 if (peer
->t_pmax_restart
) {
7083 BGP_TIMER_OFF(peer
->t_pmax_restart
);
7084 if (bgp_debug_neighbor_events(peer
))
7086 "%s Maximum-prefix restart timer canceled",
7089 BGP_EVENT_ADD(peer
, BGP_Start
);
7093 peer
->v_start
= BGP_INIT_START_TIMER
;
7094 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
7095 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
7096 BGP_NOTIFY_CEASE_ADMIN_RESET
);
7098 bgp_session_reset_safe(peer
, nnode
);
7103 int peer_clear_soft(struct peer
*peer
, afi_t afi
, safi_t safi
,
7104 enum bgp_clear_type stype
)
7106 struct peer_af
*paf
;
7108 if (peer
->status
!= Established
)
7111 if (!peer
->afc
[afi
][safi
])
7112 return BGP_ERR_AF_UNCONFIGURED
;
7114 peer
->rtt
= sockopt_tcp_rtt(peer
->fd
);
7116 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
) {
7117 /* Clear the "neighbor x.x.x.x default-originate" flag */
7118 paf
= peer_af_find(peer
, afi
, safi
);
7119 if (paf
&& paf
->subgroup
7120 && CHECK_FLAG(paf
->subgroup
->sflags
,
7121 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
7122 UNSET_FLAG(paf
->subgroup
->sflags
,
7123 SUBGRP_STATUS_DEFAULT_ORIGINATE
);
7125 bgp_announce_route(peer
, afi
, safi
);
7128 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
7129 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7130 PEER_CAP_ORF_PREFIX_SM_ADV
)
7131 && (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7132 PEER_CAP_ORF_PREFIX_RM_RCV
)
7133 || CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7134 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))) {
7135 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
7136 uint8_t prefix_type
;
7138 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
7139 PEER_CAP_ORF_PREFIX_RM_RCV
))
7140 prefix_type
= ORF_TYPE_PREFIX
;
7142 prefix_type
= ORF_TYPE_PREFIX_OLD
;
7144 if (filter
->plist
[FILTER_IN
].plist
) {
7145 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
7146 PEER_STATUS_ORF_PREFIX_SEND
))
7147 bgp_route_refresh_send(
7148 peer
, afi
, safi
, prefix_type
,
7150 bgp_route_refresh_send(peer
, afi
, safi
,
7152 REFRESH_IMMEDIATE
, 0);
7154 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
7155 PEER_STATUS_ORF_PREFIX_SEND
))
7156 bgp_route_refresh_send(
7157 peer
, afi
, safi
, prefix_type
,
7158 REFRESH_IMMEDIATE
, 1);
7160 bgp_route_refresh_send(peer
, afi
, safi
,
7167 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
7168 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
7169 /* If neighbor has soft reconfiguration inbound flag.
7170 Use Adj-RIB-In database. */
7171 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
7172 PEER_FLAG_SOFT_RECONFIG
))
7173 bgp_soft_reconfig_in(peer
, afi
, safi
);
7175 /* If neighbor has route refresh capability, send route
7177 message to the peer. */
7178 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
7179 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
7180 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0,
7183 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
7189 /* Display peer uptime.*/
7190 char *peer_uptime(time_t uptime2
, char *buf
, size_t len
, bool use_json
,
7193 time_t uptime1
, epoch_tbuf
;
7196 /* If there is no connection has been done before print `never'. */
7199 json_object_string_add(json
, "peerUptime", "never");
7200 json_object_int_add(json
, "peerUptimeMsec", 0);
7202 snprintf(buf
, len
, "never");
7206 /* Get current time. */
7207 uptime1
= bgp_clock();
7209 gmtime_r(&uptime1
, &tm
);
7211 if (uptime1
< ONE_DAY_SECOND
)
7212 snprintf(buf
, len
, "%02d:%02d:%02d", tm
.tm_hour
, tm
.tm_min
,
7214 else if (uptime1
< ONE_WEEK_SECOND
)
7215 snprintf(buf
, len
, "%dd%02dh%02dm", tm
.tm_yday
, tm
.tm_hour
,
7217 else if (uptime1
< ONE_YEAR_SECOND
)
7218 snprintf(buf
, len
, "%02dw%dd%02dh", tm
.tm_yday
/ 7,
7219 tm
.tm_yday
- ((tm
.tm_yday
/ 7) * 7), tm
.tm_hour
);
7221 snprintf(buf
, len
, "%02dy%02dw%dd", tm
.tm_year
- 70,
7223 tm
.tm_yday
- ((tm
.tm_yday
/ 7) * 7));
7226 epoch_tbuf
= time(NULL
) - uptime1
;
7227 json_object_string_add(json
, "peerUptime", buf
);
7228 json_object_int_add(json
, "peerUptimeMsec", uptime1
* 1000);
7229 json_object_int_add(json
, "peerUptimeEstablishedEpoch",
7236 void bgp_master_init(struct thread_master
*master
, const int buffer_size
)
7240 memset(&bgp_master
, 0, sizeof(struct bgp_master
));
7243 bm
->bgp
= list_new();
7244 bm
->listen_sockets
= list_new();
7245 bm
->port
= BGP_PORT_DEFAULT
;
7246 bm
->master
= master
;
7247 bm
->start_time
= bgp_clock();
7248 bm
->t_rmap_update
= NULL
;
7249 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
7250 bm
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
7251 bm
->v_establish_wait
= BGP_UPDATE_DELAY_DEF
;
7252 bm
->terminating
= false;
7253 bm
->socket_buffer
= buffer_size
;
7256 /* init the rd id space.
7257 assign 0th index in the bitfield,
7258 so that we start with id 1
7260 bf_init(bm
->rd_idspace
, UINT16_MAX
);
7261 bf_assign_zero_index(bm
->rd_idspace
);
7263 /* mpls label dynamic allocation pool */
7264 bgp_lp_init(bm
->master
, &bm
->labelpool
);
7267 QOBJ_REG(bm
, bgp_master
);
7271 * Free up connected routes and interfaces for a BGP instance. Invoked upon
7272 * instance delete (non-default only) or BGP exit.
7274 static void bgp_if_finish(struct bgp
*bgp
)
7277 struct interface
*ifp
;
7279 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
7281 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
|| !vrf
)
7284 FOR_ALL_INTERFACES (vrf
, ifp
) {
7285 struct listnode
*c_node
, *c_nnode
;
7286 struct connected
*c
;
7288 for (ALL_LIST_ELEMENTS(ifp
->connected
, c_node
, c_nnode
, c
))
7289 bgp_connected_delete(bgp
, c
);
7293 static void bgp_viewvrf_autocomplete(vector comps
, struct cmd_token
*token
)
7295 struct vrf
*vrf
= NULL
;
7296 struct listnode
*next
;
7299 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
7300 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, vrf
->name
));
7302 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
7303 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_VIEW
)
7306 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, bgp
->name
));
7310 static void bgp_instasn_autocomplete(vector comps
, struct cmd_token
*token
)
7312 struct listnode
*next
, *next2
;
7313 struct bgp
*bgp
, *bgp2
;
7316 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
7318 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next2
, bgp2
)) {
7319 if (bgp2
->as
== bgp
->as
)
7327 snprintf(buf
, sizeof(buf
), "%u", bgp
->as
);
7328 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, buf
));
7332 static const struct cmd_variable_handler bgp_viewvrf_var_handlers
[] = {
7333 {.tokenname
= "VIEWVRFNAME", .completions
= bgp_viewvrf_autocomplete
},
7334 {.varname
= "instasn", .completions
= bgp_instasn_autocomplete
},
7335 {.completions
= NULL
},
7338 struct frr_pthread
*bgp_pth_io
;
7339 struct frr_pthread
*bgp_pth_ka
;
7341 static void bgp_pthreads_init(void)
7343 assert(!bgp_pth_io
);
7344 assert(!bgp_pth_ka
);
7346 struct frr_pthread_attr io
= {
7347 .start
= frr_pthread_attr_default
.start
,
7348 .stop
= frr_pthread_attr_default
.stop
,
7350 struct frr_pthread_attr ka
= {
7351 .start
= bgp_keepalives_start
,
7352 .stop
= bgp_keepalives_stop
,
7354 bgp_pth_io
= frr_pthread_new(&io
, "BGP I/O thread", "bgpd_io");
7355 bgp_pth_ka
= frr_pthread_new(&ka
, "BGP Keepalives thread", "bgpd_ka");
7358 void bgp_pthreads_run(void)
7360 frr_pthread_run(bgp_pth_io
, NULL
);
7361 frr_pthread_run(bgp_pth_ka
, NULL
);
7363 /* Wait until threads are ready. */
7364 frr_pthread_wait_running(bgp_pth_io
);
7365 frr_pthread_wait_running(bgp_pth_ka
);
7368 void bgp_pthreads_finish(void)
7370 frr_pthread_stop_all();
7373 void bgp_init(unsigned short instance
)
7376 /* allocates some vital data structures used by peer commands in
7379 /* pre-init pthreads */
7380 bgp_pthreads_init();
7383 bgp_zebra_init(bm
->master
, instance
);
7385 #ifdef ENABLE_BGP_VNC
7386 vnc_zebra_init(bm
->master
);
7389 /* BGP VTY commands installation. */
7397 bgp_route_map_init();
7398 bgp_scan_vty_init();
7400 #ifdef ENABLE_BGP_VNC
7403 bgp_ethernetvpn_init();
7404 bgp_flowspec_vty_init();
7406 /* Access list initialize. */
7408 access_list_add_hook(peer_distribute_update
);
7409 access_list_delete_hook(peer_distribute_update
);
7411 /* Filter list initialize. */
7413 as_list_add_hook(peer_aslist_add
);
7414 as_list_delete_hook(peer_aslist_del
);
7416 /* Prefix list initialize.*/
7418 prefix_list_add_hook(peer_prefix_list_update
);
7419 prefix_list_delete_hook(peer_prefix_list_update
);
7421 /* Community list initialize. */
7422 bgp_clist
= community_list_init();
7427 cmd_variable_handler_register(bgp_viewvrf_var_handlers
);
7430 void bgp_terminate(void)
7434 struct listnode
*node
, *nnode
;
7435 struct listnode
*mnode
, *mnnode
;
7439 /* Close the listener sockets first as this prevents peers from
7441 * to reconnect on receiving the peer unconfig message. In the presence
7442 * of a large number of peers this will ensure that no peer is left with
7443 * a dangling connection
7445 /* reverse bgp_master_init */
7448 if (bm
->listen_sockets
)
7449 list_delete(&bm
->listen_sockets
);
7451 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
))
7452 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
7453 if (peer
->status
== Established
7454 || peer
->status
== OpenSent
7455 || peer
->status
== OpenConfirm
)
7456 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
7457 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
7459 if (bm
->t_rmap_update
)
7460 BGP_TIMER_OFF(bm
->t_rmap_update
);
7465 struct peer
*peer_lookup_in_view(struct vty
*vty
, struct bgp
*bgp
,
7466 const char *ip_str
, bool use_json
)
7472 /* Get peer sockunion. */
7473 ret
= str2sockunion(ip_str
, &su
);
7475 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
7477 peer
= peer_lookup_by_hostname(bgp
, ip_str
);
7481 json_object
*json_no
= NULL
;
7482 json_no
= json_object_new_object();
7483 json_object_string_add(
7485 "malformedAddressOrName",
7487 vty_out(vty
, "%s\n",
7488 json_object_to_json_string_ext(
7490 JSON_C_TO_STRING_PRETTY
));
7491 json_object_free(json_no
);
7494 "%% Malformed address or name: %s\n",
7502 /* Peer structure lookup. */
7503 peer
= peer_lookup(bgp
, &su
);
7506 json_object
*json_no
= NULL
;
7507 json_no
= json_object_new_object();
7508 json_object_string_add(json_no
, "warning",
7509 "No such neighbor in this view/vrf");
7510 vty_out(vty
, "%s\n",
7511 json_object_to_json_string_ext(
7512 json_no
, JSON_C_TO_STRING_PRETTY
));
7513 json_object_free(json_no
);
7515 vty_out(vty
, "No such neighbor in this view/vrf\n");
7522 void bgp_gr_apply_running_config(void)
7524 struct peer
*peer
= NULL
;
7525 struct bgp
*bgp
= NULL
;
7526 struct listnode
*node
, *nnode
;
7527 bool gr_router_detected
= false;
7529 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
7530 zlog_debug("[BGP_GR] %s called !", __func__
);
7532 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
7533 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7534 bgp_peer_gr_flags_update(peer
);
7535 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
7536 gr_router_detected
= true;
7539 if (gr_router_detected
7540 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
7541 bgp_zebra_send_capabilities(bgp
, true);
7542 } else if (!gr_router_detected
7543 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
7544 bgp_zebra_send_capabilities(bgp
, false);
7547 gr_router_detected
= false;