1 /* BGP-4, BGP-4+ daemon program
2 Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
29 #include "sockunion.h"
38 #include "workqueue.h"
43 #include "bgpd/bgpd.h"
44 #include "bgpd/bgp_table.h"
45 #include "bgpd/bgp_aspath.h"
46 #include "bgpd/bgp_route.h"
47 #include "bgpd/bgp_dump.h"
48 #include "bgpd/bgp_debug.h"
49 #include "bgpd/bgp_community.h"
50 #include "bgpd/bgp_attr.h"
51 #include "bgpd/bgp_regex.h"
52 #include "bgpd/bgp_clist.h"
53 #include "bgpd/bgp_fsm.h"
54 #include "bgpd/bgp_packet.h"
55 #include "bgpd/bgp_zebra.h"
56 #include "bgpd/bgp_open.h"
57 #include "bgpd/bgp_filter.h"
58 #include "bgpd/bgp_nexthop.h"
59 #include "bgpd/bgp_damp.h"
60 #include "bgpd/bgp_mplsvpn.h"
61 #include "bgpd/bgp_advertise.h"
62 #include "bgpd/bgp_network.h"
63 #include "bgpd/bgp_vty.h"
64 #include "bgpd/bgp_mpath.h"
65 #include "bgpd/bgp_nht.h"
67 #include "bgpd/bgp_snmp.h"
68 #endif /* HAVE_SNMP */
69 #include "bgpd/bgp_updgrp.h"
70 #include "bgpd/bgp_bfd.h"
72 /* BGP process wide configuration. */
73 static struct bgp_master bgp_master
;
75 extern struct in_addr router_id_zebra
;
77 /* BGP process wide configuration pointer to export. */
78 struct bgp_master
*bm
;
80 /* BGP community-list. */
81 struct community_list_handler
*bgp_clist
;
85 bgp_session_reset(struct peer
*peer
)
87 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
88 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
89 peer_delete(peer
->doppelganger
);
91 BGP_EVENT_ADD (peer
, BGP_Stop
);
95 * During session reset, we may delete the doppelganger peer, which would
96 * be the next node to the current node. If the session reset was invoked
97 * during walk of peer list, we would end up accessing the freed next
98 * node. This function moves the next node along.
101 bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
106 n
= (nnode
) ? *nnode
: NULL
;
107 npeer
= (n
) ? listgetdata(n
) : NULL
;
109 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
110 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
112 if (peer
->doppelganger
== npeer
)
113 /* nnode and *nnode are confirmed to be non-NULL here */
114 *nnode
= (*nnode
)->next
;
115 peer_delete(peer
->doppelganger
);
118 BGP_EVENT_ADD (peer
, BGP_Stop
);
121 /* BGP global flag manipulation. */
123 bgp_option_set (int flag
)
128 case BGP_OPT_MULTIPLE_INSTANCE
:
129 case BGP_OPT_CONFIG_CISCO
:
130 case BGP_OPT_NO_LISTEN
:
131 SET_FLAG (bm
->options
, flag
);
134 return BGP_ERR_INVALID_FLAG
;
140 bgp_option_unset (int flag
)
144 case BGP_OPT_MULTIPLE_INSTANCE
:
145 if (listcount (bm
->bgp
) > 1)
146 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
149 case BGP_OPT_CONFIG_CISCO
:
150 UNSET_FLAG (bm
->options
, flag
);
153 return BGP_ERR_INVALID_FLAG
;
159 bgp_option_check (int flag
)
161 return CHECK_FLAG (bm
->options
, flag
);
164 /* BGP flag manipulation. */
166 bgp_flag_set (struct bgp
*bgp
, int flag
)
168 SET_FLAG (bgp
->flags
, flag
);
173 bgp_flag_unset (struct bgp
*bgp
, int flag
)
175 UNSET_FLAG (bgp
->flags
, flag
);
180 bgp_flag_check (struct bgp
*bgp
, int flag
)
182 return CHECK_FLAG (bgp
->flags
, flag
);
185 /* Internal function to set BGP structure configureation flag. */
187 bgp_config_set (struct bgp
*bgp
, int config
)
189 SET_FLAG (bgp
->config
, config
);
193 bgp_config_unset (struct bgp
*bgp
, int config
)
195 UNSET_FLAG (bgp
->config
, config
);
199 bgp_config_check (struct bgp
*bgp
, int config
)
201 return CHECK_FLAG (bgp
->config
, config
);
204 /* Set BGP router identifier. */
206 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
209 struct listnode
*node
, *nnode
;
211 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
212 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
215 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
216 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
218 /* Set all peer's local identifier with this value. */
219 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
221 IPV4_ADDR_COPY (&peer
->local_id
, id
);
223 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
225 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
226 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
227 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
233 /* BGP's cluster-id control. */
235 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
238 struct listnode
*node
, *nnode
;
240 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
241 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
244 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
245 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
247 /* Clear all IBGP peer. */
248 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
250 if (peer
->sort
!= BGP_PEER_IBGP
)
253 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
255 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
256 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
257 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
264 bgp_cluster_id_unset (struct bgp
*bgp
)
267 struct listnode
*node
, *nnode
;
269 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
272 bgp
->cluster_id
.s_addr
= 0;
273 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
275 /* Clear all IBGP peer. */
276 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
278 if (peer
->sort
!= BGP_PEER_IBGP
)
281 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
283 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
284 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
285 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
291 /* time_t value that is monotonicly increasing
292 * and uneffected by adjustments to system clock
294 time_t bgp_clock (void)
298 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
302 /* BGP timer configuration. */
304 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
306 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
307 ? keepalive
: holdtime
/ 3);
308 bgp
->default_holdtime
= holdtime
;
314 bgp_timers_unset (struct bgp
*bgp
)
316 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
317 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
322 /* BGP confederation configuration. */
324 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
327 struct listnode
*node
, *nnode
;
331 return BGP_ERR_INVALID_AS
;
333 /* Remember - were we doing confederation before? */
334 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
336 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
338 /* If we were doing confederation already, this is just an external
339 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
340 were not doing confederation before, reset all EBGP sessions. */
341 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
343 /* We're looking for peers who's AS is not local or part of our
347 if (peer_sort (peer
) == BGP_PEER_EBGP
)
350 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
352 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
353 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
354 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
357 bgp_session_reset_safe(peer
, &nnode
);
362 /* Not doign confederation before, so reset every non-local
364 if (peer_sort (peer
) != BGP_PEER_IBGP
)
366 /* Reset the local_as to be our EBGP one */
367 if (peer_sort (peer
) == BGP_PEER_EBGP
)
369 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
371 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
372 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
373 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
376 bgp_session_reset_safe(peer
, &nnode
);
384 bgp_confederation_id_unset (struct bgp
*bgp
)
387 struct listnode
*node
, *nnode
;
390 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
392 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
394 /* We're looking for peers who's AS is not local */
395 if (peer_sort (peer
) != BGP_PEER_IBGP
)
397 peer
->local_as
= bgp
->as
;
398 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
400 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
401 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
402 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
406 bgp_session_reset_safe(peer
, &nnode
);
412 /* Is an AS part of the confed or not? */
414 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
421 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
422 if (bgp
->confed_peers
[i
] == as
)
428 /* Add an AS to the confederation set. */
430 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
433 struct listnode
*node
, *nnode
;
436 return BGP_ERR_INVALID_BGP
;
439 return BGP_ERR_INVALID_AS
;
441 if (bgp_confederation_peers_check (bgp
, as
))
444 if (bgp
->confed_peers
)
445 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
447 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
449 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
450 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
452 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
453 bgp
->confed_peers_cnt
++;
455 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
457 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
461 peer
->local_as
= bgp
->as
;
462 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
464 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
465 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
466 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
469 bgp_session_reset_safe(peer
, &nnode
);
476 /* Delete an AS from the confederation set. */
478 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
483 struct listnode
*node
, *nnode
;
488 if (! bgp_confederation_peers_check (bgp
, as
))
491 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
492 if (bgp
->confed_peers
[i
] == as
)
493 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
494 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
496 bgp
->confed_peers_cnt
--;
498 if (bgp
->confed_peers_cnt
== 0)
500 if (bgp
->confed_peers
)
501 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
502 bgp
->confed_peers
= NULL
;
505 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
507 bgp
->confed_peers_cnt
* sizeof (as_t
));
509 /* Now reset any peer who's remote AS has just been removed from the
511 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
513 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
517 peer
->local_as
= bgp
->confed_id
;
518 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
520 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
521 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
522 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
525 bgp_session_reset_safe(peer
, &nnode
);
533 /* Local preference configuration. */
535 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
540 bgp
->default_local_pref
= local_pref
;
546 bgp_default_local_preference_unset (struct bgp
*bgp
)
551 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
556 /* Local preference configuration. */
558 bgp_default_subgroup_pkt_queue_max_set (struct bgp
*bgp
, u_int32_t queue_size
)
563 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
569 bgp_default_subgroup_pkt_queue_max_unset (struct bgp
*bgp
)
573 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
578 /* Listen limit configuration. */
580 bgp_listen_limit_set (struct bgp
*bgp
, int listen_limit
)
585 bgp
->dynamic_neighbors_limit
= listen_limit
;
591 bgp_listen_limit_unset (struct bgp
*bgp
)
596 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
602 peer_af_create (struct peer
*peer
, afi_t afi
, safi_t safi
)
610 afid
= afindex(afi
, safi
);
611 if (afid
>= BGP_AF_MAX
)
614 assert(peer
->peer_af_array
[afid
] == NULL
);
616 /* Allocate new peer af */
617 af
= XCALLOC (MTYPE_BGP_PEER_AF
, sizeof (struct peer_af
));
618 peer
->peer_af_array
[afid
] = af
;
624 //update_group_adjust_peer(af);
629 peer_af_find (struct peer
*peer
, afi_t afi
, safi_t safi
)
636 afid
= afindex(afi
, safi
);
637 if (afid
>= BGP_AF_MAX
)
640 return peer
->peer_af_array
[afid
];
644 peer_af_delete (struct peer
*peer
, afi_t afi
, safi_t safi
)
652 afid
= afindex(afi
, safi
);
653 if (afid
>= BGP_AF_MAX
)
656 af
= peer
->peer_af_array
[afid
];
660 bgp_stop_announce_route_timer (af
);
664 if (BGP_DEBUG (update_groups
, UPDATE_GROUPS
))
665 zlog_debug ("u%" PRIu64
":s%" PRIu64
" remove peer %s",
666 af
->subgroup
->update_group
->id
, af
->subgroup
->id
, peer
->host
);
669 update_subgroup_remove_peer (af
->subgroup
, af
);
671 peer
->peer_af_array
[afid
] = NULL
;
672 XFREE(MTYPE_BGP_PEER_AF
, af
);
677 /* If peer is RSERVER_CLIENT in at least one address family and is not member
678 of a peer_group for that family, return 1.
679 Used to check wether the peer is included in list bgp->rsclient. */
681 peer_rsclient_active (struct peer
*peer
)
686 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
687 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
688 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
689 && ! peer
->af_group
[i
][j
])
694 /* Peer comparison function for sorting. */
696 peer_cmp (struct peer
*p1
, struct peer
*p2
)
698 return sockunion_cmp (&p1
->su
, &p2
->su
);
702 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
704 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
707 /* Reset all address family specific configuration. */
709 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
712 struct bgp_filter
*filter
;
713 char orf_name
[BUFSIZ
];
715 filter
= &peer
->filter
[afi
][safi
];
717 /* Clear neighbor filter and route-map */
718 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
720 if (filter
->dlist
[i
].name
)
722 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
723 filter
->dlist
[i
].name
= NULL
;
725 if (filter
->plist
[i
].name
)
727 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
728 filter
->plist
[i
].name
= NULL
;
730 if (filter
->aslist
[i
].name
)
732 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
733 filter
->aslist
[i
].name
= NULL
;
736 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
738 if (filter
->map
[i
].name
)
740 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
741 filter
->map
[i
].name
= NULL
;
745 /* Clear unsuppress map. */
746 if (filter
->usmap
.name
)
747 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
748 filter
->usmap
.name
= NULL
;
749 filter
->usmap
.map
= NULL
;
751 /* Clear neighbor's all address family flags. */
752 peer
->af_flags
[afi
][safi
] = 0;
754 /* Clear neighbor's all address family sflags. */
755 peer
->af_sflags
[afi
][safi
] = 0;
757 /* Clear neighbor's all address family capabilities. */
758 peer
->af_cap
[afi
][safi
] = 0;
761 peer
->orf_plist
[afi
][safi
] = NULL
;
762 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
763 prefix_bgp_orf_remove_all (orf_name
);
765 /* Set default neighbor send-community. */
766 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
768 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
769 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
772 /* Clear neighbor default_originate_rmap */
773 if (peer
->default_rmap
[afi
][safi
].name
)
774 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
775 peer
->default_rmap
[afi
][safi
].name
= NULL
;
776 peer
->default_rmap
[afi
][safi
].map
= NULL
;
778 /* Clear neighbor maximum-prefix */
779 peer
->pmax
[afi
][safi
] = 0;
780 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
783 /* peer global config reset */
785 peer_global_config_reset (struct peer
*peer
)
791 peer
->change_local_as
= 0;
792 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
793 if (peer
->update_source
)
795 sockunion_free (peer
->update_source
);
796 peer
->update_source
= NULL
;
800 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
801 peer
->update_if
= NULL
;
804 if (peer_sort (peer
) == BGP_PEER_IBGP
)
805 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
807 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
809 /* This is a per-peer specific flag and so we must preserve it */
810 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
815 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
821 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
823 /* Reset some other configs back to defaults. */
824 peer
->v_start
= BGP_INIT_START_TIMER
;
825 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
826 peer
->password
= NULL
;
827 peer
->local_id
= peer
->bgp
->router_id
;
828 peer
->v_holdtime
= peer
->bgp
->default_holdtime
;
829 peer
->v_keepalive
= peer
->bgp
->default_keepalive
;
831 bfd_info_free(&(peer
->bfd_info
));
833 /* Set back the CONFIG_NODE flag. */
834 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
837 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
838 static bgp_peer_sort_t
839 peer_calc_sort (struct peer
*peer
)
846 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
848 if (peer
->as_type
== AS_INTERNAL
)
849 return BGP_PEER_IBGP
;
851 else if (peer
->as_type
== AS_EXTERNAL
)
852 return BGP_PEER_EBGP
;
854 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
)
855 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
860 peer1
= listnode_head (peer
->group
->peer
);
865 return BGP_PEER_INTERNAL
;
869 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
871 if (peer
->local_as
== 0)
872 return BGP_PEER_INTERNAL
;
874 if (peer
->local_as
== peer
->as
)
876 if (bgp
->as
== bgp
->confed_id
)
878 if (peer
->local_as
== bgp
->as
)
879 return BGP_PEER_IBGP
;
881 return BGP_PEER_EBGP
;
885 if (peer
->local_as
== bgp
->confed_id
)
886 return BGP_PEER_EBGP
;
888 return BGP_PEER_IBGP
;
892 if (bgp_confederation_peers_check (bgp
, peer
->as
))
893 return BGP_PEER_CONFED
;
895 return BGP_PEER_EBGP
;
899 if (peer
->as_type
!= AS_SPECIFIED
)
900 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
902 return (peer
->local_as
== 0
903 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
904 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
908 /* Calculate and cache the peer "sort" */
910 peer_sort (struct peer
*peer
)
912 peer
->sort
= peer_calc_sort (peer
);
917 peer_free (struct peer
*peer
)
919 assert (peer
->status
== Deleted
);
921 bgp_unlock(peer
->bgp
);
923 /* this /ought/ to have been done already through bgp_stop earlier,
924 * but just to be sure..
926 bgp_timer_set (peer
);
927 BGP_READ_OFF (peer
->t_read
);
928 BGP_WRITE_OFF (peer
->t_write
);
929 BGP_EVENT_FLUSH (peer
);
931 /* Free connected nexthop, if present */
932 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
) &&
933 !peer_dynamic_neighbor (peer
))
934 bgp_delete_connected_nexthop (family2afi(peer
->su
.sa
.sa_family
), peer
);
937 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
939 /* Free allocated host character. */
941 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
945 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
948 /* Update source configuration. */
949 if (peer
->update_source
)
950 sockunion_free (peer
->update_source
);
953 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
955 if (peer
->notify
.data
)
956 XFREE(MTYPE_TMP
, peer
->notify
.data
);
958 if (peer
->clear_node_queue
)
959 work_queue_free(peer
->clear_node_queue
);
961 bgp_sync_delete (peer
);
964 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
966 bfd_info_free(&(peer
->bfd_info
));
968 memset (peer
, 0, sizeof (struct peer
));
970 XFREE (MTYPE_BGP_PEER
, peer
);
973 /* increase reference count on a struct peer */
975 peer_lock_with_caller (const char *name
, struct peer
*peer
)
977 assert (peer
&& (peer
->lock
>= 0));
980 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
988 /* decrease reference count on a struct peer
989 * struct peer is freed and NULL returned if last reference
992 peer_unlock_with_caller (const char *name
, struct peer
*peer
)
994 assert (peer
&& (peer
->lock
> 0));
997 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1002 if (peer
->lock
== 0)
1011 /* Allocate new peer object, implicitely locked. */
1012 static struct peer
*
1013 peer_new (struct bgp
*bgp
)
1020 /* bgp argument is absolutely required */
1025 /* Allocate new peer. */
1026 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
1028 /* Set default value. */
1030 peer
->v_start
= BGP_INIT_START_TIMER
;
1031 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1032 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
1033 peer
->status
= Idle
;
1034 peer
->ostatus
= Idle
;
1035 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1037 peer
= peer_lock (peer
); /* initial reference */
1040 peer
->password
= NULL
;
1042 /* Set default flags. */
1043 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1044 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1046 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
1048 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1049 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
1051 peer
->orf_plist
[afi
][safi
] = NULL
;
1053 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1055 /* Create buffers. */
1056 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
1057 peer
->obuf
= stream_fifo_new ();
1059 /* We use a larger buffer for peer->work in the event that:
1060 * - We RX a BGP_UPDATE where the attributes alone are just
1061 * under BGP_MAX_PACKET_SIZE
1062 * - The user configures an outbound route-map that does many as-path
1063 * prepends or adds many communities. At most they can have CMD_ARGC_MAX
1064 * args in a route-map so there is a finite limit on how large they can
1065 * make the attributes.
1067 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
1068 * checking for every single attribute as we construct an UPDATE.
1070 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1071 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
1074 bgp_sync_init (peer
);
1076 /* Get service port number. */
1077 sp
= getservbyname ("bgp", "tcp");
1078 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
1084 * This function is invoked when a duplicate peer structure associated with
1085 * a neighbor is being deleted. If this about-to-be-deleted structure is
1086 * the one with all the config, then we have to copy over the info.
1089 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
1091 struct peer_af
*paf
;
1099 /* The following function is used by both peer group config copy to
1100 * individual peer and when we transfer config
1102 if (peer_src
->change_local_as
)
1103 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1105 /* peer flags apply */
1106 peer_dst
->flags
= peer_src
->flags
;
1107 peer_dst
->cap
= peer_src
->cap
;
1108 peer_dst
->config
= peer_src
->config
;
1110 peer_dst
->local_as
= peer_src
->local_as
;
1111 peer_dst
->ifindex
= peer_src
->ifindex
;
1112 peer_dst
->port
= peer_src
->port
;
1113 peer_sort(peer_dst
);
1114 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1117 peer_dst
->holdtime
= peer_src
->holdtime
;
1118 peer_dst
->keepalive
= peer_src
->keepalive
;
1119 peer_dst
->connect
= peer_src
->connect
;
1120 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1121 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1122 peer_dst
->v_asorig
= peer_src
->v_asorig
;
1123 peer_dst
->routeadv
= peer_src
->routeadv
;
1124 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1126 /* password apply */
1127 if (peer_src
->password
&& !peer_dst
->password
)
1128 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
1130 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1131 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1133 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1134 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1135 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
1138 PEERAF_FOREACH(peer_src
, paf
, afindex
)
1139 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1141 /* update-source apply */
1142 if (peer_src
->update_source
)
1144 if (peer_dst
->update_source
)
1145 sockunion_free (peer_dst
->update_source
);
1146 if (peer_dst
->update_if
)
1148 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1149 peer_dst
->update_if
= NULL
;
1151 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
1153 else if (peer_src
->update_if
)
1155 if (peer_dst
->update_if
)
1156 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1157 if (peer_dst
->update_source
)
1159 sockunion_free (peer_dst
->update_source
);
1160 peer_dst
->update_source
= NULL
;
1162 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1165 if (peer_src
->ifname
)
1167 if (peer_dst
->ifname
)
1168 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1170 peer_dst
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1175 bgp_peer_conf_if_to_su_update_v4 (struct peer
*peer
, struct interface
*ifp
)
1177 struct connected
*ifc
;
1180 struct listnode
*node
;
1182 /* If our IPv4 address on the interface is /30 or /31, we can derive the
1183 * IPv4 address of the other end.
1185 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
))
1187 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
))
1189 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1190 if (p
.prefixlen
== 30)
1192 peer
->su
.sa
.sa_family
= AF_INET
;
1193 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1194 if (s_addr
% 4 == 1)
1195 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1196 else if (s_addr
% 4 == 2)
1197 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1198 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1199 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1200 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1203 else if (p
.prefixlen
== 31)
1205 peer
->su
.sa
.sa_family
= AF_INET
;
1206 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1207 if (s_addr
% 2 == 0)
1208 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1210 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1211 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1212 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1213 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1217 zlog_warn("%s: IPv4 interface address is not /30 or /31, v4 session not started",
1226 bgp_peer_conf_if_to_su_update_v6 (struct peer
*peer
, struct interface
*ifp
)
1228 struct nbr_connected
*ifc_nbr
;
1230 /* Have we learnt the peer's IPv6 link-local address? */
1231 if (ifp
->nbr_connected
&&
1232 (ifc_nbr
= listnode_head(ifp
->nbr_connected
)))
1234 peer
->su
.sa
.sa_family
= AF_INET6
;
1235 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1236 sizeof (struct in6_addr
));
1238 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1240 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1248 * Set or reset the peer address socketunion structure based on the
1249 * learnt/derived peer address. If the address has changed, update the
1250 * password on the listen socket, if needed.
1253 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
1255 struct interface
*ifp
;
1257 int peer_addr_updated
= 0;
1262 prev_family
= peer
->su
.sa
.sa_family
;
1263 if ((ifp
= if_lookup_by_name(peer
->conf_if
)))
1265 /* If BGP unnumbered is not "v6only", we first see if we can derive the
1266 * peer's IPv4 address.
1268 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1269 peer_addr_updated
= bgp_peer_conf_if_to_su_update_v4 (peer
, ifp
);
1271 /* If "v6only" or we can't derive peer's IPv4 address, see if we've
1272 * learnt the peer's IPv6 link-local address. This is from the source
1273 * IPv6 address in router advertisement.
1275 if (!peer_addr_updated
)
1276 peer_addr_updated
= bgp_peer_conf_if_to_su_update_v6 (peer
, ifp
);
1278 /* If we could derive the peer address, we may need to install the password
1279 * configured for the peer, if any, on the listen socket. Otherwise, mark
1280 * that peer's address is not available and uninstall the password, if
1283 if (peer_addr_updated
)
1285 if (peer
->password
&& prev_family
== AF_UNSPEC
)
1290 if (peer
->password
&& prev_family
!= AF_UNSPEC
)
1291 bgp_md5_unset (peer
);
1292 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1293 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1297 /* Create new BGP peer. */
1299 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1300 as_t local_as
, as_t remote_as
, int as_type
, afi_t afi
, safi_t safi
)
1304 char buf
[SU_ADDRSTRLEN
];
1306 peer
= peer_new (bgp
);
1309 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1310 bgp_peer_conf_if_to_su_update(peer
);
1312 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1313 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1318 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1320 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1321 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1323 peer
->local_as
= local_as
;
1324 peer
->as
= remote_as
;
1325 peer
->as_type
= as_type
;
1326 peer
->local_id
= bgp
->router_id
;
1327 peer
->v_holdtime
= bgp
->default_holdtime
;
1328 peer
->v_keepalive
= bgp
->default_keepalive
;
1329 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1330 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1332 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1334 peer
= peer_lock (peer
); /* bgp peer list reference */
1335 listnode_add_sort (bgp
->peer
, peer
);
1337 active
= peer_active (peer
);
1339 /* Last read and reset time set */
1340 peer
->readtime
= peer
->resettime
= bgp_clock ();
1342 /* Default TTL set. */
1343 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1345 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1349 peer
->afc
[afi
][safi
] = 1;
1350 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1352 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1356 /* Set up peer's events and timers. */
1357 if (! active
&& peer_active (peer
))
1358 bgp_timer_set (peer
);
1364 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1365 safi_t safi
, int v6only
)
1369 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1372 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1373 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1374 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, AS_UNSPECIFIED
, 0, 0);
1376 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, AS_UNSPECIFIED
, afi
, safi
);
1379 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1381 else if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)) ||
1382 (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)))
1385 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1387 UNSET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1389 /* v6only flag changed. Reset bgp seesion */
1390 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1392 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
1393 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1394 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1397 bgp_session_reset(peer
);
1403 /* Make accept BGP peer. Called from bgp_accept (). */
1405 peer_create_accept (struct bgp
*bgp
)
1409 peer
= peer_new (bgp
);
1411 peer
= peer_lock (peer
); /* bgp peer list reference */
1412 listnode_add_sort (bgp
->peer
, peer
);
1417 /* Change peer's AS number. */
1419 peer_as_change (struct peer
*peer
, as_t as
, int as_specified
)
1421 bgp_peer_sort_t type
;
1425 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1427 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1429 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1430 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1431 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1434 bgp_session_reset(peer
);
1436 type
= peer_sort (peer
);
1438 peer
->as_type
= as_specified
;
1440 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1441 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1442 && peer
->bgp
->as
!= as
)
1443 peer
->local_as
= peer
->bgp
->confed_id
;
1445 peer
->local_as
= peer
->bgp
->as
;
1447 /* Advertisement-interval reset */
1450 conf
= peer
->group
->conf
;
1452 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1454 peer
->v_routeadv
= conf
->routeadv
;
1456 /* Only go back to the default advertisement-interval if the user had not
1457 * already configured it */
1458 else if (!CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
1460 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1461 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1463 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1466 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1468 else if (type
== BGP_PEER_IBGP
)
1471 /* reflector-client reset */
1472 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1474 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1475 PEER_FLAG_REFLECTOR_CLIENT
);
1476 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1477 PEER_FLAG_REFLECTOR_CLIENT
);
1478 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1479 PEER_FLAG_REFLECTOR_CLIENT
);
1480 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1481 PEER_FLAG_REFLECTOR_CLIENT
);
1482 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1483 PEER_FLAG_REFLECTOR_CLIENT
);
1486 /* local-as reset */
1487 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1489 peer
->change_local_as
= 0;
1490 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1491 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1495 /* If peer does not exist, create new one. If peer already exists,
1496 set AS number to the peer. */
1498 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1499 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1505 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1507 peer
= peer_lookup (bgp
, su
);
1511 /* Not allowed for a dynamic peer. */
1512 if (peer_dynamic_neighbor (peer
))
1515 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1518 /* When this peer is a member of peer-group. */
1521 if (peer
->group
->conf
->as
)
1523 /* Return peer group's AS number. */
1524 *as
= peer
->group
->conf
->as
;
1525 return BGP_ERR_PEER_GROUP_MEMBER
;
1527 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1529 if ((as_type
!= AS_INTERNAL
) && (bgp
->as
!= *as
))
1532 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1537 if ((as_type
!= AS_EXTERNAL
) && (bgp
->as
== *as
))
1540 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1545 /* Existing peer's AS number change. */
1546 if (peer
->as
!= *as
)
1547 peer_as_change (peer
, *as
, as_type
);
1552 return BGP_ERR_NO_INTERFACE_CONFIG
;
1554 /* If the peer is not part of our confederation, and its not an
1555 iBGP peer then spoof the source AS */
1556 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1557 && ! bgp_confederation_peers_check (bgp
, *as
)
1559 local_as
= bgp
->confed_id
;
1563 /* If this is IPv4 unicast configuration and "no bgp default
1564 ipv4-unicast" is specified. */
1566 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1567 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1568 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0, 0);
1570 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, afi
, safi
);
1576 /* Activate the peer or peer group for specified AFI and SAFI. */
1578 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1582 if (peer
->afc
[afi
][safi
])
1585 /* Activate the address family configuration. */
1586 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1587 peer
->afc
[afi
][safi
] = 1;
1590 active
= peer_active (peer
);
1592 peer
->afc
[afi
][safi
] = 1;
1594 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1596 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1599 if (! active
&& peer_active (peer
))
1600 bgp_timer_set (peer
);
1603 if (peer
->status
== Established
)
1605 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1607 peer
->afc_adv
[afi
][safi
] = 1;
1608 bgp_capability_send (peer
, afi
, safi
,
1610 CAPABILITY_ACTION_SET
);
1611 if (peer
->afc_recv
[afi
][safi
])
1613 peer
->afc_nego
[afi
][safi
] = 1;
1614 bgp_announce_route (peer
, afi
, safi
);
1619 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1620 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1621 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1630 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1632 struct peer_group
*group
;
1634 struct listnode
*node
, *nnode
;
1636 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1638 group
= peer
->group
;
1640 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1642 if (peer1
->af_group
[afi
][safi
])
1643 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1648 if (peer
->af_group
[afi
][safi
])
1649 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1652 if (! peer
->afc
[afi
][safi
])
1655 /* De-activate the address family configuration. */
1656 peer
->afc
[afi
][safi
] = 0;
1657 peer_af_flag_reset (peer
, afi
, safi
);
1658 if (peer_af_delete(peer
, afi
, safi
) != 0)
1660 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
1663 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1665 if (peer
->status
== Established
)
1667 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1669 peer
->afc_adv
[afi
][safi
] = 0;
1670 peer
->afc_nego
[afi
][safi
] = 0;
1672 if (peer_active_nego (peer
))
1674 bgp_capability_send (peer
, afi
, safi
,
1676 CAPABILITY_ACTION_UNSET
);
1677 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1678 peer
->pcount
[afi
][safi
] = 0;
1682 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1683 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1684 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1689 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1690 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1691 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1699 peer_nsf_stop (struct peer
*peer
)
1704 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1705 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1707 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1708 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1709 peer
->nsf
[afi
][safi
] = 0;
1711 if (peer
->t_gr_restart
)
1713 BGP_TIMER_OFF (peer
->t_gr_restart
);
1714 if (bgp_debug_neighbor_events(peer
))
1715 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1717 if (peer
->t_gr_stale
)
1719 BGP_TIMER_OFF (peer
->t_gr_stale
);
1720 if (bgp_debug_neighbor_events(peer
))
1721 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1723 bgp_clear_route_all (peer
);
1726 /* Delete peer from confguration.
1728 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1729 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1731 * This function /should/ take care to be idempotent, to guard against
1732 * it being called multiple times through stray events that come in
1733 * that happen to result in this function being called again. That
1734 * said, getting here for a "Deleted" peer is a bug in the neighbour
1738 peer_delete (struct peer
*peer
)
1744 struct bgp_filter
*filter
;
1745 struct listnode
*pn
;
1748 assert (peer
->status
!= Deleted
);
1751 accept_peer
= CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1753 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1754 peer_nsf_stop (peer
);
1756 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1758 /* If this peer belongs to peer group, clear up the
1762 if (peer_dynamic_neighbor(peer
))
1763 peer_drop_dynamic_neighbor(peer
);
1765 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1767 peer
= peer_unlock (peer
); /* group->peer list reference */
1768 list_delete_node (peer
->group
->peer
, pn
);
1773 /* Withdraw all information from routing table. We can not use
1774 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1775 * executed after peer structure is deleted.
1777 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1779 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1781 if (peer
->doppelganger
)
1782 peer
->doppelganger
->doppelganger
= NULL
;
1783 peer
->doppelganger
= NULL
;
1785 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1786 bgp_fsm_change_status (peer
, Deleted
);
1788 /* Password configuration */
1791 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1792 peer
->password
= NULL
;
1795 ! BGP_PEER_SU_UNSPEC(peer
) &&
1796 ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1797 bgp_md5_unset (peer
);
1800 bgp_timer_set (peer
); /* stops all timers for Deleted */
1802 /* Delete from all peer list. */
1803 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1804 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1806 peer_unlock (peer
); /* bgp peer list reference */
1807 list_delete_node (bgp
->peer
, pn
);
1810 if (peer_rsclient_active (peer
)
1811 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1813 peer_unlock (peer
); /* rsclient list reference */
1814 list_delete_node (bgp
->rsclient
, pn
);
1816 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1818 /* Clear our own rsclient ribs. */
1819 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1820 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1821 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1822 PEER_FLAG_RSERVER_CLIENT
))
1823 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1827 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1828 member of a peer_group. */
1829 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1830 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1831 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1832 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1836 stream_free (peer
->ibuf
);
1838 stream_fifo_free (peer
->obuf
);
1840 stream_free (peer
->work
);
1842 stream_free(peer
->scratch
);
1844 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1846 /* Local and remote addresses. */
1848 sockunion_free (peer
->su_local
);
1849 if (peer
->su_remote
)
1850 sockunion_free (peer
->su_remote
);
1851 peer
->su_local
= peer
->su_remote
= NULL
;
1853 /* Free filter related memory. */
1854 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1855 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1857 filter
= &peer
->filter
[afi
][safi
];
1859 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1861 if (filter
->dlist
[i
].name
)
1862 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
1863 if (filter
->plist
[i
].name
)
1864 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
1865 if (filter
->aslist
[i
].name
)
1866 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
1868 filter
->dlist
[i
].name
= NULL
;
1869 filter
->plist
[i
].name
= NULL
;
1870 filter
->aslist
[i
].name
= NULL
;
1872 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1874 if (filter
->map
[i
].name
)
1875 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
1876 filter
->map
[i
].name
= NULL
;
1879 if (filter
->usmap
.name
)
1880 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
1882 if (peer
->default_rmap
[afi
][safi
].name
)
1883 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
1885 filter
->usmap
.name
= NULL
;
1886 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1889 FOREACH_AFI_SAFI (afi
, safi
)
1890 peer_af_delete (peer
, afi
, safi
);
1891 peer_unlock (peer
); /* initial reference */
1897 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1899 return strcmp (g1
->name
, g2
->name
);
1902 /* Peer group cofiguration. */
1903 static struct peer_group
*
1904 peer_group_new (void)
1906 return (struct peer_group
*) XCALLOC (MTYPE_BGP_PEER_GROUP
,
1907 sizeof (struct peer_group
));
1911 peer_group_free (struct peer_group
*group
)
1913 XFREE (MTYPE_BGP_PEER_GROUP
, group
);
1917 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1919 struct peer_group
*group
;
1920 struct listnode
*node
, *nnode
;
1922 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1924 if (strcmp (group
->name
, name
) == 0)
1931 peer_group_get (struct bgp
*bgp
, const char *name
)
1933 struct peer_group
*group
;
1936 group
= peer_group_lookup (bgp
, name
);
1940 group
= peer_group_new ();
1943 XFREE(MTYPE_BGP_PEER_GROUP_HOST
, group
->name
);
1944 group
->name
= XSTRDUP(MTYPE_BGP_PEER_GROUP_HOST
, name
);
1945 group
->peer
= list_new ();
1946 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1947 group
->listen_range
[afi
] = list_new ();
1948 group
->conf
= peer_new (bgp
);
1949 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1950 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1951 if (group
->conf
->host
)
1952 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
1953 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1954 group
->conf
->group
= group
;
1955 group
->conf
->as
= 0;
1956 group
->conf
->ttl
= 1;
1957 group
->conf
->gtsm_hops
= 0;
1958 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1959 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1960 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1961 group
->conf
->keepalive
= 0;
1962 group
->conf
->holdtime
= 0;
1963 group
->conf
->connect
= 0;
1964 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1965 listnode_add_sort (bgp
->group
, group
);
1971 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1972 afi_t afi
, safi_t safi
)
1975 int out
= FILTER_OUT
;
1977 struct bgp_filter
*pfilter
;
1978 struct bgp_filter
*gfilter
;
1982 pfilter
= &peer
->filter
[afi
][safi
];
1983 gfilter
= &conf
->filter
[afi
][safi
];
1987 peer
->as
= conf
->as
;
1990 if (conf
->change_local_as
)
1991 peer
->change_local_as
= conf
->change_local_as
;
1994 peer
->ttl
= conf
->ttl
;
1997 peer
->gtsm_hops
= conf
->gtsm_hops
;
2000 peer
->weight
= conf
->weight
;
2002 /* this flag is per-neighbor and so has to be preserved */
2003 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2005 /* peer flags apply */
2006 peer
->flags
= conf
->flags
;
2009 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2011 /* peer af_flags apply */
2012 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
2013 /* peer config apply */
2014 peer
->config
= conf
->config
;
2016 /* peer timers apply */
2017 peer
->holdtime
= conf
->holdtime
;
2018 peer
->keepalive
= conf
->keepalive
;
2019 peer
->connect
= conf
->connect
;
2020 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
2021 peer
->v_connect
= conf
->connect
;
2023 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
2025 /* advertisement-interval reset */
2026 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
2027 peer
->v_routeadv
= conf
->routeadv
;
2029 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2030 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2032 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2034 /* password apply */
2035 if (conf
->password
&& !peer
->password
)
2036 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
2038 if (! BGP_PEER_SU_UNSPEC(peer
))
2041 /* maximum-prefix */
2042 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
2043 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
2044 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
2047 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
2049 /* route-server-client */
2050 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2052 /* Make peer's RIB point to group's RIB. */
2053 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
2055 /* Import policy. */
2056 if (pfilter
->map
[RMAP_IMPORT
].name
)
2057 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2058 if (gfilter
->map
[RMAP_IMPORT
].name
)
2060 pfilter
->map
[RMAP_IMPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IMPORT
].name
);
2061 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2065 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2066 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2069 /* Export policy. */
2070 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2072 pfilter
->map
[RMAP_EXPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_EXPORT
].name
);
2073 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2077 /* default-originate route-map */
2078 if (conf
->default_rmap
[afi
][safi
].name
)
2080 if (peer
->default_rmap
[afi
][safi
].name
)
2081 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->default_rmap
[afi
][safi
].name
);
2082 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, conf
->default_rmap
[afi
][safi
].name
);
2083 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
2086 /* update-source apply */
2087 if (conf
->update_source
)
2089 if (peer
->update_source
)
2090 sockunion_free (peer
->update_source
);
2091 if (peer
->update_if
)
2093 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2094 peer
->update_if
= NULL
;
2096 peer
->update_source
= sockunion_dup (conf
->update_source
);
2098 else if (conf
->update_if
)
2100 if (peer
->update_if
)
2101 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2102 if (peer
->update_source
)
2104 sockunion_free (peer
->update_source
);
2105 peer
->update_source
= NULL
;
2107 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
2110 /* inbound filter apply */
2111 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
2113 if (pfilter
->dlist
[in
].name
)
2114 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[in
].name
);
2115 pfilter
->dlist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[in
].name
);
2116 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
2118 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
2120 if (pfilter
->plist
[in
].name
)
2121 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[in
].name
);
2122 pfilter
->plist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[in
].name
);
2123 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
2125 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
2127 if (pfilter
->aslist
[in
].name
)
2128 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[in
].name
);
2129 pfilter
->aslist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[in
].name
);
2130 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
2132 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
2134 if (pfilter
->map
[RMAP_IN
].name
)
2135 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IN
].name
);
2136 pfilter
->map
[RMAP_IN
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IN
].name
);
2137 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
2140 /* outbound filter apply */
2141 if (gfilter
->dlist
[out
].name
)
2143 if (pfilter
->dlist
[out
].name
)
2144 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[out
].name
);
2145 pfilter
->dlist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[out
].name
);
2146 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
2150 if (pfilter
->dlist
[out
].name
)
2151 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[out
].name
);
2152 pfilter
->dlist
[out
].name
= NULL
;
2153 pfilter
->dlist
[out
].alist
= NULL
;
2155 if (gfilter
->plist
[out
].name
)
2157 if (pfilter
->plist
[out
].name
)
2158 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[out
].name
);
2159 pfilter
->plist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[out
].name
);
2160 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
2164 if (pfilter
->plist
[out
].name
)
2165 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[out
].name
);
2166 pfilter
->plist
[out
].name
= NULL
;
2167 pfilter
->plist
[out
].plist
= NULL
;
2169 if (gfilter
->aslist
[out
].name
)
2171 if (pfilter
->aslist
[out
].name
)
2172 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[out
].name
);
2173 pfilter
->aslist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[out
].name
);
2174 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
2178 if (pfilter
->aslist
[out
].name
)
2179 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[out
].name
);
2180 pfilter
->aslist
[out
].name
= NULL
;
2181 pfilter
->aslist
[out
].aslist
= NULL
;
2183 if (gfilter
->map
[RMAP_OUT
].name
)
2185 if (pfilter
->map
[RMAP_OUT
].name
)
2186 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_OUT
].name
);
2187 pfilter
->map
[RMAP_OUT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_OUT
].name
);
2188 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
2192 if (pfilter
->map
[RMAP_OUT
].name
)
2193 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_OUT
].name
);
2194 pfilter
->map
[RMAP_OUT
].name
= NULL
;
2195 pfilter
->map
[RMAP_OUT
].map
= NULL
;
2198 /* RS-client's import/export route-maps. */
2199 if (gfilter
->map
[RMAP_IMPORT
].name
)
2201 if (pfilter
->map
[RMAP_IMPORT
].name
)
2202 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2203 pfilter
->map
[RMAP_IMPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IMPORT
].name
);
2204 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2208 if (pfilter
->map
[RMAP_IMPORT
].name
)
2209 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2210 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2211 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2213 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2215 if (pfilter
->map
[RMAP_EXPORT
].name
)
2216 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_EXPORT
].name
);
2217 pfilter
->map
[RMAP_EXPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_EXPORT
].name
);
2218 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2221 if (gfilter
->usmap
.name
)
2223 if (pfilter
->usmap
.name
)
2224 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->usmap
.name
);
2225 pfilter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->usmap
.name
);
2226 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
2230 if (pfilter
->usmap
.name
)
2231 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->usmap
.name
);
2232 pfilter
->usmap
.name
= NULL
;
2233 pfilter
->usmap
.map
= NULL
;
2236 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2239 /* Peer group's remote AS configuration. */
2241 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
,
2242 as_t
*as
, int as_type
)
2244 struct peer_group
*group
;
2246 struct listnode
*node
, *nnode
;
2248 group
= peer_group_lookup (bgp
, group_name
);
2252 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2256 /* When we setup peer-group AS number all peer group member's AS
2257 number must be updated to same number. */
2258 peer_as_change (group
->conf
, *as
, as_type
);
2260 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2262 if (peer
->as
!= *as
)
2263 peer_as_change (peer
, *as
, as_type
);
2270 peer_group_delete (struct peer_group
*group
)
2274 struct prefix
*prefix
;
2276 struct listnode
*node
, *nnode
;
2281 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2283 other
= peer
->doppelganger
;
2285 if (other
&& other
->status
!= Deleted
)
2287 other
->group
= NULL
;
2291 list_delete (group
->peer
);
2293 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2295 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2297 prefix_free(prefix
);
2299 list_delete (group
->listen_range
[afi
]);
2302 XFREE(MTYPE_BGP_PEER_HOST
, group
->name
);
2305 group
->conf
->group
= NULL
;
2306 peer_delete (group
->conf
);
2308 /* Delete from all peer_group list. */
2309 listnode_delete (bgp
->group
, group
);
2311 bfd_info_free(&(group
->conf
->bfd_info
));
2313 peer_group_free (group
);
2319 peer_group_remote_as_delete (struct peer_group
*group
)
2321 struct peer
*peer
, *other
;
2322 struct listnode
*node
, *nnode
;
2324 if ((group
->conf
->as_type
== AS_UNSPECIFIED
) ||
2325 ((! group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2328 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2330 other
= peer
->doppelganger
;
2334 if (other
&& other
->status
!= Deleted
)
2336 other
->group
= NULL
;
2340 list_delete_all_node (group
->peer
);
2342 group
->conf
->as
= 0;
2343 group
->conf
->as_type
= AS_UNSPECIFIED
;
2349 peer_group_listen_range_add (struct peer_group
*group
, struct prefix
*range
)
2351 struct prefix
*prefix
;
2352 struct listnode
*node
, *nnode
;
2355 afi
= family2afi(range
->family
);
2357 /* Group needs remote AS configured. */
2358 if (group
->conf
->as_type
== AS_UNSPECIFIED
)
2359 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2361 /* Ensure no duplicates. Currently we don't care about overlaps. */
2362 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2364 if (prefix_same(range
, prefix
))
2368 prefix
= prefix_new();
2369 prefix_copy(prefix
, range
);
2370 listnode_add(group
->listen_range
[afi
], prefix
);
2375 peer_group_listen_range_del (struct peer_group
*group
, struct prefix
*range
)
2377 struct prefix
*prefix
, *prefix2
;
2378 struct listnode
*node
, *nnode
;
2381 char buf
[SU_ADDRSTRLEN
];
2383 afi
= family2afi(range
->family
);
2385 /* Identify the listen range. */
2386 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2388 if (prefix_same(range
, prefix
))
2393 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2395 prefix2str(prefix
, buf
, sizeof(buf
));
2397 /* Dispose off any dynamic neighbors that exist due to this listen range */
2398 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2400 if (!peer_dynamic_neighbor (peer
))
2403 prefix2
= sockunion2hostprefix(&peer
->su
);
2404 if (prefix_match(prefix
, prefix2
))
2406 if (bgp_debug_neighbor_events(peer
))
2407 zlog_debug ("Deleting dynamic neighbor %s group %s upon "
2408 "delete of listen range %s",
2409 peer
->host
, group
->name
, buf
);
2414 /* Get rid of the listen range */
2415 listnode_delete(group
->listen_range
[afi
], prefix
);
2420 /* Bind specified peer to peer group. */
2422 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2423 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
2425 int first_member
= 0;
2427 /* Check peer group's address family. */
2428 if (! group
->conf
->afc
[afi
][safi
])
2429 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
2431 /* Lookup the peer. */
2433 peer
= peer_lookup (bgp
, su
);
2435 /* Create a new peer. */
2438 if ((group
->conf
->as_type
== AS_SPECIFIED
) && (! group
->conf
->as
)) {
2439 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2442 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, afi
, safi
);
2443 peer
->group
= group
;
2444 peer
->af_group
[afi
][safi
] = 1;
2446 peer
= peer_lock (peer
); /* group->peer list reference */
2447 listnode_add (group
->peer
, peer
);
2448 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2449 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2454 /* When the peer already belongs to peer group, check the consistency. */
2455 if (peer
->af_group
[afi
][safi
])
2457 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2458 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2463 /* Check current peer group configuration. */
2464 if (peer_group_active (peer
)
2465 && strcmp (peer
->group
->name
, group
->name
) != 0)
2466 return BGP_ERR_PEER_GROUP_MISMATCH
;
2468 if (peer
->as_type
== AS_UNSPECIFIED
)
2470 peer
->as_type
= group
->conf
->as_type
;
2471 peer
->as
= group
->conf
->as
;
2474 if (! group
->conf
->as
)
2476 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2477 && peer_sort (group
->conf
) != peer_sort (peer
))
2481 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2484 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2488 peer
->af_group
[afi
][safi
] = 1;
2489 peer
->afc
[afi
][safi
] = 1;
2490 if (!peer_af_find(peer
, afi
, safi
) &&
2491 peer_af_create(peer
, afi
, safi
) == NULL
)
2493 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2497 peer
->group
= group
;
2499 peer
= peer_lock (peer
); /* group->peer list reference */
2500 listnode_add (group
->peer
, peer
);
2503 assert (group
&& peer
->group
== group
);
2507 /* Advertisement-interval reset */
2508 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2510 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2511 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2513 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2516 /* ebgp-multihop reset */
2517 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2518 group
->conf
->ttl
= 255;
2520 /* local-as reset */
2521 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2523 group
->conf
->change_local_as
= 0;
2524 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2525 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2529 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2531 struct listnode
*pn
;
2533 /* If it's not configured as RSERVER_CLIENT in any other address
2534 family, without being member of a peer_group, remove it from
2535 list bgp->rsclient.*/
2536 if (! peer_rsclient_active (peer
)
2537 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2539 peer_unlock (peer
); /* peer rsclient reference */
2540 list_delete_node (bgp
->rsclient
, pn
);
2542 /* Clear our own rsclient rib for this afi/safi. */
2543 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2546 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2548 /* Import policy. */
2549 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2551 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2552 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2553 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2556 /* Export policy. */
2557 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2558 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2560 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2561 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2562 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2566 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2567 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2569 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2571 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2572 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2573 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2576 bgp_session_reset(peer
);
2582 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2583 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2587 if (! peer
->af_group
[afi
][safi
])
2590 if (group
!= peer
->group
)
2591 return BGP_ERR_PEER_GROUP_MISMATCH
;
2593 peer
->af_group
[afi
][safi
] = 0;
2594 peer
->afc
[afi
][safi
] = 0;
2595 peer_af_flag_reset (peer
, afi
, safi
);
2596 if (peer_af_delete(peer
, afi
, safi
) != 0)
2598 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
2601 if (peer
->rib
[afi
][safi
])
2602 peer
->rib
[afi
][safi
] = NULL
;
2604 if (! peer_group_active (peer
))
2606 assert (listnode_lookup (group
->peer
, peer
));
2607 peer_unlock (peer
); /* peer group list reference */
2608 listnode_delete (group
->peer
, peer
);
2610 other
= peer
->doppelganger
;
2611 if (group
->conf
->as
)
2614 if (other
&& other
->status
!= Deleted
)
2619 listnode_delete(group
->peer
, other
);
2621 other
->group
= NULL
;
2626 bgp_bfd_deregister_peer(peer
);
2627 peer_global_config_reset (peer
);
2630 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2632 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2633 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2634 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2637 bgp_session_reset(peer
);
2643 bgp_startup_timer_expire (struct thread
*thread
)
2647 bgp
= THREAD_ARG (thread
);
2648 bgp
->t_startup
= NULL
;
2654 /* BGP instance creation by `router bgp' commands. */
2656 bgp_create (as_t
*as
, const char *name
)
2662 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2666 bgp
->peer_self
= peer_new (bgp
);
2667 if (bgp
->peer_self
->host
)
2668 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
2669 bgp
->peer_self
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
2670 bgp
->peer
= list_new ();
2671 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2673 bgp
->group
= list_new ();
2674 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2676 bgp
->rsclient
= list_new ();
2677 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2679 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2680 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2682 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2683 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2684 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2685 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2686 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2689 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2690 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2691 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
2692 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2693 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2694 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2695 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2696 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
2697 bgp
->dynamic_neighbors_count
= 0;
2702 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
2704 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2705 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2707 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2708 bgp
, bgp
->restart_time
);
2710 update_bgp_group_init(bgp
);
2714 /* Return first entry of BGP. */
2716 bgp_get_default (void)
2719 return (listgetdata (listhead (bm
->bgp
)));
2723 /* Lookup BGP entry. */
2725 bgp_lookup (as_t as
, const char *name
)
2728 struct listnode
*node
, *nnode
;
2730 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2732 && ((bgp
->name
== NULL
&& name
== NULL
)
2733 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2738 /* Lookup BGP structure by view name. */
2740 bgp_lookup_by_name (const char *name
)
2743 struct listnode
*node
, *nnode
;
2745 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2746 if ((bgp
->name
== NULL
&& name
== NULL
)
2747 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2752 /* Called from VTY commands. */
2754 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2758 /* Multiple instance check. */
2759 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2762 bgp
= bgp_lookup_by_name (name
);
2764 bgp
= bgp_get_default ();
2766 /* Already exists. */
2772 return BGP_ERR_INSTANCE_MISMATCH
;
2780 /* BGP instance name can not be specified for single instance. */
2782 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2784 /* Get default BGP structure if exists. */
2785 bgp
= bgp_get_default ();
2792 return BGP_ERR_AS_MISMATCH
;
2799 bgp
= bgp_create (as
, name
);
2800 bgp_router_id_set(bgp
, &router_id_zebra
);
2803 bgp
->t_rmap_def_originate_eval
= NULL
;
2804 bgp
->t_rmap_update
= NULL
;
2805 bgp
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
2807 /* Create BGP server socket, if first instance. */
2808 if (list_isempty(bm
->bgp
)
2809 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2811 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2812 return BGP_ERR_INVALID_VALUE
;
2815 listnode_add (bm
->bgp
, bgp
);
2820 /* Delete BGP instance. */
2822 bgp_delete (struct bgp
*bgp
)
2825 struct peer_group
*group
;
2826 struct listnode
*node
, *pnode
;
2827 struct listnode
*next
, *pnext
;
2831 THREAD_OFF (bgp
->t_startup
);
2833 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2835 if (peer
->status
== Established
||
2836 peer
->status
== OpenSent
||
2837 peer
->status
== OpenConfirm
)
2839 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2840 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2844 if (bgp
->t_rmap_update
)
2845 BGP_TIMER_OFF(bgp
->t_rmap_update
);
2847 /* Delete static route. */
2848 bgp_static_delete (bgp
);
2850 /* Unset redistribution. */
2851 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2852 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2853 if (i
!= ZEBRA_ROUTE_BGP
)
2854 bgp_redistribute_unset (bgp
, afi
, i
, 0);
2856 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2858 for (ALL_LIST_ELEMENTS (group
->peer
, pnode
, pnext
, peer
))
2860 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2862 /* Send notify to remote peer. */
2863 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2866 peer_group_delete (group
);
2869 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2871 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2873 /* Send notify to remote peer. */
2874 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2880 assert (listcount (bgp
->rsclient
) == 0);
2882 if (bgp
->peer_self
) {
2883 peer_delete(bgp
->peer_self
);
2884 bgp
->peer_self
= NULL
;
2887 if (bgp
->t_rmap_def_originate_eval
)
2889 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
2893 update_bgp_group_free (bgp
);
2894 /* Remove visibility via the master list - there may however still be
2895 * routes to be processed still referencing the struct bgp.
2897 listnode_delete (bm
->bgp
, bgp
);
2898 if (list_isempty(bm
->bgp
))
2901 thread_master_free_unused(bm
->master
);
2902 bgp_unlock(bgp
); /* initial reference */
2907 static void bgp_free (struct bgp
*);
2910 bgp_lock (struct bgp
*bgp
)
2916 bgp_unlock(struct bgp
*bgp
)
2918 assert(bgp
->lock
> 0);
2919 if (--bgp
->lock
== 0)
2924 bgp_free (struct bgp
*bgp
)
2929 list_delete (bgp
->group
);
2930 list_delete (bgp
->peer
);
2931 list_delete (bgp
->rsclient
);
2934 XFREE(MTYPE_BGP
, bgp
->name
);
2936 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2937 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2939 if (bgp
->route
[afi
][safi
])
2940 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2941 if (bgp
->aggregate
[afi
][safi
])
2942 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2943 if (bgp
->rib
[afi
][safi
])
2944 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2946 XFREE (MTYPE_BGP
, bgp
);
2950 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2953 struct listnode
*node
, *nnode
;
2960 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2961 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2962 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2965 else if (bm
->bgp
!= NULL
)
2967 struct listnode
*bgpnode
, *nbgpnode
;
2969 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2970 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2971 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2972 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2979 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2982 struct listnode
*node
, *nnode
;
2986 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2987 if (sockunion_same (&peer
->su
, su
)
2988 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2991 else if (bm
->bgp
!= NULL
)
2993 struct listnode
*bgpnode
, *nbgpnode
;
2995 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2996 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2997 if (sockunion_same (&peer
->su
, su
)
2998 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
3005 peer_create_bind_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
,
3006 struct peer_group
*group
)
3012 /* Create peer first; we've already checked group config is valid. */
3013 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, 0, 0);
3018 peer
->group
= group
;
3019 peer
= peer_lock (peer
);
3020 listnode_add (group
->peer
, peer
);
3023 * Bind peer for all AFs configured for the group. We don't call
3024 * peer_group_bind as that is sub-optimal and does some stuff we don't want.
3026 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3027 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3029 if (!group
->conf
->afc
[afi
][safi
])
3031 peer
->af_group
[afi
][safi
] = 1;
3032 peer
->afc
[afi
][safi
] = 1;
3033 if (!peer_af_find(peer
, afi
, safi
) &&
3034 peer_af_create(peer
, afi
, safi
) == NULL
)
3036 zlog_err("couldn't create af structure for peer %s", peer
->host
);
3038 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
3041 /* Mark as dynamic, but also as a "config node" for other things to work. */
3042 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
3043 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3049 peer_group_lookup_dynamic_neighbor_range (struct peer_group
* group
,
3050 struct prefix
* prefix
)
3052 struct listnode
*node
, *nnode
;
3053 struct prefix
*range
;
3056 afi
= family2afi(prefix
->family
);
3058 if (group
->listen_range
[afi
])
3059 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, range
))
3060 if (prefix_match(range
, prefix
))
3067 peer_group_lookup_dynamic_neighbor (struct bgp
*bgp
, struct prefix
*prefix
,
3068 struct prefix
**listen_range
)
3070 struct prefix
*range
= NULL
;
3071 struct peer_group
*group
= NULL
;
3072 struct listnode
*node
, *nnode
;
3074 *listen_range
= NULL
;
3077 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3078 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3081 else if (bm
->bgp
!= NULL
)
3083 struct listnode
*bgpnode
, *nbgpnode
;
3085 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3086 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3087 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3092 *listen_range
= range
;
3093 return (group
&& range
) ? group
: NULL
;
3097 peer_lookup_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
)
3099 struct peer_group
*group
;
3102 struct prefix
*prefix
;
3103 struct prefix
*listen_range
;
3105 char buf
[SU_ADDRSTRLEN
];
3106 char buf1
[SU_ADDRSTRLEN
];
3108 prefix
= sockunion2hostprefix(su
);
3113 /* See if incoming connection matches a configured listen range. */
3114 group
= peer_group_lookup_dynamic_neighbor (bgp
, prefix
, &listen_range
);
3125 prefix2str(prefix
, buf
, sizeof(buf
));
3126 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3128 if (bgp_debug_neighbor_events(NULL
))
3129 zlog_debug ("Dynamic Neighbor %s matches group %s listen range %s",
3130 buf
, group
->name
, buf1
);
3132 /* Are we within the listen limit? */
3133 dncount
= gbgp
->dynamic_neighbors_count
;
3135 if (dncount
>= gbgp
->dynamic_neighbors_limit
)
3137 if (bgp_debug_neighbor_events(NULL
))
3138 zlog_debug ("Dynamic Neighbor %s rejected - at limit %d",
3139 inet_sutop (su
, buf
), gbgp
->dynamic_neighbors_limit
);
3143 /* Ensure group is not disabled. */
3144 if (CHECK_FLAG (group
->conf
->flags
, PEER_FLAG_SHUTDOWN
))
3146 if (bgp_debug_neighbor_events(NULL
))
3147 zlog_debug ("Dynamic Neighbor %s rejected - group %s disabled",
3152 /* Check that at least one AF is activated for the group. */
3153 if (!peer_group_af_configured (group
))
3155 if (bgp_debug_neighbor_events(NULL
))
3156 zlog_debug ("Dynamic Neighbor %s rejected - no AF activated for group %s",
3161 /* Create dynamic peer and bind to associated group. */
3162 peer
= peer_create_bind_dynamic_neighbor (gbgp
, su
, group
);
3165 gbgp
->dynamic_neighbors_count
= ++dncount
;
3167 if (bgp_debug_neighbor_events(peer
))
3168 zlog_debug ("%s Dynamic Neighbor added, group %s count %d",
3169 peer
->host
, group
->name
, dncount
);
3174 void peer_drop_dynamic_neighbor (struct peer
*peer
)
3177 if (peer
->group
&& peer
->group
->bgp
)
3179 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3181 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3183 if (bgp_debug_neighbor_events(peer
))
3184 zlog_debug ("%s dropped from group %s, count %d",
3185 peer
->host
, peer
->group
->name
, dncount
);
3189 /* If peer is configured at least one address family return 1. */
3191 peer_active (struct peer
*peer
)
3193 if (BGP_PEER_SU_UNSPEC(peer
))
3195 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
3196 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3197 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
3198 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3199 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
3204 /* If peer is negotiated at least one address family return 1. */
3206 peer_active_nego (struct peer
*peer
)
3208 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3209 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3210 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3211 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3212 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
3217 /* peer_flag_change_type. */
3218 enum peer_change_type
3222 peer_change_reset_in
,
3223 peer_change_reset_out
,
3227 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
3228 enum peer_change_type type
)
3230 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3233 if (peer
->status
!= Established
)
3236 if (type
== peer_change_reset
)
3238 /* If we're resetting session, we've to delete both peer struct */
3239 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3240 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3241 PEER_FLAG_CONFIG_NODE
)))
3242 peer_delete(peer
->doppelganger
);
3244 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3245 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3247 else if (type
== peer_change_reset_in
)
3249 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3250 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3251 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3254 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3255 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3256 PEER_FLAG_CONFIG_NODE
)))
3257 peer_delete(peer
->doppelganger
);
3259 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3260 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3263 else if (type
== peer_change_reset_out
)
3265 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3266 bgp_announce_route (peer
, afi
, safi
);
3270 struct peer_flag_action
3275 /* This flag can be set for peer-group member. */
3276 u_char not_for_member
;
3278 /* Action when the flag is changed. */
3279 enum peer_change_type type
;
3281 /* Peer down cause */
3285 static const struct peer_flag_action peer_flag_action_list
[] =
3287 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3288 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3289 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3290 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3291 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3292 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3293 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3294 { PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3298 static const struct peer_flag_action peer_af_flag_action_list
[] =
3300 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3301 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3302 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3303 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3304 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3305 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3306 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3307 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3308 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3309 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3310 { PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3311 { PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
,1, peer_change_reset_out
},
3312 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3313 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3314 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3315 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3316 { PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3317 { PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3321 /* Proper action set. */
3323 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
3324 struct peer_flag_action
*action
, u_int32_t flag
)
3330 const struct peer_flag_action
*match
= NULL
;
3332 /* Check peer's frag action. */
3333 for (i
= 0; i
< size
; i
++)
3335 match
= &action_list
[i
];
3337 if (match
->flag
== 0)
3340 if (match
->flag
& flag
)
3344 if (match
->type
== peer_change_reset_in
)
3346 if (match
->type
== peer_change_reset_out
)
3348 if (match
->type
== peer_change_reset
)
3353 if (match
->not_for_member
)
3354 action
->not_for_member
= 1;
3358 /* Set peer clear type. */
3359 if (reset_in
&& reset_out
)
3360 action
->type
= peer_change_reset
;
3362 action
->type
= peer_change_reset_in
;
3364 action
->type
= peer_change_reset_out
;
3366 action
->type
= peer_change_none
;
3372 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
3374 if (flag
== PEER_FLAG_SHUTDOWN
)
3376 if (CHECK_FLAG (peer
->flags
, flag
))
3378 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3379 peer_nsf_stop (peer
);
3381 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3382 if (peer
->t_pmax_restart
)
3384 BGP_TIMER_OFF (peer
->t_pmax_restart
);
3385 if (bgp_debug_neighbor_events(peer
))
3386 zlog_debug ("%s Maximum-prefix restart timer canceled",
3390 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3391 peer_nsf_stop (peer
);
3393 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3394 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3395 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3397 bgp_session_reset(peer
);
3401 peer
->v_start
= BGP_INIT_START_TIMER
;
3402 BGP_EVENT_ADD (peer
, BGP_Stop
);
3405 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3407 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
3408 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3409 else if (flag
== PEER_FLAG_PASSIVE
)
3410 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
3411 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
3412 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
3414 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3415 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3418 bgp_session_reset(peer
);
3421 /* Change specified peer flag. */
3423 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
3427 struct peer_group
*group
;
3428 struct listnode
*node
, *nnode
;
3429 struct peer_flag_action action
;
3431 memset (&action
, 0, sizeof (struct peer_flag_action
));
3432 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
3434 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
3436 /* No flag action is found. */
3438 return BGP_ERR_INVALID_FLAG
;
3440 /* Not for peer-group member. */
3441 if (action
.not_for_member
&& peer_group_active (peer
))
3442 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3444 /* When unset the peer-group member's flag we have to check
3445 peer-group configuration. */
3446 if (! set
&& peer_group_active (peer
))
3447 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
3449 if (flag
== PEER_FLAG_SHUTDOWN
)
3450 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
3452 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3455 /* Flag conflict check. */
3457 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
3458 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
3459 return BGP_ERR_PEER_FLAG_CONFLICT
;
3461 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3463 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3465 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3470 SET_FLAG (peer
->flags
, flag
);
3472 UNSET_FLAG (peer
->flags
, flag
);
3474 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3476 if (action
.type
== peer_change_reset
)
3477 peer_flag_modify_action (peer
, flag
);
3482 /* peer-group member updates. */
3483 group
= peer
->group
;
3485 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3487 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3490 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3494 SET_FLAG (peer
->flags
, flag
);
3496 UNSET_FLAG (peer
->flags
, flag
);
3498 if (action
.type
== peer_change_reset
)
3499 peer_flag_modify_action (peer
, flag
);
3505 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
3507 return peer_flag_modify (peer
, flag
, 1);
3511 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
3513 return peer_flag_modify (peer
, flag
, 0);
3517 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
3519 if (peer
->af_group
[afi
][safi
])
3525 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
3530 struct listnode
*node
, *nnode
;
3531 struct peer_group
*group
;
3532 struct peer_flag_action action
;
3534 memset (&action
, 0, sizeof (struct peer_flag_action
));
3535 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
3537 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
3539 /* No flag action is found. */
3541 return BGP_ERR_INVALID_FLAG
;
3543 /* Adress family must be activated. */
3544 if (! peer
->afc
[afi
][safi
])
3545 return BGP_ERR_PEER_INACTIVE
;
3547 /* Not for peer-group member. */
3548 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
3549 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3551 /* Spcecial check for reflector client. */
3552 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
3553 && peer_sort (peer
) != BGP_PEER_IBGP
)
3554 return BGP_ERR_NOT_INTERNAL_PEER
;
3556 /* Spcecial check for remove-private-AS. */
3557 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
3558 && peer_sort (peer
) == BGP_PEER_IBGP
)
3559 return BGP_ERR_REMOVE_PRIVATE_AS
;
3561 /* as-override is not allowed for IBGP peers */
3562 if (flag
& PEER_FLAG_AS_OVERRIDE
3563 && peer_sort (peer
) == BGP_PEER_IBGP
)
3564 return BGP_ERR_AS_OVERRIDE
;
3566 /* When unset the peer-group member's flag we have to check
3567 peer-group configuration. */
3568 if (! set
&& peer
->af_group
[afi
][safi
])
3569 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
3570 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3572 /* When current flag configuration is same as requested one. */
3573 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3575 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3577 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3582 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3584 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3586 /* Execute action when peer is established. */
3587 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3588 && peer
->status
== Established
)
3590 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3591 bgp_clear_adj_in (peer
, afi
, safi
);
3594 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3595 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3596 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3597 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3598 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3599 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3600 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3601 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3603 peer_change_action (peer
, afi
, safi
, action
.type
);
3608 /* Peer group member updates. */
3609 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3611 group
= peer
->group
;
3613 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3615 if (! peer
->af_group
[afi
][safi
])
3618 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3621 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3625 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3627 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3629 if (peer
->status
== Established
)
3631 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3632 bgp_clear_adj_in (peer
, afi
, safi
);
3635 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3636 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3637 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3638 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3639 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3640 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3641 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3642 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3644 peer_change_action (peer
, afi
, safi
, action
.type
);
3653 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3655 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
3659 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3661 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
3664 /* EBGP multihop configuration. */
3666 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
3668 struct peer_group
*group
;
3669 struct listnode
*node
, *nnode
;
3672 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
3675 /* see comment in peer_ttl_security_hops_set() */
3678 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3680 group
= peer
->group
;
3681 if (group
->conf
->gtsm_hops
!= 0)
3682 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3684 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
3686 if (peer1
->sort
== BGP_PEER_IBGP
)
3689 if (peer1
->gtsm_hops
!= 0)
3690 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3695 if (peer
->gtsm_hops
!= 0)
3696 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3702 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3704 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3706 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3707 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3708 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3710 bgp_session_reset(peer
);
3715 group
= peer
->group
;
3716 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3718 if (peer
->sort
== BGP_PEER_IBGP
)
3721 peer
->ttl
= group
->conf
->ttl
;
3723 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3724 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3725 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3727 bgp_session_reset(peer
);
3734 peer_ebgp_multihop_unset (struct peer
*peer
)
3736 struct peer_group
*group
;
3737 struct listnode
*node
, *nnode
;
3739 if (peer
->sort
== BGP_PEER_IBGP
)
3742 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3743 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3745 if (peer_group_active (peer
))
3746 peer
->ttl
= peer
->group
->conf
->ttl
;
3750 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3752 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3753 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3754 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3756 bgp_session_reset(peer
);
3760 group
= peer
->group
;
3761 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3763 if (peer
->sort
== BGP_PEER_IBGP
)
3770 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3771 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3772 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3774 bgp_session_reset(peer
);
3781 /* Neighbor description. */
3783 peer_description_set (struct peer
*peer
, char *desc
)
3786 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3788 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3794 peer_description_unset (struct peer
*peer
)
3797 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3804 /* Neighbor update-source. */
3806 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3808 struct peer_group
*group
;
3809 struct listnode
*node
, *nnode
;
3811 if (peer
->update_if
)
3813 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3814 && strcmp (peer
->update_if
, ifname
) == 0)
3817 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3818 peer
->update_if
= NULL
;
3821 if (peer
->update_source
)
3823 sockunion_free (peer
->update_source
);
3824 peer
->update_source
= NULL
;
3827 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3829 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3831 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3833 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3834 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3835 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3838 bgp_session_reset(peer
);
3842 /* peer-group member updates. */
3843 group
= peer
->group
;
3844 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3846 if (peer
->update_if
)
3848 if (strcmp (peer
->update_if
, ifname
) == 0)
3851 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3852 peer
->update_if
= NULL
;
3855 if (peer
->update_source
)
3857 sockunion_free (peer
->update_source
);
3858 peer
->update_source
= NULL
;
3861 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3863 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3865 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3866 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3867 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3870 bgp_session_reset(peer
);
3876 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3878 struct peer_group
*group
;
3879 struct listnode
*node
, *nnode
;
3881 if (peer
->update_source
)
3883 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3884 && sockunion_cmp (peer
->update_source
, su
) == 0)
3886 sockunion_free (peer
->update_source
);
3887 peer
->update_source
= NULL
;
3890 if (peer
->update_if
)
3892 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3893 peer
->update_if
= NULL
;
3897 peer
->update_source
= sockunion_dup (su
);
3899 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3901 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3903 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3904 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3905 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3908 bgp_session_reset(peer
);
3912 /* peer-group member updates. */
3913 group
= peer
->group
;
3914 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3916 if (peer
->update_source
)
3918 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3920 sockunion_free (peer
->update_source
);
3921 peer
->update_source
= NULL
;
3924 if (peer
->update_if
)
3926 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3927 peer
->update_if
= NULL
;
3930 peer
->update_source
= sockunion_dup (su
);
3932 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3934 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3935 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3936 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3939 bgp_session_reset(peer
);
3945 peer_update_source_unset (struct peer
*peer
)
3947 union sockunion
*su
;
3948 struct peer_group
*group
;
3949 struct listnode
*node
, *nnode
;
3951 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3952 && ! peer
->update_source
3953 && ! peer
->update_if
)
3956 if (peer
->update_source
)
3958 sockunion_free (peer
->update_source
);
3959 peer
->update_source
= NULL
;
3961 if (peer
->update_if
)
3963 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3964 peer
->update_if
= NULL
;
3967 if (peer_group_active (peer
))
3969 group
= peer
->group
;
3971 if (group
->conf
->update_source
)
3973 su
= sockunion_dup (group
->conf
->update_source
);
3974 peer
->update_source
= su
;
3976 else if (group
->conf
->update_if
)
3978 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3981 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3983 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3985 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3986 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3987 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3990 bgp_session_reset(peer
);
3994 /* peer-group member updates. */
3995 group
= peer
->group
;
3996 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3998 if (! peer
->update_source
&& ! peer
->update_if
)
4001 if (peer
->update_source
)
4003 sockunion_free (peer
->update_source
);
4004 peer
->update_source
= NULL
;
4007 if (peer
->update_if
)
4009 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4010 peer
->update_if
= NULL
;
4013 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4015 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4016 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4017 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4020 bgp_session_reset(peer
);
4026 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4029 struct peer_group
*group
;
4030 struct listnode
*node
, *nnode
;
4032 /* Adress family must be activated. */
4033 if (! peer
->afc
[afi
][safi
])
4034 return BGP_ERR_PEER_INACTIVE
;
4036 /* Default originate can't be used for peer group memeber. */
4037 if (peer_is_group_member (peer
, afi
, safi
))
4038 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4040 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
4041 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
4042 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
4044 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4048 if (peer
->default_rmap
[afi
][safi
].name
)
4049 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4050 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4051 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4055 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4057 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4058 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4059 bgp_default_originate (peer
, afi
, safi
, 0);
4060 bgp_announce_route (peer
, afi
, safi
);
4065 /* peer-group member updates. */
4066 group
= peer
->group
;
4067 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4069 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4073 if (peer
->default_rmap
[afi
][safi
].name
)
4074 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4075 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4076 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4079 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4080 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4081 bgp_default_originate (peer
, afi
, safi
, 0);
4082 bgp_announce_route (peer
, afi
, safi
);
4089 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4091 struct peer_group
*group
;
4092 struct listnode
*node
, *nnode
;
4094 /* Adress family must be activated. */
4095 if (! peer
->afc
[afi
][safi
])
4096 return BGP_ERR_PEER_INACTIVE
;
4098 /* Default originate can't be used for peer group memeber. */
4099 if (peer_is_group_member (peer
, afi
, safi
))
4100 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4102 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
4104 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4106 if (peer
->default_rmap
[afi
][safi
].name
)
4107 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4108 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4109 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4112 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4114 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4115 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4116 bgp_default_originate (peer
, afi
, safi
, 1);
4117 bgp_announce_route (peer
, afi
, safi
);
4122 /* peer-group member updates. */
4123 group
= peer
->group
;
4124 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4126 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4128 if (peer
->default_rmap
[afi
][safi
].name
)
4129 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4130 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4131 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4133 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4134 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4135 bgp_default_originate (peer
, afi
, safi
, 1);
4136 bgp_announce_route (peer
, afi
, safi
);
4143 peer_port_set (struct peer
*peer
, u_int16_t port
)
4150 peer_port_unset (struct peer
*peer
)
4152 peer
->port
= BGP_PORT_DEFAULT
;
4156 /* neighbor weight. */
4158 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
4160 struct peer_group
*group
;
4161 struct listnode
*node
, *nnode
;
4163 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4164 peer
->weight
= weight
;
4166 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4169 /* peer-group member updates. */
4170 group
= peer
->group
;
4171 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4173 peer
->weight
= group
->conf
->weight
;
4178 peer_weight_unset (struct peer
*peer
)
4180 struct peer_group
*group
;
4181 struct listnode
*node
, *nnode
;
4183 /* Set default weight. */
4184 if (peer_group_active (peer
))
4185 peer
->weight
= peer
->group
->conf
->weight
;
4189 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4191 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4194 /* peer-group member updates. */
4195 group
= peer
->group
;
4196 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4204 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
4206 struct peer_group
*group
;
4207 struct listnode
*node
, *nnode
;
4209 /* Not for peer group memeber. */
4210 if (peer_group_active (peer
))
4211 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4213 /* keepalive value check. */
4214 if (keepalive
> 65535)
4215 return BGP_ERR_INVALID_VALUE
;
4217 /* Holdtime value check. */
4218 if (holdtime
> 65535)
4219 return BGP_ERR_INVALID_VALUE
;
4221 /* Holdtime value must be either 0 or greater than 3. */
4222 if (holdtime
< 3 && holdtime
!= 0)
4223 return BGP_ERR_INVALID_VALUE
;
4225 /* Set value to the configuration. */
4226 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4227 peer
->holdtime
= holdtime
;
4228 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
4230 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4233 /* peer-group member updates. */
4234 group
= peer
->group
;
4235 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4237 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4238 peer
->holdtime
= group
->conf
->holdtime
;
4239 peer
->keepalive
= group
->conf
->keepalive
;
4245 peer_timers_unset (struct peer
*peer
)
4247 struct peer_group
*group
;
4248 struct listnode
*node
, *nnode
;
4250 if (peer_group_active (peer
))
4251 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4253 /* Clear configuration. */
4254 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4255 peer
->keepalive
= 0;
4258 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4261 /* peer-group member updates. */
4262 group
= peer
->group
;
4263 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4265 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4267 peer
->keepalive
= 0;
4274 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
4276 struct peer_group
*group
;
4277 struct listnode
*node
, *nnode
;
4279 if (peer_group_active (peer
))
4280 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4282 if (connect
> 65535)
4283 return BGP_ERR_INVALID_VALUE
;
4285 /* Set value to the configuration. */
4286 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4287 peer
->connect
= connect
;
4289 /* Set value to timer setting. */
4290 peer
->v_connect
= connect
;
4292 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4295 /* peer-group member updates. */
4296 group
= peer
->group
;
4297 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4299 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4300 peer
->connect
= connect
;
4301 peer
->v_connect
= connect
;
4307 peer_timers_connect_unset (struct peer
*peer
)
4309 struct peer_group
*group
;
4310 struct listnode
*node
, *nnode
;
4312 if (peer_group_active (peer
))
4313 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4315 /* Clear configuration. */
4316 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4319 /* Set timer setting to default value. */
4320 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4322 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4325 /* peer-group member updates. */
4326 group
= peer
->group
;
4327 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4329 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4331 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4337 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
4339 struct peer_group
*group
;
4340 struct listnode
*node
, *nnode
;
4342 if (peer_group_active (peer
))
4343 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4346 return BGP_ERR_INVALID_VALUE
;
4348 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4349 peer
->routeadv
= routeadv
;
4350 peer
->v_routeadv
= routeadv
;
4352 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4353 update_group_adjust_peer_afs (peer
);
4354 if (peer
->status
== Established
)
4355 bgp_announce_route_all (peer
);
4359 /* peer-group member updates. */
4360 group
= peer
->group
;
4361 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4363 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4364 peer
->routeadv
= routeadv
;
4365 peer
->v_routeadv
= routeadv
;
4366 update_group_adjust_peer_afs (peer
);
4367 if (peer
->status
== Established
)
4368 bgp_announce_route_all (peer
);
4375 peer_advertise_interval_unset (struct peer
*peer
)
4377 struct peer_group
*group
;
4378 struct listnode
*node
, *nnode
;
4380 if (peer_group_active (peer
))
4381 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4383 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4386 if (peer
->sort
== BGP_PEER_IBGP
)
4387 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4389 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4391 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4392 update_group_adjust_peer_afs (peer
);
4393 if (peer
->status
== Established
)
4394 bgp_announce_route_all (peer
);
4398 /* peer-group member updates. */
4399 group
= peer
->group
;
4400 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4402 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4405 if (peer
->sort
== BGP_PEER_IBGP
)
4406 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4408 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4410 update_group_adjust_peer_afs (peer
);
4411 if (peer
->status
== Established
)
4412 bgp_announce_route_all (peer
);
4418 /* neighbor interface */
4420 peer_interface_set (struct peer
*peer
, const char *str
)
4423 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
4424 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
4428 peer_interface_unset (struct peer
*peer
)
4431 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
4432 peer
->ifname
= NULL
;
4437 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
4439 struct peer_group
*group
;
4440 struct listnode
*node
, *nnode
;
4442 if (allow_num
< 1 || allow_num
> 10)
4443 return BGP_ERR_INVALID_VALUE
;
4445 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4447 peer
->allowas_in
[afi
][safi
] = allow_num
;
4448 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4449 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4452 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4455 group
= peer
->group
;
4456 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4458 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4460 peer
->allowas_in
[afi
][safi
] = allow_num
;
4461 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4462 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4470 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4472 struct peer_group
*group
;
4473 struct listnode
*node
, *nnode
;
4475 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4477 peer
->allowas_in
[afi
][safi
] = 0;
4478 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4481 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4484 group
= peer
->group
;
4485 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4487 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4489 peer
->allowas_in
[afi
][safi
] = 0;
4490 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4497 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
4499 struct bgp
*bgp
= peer
->bgp
;
4500 struct peer_group
*group
;
4501 struct listnode
*node
, *nnode
;
4503 if (peer_sort (peer
) != BGP_PEER_EBGP
4504 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
4505 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
4508 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
4510 if (peer_group_active (peer
))
4511 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4514 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
4516 if (peer
->change_local_as
== as
&&
4517 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
4518 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
4519 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
4520 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
4523 peer
->change_local_as
= as
;
4525 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4527 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4530 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4532 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4534 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4536 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4538 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4539 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4540 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4543 bgp_session_reset(peer
);
4547 group
= peer
->group
;
4548 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4550 peer
->change_local_as
= as
;
4552 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4554 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4557 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4559 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4561 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4563 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4564 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4565 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4568 BGP_EVENT_ADD (peer
, BGP_Stop
);
4575 peer_local_as_unset (struct peer
*peer
)
4577 struct peer_group
*group
;
4578 struct listnode
*node
, *nnode
;
4580 if (peer_group_active (peer
))
4581 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4583 if (! peer
->change_local_as
)
4586 peer
->change_local_as
= 0;
4587 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4588 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4590 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4592 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4594 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4595 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4596 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4599 BGP_EVENT_ADD (peer
, BGP_Stop
);
4604 group
= peer
->group
;
4605 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4607 peer
->change_local_as
= 0;
4608 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4609 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4611 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4613 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4614 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4615 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4618 bgp_session_reset(peer
);
4623 /* Set password for authenticating with the peer. */
4625 peer_password_set (struct peer
*peer
, const char *password
)
4627 struct listnode
*nn
, *nnode
;
4628 int len
= password
? strlen(password
) : 0;
4629 int ret
= BGP_SUCCESS
;
4631 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
4632 return BGP_ERR_INVALID_VALUE
;
4634 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
4635 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4639 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4641 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
4643 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4645 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4646 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4648 bgp_session_reset(peer
);
4650 if (BGP_PEER_SU_UNSPEC(peer
))
4653 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
4656 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4658 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
4662 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4664 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
4666 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4667 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4669 bgp_session_reset(peer
);
4671 if (! BGP_PEER_SU_UNSPEC(peer
))
4673 if (bgp_md5_set (peer
) < 0)
4674 ret
= BGP_ERR_TCPSIG_FAILED
;
4682 peer_password_unset (struct peer
*peer
)
4684 struct listnode
*nn
, *nnode
;
4687 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4690 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4692 if (peer_group_active (peer
)
4693 && peer
->group
->conf
->password
4694 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
4695 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
4697 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4698 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4700 bgp_session_reset(peer
);
4703 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4705 peer
->password
= NULL
;
4707 if (! BGP_PEER_SU_UNSPEC(peer
))
4708 bgp_md5_unset (peer
);
4713 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4714 peer
->password
= NULL
;
4716 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4718 if (!peer
->password
)
4721 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4722 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4724 bgp_session_reset(peer
);
4726 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4727 peer
->password
= NULL
;
4729 if (! BGP_PEER_SU_UNSPEC(peer
))
4730 bgp_md5_unset (peer
);
4737 * Helper function that is called after the name of the policy
4738 * being used by a peer has changed (AF specific). Automatically
4739 * initiates inbound or outbound processing as needed.
4742 peer_on_policy_change (struct peer
*peer
, afi_t afi
, safi_t safi
, int outbound
)
4746 update_group_adjust_peer (peer_af_find (peer
, afi
, safi
));
4747 if (peer
->status
== Established
)
4748 bgp_announce_route(peer
, afi
, safi
);
4752 if (peer
->status
!= Established
)
4755 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4756 bgp_soft_reconfig_in (peer
, afi
, safi
);
4757 else if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4758 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4759 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4764 /* Set distribute list to the peer. */
4766 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4769 struct bgp_filter
*filter
;
4770 struct peer_group
*group
;
4771 struct listnode
*node
, *nnode
;
4773 if (! peer
->afc
[afi
][safi
])
4774 return BGP_ERR_PEER_INACTIVE
;
4776 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4777 return BGP_ERR_INVALID_VALUE
;
4779 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4780 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4782 filter
= &peer
->filter
[afi
][safi
];
4784 if (filter
->plist
[direct
].name
)
4785 return BGP_ERR_PEER_FILTER_CONFLICT
;
4787 if (filter
->dlist
[direct
].name
)
4788 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4789 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4790 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4792 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4794 peer_on_policy_change(peer
, afi
, safi
,
4795 (direct
== FILTER_OUT
) ? 1 : 0);
4799 group
= peer
->group
;
4800 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4802 filter
= &peer
->filter
[afi
][safi
];
4804 if (! peer
->af_group
[afi
][safi
])
4807 if (filter
->dlist
[direct
].name
)
4808 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4809 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4810 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4811 peer_on_policy_change(peer
, afi
, safi
,
4812 (direct
== FILTER_OUT
) ? 1 : 0);
4819 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4821 struct bgp_filter
*filter
;
4822 struct bgp_filter
*gfilter
;
4823 struct peer_group
*group
;
4824 struct listnode
*node
, *nnode
;
4826 if (! peer
->afc
[afi
][safi
])
4827 return BGP_ERR_PEER_INACTIVE
;
4829 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4830 return BGP_ERR_INVALID_VALUE
;
4832 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4833 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4835 filter
= &peer
->filter
[afi
][safi
];
4837 /* apply peer-group filter */
4838 if (peer
->af_group
[afi
][safi
])
4840 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4842 if (gfilter
->dlist
[direct
].name
)
4844 if (filter
->dlist
[direct
].name
)
4845 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4846 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[direct
].name
);
4847 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4848 peer_on_policy_change(peer
, afi
, safi
,
4849 (direct
== FILTER_OUT
) ? 1 : 0);
4854 if (filter
->dlist
[direct
].name
)
4855 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4856 filter
->dlist
[direct
].name
= NULL
;
4857 filter
->dlist
[direct
].alist
= NULL
;
4859 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4861 peer_on_policy_change(peer
, afi
, safi
,
4862 (direct
== FILTER_OUT
) ? 1 : 0);
4866 group
= peer
->group
;
4867 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4869 filter
= &peer
->filter
[afi
][safi
];
4871 if (! peer
->af_group
[afi
][safi
])
4874 if (filter
->dlist
[direct
].name
)
4875 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4876 filter
->dlist
[direct
].name
= NULL
;
4877 filter
->dlist
[direct
].alist
= NULL
;
4878 peer_on_policy_change(peer
, afi
, safi
,
4879 (direct
== FILTER_OUT
) ? 1 : 0);
4885 /* Update distribute list. */
4887 peer_distribute_update (struct access_list
*access
)
4892 struct listnode
*mnode
, *mnnode
;
4893 struct listnode
*node
, *nnode
;
4896 struct peer_group
*group
;
4897 struct bgp_filter
*filter
;
4899 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4902 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, access
->name
,
4904 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4906 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4907 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4909 filter
= &peer
->filter
[afi
][safi
];
4911 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4913 if (filter
->dlist
[direct
].name
)
4914 filter
->dlist
[direct
].alist
=
4915 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4917 filter
->dlist
[direct
].alist
= NULL
;
4921 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4923 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4924 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4926 filter
= &group
->conf
->filter
[afi
][safi
];
4928 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4930 if (filter
->dlist
[direct
].name
)
4931 filter
->dlist
[direct
].alist
=
4932 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4934 filter
->dlist
[direct
].alist
= NULL
;
4941 /* Set prefix list to the peer. */
4943 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4946 struct bgp_filter
*filter
;
4947 struct peer_group
*group
;
4948 struct listnode
*node
, *nnode
;
4950 if (! peer
->afc
[afi
][safi
])
4951 return BGP_ERR_PEER_INACTIVE
;
4953 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4954 return BGP_ERR_INVALID_VALUE
;
4956 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4957 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4959 filter
= &peer
->filter
[afi
][safi
];
4961 if (filter
->dlist
[direct
].name
)
4962 return BGP_ERR_PEER_FILTER_CONFLICT
;
4964 if (filter
->plist
[direct
].name
)
4965 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4966 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4967 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4969 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4971 peer_on_policy_change(peer
, afi
, safi
,
4972 (direct
== FILTER_OUT
) ? 1 : 0);
4976 group
= peer
->group
;
4977 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4979 filter
= &peer
->filter
[afi
][safi
];
4981 if (! peer
->af_group
[afi
][safi
])
4984 if (filter
->plist
[direct
].name
)
4985 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4986 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4987 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4988 peer_on_policy_change(peer
, afi
, safi
,
4989 (direct
== FILTER_OUT
) ? 1 : 0);
4995 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4997 struct bgp_filter
*filter
;
4998 struct bgp_filter
*gfilter
;
4999 struct peer_group
*group
;
5000 struct listnode
*node
, *nnode
;
5002 if (! peer
->afc
[afi
][safi
])
5003 return BGP_ERR_PEER_INACTIVE
;
5005 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5006 return BGP_ERR_INVALID_VALUE
;
5008 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5009 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5011 filter
= &peer
->filter
[afi
][safi
];
5013 /* apply peer-group filter */
5014 if (peer
->af_group
[afi
][safi
])
5016 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5018 if (gfilter
->plist
[direct
].name
)
5020 if (filter
->plist
[direct
].name
)
5021 XSTRDUP(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5022 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[direct
].name
);
5023 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
5024 peer_on_policy_change(peer
, afi
, safi
,
5025 (direct
== FILTER_OUT
) ? 1 : 0);
5030 if (filter
->plist
[direct
].name
)
5031 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5032 filter
->plist
[direct
].name
= NULL
;
5033 filter
->plist
[direct
].plist
= NULL
;
5035 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5037 peer_on_policy_change(peer
, afi
, safi
,
5038 (direct
== FILTER_OUT
) ? 1 : 0);
5042 group
= peer
->group
;
5043 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5045 filter
= &peer
->filter
[afi
][safi
];
5047 if (! peer
->af_group
[afi
][safi
])
5050 if (filter
->plist
[direct
].name
)
5051 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5052 filter
->plist
[direct
].name
= NULL
;
5053 filter
->plist
[direct
].plist
= NULL
;
5054 peer_on_policy_change(peer
, afi
, safi
,
5055 (direct
== FILTER_OUT
) ? 1 : 0);
5061 /* Update prefix-list list. */
5063 peer_prefix_list_update (struct prefix_list
*plist
)
5065 struct listnode
*mnode
, *mnnode
;
5066 struct listnode
*node
, *nnode
;
5069 struct peer_group
*group
;
5070 struct bgp_filter
*filter
;
5075 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5079 * Update the prefix-list on update groups.
5081 update_group_policy_update(bgp
, BGP_POLICY_PREFIX_LIST
,
5082 plist
? plist
->name
: NULL
, 0, 0);
5084 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5086 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5087 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5089 filter
= &peer
->filter
[afi
][safi
];
5091 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5093 if (filter
->plist
[direct
].name
)
5094 filter
->plist
[direct
].plist
=
5095 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5097 filter
->plist
[direct
].plist
= NULL
;
5101 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5103 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5104 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5106 filter
= &group
->conf
->filter
[afi
][safi
];
5108 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5110 if (filter
->plist
[direct
].name
)
5111 filter
->plist
[direct
].plist
=
5112 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5114 filter
->plist
[direct
].plist
= NULL
;
5122 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5125 struct bgp_filter
*filter
;
5126 struct peer_group
*group
;
5127 struct listnode
*node
, *nnode
;
5129 if (! peer
->afc
[afi
][safi
])
5130 return BGP_ERR_PEER_INACTIVE
;
5132 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5133 return BGP_ERR_INVALID_VALUE
;
5135 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5136 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5138 filter
= &peer
->filter
[afi
][safi
];
5140 if (filter
->aslist
[direct
].name
)
5141 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5142 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5143 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5145 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5147 peer_on_policy_change(peer
, afi
, safi
,
5148 (direct
== FILTER_OUT
) ? 1 : 0);
5152 group
= peer
->group
;
5153 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5155 filter
= &peer
->filter
[afi
][safi
];
5157 if (! peer
->af_group
[afi
][safi
])
5160 if (filter
->aslist
[direct
].name
)
5161 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5162 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5163 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5164 peer_on_policy_change(peer
, afi
, safi
,
5165 (direct
== FILTER_OUT
) ? 1 : 0);
5171 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
5173 struct bgp_filter
*filter
;
5174 struct bgp_filter
*gfilter
;
5175 struct peer_group
*group
;
5176 struct listnode
*node
, *nnode
;
5178 if (! peer
->afc
[afi
][safi
])
5179 return BGP_ERR_PEER_INACTIVE
;
5181 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5182 return BGP_ERR_INVALID_VALUE
;
5184 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5185 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5187 filter
= &peer
->filter
[afi
][safi
];
5189 /* apply peer-group filter */
5190 if (peer
->af_group
[afi
][safi
])
5192 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5194 if (gfilter
->aslist
[direct
].name
)
5196 if (filter
->aslist
[direct
].name
)
5197 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5198 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[direct
].name
);
5199 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
5200 peer_on_policy_change(peer
, afi
, safi
,
5201 (direct
== FILTER_OUT
) ? 1 : 0);
5206 if (filter
->aslist
[direct
].name
)
5207 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5208 filter
->aslist
[direct
].name
= NULL
;
5209 filter
->aslist
[direct
].aslist
= NULL
;
5211 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5213 peer_on_policy_change(peer
, afi
, safi
,
5214 (direct
== FILTER_OUT
) ? 1 : 0);
5218 group
= peer
->group
;
5219 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5221 filter
= &peer
->filter
[afi
][safi
];
5223 if (! peer
->af_group
[afi
][safi
])
5226 if (filter
->aslist
[direct
].name
)
5227 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5228 filter
->aslist
[direct
].name
= NULL
;
5229 filter
->aslist
[direct
].aslist
= NULL
;
5230 peer_on_policy_change(peer
, afi
, safi
,
5231 (direct
== FILTER_OUT
) ? 1 : 0);
5238 peer_aslist_update (const char *aslist_name
)
5243 struct listnode
*mnode
, *mnnode
;
5244 struct listnode
*node
, *nnode
;
5247 struct peer_group
*group
;
5248 struct bgp_filter
*filter
;
5250 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5252 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, aslist_name
,
5255 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5257 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5258 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5260 filter
= &peer
->filter
[afi
][safi
];
5262 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5264 if (filter
->aslist
[direct
].name
)
5265 filter
->aslist
[direct
].aslist
=
5266 as_list_lookup (filter
->aslist
[direct
].name
);
5268 filter
->aslist
[direct
].aslist
= NULL
;
5272 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5274 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5275 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5277 filter
= &group
->conf
->filter
[afi
][safi
];
5279 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5281 if (filter
->aslist
[direct
].name
)
5282 filter
->aslist
[direct
].aslist
=
5283 as_list_lookup (filter
->aslist
[direct
].name
);
5285 filter
->aslist
[direct
].aslist
= NULL
;
5293 peer_aslist_add (char *aslist_name
)
5295 peer_aslist_update (aslist_name
);
5296 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
5300 peer_aslist_del (const char *aslist_name
)
5302 peer_aslist_update (aslist_name
);
5303 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
5308 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5311 struct bgp_filter
*filter
;
5312 struct peer_group
*group
;
5313 struct listnode
*node
, *nnode
;
5315 if (! peer
->afc
[afi
][safi
])
5316 return BGP_ERR_PEER_INACTIVE
;
5318 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5319 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5320 return BGP_ERR_INVALID_VALUE
;
5322 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5323 && peer_is_group_member (peer
, afi
, safi
))
5324 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5326 filter
= &peer
->filter
[afi
][safi
];
5328 if (filter
->map
[direct
].name
)
5329 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5331 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5332 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5334 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5336 peer_on_policy_change(peer
, afi
, safi
,
5337 (direct
== RMAP_OUT
) ? 1 : 0);
5341 group
= peer
->group
;
5342 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5344 filter
= &peer
->filter
[afi
][safi
];
5346 if (! peer
->af_group
[afi
][safi
])
5349 if (filter
->map
[direct
].name
)
5350 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5351 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5352 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5353 peer_on_policy_change(peer
, afi
, safi
,
5354 (direct
== RMAP_OUT
) ? 1 : 0);
5359 /* Unset route-map from the peer. */
5361 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5363 struct bgp_filter
*filter
;
5364 struct bgp_filter
*gfilter
;
5365 struct peer_group
*group
;
5366 struct listnode
*node
, *nnode
;
5368 if (! peer
->afc
[afi
][safi
])
5369 return BGP_ERR_PEER_INACTIVE
;
5371 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5372 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5373 return BGP_ERR_INVALID_VALUE
;
5375 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5376 && peer_is_group_member (peer
, afi
, safi
))
5377 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5379 filter
= &peer
->filter
[afi
][safi
];
5381 /* apply peer-group filter */
5382 if (peer
->af_group
[afi
][safi
])
5384 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5386 if (gfilter
->map
[direct
].name
)
5388 if (filter
->map
[direct
].name
)
5389 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5390 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[direct
].name
);
5391 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
5392 peer_on_policy_change(peer
, afi
, safi
,
5393 (direct
== RMAP_OUT
) ? 1 : 0);
5398 if (filter
->map
[direct
].name
)
5399 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5400 filter
->map
[direct
].name
= NULL
;
5401 filter
->map
[direct
].map
= NULL
;
5403 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5405 peer_on_policy_change(peer
, afi
, safi
,
5406 (direct
== RMAP_OUT
) ? 1 : 0);
5410 group
= peer
->group
;
5411 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5413 filter
= &peer
->filter
[afi
][safi
];
5415 if (! peer
->af_group
[afi
][safi
])
5418 if (filter
->map
[direct
].name
)
5419 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5420 filter
->map
[direct
].name
= NULL
;
5421 filter
->map
[direct
].map
= NULL
;
5422 peer_on_policy_change(peer
, afi
, safi
,
5423 (direct
== RMAP_OUT
) ? 1 : 0);
5428 /* Set unsuppress-map to the peer. */
5430 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5433 struct bgp_filter
*filter
;
5434 struct peer_group
*group
;
5435 struct listnode
*node
, *nnode
;
5437 if (! peer
->afc
[afi
][safi
])
5438 return BGP_ERR_PEER_INACTIVE
;
5440 if (peer_is_group_member (peer
, afi
, safi
))
5441 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5443 filter
= &peer
->filter
[afi
][safi
];
5445 if (filter
->usmap
.name
)
5446 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5448 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5449 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5451 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5453 peer_on_policy_change(peer
, afi
, safi
, 1);
5457 group
= peer
->group
;
5458 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5460 filter
= &peer
->filter
[afi
][safi
];
5462 if (! peer
->af_group
[afi
][safi
])
5465 if (filter
->usmap
.name
)
5466 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5467 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5468 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5469 peer_on_policy_change(peer
, afi
, safi
, 1);
5474 /* Unset route-map from the peer. */
5476 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5478 struct bgp_filter
*filter
;
5479 struct peer_group
*group
;
5480 struct listnode
*node
, *nnode
;
5482 if (! peer
->afc
[afi
][safi
])
5483 return BGP_ERR_PEER_INACTIVE
;
5485 if (peer_is_group_member (peer
, afi
, safi
))
5486 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5488 filter
= &peer
->filter
[afi
][safi
];
5490 if (filter
->usmap
.name
)
5491 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5492 filter
->usmap
.name
= NULL
;
5493 filter
->usmap
.map
= NULL
;
5495 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5497 peer_on_policy_change(peer
, afi
, safi
, 1);
5501 group
= peer
->group
;
5502 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5504 filter
= &peer
->filter
[afi
][safi
];
5506 if (! peer
->af_group
[afi
][safi
])
5509 if (filter
->usmap
.name
)
5510 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5511 filter
->usmap
.name
= NULL
;
5512 filter
->usmap
.map
= NULL
;
5513 peer_on_policy_change(peer
, afi
, safi
, 1);
5519 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5520 u_int32_t max
, u_char threshold
,
5521 int warning
, u_int16_t restart
)
5523 struct peer_group
*group
;
5524 struct listnode
*node
, *nnode
;
5526 if (! peer
->afc
[afi
][safi
])
5527 return BGP_ERR_PEER_INACTIVE
;
5529 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5530 peer
->pmax
[afi
][safi
] = max
;
5531 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5532 peer
->pmax_restart
[afi
][safi
] = restart
;
5534 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5536 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5538 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5540 group
= peer
->group
;
5541 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5543 if (! peer
->af_group
[afi
][safi
])
5546 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5547 peer
->pmax
[afi
][safi
] = max
;
5548 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5549 peer
->pmax_restart
[afi
][safi
] = restart
;
5551 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5553 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5555 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5556 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5561 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5562 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5569 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5571 struct peer_group
*group
;
5572 struct listnode
*node
, *nnode
;
5574 if (! peer
->afc
[afi
][safi
])
5575 return BGP_ERR_PEER_INACTIVE
;
5577 /* apply peer-group config */
5578 if (peer
->af_group
[afi
][safi
])
5580 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5581 PEER_FLAG_MAX_PREFIX
))
5582 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5584 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5586 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5587 PEER_FLAG_MAX_PREFIX_WARNING
))
5588 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5590 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5592 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
5593 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
5594 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
5598 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5599 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5600 peer
->pmax
[afi
][safi
] = 0;
5601 peer
->pmax_threshold
[afi
][safi
] = 0;
5602 peer
->pmax_restart
[afi
][safi
] = 0;
5604 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5607 group
= peer
->group
;
5608 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5610 if (! peer
->af_group
[afi
][safi
])
5613 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5614 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5615 peer
->pmax
[afi
][safi
] = 0;
5616 peer
->pmax_threshold
[afi
][safi
] = 0;
5617 peer
->pmax_restart
[afi
][safi
] = 0;
5622 int is_ebgp_multihop_configured (struct peer
*peer
)
5624 struct peer_group
*group
;
5625 struct listnode
*node
, *nnode
;
5628 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5630 group
= peer
->group
;
5631 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5632 (group
->conf
->ttl
!= 1))
5635 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
5637 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
5644 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5651 /* Set # of hops between us and BGP peer. */
5653 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
5655 struct peer_group
*group
;
5656 struct listnode
*node
, *nnode
;
5659 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
5661 /* We cannot configure ttl-security hops when ebgp-multihop is already
5662 set. For non peer-groups, the check is simple. For peer-groups, it's
5663 slightly messy, because we need to check both the peer-group structure
5664 and all peer-group members for any trace of ebgp-multihop configuration
5665 before actually applying the ttl-security rules. Cisco really made a
5666 mess of this configuration parameter, and OpenBGPD got it right.
5669 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
))
5671 if (is_ebgp_multihop_configured (peer
))
5672 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
5674 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5676 peer
->gtsm_hops
= gtsm_hops
;
5678 /* Calling ebgp multihop also resets the session.
5679 * On restart, NHT will get setup correctly as will the
5680 * min & max ttls on the socket. The return value is
5683 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5690 group
= peer
->group
;
5691 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5693 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5695 /* Calling ebgp multihop also resets the session.
5696 * On restart, NHT will get setup correctly as will the
5697 * min & max ttls on the socket. The return value is
5700 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5706 /* Post the first gtsm setup or if its ibgp, maxttl setting isn't
5707 * necessary, just set the minttl.
5709 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5711 peer
->gtsm_hops
= gtsm_hops
;
5714 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5715 MAXTTL
+ 1 - gtsm_hops
);
5716 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5717 (peer
->doppelganger
->fd
>= 0))
5718 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5719 MAXTTL
+ 1 - gtsm_hops
);
5723 group
= peer
->group
;
5724 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5726 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5728 /* Change setting of existing peer
5729 * established then change value (may break connectivity)
5730 * not established yet (teardown session and restart)
5731 * no session then do nothing (will get handled by next connection)
5733 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
5734 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5735 MAXTTL
+ 1 - peer
->gtsm_hops
);
5736 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5737 (peer
->doppelganger
->fd
>= 0))
5738 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5739 MAXTTL
+ 1 - gtsm_hops
);
5749 peer_ttl_security_hops_unset (struct peer
*peer
)
5751 struct peer_group
*group
;
5752 struct listnode
*node
, *nnode
;
5755 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
5757 /* if a peer-group member, then reset to peer-group default rather than 0 */
5758 if (peer_group_active (peer
))
5759 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
5761 peer
->gtsm_hops
= 0;
5763 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5765 /* Invoking ebgp_multihop_set will set the TTL back to the original
5766 * value as well as restting the NHT and such. The session is reset.
5768 if (peer
->sort
== BGP_PEER_EBGP
)
5769 ret
= peer_ebgp_multihop_unset (peer
);
5773 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5775 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5776 (peer
->doppelganger
->fd
>= 0))
5777 sockopt_minttl (peer
->su
.sa
.sa_family
,
5778 peer
->doppelganger
->fd
, 0);
5783 group
= peer
->group
;
5784 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5786 peer
->gtsm_hops
= 0;
5787 if (peer
->sort
== BGP_PEER_EBGP
)
5788 ret
= peer_ebgp_multihop_unset (peer
);
5792 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5794 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5795 (peer
->doppelganger
->fd
>= 0))
5796 sockopt_minttl (peer
->su
.sa
.sa_family
,
5797 peer
->doppelganger
->fd
, 0);
5806 * If peer clear is invoked in a loop for all peers on the BGP instance,
5807 * it may end up freeing the doppelganger, and if this was the next node
5808 * to the current node, we would end up accessing the freed next node.
5809 * Pass along additional parameter which can be updated if next node
5810 * is freed; only required when walking the peer list on BGP instance.
5813 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
5815 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5817 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
5819 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
5820 if (peer
->t_pmax_restart
)
5822 BGP_TIMER_OFF (peer
->t_pmax_restart
);
5823 if (bgp_debug_neighbor_events(peer
))
5824 zlog_debug ("%s Maximum-prefix restart timer canceled",
5827 BGP_EVENT_ADD (peer
, BGP_Start
);
5831 peer
->v_start
= BGP_INIT_START_TIMER
;
5832 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5833 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5834 BGP_NOTIFY_CEASE_ADMIN_RESET
);
5836 bgp_session_reset_safe(peer
, nnode
);
5842 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
5843 enum bgp_clear_type stype
)
5845 struct peer_af
*paf
;
5847 if (peer
->status
!= Established
)
5850 if (! peer
->afc
[afi
][safi
])
5851 return BGP_ERR_AF_UNCONFIGURED
;
5853 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
5855 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
5857 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
5858 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
5861 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
5863 /* Clear the "neighbor x.x.x.x default-originate" flag */
5864 paf
= peer_af_find (peer
, afi
, safi
);
5865 if (paf
&& paf
->subgroup
&&
5866 CHECK_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
5867 UNSET_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5869 bgp_announce_route (peer
, afi
, safi
);
5872 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5874 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
5875 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
5876 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5878 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
5881 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
5882 prefix_type
= ORF_TYPE_PREFIX
;
5884 prefix_type
= ORF_TYPE_PREFIX_OLD
;
5886 if (filter
->plist
[FILTER_IN
].plist
)
5888 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5889 bgp_route_refresh_send (peer
, afi
, safi
,
5890 prefix_type
, REFRESH_DEFER
, 1);
5891 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
5892 REFRESH_IMMEDIATE
, 0);
5896 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5897 bgp_route_refresh_send (peer
, afi
, safi
,
5898 prefix_type
, REFRESH_IMMEDIATE
, 1);
5900 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5906 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
5907 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5909 /* If neighbor has soft reconfiguration inbound flag.
5910 Use Adj-RIB-In database. */
5911 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5912 bgp_soft_reconfig_in (peer
, afi
, safi
);
5915 /* If neighbor has route refresh capability, send route refresh
5916 message to the peer. */
5917 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5918 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5919 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5921 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5927 /* Display peer uptime.*/
5928 /* XXX: why does this function return char * when it takes buffer? */
5930 peer_uptime (time_t uptime2
, char *buf
, size_t len
, u_char use_json
, json_object
*json
)
5935 /* Check buffer length. */
5936 if (len
< BGP_UPTIME_LEN
)
5940 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5941 /* XXX: should return status instead of buf... */
5942 snprintf (buf
, len
, "<error> ");
5947 /* If there is no connection has been done before print `never'. */
5951 json_object_string_add(json
, "peerUptime", "never");
5953 snprintf (buf
, len
, "never");
5957 /* Get current time. */
5958 uptime1
= bgp_clock ();
5960 tm
= gmtime (&uptime1
);
5962 /* Making formatted timer strings. */
5963 #define ONE_DAY_SECOND 60*60*24
5964 #define ONE_WEEK_SECOND 60*60*24*7
5969 int day_msec
= 86400000;
5970 int hour_msec
= 3600000;
5971 int minute_msec
= 60000;
5972 int sec_msec
= 1000;
5974 if (uptime1
< ONE_DAY_SECOND
)
5976 time_store
= hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
5977 json_object_int_add(json
, "peerUptimeMsec", time_store
);
5978 snprintf (buf
, len
, "%02d:%02d:%02d",
5979 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5981 else if (uptime1
< ONE_WEEK_SECOND
)
5983 time_store
= day_msec
* tm
->tm_yday
+ hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
5984 json_object_int_add(json
, "peerUptimeMsec", time_store
);
5985 snprintf (buf
, len
, "%dd%02dh%02dm",
5986 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5990 time_store
= day_msec
* tm
->tm_yday
+ hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
5991 json_object_int_add(json
, "peerUptimeMsec", time_store
);
5992 snprintf (buf
, len
, "%02dw%dd%02dh",
5993 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5998 if (uptime1
< ONE_DAY_SECOND
)
5999 snprintf (buf
, len
, "%02d:%02d:%02d",
6000 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
6001 else if (uptime1
< ONE_WEEK_SECOND
)
6002 snprintf (buf
, len
, "%dd%02dh%02dm",
6003 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
6005 snprintf (buf
, len
, "%02dw%dd%02dh",
6006 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
6012 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
6013 afi_t afi
, safi_t safi
)
6015 struct bgp_filter
*filter
;
6016 struct bgp_filter
*gfilter
= NULL
;
6019 int out
= FILTER_OUT
;
6022 filter
= &peer
->filter
[afi
][safi
];
6023 if (peer
->af_group
[afi
][safi
])
6024 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
6026 /* distribute-list. */
6027 if (filter
->dlist
[in
].name
)
6028 if (! gfilter
|| ! gfilter
->dlist
[in
].name
6029 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
6030 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
6031 filter
->dlist
[in
].name
, VTY_NEWLINE
);
6032 if (filter
->dlist
[out
].name
&& ! gfilter
)
6033 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
6034 filter
->dlist
[out
].name
, VTY_NEWLINE
);
6037 if (filter
->plist
[in
].name
)
6038 if (! gfilter
|| ! gfilter
->plist
[in
].name
6039 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
6040 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
6041 filter
->plist
[in
].name
, VTY_NEWLINE
);
6042 if (filter
->plist
[out
].name
&& ! gfilter
)
6043 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
6044 filter
->plist
[out
].name
, VTY_NEWLINE
);
6047 if (filter
->map
[RMAP_IN
].name
)
6048 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
6049 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
6050 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
6051 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
6052 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
6053 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
6054 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
6055 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
6056 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
6057 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
6058 if (filter
->map
[RMAP_EXPORT
].name
)
6059 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
6060 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
6061 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
6062 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
6063 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
6065 /* unsuppress-map */
6066 if (filter
->usmap
.name
&& ! gfilter
)
6067 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
6068 filter
->usmap
.name
, VTY_NEWLINE
);
6071 if (filter
->aslist
[in
].name
)
6072 if (! gfilter
|| ! gfilter
->aslist
[in
].name
6073 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
6074 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
6075 filter
->aslist
[in
].name
, VTY_NEWLINE
);
6076 if (filter
->aslist
[out
].name
&& ! gfilter
)
6077 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
6078 filter
->aslist
[out
].name
, VTY_NEWLINE
);
6081 /* BGP peer configuration display function. */
6083 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
6084 struct peer
*peer
, afi_t afi
, safi_t safi
)
6086 struct peer
*g_peer
= NULL
;
6087 char buf
[SU_ADDRSTRLEN
];
6090 /* Skip dynamic neighbors. */
6091 if (peer_dynamic_neighbor (peer
))
6095 addr
= peer
->conf_if
;
6099 if (peer_group_active (peer
))
6100 g_peer
= peer
->group
->conf
;
6102 /************************************
6103 ****** Global to the neighbor ******
6104 ************************************/
6105 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6109 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
6110 vty_out (vty
, " neighbor %s interface v6only %s", addr
, VTY_NEWLINE
);
6112 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
6116 if (! peer_group_active (peer
))
6118 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
6119 vty_out (vty
, " neighbor %s peer-group%s", addr
,
6121 if (peer
->as_type
== AS_SPECIFIED
)
6123 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6126 else if (peer
->as_type
== AS_INTERNAL
)
6128 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6130 else if (peer
->as_type
== AS_EXTERNAL
)
6132 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6139 if (peer
->as_type
== AS_SPECIFIED
)
6141 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6144 else if (peer
->as_type
== AS_INTERNAL
)
6146 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6148 else if (peer
->as_type
== AS_EXTERNAL
)
6150 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6153 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6154 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6155 peer
->group
->name
, VTY_NEWLINE
);
6159 if (peer
->change_local_as
)
6160 if (! peer_group_active (peer
))
6161 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
6162 peer
->change_local_as
,
6163 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
6165 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
6166 " replace-as" : "", VTY_NEWLINE
);
6170 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
6174 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6175 if (! peer_group_active (peer
) ||
6176 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
6177 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
6181 if (! peer_group_active (peer
) || ! g_peer
->bfd_info
)
6183 bgp_bfd_peer_config_write(vty
, peer
, addr
);
6188 if (!peer_group_active (peer
)
6189 || ! g_peer
->password
6190 || strcmp (peer
->password
, g_peer
->password
) != 0)
6191 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
6195 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
))
6196 if (!peer_group_active (peer
))
6197 vty_out (vty
, " neighbor %s solo%s", addr
, VTY_NEWLINE
);
6200 if (peer
->port
!= BGP_PORT_DEFAULT
)
6201 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
6204 /* Local interface name. */
6206 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
6210 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
6211 if (! peer_group_active (peer
) ||
6212 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
6213 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
6215 /* EBGP multihop. */
6216 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
6217 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
6218 if (! peer_group_active (peer
) ||
6219 g_peer
->ttl
!= peer
->ttl
)
6220 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
6223 /* ttl-security hops */
6224 if (peer
->gtsm_hops
!= 0)
6225 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
6226 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
6227 peer
->gtsm_hops
, VTY_NEWLINE
);
6229 /* disable-connected-check. */
6230 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6231 if (! peer_group_active (peer
) ||
6232 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6233 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
6235 /* Update-source. */
6236 if (peer
->update_if
)
6237 if (! peer_group_active (peer
) || ! g_peer
->update_if
6238 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
6239 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6240 peer
->update_if
, VTY_NEWLINE
);
6241 if (peer
->update_source
)
6242 if (! peer_group_active (peer
) || ! g_peer
->update_source
6243 || sockunion_cmp (g_peer
->update_source
,
6244 peer
->update_source
) != 0)
6245 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6246 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
6249 /* advertisement-interval */
6250 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
6251 ! peer_group_active (peer
))
6252 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
6253 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
6256 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
6257 && ! peer_group_active (peer
))
6258 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
6259 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
6261 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
6262 ! peer_group_active (peer
))
6263 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
6264 peer
->connect
, VTY_NEWLINE
);
6266 /* Default weight. */
6267 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
6268 if (! peer_group_active (peer
) ||
6269 g_peer
->weight
!= peer
->weight
)
6270 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
6273 /* Dynamic capability. */
6274 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6275 if (! peer_group_active (peer
) ||
6276 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6277 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
6280 /* Extended next-hop capability. */
6281 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6282 if (! peer_group_active (peer
) ||
6283 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6284 vty_out (vty
, " neighbor %s capability extended-nexthop%s", addr
,
6287 /* dont capability negotiation. */
6288 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6289 if (! peer_group_active (peer
) ||
6290 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6291 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
6294 /* override capability negotiation. */
6295 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6296 if (! peer_group_active (peer
) ||
6297 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6298 vty_out (vty
, " neighbor %s override-capability%s", addr
,
6301 /* strict capability negotiation. */
6302 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6303 if (! peer_group_active (peer
) ||
6304 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6305 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
6308 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6310 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6312 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6313 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6317 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6318 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
6324 /************************************
6325 ****** Per AF to the neighbor ******
6326 ************************************/
6328 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
6330 if (peer
->af_group
[afi
][safi
])
6331 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6332 peer
->group
->name
, VTY_NEWLINE
);
6334 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6337 /* ORF capability. */
6338 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6339 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6340 if (! peer
->af_group
[afi
][safi
])
6342 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
6344 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6345 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6346 vty_out (vty
, " both");
6347 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
6348 vty_out (vty
, " send");
6350 vty_out (vty
, " receive");
6351 vty_out (vty
, "%s", VTY_NEWLINE
);
6354 /* Route reflector client. */
6355 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
6356 && ! peer
->af_group
[afi
][safi
])
6357 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
6361 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_FORCE_NEXTHOP_SELF
)
6362 && ! peer
->af_group
[afi
][safi
])
6363 vty_out (vty
, " neighbor %s next-hop-self force%s",
6365 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
6366 && ! peer
->af_group
[afi
][safi
])
6367 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
6369 /* remove-private-AS */
6370 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
) && !peer
->af_group
[afi
][safi
])
6372 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
) &&
6373 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6374 vty_out (vty
, " neighbor %s remove-private-AS all replace-AS%s", addr
, VTY_NEWLINE
);
6376 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6377 vty_out (vty
, " neighbor %s remove-private-AS replace-AS%s", addr
, VTY_NEWLINE
);
6379 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
6380 vty_out (vty
, " neighbor %s remove-private-AS all%s", addr
, VTY_NEWLINE
);
6383 vty_out (vty
, " neighbor %s remove-private-AS%s", addr
, VTY_NEWLINE
);
6387 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
) &&
6388 !peer
->af_group
[afi
][safi
])
6389 vty_out (vty
, " neighbor %s as-override%s", addr
, VTY_NEWLINE
);
6391 /* send-community print. */
6392 if (! peer
->af_group
[afi
][safi
])
6394 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6396 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6397 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6398 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
6399 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6400 vty_out (vty
, " neighbor %s send-community extended%s",
6402 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6403 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
6407 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6408 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6409 vty_out (vty
, " no neighbor %s send-community both%s",
6411 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6412 vty_out (vty
, " no neighbor %s send-community extended%s",
6414 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6415 vty_out (vty
, " no neighbor %s send-community%s",
6420 /* Default information */
6421 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
6422 && ! peer
->af_group
[afi
][safi
])
6424 vty_out (vty
, " neighbor %s default-originate", addr
);
6425 if (peer
->default_rmap
[afi
][safi
].name
)
6426 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
6427 vty_out (vty
, "%s", VTY_NEWLINE
);
6430 /* Soft reconfiguration inbound. */
6431 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6432 if (! peer
->af_group
[afi
][safi
] ||
6433 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6434 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
6437 /* maximum-prefix. */
6438 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
6439 if (! peer
->af_group
[afi
][safi
]
6440 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
6441 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
6442 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
6443 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6445 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
6446 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
6447 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
6448 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6449 vty_out (vty
, " warning-only");
6450 if (peer
->pmax_restart
[afi
][safi
])
6451 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
6452 vty_out (vty
, "%s", VTY_NEWLINE
);
6455 /* Route server client. */
6456 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
6457 && ! peer
->af_group
[afi
][safi
])
6458 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
6460 /* Nexthop-local unchanged. */
6461 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
6462 && ! peer
->af_group
[afi
][safi
])
6463 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
6466 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
6467 if (! peer_group_active (peer
)
6468 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
6469 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
6471 if (peer
->allowas_in
[afi
][safi
] == 3)
6472 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
6474 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
6475 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
6479 bgp_config_write_filter (vty
, peer
, afi
, safi
);
6481 /* atribute-unchanged. */
6482 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6483 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6484 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6485 && ! peer
->af_group
[afi
][safi
])
6487 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6488 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6489 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6490 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
6492 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
6493 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
6495 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
6497 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
6498 " med" : "", VTY_NEWLINE
);
6502 /* Display "address-family" configuration header. */
6504 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
6510 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6513 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
6517 if (safi
== SAFI_MULTICAST
)
6518 vty_out (vty
, "ipv4 multicast");
6519 else if (safi
== SAFI_MPLS_VPN
)
6520 vty_out (vty
, "vpnv4 unicast");
6522 else if (afi
== AFI_IP6
)
6524 vty_out (vty
, "ipv6");
6526 if (safi
== SAFI_MULTICAST
)
6527 vty_out (vty
, " multicast");
6530 vty_out (vty
, "%s", VTY_NEWLINE
);
6535 /* Address family based peer configuration display. */
6537 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
6542 struct peer_group
*group
;
6543 struct listnode
*node
, *nnode
;
6545 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
6547 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
6549 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6551 if (group
->conf
->afc
[afi
][safi
])
6553 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6554 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
6557 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6559 /* Skip dynamic neighbors. */
6560 if (peer_dynamic_neighbor (peer
))
6563 if (peer
->afc
[afi
][safi
])
6565 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6567 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6568 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
6573 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
6574 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
6577 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
6583 bgp_config_write (struct vty
*vty
)
6587 struct peer_group
*group
;
6589 struct listnode
*node
, *nnode
;
6590 struct listnode
*mnode
, *mnnode
;
6592 /* BGP Multiple instance. */
6593 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6595 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
6599 /* BGP Config type. */
6600 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6602 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
6606 /* BGP configuration. */
6607 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6610 vty_out (vty
, "!%s", VTY_NEWLINE
);
6612 /* Router bgp ASN */
6613 vty_out (vty
, "router bgp %u", bgp
->as
);
6615 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6618 vty_out (vty
, " view %s", bgp
->name
);
6620 vty_out (vty
, "%s", VTY_NEWLINE
);
6622 /* No Synchronization */
6623 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6624 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
6626 /* BGP fast-external-failover. */
6627 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
6628 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
6630 /* BGP router ID. */
6631 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
6632 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
6635 /* BGP log-neighbor-changes. */
6636 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
6637 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
6639 /* BGP configuration. */
6640 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
6641 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
6643 /* BGP default ipv4-unicast. */
6644 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6645 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
6647 /* BGP default local-preference. */
6648 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
6649 vty_out (vty
, " bgp default local-preference %d%s",
6650 bgp
->default_local_pref
, VTY_NEWLINE
);
6652 /* BGP default subgroup-pkt-queue-max. */
6653 if (bgp
->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
6654 vty_out (vty
, " bgp default subgroup-pkt-queue-max %d%s",
6655 bgp
->default_subgroup_pkt_queue_max
, VTY_NEWLINE
);
6657 /* BGP client-to-client reflection. */
6658 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
6659 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
6661 /* BGP cluster ID. */
6662 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
6663 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
6666 /* Disable ebgp connected nexthop check */
6667 if (bgp_flag_check (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
6668 vty_out (vty
, " bgp disable-ebgp-connected-route-check%s", VTY_NEWLINE
);
6670 /* Confederation identifier*/
6671 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
6672 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
6675 /* Confederation peer */
6676 if (bgp
->confed_peers_cnt
> 0)
6680 vty_out (vty
, " bgp confederation peers");
6682 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
6683 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
6685 vty_out (vty
, "%s", VTY_NEWLINE
);
6688 /* BGP enforce-first-as. */
6689 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
6690 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
6692 /* BGP deterministic-med. */
6693 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
6694 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
6696 /* BGP update-delay. */
6697 bgp_config_write_update_delay (vty
, bgp
);
6699 if (bgp
->v_maxmed_onstartup
!= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
)
6701 vty_out (vty
, " bgp max-med on-startup %d", bgp
->v_maxmed_onstartup
);
6702 if (bgp
->maxmed_onstartup_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6703 vty_out (vty
, " %d", bgp
->maxmed_onstartup_value
);
6704 vty_out (vty
, "%s", VTY_NEWLINE
);
6706 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
)
6708 vty_out (vty
, " bgp max-med administrative");
6709 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6710 vty_out (vty
, " %d", bgp
->maxmed_admin_value
);
6711 vty_out (vty
, "%s", VTY_NEWLINE
);
6715 bgp_config_write_wpkt_quanta (vty
, bgp
);
6718 bgp_config_write_coalesce_time(vty
, bgp
);
6720 /* BGP graceful-restart. */
6721 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
6722 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
6723 bgp
->stalepath_time
, VTY_NEWLINE
);
6724 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
6725 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
6727 /* BGP bestpath method. */
6728 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
6729 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
6730 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
6731 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
6733 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
6734 if (bgp_flag_check (bgp
, BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET
)) {
6735 vty_out (vty
, " bgp bestpath as-path multipath-relax no-as-set%s", VTY_NEWLINE
);
6737 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
6741 if (bgp_flag_check (bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
6742 vty_out (vty
, " bgp route-reflector allow-outbound-policy%s",
6745 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
6746 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
6747 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
6748 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6750 vty_out (vty
, " bgp bestpath med");
6751 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
6752 vty_out (vty
, " confed");
6753 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6754 vty_out (vty
, " missing-as-worst");
6755 vty_out (vty
, "%s", VTY_NEWLINE
);
6758 /* BGP network import check. */
6759 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH
))
6760 vty_out (vty
, " bgp network import-check exact%s", VTY_NEWLINE
);
6761 else if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
6762 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
6764 /* BGP flag dampening. */
6765 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
6766 BGP_CONFIG_DAMPENING
))
6767 bgp_config_write_damp (vty
);
6769 /* BGP static route configuration. */
6770 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6772 /* BGP redistribute configuration. */
6773 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6775 /* BGP timers configuration. */
6776 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
6777 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
6778 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
6779 bgp
->default_holdtime
, VTY_NEWLINE
);
6781 if (bgp
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
6782 vty_out (vty
, " bgp route-map delay-timer %d%s", bgp
->rmap_update_timer
,
6786 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6788 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
6791 /* Normal neighbor configuration. */
6792 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6794 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6795 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
6799 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6800 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6802 /* Distance configuration. */
6803 bgp_config_write_distance (vty
, bgp
);
6805 /* listen range and limit for dynamic BGP neighbors */
6806 bgp_config_write_listen (vty
, bgp
);
6808 /* No auto-summary */
6809 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6810 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
6812 /* IPv4 multicast configuration. */
6813 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
6815 /* IPv4 VPN configuration. */
6816 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
6818 /* IPv6 unicast configuration. */
6819 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
6821 /* IPv6 multicast configuration. */
6822 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
6830 bgp_master_init (void)
6832 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
6835 bm
->bgp
= list_new ();
6836 bm
->listen_sockets
= list_new ();
6837 bm
->port
= BGP_PORT_DEFAULT
;
6838 bm
->master
= thread_master_create ();
6839 bm
->start_time
= bgp_clock ();
6841 bgp_process_queue_init();
6849 /* allocates some vital data structures used by peer commands in vty_init */
6855 /* BGP VTY commands installation. */
6863 bgp_route_map_init ();
6864 bgp_address_init ();
6865 bgp_scan_vty_init();
6866 bgp_mplsvpn_init ();
6868 /* Access list initialize. */
6869 access_list_init ();
6870 access_list_add_hook (peer_distribute_update
);
6871 access_list_delete_hook (peer_distribute_update
);
6873 /* Filter list initialize. */
6875 as_list_add_hook (peer_aslist_add
);
6876 as_list_delete_hook (peer_aslist_del
);
6878 /* Prefix list initialize.*/
6879 prefix_list_init ();
6880 prefix_list_add_hook (peer_prefix_list_update
);
6881 prefix_list_delete_hook (peer_prefix_list_update
);
6883 /* Community list initialize. */
6884 bgp_clist
= community_list_init ();
6888 #endif /* HAVE_SNMP */
6895 bgp_terminate (void)
6899 struct listnode
*node
, *nnode
;
6900 struct listnode
*mnode
, *mnnode
;
6902 /* Close the listener sockets first as this prevents peers from attempting
6903 * to reconnect on receiving the peer unconfig message. In the presence
6904 * of a large number of peers this will ensure that no peer is left with
6905 * a dangling connection
6907 /* reverse bgp_master_init */
6909 if (bm
->listen_sockets
)
6910 list_free(bm
->listen_sockets
);
6911 bm
->listen_sockets
= NULL
;
6913 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6914 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6915 if (peer
->status
== Established
||
6916 peer
->status
== OpenSent
||
6917 peer
->status
== OpenConfirm
)
6918 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
6919 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
6921 bgp_cleanup_routes ();
6923 if (bm
->process_main_queue
)
6925 work_queue_free (bm
->process_main_queue
);
6926 bm
->process_main_queue
= NULL
;
6928 if (bm
->process_rsclient_queue
)
6930 work_queue_free (bm
->process_rsclient_queue
);
6931 bm
->process_rsclient_queue
= NULL
;