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_attr.h"
58 #include "bgpd/bgp_regex.h"
59 #include "bgpd/bgp_clist.h"
60 #include "bgpd/bgp_fsm.h"
61 #include "bgpd/bgp_packet.h"
62 #include "bgpd/bgp_zebra.h"
63 #include "bgpd/bgp_open.h"
64 #include "bgpd/bgp_filter.h"
65 #include "bgpd/bgp_nexthop.h"
66 #include "bgpd/bgp_damp.h"
67 #include "bgpd/bgp_mplsvpn.h"
69 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
70 #include "bgpd/rfapi/rfapi_backend.h"
72 #include "bgpd/bgp_evpn.h"
73 #include "bgpd/bgp_advertise.h"
74 #include "bgpd/bgp_network.h"
75 #include "bgpd/bgp_vty.h"
76 #include "bgpd/bgp_mpath.h"
77 #include "bgpd/bgp_nht.h"
78 #include "bgpd/bgp_updgrp.h"
79 #include "bgpd/bgp_bfd.h"
80 #include "bgpd/bgp_memory.h"
81 #include "bgpd/bgp_evpn_vty.h"
82 #include "bgpd/bgp_keepalives.h"
83 #include "bgpd/bgp_io.h"
84 #include "bgpd/bgp_ecommunity.h"
85 #include "bgpd/bgp_flowspec.h"
86 #include "bgpd/bgp_labelpool.h"
87 #include "bgpd/bgp_pbr.h"
88 #include "bgpd/bgp_addpath.h"
89 #include "bgpd/bgp_evpn_private.h"
90 #include "bgpd/bgp_mac.h"
92 DEFINE_MTYPE_STATIC(BGPD
, PEER_TX_SHUTDOWN_MSG
, "Peer shutdown message (TX)");
93 DEFINE_MTYPE_STATIC(BGPD
, BGP_EVPN_INFO
, "BGP EVPN instance information");
94 DEFINE_QOBJ_TYPE(bgp_master
)
96 DEFINE_QOBJ_TYPE(peer
)
97 DEFINE_HOOK(bgp_inst_delete
, (struct bgp
*bgp
), (bgp
))
99 /* BGP process wide configuration. */
100 static struct bgp_master bgp_master
;
102 /* BGP process wide configuration pointer to export. */
103 struct bgp_master
*bm
;
105 /* BGP community-list. */
106 struct community_list_handler
*bgp_clist
;
108 unsigned int multipath_num
= MULTIPATH_NUM
;
110 static void bgp_if_finish(struct bgp
*bgp
);
111 static void peer_drop_dynamic_neighbor(struct peer
*peer
);
113 extern struct zclient
*zclient
;
115 /* handle main socket creation or deletion */
116 static int bgp_check_main_socket(bool create
, struct bgp
*bgp
)
118 static int bgp_server_main_created
;
121 if (bgp_server_main_created
)
123 if (bgp_socket(bgp
, bm
->port
, bm
->address
) < 0)
124 return BGP_ERR_INVALID_VALUE
;
125 bgp_server_main_created
= 1;
128 if (!bgp_server_main_created
)
131 bgp_server_main_created
= 0;
135 void bgp_session_reset(struct peer
*peer
)
137 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
138 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
139 peer_delete(peer
->doppelganger
);
141 BGP_EVENT_ADD(peer
, BGP_Stop
);
145 * During session reset, we may delete the doppelganger peer, which would
146 * be the next node to the current node. If the session reset was invoked
147 * during walk of peer list, we would end up accessing the freed next
148 * node. This function moves the next node along.
150 static void bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
155 n
= (nnode
) ? *nnode
: NULL
;
156 npeer
= (n
) ? listgetdata(n
) : NULL
;
158 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
159 && !(CHECK_FLAG(peer
->doppelganger
->flags
,
160 PEER_FLAG_CONFIG_NODE
))) {
161 if (peer
->doppelganger
== npeer
)
162 /* nnode and *nnode are confirmed to be non-NULL here */
163 *nnode
= (*nnode
)->next
;
164 peer_delete(peer
->doppelganger
);
167 BGP_EVENT_ADD(peer
, BGP_Stop
);
170 /* BGP global flag manipulation. */
171 int bgp_option_set(int flag
)
175 case BGP_OPT_NO_LISTEN
:
176 case BGP_OPT_NO_ZEBRA
:
177 SET_FLAG(bm
->options
, flag
);
180 return BGP_ERR_INVALID_FLAG
;
185 int bgp_option_unset(int flag
)
189 case BGP_OPT_NO_ZEBRA
:
191 UNSET_FLAG(bm
->options
, flag
);
194 return BGP_ERR_INVALID_FLAG
;
199 int bgp_option_check(int flag
)
201 return CHECK_FLAG(bm
->options
, flag
);
204 /* BGP flag manipulation. */
205 int bgp_flag_set(struct bgp
*bgp
, int flag
)
207 SET_FLAG(bgp
->flags
, flag
);
211 int bgp_flag_unset(struct bgp
*bgp
, int flag
)
213 UNSET_FLAG(bgp
->flags
, flag
);
217 int bgp_flag_check(struct bgp
*bgp
, int flag
)
219 return CHECK_FLAG(bgp
->flags
, flag
);
222 /* Internal function to set BGP structure configureation flag. */
223 static void bgp_config_set(struct bgp
*bgp
, int config
)
225 SET_FLAG(bgp
->config
, config
);
228 static void bgp_config_unset(struct bgp
*bgp
, int config
)
230 UNSET_FLAG(bgp
->config
, config
);
233 static int bgp_config_check(struct bgp
*bgp
, int config
)
235 return CHECK_FLAG(bgp
->config
, config
);
238 /* Set BGP router identifier; distinguish between explicit config and other
241 static int bgp_router_id_set(struct bgp
*bgp
, const struct in_addr
*id
,
245 struct listnode
*node
, *nnode
;
247 if (IPV4_ADDR_SAME(&bgp
->router_id
, id
))
250 /* EVPN uses router id in RD, withdraw them */
251 if (is_evpn_enabled())
252 bgp_evpn_handle_router_id_update(bgp
, true);
254 vpn_handle_router_id_update(bgp
, true, is_config
);
256 IPV4_ADDR_COPY(&bgp
->router_id
, id
);
258 /* Set all peer's local identifier with this value. */
259 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
260 IPV4_ADDR_COPY(&peer
->local_id
, id
);
262 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
263 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
264 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
265 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
269 /* EVPN uses router id in RD, update them */
270 if (is_evpn_enabled())
271 bgp_evpn_handle_router_id_update(bgp
, false);
273 vpn_handle_router_id_update(bgp
, false, is_config
);
278 void bgp_router_id_zebra_bump(vrf_id_t vrf_id
, const struct prefix
*router_id
)
280 struct listnode
*node
, *nnode
;
282 struct in_addr
*addr
= NULL
;
284 if (router_id
!= NULL
)
285 addr
= (struct in_addr
*)&(router_id
->u
.prefix4
);
287 if (vrf_id
== VRF_DEFAULT
) {
288 /* Router-id change for default VRF has to also update all
290 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
291 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
295 bgp
->router_id_zebra
= *addr
;
297 addr
= &bgp
->router_id_zebra
;
299 if (!bgp
->router_id_static
.s_addr
) {
300 /* Router ID is updated if there are no active
303 if (bgp
->established_peers
== 0) {
304 if (BGP_DEBUG(zebra
, ZEBRA
))
305 zlog_debug("RID change : vrf %u, RTR ID %s",
306 bgp
->vrf_id
, inet_ntoa(*addr
));
307 bgp_router_id_set(bgp
, addr
, false);
312 bgp
= bgp_lookup_by_vrf_id(vrf_id
);
315 bgp
->router_id_zebra
= *addr
;
317 addr
= &bgp
->router_id_zebra
;
319 if (!bgp
->router_id_static
.s_addr
) {
320 /* Router ID is updated if there are no active
323 if (bgp
->established_peers
== 0) {
324 if (BGP_DEBUG(zebra
, ZEBRA
))
325 zlog_debug("RID change : vrf %u, RTR ID %s",
326 bgp
->vrf_id
, inet_ntoa(*addr
));
327 bgp_router_id_set(bgp
, addr
, false);
335 int bgp_router_id_static_set(struct bgp
*bgp
, struct in_addr id
)
337 bgp
->router_id_static
= id
;
338 bgp_router_id_set(bgp
, id
.s_addr
? &id
: &bgp
->router_id_zebra
,
339 true /* is config */);
343 /* BGP's cluster-id control. */
344 int bgp_cluster_id_set(struct bgp
*bgp
, struct in_addr
*cluster_id
)
347 struct listnode
*node
, *nnode
;
349 if (bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
)
350 && IPV4_ADDR_SAME(&bgp
->cluster_id
, cluster_id
))
353 IPV4_ADDR_COPY(&bgp
->cluster_id
, cluster_id
);
354 bgp_config_set(bgp
, BGP_CONFIG_CLUSTER_ID
);
356 /* Clear all IBGP peer. */
357 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
358 if (peer
->sort
!= BGP_PEER_IBGP
)
361 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
362 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
363 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
364 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
370 int bgp_cluster_id_unset(struct bgp
*bgp
)
373 struct listnode
*node
, *nnode
;
375 if (!bgp_config_check(bgp
, BGP_CONFIG_CLUSTER_ID
))
378 bgp
->cluster_id
.s_addr
= 0;
379 bgp_config_unset(bgp
, BGP_CONFIG_CLUSTER_ID
);
381 /* Clear all IBGP peer. */
382 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
383 if (peer
->sort
!= BGP_PEER_IBGP
)
386 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
387 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
388 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
389 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
395 /* time_t value that is monotonicly increasing
396 * and uneffected by adjustments to system clock
398 time_t bgp_clock(void)
406 /* BGP timer configuration. */
407 int bgp_timers_set(struct bgp
*bgp
, uint32_t keepalive
, uint32_t holdtime
,
408 uint32_t connect_retry
)
410 bgp
->default_keepalive
=
411 (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
412 bgp
->default_holdtime
= holdtime
;
413 bgp
->default_connect_retry
= connect_retry
;
418 /* mostly for completeness - CLI uses its own defaults */
419 int bgp_timers_unset(struct bgp
*bgp
)
421 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
422 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
423 bgp
->default_connect_retry
= BGP_DEFAULT_CONNECT_RETRY
;
428 /* BGP confederation configuration. */
429 int bgp_confederation_id_set(struct bgp
*bgp
, as_t as
)
432 struct listnode
*node
, *nnode
;
436 return BGP_ERR_INVALID_AS
;
438 /* Remember - were we doing confederation before? */
439 already_confed
= bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
);
441 bgp_config_set(bgp
, BGP_CONFIG_CONFEDERATION
);
443 /* If we were doing confederation already, this is just an external
444 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
445 were not doing confederation before, reset all EBGP sessions. */
446 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
447 /* We're looking for peers who's AS is not local or part of our
449 if (already_confed
) {
450 if (peer_sort(peer
) == BGP_PEER_EBGP
) {
452 if (BGP_IS_VALID_STATE_FOR_NOTIF(
455 PEER_DOWN_CONFED_ID_CHANGE
;
457 peer
, BGP_NOTIFY_CEASE
,
458 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
460 bgp_session_reset_safe(peer
, &nnode
);
463 /* Not doign confederation before, so reset every
466 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
467 /* Reset the local_as to be our EBGP one */
468 if (peer_sort(peer
) == BGP_PEER_EBGP
)
470 if (BGP_IS_VALID_STATE_FOR_NOTIF(
473 PEER_DOWN_CONFED_ID_CHANGE
;
475 peer
, BGP_NOTIFY_CEASE
,
476 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
478 bgp_session_reset_safe(peer
, &nnode
);
485 int bgp_confederation_id_unset(struct bgp
*bgp
)
488 struct listnode
*node
, *nnode
;
491 bgp_config_unset(bgp
, BGP_CONFIG_CONFEDERATION
);
493 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
494 /* We're looking for peers who's AS is not local */
495 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
496 peer
->local_as
= bgp
->as
;
497 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
498 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
499 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
500 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
504 bgp_session_reset_safe(peer
, &nnode
);
510 /* Is an AS part of the confed or not? */
511 int bgp_confederation_peers_check(struct bgp
*bgp
, as_t as
)
518 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
519 if (bgp
->confed_peers
[i
] == as
)
525 /* Add an AS to the confederation set. */
526 int bgp_confederation_peers_add(struct bgp
*bgp
, as_t as
)
529 struct listnode
*node
, *nnode
;
532 return BGP_ERR_INVALID_BGP
;
535 return BGP_ERR_INVALID_AS
;
537 if (bgp_confederation_peers_check(bgp
, as
))
540 if (bgp
->confed_peers
)
542 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
543 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
546 XMALLOC(MTYPE_BGP_CONFED_LIST
,
547 (bgp
->confed_peers_cnt
+ 1) * sizeof(as_t
));
549 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
550 bgp
->confed_peers_cnt
++;
552 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
553 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
554 if (peer
->as
== as
) {
555 peer
->local_as
= bgp
->as
;
556 if (BGP_IS_VALID_STATE_FOR_NOTIF(
559 PEER_DOWN_CONFED_PEER_CHANGE
;
561 peer
, BGP_NOTIFY_CEASE
,
562 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
564 bgp_session_reset_safe(peer
, &nnode
);
571 /* Delete an AS from the confederation set. */
572 int bgp_confederation_peers_remove(struct bgp
*bgp
, as_t as
)
577 struct listnode
*node
, *nnode
;
582 if (!bgp_confederation_peers_check(bgp
, as
))
585 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
586 if (bgp
->confed_peers
[i
] == as
)
587 for (j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
588 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
590 bgp
->confed_peers_cnt
--;
592 if (bgp
->confed_peers_cnt
== 0) {
593 if (bgp
->confed_peers
)
594 XFREE(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
595 bgp
->confed_peers
= NULL
;
598 XREALLOC(MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
,
599 bgp
->confed_peers_cnt
* sizeof(as_t
));
601 /* Now reset any peer who's remote AS has just been removed from the
603 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)) {
604 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
605 if (peer
->as
== as
) {
606 peer
->local_as
= bgp
->confed_id
;
607 if (BGP_IS_VALID_STATE_FOR_NOTIF(
610 PEER_DOWN_CONFED_PEER_CHANGE
;
612 peer
, BGP_NOTIFY_CEASE
,
613 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
615 bgp_session_reset_safe(peer
, &nnode
);
623 /* Local preference configuration. */
624 int bgp_default_local_preference_set(struct bgp
*bgp
, uint32_t local_pref
)
629 bgp
->default_local_pref
= local_pref
;
634 int bgp_default_local_preference_unset(struct bgp
*bgp
)
639 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
644 /* Local preference configuration. */
645 int bgp_default_subgroup_pkt_queue_max_set(struct bgp
*bgp
, uint32_t queue_size
)
650 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
655 int bgp_default_subgroup_pkt_queue_max_unset(struct bgp
*bgp
)
659 bgp
->default_subgroup_pkt_queue_max
=
660 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
665 /* Listen limit configuration. */
666 int bgp_listen_limit_set(struct bgp
*bgp
, int listen_limit
)
671 bgp
->dynamic_neighbors_limit
= listen_limit
;
676 int bgp_listen_limit_unset(struct bgp
*bgp
)
681 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
686 int bgp_map_afi_safi_iana2int(iana_afi_t pkt_afi
, iana_safi_t pkt_safi
,
687 afi_t
*afi
, safi_t
*safi
)
689 /* Map from IANA values to internal values, return error if
690 * values are unrecognized.
692 *afi
= afi_iana2int(pkt_afi
);
693 *safi
= safi_iana2int(pkt_safi
);
694 if (*afi
== AFI_MAX
|| *safi
== SAFI_MAX
)
700 int bgp_map_afi_safi_int2iana(afi_t afi
, safi_t safi
, iana_afi_t
*pkt_afi
,
701 iana_safi_t
*pkt_safi
)
703 /* Map from internal values to IANA values, return error if
704 * internal values are bad (unexpected).
706 if (afi
== AFI_MAX
|| safi
== SAFI_MAX
)
708 *pkt_afi
= afi_int2iana(afi
);
709 *pkt_safi
= safi_int2iana(safi
);
713 struct peer_af
*peer_af_create(struct peer
*peer
, afi_t afi
, safi_t safi
)
722 afid
= afindex(afi
, safi
);
723 if (afid
>= BGP_AF_MAX
)
727 assert(peer
->peer_af_array
[afid
] == NULL
);
729 /* Allocate new peer af */
730 af
= XCALLOC(MTYPE_BGP_PEER_AF
, sizeof(struct peer_af
));
732 peer
->peer_af_array
[afid
] = af
;
737 bgp
->af_peer_count
[afi
][safi
]++;
742 struct peer_af
*peer_af_find(struct peer
*peer
, afi_t afi
, safi_t safi
)
749 afid
= afindex(afi
, safi
);
750 if (afid
>= BGP_AF_MAX
)
753 return peer
->peer_af_array
[afid
];
756 int peer_af_delete(struct peer
*peer
, afi_t afi
, safi_t safi
)
765 afid
= afindex(afi
, safi
);
766 if (afid
>= BGP_AF_MAX
)
769 af
= peer
->peer_af_array
[afid
];
774 bgp_stop_announce_route_timer(af
);
776 if (PAF_SUBGRP(af
)) {
777 if (BGP_DEBUG(update_groups
, UPDATE_GROUPS
))
778 zlog_debug("u%" PRIu64
":s%" PRIu64
" remove peer %s",
779 af
->subgroup
->update_group
->id
,
780 af
->subgroup
->id
, peer
->host
);
784 update_subgroup_remove_peer(af
->subgroup
, af
);
786 if (bgp
->af_peer_count
[afi
][safi
])
787 bgp
->af_peer_count
[afi
][safi
]--;
789 peer
->peer_af_array
[afid
] = NULL
;
790 XFREE(MTYPE_BGP_PEER_AF
, af
);
794 /* Peer comparison function for sorting. */
795 int peer_cmp(struct peer
*p1
, struct peer
*p2
)
797 if (p1
->group
&& !p2
->group
)
800 if (!p1
->group
&& p2
->group
)
803 if (p1
->group
== p2
->group
) {
804 if (p1
->conf_if
&& !p2
->conf_if
)
807 if (!p1
->conf_if
&& p2
->conf_if
)
810 if (p1
->conf_if
&& p2
->conf_if
)
811 return if_cmp_name_func(p1
->conf_if
, p2
->conf_if
);
813 return strcmp(p1
->group
->name
, p2
->group
->name
);
815 return sockunion_cmp(&p1
->su
, &p2
->su
);
818 static unsigned int peer_hash_key_make(const void *p
)
820 const struct peer
*peer
= p
;
821 return sockunion_hash(&peer
->su
);
824 static bool peer_hash_same(const void *p1
, const void *p2
)
826 const struct peer
*peer1
= p1
;
827 const struct peer
*peer2
= p2
;
828 return (sockunion_same(&peer1
->su
, &peer2
->su
)
829 && CHECK_FLAG(peer1
->flags
, PEER_FLAG_CONFIG_NODE
)
830 == CHECK_FLAG(peer2
->flags
, PEER_FLAG_CONFIG_NODE
));
833 void peer_flag_inherit(struct peer
*peer
, uint32_t flag
)
837 /* Skip if peer is not a peer-group member. */
838 if (!peer_group_active(peer
))
841 /* Unset override flag to signal inheritance from peer-group. */
842 UNSET_FLAG(peer
->flags_override
, flag
);
845 * Inherit flag state from peer-group. If the flag of the peer-group is
846 * not being inverted, the peer must inherit the inverse of the current
847 * peer-group flag state.
849 group_val
= CHECK_FLAG(peer
->group
->conf
->flags
, flag
);
850 if (!CHECK_FLAG(peer
->group
->conf
->flags_invert
, flag
)
851 && CHECK_FLAG(peer
->flags_invert
, flag
))
852 COND_FLAG(peer
->flags
, flag
, !group_val
);
854 COND_FLAG(peer
->flags
, flag
, group_val
);
857 int peer_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
859 return CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
);
862 void peer_af_flag_inherit(struct peer
*peer
, afi_t afi
, safi_t safi
,
867 /* Skip if peer is not a peer-group member. */
868 if (!peer_group_active(peer
))
871 /* Unset override flag to signal inheritance from peer-group. */
872 UNSET_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
875 * Inherit flag state from peer-group. If the flag of the peer-group is
876 * not being inverted, the peer must inherit the inverse of the current
877 * peer-group flag state.
879 group_val
= CHECK_FLAG(peer
->group
->conf
->af_flags
[afi
][safi
], flag
);
880 if (!CHECK_FLAG(peer
->group
->conf
->af_flags_invert
[afi
][safi
], flag
)
881 && CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
882 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, !group_val
);
884 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, group_val
);
887 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
888 static inline bgp_peer_sort_t
peer_calc_sort(struct peer
*peer
)
895 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
896 if (peer
->as_type
== AS_INTERNAL
)
897 return BGP_PEER_IBGP
;
899 else if (peer
->as_type
== AS_EXTERNAL
)
900 return BGP_PEER_EBGP
;
902 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
) {
904 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
912 peer1
= listnode_head(peer
->group
->peer
);
917 return BGP_PEER_INTERNAL
;
921 if (bgp
&& CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)) {
922 if (peer
->local_as
== 0)
923 return BGP_PEER_INTERNAL
;
925 if (peer
->local_as
== peer
->as
) {
926 if (bgp
->as
== bgp
->confed_id
) {
927 if (peer
->local_as
== bgp
->as
)
928 return BGP_PEER_IBGP
;
930 return BGP_PEER_EBGP
;
932 if (peer
->local_as
== bgp
->confed_id
)
933 return BGP_PEER_EBGP
;
935 return BGP_PEER_IBGP
;
939 if (bgp_confederation_peers_check(bgp
, peer
->as
))
940 return BGP_PEER_CONFED
;
942 return BGP_PEER_EBGP
;
944 if (peer
->as_type
== AS_UNSPECIFIED
) {
945 /* check if in peer-group with AS information */
947 && (peer
->group
->conf
->as_type
!= AS_UNSPECIFIED
)) {
948 if (peer
->group
->conf
->as_type
951 == peer
->group
->conf
->as
)
952 return BGP_PEER_IBGP
;
954 return BGP_PEER_EBGP
;
955 } else if (peer
->group
->conf
->as_type
957 return BGP_PEER_IBGP
;
959 return BGP_PEER_EBGP
;
961 /* no AS information anywhere, let caller know */
962 return BGP_PEER_UNSPECIFIED
;
963 } else if (peer
->as_type
!= AS_SPECIFIED
)
964 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
967 return (peer
->local_as
== 0
969 : peer
->local_as
== peer
->as
? BGP_PEER_IBGP
974 /* Calculate and cache the peer "sort" */
975 bgp_peer_sort_t
peer_sort(struct peer
*peer
)
977 peer
->sort
= peer_calc_sort(peer
);
981 static void peer_free(struct peer
*peer
)
986 assert(peer
->status
== Deleted
);
990 /* this /ought/ to have been done already through bgp_stop earlier,
991 * but just to be sure..
995 bgp_writes_off(peer
);
996 assert(!peer
->t_write
);
997 assert(!peer
->t_read
);
998 BGP_EVENT_FLUSH(peer
);
1000 pthread_mutex_destroy(&peer
->io_mtx
);
1002 /* Free connected nexthop, if present */
1003 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
)
1004 && !peer_dynamic_neighbor(peer
))
1005 bgp_delete_connected_nexthop(family2afi(peer
->su
.sa
.sa_family
),
1008 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
1011 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
1015 /* Free allocated host character. */
1017 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1021 if (peer
->domainname
) {
1022 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
1023 peer
->domainname
= NULL
;
1027 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
1028 peer
->ifname
= NULL
;
1031 /* Update source configuration. */
1032 if (peer
->update_source
) {
1033 sockunion_free(peer
->update_source
);
1034 peer
->update_source
= NULL
;
1037 if (peer
->update_if
) {
1038 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1039 peer
->update_if
= NULL
;
1042 XFREE(MTYPE_TMP
, peer
->notify
.data
);
1043 memset(&peer
->notify
, 0, sizeof(struct bgp_notify
));
1045 if (peer
->clear_node_queue
)
1046 work_queue_free_and_null(&peer
->clear_node_queue
);
1048 bgp_sync_delete(peer
);
1050 if (peer
->conf_if
) {
1051 XFREE(MTYPE_PEER_CONF_IF
, peer
->conf_if
);
1052 peer
->conf_if
= NULL
;
1055 bfd_info_free(&(peer
->bfd_info
));
1057 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
1058 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++) {
1059 bgp_addpath_set_peer_type(peer
, afi
, safi
,
1064 bgp_unlock(peer
->bgp
);
1066 memset(peer
, 0, sizeof(struct peer
));
1068 XFREE(MTYPE_BGP_PEER
, peer
);
1071 /* increase reference count on a struct peer */
1072 struct peer
*peer_lock_with_caller(const char *name
, struct peer
*peer
)
1074 assert(peer
&& (peer
->lock
>= 0));
1077 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
1085 /* decrease reference count on a struct peer
1086 * struct peer is freed and NULL returned if last reference
1088 struct peer
*peer_unlock_with_caller(const char *name
, struct peer
*peer
)
1090 assert(peer
&& (peer
->lock
> 0));
1093 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1098 if (peer
->lock
== 0) {
1105 /* BGP GR changes */
1107 int bgp_global_gr_init(struct bgp
*bgp
)
1109 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1110 zlog_debug("%s called ..", __func__
);
1112 int local_GLOBAL_GR_FSM
[BGP_GLOBAL_GR_MODE
][BGP_GLOBAL_GR_EVENT_CMD
] = {
1113 /* GLOBAL_HELPER Mode */
1116 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1117 GLOBAL_GR
, GLOBAL_INVALID
,
1118 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1119 GLOBAL_DISABLE
, GLOBAL_INVALID
1121 /* GLOBAL_GR Mode */
1124 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1125 GLOBAL_INVALID
, GLOBAL_HELPER
,
1126 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1127 GLOBAL_DISABLE
, GLOBAL_INVALID
1129 /* GLOBAL_DISABLE Mode */
1132 /*GLOBAL_GR_cmd */ /*no_Global_GR_cmd*/
1133 GLOBAL_GR
, GLOBAL_INVALID
,
1134 /*GLOBAL_DISABLE_cmd*//*no_Global_Disable_cmd*/
1135 GLOBAL_INVALID
, GLOBAL_HELPER
1137 /* GLOBAL_INVALID Mode */
1140 /*GLOBAL_GR_cmd*/ /*no_Global_GR_cmd*/
1141 GLOBAL_INVALID
, GLOBAL_INVALID
,
1142 /*GLOBAL_DISABLE_cmd*/ /*no_Global_Disable_cmd*/
1143 GLOBAL_INVALID
, GLOBAL_INVALID
1146 memcpy(bgp
->GLOBAL_GR_FSM
, local_GLOBAL_GR_FSM
,
1147 sizeof(local_GLOBAL_GR_FSM
));
1149 bgp
->global_gr_present_state
= GLOBAL_HELPER
;
1150 bgp
->present_zebra_gr_state
= ZEBRA_GR_DISABLE
;
1152 return BGP_GR_SUCCESS
;
1155 int bgp_peer_gr_init(struct peer
*peer
)
1157 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1158 zlog_debug("%s called ..", __func__
);
1160 struct bgp_peer_gr local_Peer_GR_FSM
[BGP_PEER_GR_MODE
]
1161 [BGP_PEER_GR_EVENT_CMD
] = {
1163 /* PEER_HELPER Mode */
1164 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1165 { PEER_GR
, bgp_peer_gr_action
}, {PEER_INVALID
, NULL
},
1166 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1167 {PEER_DISABLE
, bgp_peer_gr_action
}, {PEER_INVALID
, NULL
},
1168 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1169 { PEER_INVALID
, NULL
}, {PEER_GLOBAL_INHERIT
,
1170 bgp_peer_gr_action
}
1174 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1175 { PEER_INVALID
, NULL
}, { PEER_GLOBAL_INHERIT
,
1176 bgp_peer_gr_action
},
1177 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1178 {PEER_DISABLE
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1179 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1180 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1183 /* PEER_DISABLE Mode */
1184 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1185 { PEER_GR
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1186 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1187 { PEER_INVALID
, NULL
}, { PEER_GLOBAL_INHERIT
,
1188 bgp_peer_gr_action
},
1189 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1190 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1193 /* PEER_INVALID Mode */
1194 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1195 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1196 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1197 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1198 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1199 { PEER_INVALID
, NULL
}, { PEER_INVALID
, NULL
},
1202 /* PEER_GLOBAL_INHERIT Mode */
1203 /* Event-> */ /* PEER_GR_CMD */ /* NO_PEER_GR_CMD */
1204 { PEER_GR
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1205 /* Event-> */ /* PEER_DISABLE_CMD */ /* NO_PEER_DISABLE_CMD */
1206 { PEER_DISABLE
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
},
1207 /* Event-> */ /* PEER_HELPER_cmd */ /* NO_PEER_HELPER_CMD */
1208 { PEER_HELPER
, bgp_peer_gr_action
}, { PEER_INVALID
, NULL
}
1211 memcpy(&peer
->PEER_GR_FSM
, local_Peer_GR_FSM
,
1212 sizeof(local_Peer_GR_FSM
));
1213 peer
->peer_gr_present_state
= PEER_GLOBAL_INHERIT
;
1214 bgp_peer_move_to_gr_mode(peer
, PEER_GLOBAL_INHERIT
);
1216 return BGP_GR_SUCCESS
;
1219 /* Allocate new peer object, implicitely locked. */
1220 struct peer
*peer_new(struct bgp
*bgp
)
1227 /* bgp argument is absolutely required */
1232 /* Allocate new peer. */
1233 peer
= XCALLOC(MTYPE_BGP_PEER
, sizeof(struct peer
));
1235 /* Set default value. */
1237 peer
->v_start
= BGP_INIT_START_TIMER
;
1238 peer
->v_connect
= bgp
->default_connect_retry
;
1239 peer
->status
= Idle
;
1240 peer
->ostatus
= Idle
;
1241 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1242 peer
->bgp
= bgp_lock(bgp
);
1243 peer
= peer_lock(peer
); /* initial reference */
1244 peer
->password
= NULL
;
1246 /* Set default flags. */
1247 FOREACH_AFI_SAFI (afi
, safi
) {
1248 SET_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1249 SET_FLAG(peer
->af_flags
[afi
][safi
],
1250 PEER_FLAG_SEND_EXT_COMMUNITY
);
1251 SET_FLAG(peer
->af_flags
[afi
][safi
],
1252 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1254 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1255 PEER_FLAG_SEND_COMMUNITY
);
1256 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1257 PEER_FLAG_SEND_EXT_COMMUNITY
);
1258 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1259 PEER_FLAG_SEND_LARGE_COMMUNITY
);
1260 peer
->addpath_type
[afi
][safi
] = BGP_ADDPATH_NONE
;
1263 /* set nexthop-unchanged for l2vpn evpn by default */
1264 SET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1265 PEER_FLAG_NEXTHOP_UNCHANGED
);
1267 SET_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1269 /* Initialize per peer bgp GR FSM */
1270 bgp_peer_gr_init(peer
);
1272 /* Create buffers. */
1273 peer
->ibuf
= stream_fifo_new();
1274 peer
->obuf
= stream_fifo_new();
1275 pthread_mutex_init(&peer
->io_mtx
, NULL
);
1277 /* We use a larger buffer for peer->obuf_work in the event that:
1278 * - We RX a BGP_UPDATE where the attributes alone are just
1279 * under BGP_MAX_PACKET_SIZE
1280 * - The user configures an outbound route-map that does many as-path
1281 * prepends or adds many communities. At most they can have
1282 * CMD_ARGC_MAX args in a route-map so there is a finite limit on how
1283 * large they can make the attributes.
1285 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid
1286 * bounds checking for every single attribute as we construct an
1290 stream_new(BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1292 ringbuf_new(BGP_MAX_PACKET_SIZE
* BGP_READ_PACKET_MAX
);
1294 peer
->scratch
= stream_new(BGP_MAX_PACKET_SIZE
);
1296 bgp_sync_init(peer
);
1298 /* Get service port number. */
1299 sp
= getservbyname("bgp", "tcp");
1300 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
1302 QOBJ_REG(peer
, peer
);
1307 * This function is invoked when a duplicate peer structure associated with
1308 * a neighbor is being deleted. If this about-to-be-deleted structure is
1309 * the one with all the config, then we have to copy over the info.
1311 void peer_xfer_config(struct peer
*peer_dst
, struct peer
*peer_src
)
1313 struct peer_af
*paf
;
1321 /* The following function is used by both peer group config copy to
1322 * individual peer and when we transfer config
1324 if (peer_src
->change_local_as
)
1325 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1327 /* peer flags apply */
1328 peer_dst
->flags
= peer_src
->flags
;
1329 peer_dst
->cap
= peer_src
->cap
;
1331 peer_dst
->peer_gr_present_state
= peer_src
->peer_gr_present_state
;
1332 peer_dst
->peer_gr_new_status_flag
= peer_src
->peer_gr_new_status_flag
;
1334 peer_dst
->local_as
= peer_src
->local_as
;
1335 peer_dst
->port
= peer_src
->port
;
1336 (void)peer_sort(peer_dst
);
1337 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1340 peer_dst
->holdtime
= peer_src
->holdtime
;
1341 peer_dst
->keepalive
= peer_src
->keepalive
;
1342 peer_dst
->connect
= peer_src
->connect
;
1343 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1344 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1345 peer_dst
->routeadv
= peer_src
->routeadv
;
1346 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1348 /* password apply */
1349 if (peer_src
->password
&& !peer_dst
->password
)
1350 peer_dst
->password
=
1351 XSTRDUP(MTYPE_PEER_PASSWORD
, peer_src
->password
);
1353 FOREACH_AFI_SAFI (afi
, safi
) {
1354 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1355 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1356 peer_dst
->allowas_in
[afi
][safi
] =
1357 peer_src
->allowas_in
[afi
][safi
];
1358 peer_dst
->weight
[afi
][safi
] = peer_src
->weight
[afi
][safi
];
1359 peer_dst
->addpath_type
[afi
][safi
] =
1360 peer_src
->addpath_type
[afi
][safi
];
1363 for (afidx
= BGP_AF_START
; afidx
< BGP_AF_MAX
; afidx
++) {
1364 paf
= peer_src
->peer_af_array
[afidx
];
1366 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1369 /* update-source apply */
1370 if (peer_src
->update_source
) {
1371 if (peer_dst
->update_source
)
1372 sockunion_free(peer_dst
->update_source
);
1373 if (peer_dst
->update_if
) {
1374 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1375 peer_dst
->update_if
= NULL
;
1377 peer_dst
->update_source
=
1378 sockunion_dup(peer_src
->update_source
);
1379 } else if (peer_src
->update_if
) {
1380 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1381 if (peer_dst
->update_source
) {
1382 sockunion_free(peer_dst
->update_source
);
1383 peer_dst
->update_source
= NULL
;
1385 peer_dst
->update_if
=
1386 XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1389 if (peer_src
->ifname
) {
1390 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1393 XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1397 static int bgp_peer_conf_if_to_su_update_v4(struct peer
*peer
,
1398 struct interface
*ifp
)
1400 struct connected
*ifc
;
1403 struct listnode
*node
;
1405 /* If our IPv4 address on the interface is /30 or /31, we can derive the
1406 * IPv4 address of the other end.
1408 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
)) {
1409 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
)) {
1410 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1411 if (p
.prefixlen
== 30) {
1412 peer
->su
.sa
.sa_family
= AF_INET
;
1413 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1415 peer
->su
.sin
.sin_addr
.s_addr
=
1417 else if (addr
% 4 == 2)
1418 peer
->su
.sin
.sin_addr
.s_addr
=
1420 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1421 peer
->su
.sin
.sin_len
=
1422 sizeof(struct sockaddr_in
);
1423 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1425 } else if (p
.prefixlen
== 31) {
1426 peer
->su
.sa
.sa_family
= AF_INET
;
1427 addr
= ntohl(p
.u
.prefix4
.s_addr
);
1429 peer
->su
.sin
.sin_addr
.s_addr
=
1432 peer
->su
.sin
.sin_addr
.s_addr
=
1434 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1435 peer
->su
.sin
.sin_len
=
1436 sizeof(struct sockaddr_in
);
1437 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1439 } else if (bgp_debug_neighbor_events(peer
))
1441 "%s: IPv4 interface address is not /30 or /31, v4 session not started",
1449 static int bgp_peer_conf_if_to_su_update_v6(struct peer
*peer
,
1450 struct interface
*ifp
)
1452 struct nbr_connected
*ifc_nbr
;
1454 /* Have we learnt the peer's IPv6 link-local address? */
1455 if (ifp
->nbr_connected
1456 && (ifc_nbr
= listnode_head(ifp
->nbr_connected
))) {
1457 peer
->su
.sa
.sa_family
= AF_INET6
;
1458 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1459 sizeof(struct in6_addr
));
1461 peer
->su
.sin6
.sin6_len
= sizeof(struct sockaddr_in6
);
1463 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1471 * Set or reset the peer address socketunion structure based on the
1472 * learnt/derived peer address. If the address has changed, update the
1473 * password on the listen socket, if needed.
1475 void bgp_peer_conf_if_to_su_update(struct peer
*peer
)
1477 struct interface
*ifp
;
1479 int peer_addr_updated
= 0;
1485 * Our peer structure is stored in the bgp->peerhash
1486 * release it before we modify anything.
1488 hash_release(peer
->bgp
->peerhash
, peer
);
1490 prev_family
= peer
->su
.sa
.sa_family
;
1491 if ((ifp
= if_lookup_by_name(peer
->conf_if
, peer
->bgp
->vrf_id
))) {
1493 /* If BGP unnumbered is not "v6only", we first see if we can
1495 * peer's IPv4 address.
1497 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1499 bgp_peer_conf_if_to_su_update_v4(peer
, ifp
);
1501 /* If "v6only" or we can't derive peer's IPv4 address, see if
1503 * learnt the peer's IPv6 link-local address. This is from the
1505 * IPv6 address in router advertisement.
1507 if (!peer_addr_updated
)
1509 bgp_peer_conf_if_to_su_update_v6(peer
, ifp
);
1511 /* If we could derive the peer address, we may need to install the
1513 * configured for the peer, if any, on the listen socket. Otherwise,
1515 * that peer's address is not available and uninstall the password, if
1518 if (peer_addr_updated
) {
1519 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1520 && prev_family
== AF_UNSPEC
)
1523 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)
1524 && prev_family
!= AF_UNSPEC
)
1525 bgp_md5_unset(peer
);
1526 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1527 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof(struct in6_addr
));
1531 * Since our su changed we need to del/add peer to the peerhash
1533 hash_get(peer
->bgp
->peerhash
, peer
, hash_alloc_intern
);
1536 static void bgp_recalculate_afi_safi_bestpaths(struct bgp
*bgp
, afi_t afi
,
1539 struct bgp_node
*rn
, *nrn
;
1540 struct bgp_table
*table
;
1542 for (rn
= bgp_table_top(bgp
->rib
[afi
][safi
]); rn
;
1543 rn
= bgp_route_next(rn
)) {
1544 table
= bgp_node_get_bgp_table_info(rn
);
1545 if (table
!= NULL
) {
1546 /* Special handling for 2-level routing
1548 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
1549 || safi
== SAFI_EVPN
) {
1550 for (nrn
= bgp_table_top(table
);
1551 nrn
; nrn
= bgp_route_next(nrn
))
1552 bgp_process(bgp
, nrn
, afi
, safi
);
1554 bgp_process(bgp
, rn
, afi
, safi
);
1559 /* Force a bestpath recalculation for all prefixes. This is used
1560 * when 'bgp bestpath' commands are entered.
1562 void bgp_recalculate_all_bestpaths(struct bgp
*bgp
)
1567 FOREACH_AFI_SAFI (afi
, safi
) {
1568 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, safi
);
1573 * Create new BGP peer.
1575 * conf_if and su are mutually exclusive if configuring from the cli.
1576 * If we are handing a doppelganger, then we *must* pass in both
1577 * the original peer's su and conf_if, so that we can appropriately
1578 * track the bgp->peerhash( ie we don't want to remove the current
1579 * one from the config ).
1581 struct peer
*peer_create(union sockunion
*su
, const char *conf_if
,
1582 struct bgp
*bgp
, as_t local_as
, as_t remote_as
,
1583 int as_type
, afi_t afi
, safi_t safi
,
1584 struct peer_group
*group
)
1588 char buf
[SU_ADDRSTRLEN
];
1590 peer
= peer_new(bgp
);
1592 peer
->conf_if
= XSTRDUP(MTYPE_PEER_CONF_IF
, conf_if
);
1596 bgp_peer_conf_if_to_su_update(peer
);
1597 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1598 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, conf_if
);
1601 sockunion2str(su
, buf
, SU_ADDRSTRLEN
);
1602 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1603 peer
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, buf
);
1605 peer
->local_as
= local_as
;
1606 peer
->as
= remote_as
;
1607 peer
->as_type
= as_type
;
1608 peer
->local_id
= bgp
->router_id
;
1609 peer
->v_holdtime
= bgp
->default_holdtime
;
1610 peer
->v_keepalive
= bgp
->default_keepalive
;
1611 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
1612 ? BGP_DEFAULT_IBGP_ROUTEADV
1613 : BGP_DEFAULT_EBGP_ROUTEADV
;
1615 peer
= peer_lock(peer
); /* bgp peer list reference */
1616 peer
->group
= group
;
1617 listnode_add_sort(bgp
->peer
, peer
);
1618 hash_get(bgp
->peerhash
, peer
, hash_alloc_intern
);
1620 /* Adjust update-group coalesce timer heuristics for # peers. */
1621 if (bgp
->heuristic_coalesce
) {
1622 long ct
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
1624 * BGP_PEER_ADJUST_SUBGROUP_COALESCE_TIME
);
1625 bgp
->coalesce_time
= MIN(BGP_MAX_SUBGROUP_COALESCE_TIME
, ct
);
1628 active
= peer_active(peer
);
1630 if (peer
->su
.sa
.sa_family
== AF_UNSPEC
)
1631 peer
->last_reset
= PEER_DOWN_NBR_ADDR
;
1633 peer
->last_reset
= PEER_DOWN_NOAFI_ACTIVATED
;
1636 /* Last read and reset time set */
1637 peer
->readtime
= peer
->resettime
= bgp_clock();
1639 /* Default TTL set. */
1640 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? MAXTTL
: BGP_DEFAULT_TTL
;
1642 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1645 peer
->afc
[afi
][safi
] = 1;
1646 peer_af_create(peer
, afi
, safi
);
1649 /* auto shutdown if configured */
1650 if (bgp
->autoshutdown
)
1651 peer_flag_set(peer
, PEER_FLAG_SHUTDOWN
);
1652 /* Set up peer's events and timers. */
1653 else if (!active
&& peer_active(peer
))
1654 bgp_timer_set(peer
);
1656 bgp_peer_gr_flags_update(peer
);
1657 BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(
1664 /* Make accept BGP peer. This function is only called from the test code */
1665 struct peer
*peer_create_accept(struct bgp
*bgp
)
1669 peer
= peer_new(bgp
);
1671 peer
= peer_lock(peer
); /* bgp peer list reference */
1672 listnode_add_sort(bgp
->peer
, peer
);
1678 * Return true if we have a peer configured to use this afi/safi
1680 int bgp_afi_safi_peer_exists(struct bgp
*bgp
, afi_t afi
, safi_t safi
)
1682 struct listnode
*node
;
1685 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, node
, peer
)) {
1686 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1689 if (peer
->afc
[afi
][safi
])
1696 /* Change peer's AS number. */
1697 void peer_as_change(struct peer
*peer
, as_t as
, int as_specified
)
1699 bgp_peer_sort_t type
;
1702 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1703 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
1704 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1705 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
1706 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1708 bgp_session_reset(peer
);
1710 type
= peer_sort(peer
);
1712 peer
->as_type
= as_specified
;
1714 if (bgp_config_check(peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1715 && !bgp_confederation_peers_check(peer
->bgp
, as
)
1716 && peer
->bgp
->as
!= as
)
1717 peer
->local_as
= peer
->bgp
->confed_id
;
1719 peer
->local_as
= peer
->bgp
->as
;
1721 /* Advertisement-interval reset */
1722 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_ROUTEADV
)) {
1723 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
1724 ? BGP_DEFAULT_IBGP_ROUTEADV
1725 : BGP_DEFAULT_EBGP_ROUTEADV
;
1729 if (peer_sort(peer
) == BGP_PEER_IBGP
)
1731 else if (type
== BGP_PEER_IBGP
)
1732 peer
->ttl
= BGP_DEFAULT_TTL
;
1734 /* reflector-client reset */
1735 if (peer_sort(peer
) != BGP_PEER_IBGP
) {
1736 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1737 PEER_FLAG_REFLECTOR_CLIENT
);
1738 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1739 PEER_FLAG_REFLECTOR_CLIENT
);
1740 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_LABELED_UNICAST
],
1741 PEER_FLAG_REFLECTOR_CLIENT
);
1742 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1743 PEER_FLAG_REFLECTOR_CLIENT
);
1744 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_ENCAP
],
1745 PEER_FLAG_REFLECTOR_CLIENT
);
1746 UNSET_FLAG(peer
->af_flags
[AFI_IP
][SAFI_FLOWSPEC
],
1747 PEER_FLAG_REFLECTOR_CLIENT
);
1748 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1749 PEER_FLAG_REFLECTOR_CLIENT
);
1750 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1751 PEER_FLAG_REFLECTOR_CLIENT
);
1752 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_LABELED_UNICAST
],
1753 PEER_FLAG_REFLECTOR_CLIENT
);
1754 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_MPLS_VPN
],
1755 PEER_FLAG_REFLECTOR_CLIENT
);
1756 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_ENCAP
],
1757 PEER_FLAG_REFLECTOR_CLIENT
);
1758 UNSET_FLAG(peer
->af_flags
[AFI_IP6
][SAFI_FLOWSPEC
],
1759 PEER_FLAG_REFLECTOR_CLIENT
);
1760 UNSET_FLAG(peer
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1761 PEER_FLAG_REFLECTOR_CLIENT
);
1764 /* local-as reset */
1765 if (peer_sort(peer
) != BGP_PEER_EBGP
) {
1766 peer
->change_local_as
= 0;
1767 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
1768 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1769 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1773 /* If peer does not exist, create new one. If peer already exists,
1774 set AS number to the peer. */
1775 int peer_remote_as(struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1776 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1782 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
1784 peer
= peer_lookup(bgp
, su
);
1787 /* Not allowed for a dynamic peer. */
1788 if (peer_dynamic_neighbor(peer
)) {
1790 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1793 /* When this peer is a member of peer-group. */
1795 /* peer-group already has AS number/internal/external */
1796 if (peer
->group
->conf
->as
1797 || peer
->group
->conf
->as_type
) {
1798 /* Return peer group's AS number. */
1799 *as
= peer
->group
->conf
->as
;
1800 return BGP_ERR_PEER_GROUP_MEMBER
;
1803 bgp_peer_sort_t peer_sort_type
=
1804 peer_sort(peer
->group
->conf
);
1806 /* Explicit AS numbers used, compare AS numbers */
1807 if (as_type
== AS_SPECIFIED
) {
1808 if (((peer_sort_type
== BGP_PEER_IBGP
)
1809 && (bgp
->as
!= *as
))
1810 || ((peer_sort_type
== BGP_PEER_EBGP
)
1811 && (bgp
->as
== *as
))) {
1813 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1816 /* internal/external used, compare as-types */
1817 if (((peer_sort_type
== BGP_PEER_IBGP
)
1818 && (as_type
!= AS_INTERNAL
))
1819 || ((peer_sort_type
== BGP_PEER_EBGP
)
1820 && (as_type
!= AS_EXTERNAL
))) {
1822 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1827 /* Existing peer's AS number change. */
1828 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
1829 || (peer
->as_type
!= as_type
))
1830 peer_as_change(peer
, *as
, as_type
);
1833 return BGP_ERR_NO_INTERFACE_CONFIG
;
1835 /* If the peer is not part of our confederation, and its not an
1836 iBGP peer then spoof the source AS */
1837 if (bgp_config_check(bgp
, BGP_CONFIG_CONFEDERATION
)
1838 && !bgp_confederation_peers_check(bgp
, *as
)
1840 local_as
= bgp
->confed_id
;
1844 /* If this is IPv4 unicast configuration and "no bgp default
1845 ipv4-unicast" is specified. */
1847 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1848 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1849 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0,
1852 peer_create(su
, conf_if
, bgp
, local_as
, *as
, as_type
,
1859 static void peer_group2peer_config_copy_af(struct peer_group
*group
,
1860 struct peer
*peer
, afi_t afi
,
1864 int out
= FILTER_OUT
;
1866 uint32_t pflags_ovrd
;
1867 uint8_t *pfilter_ovrd
;
1871 pflags_ovrd
= peer
->af_flags_override
[afi
][safi
];
1872 pfilter_ovrd
= &peer
->filter_override
[afi
][safi
][in
];
1874 /* peer af_flags apply */
1875 flags_tmp
= conf
->af_flags
[afi
][safi
] & ~pflags_ovrd
;
1876 flags_tmp
^= conf
->af_flags_invert
[afi
][safi
]
1877 ^ peer
->af_flags_invert
[afi
][safi
];
1878 flags_tmp
&= ~pflags_ovrd
;
1880 UNSET_FLAG(peer
->af_flags
[afi
][safi
], ~pflags_ovrd
);
1881 SET_FLAG(peer
->af_flags
[afi
][safi
], flags_tmp
);
1882 SET_FLAG(peer
->af_flags_invert
[afi
][safi
],
1883 conf
->af_flags_invert
[afi
][safi
]);
1885 /* maximum-prefix */
1886 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_MAX_PREFIX
)) {
1887 PEER_ATTR_INHERIT(peer
, group
, pmax
[afi
][safi
]);
1888 PEER_ATTR_INHERIT(peer
, group
, pmax_threshold
[afi
][safi
]);
1889 PEER_ATTR_INHERIT(peer
, group
, pmax_restart
[afi
][safi
]);
1893 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_ALLOWAS_IN
))
1894 PEER_ATTR_INHERIT(peer
, group
, allowas_in
[afi
][safi
]);
1897 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_WEIGHT
))
1898 PEER_ATTR_INHERIT(peer
, group
, weight
[afi
][safi
]);
1900 /* default-originate route-map */
1901 if (!CHECK_FLAG(pflags_ovrd
, PEER_FLAG_DEFAULT_ORIGINATE
)) {
1902 PEER_STR_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].name
,
1903 MTYPE_ROUTE_MAP_NAME
);
1904 PEER_ATTR_INHERIT(peer
, group
, default_rmap
[afi
][safi
].map
);
1907 /* inbound filter apply */
1908 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_DISTRIBUTE_LIST
)) {
1909 PEER_STR_ATTR_INHERIT(peer
, group
,
1910 filter
[afi
][safi
].dlist
[in
].name
,
1911 MTYPE_BGP_FILTER_NAME
);
1912 PEER_ATTR_INHERIT(peer
, group
,
1913 filter
[afi
][safi
].dlist
[in
].alist
);
1916 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_PREFIX_LIST
)) {
1917 PEER_STR_ATTR_INHERIT(peer
, group
,
1918 filter
[afi
][safi
].plist
[in
].name
,
1919 MTYPE_BGP_FILTER_NAME
);
1920 PEER_ATTR_INHERIT(peer
, group
,
1921 filter
[afi
][safi
].plist
[in
].plist
);
1924 if (!CHECK_FLAG(pfilter_ovrd
[in
], PEER_FT_FILTER_LIST
)) {
1925 PEER_STR_ATTR_INHERIT(peer
, group
,
1926 filter
[afi
][safi
].aslist
[in
].name
,
1927 MTYPE_BGP_FILTER_NAME
);
1928 PEER_ATTR_INHERIT(peer
, group
,
1929 filter
[afi
][safi
].aslist
[in
].aslist
);
1932 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_IN
], PEER_FT_ROUTE_MAP
)) {
1933 PEER_STR_ATTR_INHERIT(peer
, group
,
1934 filter
[afi
][safi
].map
[in
].name
,
1935 MTYPE_BGP_FILTER_NAME
);
1936 PEER_ATTR_INHERIT(peer
, group
,
1937 filter
[afi
][safi
].map
[RMAP_IN
].map
);
1940 /* outbound filter apply */
1941 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_DISTRIBUTE_LIST
)) {
1942 PEER_STR_ATTR_INHERIT(peer
, group
,
1943 filter
[afi
][safi
].dlist
[out
].name
,
1944 MTYPE_BGP_FILTER_NAME
);
1945 PEER_ATTR_INHERIT(peer
, group
,
1946 filter
[afi
][safi
].dlist
[out
].alist
);
1949 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_PREFIX_LIST
)) {
1950 PEER_STR_ATTR_INHERIT(peer
, group
,
1951 filter
[afi
][safi
].plist
[out
].name
,
1952 MTYPE_BGP_FILTER_NAME
);
1953 PEER_ATTR_INHERIT(peer
, group
,
1954 filter
[afi
][safi
].plist
[out
].plist
);
1957 if (!CHECK_FLAG(pfilter_ovrd
[out
], PEER_FT_FILTER_LIST
)) {
1958 PEER_STR_ATTR_INHERIT(peer
, group
,
1959 filter
[afi
][safi
].aslist
[out
].name
,
1960 MTYPE_BGP_FILTER_NAME
);
1961 PEER_ATTR_INHERIT(peer
, group
,
1962 filter
[afi
][safi
].aslist
[out
].aslist
);
1965 if (!CHECK_FLAG(pfilter_ovrd
[RMAP_OUT
], PEER_FT_ROUTE_MAP
)) {
1966 PEER_STR_ATTR_INHERIT(peer
, group
,
1967 filter
[afi
][safi
].map
[RMAP_OUT
].name
,
1968 MTYPE_BGP_FILTER_NAME
);
1969 PEER_ATTR_INHERIT(peer
, group
,
1970 filter
[afi
][safi
].map
[RMAP_OUT
].map
);
1973 /* nondirectional filter apply */
1974 if (!CHECK_FLAG(pfilter_ovrd
[0], PEER_FT_UNSUPPRESS_MAP
)) {
1975 PEER_STR_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.name
,
1976 MTYPE_BGP_FILTER_NAME
);
1977 PEER_ATTR_INHERIT(peer
, group
, filter
[afi
][safi
].usmap
.map
);
1980 if (peer
->addpath_type
[afi
][safi
] == BGP_ADDPATH_NONE
) {
1981 peer
->addpath_type
[afi
][safi
] = conf
->addpath_type
[afi
][safi
];
1982 bgp_addpath_type_changed(conf
->bgp
);
1986 static int peer_activate_af(struct peer
*peer
, afi_t afi
, safi_t safi
)
1991 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
1992 flog_err(EC_BGP_PEER_GROUP
, "%s was called for peer-group %s",
1993 __func__
, peer
->host
);
1997 /* Do not activate a peer for both SAFI_UNICAST and SAFI_LABELED_UNICAST
1999 if ((safi
== SAFI_UNICAST
&& peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
2000 || (safi
== SAFI_LABELED_UNICAST
&& peer
->afc
[afi
][SAFI_UNICAST
]))
2001 return BGP_ERR_PEER_SAFI_CONFLICT
;
2003 /* Nothing to do if we've already activated this peer */
2004 if (peer
->afc
[afi
][safi
])
2007 if (peer_af_create(peer
, afi
, safi
) == NULL
)
2010 active
= peer_active(peer
);
2011 peer
->afc
[afi
][safi
] = 1;
2014 peer_group2peer_config_copy_af(peer
->group
, peer
, afi
, safi
);
2016 if (!active
&& peer_active(peer
)) {
2017 bgp_timer_set(peer
);
2019 if (peer
->status
== Established
) {
2020 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2021 peer
->afc_adv
[afi
][safi
] = 1;
2022 bgp_capability_send(peer
, afi
, safi
,
2024 CAPABILITY_ACTION_SET
);
2025 if (peer
->afc_recv
[afi
][safi
]) {
2026 peer
->afc_nego
[afi
][safi
] = 1;
2027 bgp_announce_route(peer
, afi
, safi
);
2030 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2031 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2032 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2035 if (peer
->status
== OpenSent
|| peer
->status
== OpenConfirm
) {
2036 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2037 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2038 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2041 * If we are turning on a AFI/SAFI locally and we've
2042 * started bringing a peer up, we need to tell
2043 * the other peer to restart because we might loose
2044 * configuration here because when the doppelganger
2045 * gets to a established state due to how
2046 * we resolve we could just overwrite the afi/safi
2049 other
= peer
->doppelganger
;
2051 && (other
->status
== OpenSent
2052 || other
->status
== OpenConfirm
)) {
2053 other
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
2054 bgp_notify_send(other
, BGP_NOTIFY_CEASE
,
2055 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2062 /* Activate the peer or peer group for specified AFI and SAFI. */
2063 int peer_activate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2066 struct peer_group
*group
;
2067 struct listnode
*node
, *nnode
;
2068 struct peer
*tmp_peer
;
2071 /* Nothing to do if we've already activated this peer */
2072 if (peer
->afc
[afi
][safi
])
2077 /* This is a peer-group so activate all of the members of the
2078 * peer-group as well */
2079 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2081 /* Do not activate a peer for both SAFI_UNICAST and
2082 * SAFI_LABELED_UNICAST */
2083 if ((safi
== SAFI_UNICAST
2084 && peer
->afc
[afi
][SAFI_LABELED_UNICAST
])
2085 || (safi
== SAFI_LABELED_UNICAST
2086 && peer
->afc
[afi
][SAFI_UNICAST
]))
2087 return BGP_ERR_PEER_SAFI_CONFLICT
;
2089 peer
->afc
[afi
][safi
] = 1;
2090 group
= peer
->group
;
2092 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2093 ret
|= peer_activate_af(tmp_peer
, afi
, safi
);
2096 ret
|= peer_activate_af(peer
, afi
, safi
);
2099 /* If this is the first peer to be activated for this
2100 * afi/labeled-unicast recalc bestpaths to trigger label allocation */
2101 if (safi
== SAFI_LABELED_UNICAST
2102 && !bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]) {
2104 if (BGP_DEBUG(zebra
, ZEBRA
))
2106 "peer(s) are now active for labeled-unicast, allocate MPLS labels");
2108 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 1;
2109 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2112 if (safi
== SAFI_FLOWSPEC
) {
2113 /* connect to table manager */
2114 bgp_zebra_init_tm_connect(bgp
);
2119 static int non_peergroup_deactivate_af(struct peer
*peer
, afi_t afi
,
2122 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2123 flog_err(EC_BGP_PEER_GROUP
, "%s was called for peer-group %s",
2124 __func__
, peer
->host
);
2128 /* Nothing to do if we've already deactivated this peer */
2129 if (!peer
->afc
[afi
][safi
])
2132 /* De-activate the address family configuration. */
2133 peer
->afc
[afi
][safi
] = 0;
2135 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2136 flog_err(EC_BGP_PEER_DELETE
,
2137 "couldn't delete af structure for peer %s",
2142 if (peer
->status
== Established
) {
2143 if (CHECK_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
)) {
2144 peer
->afc_adv
[afi
][safi
] = 0;
2145 peer
->afc_nego
[afi
][safi
] = 0;
2147 if (peer_active_nego(peer
)) {
2148 bgp_capability_send(peer
, afi
, safi
,
2150 CAPABILITY_ACTION_UNSET
);
2151 bgp_clear_route(peer
, afi
, safi
);
2152 peer
->pcount
[afi
][safi
] = 0;
2154 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2155 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2156 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2159 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2160 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2161 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2168 int peer_deactivate(struct peer
*peer
, afi_t afi
, safi_t safi
)
2171 struct peer_group
*group
;
2172 struct peer
*tmp_peer
;
2173 struct listnode
*node
, *nnode
;
2176 /* Nothing to do if we've already de-activated this peer */
2177 if (!peer
->afc
[afi
][safi
])
2180 /* This is a peer-group so de-activate all of the members of the
2181 * peer-group as well */
2182 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
2183 peer
->afc
[afi
][safi
] = 0;
2184 group
= peer
->group
;
2186 if (peer_af_delete(peer
, afi
, safi
) != 0) {
2187 flog_err(EC_BGP_PEER_DELETE
,
2188 "couldn't delete af structure for peer %s",
2192 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, tmp_peer
)) {
2193 ret
|= non_peergroup_deactivate_af(tmp_peer
, afi
, safi
);
2196 ret
|= non_peergroup_deactivate_af(peer
, afi
, safi
);
2201 /* If this is the last peer to be deactivated for this
2202 * afi/labeled-unicast recalc bestpaths to trigger label deallocation */
2203 if (safi
== SAFI_LABELED_UNICAST
2204 && bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
]
2205 && !bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
2207 if (BGP_DEBUG(zebra
, ZEBRA
))
2209 "peer(s) are no longer active for labeled-unicast, deallocate MPLS labels");
2211 bgp
->allocate_mpls_labels
[afi
][SAFI_UNICAST
] = 0;
2212 bgp_recalculate_afi_safi_bestpaths(bgp
, afi
, SAFI_UNICAST
);
2217 int peer_afc_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int enable
)
2220 return peer_activate(peer
, afi
, safi
);
2222 return peer_deactivate(peer
, afi
, safi
);
2225 void peer_nsf_stop(struct peer
*peer
)
2230 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
);
2231 UNSET_FLAG(peer
->sflags
, PEER_STATUS_NSF_MODE
);
2233 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2234 for (safi
= SAFI_UNICAST
; safi
<= SAFI_MPLS_VPN
; safi
++)
2235 peer
->nsf
[afi
][safi
] = 0;
2237 if (peer
->t_gr_restart
) {
2238 BGP_TIMER_OFF(peer
->t_gr_restart
);
2239 if (bgp_debug_neighbor_events(peer
))
2240 zlog_debug("%s graceful restart timer stopped",
2243 if (peer
->t_gr_stale
) {
2244 BGP_TIMER_OFF(peer
->t_gr_stale
);
2245 if (bgp_debug_neighbor_events(peer
))
2247 "%s graceful restart stalepath timer stopped",
2250 bgp_clear_route_all(peer
);
2253 /* Delete peer from confguration.
2255 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
2256 * it to "cool off" and refcounts to hit 0, at which state it is freed.
2258 * This function /should/ take care to be idempotent, to guard against
2259 * it being called multiple times through stray events that come in
2260 * that happen to result in this function being called again. That
2261 * said, getting here for a "Deleted" peer is a bug in the neighbour
2264 int peer_delete(struct peer
*peer
)
2270 struct bgp_filter
*filter
;
2271 struct listnode
*pn
;
2274 assert(peer
->status
!= Deleted
);
2277 accept_peer
= CHECK_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2279 bgp_keepalives_off(peer
);
2280 bgp_reads_off(peer
);
2281 bgp_writes_off(peer
);
2282 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_WRITES_ON
));
2283 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_READS_ON
));
2284 assert(!CHECK_FLAG(peer
->thread_flags
, PEER_THREAD_KEEPALIVES_ON
));
2286 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2287 peer_nsf_stop(peer
);
2289 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2291 bgp_bfd_deregister_peer(peer
);
2293 /* If this peer belongs to peer group, clear up the
2296 if (peer_dynamic_neighbor(peer
))
2297 peer_drop_dynamic_neighbor(peer
);
2299 if ((pn
= listnode_lookup(peer
->group
->peer
, peer
))) {
2301 peer
); /* group->peer list reference */
2302 list_delete_node(peer
->group
->peer
, pn
);
2307 /* Withdraw all information from routing table. We can not use
2308 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
2309 * executed after peer structure is deleted.
2311 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
2313 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
2315 if (peer
->doppelganger
) {
2316 peer
->doppelganger
->doppelganger
= NULL
;
2317 peer
->doppelganger
= NULL
;
2320 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
2321 bgp_fsm_change_status(peer
, Deleted
);
2323 /* Remove from NHT */
2324 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
2325 bgp_unlink_nexthop_by_peer(peer
);
2327 /* Password configuration */
2328 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
)) {
2329 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
2331 if (!accept_peer
&& !BGP_PEER_SU_UNSPEC(peer
)
2332 && !CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
2333 bgp_md5_unset(peer
);
2336 bgp_timer_set(peer
); /* stops all timers for Deleted */
2338 /* Delete from all peer list. */
2339 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
2340 && (pn
= listnode_lookup(bgp
->peer
, peer
))) {
2341 peer_unlock(peer
); /* bgp peer list reference */
2342 list_delete_node(bgp
->peer
, pn
);
2343 hash_release(bgp
->peerhash
, peer
);
2348 stream_fifo_free(peer
->ibuf
);
2353 stream_fifo_free(peer
->obuf
);
2357 if (peer
->ibuf_work
) {
2358 ringbuf_del(peer
->ibuf_work
);
2359 peer
->ibuf_work
= NULL
;
2362 if (peer
->obuf_work
) {
2363 stream_free(peer
->obuf_work
);
2364 peer
->obuf_work
= NULL
;
2367 if (peer
->scratch
) {
2368 stream_free(peer
->scratch
);
2369 peer
->scratch
= NULL
;
2372 /* Local and remote addresses. */
2373 if (peer
->su_local
) {
2374 sockunion_free(peer
->su_local
);
2375 peer
->su_local
= NULL
;
2378 if (peer
->su_remote
) {
2379 sockunion_free(peer
->su_remote
);
2380 peer
->su_remote
= NULL
;
2383 /* Free filter related memory. */
2384 FOREACH_AFI_SAFI (afi
, safi
) {
2385 filter
= &peer
->filter
[afi
][safi
];
2387 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++) {
2388 if (filter
->dlist
[i
].name
) {
2389 XFREE(MTYPE_BGP_FILTER_NAME
,
2390 filter
->dlist
[i
].name
);
2391 filter
->dlist
[i
].name
= NULL
;
2394 if (filter
->plist
[i
].name
) {
2395 XFREE(MTYPE_BGP_FILTER_NAME
,
2396 filter
->plist
[i
].name
);
2397 filter
->plist
[i
].name
= NULL
;
2400 if (filter
->aslist
[i
].name
) {
2401 XFREE(MTYPE_BGP_FILTER_NAME
,
2402 filter
->aslist
[i
].name
);
2403 filter
->aslist
[i
].name
= NULL
;
2407 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++) {
2408 if (filter
->map
[i
].name
) {
2409 XFREE(MTYPE_BGP_FILTER_NAME
,
2410 filter
->map
[i
].name
);
2411 filter
->map
[i
].name
= NULL
;
2415 if (filter
->usmap
.name
) {
2416 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
2417 filter
->usmap
.name
= NULL
;
2420 if (peer
->default_rmap
[afi
][safi
].name
) {
2421 XFREE(MTYPE_ROUTE_MAP_NAME
,
2422 peer
->default_rmap
[afi
][safi
].name
);
2423 peer
->default_rmap
[afi
][safi
].name
= NULL
;
2427 FOREACH_AFI_SAFI (afi
, safi
)
2428 peer_af_delete(peer
, afi
, safi
);
2430 if (peer
->hostname
) {
2431 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
2432 peer
->hostname
= NULL
;
2435 if (peer
->domainname
) {
2436 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
2437 peer
->domainname
= NULL
;
2440 peer_unlock(peer
); /* initial reference */
2445 static int peer_group_cmp(struct peer_group
*g1
, struct peer_group
*g2
)
2447 return strcmp(g1
->name
, g2
->name
);
2450 /* Peer group cofiguration. */
2451 static struct peer_group
*peer_group_new(void)
2453 return XCALLOC(MTYPE_PEER_GROUP
, sizeof(struct peer_group
));
2456 static void peer_group_free(struct peer_group
*group
)
2458 XFREE(MTYPE_PEER_GROUP
, group
);
2461 struct peer_group
*peer_group_lookup(struct bgp
*bgp
, const char *name
)
2463 struct peer_group
*group
;
2464 struct listnode
*node
, *nnode
;
2466 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2467 if (strcmp(group
->name
, name
) == 0)
2473 struct peer_group
*peer_group_get(struct bgp
*bgp
, const char *name
)
2475 struct peer_group
*group
;
2478 group
= peer_group_lookup(bgp
, name
);
2482 group
= peer_group_new();
2484 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2485 group
->name
= XSTRDUP(MTYPE_PEER_GROUP_HOST
, name
);
2486 group
->peer
= list_new();
2487 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2488 group
->listen_range
[afi
] = list_new();
2489 group
->conf
= peer_new(bgp
);
2490 if (!bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
2491 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
2492 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
2493 group
->conf
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, name
);
2494 group
->conf
->group
= group
;
2495 group
->conf
->as
= 0;
2496 group
->conf
->ttl
= BGP_DEFAULT_TTL
;
2497 group
->conf
->gtsm_hops
= 0;
2498 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2499 SET_FLAG(group
->conf
->sflags
, PEER_STATUS_GROUP
);
2500 listnode_add_sort(bgp
->group
, group
);
2505 static void peer_group2peer_config_copy(struct peer_group
*group
,
2515 peer
->as
= conf
->as
;
2518 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_LOCAL_AS
))
2519 peer
->change_local_as
= conf
->change_local_as
;
2521 /* If peer-group has configured TTL then override it */
2522 if (conf
->ttl
!= BGP_DEFAULT_TTL
)
2523 peer
->ttl
= conf
->ttl
;
2526 peer
->gtsm_hops
= conf
->gtsm_hops
;
2528 /* peer flags apply */
2529 flags_tmp
= conf
->flags
& ~peer
->flags_override
;
2530 flags_tmp
^= conf
->flags_invert
^ peer
->flags_invert
;
2531 flags_tmp
&= ~peer
->flags_override
;
2533 UNSET_FLAG(peer
->flags
, ~peer
->flags_override
);
2534 SET_FLAG(peer
->flags
, flags_tmp
);
2535 SET_FLAG(peer
->flags_invert
, conf
->flags_invert
);
2537 /* peer timers apply */
2538 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER
)) {
2539 PEER_ATTR_INHERIT(peer
, group
, holdtime
);
2540 PEER_ATTR_INHERIT(peer
, group
, keepalive
);
2543 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_TIMER_CONNECT
)) {
2544 PEER_ATTR_INHERIT(peer
, group
, connect
);
2545 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_TIMER_CONNECT
))
2546 peer
->v_connect
= conf
->connect
;
2548 peer
->v_connect
= peer
->bgp
->default_connect_retry
;
2551 /* advertisement-interval apply */
2552 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_ROUTEADV
)) {
2553 PEER_ATTR_INHERIT(peer
, group
, routeadv
);
2554 if (CHECK_FLAG(conf
->flags
, PEER_FLAG_ROUTEADV
))
2555 peer
->v_routeadv
= conf
->routeadv
;
2557 peer
->v_routeadv
= (peer_sort(peer
) == BGP_PEER_IBGP
)
2558 ? BGP_DEFAULT_IBGP_ROUTEADV
2559 : BGP_DEFAULT_EBGP_ROUTEADV
;
2562 /* password apply */
2563 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_PASSWORD
))
2564 PEER_STR_ATTR_INHERIT(peer
, group
, password
,
2565 MTYPE_PEER_PASSWORD
);
2567 if (!BGP_PEER_SU_UNSPEC(peer
))
2570 /* update-source apply */
2571 if (!CHECK_FLAG(peer
->flags_override
, PEER_FLAG_UPDATE_SOURCE
)) {
2572 if (conf
->update_source
) {
2573 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2574 PEER_SU_ATTR_INHERIT(peer
, group
, update_source
);
2575 } else if (conf
->update_if
) {
2576 sockunion_free(peer
->update_source
);
2577 PEER_STR_ATTR_INHERIT(peer
, group
, update_if
,
2578 MTYPE_PEER_UPDATE_SOURCE
);
2582 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2585 /* Peer group's remote AS configuration. */
2586 int peer_group_remote_as(struct bgp
*bgp
, const char *group_name
, as_t
*as
,
2589 struct peer_group
*group
;
2591 struct listnode
*node
, *nnode
;
2593 group
= peer_group_lookup(bgp
, group_name
);
2597 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2601 /* When we setup peer-group AS number all peer group member's AS
2602 number must be updated to same number. */
2603 peer_as_change(group
->conf
, *as
, as_type
);
2605 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2606 if (((peer
->as_type
== AS_SPECIFIED
) && peer
->as
!= *as
)
2607 || (peer
->as_type
!= as_type
))
2608 peer_as_change(peer
, *as
, as_type
);
2614 int peer_notify_unconfig(struct peer
*peer
)
2616 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2617 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2618 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2622 int peer_group_notify_unconfig(struct peer_group
*group
)
2624 struct peer
*peer
, *other
;
2625 struct listnode
*node
, *nnode
;
2627 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2628 other
= peer
->doppelganger
;
2629 if (other
&& other
->status
!= Deleted
) {
2630 other
->group
= NULL
;
2631 peer_notify_unconfig(other
);
2633 peer_notify_unconfig(peer
);
2638 int peer_group_delete(struct peer_group
*group
)
2642 struct prefix
*prefix
;
2644 struct listnode
*node
, *nnode
;
2649 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2650 other
= peer
->doppelganger
;
2652 if (other
&& other
->status
!= Deleted
) {
2653 other
->group
= NULL
;
2657 list_delete(&group
->peer
);
2659 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2660 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
2662 prefix_free(&prefix
);
2664 list_delete(&group
->listen_range
[afi
]);
2667 XFREE(MTYPE_PEER_GROUP_HOST
, group
->name
);
2670 bfd_info_free(&(group
->conf
->bfd_info
));
2672 group
->conf
->group
= NULL
;
2673 peer_delete(group
->conf
);
2675 /* Delete from all peer_group list. */
2676 listnode_delete(bgp
->group
, group
);
2678 peer_group_free(group
);
2683 int peer_group_remote_as_delete(struct peer_group
*group
)
2685 struct peer
*peer
, *other
;
2686 struct listnode
*node
, *nnode
;
2688 if ((group
->conf
->as_type
== AS_UNSPECIFIED
)
2689 || ((!group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2692 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2693 other
= peer
->doppelganger
;
2697 if (other
&& other
->status
!= Deleted
) {
2698 other
->group
= NULL
;
2702 list_delete_all_node(group
->peer
);
2704 group
->conf
->as
= 0;
2705 group
->conf
->as_type
= AS_UNSPECIFIED
;
2710 int peer_group_listen_range_add(struct peer_group
*group
, struct prefix
*range
)
2712 struct prefix
*prefix
;
2713 struct listnode
*node
, *nnode
;
2716 afi
= family2afi(range
->family
);
2718 /* Group needs remote AS configured. */
2719 if (group
->conf
->as_type
== AS_UNSPECIFIED
)
2720 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2722 /* Ensure no duplicates. Currently we don't care about overlaps. */
2723 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2724 if (prefix_same(range
, prefix
))
2728 prefix
= prefix_new();
2729 prefix_copy(prefix
, range
);
2730 listnode_add(group
->listen_range
[afi
], prefix
);
2732 /* Update passwords for new ranges */
2733 if (group
->conf
->password
)
2734 bgp_md5_set_prefix(prefix
, group
->conf
->password
);
2739 int peer_group_listen_range_del(struct peer_group
*group
, struct prefix
*range
)
2741 struct prefix
*prefix
, prefix2
;
2742 struct listnode
*node
, *nnode
;
2745 char buf
[PREFIX2STR_BUFFER
];
2747 afi
= family2afi(range
->family
);
2749 /* Identify the listen range. */
2750 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
, prefix
)) {
2751 if (prefix_same(range
, prefix
))
2756 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2758 prefix2str(prefix
, buf
, sizeof(buf
));
2760 /* Dispose off any dynamic neighbors that exist due to this listen range
2762 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
2763 if (!peer_dynamic_neighbor(peer
))
2766 sockunion2hostprefix(&peer
->su
, &prefix2
);
2767 if (prefix_match(prefix
, &prefix2
)) {
2768 if (bgp_debug_neighbor_events(peer
))
2770 "Deleting dynamic neighbor %s group %s upon "
2771 "delete of listen range %s",
2772 peer
->host
, group
->name
, buf
);
2777 /* Get rid of the listen range */
2778 listnode_delete(group
->listen_range
[afi
], prefix
);
2780 /* Remove passwords for deleted ranges */
2781 if (group
->conf
->password
)
2782 bgp_md5_unset_prefix(prefix
);
2787 /* Bind specified peer to peer group. */
2788 int peer_group_bind(struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2789 struct peer_group
*group
, as_t
*as
)
2791 int first_member
= 0;
2795 /* Lookup the peer. */
2797 peer
= peer_lookup(bgp
, su
);
2799 /* The peer exist, bind it to the peer-group */
2801 /* When the peer already belongs to a peer-group, check the
2803 if (peer_group_active(peer
)) {
2805 /* The peer is already bound to the peer-group,
2808 if (strcmp(peer
->group
->name
, group
->name
) == 0)
2811 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2814 /* The peer has not specified a remote-as, inherit it from the
2816 if (peer
->as_type
== AS_UNSPECIFIED
) {
2817 peer
->as_type
= group
->conf
->as_type
;
2818 peer
->as
= group
->conf
->as
;
2819 peer
->sort
= group
->conf
->sort
;
2822 if (!group
->conf
->as
&& peer_sort(peer
)) {
2823 if (peer_sort(group
->conf
) != BGP_PEER_INTERNAL
2824 && peer_sort(group
->conf
) != peer_sort(peer
)) {
2827 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2830 if (peer_sort(group
->conf
) == BGP_PEER_INTERNAL
)
2834 peer_group2peer_config_copy(group
, peer
);
2836 FOREACH_AFI_SAFI (afi
, safi
) {
2837 if (group
->conf
->afc
[afi
][safi
]) {
2838 peer
->afc
[afi
][safi
] = 1;
2840 if (peer_af_find(peer
, afi
, safi
)
2841 || peer_af_create(peer
, afi
, safi
)) {
2842 peer_group2peer_config_copy_af(
2843 group
, peer
, afi
, safi
);
2845 } else if (peer
->afc
[afi
][safi
])
2846 peer_deactivate(peer
, afi
, safi
);
2850 assert(group
&& peer
->group
== group
);
2852 listnode_delete(bgp
->peer
, peer
);
2854 peer
->group
= group
;
2855 listnode_add_sort(bgp
->peer
, peer
);
2857 peer
= peer_lock(peer
); /* group->peer list reference */
2858 listnode_add(group
->peer
, peer
);
2862 /* Advertisement-interval reset */
2863 if (!CHECK_FLAG(group
->conf
->flags
,
2864 PEER_FLAG_ROUTEADV
)) {
2865 group
->conf
->v_routeadv
=
2866 (peer_sort(group
->conf
)
2868 ? BGP_DEFAULT_IBGP_ROUTEADV
2869 : BGP_DEFAULT_EBGP_ROUTEADV
;
2872 /* ebgp-multihop reset */
2873 if (peer_sort(group
->conf
) == BGP_PEER_IBGP
)
2874 group
->conf
->ttl
= MAXTTL
;
2876 /* local-as reset */
2877 if (peer_sort(group
->conf
) != BGP_PEER_EBGP
) {
2878 group
->conf
->change_local_as
= 0;
2879 peer_flag_unset(group
->conf
,
2880 PEER_FLAG_LOCAL_AS
);
2881 peer_flag_unset(group
->conf
,
2882 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2883 peer_flag_unset(group
->conf
,
2884 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2888 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2890 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2891 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2892 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2893 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2895 bgp_session_reset(peer
);
2899 /* Create a new peer. */
2901 if ((group
->conf
->as_type
== AS_SPECIFIED
)
2902 && (!group
->conf
->as
)) {
2903 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2906 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
2907 group
->conf
->as_type
, 0, 0, group
);
2909 peer
= peer_lock(peer
); /* group->peer list reference */
2910 listnode_add(group
->peer
, peer
);
2912 peer_group2peer_config_copy(group
, peer
);
2914 /* If the peer-group is active for this afi/safi then activate
2916 FOREACH_AFI_SAFI (afi
, safi
) {
2917 if (group
->conf
->afc
[afi
][safi
]) {
2918 peer
->afc
[afi
][safi
] = 1;
2919 peer_af_create(peer
, afi
, safi
);
2920 peer_group2peer_config_copy_af(group
, peer
, afi
,
2922 } else if (peer
->afc
[afi
][safi
])
2923 peer_deactivate(peer
, afi
, safi
);
2926 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2928 /* Set up peer's events and timers. */
2929 if (peer_active(peer
))
2930 bgp_timer_set(peer
);
2936 static int bgp_startup_timer_expire(struct thread
*thread
)
2940 bgp
= THREAD_ARG(thread
);
2941 bgp
->t_startup
= NULL
;
2947 * On shutdown we call the cleanup function which
2948 * does a free of the link list nodes, free up
2949 * the data we are pointing at too.
2951 static void bgp_vrf_string_name_delete(void *data
)
2955 XFREE(MTYPE_TMP
, vname
);
2958 /* BGP instance creation by `router bgp' commands. */
2959 static struct bgp
*bgp_create(as_t
*as
, const char *name
,
2960 enum bgp_instance_type inst_type
)
2966 if ((bgp
= XCALLOC(MTYPE_BGP
, sizeof(struct bgp
))) == NULL
)
2969 if (BGP_DEBUG(zebra
, ZEBRA
)) {
2970 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
2971 zlog_debug("Creating Default VRF, AS %u", *as
);
2973 zlog_debug("Creating %s %s, AS %u",
2974 (inst_type
== BGP_INSTANCE_TYPE_VRF
)
2980 /* Default the EVPN VRF to the default one */
2981 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
&& !bgp_master
.bgp_evpn
) {
2987 bgp
->heuristic_coalesce
= true;
2988 bgp
->inst_type
= inst_type
;
2989 bgp
->vrf_id
= (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) ? VRF_DEFAULT
2991 bgp
->peer_self
= peer_new(bgp
);
2992 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
2993 bgp
->peer_self
->host
=
2994 XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
2995 if (bgp
->peer_self
->hostname
!= NULL
) {
2996 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->hostname
);
2997 bgp
->peer_self
->hostname
= NULL
;
2999 if (cmd_hostname_get())
3000 bgp
->peer_self
->hostname
=
3001 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_hostname_get());
3003 if (bgp
->peer_self
->domainname
!= NULL
) {
3004 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->domainname
);
3005 bgp
->peer_self
->domainname
= NULL
;
3007 if (cmd_domainname_get())
3008 bgp
->peer_self
->domainname
=
3009 XSTRDUP(MTYPE_BGP_PEER_HOST
, cmd_domainname_get());
3010 bgp
->peer
= list_new();
3011 bgp
->peer
->cmp
= (int (*)(void *, void *))peer_cmp
;
3012 bgp
->peerhash
= hash_create(peer_hash_key_make
, peer_hash_same
,
3014 bgp
->peerhash
->max_size
= BGP_PEER_MAX_HASH_SIZE
;
3016 bgp
->group
= list_new();
3017 bgp
->group
->cmp
= (int (*)(void *, void *))peer_group_cmp
;
3019 FOREACH_AFI_SAFI (afi
, safi
) {
3020 bgp
->route
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3021 bgp
->aggregate
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3022 bgp
->rib
[afi
][safi
] = bgp_table_init(bgp
, afi
, safi
);
3024 /* Enable maximum-paths */
3025 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_EBGP
,
3027 bgp_maximum_paths_set(bgp
, afi
, safi
, BGP_PEER_IBGP
,
3029 /* Initialize graceful restart info */
3030 bgp
->gr_info
[afi
][safi
].eor_required
= 0;
3031 bgp
->gr_info
[afi
][safi
].eor_received
= 0;
3032 bgp
->gr_info
[afi
][safi
].t_select_deferral
= NULL
;
3033 bgp
->gr_info
[afi
][safi
].t_route_select
= NULL
;
3034 bgp
->gr_info
[afi
][safi
].route_list
= list_new();
3037 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
3038 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
3039 bgp
->default_subgroup_pkt_queue_max
=
3040 BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
3041 bgp_timers_unset(bgp
);
3042 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
3043 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
3044 bgp
->select_defer_time
= BGP_DEFAULT_SELECT_DEFERRAL_TIME
;
3045 bgp
->rib_stale_time
= BGP_DEFAULT_RIB_STALE_TIME
;
3046 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
3047 bgp
->dynamic_neighbors_count
= 0;
3048 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_DISABLED
;
3049 bgp
->reject_as_sets
= BGP_REJECT_AS_SETS_DISABLED
;
3050 bgp_addpath_init_bgp_data(&bgp
->tx_addpath
);
3055 if (inst_type
!= BGP_INSTANCE_TYPE_VRF
) {
3056 bgp
->rfapi
= bgp_rfapi_new(bgp
);
3058 assert(bgp
->rfapi_cfg
);
3060 #endif /* ENABLE_BGP_VNC */
3062 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3063 bgp
->vpn_policy
[afi
].bgp
= bgp
;
3064 bgp
->vpn_policy
[afi
].afi
= afi
;
3065 bgp
->vpn_policy
[afi
].tovpn_label
= MPLS_LABEL_NONE
;
3066 bgp
->vpn_policy
[afi
].tovpn_zebra_vrf_label_last_sent
=
3069 bgp
->vpn_policy
[afi
].import_vrf
= list_new();
3070 bgp
->vpn_policy
[afi
].import_vrf
->del
=
3071 bgp_vrf_string_name_delete
;
3072 bgp
->vpn_policy
[afi
].export_vrf
= list_new();
3073 bgp
->vpn_policy
[afi
].export_vrf
->del
=
3074 bgp_vrf_string_name_delete
;
3077 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
3079 thread_add_timer(bm
->master
, bgp_startup_timer_expire
, bgp
,
3080 bgp
->restart_time
, &bgp
->t_startup
);
3082 /* printable name we can use in debug messages */
3083 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
3084 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
3094 len
= 4 + 1 + strlen(n
) + 1; /* "view foo\0" */
3096 bgp
->name_pretty
= XCALLOC(MTYPE_BGP
, len
);
3097 snprintf(bgp
->name_pretty
, len
, "%s %s",
3098 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3104 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
3105 memory_order_relaxed
);
3106 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
3107 memory_order_relaxed
);
3108 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
3112 update_bgp_group_init(bgp
);
3114 /* assign a unique rd id for auto derivation of vrf's RD */
3115 bf_assign_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3117 bgp
->evpn_info
= XCALLOC(MTYPE_BGP_EVPN_INFO
,
3118 sizeof(struct bgp_evpn_info
));
3123 /*initilize global GR FSM */
3124 bgp_global_gr_init(bgp
);
3128 /* Return the "default VRF" instance of BGP. */
3129 struct bgp
*bgp_get_default(void)
3132 struct listnode
*node
, *nnode
;
3134 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3135 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3140 /* Lookup BGP entry. */
3141 struct bgp
*bgp_lookup(as_t as
, const char *name
)
3144 struct listnode
*node
, *nnode
;
3146 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3148 && ((bgp
->name
== NULL
&& name
== NULL
)
3149 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0)))
3154 /* Lookup BGP structure by view name. */
3155 struct bgp
*bgp_lookup_by_name(const char *name
)
3158 struct listnode
*node
, *nnode
;
3160 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3161 if ((bgp
->name
== NULL
&& name
== NULL
)
3162 || (bgp
->name
&& name
&& strcmp(bgp
->name
, name
) == 0))
3167 /* Lookup BGP instance based on VRF id. */
3168 /* Note: Only to be used for incoming messages from Zebra. */
3169 struct bgp
*bgp_lookup_by_vrf_id(vrf_id_t vrf_id
)
3173 /* Lookup VRF (in tree) and follow link. */
3174 vrf
= vrf_lookup_by_id(vrf_id
);
3177 return (vrf
->info
) ? (struct bgp
*)vrf
->info
: NULL
;
3180 /* Sets the BGP instance where EVPN is enabled */
3181 void bgp_set_evpn(struct bgp
*bgp
)
3183 if (bm
->bgp_evpn
== bgp
)
3186 /* First, release the reference count we hold on the instance */
3188 bgp_unlock(bm
->bgp_evpn
);
3192 /* Increase the reference count on this new VRF */
3194 bgp_lock(bm
->bgp_evpn
);
3197 /* Returns the BGP instance where EVPN is enabled, if any */
3198 struct bgp
*bgp_get_evpn(void)
3200 return bm
->bgp_evpn
;
3203 /* handle socket creation or deletion, if necessary
3204 * this is called for all new BGP instances
3206 int bgp_handle_socket(struct bgp
*bgp
, struct vrf
*vrf
, vrf_id_t old_vrf_id
,
3211 /* Create BGP server socket, if listen mode not disabled */
3212 if (!bgp
|| bgp_option_check(BGP_OPT_NO_LISTEN
))
3214 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3216 * suppress vrf socket
3218 if (create
== false) {
3219 bgp_close_vrf_socket(bgp
);
3223 return BGP_ERR_INVALID_VALUE
;
3225 * if vrf_id did not change
3227 if (vrf
->vrf_id
== old_vrf_id
)
3229 if (old_vrf_id
!= VRF_UNKNOWN
) {
3230 /* look for old socket. close it. */
3231 bgp_close_vrf_socket(bgp
);
3233 /* if backend is not yet identified ( VRF_UNKNOWN) then
3234 * creation will be done later
3236 if (vrf
->vrf_id
== VRF_UNKNOWN
)
3238 ret
= bgp_socket(bgp
, bm
->port
, bm
->address
);
3240 return BGP_ERR_INVALID_VALUE
;
3243 return bgp_check_main_socket(create
, bgp
);
3246 /* Called from VTY commands. */
3247 int bgp_get(struct bgp
**bgp_val
, as_t
*as
, const char *name
,
3248 enum bgp_instance_type inst_type
)
3251 struct vrf
*vrf
= NULL
;
3253 /* Multiple instance check. */
3255 bgp
= bgp_lookup_by_name(name
);
3257 bgp
= bgp_get_default();
3259 /* Already exists. */
3261 if (bgp
->as
!= *as
) {
3263 return BGP_ERR_INSTANCE_MISMATCH
;
3265 if (bgp
->inst_type
!= inst_type
)
3266 return BGP_ERR_INSTANCE_MISMATCH
;
3271 bgp
= bgp_create(as
, name
, inst_type
);
3272 if (bgp_option_check(BGP_OPT_NO_ZEBRA
) && name
)
3273 bgp
->vrf_id
= vrf_generate_id();
3274 bgp_router_id_set(bgp
, &bgp
->router_id_zebra
, true);
3275 bgp_address_init(bgp
);
3276 bgp_tip_hash_init(bgp
);
3280 bgp
->t_rmap_def_originate_eval
= NULL
;
3282 /* If Default instance or VRF, link to the VRF structure, if present. */
3283 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
3284 || bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
) {
3285 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3287 bgp_vrf_link(bgp
, vrf
);
3289 /* BGP server socket already processed if BGP instance
3290 * already part of the list
3292 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, true);
3293 listnode_add(bm
->bgp
, bgp
);
3295 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
)) {
3296 if (BGP_DEBUG(zebra
, ZEBRA
))
3297 zlog_debug("%s: Registering BGP instance %s to zebra",
3298 __PRETTY_FUNCTION__
, name
);
3299 bgp_zebra_instance_register(bgp
);
3306 * Make BGP instance "up". Applies only to VRFs (non-default) and
3307 * implies the VRF has been learnt from Zebra.
3309 void bgp_instance_up(struct bgp
*bgp
)
3312 struct listnode
*node
, *next
;
3314 /* Register with zebra. */
3315 bgp_zebra_instance_register(bgp
);
3317 /* Kick off any peers that may have been configured. */
3318 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3319 if (!BGP_PEER_START_SUPPRESSED(peer
))
3320 BGP_EVENT_ADD(peer
, BGP_Start
);
3323 /* Process any networks that have been configured. */
3324 bgp_static_add(bgp
);
3328 * Make BGP instance "down". Applies only to VRFs (non-default) and
3329 * implies the VRF has been deleted by Zebra.
3331 void bgp_instance_down(struct bgp
*bgp
)
3334 struct listnode
*node
;
3335 struct listnode
*next
;
3338 if (bgp
->t_rmap_def_originate_eval
) {
3339 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
3340 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3344 /* Bring down peers, so corresponding routes are purged. */
3345 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3346 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3347 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3348 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3350 bgp_session_reset(peer
);
3353 /* Purge network and redistributed routes. */
3354 bgp_purge_static_redist_routes(bgp
);
3356 /* Cleanup registered nexthops (flags) */
3357 bgp_cleanup_nexthops(bgp
);
3360 /* Delete BGP instance. */
3361 int bgp_delete(struct bgp
*bgp
)
3364 struct peer_group
*group
;
3365 struct listnode
*node
, *next
;
3370 struct graceful_restart_info
*gr_info
;
3374 hook_call(bgp_inst_delete
, bgp
);
3376 THREAD_OFF(bgp
->t_startup
);
3377 THREAD_OFF(bgp
->t_maxmed_onstartup
);
3378 THREAD_OFF(bgp
->t_update_delay
);
3379 THREAD_OFF(bgp
->t_establish_wait
);
3381 /* Set flag indicating bgp instance delete in progress */
3382 bgp_flag_set(bgp
, BGP_FLAG_DELETE_IN_PROGRESS
);
3384 /* Delete the graceful restart info */
3385 FOREACH_AFI_SAFI (afi
, safi
) {
3386 gr_info
= &bgp
->gr_info
[afi
][safi
];
3390 BGP_TIMER_OFF(gr_info
->t_select_deferral
);
3391 BGP_TIMER_OFF(gr_info
->t_route_select
);
3392 if (gr_info
->route_list
)
3393 list_delete(&gr_info
->route_list
);
3396 if (BGP_DEBUG(zebra
, ZEBRA
)) {
3397 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3398 zlog_debug("Deleting Default VRF");
3400 zlog_debug("Deleting %s %s",
3401 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
3407 /* unmap from RT list */
3408 bgp_evpn_vrf_delete(bgp
);
3410 /* unmap bgp vrf label */
3411 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
3412 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
3415 if (bgp
->t_rmap_def_originate_eval
) {
3416 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
3417 bgp_unlock(bgp
); /* TODO - This timer is started with a lock -
3421 /* Inform peers we're going down. */
3422 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
)) {
3423 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3424 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3425 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3428 /* Delete static routes (networks). */
3429 bgp_static_delete(bgp
);
3431 /* Unset redistribution. */
3432 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3433 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
3434 if (i
!= ZEBRA_ROUTE_BGP
)
3435 bgp_redistribute_unset(bgp
, afi
, i
, 0);
3437 /* Free peers and peer-groups. */
3438 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, next
, group
))
3439 peer_group_delete(group
);
3441 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, next
, peer
))
3444 if (bgp
->peer_self
) {
3445 peer_delete(bgp
->peer_self
);
3446 bgp
->peer_self
= NULL
;
3449 update_bgp_group_free(bgp
);
3451 /* TODO - Other memory may need to be freed - e.g., NHT */
3456 bgp_cleanup_routes(bgp
);
3458 for (afi
= 0; afi
< AFI_MAX
; ++afi
) {
3459 if (!bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
3462 &bgp
->vpn_policy
[afi
]
3463 .import_redirect_rtlist
);
3464 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
3467 /* Deregister from Zebra, if needed */
3468 if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp
)) {
3469 if (BGP_DEBUG(zebra
, ZEBRA
))
3470 zlog_debug("%s: deregistering this bgp %s instance from zebra",
3471 __PRETTY_FUNCTION__
, bgp
->name
);
3472 bgp_zebra_instance_deregister(bgp
);
3475 /* Remove visibility via the master list - there may however still be
3476 * routes to be processed still referencing the struct bgp.
3478 listnode_delete(bm
->bgp
, bgp
);
3480 /* Free interfaces in this instance. */
3483 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
3484 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
3486 bgp_vrf_unlink(bgp
, vrf
);
3488 /* Update EVPN VRF pointer */
3489 if (bm
->bgp_evpn
== bgp
) {
3490 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
3493 bgp_set_evpn(bgp_get_default());
3496 thread_master_free_unused(bm
->master
);
3497 bgp_unlock(bgp
); /* initial reference */
3502 void bgp_free(struct bgp
*bgp
)
3506 struct bgp_table
*table
;
3507 struct bgp_node
*rn
;
3508 struct bgp_rmap
*rmap
;
3512 list_delete(&bgp
->group
);
3513 list_delete(&bgp
->peer
);
3515 if (bgp
->peerhash
) {
3516 hash_free(bgp
->peerhash
);
3517 bgp
->peerhash
= NULL
;
3520 FOREACH_AFI_SAFI (afi
, safi
) {
3521 /* Special handling for 2-level routing tables. */
3522 if (safi
== SAFI_MPLS_VPN
|| safi
== SAFI_ENCAP
3523 || safi
== SAFI_EVPN
) {
3524 for (rn
= bgp_table_top(bgp
->rib
[afi
][safi
]); rn
;
3525 rn
= bgp_route_next(rn
)) {
3526 table
= bgp_node_get_bgp_table_info(rn
);
3527 bgp_table_finish(&table
);
3530 if (bgp
->route
[afi
][safi
])
3531 bgp_table_finish(&bgp
->route
[afi
][safi
]);
3532 if (bgp
->aggregate
[afi
][safi
])
3533 bgp_table_finish(&bgp
->aggregate
[afi
][safi
]);
3534 if (bgp
->rib
[afi
][safi
])
3535 bgp_table_finish(&bgp
->rib
[afi
][safi
]);
3536 rmap
= &bgp
->table_map
[afi
][safi
];
3537 XFREE(MTYPE_ROUTE_MAP_NAME
, rmap
->name
);
3540 bgp_scan_finish(bgp
);
3541 bgp_address_destroy(bgp
);
3542 bgp_tip_hash_destroy(bgp
);
3544 /* release the auto RD id */
3545 bf_release_index(bm
->rd_idspace
, bgp
->vrf_rd_id
);
3547 bgp_evpn_cleanup(bgp
);
3548 bgp_pbr_cleanup(bgp
);
3549 XFREE(MTYPE_BGP_EVPN_INFO
, bgp
->evpn_info
);
3551 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
3552 vpn_policy_direction_t dir
;
3554 if (bgp
->vpn_policy
[afi
].import_vrf
)
3555 list_delete(&bgp
->vpn_policy
[afi
].import_vrf
);
3556 if (bgp
->vpn_policy
[afi
].export_vrf
)
3557 list_delete(&bgp
->vpn_policy
[afi
].export_vrf
);
3559 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
3560 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3561 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3562 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
3563 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
3564 ecommunity_free(&bgp
->vpn_policy
[afi
].rtlist
[dir
]);
3567 XFREE(MTYPE_BGP
, bgp
->name
);
3568 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
3570 XFREE(MTYPE_BGP
, bgp
);
3573 struct peer
*peer_lookup_by_conf_if(struct bgp
*bgp
, const char *conf_if
)
3576 struct listnode
*node
, *nnode
;
3582 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3583 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
3584 && !CHECK_FLAG(peer
->sflags
,
3585 PEER_STATUS_ACCEPT_PEER
))
3587 } else if (bm
->bgp
!= NULL
) {
3588 struct listnode
*bgpnode
, *nbgpnode
;
3590 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3591 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3593 && !strcmp(peer
->conf_if
, conf_if
)
3594 && !CHECK_FLAG(peer
->sflags
,
3595 PEER_STATUS_ACCEPT_PEER
))
3601 struct peer
*peer_lookup_by_hostname(struct bgp
*bgp
, const char *hostname
)
3604 struct listnode
*node
, *nnode
;
3610 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3611 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
3612 && !CHECK_FLAG(peer
->sflags
,
3613 PEER_STATUS_ACCEPT_PEER
))
3615 } else if (bm
->bgp
!= NULL
) {
3616 struct listnode
*bgpnode
, *nbgpnode
;
3618 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3619 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
3621 && !strcmp(peer
->hostname
, hostname
)
3622 && !CHECK_FLAG(peer
->sflags
,
3623 PEER_STATUS_ACCEPT_PEER
))
3629 struct peer
*peer_lookup(struct bgp
*bgp
, union sockunion
*su
)
3631 struct peer
*peer
= NULL
;
3632 struct peer tmp_peer
;
3634 memset(&tmp_peer
, 0, sizeof(struct peer
));
3637 * We do not want to find the doppelganger peer so search for the peer
3639 * the hash that has PEER_FLAG_CONFIG_NODE
3641 SET_FLAG(tmp_peer
.flags
, PEER_FLAG_CONFIG_NODE
);
3646 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3647 } else if (bm
->bgp
!= NULL
) {
3648 struct listnode
*bgpnode
, *nbgpnode
;
3650 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
)) {
3651 peer
= hash_lookup(bgp
->peerhash
, &tmp_peer
);
3660 struct peer
*peer_create_bind_dynamic_neighbor(struct bgp
*bgp
,
3661 union sockunion
*su
,
3662 struct peer_group
*group
)
3668 /* Create peer first; we've already checked group config is valid. */
3669 peer
= peer_create(su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
,
3670 group
->conf
->as_type
, 0, 0, group
);
3675 peer
= peer_lock(peer
);
3676 listnode_add(group
->peer
, peer
);
3678 peer_group2peer_config_copy(group
, peer
);
3681 * Bind peer for all AFs configured for the group. We don't call
3682 * peer_group_bind as that is sub-optimal and does some stuff we don't
3685 FOREACH_AFI_SAFI (afi
, safi
) {
3686 if (!group
->conf
->afc
[afi
][safi
])
3688 peer
->afc
[afi
][safi
] = 1;
3690 if (!peer_af_find(peer
, afi
, safi
))
3691 peer_af_create(peer
, afi
, safi
);
3693 peer_group2peer_config_copy_af(group
, peer
, afi
, safi
);
3696 /* Mark as dynamic, but also as a "config node" for other things to
3698 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
3699 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3705 peer_group_lookup_dynamic_neighbor_range(struct peer_group
*group
,
3706 struct prefix
*prefix
)
3708 struct listnode
*node
, *nnode
;
3709 struct prefix
*range
;
3712 afi
= family2afi(prefix
->family
);
3714 if (group
->listen_range
[afi
])
3715 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
, nnode
,
3717 if (prefix_match(range
, prefix
))
3724 peer_group_lookup_dynamic_neighbor(struct bgp
*bgp
, struct prefix
*prefix
,
3725 struct prefix
**listen_range
)
3727 struct prefix
*range
= NULL
;
3728 struct peer_group
*group
= NULL
;
3729 struct listnode
*node
, *nnode
;
3731 *listen_range
= NULL
;
3733 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3734 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3737 } else if (bm
->bgp
!= NULL
) {
3738 struct listnode
*bgpnode
, *nbgpnode
;
3740 for (ALL_LIST_ELEMENTS(bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3741 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
3742 if ((range
= peer_group_lookup_dynamic_neighbor_range(
3748 *listen_range
= range
;
3749 return (group
&& range
) ? group
: NULL
;
3752 struct peer
*peer_lookup_dynamic_neighbor(struct bgp
*bgp
, union sockunion
*su
)
3754 struct peer_group
*group
;
3757 struct prefix prefix
;
3758 struct prefix
*listen_range
;
3760 char buf
[PREFIX2STR_BUFFER
];
3761 char buf1
[PREFIX2STR_BUFFER
];
3763 sockunion2hostprefix(su
, &prefix
);
3765 /* See if incoming connection matches a configured listen range. */
3766 group
= peer_group_lookup_dynamic_neighbor(bgp
, &prefix
, &listen_range
);
3777 prefix2str(&prefix
, buf
, sizeof(buf
));
3778 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3780 if (bgp_debug_neighbor_events(NULL
))
3782 "Dynamic Neighbor %s matches group %s listen range %s",
3783 buf
, group
->name
, buf1
);
3785 /* Are we within the listen limit? */
3786 dncount
= gbgp
->dynamic_neighbors_count
;
3788 if (dncount
>= gbgp
->dynamic_neighbors_limit
) {
3789 if (bgp_debug_neighbor_events(NULL
))
3790 zlog_debug("Dynamic Neighbor %s rejected - at limit %d",
3791 inet_sutop(su
, buf
),
3792 gbgp
->dynamic_neighbors_limit
);
3796 /* Ensure group is not disabled. */
3797 if (CHECK_FLAG(group
->conf
->flags
, PEER_FLAG_SHUTDOWN
)) {
3798 if (bgp_debug_neighbor_events(NULL
))
3800 "Dynamic Neighbor %s rejected - group %s disabled",
3805 /* Check that at least one AF is activated for the group. */
3806 if (!peer_group_af_configured(group
)) {
3807 if (bgp_debug_neighbor_events(NULL
))
3809 "Dynamic Neighbor %s rejected - no AF activated for group %s",
3814 /* Create dynamic peer and bind to associated group. */
3815 peer
= peer_create_bind_dynamic_neighbor(gbgp
, su
, group
);
3818 gbgp
->dynamic_neighbors_count
= ++dncount
;
3820 if (bgp_debug_neighbor_events(peer
))
3821 zlog_debug("%s Dynamic Neighbor added, group %s count %d",
3822 peer
->host
, group
->name
, dncount
);
3827 static void peer_drop_dynamic_neighbor(struct peer
*peer
)
3830 if (peer
->group
->bgp
) {
3831 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3833 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3835 if (bgp_debug_neighbor_events(peer
))
3836 zlog_debug("%s dropped from group %s, count %d", peer
->host
,
3837 peer
->group
->name
, dncount
);
3840 /* If peer is configured at least one address family return 1. */
3841 int peer_active(struct peer
*peer
)
3843 if (BGP_PEER_SU_UNSPEC(peer
))
3845 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
] || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3846 || peer
->afc
[AFI_IP
][SAFI_LABELED_UNICAST
]
3847 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
] || peer
->afc
[AFI_IP
][SAFI_ENCAP
]
3848 || peer
->afc
[AFI_IP
][SAFI_FLOWSPEC
]
3849 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3850 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
]
3851 || peer
->afc
[AFI_IP6
][SAFI_LABELED_UNICAST
]
3852 || peer
->afc
[AFI_IP6
][SAFI_MPLS_VPN
]
3853 || peer
->afc
[AFI_IP6
][SAFI_ENCAP
]
3854 || peer
->afc
[AFI_IP6
][SAFI_FLOWSPEC
]
3855 || peer
->afc
[AFI_L2VPN
][SAFI_EVPN
])
3860 /* If peer is negotiated at least one address family return 1. */
3861 int peer_active_nego(struct peer
*peer
)
3863 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3864 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3865 || peer
->afc_nego
[AFI_IP
][SAFI_LABELED_UNICAST
]
3866 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3867 || peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
3868 || peer
->afc_nego
[AFI_IP
][SAFI_FLOWSPEC
]
3869 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3870 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
3871 || peer
->afc_nego
[AFI_IP6
][SAFI_LABELED_UNICAST
]
3872 || peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
3873 || peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
3874 || peer
->afc_nego
[AFI_IP6
][SAFI_FLOWSPEC
]
3875 || peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
])
3880 void peer_change_action(struct peer
*peer
, afi_t afi
, safi_t safi
,
3881 enum peer_change_type type
)
3883 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
3886 if (peer
->status
!= Established
)
3889 if (type
== peer_change_reset
) {
3890 /* If we're resetting session, we've to delete both peer struct
3892 if ((peer
->doppelganger
)
3893 && (peer
->doppelganger
->status
!= Deleted
)
3894 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3895 PEER_FLAG_CONFIG_NODE
)))
3896 peer_delete(peer
->doppelganger
);
3898 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3899 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3900 } else if (type
== peer_change_reset_in
) {
3901 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3902 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3903 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0);
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
);
3914 } else if (type
== peer_change_reset_out
) {
3915 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3916 bgp_announce_route(peer
, afi
, safi
);
3920 struct peer_flag_action
{
3924 /* This flag can be set for peer-group member. */
3925 uint8_t not_for_member
;
3927 /* Action when the flag is changed. */
3928 enum peer_change_type type
;
3931 static const struct peer_flag_action peer_flag_action_list
[] = {
3932 {PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3933 {PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3934 {PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3935 {PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3936 {PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3937 {PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3938 {PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3939 {PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3940 {PEER_FLAG_ENFORCE_FIRST_AS
, 0, peer_change_reset_in
},
3941 {PEER_FLAG_IFPEER_V6ONLY
, 0, peer_change_reset
},
3942 {PEER_FLAG_ROUTEADV
, 0, peer_change_none
},
3943 {PEER_FLAG_TIMER
, 0, peer_change_none
},
3944 {PEER_FLAG_TIMER_CONNECT
, 0, peer_change_none
},
3945 {PEER_FLAG_PASSWORD
, 0, peer_change_none
},
3946 {PEER_FLAG_LOCAL_AS
, 0, peer_change_none
},
3947 {PEER_FLAG_LOCAL_AS_NO_PREPEND
, 0, peer_change_none
},
3948 {PEER_FLAG_LOCAL_AS_REPLACE_AS
, 0, peer_change_none
},
3949 {PEER_FLAG_UPDATE_SOURCE
, 0, peer_change_none
},
3952 static const struct peer_flag_action peer_af_flag_action_list
[] = {
3953 {PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3954 {PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3955 {PEER_FLAG_SEND_LARGE_COMMUNITY
, 1, peer_change_reset_out
},
3956 {PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3957 {PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3958 {PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3959 {PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3960 {PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3961 {PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3962 {PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3963 {PEER_FLAG_DEFAULT_ORIGINATE
, 0, peer_change_none
},
3964 {PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3965 {PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3966 {PEER_FLAG_ALLOWAS_IN_ORIGIN
, 0, peer_change_reset_in
},
3967 {PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3968 {PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3969 {PEER_FLAG_MAX_PREFIX
, 0, peer_change_none
},
3970 {PEER_FLAG_MAX_PREFIX_WARNING
, 0, peer_change_none
},
3971 {PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3972 {PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3973 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3974 {PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
, 1, peer_change_reset_out
},
3975 {PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3976 {PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
, 1, peer_change_reset_out
},
3977 {PEER_FLAG_WEIGHT
, 0, peer_change_reset_in
},
3980 /* Proper action set. */
3981 static int peer_flag_action_set(const struct peer_flag_action
*action_list
,
3982 int size
, struct peer_flag_action
*action
,
3989 const struct peer_flag_action
*match
= NULL
;
3991 /* Check peer's frag action. */
3992 for (i
= 0; i
< size
; i
++) {
3993 match
= &action_list
[i
];
3995 if (match
->flag
== 0)
3998 if (match
->flag
& flag
) {
4001 if (match
->type
== peer_change_reset_in
)
4003 if (match
->type
== peer_change_reset_out
)
4005 if (match
->type
== peer_change_reset
) {
4009 if (match
->not_for_member
)
4010 action
->not_for_member
= 1;
4014 /* Set peer clear type. */
4015 if (reset_in
&& reset_out
)
4016 action
->type
= peer_change_reset
;
4018 action
->type
= peer_change_reset_in
;
4020 action
->type
= peer_change_reset_out
;
4022 action
->type
= peer_change_none
;
4027 static void peer_flag_modify_action(struct peer
*peer
, uint32_t flag
)
4029 if (flag
== PEER_FLAG_SHUTDOWN
) {
4030 if (CHECK_FLAG(peer
->flags
, flag
)) {
4031 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
4032 peer_nsf_stop(peer
);
4034 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4035 if (peer
->t_pmax_restart
) {
4036 BGP_TIMER_OFF(peer
->t_pmax_restart
);
4037 if (bgp_debug_neighbor_events(peer
))
4039 "%s Maximum-prefix restart timer canceled",
4043 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_NSF_WAIT
))
4044 peer_nsf_stop(peer
);
4046 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4047 char *msg
= peer
->tx_shutdown_message
;
4050 if (!msg
&& peer_group_active(peer
))
4051 msg
= peer
->group
->conf
4052 ->tx_shutdown_message
;
4053 msglen
= msg
? strlen(msg
) : 0;
4058 uint8_t msgbuf
[129];
4061 memcpy(msgbuf
+ 1, msg
, msglen
);
4063 bgp_notify_send_with_data(
4064 peer
, BGP_NOTIFY_CEASE
,
4065 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
,
4066 msgbuf
, msglen
+ 1);
4069 peer
, BGP_NOTIFY_CEASE
,
4070 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
4072 bgp_session_reset(peer
);
4074 peer
->v_start
= BGP_INIT_START_TIMER
;
4075 BGP_EVENT_ADD(peer
, BGP_Stop
);
4077 } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4078 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
4079 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4080 else if (flag
== PEER_FLAG_PASSIVE
)
4081 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
4082 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
4083 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
4085 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4086 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4088 bgp_session_reset(peer
);
4091 /* Change specified peer flag. */
4092 static int peer_flag_modify(struct peer
*peer
, uint32_t flag
, int set
)
4096 bool invert
, member_invert
;
4097 struct peer
*member
;
4098 struct listnode
*node
, *nnode
;
4099 struct peer_flag_action action
;
4101 memset(&action
, 0, sizeof(struct peer_flag_action
));
4102 size
= sizeof peer_flag_action_list
/ sizeof(struct peer_flag_action
);
4104 invert
= CHECK_FLAG(peer
->flags_invert
, flag
);
4105 found
= peer_flag_action_set(peer_flag_action_list
, size
, &action
,
4108 /* Abort if no flag action exists. */
4110 return BGP_ERR_INVALID_FLAG
;
4112 /* Check for flag conflict: STRICT_CAP_MATCH && OVERRIDE_CAPABILITY */
4113 if (set
&& CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
4114 && CHECK_FLAG(peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4115 return BGP_ERR_PEER_FLAG_CONFLICT
;
4117 /* Handle flag updates where desired state matches current state. */
4118 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4119 if (set
&& CHECK_FLAG(peer
->flags
, flag
)) {
4120 COND_FLAG(peer
->flags_override
, flag
, !invert
);
4124 if (!set
&& !CHECK_FLAG(peer
->flags
, flag
)) {
4125 COND_FLAG(peer
->flags_override
, flag
, invert
);
4130 /* Inherit from peer-group or set/unset flags accordingly. */
4131 if (peer_group_active(peer
) && set
== invert
)
4132 peer_flag_inherit(peer
, flag
);
4134 COND_FLAG(peer
->flags
, flag
, set
);
4136 /* Check if handling a regular peer. */
4137 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4138 /* Update flag override state accordingly. */
4139 COND_FLAG(peer
->flags_override
, flag
, set
!= invert
);
4141 /* Execute flag action on peer. */
4142 if (action
.type
== peer_change_reset
)
4143 peer_flag_modify_action(peer
, flag
);
4145 /* Skip peer-group mechanics for regular peers. */
4149 if (set
&& flag
== PEER_FLAG_CAPABILITY_ENHE
)
4150 bgp_nht_register_enhe_capability_interfaces(peer
);
4153 * Update peer-group members, unless they are explicitely overriding
4154 * peer-group configuration.
4156 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4157 /* Skip peers with overridden configuration. */
4158 if (CHECK_FLAG(member
->flags_override
, flag
))
4161 /* Check if only member without group is inverted. */
4163 CHECK_FLAG(member
->flags_invert
, flag
) && !invert
;
4165 /* Skip peers with equivalent configuration. */
4166 if (set
!= member_invert
&& CHECK_FLAG(member
->flags
, flag
))
4169 if (set
== member_invert
&& !CHECK_FLAG(member
->flags
, flag
))
4172 /* Update flag on peer-group member. */
4173 COND_FLAG(member
->flags
, flag
, set
!= member_invert
);
4175 if (set
&& flag
== PEER_FLAG_CAPABILITY_ENHE
)
4176 bgp_nht_register_enhe_capability_interfaces(member
);
4178 /* Execute flag action on peer-group member. */
4179 if (action
.type
== peer_change_reset
)
4180 peer_flag_modify_action(member
, flag
);
4186 int peer_flag_set(struct peer
*peer
, uint32_t flag
)
4188 return peer_flag_modify(peer
, flag
, 1);
4191 int peer_flag_unset(struct peer
*peer
, uint32_t flag
)
4193 return peer_flag_modify(peer
, flag
, 0);
4196 static int peer_af_flag_modify(struct peer
*peer
, afi_t afi
, safi_t safi
,
4197 uint32_t flag
, bool set
)
4201 bool invert
, member_invert
;
4202 struct peer
*member
;
4203 struct listnode
*node
, *nnode
;
4204 struct peer_flag_action action
;
4206 memset(&action
, 0, sizeof(struct peer_flag_action
));
4207 size
= sizeof peer_af_flag_action_list
4208 / sizeof(struct peer_flag_action
);
4210 invert
= CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
);
4211 found
= peer_flag_action_set(peer_af_flag_action_list
, size
, &action
,
4214 /* Abort if flag action exists. */
4216 return BGP_ERR_INVALID_FLAG
;
4218 /* Special check for reflector client. */
4219 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
4220 && peer_sort(peer
) != BGP_PEER_IBGP
)
4221 return BGP_ERR_NOT_INTERNAL_PEER
;
4223 /* Special check for remove-private-AS. */
4224 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
4225 && peer_sort(peer
) == BGP_PEER_IBGP
)
4226 return BGP_ERR_REMOVE_PRIVATE_AS
;
4228 /* as-override is not allowed for IBGP peers */
4229 if (flag
& PEER_FLAG_AS_OVERRIDE
&& peer_sort(peer
) == BGP_PEER_IBGP
)
4230 return BGP_ERR_AS_OVERRIDE
;
4232 /* Handle flag updates where desired state matches current state. */
4233 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4234 if (set
&& CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4235 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4240 if (!set
&& !CHECK_FLAG(peer
->af_flags
[afi
][safi
], flag
)) {
4241 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4248 * For EVPN we implicitly set the NEXTHOP_UNCHANGED flag,
4249 * if we are setting/unsetting flags which conflict with this flag
4250 * handle accordingly
4252 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
4256 * if we are setting NEXTHOP_SELF, we need to unset the
4257 * NEXTHOP_UNCHANGED flag
4259 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4260 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4261 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4262 PEER_FLAG_NEXTHOP_UNCHANGED
);
4266 * if we are unsetting NEXTHOP_SELF, we need to set the
4267 * NEXTHOP_UNCHANGED flag to reset the defaults for EVPN
4269 if (CHECK_FLAG(flag
, PEER_FLAG_NEXTHOP_SELF
) ||
4270 CHECK_FLAG(flag
, PEER_FLAG_FORCE_NEXTHOP_SELF
))
4271 SET_FLAG(peer
->af_flags
[afi
][safi
],
4272 PEER_FLAG_NEXTHOP_UNCHANGED
);
4276 /* Inherit from peer-group or set/unset flags accordingly. */
4277 if (peer_group_active(peer
) && set
== invert
)
4278 peer_af_flag_inherit(peer
, afi
, safi
, flag
);
4280 COND_FLAG(peer
->af_flags
[afi
][safi
], flag
, set
);
4282 /* Execute action when peer is established. */
4283 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)
4284 && peer
->status
== Established
) {
4285 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4286 bgp_clear_adj_in(peer
, afi
, safi
);
4288 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4289 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
4290 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
4291 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
4292 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
4293 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4294 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
4295 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
4297 peer_change_action(peer
, afi
, safi
, action
.type
);
4301 /* Check if handling a regular peer. */
4302 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4303 COND_FLAG(peer
->af_flags_override
[afi
][safi
], flag
,
4307 * Update peer-group members, unless they are explicitely
4308 * overriding peer-group configuration.
4310 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
,
4312 /* Skip peers with overridden configuration. */
4313 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4317 /* Check if only member without group is inverted. */
4319 CHECK_FLAG(member
->af_flags_invert
[afi
][safi
],
4323 /* Skip peers with equivalent configuration. */
4324 if (set
!= member_invert
4325 && CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4328 if (set
== member_invert
4329 && !CHECK_FLAG(member
->af_flags
[afi
][safi
], flag
))
4332 /* Update flag on peer-group member. */
4333 COND_FLAG(member
->af_flags
[afi
][safi
], flag
,
4334 set
!= member_invert
);
4336 /* Execute flag action on peer-group member. */
4337 if (member
->status
== Established
) {
4338 if (!set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
4339 bgp_clear_adj_in(member
, afi
, safi
);
4341 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
4342 member
->last_reset
=
4343 PEER_DOWN_RR_CLIENT_CHANGE
;
4345 == PEER_FLAG_RSERVER_CLIENT
)
4346 member
->last_reset
=
4347 PEER_DOWN_RS_CLIENT_CHANGE
;
4349 == PEER_FLAG_ORF_PREFIX_SM
)
4350 member
->last_reset
=
4351 PEER_DOWN_CAPABILITY_CHANGE
;
4353 == PEER_FLAG_ORF_PREFIX_RM
)
4354 member
->last_reset
=
4355 PEER_DOWN_CAPABILITY_CHANGE
;
4357 peer_change_action(member
, afi
, safi
,
4367 int peer_af_flag_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
4369 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 1);
4372 int peer_af_flag_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, uint32_t flag
)
4374 return peer_af_flag_modify(peer
, afi
, safi
, flag
, 0);
4378 int peer_tx_shutdown_message_set(struct peer
*peer
, const char *msg
)
4380 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4381 peer
->tx_shutdown_message
=
4382 msg
? XSTRDUP(MTYPE_PEER_TX_SHUTDOWN_MSG
, msg
) : NULL
;
4386 int peer_tx_shutdown_message_unset(struct peer
*peer
)
4388 XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG
, peer
->tx_shutdown_message
);
4393 /* EBGP multihop configuration. */
4394 int peer_ebgp_multihop_set(struct peer
*peer
, int ttl
)
4396 struct peer_group
*group
;
4397 struct listnode
*node
, *nnode
;
4400 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
4403 /* see comment in peer_ttl_security_hops_set() */
4404 if (ttl
!= MAXTTL
) {
4405 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4406 group
= peer
->group
;
4407 if (group
->conf
->gtsm_hops
!= 0)
4408 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4410 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
4412 if (peer1
->sort
== BGP_PEER_IBGP
)
4415 if (peer1
->gtsm_hops
!= 0)
4416 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4419 if (peer
->gtsm_hops
!= 0)
4420 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4426 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4427 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
) {
4428 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4429 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4430 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4432 bgp_session_reset(peer
);
4435 group
= peer
->group
;
4436 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4437 if (peer
->sort
== BGP_PEER_IBGP
)
4440 peer
->ttl
= group
->conf
->ttl
;
4442 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4443 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4444 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4446 bgp_session_reset(peer
);
4452 int peer_ebgp_multihop_unset(struct peer
*peer
)
4454 struct peer_group
*group
;
4455 struct listnode
*node
, *nnode
;
4457 if (peer
->sort
== BGP_PEER_IBGP
)
4460 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
4461 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4463 if (peer_group_active(peer
))
4464 peer
->ttl
= peer
->group
->conf
->ttl
;
4466 peer
->ttl
= BGP_DEFAULT_TTL
;
4468 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4469 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4470 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4471 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4473 bgp_session_reset(peer
);
4475 group
= peer
->group
;
4476 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
4477 if (peer
->sort
== BGP_PEER_IBGP
)
4480 peer
->ttl
= BGP_DEFAULT_TTL
;
4482 if (peer
->fd
>= 0) {
4483 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4485 peer
, BGP_NOTIFY_CEASE
,
4486 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4488 bgp_session_reset(peer
);
4495 /* Neighbor description. */
4496 int peer_description_set(struct peer
*peer
, const char *desc
)
4498 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
4500 peer
->desc
= XSTRDUP(MTYPE_PEER_DESC
, desc
);
4505 int peer_description_unset(struct peer
*peer
)
4507 XFREE(MTYPE_PEER_DESC
, peer
->desc
);
4514 /* Neighbor update-source. */
4515 int peer_update_source_if_set(struct peer
*peer
, const char *ifname
)
4517 struct peer
*member
;
4518 struct listnode
*node
, *nnode
;
4520 /* Set flag and configuration on peer. */
4521 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
4522 if (peer
->update_if
) {
4523 if (strcmp(peer
->update_if
, ifname
) == 0)
4525 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4527 peer
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
4528 sockunion_free(peer
->update_source
);
4529 peer
->update_source
= NULL
;
4531 /* Check if handling a regular peer. */
4532 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4533 /* Send notification or reset peer depending on state. */
4534 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4535 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4536 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4537 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4539 bgp_session_reset(peer
);
4541 /* Skip peer-group mechanics for regular peers. */
4546 * Set flag and configuration on all peer-group members, unless they are
4547 * explicitely overriding peer-group configuration.
4549 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4550 /* Skip peers with overridden configuration. */
4551 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4554 /* Skip peers with the same configuration. */
4555 if (member
->update_if
) {
4556 if (strcmp(member
->update_if
, ifname
) == 0)
4558 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4561 /* Set flag and configuration on peer-group member. */
4562 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4563 member
->update_if
= XSTRDUP(MTYPE_PEER_UPDATE_SOURCE
, ifname
);
4564 sockunion_free(member
->update_source
);
4565 member
->update_source
= NULL
;
4567 /* Send notification or reset peer depending on state. */
4568 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4569 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4570 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4571 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4573 bgp_session_reset(member
);
4579 int peer_update_source_addr_set(struct peer
*peer
, const union sockunion
*su
)
4581 struct peer
*member
;
4582 struct listnode
*node
, *nnode
;
4584 /* Set flag and configuration on peer. */
4585 peer_flag_set(peer
, PEER_FLAG_UPDATE_SOURCE
);
4586 if (peer
->update_source
) {
4587 if (sockunion_cmp(peer
->update_source
, su
) == 0)
4589 sockunion_free(peer
->update_source
);
4591 peer
->update_source
= sockunion_dup(su
);
4592 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4594 /* Check if handling a regular peer. */
4595 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4596 /* Send notification or reset peer depending on state. */
4597 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4598 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4599 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4600 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4602 bgp_session_reset(peer
);
4604 /* Skip peer-group mechanics for regular peers. */
4609 * Set flag and configuration on all peer-group members, unless they are
4610 * explicitely overriding peer-group configuration.
4612 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4613 /* Skip peers with overridden configuration. */
4614 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4617 /* Skip peers with the same configuration. */
4618 if (member
->update_source
) {
4619 if (sockunion_cmp(member
->update_source
, su
) == 0)
4621 sockunion_free(member
->update_source
);
4624 /* Set flag and configuration on peer-group member. */
4625 SET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4626 member
->update_source
= sockunion_dup(su
);
4627 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4629 /* Send notification or reset peer depending on state. */
4630 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4631 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4632 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4633 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4635 bgp_session_reset(member
);
4641 int peer_update_source_unset(struct peer
*peer
)
4643 struct peer
*member
;
4644 struct listnode
*node
, *nnode
;
4646 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_UPDATE_SOURCE
))
4649 /* Inherit configuration from peer-group if peer is member. */
4650 if (peer_group_active(peer
)) {
4651 peer_flag_inherit(peer
, PEER_FLAG_UPDATE_SOURCE
);
4652 PEER_SU_ATTR_INHERIT(peer
, peer
->group
, update_source
);
4653 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, update_if
,
4654 MTYPE_PEER_UPDATE_SOURCE
);
4656 /* Otherwise remove flag and configuration from peer. */
4657 peer_flag_unset(peer
, PEER_FLAG_UPDATE_SOURCE
);
4658 sockunion_free(peer
->update_source
);
4659 peer
->update_source
= NULL
;
4660 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4663 /* Check if handling a regular peer. */
4664 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4665 /* Send notification or reset peer depending on state. */
4666 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4667 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4668 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4669 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4671 bgp_session_reset(peer
);
4673 /* Skip peer-group mechanics for regular peers. */
4678 * Set flag and configuration on all peer-group members, unless they are
4679 * explicitely overriding peer-group configuration.
4681 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4682 /* Skip peers with overridden configuration. */
4683 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_UPDATE_SOURCE
))
4686 /* Skip peers with the same configuration. */
4687 if (!CHECK_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
)
4688 && !member
->update_source
&& !member
->update_if
)
4691 /* Remove flag and configuration on peer-group member. */
4692 UNSET_FLAG(member
->flags
, PEER_FLAG_UPDATE_SOURCE
);
4693 sockunion_free(member
->update_source
);
4694 member
->update_source
= NULL
;
4695 XFREE(MTYPE_PEER_UPDATE_SOURCE
, member
->update_if
);
4697 /* Send notification or reset peer depending on state. */
4698 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
4699 member
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4700 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
4701 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4703 bgp_session_reset(member
);
4709 int peer_default_originate_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
4710 const char *rmap
, struct route_map
*route_map
)
4712 struct peer
*member
;
4713 struct listnode
*node
, *nnode
;
4715 /* Set flag and configuration on peer. */
4716 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
);
4718 if (!peer
->default_rmap
[afi
][safi
].name
4719 || strcmp(rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0) {
4720 if (peer
->default_rmap
[afi
][safi
].name
)
4721 XFREE(MTYPE_ROUTE_MAP_NAME
,
4722 peer
->default_rmap
[afi
][safi
].name
);
4724 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4725 peer
->default_rmap
[afi
][safi
].name
=
4726 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4727 peer
->default_rmap
[afi
][safi
].map
= route_map
;
4728 route_map_counter_increment(route_map
);
4731 if (peer
->default_rmap
[afi
][safi
].name
)
4732 XFREE(MTYPE_ROUTE_MAP_NAME
,
4733 peer
->default_rmap
[afi
][safi
].name
);
4735 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4736 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4737 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4740 /* Check if handling a regular peer. */
4741 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4742 /* Update peer route announcements. */
4743 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4744 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4745 bgp_default_originate(peer
, afi
, safi
, 0);
4746 bgp_announce_route(peer
, afi
, safi
);
4749 /* Skip peer-group mechanics for regular peers. */
4754 * Set flag and configuration on all peer-group members, unless they are
4755 * explicitely overriding peer-group configuration.
4757 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4758 /* Skip peers with overridden configuration. */
4759 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4760 PEER_FLAG_DEFAULT_ORIGINATE
))
4763 /* Set flag and configuration on peer-group member. */
4764 SET_FLAG(member
->af_flags
[afi
][safi
],
4765 PEER_FLAG_DEFAULT_ORIGINATE
);
4767 if (member
->default_rmap
[afi
][safi
].name
)
4768 XFREE(MTYPE_ROUTE_MAP_NAME
,
4769 member
->default_rmap
[afi
][safi
].name
);
4770 route_map_counter_decrement(
4771 member
->default_rmap
[afi
][safi
].map
);
4772 member
->default_rmap
[afi
][safi
].name
=
4773 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4774 member
->default_rmap
[afi
][safi
].map
= route_map
;
4775 route_map_counter_increment(route_map
);
4778 /* Update peer route announcements. */
4779 if (member
->status
== Established
4780 && member
->afc_nego
[afi
][safi
]) {
4781 update_group_adjust_peer(
4782 peer_af_find(member
, afi
, safi
));
4783 bgp_default_originate(member
, afi
, safi
, 0);
4784 bgp_announce_route(member
, afi
, safi
);
4791 int peer_default_originate_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
4793 struct peer
*member
;
4794 struct listnode
*node
, *nnode
;
4796 /* Inherit configuration from peer-group if peer is member. */
4797 if (peer_group_active(peer
)) {
4798 peer_af_flag_inherit(peer
, afi
, safi
,
4799 PEER_FLAG_DEFAULT_ORIGINATE
);
4800 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
4801 default_rmap
[afi
][safi
].name
,
4802 MTYPE_ROUTE_MAP_NAME
);
4803 PEER_ATTR_INHERIT(peer
, peer
->group
,
4804 default_rmap
[afi
][safi
].map
);
4806 /* Otherwise remove flag and configuration from peer. */
4807 peer_af_flag_unset(peer
, afi
, safi
,
4808 PEER_FLAG_DEFAULT_ORIGINATE
);
4809 if (peer
->default_rmap
[afi
][safi
].name
)
4810 XFREE(MTYPE_ROUTE_MAP_NAME
,
4811 peer
->default_rmap
[afi
][safi
].name
);
4812 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4813 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4814 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4817 /* Check if handling a regular peer. */
4818 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
4819 /* Update peer route announcements. */
4820 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4821 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4822 bgp_default_originate(peer
, afi
, safi
, 1);
4823 bgp_announce_route(peer
, afi
, safi
);
4826 /* Skip peer-group mechanics for regular peers. */
4831 * Remove flag and configuration from all peer-group members, unless
4832 * they are explicitely overriding peer-group configuration.
4834 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4835 /* Skip peers with overridden configuration. */
4836 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4837 PEER_FLAG_DEFAULT_ORIGINATE
))
4840 /* Remove flag and configuration on peer-group member. */
4841 UNSET_FLAG(peer
->af_flags
[afi
][safi
],
4842 PEER_FLAG_DEFAULT_ORIGINATE
);
4843 if (peer
->default_rmap
[afi
][safi
].name
)
4844 XFREE(MTYPE_ROUTE_MAP_NAME
,
4845 peer
->default_rmap
[afi
][safi
].name
);
4846 route_map_counter_decrement(peer
->default_rmap
[afi
][safi
].map
);
4847 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4848 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4850 /* Update peer route announcements. */
4851 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4852 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4853 bgp_default_originate(peer
, afi
, safi
, 1);
4854 bgp_announce_route(peer
, afi
, safi
);
4861 int peer_port_set(struct peer
*peer
, uint16_t port
)
4867 int peer_port_unset(struct peer
*peer
)
4869 peer
->port
= BGP_PORT_DEFAULT
;
4874 * Helper function that is called after the name of the policy
4875 * being used by a peer has changed (AF specific). Automatically
4876 * initiates inbound or outbound processing as needed.
4878 static void peer_on_policy_change(struct peer
*peer
, afi_t afi
, safi_t safi
,
4882 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4883 if (peer
->status
== Established
)
4884 bgp_announce_route(peer
, afi
, safi
);
4886 if (peer
->status
!= Established
)
4889 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
4890 PEER_FLAG_SOFT_RECONFIG
))
4891 bgp_soft_reconfig_in(peer
, afi
, safi
);
4892 else if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4893 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4894 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0, 0);
4899 /* neighbor weight. */
4900 int peer_weight_set(struct peer
*peer
, afi_t afi
, safi_t safi
, uint16_t weight
)
4902 struct peer
*member
;
4903 struct listnode
*node
, *nnode
;
4905 /* Set flag and configuration on peer. */
4906 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4907 if (peer
->weight
[afi
][safi
] != weight
) {
4908 peer
->weight
[afi
][safi
] = weight
;
4909 peer_on_policy_change(peer
, afi
, safi
, 0);
4912 /* Skip peer-group mechanics for regular peers. */
4913 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4917 * Set flag and configuration on all peer-group members, unless they are
4918 * explicitely overriding peer-group configuration.
4920 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4921 /* Skip peers with overridden configuration. */
4922 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4926 /* Set flag and configuration on peer-group member. */
4927 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
4928 if (member
->weight
[afi
][safi
] != weight
) {
4929 member
->weight
[afi
][safi
] = weight
;
4930 peer_on_policy_change(member
, afi
, safi
, 0);
4937 int peer_weight_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
4939 struct peer
*member
;
4940 struct listnode
*node
, *nnode
;
4942 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
4945 /* Inherit configuration from peer-group if peer is member. */
4946 if (peer_group_active(peer
)) {
4947 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4948 PEER_ATTR_INHERIT(peer
, peer
->group
, weight
[afi
][safi
]);
4950 peer_on_policy_change(peer
, afi
, safi
, 0);
4954 /* Remove flag and configuration from peer. */
4955 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_WEIGHT
);
4956 peer
->weight
[afi
][safi
] = 0;
4957 peer_on_policy_change(peer
, afi
, safi
, 0);
4959 /* Skip peer-group mechanics for regular peers. */
4960 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
4964 * Remove flag and configuration from all peer-group members, unless
4965 * they are explicitely overriding peer-group configuration.
4967 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
4968 /* Skip peers with overridden configuration. */
4969 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
4973 /* Skip peers where flag is already disabled. */
4974 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
))
4977 /* Remove flag and configuration on peer-group member. */
4978 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_WEIGHT
);
4979 member
->weight
[afi
][safi
] = 0;
4980 peer_on_policy_change(member
, afi
, safi
, 0);
4986 int peer_timers_set(struct peer
*peer
, uint32_t keepalive
, uint32_t holdtime
)
4988 struct peer
*member
;
4989 struct listnode
*node
, *nnode
;
4991 if (keepalive
> 65535)
4992 return BGP_ERR_INVALID_VALUE
;
4994 if (holdtime
> 65535)
4995 return BGP_ERR_INVALID_VALUE
;
4997 if (holdtime
< 3 && holdtime
!= 0)
4998 return BGP_ERR_INVALID_VALUE
;
5000 /* Set flag and configuration on peer. */
5001 peer_flag_set(peer
, PEER_FLAG_TIMER
);
5002 peer
->holdtime
= holdtime
;
5003 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
5005 /* Skip peer-group mechanics for regular peers. */
5006 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5010 * Set flag and configuration on all peer-group members, unless they are
5011 * explicitely overriding peer-group configuration.
5013 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5014 /* Skip peers with overridden configuration. */
5015 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
5018 /* Set flag and configuration on peer-group member. */
5019 SET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
5020 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
5021 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
5027 int peer_timers_unset(struct peer
*peer
)
5029 struct peer
*member
;
5030 struct listnode
*node
, *nnode
;
5032 /* Inherit configuration from peer-group if peer is member. */
5033 if (peer_group_active(peer
)) {
5034 peer_flag_inherit(peer
, PEER_FLAG_TIMER
);
5035 PEER_ATTR_INHERIT(peer
, peer
->group
, holdtime
);
5036 PEER_ATTR_INHERIT(peer
, peer
->group
, keepalive
);
5038 /* Otherwise remove flag and configuration from peer. */
5039 peer_flag_unset(peer
, PEER_FLAG_TIMER
);
5041 peer
->keepalive
= 0;
5044 /* Skip peer-group mechanics for regular peers. */
5045 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5049 * Remove flag and configuration from all peer-group members, unless
5050 * they are explicitely overriding peer-group configuration.
5052 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5053 /* Skip peers with overridden configuration. */
5054 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER
))
5057 /* Remove flag and configuration on peer-group member. */
5058 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER
);
5059 member
->holdtime
= 0;
5060 member
->keepalive
= 0;
5066 int peer_timers_connect_set(struct peer
*peer
, uint32_t connect
)
5068 struct peer
*member
;
5069 struct listnode
*node
, *nnode
;
5071 if (connect
> 65535)
5072 return BGP_ERR_INVALID_VALUE
;
5074 /* Set flag and configuration on peer. */
5075 peer_flag_set(peer
, PEER_FLAG_TIMER_CONNECT
);
5076 peer
->connect
= connect
;
5077 peer
->v_connect
= connect
;
5079 /* Skip peer-group mechanics for regular peers. */
5080 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5084 * Set flag and configuration on all peer-group members, unless they are
5085 * explicitely overriding peer-group configuration.
5087 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5088 /* Skip peers with overridden configuration. */
5089 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5092 /* Set flag and configuration on peer-group member. */
5093 SET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5094 member
->connect
= connect
;
5095 member
->v_connect
= connect
;
5101 int peer_timers_connect_unset(struct peer
*peer
)
5103 struct peer
*member
;
5104 struct listnode
*node
, *nnode
;
5106 /* Inherit configuration from peer-group if peer is member. */
5107 if (peer_group_active(peer
)) {
5108 peer_flag_inherit(peer
, PEER_FLAG_TIMER_CONNECT
);
5109 PEER_ATTR_INHERIT(peer
, peer
->group
, connect
);
5111 /* Otherwise remove flag and configuration from peer. */
5112 peer_flag_unset(peer
, PEER_FLAG_TIMER_CONNECT
);
5116 /* Set timer with fallback to default value. */
5118 peer
->v_connect
= peer
->connect
;
5120 peer
->v_connect
= peer
->bgp
->default_connect_retry
;
5122 /* Skip peer-group mechanics for regular peers. */
5123 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5127 * Remove flag and configuration from all peer-group members, unless
5128 * they are explicitely overriding peer-group configuration.
5130 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5131 /* Skip peers with overridden configuration. */
5132 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_TIMER_CONNECT
))
5135 /* Remove flag and configuration on peer-group member. */
5136 UNSET_FLAG(member
->flags
, PEER_FLAG_TIMER_CONNECT
);
5137 member
->connect
= 0;
5138 member
->v_connect
= peer
->bgp
->default_connect_retry
;
5144 int peer_advertise_interval_set(struct peer
*peer
, uint32_t routeadv
)
5146 struct peer
*member
;
5147 struct listnode
*node
, *nnode
;
5150 return BGP_ERR_INVALID_VALUE
;
5152 /* Set flag and configuration on peer. */
5153 peer_flag_set(peer
, PEER_FLAG_ROUTEADV
);
5154 peer
->routeadv
= routeadv
;
5155 peer
->v_routeadv
= routeadv
;
5157 /* Check if handling a regular peer. */
5158 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5159 /* Update peer route announcements. */
5160 update_group_adjust_peer_afs(peer
);
5161 if (peer
->status
== Established
)
5162 bgp_announce_route_all(peer
);
5164 /* Skip peer-group mechanics for regular peers. */
5169 * Set flag and configuration on all peer-group members, unless they are
5170 * explicitely overriding peer-group configuration.
5172 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5173 /* Skip peers with overridden configuration. */
5174 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5177 /* Set flag and configuration on peer-group member. */
5178 SET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5179 member
->routeadv
= routeadv
;
5180 member
->v_routeadv
= routeadv
;
5182 /* Update peer route announcements. */
5183 update_group_adjust_peer_afs(member
);
5184 if (member
->status
== Established
)
5185 bgp_announce_route_all(member
);
5191 int peer_advertise_interval_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_ROUTEADV
);
5199 PEER_ATTR_INHERIT(peer
, peer
->group
, routeadv
);
5201 /* Otherwise remove flag and configuration from peer. */
5202 peer_flag_unset(peer
, PEER_FLAG_ROUTEADV
);
5206 /* Set timer with fallback to default value. */
5208 peer
->v_routeadv
= peer
->routeadv
;
5210 peer
->v_routeadv
= (peer
->sort
== BGP_PEER_IBGP
)
5211 ? BGP_DEFAULT_IBGP_ROUTEADV
5212 : BGP_DEFAULT_EBGP_ROUTEADV
;
5214 /* Check if handling a regular peer. */
5215 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5216 /* Update peer route announcements. */
5217 update_group_adjust_peer_afs(peer
);
5218 if (peer
->status
== Established
)
5219 bgp_announce_route_all(peer
);
5221 /* Skip peer-group mechanics for regular peers. */
5226 * Remove flag and configuration from all peer-group members, unless
5227 * they are explicitely overriding peer-group configuration.
5229 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5230 /* Skip peers with overridden configuration. */
5231 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_ROUTEADV
))
5234 /* Remove flag and configuration on peer-group member. */
5235 UNSET_FLAG(member
->flags
, PEER_FLAG_ROUTEADV
);
5236 member
->routeadv
= 0;
5237 member
->v_routeadv
= (member
->sort
== BGP_PEER_IBGP
)
5238 ? BGP_DEFAULT_IBGP_ROUTEADV
5239 : BGP_DEFAULT_EBGP_ROUTEADV
;
5241 /* Update peer route announcements. */
5242 update_group_adjust_peer_afs(member
);
5243 if (member
->status
== Established
)
5244 bgp_announce_route_all(member
);
5250 /* neighbor interface */
5251 void peer_interface_set(struct peer
*peer
, const char *str
)
5253 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5254 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
5257 void peer_interface_unset(struct peer
*peer
)
5259 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
5260 peer
->ifname
= NULL
;
5264 int peer_allowas_in_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
5265 int allow_num
, int origin
)
5267 struct peer
*member
;
5268 struct listnode
*node
, *nnode
;
5270 if (!origin
&& (allow_num
< 1 || allow_num
> 10))
5271 return BGP_ERR_INVALID_VALUE
;
5273 /* Set flag and configuration on peer. */
5274 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5276 if (peer
->allowas_in
[afi
][safi
] != 0
5277 || !CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5278 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5279 peer_af_flag_set(peer
, afi
, safi
,
5280 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5281 peer
->allowas_in
[afi
][safi
] = 0;
5282 peer_on_policy_change(peer
, afi
, safi
, 0);
5285 if (peer
->allowas_in
[afi
][safi
] != allow_num
5286 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
5287 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5289 peer_af_flag_unset(peer
, afi
, safi
,
5290 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5291 peer
->allowas_in
[afi
][safi
] = allow_num
;
5292 peer_on_policy_change(peer
, afi
, safi
, 0);
5296 /* Skip peer-group mechanics for regular peers. */
5297 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5301 * Set flag and configuration on all peer-group members, unless
5302 * they are explicitely overriding peer-group configuration.
5304 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5305 /* Skip peers with overridden configuration. */
5306 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5307 PEER_FLAG_ALLOWAS_IN
))
5310 /* Set flag and configuration on peer-group member. */
5311 SET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
5313 if (member
->allowas_in
[afi
][safi
] != 0
5314 || !CHECK_FLAG(member
->af_flags
[afi
][safi
],
5315 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5316 SET_FLAG(member
->af_flags
[afi
][safi
],
5317 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5318 member
->allowas_in
[afi
][safi
] = 0;
5319 peer_on_policy_change(peer
, afi
, safi
, 0);
5322 if (member
->allowas_in
[afi
][safi
] != allow_num
5323 || CHECK_FLAG(member
->af_flags
[afi
][safi
],
5324 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
5325 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5326 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5327 member
->allowas_in
[afi
][safi
] = allow_num
;
5328 peer_on_policy_change(peer
, afi
, safi
, 0);
5336 int peer_allowas_in_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
5338 struct peer
*member
;
5339 struct listnode
*node
, *nnode
;
5341 /* Skip peer if flag is already disabled. */
5342 if (!CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
5345 /* Inherit configuration from peer-group if peer is member. */
5346 if (peer_group_active(peer
)) {
5347 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5348 peer_af_flag_inherit(peer
, afi
, safi
,
5349 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5350 PEER_ATTR_INHERIT(peer
, peer
->group
, allowas_in
[afi
][safi
]);
5351 peer_on_policy_change(peer
, afi
, safi
, 0);
5356 /* Remove flag and configuration from peer. */
5357 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
5358 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5359 peer
->allowas_in
[afi
][safi
] = 0;
5360 peer_on_policy_change(peer
, afi
, safi
, 0);
5362 /* Skip peer-group mechanics if handling a regular peer. */
5363 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
))
5367 * Remove flags and configuration from all peer-group members, unless
5368 * they are explicitely overriding peer-group configuration.
5370 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5371 /* Skip peers with overridden configuration. */
5372 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
5373 PEER_FLAG_ALLOWAS_IN
))
5376 /* Skip peers where flag is already disabled. */
5377 if (!CHECK_FLAG(member
->af_flags
[afi
][safi
],
5378 PEER_FLAG_ALLOWAS_IN
))
5381 /* Remove flags and configuration on peer-group member. */
5382 UNSET_FLAG(member
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
5383 UNSET_FLAG(member
->af_flags
[afi
][safi
],
5384 PEER_FLAG_ALLOWAS_IN_ORIGIN
);
5385 member
->allowas_in
[afi
][safi
] = 0;
5386 peer_on_policy_change(member
, afi
, safi
, 0);
5392 int peer_local_as_set(struct peer
*peer
, as_t as
, int no_prepend
,
5395 bool old_no_prepend
, old_replace_as
;
5396 struct bgp
*bgp
= peer
->bgp
;
5397 struct peer
*member
;
5398 struct listnode
*node
, *nnode
;
5400 if (peer_sort(peer
) != BGP_PEER_EBGP
5401 && peer_sort(peer
) != BGP_PEER_INTERNAL
)
5402 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
5405 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
5408 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
5410 /* Save previous flag states. */
5412 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5414 !!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5416 /* Set flag and configuration on peer. */
5417 peer_flag_set(peer
, PEER_FLAG_LOCAL_AS
);
5418 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
, no_prepend
);
5419 peer_flag_modify(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
, replace_as
);
5421 if (peer
->change_local_as
== as
&& old_no_prepend
== no_prepend
5422 && old_replace_as
== replace_as
)
5424 peer
->change_local_as
= as
;
5426 /* Check if handling a regular peer. */
5427 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5428 /* Send notification or reset peer depending on state. */
5429 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5430 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5431 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5432 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5434 bgp_session_reset(peer
);
5436 /* Skip peer-group mechanics for regular peers. */
5441 * Set flag and configuration on all peer-group members, unless they are
5442 * explicitely overriding peer-group configuration.
5444 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5445 /* Skip peers with overridden configuration. */
5446 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
5449 /* Skip peers with the same configuration. */
5450 old_no_prepend
= CHECK_FLAG(member
->flags
,
5451 PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5452 old_replace_as
= CHECK_FLAG(member
->flags
,
5453 PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5454 if (member
->change_local_as
== as
5455 && CHECK_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
)
5456 && old_no_prepend
== no_prepend
5457 && old_replace_as
== replace_as
)
5460 /* Set flag and configuration on peer-group member. */
5461 SET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
5462 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
,
5464 COND_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
,
5466 member
->change_local_as
= as
;
5468 /* Send notification or stop peer depending on state. */
5469 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5470 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5471 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5472 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5474 BGP_EVENT_ADD(member
, BGP_Stop
);
5480 int peer_local_as_unset(struct peer
*peer
)
5482 struct peer
*member
;
5483 struct listnode
*node
, *nnode
;
5485 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_LOCAL_AS
))
5488 /* Inherit configuration from peer-group if peer is member. */
5489 if (peer_group_active(peer
)) {
5490 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS
);
5491 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5492 peer_flag_inherit(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5493 PEER_ATTR_INHERIT(peer
, peer
->group
, change_local_as
);
5495 /* Otherwise remove flag and configuration from peer. */
5496 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS
);
5497 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5498 peer_flag_unset(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5499 peer
->change_local_as
= 0;
5502 /* Check if handling a regular peer. */
5503 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5504 /* Send notification or stop peer depending on state. */
5505 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
5506 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5507 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5508 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5510 BGP_EVENT_ADD(peer
, BGP_Stop
);
5512 /* Skip peer-group mechanics for regular peers. */
5517 * Remove flag and configuration from all peer-group members, unless
5518 * they are explicitely overriding peer-group configuration.
5520 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5521 /* Skip peers with overridden configuration. */
5522 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_LOCAL_AS
))
5525 /* Remove flag and configuration on peer-group member. */
5526 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS
);
5527 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
5528 UNSET_FLAG(member
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
5529 member
->change_local_as
= 0;
5531 /* Send notification or stop peer depending on state. */
5532 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
)) {
5533 member
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
5534 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5535 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5537 bgp_session_reset(member
);
5543 /* Set password for authenticating with the peer. */
5544 int peer_password_set(struct peer
*peer
, const char *password
)
5546 struct peer
*member
;
5547 struct listnode
*node
, *nnode
;
5548 int len
= password
? strlen(password
) : 0;
5549 int ret
= BGP_SUCCESS
;
5551 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
5552 return BGP_ERR_INVALID_VALUE
;
5554 /* Set flag and configuration on peer. */
5555 peer_flag_set(peer
, PEER_FLAG_PASSWORD
);
5556 if (peer
->password
&& strcmp(peer
->password
, password
) == 0)
5558 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
5559 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
5561 /* Check if handling a regular peer. */
5562 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5563 /* Send notification or reset peer depending on state. */
5564 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5565 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5566 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5568 bgp_session_reset(peer
);
5571 * Attempt to install password on socket and skip peer-group
5574 if (BGP_PEER_SU_UNSPEC(peer
))
5576 return (bgp_md5_set(peer
) >= 0) ? BGP_SUCCESS
5577 : BGP_ERR_TCPSIG_FAILED
;
5581 * Set flag and configuration on all peer-group members, unless they are
5582 * explicitely overriding peer-group configuration.
5584 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5585 /* Skip peers with overridden configuration. */
5586 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
5589 /* Skip peers with the same password. */
5590 if (member
->password
&& strcmp(member
->password
, password
) == 0)
5593 /* Set flag and configuration on peer-group member. */
5594 SET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
5595 if (member
->password
)
5596 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
5597 member
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
5599 /* Send notification or reset peer depending on state. */
5600 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
5601 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5602 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5604 bgp_session_reset(member
);
5606 /* Attempt to install password on socket. */
5607 if (!BGP_PEER_SU_UNSPEC(member
) && bgp_md5_set(member
) < 0)
5608 ret
= BGP_ERR_TCPSIG_FAILED
;
5611 /* Set flag and configuration on all peer-group listen ranges */
5612 struct listnode
*ln
;
5615 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP
], ln
, lr
))
5616 bgp_md5_set_prefix(lr
, password
);
5617 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP6
], ln
, lr
))
5618 bgp_md5_set_prefix(lr
, password
);
5623 int peer_password_unset(struct peer
*peer
)
5625 struct peer
*member
;
5626 struct listnode
*node
, *nnode
;
5628 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_PASSWORD
))
5631 /* Inherit configuration from peer-group if peer is member. */
5632 if (peer_group_active(peer
)) {
5633 peer_flag_inherit(peer
, PEER_FLAG_PASSWORD
);
5634 PEER_STR_ATTR_INHERIT(peer
, peer
->group
, password
,
5635 MTYPE_PEER_PASSWORD
);
5637 /* Otherwise remove flag and configuration from peer. */
5638 peer_flag_unset(peer
, PEER_FLAG_PASSWORD
);
5639 XFREE(MTYPE_PEER_PASSWORD
, peer
->password
);
5642 /* Check if handling a regular peer. */
5643 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5644 /* Send notification or reset peer depending on state. */
5645 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5646 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
5647 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5649 bgp_session_reset(peer
);
5651 /* Attempt to uninstall password on socket. */
5652 if (!BGP_PEER_SU_UNSPEC(peer
))
5653 bgp_md5_unset(peer
);
5655 /* Skip peer-group mechanics for regular peers. */
5660 * Remove flag and configuration from all peer-group members, unless
5661 * they are explicitely overriding peer-group configuration.
5663 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5664 /* Skip peers with overridden configuration. */
5665 if (CHECK_FLAG(member
->flags_override
, PEER_FLAG_PASSWORD
))
5668 /* Remove flag and configuration on peer-group member. */
5669 UNSET_FLAG(member
->flags
, PEER_FLAG_PASSWORD
);
5670 XFREE(MTYPE_PEER_PASSWORD
, member
->password
);
5672 /* Send notification or reset peer depending on state. */
5673 if (BGP_IS_VALID_STATE_FOR_NOTIF(member
->status
))
5674 bgp_notify_send(member
, BGP_NOTIFY_CEASE
,
5675 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
5677 bgp_session_reset(member
);
5679 /* Attempt to uninstall password on socket. */
5680 if (!BGP_PEER_SU_UNSPEC(member
))
5681 bgp_md5_unset(member
);
5684 /* Set flag and configuration on all peer-group listen ranges */
5685 struct listnode
*ln
;
5688 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP
], ln
, lr
))
5689 bgp_md5_unset_prefix(lr
);
5690 for (ALL_LIST_ELEMENTS_RO(peer
->group
->listen_range
[AFI_IP6
], ln
, lr
))
5691 bgp_md5_unset_prefix(lr
);
5697 /* Set distribute list to the peer. */
5698 int peer_distribute_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5701 struct peer
*member
;
5702 struct bgp_filter
*filter
;
5703 struct listnode
*node
, *nnode
;
5705 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5706 return BGP_ERR_INVALID_VALUE
;
5708 /* Set configuration on peer. */
5709 filter
= &peer
->filter
[afi
][safi
];
5710 if (filter
->plist
[direct
].name
)
5711 return BGP_ERR_PEER_FILTER_CONFLICT
;
5712 if (filter
->dlist
[direct
].name
)
5713 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
5714 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5715 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
5717 /* Check if handling a regular peer. */
5718 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5719 /* Set override-flag and process peer route updates. */
5720 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5721 PEER_FT_DISTRIBUTE_LIST
);
5722 peer_on_policy_change(peer
, afi
, safi
,
5723 (direct
== FILTER_OUT
) ? 1 : 0);
5725 /* Skip peer-group mechanics for regular peers. */
5730 * Set configuration on all peer-group members, un less they are
5731 * explicitely overriding peer-group configuration.
5733 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5734 /* Skip peers with overridden configuration. */
5735 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5736 PEER_FT_DISTRIBUTE_LIST
))
5739 /* Set configuration on peer-group member. */
5740 filter
= &member
->filter
[afi
][safi
];
5741 if (filter
->dlist
[direct
].name
)
5742 XFREE(MTYPE_BGP_FILTER_NAME
,
5743 filter
->dlist
[direct
].name
);
5744 filter
->dlist
[direct
].name
=
5745 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5746 filter
->dlist
[direct
].alist
= access_list_lookup(afi
, name
);
5748 /* Process peer route updates. */
5749 peer_on_policy_change(member
, afi
, safi
,
5750 (direct
== FILTER_OUT
) ? 1 : 0);
5756 int peer_distribute_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5758 struct peer
*member
;
5759 struct bgp_filter
*filter
;
5760 struct listnode
*node
, *nnode
;
5762 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5763 return BGP_ERR_INVALID_VALUE
;
5765 /* Unset override-flag unconditionally. */
5766 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5767 PEER_FT_DISTRIBUTE_LIST
);
5769 /* Inherit configuration from peer-group if peer is member. */
5770 if (peer_group_active(peer
)) {
5771 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
5772 filter
[afi
][safi
].dlist
[direct
].name
,
5773 MTYPE_BGP_FILTER_NAME
);
5774 PEER_ATTR_INHERIT(peer
, peer
->group
,
5775 filter
[afi
][safi
].dlist
[direct
].alist
);
5777 /* Otherwise remove configuration from peer. */
5778 filter
= &peer
->filter
[afi
][safi
];
5779 if (filter
->dlist
[direct
].name
)
5780 XFREE(MTYPE_BGP_FILTER_NAME
,
5781 filter
->dlist
[direct
].name
);
5782 filter
->dlist
[direct
].name
= NULL
;
5783 filter
->dlist
[direct
].alist
= NULL
;
5786 /* Check if handling a regular peer. */
5787 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5788 /* Process peer route updates. */
5789 peer_on_policy_change(peer
, afi
, safi
,
5790 (direct
== FILTER_OUT
) ? 1 : 0);
5792 /* Skip peer-group mechanics for regular peers. */
5797 * Remove configuration on all peer-group members, unless they are
5798 * explicitely overriding peer-group configuration.
5800 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5801 /* Skip peers with overridden configuration. */
5802 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5803 PEER_FT_DISTRIBUTE_LIST
))
5806 /* Remove configuration on peer-group member. */
5807 filter
= &member
->filter
[afi
][safi
];
5808 if (filter
->dlist
[direct
].name
)
5809 XFREE(MTYPE_BGP_FILTER_NAME
,
5810 filter
->dlist
[direct
].name
);
5811 filter
->dlist
[direct
].name
= NULL
;
5812 filter
->dlist
[direct
].alist
= NULL
;
5814 /* Process peer route updates. */
5815 peer_on_policy_change(member
, afi
, safi
,
5816 (direct
== FILTER_OUT
) ? 1 : 0);
5822 /* Update distribute list. */
5823 static void peer_distribute_update(struct access_list
*access
)
5828 struct listnode
*mnode
, *mnnode
;
5829 struct listnode
*node
, *nnode
;
5832 struct peer_group
*group
;
5833 struct bgp_filter
*filter
;
5835 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
5837 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
5838 access
->name
, 0, 0);
5839 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
5840 FOREACH_AFI_SAFI (afi
, safi
) {
5841 filter
= &peer
->filter
[afi
][safi
];
5843 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5845 if (filter
->dlist
[direct
].name
)
5846 filter
->dlist
[direct
]
5847 .alist
= access_list_lookup(
5849 filter
->dlist
[direct
]
5852 filter
->dlist
[direct
].alist
=
5857 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
5858 FOREACH_AFI_SAFI (afi
, safi
) {
5859 filter
= &group
->conf
->filter
[afi
][safi
];
5861 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
5863 if (filter
->dlist
[direct
].name
)
5864 filter
->dlist
[direct
]
5865 .alist
= access_list_lookup(
5867 filter
->dlist
[direct
]
5870 filter
->dlist
[direct
].alist
=
5876 vnc_prefix_list_update(bgp
);
5881 /* Set prefix list to the peer. */
5882 int peer_prefix_list_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5885 struct peer
*member
;
5886 struct bgp_filter
*filter
;
5887 struct listnode
*node
, *nnode
;
5889 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5890 return BGP_ERR_INVALID_VALUE
;
5892 /* Set configuration on peer. */
5893 filter
= &peer
->filter
[afi
][safi
];
5894 if (filter
->dlist
[direct
].name
)
5895 return BGP_ERR_PEER_FILTER_CONFLICT
;
5896 if (filter
->plist
[direct
].name
)
5897 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5898 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5899 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
5901 /* Check if handling a regular peer. */
5902 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5903 /* Set override-flag and process peer route updates. */
5904 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5905 PEER_FT_PREFIX_LIST
);
5906 peer_on_policy_change(peer
, afi
, safi
,
5907 (direct
== FILTER_OUT
) ? 1 : 0);
5909 /* Skip peer-group mechanics for regular peers. */
5914 * Set configuration on all peer-group members, unless they are
5915 * explicitely overriding peer-group configuration.
5917 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5918 /* Skip peers with overridden configuration. */
5919 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5920 PEER_FT_PREFIX_LIST
))
5923 /* Set configuration on peer-group member. */
5924 filter
= &member
->filter
[afi
][safi
];
5925 if (filter
->plist
[direct
].name
)
5926 XFREE(MTYPE_BGP_FILTER_NAME
,
5927 filter
->plist
[direct
].name
);
5928 filter
->plist
[direct
].name
=
5929 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5930 filter
->plist
[direct
].plist
= prefix_list_lookup(afi
, name
);
5932 /* Process peer route updates. */
5933 peer_on_policy_change(member
, afi
, safi
,
5934 (direct
== FILTER_OUT
) ? 1 : 0);
5940 int peer_prefix_list_unset(struct peer
*peer
, afi_t afi
, safi_t safi
,
5943 struct peer
*member
;
5944 struct bgp_filter
*filter
;
5945 struct listnode
*node
, *nnode
;
5947 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5948 return BGP_ERR_INVALID_VALUE
;
5950 /* Unset override-flag unconditionally. */
5951 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
5952 PEER_FT_PREFIX_LIST
);
5954 /* Inherit configuration from peer-group if peer is member. */
5955 if (peer_group_active(peer
)) {
5956 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
5957 filter
[afi
][safi
].plist
[direct
].name
,
5958 MTYPE_BGP_FILTER_NAME
);
5959 PEER_ATTR_INHERIT(peer
, peer
->group
,
5960 filter
[afi
][safi
].plist
[direct
].plist
);
5962 /* Otherwise remove configuration from peer. */
5963 filter
= &peer
->filter
[afi
][safi
];
5964 if (filter
->plist
[direct
].name
)
5965 XFREE(MTYPE_BGP_FILTER_NAME
,
5966 filter
->plist
[direct
].name
);
5967 filter
->plist
[direct
].name
= NULL
;
5968 filter
->plist
[direct
].plist
= NULL
;
5971 /* Check if handling a regular peer. */
5972 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
5973 /* Process peer route updates. */
5974 peer_on_policy_change(peer
, afi
, safi
,
5975 (direct
== FILTER_OUT
) ? 1 : 0);
5977 /* Skip peer-group mechanics for regular peers. */
5982 * Remove configuration on all peer-group members, unless they are
5983 * explicitely overriding peer-group configuration.
5985 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
5986 /* Skip peers with overridden configuration. */
5987 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
5988 PEER_FT_PREFIX_LIST
))
5991 /* Remove configuration on peer-group member. */
5992 filter
= &member
->filter
[afi
][safi
];
5993 if (filter
->plist
[direct
].name
)
5994 XFREE(MTYPE_BGP_FILTER_NAME
,
5995 filter
->plist
[direct
].name
);
5996 filter
->plist
[direct
].name
= NULL
;
5997 filter
->plist
[direct
].plist
= NULL
;
5999 /* Process peer route updates. */
6000 peer_on_policy_change(member
, afi
, safi
,
6001 (direct
== FILTER_OUT
) ? 1 : 0);
6007 /* Update prefix-list list. */
6008 static void peer_prefix_list_update(struct prefix_list
*plist
)
6010 struct listnode
*mnode
, *mnnode
;
6011 struct listnode
*node
, *nnode
;
6014 struct peer_group
*group
;
6015 struct bgp_filter
*filter
;
6020 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6023 * Update the prefix-list on update groups.
6025 update_group_policy_update(
6026 bgp
, BGP_POLICY_PREFIX_LIST
,
6027 plist
? prefix_list_name(plist
) : NULL
, 0, 0);
6029 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6030 FOREACH_AFI_SAFI (afi
, safi
) {
6031 filter
= &peer
->filter
[afi
][safi
];
6033 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6035 if (filter
->plist
[direct
].name
)
6036 filter
->plist
[direct
]
6037 .plist
= prefix_list_lookup(
6039 filter
->plist
[direct
]
6042 filter
->plist
[direct
].plist
=
6047 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6048 FOREACH_AFI_SAFI (afi
, safi
) {
6049 filter
= &group
->conf
->filter
[afi
][safi
];
6051 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6053 if (filter
->plist
[direct
].name
)
6054 filter
->plist
[direct
]
6055 .plist
= prefix_list_lookup(
6057 filter
->plist
[direct
]
6060 filter
->plist
[direct
].plist
=
6068 int peer_aslist_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6071 struct peer
*member
;
6072 struct bgp_filter
*filter
;
6073 struct listnode
*node
, *nnode
;
6075 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6076 return BGP_ERR_INVALID_VALUE
;
6078 /* Set configuration on peer. */
6079 filter
= &peer
->filter
[afi
][safi
];
6080 if (filter
->aslist
[direct
].name
)
6081 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
6082 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6083 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6085 /* Check if handling a regular peer. */
6086 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6087 /* Set override-flag and process peer route updates. */
6088 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6089 PEER_FT_FILTER_LIST
);
6090 peer_on_policy_change(peer
, afi
, safi
,
6091 (direct
== FILTER_OUT
) ? 1 : 0);
6093 /* Skip peer-group mechanics for regular peers. */
6098 * Set configuration on all peer-group members, unless they are
6099 * explicitely overriding peer-group configuration.
6101 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6102 /* Skip peers with overridden configuration. */
6103 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6104 PEER_FT_FILTER_LIST
))
6107 /* Set configuration on peer-group member. */
6108 filter
= &member
->filter
[afi
][safi
];
6109 if (filter
->aslist
[direct
].name
)
6110 XFREE(MTYPE_BGP_FILTER_NAME
,
6111 filter
->aslist
[direct
].name
);
6112 filter
->aslist
[direct
].name
=
6113 XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6114 filter
->aslist
[direct
].aslist
= as_list_lookup(name
);
6116 /* Process peer route updates. */
6117 peer_on_policy_change(member
, afi
, safi
,
6118 (direct
== FILTER_OUT
) ? 1 : 0);
6124 int peer_aslist_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6126 struct peer
*member
;
6127 struct bgp_filter
*filter
;
6128 struct listnode
*node
, *nnode
;
6130 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
6131 return BGP_ERR_INVALID_VALUE
;
6133 /* Unset override-flag unconditionally. */
6134 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6135 PEER_FT_FILTER_LIST
);
6137 /* Inherit configuration from peer-group if peer is member. */
6138 if (peer_group_active(peer
)) {
6139 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6140 filter
[afi
][safi
].aslist
[direct
].name
,
6141 MTYPE_BGP_FILTER_NAME
);
6142 PEER_ATTR_INHERIT(peer
, peer
->group
,
6143 filter
[afi
][safi
].aslist
[direct
].aslist
);
6145 /* Otherwise remove configuration from peer. */
6146 filter
= &peer
->filter
[afi
][safi
];
6147 if (filter
->aslist
[direct
].name
)
6148 XFREE(MTYPE_BGP_FILTER_NAME
,
6149 filter
->aslist
[direct
].name
);
6150 filter
->aslist
[direct
].name
= NULL
;
6151 filter
->aslist
[direct
].aslist
= NULL
;
6154 /* Check if handling a regular peer. */
6155 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6156 /* Process peer route updates. */
6157 peer_on_policy_change(peer
, afi
, safi
,
6158 (direct
== FILTER_OUT
) ? 1 : 0);
6160 /* Skip peer-group mechanics for regular peers. */
6165 * Remove configuration on all peer-group members, unless they are
6166 * explicitely overriding peer-group configuration.
6168 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6169 /* Skip peers with overridden configuration. */
6170 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6171 PEER_FT_FILTER_LIST
))
6174 /* Remove configuration on peer-group member. */
6175 filter
= &member
->filter
[afi
][safi
];
6176 if (filter
->aslist
[direct
].name
)
6177 XFREE(MTYPE_BGP_FILTER_NAME
,
6178 filter
->aslist
[direct
].name
);
6179 filter
->aslist
[direct
].name
= NULL
;
6180 filter
->aslist
[direct
].aslist
= NULL
;
6182 /* Process peer route updates. */
6183 peer_on_policy_change(member
, afi
, safi
,
6184 (direct
== FILTER_OUT
) ? 1 : 0);
6190 static void peer_aslist_update(const char *aslist_name
)
6195 struct listnode
*mnode
, *mnnode
;
6196 struct listnode
*node
, *nnode
;
6199 struct peer_group
*group
;
6200 struct bgp_filter
*filter
;
6202 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
6203 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
,
6206 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
6207 FOREACH_AFI_SAFI (afi
, safi
) {
6208 filter
= &peer
->filter
[afi
][safi
];
6210 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6212 if (filter
->aslist
[direct
].name
)
6213 filter
->aslist
[direct
]
6214 .aslist
= as_list_lookup(
6215 filter
->aslist
[direct
]
6218 filter
->aslist
[direct
].aslist
=
6223 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
6224 FOREACH_AFI_SAFI (afi
, safi
) {
6225 filter
= &group
->conf
->filter
[afi
][safi
];
6227 for (direct
= FILTER_IN
; direct
< FILTER_MAX
;
6229 if (filter
->aslist
[direct
].name
)
6230 filter
->aslist
[direct
]
6231 .aslist
= as_list_lookup(
6232 filter
->aslist
[direct
]
6235 filter
->aslist
[direct
].aslist
=
6243 static void peer_aslist_add(char *aslist_name
)
6245 peer_aslist_update(aslist_name
);
6246 route_map_notify_dependencies((char *)aslist_name
,
6247 RMAP_EVENT_ASLIST_ADDED
);
6250 static void peer_aslist_del(const char *aslist_name
)
6252 peer_aslist_update(aslist_name
);
6253 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
6257 int peer_route_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
6258 const char *name
, struct route_map
*route_map
)
6260 struct peer
*member
;
6261 struct bgp_filter
*filter
;
6262 struct listnode
*node
, *nnode
;
6264 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6265 return BGP_ERR_INVALID_VALUE
;
6267 /* Set configuration on peer. */
6268 filter
= &peer
->filter
[afi
][safi
];
6269 if (filter
->map
[direct
].name
) {
6270 /* If the neighbor is configured with the same route-map
6271 * again then, ignore the duplicate configuration.
6273 if (strcmp(filter
->map
[direct
].name
, name
) == 0)
6276 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6278 route_map_counter_decrement(filter
->map
[direct
].map
);
6279 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6280 filter
->map
[direct
].map
= route_map
;
6281 route_map_counter_increment(route_map
);
6283 /* Check if handling a regular peer. */
6284 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6285 /* Set override-flag and process peer route updates. */
6286 SET_FLAG(peer
->filter_override
[afi
][safi
][direct
],
6288 peer_on_policy_change(peer
, afi
, safi
,
6289 (direct
== RMAP_OUT
) ? 1 : 0);
6291 /* Skip peer-group mechanics for regular peers. */
6296 * Set configuration on all peer-group members, unless they are
6297 * explicitely overriding peer-group configuration.
6299 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6300 /* Skip peers with overridden configuration. */
6301 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6305 /* Set configuration on peer-group member. */
6306 filter
= &member
->filter
[afi
][safi
];
6307 if (filter
->map
[direct
].name
)
6308 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6309 route_map_counter_decrement(filter
->map
[direct
].map
);
6310 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6311 filter
->map
[direct
].map
= route_map
;
6312 route_map_counter_increment(route_map
);
6314 /* Process peer route updates. */
6315 peer_on_policy_change(member
, afi
, safi
,
6316 (direct
== RMAP_OUT
) ? 1 : 0);
6321 /* Unset route-map from the peer. */
6322 int peer_route_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
6324 struct peer
*member
;
6325 struct bgp_filter
*filter
;
6326 struct listnode
*node
, *nnode
;
6328 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
)
6329 return BGP_ERR_INVALID_VALUE
;
6331 /* Unset override-flag unconditionally. */
6332 UNSET_FLAG(peer
->filter_override
[afi
][safi
][direct
], PEER_FT_ROUTE_MAP
);
6334 /* Inherit configuration from peer-group if peer is member. */
6335 if (peer_group_active(peer
)) {
6336 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6337 filter
[afi
][safi
].map
[direct
].name
,
6338 MTYPE_BGP_FILTER_NAME
);
6339 PEER_ATTR_INHERIT(peer
, peer
->group
,
6340 filter
[afi
][safi
].map
[direct
].map
);
6342 /* Otherwise remove configuration from peer. */
6343 filter
= &peer
->filter
[afi
][safi
];
6344 if (filter
->map
[direct
].name
)
6345 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6346 route_map_counter_decrement(filter
->map
[direct
].map
);
6347 filter
->map
[direct
].name
= NULL
;
6348 filter
->map
[direct
].map
= NULL
;
6351 /* Check if handling a regular peer. */
6352 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6353 /* Process peer route updates. */
6354 peer_on_policy_change(peer
, afi
, safi
,
6355 (direct
== RMAP_OUT
) ? 1 : 0);
6357 /* Skip peer-group mechanics for regular peers. */
6362 * Remove configuration on all peer-group members, unless they are
6363 * explicitely overriding peer-group configuration.
6365 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6366 /* Skip peers with overridden configuration. */
6367 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][direct
],
6371 /* Remove configuration on peer-group member. */
6372 filter
= &member
->filter
[afi
][safi
];
6373 if (filter
->map
[direct
].name
)
6374 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
6375 route_map_counter_decrement(filter
->map
[direct
].map
);
6376 filter
->map
[direct
].name
= NULL
;
6377 filter
->map
[direct
].map
= NULL
;
6379 /* Process peer route updates. */
6380 peer_on_policy_change(member
, afi
, safi
,
6381 (direct
== RMAP_OUT
) ? 1 : 0);
6387 /* Set unsuppress-map to the peer. */
6388 int peer_unsuppress_map_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6389 const char *name
, struct route_map
*route_map
)
6391 struct peer
*member
;
6392 struct bgp_filter
*filter
;
6393 struct listnode
*node
, *nnode
;
6395 /* Set configuration on peer. */
6396 filter
= &peer
->filter
[afi
][safi
];
6397 if (filter
->usmap
.name
)
6398 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6399 route_map_counter_decrement(filter
->usmap
.map
);
6400 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6401 filter
->usmap
.map
= route_map
;
6402 route_map_counter_increment(route_map
);
6404 /* Check if handling a regular peer. */
6405 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6406 /* Set override-flag and process peer route updates. */
6407 SET_FLAG(peer
->filter_override
[afi
][safi
][0],
6408 PEER_FT_UNSUPPRESS_MAP
);
6409 peer_on_policy_change(peer
, afi
, safi
, 1);
6411 /* Skip peer-group mechanics for regular peers. */
6416 * Set configuration on all peer-group members, unless they are
6417 * explicitely overriding peer-group configuration.
6419 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6420 /* Skip peers with overridden configuration. */
6421 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
6422 PEER_FT_UNSUPPRESS_MAP
))
6425 /* Set configuration on peer-group member. */
6426 filter
= &member
->filter
[afi
][safi
];
6427 if (filter
->usmap
.name
)
6428 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6429 route_map_counter_decrement(filter
->usmap
.map
);
6430 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
6431 filter
->usmap
.map
= route_map
;
6432 route_map_counter_increment(route_map
);
6434 /* Process peer route updates. */
6435 peer_on_policy_change(member
, afi
, safi
, 1);
6441 /* Unset route-map from the peer. */
6442 int peer_unsuppress_map_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6444 struct peer
*member
;
6445 struct bgp_filter
*filter
;
6446 struct listnode
*node
, *nnode
;
6448 /* Unset override-flag unconditionally. */
6449 UNSET_FLAG(peer
->filter_override
[afi
][safi
][0], PEER_FT_UNSUPPRESS_MAP
);
6451 /* Inherit configuration from peer-group if peer is member. */
6452 if (peer_group_active(peer
)) {
6453 PEER_STR_ATTR_INHERIT(peer
, peer
->group
,
6454 filter
[afi
][safi
].usmap
.name
,
6455 MTYPE_BGP_FILTER_NAME
);
6456 PEER_ATTR_INHERIT(peer
, peer
->group
,
6457 filter
[afi
][safi
].usmap
.map
);
6459 /* Otherwise remove configuration from peer. */
6460 filter
= &peer
->filter
[afi
][safi
];
6461 if (filter
->usmap
.name
)
6462 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6463 route_map_counter_decrement(filter
->usmap
.map
);
6464 filter
->usmap
.name
= NULL
;
6465 filter
->usmap
.map
= NULL
;
6468 /* Check if handling a regular peer. */
6469 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6470 /* Process peer route updates. */
6471 peer_on_policy_change(peer
, afi
, safi
, 1);
6473 /* Skip peer-group mechanics for regular peers. */
6478 * Remove configuration on all peer-group members, unless they are
6479 * explicitely overriding peer-group configuration.
6481 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6482 /* Skip peers with overridden configuration. */
6483 if (CHECK_FLAG(member
->filter_override
[afi
][safi
][0],
6484 PEER_FT_UNSUPPRESS_MAP
))
6487 /* Remove configuration on peer-group member. */
6488 filter
= &member
->filter
[afi
][safi
];
6489 if (filter
->usmap
.name
)
6490 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
6491 route_map_counter_decrement(filter
->usmap
.map
);
6492 filter
->usmap
.name
= NULL
;
6493 filter
->usmap
.map
= NULL
;
6495 /* Process peer route updates. */
6496 peer_on_policy_change(member
, afi
, safi
, 1);
6502 int peer_maximum_prefix_set(struct peer
*peer
, afi_t afi
, safi_t safi
,
6503 uint32_t max
, uint8_t threshold
, int warning
,
6506 struct peer
*member
;
6507 struct listnode
*node
, *nnode
;
6509 /* Set flags and configuration on peer. */
6510 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6512 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
6514 peer_af_flag_unset(peer
, afi
, safi
,
6515 PEER_FLAG_MAX_PREFIX_WARNING
);
6517 peer
->pmax
[afi
][safi
] = max
;
6518 peer
->pmax_threshold
[afi
][safi
] = threshold
;
6519 peer
->pmax_restart
[afi
][safi
] = restart
;
6521 /* Check if handling a regular peer. */
6522 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6523 /* Re-check if peer violates maximum-prefix. */
6524 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
6525 bgp_maximum_prefix_overflow(peer
, afi
, safi
, 1);
6527 /* Skip peer-group mechanics for regular peers. */
6532 * Set flags and configuration on all peer-group members, unless they
6533 * are explicitely overriding peer-group configuration.
6535 for (ALL_LIST_ELEMENTS(peer
->group
->peer
, node
, nnode
, member
)) {
6536 /* Skip peers with overridden configuration. */
6537 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6538 PEER_FLAG_MAX_PREFIX
))
6541 /* Set flag and configuration on peer-group member. */
6542 member
->pmax
[afi
][safi
] = max
;
6543 member
->pmax_threshold
[afi
][safi
] = threshold
;
6544 member
->pmax_restart
[afi
][safi
] = restart
;
6546 SET_FLAG(member
->af_flags
[afi
][safi
],
6547 PEER_FLAG_MAX_PREFIX_WARNING
);
6549 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6550 PEER_FLAG_MAX_PREFIX_WARNING
);
6552 /* Re-check if peer violates maximum-prefix. */
6553 if ((member
->status
== Established
) && (member
->afc
[afi
][safi
]))
6554 bgp_maximum_prefix_overflow(member
, afi
, safi
, 1);
6560 int peer_maximum_prefix_unset(struct peer
*peer
, afi_t afi
, safi_t safi
)
6562 /* Inherit configuration from peer-group if peer is member. */
6563 if (peer_group_active(peer
)) {
6564 peer_af_flag_inherit(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6565 peer_af_flag_inherit(peer
, afi
, safi
,
6566 PEER_FLAG_MAX_PREFIX_WARNING
);
6567 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax
[afi
][safi
]);
6568 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_threshold
[afi
][safi
]);
6569 PEER_ATTR_INHERIT(peer
, peer
->group
, pmax_restart
[afi
][safi
]);
6574 /* Remove flags and configuration from peer. */
6575 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
);
6576 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_WARNING
);
6577 peer
->pmax
[afi
][safi
] = 0;
6578 peer
->pmax_threshold
[afi
][safi
] = 0;
6579 peer
->pmax_restart
[afi
][safi
] = 0;
6582 * Remove flags and configuration from all peer-group members, unless
6583 * they are explicitely overriding peer-group configuration.
6585 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6586 struct peer
*member
;
6587 struct listnode
*node
;
6589 for (ALL_LIST_ELEMENTS_RO(peer
->group
->peer
, node
, member
)) {
6590 /* Skip peers with overridden configuration. */
6591 if (CHECK_FLAG(member
->af_flags_override
[afi
][safi
],
6592 PEER_FLAG_MAX_PREFIX
))
6595 /* Remove flag and configuration on peer-group member.
6597 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6598 PEER_FLAG_MAX_PREFIX
);
6599 UNSET_FLAG(member
->af_flags
[afi
][safi
],
6600 PEER_FLAG_MAX_PREFIX_WARNING
);
6601 member
->pmax
[afi
][safi
] = 0;
6602 member
->pmax_threshold
[afi
][safi
] = 0;
6603 member
->pmax_restart
[afi
][safi
] = 0;
6610 int is_ebgp_multihop_configured(struct peer
*peer
)
6612 struct peer_group
*group
;
6613 struct listnode
*node
, *nnode
;
6616 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6617 group
= peer
->group
;
6618 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
6619 && (group
->conf
->ttl
!= BGP_DEFAULT_TTL
))
6622 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer1
)) {
6623 if ((peer_sort(peer1
) != BGP_PEER_IBGP
)
6624 && (peer1
->ttl
!= BGP_DEFAULT_TTL
))
6628 if ((peer_sort(peer
) != BGP_PEER_IBGP
)
6629 && (peer
->ttl
!= BGP_DEFAULT_TTL
))
6635 /* Set # of hops between us and BGP peer. */
6636 int peer_ttl_security_hops_set(struct peer
*peer
, int gtsm_hops
)
6638 struct peer_group
*group
;
6639 struct listnode
*node
, *nnode
;
6642 zlog_debug("peer_ttl_security_hops_set: set gtsm_hops to %d for %s",
6643 gtsm_hops
, peer
->host
);
6645 /* We cannot configure ttl-security hops when ebgp-multihop is already
6646 set. For non peer-groups, the check is simple. For peer-groups,
6648 slightly messy, because we need to check both the peer-group
6650 and all peer-group members for any trace of ebgp-multihop
6652 before actually applying the ttl-security rules. Cisco really made a
6653 mess of this configuration parameter, and OpenBGPD got it right.
6656 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
)) {
6657 if (is_ebgp_multihop_configured(peer
))
6658 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
6660 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6661 peer
->gtsm_hops
= gtsm_hops
;
6663 /* Calling ebgp multihop also resets the session.
6664 * On restart, NHT will get setup correctly as will the
6665 * min & max ttls on the socket. The return value is
6668 ret
= peer_ebgp_multihop_set(peer
, MAXTTL
);
6673 group
= peer
->group
;
6674 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
6676 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
6678 /* Calling ebgp multihop also resets the
6680 * On restart, NHT will get setup correctly as
6682 * min & max ttls on the socket. The return
6686 peer_ebgp_multihop_set(peer
, MAXTTL
);
6690 /* Post the first gtsm setup or if its ibgp, maxttl setting
6692 * necessary, just set the minttl.
6694 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6695 peer
->gtsm_hops
= gtsm_hops
;
6698 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
6699 MAXTTL
+ 1 - gtsm_hops
);
6700 if ((peer
->status
< Established
) && peer
->doppelganger
6701 && (peer
->doppelganger
->fd
>= 0))
6702 sockopt_minttl(peer
->su
.sa
.sa_family
,
6703 peer
->doppelganger
->fd
,
6704 MAXTTL
+ 1 - gtsm_hops
);
6706 group
= peer
->group
;
6707 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
,
6709 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
6711 /* Change setting of existing peer
6712 * established then change value (may break
6714 * not established yet (teardown session and
6716 * no session then do nothing (will get
6717 * handled by next connection)
6719 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
6721 peer
->su
.sa
.sa_family
, peer
->fd
,
6722 MAXTTL
+ 1 - peer
->gtsm_hops
);
6723 if ((peer
->status
< Established
)
6724 && peer
->doppelganger
6725 && (peer
->doppelganger
->fd
>= 0))
6726 sockopt_minttl(peer
->su
.sa
.sa_family
,
6727 peer
->doppelganger
->fd
,
6728 MAXTTL
+ 1 - gtsm_hops
);
6736 int peer_ttl_security_hops_unset(struct peer
*peer
)
6738 struct peer_group
*group
;
6739 struct listnode
*node
, *nnode
;
6742 zlog_debug("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s",
6745 /* if a peer-group member, then reset to peer-group default rather than
6747 if (peer_group_active(peer
))
6748 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
6750 peer
->gtsm_hops
= 0;
6752 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
6753 /* Invoking ebgp_multihop_set will set the TTL back to the
6755 * value as well as restting the NHT and such. The session is
6758 if (peer
->sort
== BGP_PEER_EBGP
)
6759 ret
= peer_ebgp_multihop_unset(peer
);
6762 sockopt_minttl(peer
->su
.sa
.sa_family
, peer
->fd
,
6765 if ((peer
->status
< Established
) && peer
->doppelganger
6766 && (peer
->doppelganger
->fd
>= 0))
6767 sockopt_minttl(peer
->su
.sa
.sa_family
,
6768 peer
->doppelganger
->fd
, 0);
6771 group
= peer
->group
;
6772 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
6773 peer
->gtsm_hops
= 0;
6774 if (peer
->sort
== BGP_PEER_EBGP
)
6775 ret
= peer_ebgp_multihop_unset(peer
);
6778 sockopt_minttl(peer
->su
.sa
.sa_family
,
6781 if ((peer
->status
< Established
)
6782 && peer
->doppelganger
6783 && (peer
->doppelganger
->fd
>= 0))
6784 sockopt_minttl(peer
->su
.sa
.sa_family
,
6785 peer
->doppelganger
->fd
,
6795 * If peer clear is invoked in a loop for all peers on the BGP instance,
6796 * it may end up freeing the doppelganger, and if this was the next node
6797 * to the current node, we would end up accessing the freed next node.
6798 * Pass along additional parameter which can be updated if next node
6799 * is freed; only required when walking the peer list on BGP instance.
6801 int peer_clear(struct peer
*peer
, struct listnode
**nnode
)
6803 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)) {
6804 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
6805 UNSET_FLAG(peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
6806 if (peer
->t_pmax_restart
) {
6807 BGP_TIMER_OFF(peer
->t_pmax_restart
);
6808 if (bgp_debug_neighbor_events(peer
))
6810 "%s Maximum-prefix restart timer canceled",
6813 BGP_EVENT_ADD(peer
, BGP_Start
);
6817 peer
->v_start
= BGP_INIT_START_TIMER
;
6818 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
6819 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
6820 BGP_NOTIFY_CEASE_ADMIN_RESET
);
6822 bgp_session_reset_safe(peer
, nnode
);
6827 int peer_clear_soft(struct peer
*peer
, afi_t afi
, safi_t safi
,
6828 enum bgp_clear_type stype
)
6830 struct peer_af
*paf
;
6832 if (peer
->status
!= Established
)
6835 if (!peer
->afc
[afi
][safi
])
6836 return BGP_ERR_AF_UNCONFIGURED
;
6838 peer
->rtt
= sockopt_tcp_rtt(peer
->fd
);
6840 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
) {
6841 /* Clear the "neighbor x.x.x.x default-originate" flag */
6842 paf
= peer_af_find(peer
, afi
, safi
);
6843 if (paf
&& paf
->subgroup
6844 && CHECK_FLAG(paf
->subgroup
->sflags
,
6845 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
6846 UNSET_FLAG(paf
->subgroup
->sflags
,
6847 SUBGRP_STATUS_DEFAULT_ORIGINATE
);
6849 bgp_announce_route(peer
, afi
, safi
);
6852 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
6853 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6854 PEER_CAP_ORF_PREFIX_SM_ADV
)
6855 && (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6856 PEER_CAP_ORF_PREFIX_RM_RCV
)
6857 || CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6858 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))) {
6859 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
6860 uint8_t prefix_type
;
6862 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
6863 PEER_CAP_ORF_PREFIX_RM_RCV
))
6864 prefix_type
= ORF_TYPE_PREFIX
;
6866 prefix_type
= ORF_TYPE_PREFIX_OLD
;
6868 if (filter
->plist
[FILTER_IN
].plist
) {
6869 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
6870 PEER_STATUS_ORF_PREFIX_SEND
))
6871 bgp_route_refresh_send(
6872 peer
, afi
, safi
, prefix_type
,
6874 bgp_route_refresh_send(peer
, afi
, safi
,
6876 REFRESH_IMMEDIATE
, 0);
6878 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
6879 PEER_STATUS_ORF_PREFIX_SEND
))
6880 bgp_route_refresh_send(
6881 peer
, afi
, safi
, prefix_type
,
6882 REFRESH_IMMEDIATE
, 1);
6884 bgp_route_refresh_send(peer
, afi
, safi
,
6891 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
6892 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
) {
6893 /* If neighbor has soft reconfiguration inbound flag.
6894 Use Adj-RIB-In database. */
6895 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
6896 PEER_FLAG_SOFT_RECONFIG
))
6897 bgp_soft_reconfig_in(peer
, afi
, safi
);
6899 /* If neighbor has route refresh capability, send route
6901 message to the peer. */
6902 if (CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
6903 || CHECK_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
6904 bgp_route_refresh_send(peer
, afi
, safi
, 0, 0,
6907 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
6913 /* Display peer uptime.*/
6914 char *peer_uptime(time_t uptime2
, char *buf
, size_t len
, bool use_json
,
6917 time_t uptime1
, epoch_tbuf
;
6920 /* If there is no connection has been done before print `never'. */
6923 json_object_string_add(json
, "peerUptime", "never");
6924 json_object_int_add(json
, "peerUptimeMsec", 0);
6926 snprintf(buf
, len
, "never");
6930 /* Get current time. */
6931 uptime1
= bgp_clock();
6933 tm
= gmtime(&uptime1
);
6935 if (uptime1
< ONE_DAY_SECOND
)
6936 snprintf(buf
, len
, "%02d:%02d:%02d", tm
->tm_hour
, tm
->tm_min
,
6938 else if (uptime1
< ONE_WEEK_SECOND
)
6939 snprintf(buf
, len
, "%dd%02dh%02dm", tm
->tm_yday
, tm
->tm_hour
,
6941 else if (uptime1
< ONE_YEAR_SECOND
)
6942 snprintf(buf
, len
, "%02dw%dd%02dh", tm
->tm_yday
/ 7,
6943 tm
->tm_yday
- ((tm
->tm_yday
/ 7) * 7), tm
->tm_hour
);
6945 snprintf(buf
, len
, "%02dy%02dw%dd", tm
->tm_year
- 70,
6947 tm
->tm_yday
- ((tm
->tm_yday
/ 7) * 7));
6950 epoch_tbuf
= time(NULL
) - uptime1
;
6951 json_object_string_add(json
, "peerUptime", buf
);
6952 json_object_int_add(json
, "peerUptimeMsec", uptime1
* 1000);
6953 json_object_int_add(json
, "peerUptimeEstablishedEpoch",
6960 void bgp_master_init(struct thread_master
*master
, const int buffer_size
)
6964 memset(&bgp_master
, 0, sizeof(struct bgp_master
));
6967 bm
->bgp
= list_new();
6968 bm
->listen_sockets
= list_new();
6969 bm
->port
= BGP_PORT_DEFAULT
;
6970 bm
->master
= master
;
6971 bm
->start_time
= bgp_clock();
6972 bm
->t_rmap_update
= NULL
;
6973 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
6974 bm
->terminating
= false;
6975 bm
->socket_buffer
= buffer_size
;
6977 bgp_process_queue_init();
6980 /* init the rd id space.
6981 assign 0th index in the bitfield,
6982 so that we start with id 1
6984 bf_init(bm
->rd_idspace
, UINT16_MAX
);
6985 bf_assign_zero_index(bm
->rd_idspace
);
6987 /* mpls label dynamic allocation pool */
6988 bgp_lp_init(bm
->master
, &bm
->labelpool
);
6990 QOBJ_REG(bm
, bgp_master
);
6994 * Free up connected routes and interfaces for a BGP instance. Invoked upon
6995 * instance delete (non-default only) or BGP exit.
6997 static void bgp_if_finish(struct bgp
*bgp
)
7000 struct interface
*ifp
;
7002 vrf
= bgp_vrf_lookup_by_instance_type(bgp
);
7004 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
|| !vrf
)
7007 FOR_ALL_INTERFACES (vrf
, ifp
) {
7008 struct listnode
*c_node
, *c_nnode
;
7009 struct connected
*c
;
7011 for (ALL_LIST_ELEMENTS(ifp
->connected
, c_node
, c_nnode
, c
))
7012 bgp_connected_delete(bgp
, c
);
7016 static void bgp_viewvrf_autocomplete(vector comps
, struct cmd_token
*token
)
7018 struct vrf
*vrf
= NULL
;
7019 struct listnode
*next
;
7022 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
)
7023 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, vrf
->name
));
7025 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
7026 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_VIEW
)
7029 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, bgp
->name
));
7033 static void bgp_instasn_autocomplete(vector comps
, struct cmd_token
*token
)
7035 struct listnode
*next
, *next2
;
7036 struct bgp
*bgp
, *bgp2
;
7039 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next
, bgp
)) {
7041 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, next2
, bgp2
)) {
7042 if (bgp2
->as
== bgp
->as
)
7050 snprintf(buf
, sizeof(buf
), "%u", bgp
->as
);
7051 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, buf
));
7055 static const struct cmd_variable_handler bgp_viewvrf_var_handlers
[] = {
7056 {.tokenname
= "VIEWVRFNAME", .completions
= bgp_viewvrf_autocomplete
},
7057 {.varname
= "instasn", .completions
= bgp_instasn_autocomplete
},
7058 {.completions
= NULL
},
7061 struct frr_pthread
*bgp_pth_io
;
7062 struct frr_pthread
*bgp_pth_ka
;
7064 static void bgp_pthreads_init(void)
7066 assert(!bgp_pth_io
);
7067 assert(!bgp_pth_ka
);
7069 struct frr_pthread_attr io
= {
7070 .start
= frr_pthread_attr_default
.start
,
7071 .stop
= frr_pthread_attr_default
.stop
,
7073 struct frr_pthread_attr ka
= {
7074 .start
= bgp_keepalives_start
,
7075 .stop
= bgp_keepalives_stop
,
7077 bgp_pth_io
= frr_pthread_new(&io
, "BGP I/O thread", "bgpd_io");
7078 bgp_pth_ka
= frr_pthread_new(&ka
, "BGP Keepalives thread", "bgpd_ka");
7081 void bgp_pthreads_run(void)
7083 frr_pthread_run(bgp_pth_io
, NULL
);
7084 frr_pthread_run(bgp_pth_ka
, NULL
);
7086 /* Wait until threads are ready. */
7087 frr_pthread_wait_running(bgp_pth_io
);
7088 frr_pthread_wait_running(bgp_pth_ka
);
7091 void bgp_pthreads_finish(void)
7093 frr_pthread_stop_all();
7096 void bgp_init(unsigned short instance
)
7099 /* allocates some vital data structures used by peer commands in
7102 /* pre-init pthreads */
7103 bgp_pthreads_init();
7106 bgp_zebra_init(bm
->master
, instance
);
7109 vnc_zebra_init(bm
->master
);
7112 /* BGP VTY commands installation. */
7120 bgp_route_map_init();
7121 bgp_scan_vty_init();
7126 bgp_ethernetvpn_init();
7127 bgp_flowspec_vty_init();
7129 /* Access list initialize. */
7131 access_list_add_hook(peer_distribute_update
);
7132 access_list_delete_hook(peer_distribute_update
);
7134 /* Filter list initialize. */
7136 as_list_add_hook(peer_aslist_add
);
7137 as_list_delete_hook(peer_aslist_del
);
7139 /* Prefix list initialize.*/
7141 prefix_list_add_hook(peer_prefix_list_update
);
7142 prefix_list_delete_hook(peer_prefix_list_update
);
7144 /* Community list initialize. */
7145 bgp_clist
= community_list_init();
7150 cmd_variable_handler_register(bgp_viewvrf_var_handlers
);
7153 void bgp_terminate(void)
7157 struct listnode
*node
, *nnode
;
7158 struct listnode
*mnode
, *mnnode
;
7162 /* Close the listener sockets first as this prevents peers from
7164 * to reconnect on receiving the peer unconfig message. In the presence
7165 * of a large number of peers this will ensure that no peer is left with
7166 * a dangling connection
7168 /* reverse bgp_master_init */
7171 if (bm
->listen_sockets
)
7172 list_delete(&bm
->listen_sockets
);
7174 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
))
7175 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
))
7176 if (peer
->status
== Established
7177 || peer
->status
== OpenSent
7178 || peer
->status
== OpenConfirm
)
7179 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
7180 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
7182 if (bm
->process_main_queue
)
7183 work_queue_free_and_null(&bm
->process_main_queue
);
7185 if (bm
->t_rmap_update
)
7186 BGP_TIMER_OFF(bm
->t_rmap_update
);
7191 struct peer
*peer_lookup_in_view(struct vty
*vty
, struct bgp
*bgp
,
7192 const char *ip_str
, bool use_json
)
7198 /* Get peer sockunion. */
7199 ret
= str2sockunion(ip_str
, &su
);
7201 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
7203 peer
= peer_lookup_by_hostname(bgp
, ip_str
);
7207 json_object
*json_no
= NULL
;
7208 json_no
= json_object_new_object();
7209 json_object_string_add(
7211 "malformedAddressOrName",
7213 vty_out(vty
, "%s\n",
7214 json_object_to_json_string_ext(
7216 JSON_C_TO_STRING_PRETTY
));
7217 json_object_free(json_no
);
7220 "%% Malformed address or name: %s\n",
7228 /* Peer structure lookup. */
7229 peer
= peer_lookup(bgp
, &su
);
7232 json_object
*json_no
= NULL
;
7233 json_no
= json_object_new_object();
7234 json_object_string_add(json_no
, "warning",
7235 "No such neighbor in this view/vrf");
7236 vty_out(vty
, "%s\n",
7237 json_object_to_json_string_ext(
7238 json_no
, JSON_C_TO_STRING_PRETTY
));
7239 json_object_free(json_no
);
7241 vty_out(vty
, "No such neighbor in this view/vrf\n");
7248 void bgp_gr_apply_running_config(void)
7250 struct peer
*peer
= NULL
;
7251 struct bgp
*bgp
= NULL
;
7252 struct listnode
*node
, *nnode
;
7253 bool gr_router_detected
= false;
7255 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
7256 zlog_debug("[BGP_GR] %s called !",
7259 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
7260 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7261 bgp_peer_gr_flags_update(peer
);
7262 if (CHECK_FLAG(peer
->flags
,
7263 PEER_FLAG_GRACEFUL_RESTART
))
7264 gr_router_detected
= true;
7267 if (gr_router_detected
&&
7268 bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
7269 bgp_zebra_send_capabilities(bgp
, true);
7270 } else if (!gr_router_detected
&&
7271 bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
7272 bgp_zebra_send_capabilities(bgp
, false);
7275 gr_router_detected
= false;