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 bgp_sync_delete (peer
);
961 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
963 bfd_info_free(&(peer
->bfd_info
));
965 memset (peer
, 0, sizeof (struct peer
));
967 XFREE (MTYPE_BGP_PEER
, peer
);
970 /* increase reference count on a struct peer */
972 peer_lock_with_caller (const char *name
, struct peer
*peer
)
974 assert (peer
&& (peer
->lock
>= 0));
977 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
985 /* decrease reference count on a struct peer
986 * struct peer is freed and NULL returned if last reference
989 peer_unlock_with_caller (const char *name
, struct peer
*peer
)
991 assert (peer
&& (peer
->lock
> 0));
994 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1008 /* Allocate new peer object, implicitely locked. */
1009 static struct peer
*
1010 peer_new (struct bgp
*bgp
)
1017 /* bgp argument is absolutely required */
1022 /* Allocate new peer. */
1023 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
1025 /* Set default value. */
1027 peer
->v_start
= BGP_INIT_START_TIMER
;
1028 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1029 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
1030 peer
->status
= Idle
;
1031 peer
->ostatus
= Idle
;
1032 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1034 peer
= peer_lock (peer
); /* initial reference */
1037 peer
->password
= NULL
;
1039 /* Set default flags. */
1040 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1041 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1043 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
1045 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1046 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
1048 peer
->orf_plist
[afi
][safi
] = NULL
;
1050 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1052 /* Create buffers. */
1053 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
1054 peer
->obuf
= stream_fifo_new ();
1056 /* We use a larger buffer for peer->work in the event that:
1057 * - We RX a BGP_UPDATE where the attributes alone are just
1058 * under BGP_MAX_PACKET_SIZE
1059 * - The user configures an outbound route-map that does many as-path
1060 * prepends or adds many communities. At most they can have CMD_ARGC_MAX
1061 * args in a route-map so there is a finite limit on how large they can
1062 * make the attributes.
1064 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
1065 * checking for every single attribute as we construct an UPDATE.
1067 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1068 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
1071 bgp_sync_init (peer
);
1073 /* Get service port number. */
1074 sp
= getservbyname ("bgp", "tcp");
1075 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
1081 * This function is invoked when a duplicate peer structure associated with
1082 * a neighbor is being deleted. If this about-to-be-deleted structure is
1083 * the one with all the config, then we have to copy over the info.
1086 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
1088 struct peer_af
*paf
;
1096 /* The following function is used by both peer group config copy to
1097 * individual peer and when we transfer config
1099 if (peer_src
->change_local_as
)
1100 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1102 /* peer flags apply */
1103 peer_dst
->flags
= peer_src
->flags
;
1104 peer_dst
->cap
= peer_src
->cap
;
1105 peer_dst
->config
= peer_src
->config
;
1107 peer_dst
->local_as
= peer_src
->local_as
;
1108 peer_dst
->ifindex
= peer_src
->ifindex
;
1109 peer_dst
->port
= peer_src
->port
;
1110 peer_sort(peer_dst
);
1111 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1114 peer_dst
->holdtime
= peer_src
->holdtime
;
1115 peer_dst
->keepalive
= peer_src
->keepalive
;
1116 peer_dst
->connect
= peer_src
->connect
;
1117 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1118 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1119 peer_dst
->v_asorig
= peer_src
->v_asorig
;
1120 peer_dst
->routeadv
= peer_src
->routeadv
;
1121 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1123 /* password apply */
1124 if (peer_src
->password
&& !peer_dst
->password
)
1125 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
1127 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1128 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1130 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1131 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1132 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
1135 PEERAF_FOREACH(peer_src
, paf
, afindex
)
1136 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1138 /* update-source apply */
1139 if (peer_src
->update_source
)
1141 if (peer_dst
->update_source
)
1142 sockunion_free (peer_dst
->update_source
);
1143 if (peer_dst
->update_if
)
1145 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1146 peer_dst
->update_if
= NULL
;
1148 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
1150 else if (peer_src
->update_if
)
1152 if (peer_dst
->update_if
)
1153 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1154 if (peer_dst
->update_source
)
1156 sockunion_free (peer_dst
->update_source
);
1157 peer_dst
->update_source
= NULL
;
1159 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1162 if (peer_src
->ifname
)
1164 if (peer_dst
->ifname
)
1165 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1167 peer_dst
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1172 * Set or reset the peer address socketunion structure based on the
1173 * learnt peer address. Currently via the source address of the
1174 * ipv6 ND router-advertisement.
1177 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
1179 struct interface
*ifp
;
1180 struct nbr_connected
*ifc_nbr
;
1181 struct connected
*ifc
;
1184 struct listnode
*node
;
1189 if ((ifp
= if_lookup_by_name(peer
->conf_if
)))
1191 /* if multiple IP addresses assigned to link, we pick the first */
1192 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1193 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
))
1194 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
))
1196 /* Try IPv4 connection first, if present */
1197 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1198 /* We can determine peer's IP address if prefixlen is 30/31 */
1199 if (p
.prefixlen
== 30)
1201 peer
->su
.sa
.sa_family
= AF_INET
;
1202 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1203 if (s_addr
% 4 == 1)
1204 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1205 else if (s_addr
% 4 == 2)
1206 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1207 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1208 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1209 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1212 else if (p
.prefixlen
== 31)
1214 peer
->su
.sa
.sa_family
= AF_INET
;
1215 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1216 if (s_addr
% 2 == 0)
1217 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1219 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1220 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1221 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1222 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1226 zlog_warn("%s neighbor interface with IPv4 numbered links used without /30 or /31",
1230 if (ifp
->nbr_connected
&&
1231 (ifc_nbr
= listnode_head(ifp
->nbr_connected
)))
1233 peer
->su
.sa
.sa_family
= AF_INET6
;
1234 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1235 sizeof (struct in6_addr
));
1237 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1239 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1244 /* This works as an indication of unresolved peer address
1245 on a BGP interface*/
1246 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1247 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1250 /* Create new BGP peer. */
1252 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1253 as_t local_as
, as_t remote_as
, int as_type
, afi_t afi
, safi_t safi
)
1257 char buf
[SU_ADDRSTRLEN
];
1259 peer
= peer_new (bgp
);
1262 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1263 bgp_peer_conf_if_to_su_update(peer
);
1265 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1266 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1271 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1273 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1274 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1276 peer
->local_as
= local_as
;
1277 peer
->as
= remote_as
;
1278 peer
->as_type
= as_type
;
1279 peer
->local_id
= bgp
->router_id
;
1280 peer
->v_holdtime
= bgp
->default_holdtime
;
1281 peer
->v_keepalive
= bgp
->default_keepalive
;
1282 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1283 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1285 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1287 peer
= peer_lock (peer
); /* bgp peer list reference */
1288 listnode_add_sort (bgp
->peer
, peer
);
1290 active
= peer_active (peer
);
1292 /* Last read and reset time set */
1293 peer
->readtime
= peer
->resettime
= bgp_clock ();
1295 /* Default TTL set. */
1296 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1298 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1302 peer
->afc
[afi
][safi
] = 1;
1303 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1305 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1309 /* Set up peer's events and timers. */
1310 if (! active
&& peer_active (peer
))
1311 bgp_timer_set (peer
);
1317 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1318 safi_t safi
, int v6only
)
1322 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1325 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1326 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1327 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, AS_SPECIFIED
, 0, 0, 0);
1329 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, AS_SPECIFIED
, 0, afi
, safi
);
1332 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1334 else if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)) ||
1335 (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)))
1338 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1340 UNSET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1342 /* v6only flag changed. Reset bgp seesion */
1343 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1345 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
1346 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1347 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1350 bgp_session_reset(peer
);
1356 /* Make accept BGP peer. Called from bgp_accept (). */
1358 peer_create_accept (struct bgp
*bgp
)
1362 peer
= peer_new (bgp
);
1364 peer
= peer_lock (peer
); /* bgp peer list reference */
1365 listnode_add_sort (bgp
->peer
, peer
);
1370 /* Change peer's AS number. */
1372 peer_as_change (struct peer
*peer
, as_t as
, int as_specified
)
1374 bgp_peer_sort_t type
;
1378 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1380 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1382 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1383 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1384 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1387 bgp_session_reset(peer
);
1389 type
= peer_sort (peer
);
1391 peer
->as_type
= as_specified
;
1393 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1394 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1395 && peer
->bgp
->as
!= as
)
1396 peer
->local_as
= peer
->bgp
->confed_id
;
1398 peer
->local_as
= peer
->bgp
->as
;
1400 /* Advertisement-interval reset */
1403 conf
= peer
->group
->conf
;
1405 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1407 peer
->v_routeadv
= conf
->routeadv
;
1409 /* Only go back to the default advertisement-interval if the user had not
1410 * already configured it */
1411 else if (!CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
1413 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1414 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1416 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1419 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1421 else if (type
== BGP_PEER_IBGP
)
1424 /* reflector-client reset */
1425 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1427 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1428 PEER_FLAG_REFLECTOR_CLIENT
);
1429 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1430 PEER_FLAG_REFLECTOR_CLIENT
);
1431 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1432 PEER_FLAG_REFLECTOR_CLIENT
);
1433 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1434 PEER_FLAG_REFLECTOR_CLIENT
);
1435 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1436 PEER_FLAG_REFLECTOR_CLIENT
);
1439 /* local-as reset */
1440 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1442 peer
->change_local_as
= 0;
1443 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1444 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1448 /* If peer does not exist, create new one. If peer already exists,
1449 set AS number to the peer. */
1451 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1452 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1458 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1460 peer
= peer_lookup (bgp
, su
);
1464 /* Not allowed for a dynamic peer. */
1465 if (peer_dynamic_neighbor (peer
))
1468 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1471 /* When this peer is a member of peer-group. */
1474 if (peer
->group
->conf
->as
)
1476 /* Return peer group's AS number. */
1477 *as
= peer
->group
->conf
->as
;
1478 return BGP_ERR_PEER_GROUP_MEMBER
;
1480 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1482 if ((as_type
!= AS_INTERNAL
) && (bgp
->as
!= *as
))
1485 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1490 if ((as_type
!= AS_EXTERNAL
) && (bgp
->as
== *as
))
1493 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1498 /* Existing peer's AS number change. */
1499 if (peer
->as
!= *as
)
1500 peer_as_change (peer
, *as
, as_type
);
1505 return BGP_ERR_NO_INTERFACE_CONFIG
;
1507 /* If the peer is not part of our confederation, and its not an
1508 iBGP peer then spoof the source AS */
1509 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1510 && ! bgp_confederation_peers_check (bgp
, *as
)
1512 local_as
= bgp
->confed_id
;
1516 /* If this is IPv4 unicast configuration and "no bgp default
1517 ipv4-unicast" is specified. */
1519 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1520 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1521 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0, 0);
1523 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, afi
, safi
);
1529 /* Activate the peer or peer group for specified AFI and SAFI. */
1531 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1535 if (peer
->afc
[afi
][safi
])
1538 /* Activate the address family configuration. */
1539 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1540 peer
->afc
[afi
][safi
] = 1;
1543 active
= peer_active (peer
);
1545 peer
->afc
[afi
][safi
] = 1;
1547 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1549 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1552 if (! active
&& peer_active (peer
))
1553 bgp_timer_set (peer
);
1556 if (peer
->status
== Established
)
1558 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1560 peer
->afc_adv
[afi
][safi
] = 1;
1561 bgp_capability_send (peer
, afi
, safi
,
1563 CAPABILITY_ACTION_SET
);
1564 if (peer
->afc_recv
[afi
][safi
])
1566 peer
->afc_nego
[afi
][safi
] = 1;
1567 bgp_announce_route (peer
, afi
, safi
);
1572 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1573 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1574 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1583 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1585 struct peer_group
*group
;
1587 struct listnode
*node
, *nnode
;
1589 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1591 group
= peer
->group
;
1593 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1595 if (peer1
->af_group
[afi
][safi
])
1596 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1601 if (peer
->af_group
[afi
][safi
])
1602 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1605 if (! peer
->afc
[afi
][safi
])
1608 /* De-activate the address family configuration. */
1609 peer
->afc
[afi
][safi
] = 0;
1610 peer_af_flag_reset (peer
, afi
, safi
);
1611 if (peer_af_delete(peer
, afi
, safi
) != 0)
1613 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
1616 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1618 if (peer
->status
== Established
)
1620 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1622 peer
->afc_adv
[afi
][safi
] = 0;
1623 peer
->afc_nego
[afi
][safi
] = 0;
1625 if (peer_active_nego (peer
))
1627 bgp_capability_send (peer
, afi
, safi
,
1629 CAPABILITY_ACTION_UNSET
);
1630 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1631 peer
->pcount
[afi
][safi
] = 0;
1635 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1636 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1637 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1642 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1643 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1644 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1652 peer_nsf_stop (struct peer
*peer
)
1657 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1658 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1660 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1661 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1662 peer
->nsf
[afi
][safi
] = 0;
1664 if (peer
->t_gr_restart
)
1666 BGP_TIMER_OFF (peer
->t_gr_restart
);
1667 if (bgp_debug_neighbor_events(peer
))
1668 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1670 if (peer
->t_gr_stale
)
1672 BGP_TIMER_OFF (peer
->t_gr_stale
);
1673 if (bgp_debug_neighbor_events(peer
))
1674 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1676 bgp_clear_route_all (peer
);
1679 /* Delete peer from confguration.
1681 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1682 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1684 * This function /should/ take care to be idempotent, to guard against
1685 * it being called multiple times through stray events that come in
1686 * that happen to result in this function being called again. That
1687 * said, getting here for a "Deleted" peer is a bug in the neighbour
1691 peer_delete (struct peer
*peer
)
1697 struct bgp_filter
*filter
;
1698 struct listnode
*pn
;
1701 assert (peer
->status
!= Deleted
);
1704 accept_peer
= CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1706 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1707 peer_nsf_stop (peer
);
1709 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1711 /* If this peer belongs to peer group, clear up the
1715 if (peer_dynamic_neighbor(peer
))
1716 peer_drop_dynamic_neighbor(peer
);
1718 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1720 peer
= peer_unlock (peer
); /* group->peer list reference */
1721 list_delete_node (peer
->group
->peer
, pn
);
1726 /* Withdraw all information from routing table. We can not use
1727 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1728 * executed after peer structure is deleted.
1730 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1732 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1734 if (peer
->doppelganger
)
1735 peer
->doppelganger
->doppelganger
= NULL
;
1736 peer
->doppelganger
= NULL
;
1738 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1739 bgp_fsm_change_status (peer
, Deleted
);
1741 /* Password configuration */
1744 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1745 peer
->password
= NULL
;
1748 ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1752 bgp_timer_set (peer
); /* stops all timers for Deleted */
1754 /* Delete from all peer list. */
1755 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1756 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1758 peer_unlock (peer
); /* bgp peer list reference */
1759 list_delete_node (bgp
->peer
, pn
);
1762 if (peer_rsclient_active (peer
)
1763 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1765 peer_unlock (peer
); /* rsclient list reference */
1766 list_delete_node (bgp
->rsclient
, pn
);
1768 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1770 /* Clear our own rsclient ribs. */
1771 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1772 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1773 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1774 PEER_FLAG_RSERVER_CLIENT
))
1775 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1779 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1780 member of a peer_group. */
1781 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1782 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1783 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1784 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1788 stream_free (peer
->ibuf
);
1790 stream_fifo_free (peer
->obuf
);
1792 stream_free (peer
->work
);
1794 stream_free(peer
->scratch
);
1796 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1798 /* Local and remote addresses. */
1800 sockunion_free (peer
->su_local
);
1801 if (peer
->su_remote
)
1802 sockunion_free (peer
->su_remote
);
1803 peer
->su_local
= peer
->su_remote
= NULL
;
1805 /* Free filter related memory. */
1806 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1807 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1809 filter
= &peer
->filter
[afi
][safi
];
1811 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1813 if (filter
->dlist
[i
].name
)
1814 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
1815 if (filter
->plist
[i
].name
)
1816 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
1817 if (filter
->aslist
[i
].name
)
1818 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
1820 filter
->dlist
[i
].name
= NULL
;
1821 filter
->plist
[i
].name
= NULL
;
1822 filter
->aslist
[i
].name
= NULL
;
1824 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1826 if (filter
->map
[i
].name
)
1827 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
1828 filter
->map
[i
].name
= NULL
;
1831 if (filter
->usmap
.name
)
1832 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
1834 if (peer
->default_rmap
[afi
][safi
].name
)
1835 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
1837 filter
->usmap
.name
= NULL
;
1838 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1841 FOREACH_AFI_SAFI (afi
, safi
)
1842 peer_af_delete (peer
, afi
, safi
);
1843 peer_unlock (peer
); /* initial reference */
1849 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1851 return strcmp (g1
->name
, g2
->name
);
1854 /* Peer group cofiguration. */
1855 static struct peer_group
*
1856 peer_group_new (void)
1858 return (struct peer_group
*) XCALLOC (MTYPE_BGP_PEER_GROUP
,
1859 sizeof (struct peer_group
));
1863 peer_group_free (struct peer_group
*group
)
1865 XFREE (MTYPE_BGP_PEER_GROUP
, group
);
1869 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1871 struct peer_group
*group
;
1872 struct listnode
*node
, *nnode
;
1874 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1876 if (strcmp (group
->name
, name
) == 0)
1883 peer_group_get (struct bgp
*bgp
, const char *name
)
1885 struct peer_group
*group
;
1888 group
= peer_group_lookup (bgp
, name
);
1892 group
= peer_group_new ();
1895 XFREE(MTYPE_BGP_PEER_GROUP_HOST
, group
->name
);
1896 group
->name
= XSTRDUP(MTYPE_BGP_PEER_GROUP_HOST
, name
);
1897 group
->peer
= list_new ();
1898 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1899 group
->listen_range
[afi
] = list_new ();
1900 group
->conf
= peer_new (bgp
);
1901 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1902 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1903 if (group
->conf
->host
)
1904 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
1905 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1906 group
->conf
->group
= group
;
1907 group
->conf
->as
= 0;
1908 group
->conf
->ttl
= 1;
1909 group
->conf
->gtsm_hops
= 0;
1910 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1911 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1912 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1913 group
->conf
->keepalive
= 0;
1914 group
->conf
->holdtime
= 0;
1915 group
->conf
->connect
= 0;
1916 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1917 listnode_add_sort (bgp
->group
, group
);
1923 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1924 afi_t afi
, safi_t safi
)
1927 int out
= FILTER_OUT
;
1929 struct bgp_filter
*pfilter
;
1930 struct bgp_filter
*gfilter
;
1934 pfilter
= &peer
->filter
[afi
][safi
];
1935 gfilter
= &conf
->filter
[afi
][safi
];
1939 peer
->as
= conf
->as
;
1942 if (conf
->change_local_as
)
1943 peer
->change_local_as
= conf
->change_local_as
;
1946 peer
->ttl
= conf
->ttl
;
1949 peer
->gtsm_hops
= conf
->gtsm_hops
;
1952 peer
->weight
= conf
->weight
;
1954 /* this flag is per-neighbor and so has to be preserved */
1955 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1957 /* peer flags apply */
1958 peer
->flags
= conf
->flags
;
1961 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1963 /* peer af_flags apply */
1964 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1965 /* peer config apply */
1966 peer
->config
= conf
->config
;
1968 /* peer timers apply */
1969 peer
->holdtime
= conf
->holdtime
;
1970 peer
->keepalive
= conf
->keepalive
;
1971 peer
->connect
= conf
->connect
;
1972 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1973 peer
->v_connect
= conf
->connect
;
1975 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1977 /* advertisement-interval reset */
1978 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1979 peer
->v_routeadv
= conf
->routeadv
;
1981 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1982 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1984 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1986 /* password apply */
1987 if (conf
->password
&& !peer
->password
)
1988 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1992 /* maximum-prefix */
1993 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1994 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1995 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1998 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
2000 /* route-server-client */
2001 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2003 /* Make peer's RIB point to group's RIB. */
2004 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
2006 /* Import policy. */
2007 if (pfilter
->map
[RMAP_IMPORT
].name
)
2008 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2009 if (gfilter
->map
[RMAP_IMPORT
].name
)
2011 pfilter
->map
[RMAP_IMPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IMPORT
].name
);
2012 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2016 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2017 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2020 /* Export policy. */
2021 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2023 pfilter
->map
[RMAP_EXPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_EXPORT
].name
);
2024 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2028 /* default-originate route-map */
2029 if (conf
->default_rmap
[afi
][safi
].name
)
2031 if (peer
->default_rmap
[afi
][safi
].name
)
2032 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->default_rmap
[afi
][safi
].name
);
2033 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, conf
->default_rmap
[afi
][safi
].name
);
2034 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
2037 /* update-source apply */
2038 if (conf
->update_source
)
2040 if (peer
->update_source
)
2041 sockunion_free (peer
->update_source
);
2042 if (peer
->update_if
)
2044 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2045 peer
->update_if
= NULL
;
2047 peer
->update_source
= sockunion_dup (conf
->update_source
);
2049 else if (conf
->update_if
)
2051 if (peer
->update_if
)
2052 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2053 if (peer
->update_source
)
2055 sockunion_free (peer
->update_source
);
2056 peer
->update_source
= NULL
;
2058 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
2061 /* inbound filter apply */
2062 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
2064 if (pfilter
->dlist
[in
].name
)
2065 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[in
].name
);
2066 pfilter
->dlist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[in
].name
);
2067 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
2069 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
2071 if (pfilter
->plist
[in
].name
)
2072 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[in
].name
);
2073 pfilter
->plist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[in
].name
);
2074 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
2076 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
2078 if (pfilter
->aslist
[in
].name
)
2079 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[in
].name
);
2080 pfilter
->aslist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[in
].name
);
2081 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
2083 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
2085 if (pfilter
->map
[RMAP_IN
].name
)
2086 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IN
].name
);
2087 pfilter
->map
[RMAP_IN
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IN
].name
);
2088 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
2091 /* outbound filter apply */
2092 if (gfilter
->dlist
[out
].name
)
2094 if (pfilter
->dlist
[out
].name
)
2095 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[out
].name
);
2096 pfilter
->dlist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[out
].name
);
2097 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
2101 if (pfilter
->dlist
[out
].name
)
2102 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[out
].name
);
2103 pfilter
->dlist
[out
].name
= NULL
;
2104 pfilter
->dlist
[out
].alist
= NULL
;
2106 if (gfilter
->plist
[out
].name
)
2108 if (pfilter
->plist
[out
].name
)
2109 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[out
].name
);
2110 pfilter
->plist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[out
].name
);
2111 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
2115 if (pfilter
->plist
[out
].name
)
2116 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[out
].name
);
2117 pfilter
->plist
[out
].name
= NULL
;
2118 pfilter
->plist
[out
].plist
= NULL
;
2120 if (gfilter
->aslist
[out
].name
)
2122 if (pfilter
->aslist
[out
].name
)
2123 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[out
].name
);
2124 pfilter
->aslist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[out
].name
);
2125 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
2129 if (pfilter
->aslist
[out
].name
)
2130 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[out
].name
);
2131 pfilter
->aslist
[out
].name
= NULL
;
2132 pfilter
->aslist
[out
].aslist
= NULL
;
2134 if (gfilter
->map
[RMAP_OUT
].name
)
2136 if (pfilter
->map
[RMAP_OUT
].name
)
2137 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_OUT
].name
);
2138 pfilter
->map
[RMAP_OUT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_OUT
].name
);
2139 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
2143 if (pfilter
->map
[RMAP_OUT
].name
)
2144 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_OUT
].name
);
2145 pfilter
->map
[RMAP_OUT
].name
= NULL
;
2146 pfilter
->map
[RMAP_OUT
].map
= NULL
;
2149 /* RS-client's import/export route-maps. */
2150 if (gfilter
->map
[RMAP_IMPORT
].name
)
2152 if (pfilter
->map
[RMAP_IMPORT
].name
)
2153 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2154 pfilter
->map
[RMAP_IMPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IMPORT
].name
);
2155 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2159 if (pfilter
->map
[RMAP_IMPORT
].name
)
2160 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2161 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2162 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2164 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2166 if (pfilter
->map
[RMAP_EXPORT
].name
)
2167 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_EXPORT
].name
);
2168 pfilter
->map
[RMAP_EXPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_EXPORT
].name
);
2169 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2172 if (gfilter
->usmap
.name
)
2174 if (pfilter
->usmap
.name
)
2175 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->usmap
.name
);
2176 pfilter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->usmap
.name
);
2177 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
2181 if (pfilter
->usmap
.name
)
2182 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->usmap
.name
);
2183 pfilter
->usmap
.name
= NULL
;
2184 pfilter
->usmap
.map
= NULL
;
2187 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2190 /* Peer group's remote AS configuration. */
2192 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
,
2193 as_t
*as
, int as_type
)
2195 struct peer_group
*group
;
2197 struct listnode
*node
, *nnode
;
2199 group
= peer_group_lookup (bgp
, group_name
);
2203 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2207 /* When we setup peer-group AS number all peer group member's AS
2208 number must be updated to same number. */
2209 peer_as_change (group
->conf
, *as
, as_type
);
2211 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2213 if (peer
->as
!= *as
)
2214 peer_as_change (peer
, *as
, as_type
);
2221 peer_group_delete (struct peer_group
*group
)
2225 struct prefix
*prefix
;
2227 struct listnode
*node
, *nnode
;
2232 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2234 other
= peer
->doppelganger
;
2236 if (other
&& other
->status
!= Deleted
)
2238 other
->group
= NULL
;
2242 list_delete (group
->peer
);
2244 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2246 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2248 prefix_free(prefix
);
2250 list_delete (group
->listen_range
[afi
]);
2253 XFREE(MTYPE_BGP_PEER_HOST
, group
->name
);
2256 group
->conf
->group
= NULL
;
2257 peer_delete (group
->conf
);
2259 /* Delete from all peer_group list. */
2260 listnode_delete (bgp
->group
, group
);
2262 bfd_info_free(&(group
->conf
->bfd_info
));
2264 peer_group_free (group
);
2270 peer_group_remote_as_delete (struct peer_group
*group
)
2272 struct peer
*peer
, *other
;
2273 struct listnode
*node
, *nnode
;
2275 if ((group
->conf
->as_type
== AS_UNSPECIFIED
) ||
2276 ((! group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2279 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2281 other
= peer
->doppelganger
;
2285 if (other
&& other
->status
!= Deleted
)
2287 other
->group
= NULL
;
2291 list_delete_all_node (group
->peer
);
2293 group
->conf
->as
= 0;
2294 group
->conf
->as_type
= AS_UNSPECIFIED
;
2300 peer_group_listen_range_add (struct peer_group
*group
, struct prefix
*range
)
2302 struct prefix
*prefix
;
2303 struct listnode
*node
, *nnode
;
2306 afi
= family2afi(range
->family
);
2308 /* Group needs remote AS configured. */
2309 if (! group
->conf
->as
)
2310 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2312 /* Ensure no duplicates. Currently we don't care about overlaps. */
2313 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2315 if (prefix_same(range
, prefix
))
2316 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
;
2319 prefix
= prefix_new();
2320 prefix_copy(prefix
, range
);
2321 listnode_add(group
->listen_range
[afi
], prefix
);
2326 peer_group_listen_range_del (struct peer_group
*group
, struct prefix
*range
)
2328 struct prefix
*prefix
, *prefix2
;
2329 struct listnode
*node
, *nnode
;
2332 char buf
[SU_ADDRSTRLEN
];
2334 afi
= family2afi(range
->family
);
2336 /* Identify the listen range. */
2337 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2339 if (prefix_same(range
, prefix
))
2344 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2346 prefix2str(prefix
, buf
, sizeof(buf
));
2348 /* Dispose off any dynamic neighbors that exist due to this listen range */
2349 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2351 if (!peer_dynamic_neighbor (peer
))
2354 prefix2
= sockunion2hostprefix(&peer
->su
);
2355 if (prefix_match(prefix
, prefix2
))
2357 if (bgp_debug_neighbor_events(peer
))
2358 zlog_debug ("Deleting dynamic neighbor %s group %s upon "
2359 "delete of listen range %s",
2360 peer
->host
, group
->name
, buf
);
2365 /* Get rid of the listen range */
2366 listnode_delete(group
->listen_range
[afi
], prefix
);
2371 /* Bind specified peer to peer group. */
2373 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2374 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
2376 int first_member
= 0;
2378 /* Check peer group's address family. */
2379 if (! group
->conf
->afc
[afi
][safi
])
2380 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
2382 /* Lookup the peer. */
2384 peer
= peer_lookup (bgp
, su
);
2386 /* Create a new peer. */
2389 if ((group
->conf
->as_type
== AS_SPECIFIED
) && (! group
->conf
->as
)) {
2390 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2393 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, afi
, safi
);
2394 peer
->group
= group
;
2395 peer
->af_group
[afi
][safi
] = 1;
2397 peer
= peer_lock (peer
); /* group->peer list reference */
2398 listnode_add (group
->peer
, peer
);
2399 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2400 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2405 /* When the peer already belongs to peer group, check the consistency. */
2406 if (peer
->af_group
[afi
][safi
])
2408 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2409 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2414 /* Check current peer group configuration. */
2415 if (peer_group_active (peer
)
2416 && strcmp (peer
->group
->name
, group
->name
) != 0)
2417 return BGP_ERR_PEER_GROUP_MISMATCH
;
2419 if (peer
->as_type
== AS_UNSPECIFIED
)
2421 peer
->as_type
= group
->conf
->as_type
;
2422 peer
->as
= group
->conf
->as
;
2425 if (! group
->conf
->as
)
2427 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2428 && peer_sort (group
->conf
) != peer_sort (peer
))
2432 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2435 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2439 peer
->af_group
[afi
][safi
] = 1;
2440 peer
->afc
[afi
][safi
] = 1;
2441 if (!peer_af_find(peer
, afi
, safi
) &&
2442 peer_af_create(peer
, afi
, safi
) == NULL
)
2444 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2448 peer
->group
= group
;
2450 peer
= peer_lock (peer
); /* group->peer list reference */
2451 listnode_add (group
->peer
, peer
);
2454 assert (group
&& peer
->group
== group
);
2458 /* Advertisement-interval reset */
2459 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2461 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2462 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2464 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2467 /* ebgp-multihop reset */
2468 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2469 group
->conf
->ttl
= 255;
2471 /* local-as reset */
2472 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2474 group
->conf
->change_local_as
= 0;
2475 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2476 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2480 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2482 struct listnode
*pn
;
2484 /* If it's not configured as RSERVER_CLIENT in any other address
2485 family, without being member of a peer_group, remove it from
2486 list bgp->rsclient.*/
2487 if (! peer_rsclient_active (peer
)
2488 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2490 peer_unlock (peer
); /* peer rsclient reference */
2491 list_delete_node (bgp
->rsclient
, pn
);
2493 /* Clear our own rsclient rib for this afi/safi. */
2494 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2497 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2499 /* Import policy. */
2500 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2502 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2503 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2504 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2507 /* Export policy. */
2508 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2509 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2511 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2512 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2513 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2517 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2518 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2520 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2522 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2523 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2524 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2527 bgp_session_reset(peer
);
2533 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2534 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2538 if (! peer
->af_group
[afi
][safi
])
2541 if (group
!= peer
->group
)
2542 return BGP_ERR_PEER_GROUP_MISMATCH
;
2544 peer
->af_group
[afi
][safi
] = 0;
2545 peer
->afc
[afi
][safi
] = 0;
2546 peer_af_flag_reset (peer
, afi
, safi
);
2547 if (peer_af_delete(peer
, afi
, safi
) != 0)
2549 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
2552 if (peer
->rib
[afi
][safi
])
2553 peer
->rib
[afi
][safi
] = NULL
;
2555 if (! peer_group_active (peer
))
2557 assert (listnode_lookup (group
->peer
, peer
));
2558 peer_unlock (peer
); /* peer group list reference */
2559 listnode_delete (group
->peer
, peer
);
2561 other
= peer
->doppelganger
;
2562 if (group
->conf
->as
)
2565 if (other
&& other
->status
!= Deleted
)
2570 listnode_delete(group
->peer
, other
);
2572 other
->group
= NULL
;
2577 bgp_bfd_deregister_peer(peer
);
2578 peer_global_config_reset (peer
);
2581 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2583 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2584 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2585 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2588 bgp_session_reset(peer
);
2594 bgp_startup_timer_expire (struct thread
*thread
)
2598 bgp
= THREAD_ARG (thread
);
2599 bgp
->t_startup
= NULL
;
2605 /* BGP instance creation by `router bgp' commands. */
2607 bgp_create (as_t
*as
, const char *name
)
2613 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2617 bgp
->peer_self
= peer_new (bgp
);
2618 if (bgp
->peer_self
->host
)
2619 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
2620 bgp
->peer_self
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
2621 bgp
->peer
= list_new ();
2622 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2624 bgp
->group
= list_new ();
2625 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2627 bgp
->rsclient
= list_new ();
2628 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2630 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2631 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2633 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2634 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2635 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2636 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2637 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2640 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2641 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2642 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
2643 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2644 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2645 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2646 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2647 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
2648 bgp
->dynamic_neighbors_count
= 0;
2653 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
2655 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2656 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2658 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2659 bgp
, bgp
->restart_time
);
2661 update_bgp_group_init(bgp
);
2665 /* Return first entry of BGP. */
2667 bgp_get_default (void)
2670 return (listgetdata (listhead (bm
->bgp
)));
2674 /* Lookup BGP entry. */
2676 bgp_lookup (as_t as
, const char *name
)
2679 struct listnode
*node
, *nnode
;
2681 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2683 && ((bgp
->name
== NULL
&& name
== NULL
)
2684 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2689 /* Lookup BGP structure by view name. */
2691 bgp_lookup_by_name (const char *name
)
2694 struct listnode
*node
, *nnode
;
2696 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2697 if ((bgp
->name
== NULL
&& name
== NULL
)
2698 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2703 /* Called from VTY commands. */
2705 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2709 /* Multiple instance check. */
2710 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2713 bgp
= bgp_lookup_by_name (name
);
2715 bgp
= bgp_get_default ();
2717 /* Already exists. */
2723 return BGP_ERR_INSTANCE_MISMATCH
;
2731 /* BGP instance name can not be specified for single instance. */
2733 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2735 /* Get default BGP structure if exists. */
2736 bgp
= bgp_get_default ();
2743 return BGP_ERR_AS_MISMATCH
;
2750 bgp
= bgp_create (as
, name
);
2751 bgp_router_id_set(bgp
, &router_id_zebra
);
2754 bgp
->t_rmap_def_originate_eval
= NULL
;
2755 bgp
->t_rmap_update
= NULL
;
2756 bgp
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
2758 /* Create BGP server socket, if first instance. */
2759 if (list_isempty(bm
->bgp
)
2760 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2762 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2763 return BGP_ERR_INVALID_VALUE
;
2766 listnode_add (bm
->bgp
, bgp
);
2771 /* Delete BGP instance. */
2773 bgp_delete (struct bgp
*bgp
)
2776 struct peer_group
*group
;
2777 struct listnode
*node
, *pnode
;
2778 struct listnode
*next
, *pnext
;
2782 THREAD_OFF (bgp
->t_startup
);
2784 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2786 if (peer
->status
== Established
||
2787 peer
->status
== OpenSent
||
2788 peer
->status
== OpenConfirm
)
2790 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2791 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2795 if (bgp
->t_rmap_update
)
2796 BGP_TIMER_OFF(bgp
->t_rmap_update
);
2798 /* Delete static route. */
2799 bgp_static_delete (bgp
);
2801 /* Unset redistribution. */
2802 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2803 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2804 if (i
!= ZEBRA_ROUTE_BGP
)
2805 bgp_redistribute_unset (bgp
, afi
, i
, 0);
2807 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2809 for (ALL_LIST_ELEMENTS (group
->peer
, pnode
, pnext
, peer
))
2811 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2813 /* Send notify to remote peer. */
2814 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2817 peer_group_delete (group
);
2820 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2822 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2824 /* Send notify to remote peer. */
2825 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2831 assert (listcount (bgp
->rsclient
) == 0);
2833 if (bgp
->peer_self
) {
2834 peer_delete(bgp
->peer_self
);
2835 bgp
->peer_self
= NULL
;
2838 if (bgp
->t_rmap_def_originate_eval
)
2840 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
2844 update_bgp_group_free (bgp
);
2845 /* Remove visibility via the master list - there may however still be
2846 * routes to be processed still referencing the struct bgp.
2848 listnode_delete (bm
->bgp
, bgp
);
2849 if (list_isempty(bm
->bgp
))
2852 bgp_unlock(bgp
); /* initial reference */
2857 static void bgp_free (struct bgp
*);
2860 bgp_lock (struct bgp
*bgp
)
2866 bgp_unlock(struct bgp
*bgp
)
2868 assert(bgp
->lock
> 0);
2869 if (--bgp
->lock
== 0)
2874 bgp_free (struct bgp
*bgp
)
2879 list_delete (bgp
->group
);
2880 list_delete (bgp
->peer
);
2881 list_delete (bgp
->rsclient
);
2884 XFREE(MTYPE_BGP
, bgp
->name
);
2886 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2887 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2889 if (bgp
->route
[afi
][safi
])
2890 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2891 if (bgp
->aggregate
[afi
][safi
])
2892 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2893 if (bgp
->rib
[afi
][safi
])
2894 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2896 XFREE (MTYPE_BGP
, bgp
);
2900 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2903 struct listnode
*node
, *nnode
;
2910 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2911 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2912 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2915 else if (bm
->bgp
!= NULL
)
2917 struct listnode
*bgpnode
, *nbgpnode
;
2919 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2920 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2921 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2922 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2929 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2932 struct listnode
*node
, *nnode
;
2936 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2937 if (sockunion_same (&peer
->su
, su
)
2938 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2941 else if (bm
->bgp
!= NULL
)
2943 struct listnode
*bgpnode
, *nbgpnode
;
2945 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2946 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2947 if (sockunion_same (&peer
->su
, su
)
2948 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2955 peer_create_bind_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
,
2956 struct peer_group
*group
)
2962 /* Create peer first; we've already checked group config is valid. */
2963 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, 0, 0);
2968 peer
->group
= group
;
2969 peer
= peer_lock (peer
);
2970 listnode_add (group
->peer
, peer
);
2973 * Bind peer for all AFs configured for the group. We don't call
2974 * peer_group_bind as that is sub-optimal and does some stuff we don't want.
2976 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2977 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2979 if (!group
->conf
->afc
[afi
][safi
])
2981 peer
->af_group
[afi
][safi
] = 1;
2982 peer
->afc
[afi
][safi
] = 1;
2983 if (!peer_af_find(peer
, afi
, safi
) &&
2984 peer_af_create(peer
, afi
, safi
) == NULL
)
2986 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2988 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2991 /* Mark as dynamic, but also as a "config node" for other things to work. */
2992 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
2993 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2999 peer_group_lookup_dynamic_neighbor_range (struct peer_group
* group
,
3000 struct prefix
* prefix
)
3002 struct listnode
*node
, *nnode
;
3003 struct prefix
*range
;
3006 afi
= family2afi(prefix
->family
);
3008 if (group
->listen_range
[afi
])
3009 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, range
))
3010 if (prefix_match(range
, prefix
))
3017 peer_group_lookup_dynamic_neighbor (struct bgp
*bgp
, struct prefix
*prefix
,
3018 struct prefix
**listen_range
)
3020 struct prefix
*range
= NULL
;
3021 struct peer_group
*group
= NULL
;
3022 struct listnode
*node
, *nnode
;
3024 *listen_range
= NULL
;
3027 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3028 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3031 else if (bm
->bgp
!= NULL
)
3033 struct listnode
*bgpnode
, *nbgpnode
;
3035 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3036 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3037 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3041 *listen_range
= range
;
3042 return (group
&& range
) ? group
: NULL
;
3046 peer_lookup_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
)
3048 struct peer_group
*group
;
3051 struct prefix
*prefix
;
3052 struct prefix
*listen_range
;
3054 char buf
[SU_ADDRSTRLEN
];
3055 char buf1
[SU_ADDRSTRLEN
];
3057 prefix
= sockunion2hostprefix(su
);
3062 /* See if incoming connection matches a configured listen range. */
3063 group
= peer_group_lookup_dynamic_neighbor (bgp
, prefix
, &listen_range
);
3074 prefix2str(prefix
, buf
, sizeof(buf
));
3075 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3077 if (bgp_debug_neighbor_events(NULL
))
3078 zlog_debug ("Dynamic Neighbor %s matches group %s listen range %s",
3079 buf
, group
->name
, buf1
);
3081 /* Are we within the listen limit? */
3082 dncount
= gbgp
->dynamic_neighbors_count
;
3084 if (dncount
>= gbgp
->dynamic_neighbors_limit
)
3086 if (bgp_debug_neighbor_events(NULL
))
3087 zlog_debug ("Dynamic Neighbor %s rejected - at limit %d",
3088 inet_sutop (su
, buf
), gbgp
->dynamic_neighbors_limit
);
3092 /* Ensure group is not disabled. */
3093 if (CHECK_FLAG (group
->conf
->flags
, PEER_FLAG_SHUTDOWN
))
3095 if (bgp_debug_neighbor_events(NULL
))
3096 zlog_debug ("Dynamic Neighbor %s rejected - group %s disabled",
3101 /* Check that at least one AF is activated for the group. */
3102 if (!peer_group_af_configured (group
))
3104 if (bgp_debug_neighbor_events(NULL
))
3105 zlog_debug ("Dynamic Neighbor %s rejected - no AF activated for group %s",
3110 /* Create dynamic peer and bind to associated group. */
3111 peer
= peer_create_bind_dynamic_neighbor (gbgp
, su
, group
);
3114 gbgp
->dynamic_neighbors_count
= ++dncount
;
3116 if (bgp_debug_neighbor_events(peer
))
3117 zlog_debug ("%s Dynamic Neighbor added, group %s count %d",
3118 peer
->host
, group
->name
, dncount
);
3123 void peer_drop_dynamic_neighbor (struct peer
*peer
)
3126 if (peer
->group
&& peer
->group
->bgp
)
3128 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3130 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3132 if (bgp_debug_neighbor_events(peer
))
3133 zlog_debug ("%s dropped from group %s, count %d",
3134 peer
->host
, peer
->group
->name
, dncount
);
3138 /* If peer is configured at least one address family return 1. */
3140 peer_active (struct peer
*peer
)
3142 if (BGP_PEER_SU_UNSPEC(peer
))
3144 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
3145 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3146 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
3147 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3148 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
3153 /* If peer is negotiated at least one address family return 1. */
3155 peer_active_nego (struct peer
*peer
)
3157 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3158 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3159 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3160 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3161 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
3166 /* peer_flag_change_type. */
3167 enum peer_change_type
3171 peer_change_reset_in
,
3172 peer_change_reset_out
,
3176 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
3177 enum peer_change_type type
)
3179 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3182 if (peer
->status
!= Established
)
3185 if (type
== peer_change_reset
)
3187 /* If we're resetting session, we've to delete both peer struct */
3188 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3189 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3190 PEER_FLAG_CONFIG_NODE
)))
3191 peer_delete(peer
->doppelganger
);
3193 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3194 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3196 else if (type
== peer_change_reset_in
)
3198 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3199 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3200 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3203 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3204 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3205 PEER_FLAG_CONFIG_NODE
)))
3206 peer_delete(peer
->doppelganger
);
3208 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3209 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3212 else if (type
== peer_change_reset_out
)
3214 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3215 bgp_announce_route (peer
, afi
, safi
);
3219 struct peer_flag_action
3224 /* This flag can be set for peer-group member. */
3225 u_char not_for_member
;
3227 /* Action when the flag is changed. */
3228 enum peer_change_type type
;
3230 /* Peer down cause */
3234 static const struct peer_flag_action peer_flag_action_list
[] =
3236 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3237 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3238 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3239 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3240 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3241 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3242 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3243 { PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3247 static const struct peer_flag_action peer_af_flag_action_list
[] =
3249 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3250 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3251 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3252 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3253 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3254 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3255 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3256 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3257 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3258 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3259 { PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3260 { PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
,1, peer_change_reset_out
},
3261 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3262 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3263 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3264 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3265 { PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3266 { PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3270 /* Proper action set. */
3272 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
3273 struct peer_flag_action
*action
, u_int32_t flag
)
3279 const struct peer_flag_action
*match
= NULL
;
3281 /* Check peer's frag action. */
3282 for (i
= 0; i
< size
; i
++)
3284 match
= &action_list
[i
];
3286 if (match
->flag
== 0)
3289 if (match
->flag
& flag
)
3293 if (match
->type
== peer_change_reset_in
)
3295 if (match
->type
== peer_change_reset_out
)
3297 if (match
->type
== peer_change_reset
)
3302 if (match
->not_for_member
)
3303 action
->not_for_member
= 1;
3307 /* Set peer clear type. */
3308 if (reset_in
&& reset_out
)
3309 action
->type
= peer_change_reset
;
3311 action
->type
= peer_change_reset_in
;
3313 action
->type
= peer_change_reset_out
;
3315 action
->type
= peer_change_none
;
3321 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
3323 if (flag
== PEER_FLAG_SHUTDOWN
)
3325 if (CHECK_FLAG (peer
->flags
, flag
))
3327 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3328 peer_nsf_stop (peer
);
3330 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3331 if (peer
->t_pmax_restart
)
3333 BGP_TIMER_OFF (peer
->t_pmax_restart
);
3334 if (bgp_debug_neighbor_events(peer
))
3335 zlog_debug ("%s Maximum-prefix restart timer canceled",
3339 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3340 peer_nsf_stop (peer
);
3342 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3343 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3344 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3346 bgp_session_reset(peer
);
3350 peer
->v_start
= BGP_INIT_START_TIMER
;
3351 BGP_EVENT_ADD (peer
, BGP_Stop
);
3354 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3356 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
3357 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3358 else if (flag
== PEER_FLAG_PASSIVE
)
3359 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
3360 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
3361 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
3363 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3364 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3367 bgp_session_reset(peer
);
3370 /* Change specified peer flag. */
3372 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
3376 struct peer_group
*group
;
3377 struct listnode
*node
, *nnode
;
3378 struct peer_flag_action action
;
3380 memset (&action
, 0, sizeof (struct peer_flag_action
));
3381 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
3383 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
3385 /* No flag action is found. */
3387 return BGP_ERR_INVALID_FLAG
;
3389 /* Not for peer-group member. */
3390 if (action
.not_for_member
&& peer_group_active (peer
))
3391 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3393 /* When unset the peer-group member's flag we have to check
3394 peer-group configuration. */
3395 if (! set
&& peer_group_active (peer
))
3396 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
3398 if (flag
== PEER_FLAG_SHUTDOWN
)
3399 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
3401 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3404 /* Flag conflict check. */
3406 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
3407 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
3408 return BGP_ERR_PEER_FLAG_CONFLICT
;
3410 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3412 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3414 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3419 SET_FLAG (peer
->flags
, flag
);
3421 UNSET_FLAG (peer
->flags
, flag
);
3423 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3425 if (action
.type
== peer_change_reset
)
3426 peer_flag_modify_action (peer
, flag
);
3431 /* peer-group member updates. */
3432 group
= peer
->group
;
3434 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3436 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3439 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3443 SET_FLAG (peer
->flags
, flag
);
3445 UNSET_FLAG (peer
->flags
, flag
);
3447 if (action
.type
== peer_change_reset
)
3448 peer_flag_modify_action (peer
, flag
);
3454 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
3456 return peer_flag_modify (peer
, flag
, 1);
3460 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
3462 return peer_flag_modify (peer
, flag
, 0);
3466 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
3468 if (peer
->af_group
[afi
][safi
])
3474 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
3479 struct listnode
*node
, *nnode
;
3480 struct peer_group
*group
;
3481 struct peer_flag_action action
;
3483 memset (&action
, 0, sizeof (struct peer_flag_action
));
3484 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
3486 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
3488 /* No flag action is found. */
3490 return BGP_ERR_INVALID_FLAG
;
3492 /* Adress family must be activated. */
3493 if (! peer
->afc
[afi
][safi
])
3494 return BGP_ERR_PEER_INACTIVE
;
3496 /* Not for peer-group member. */
3497 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
3498 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3500 /* Spcecial check for reflector client. */
3501 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
3502 && peer_sort (peer
) != BGP_PEER_IBGP
)
3503 return BGP_ERR_NOT_INTERNAL_PEER
;
3505 /* Spcecial check for remove-private-AS. */
3506 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
3507 && peer_sort (peer
) == BGP_PEER_IBGP
)
3508 return BGP_ERR_REMOVE_PRIVATE_AS
;
3510 /* as-override is not allowed for IBGP peers */
3511 if (flag
& PEER_FLAG_AS_OVERRIDE
3512 && peer_sort (peer
) == BGP_PEER_IBGP
)
3513 return BGP_ERR_AS_OVERRIDE
;
3515 /* When unset the peer-group member's flag we have to check
3516 peer-group configuration. */
3517 if (! set
&& peer
->af_group
[afi
][safi
])
3518 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
3519 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3521 /* When current flag configuration is same as requested one. */
3522 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3524 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3526 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3531 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3533 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3535 /* Execute action when peer is established. */
3536 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3537 && peer
->status
== Established
)
3539 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3540 bgp_clear_adj_in (peer
, afi
, safi
);
3543 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3544 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3545 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3546 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3547 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3548 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3549 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3550 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3552 peer_change_action (peer
, afi
, safi
, action
.type
);
3557 /* Peer group member updates. */
3558 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3560 group
= peer
->group
;
3562 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3564 if (! peer
->af_group
[afi
][safi
])
3567 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3570 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3574 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3576 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3578 if (peer
->status
== Established
)
3580 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3581 bgp_clear_adj_in (peer
, afi
, safi
);
3584 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3585 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3586 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3587 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3588 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3589 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3590 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3591 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3593 peer_change_action (peer
, afi
, safi
, action
.type
);
3602 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3604 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
3608 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3610 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
3613 /* EBGP multihop configuration. */
3615 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
3617 struct peer_group
*group
;
3618 struct listnode
*node
, *nnode
;
3621 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
3624 /* see comment in peer_ttl_security_hops_set() */
3627 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3629 group
= peer
->group
;
3630 if (group
->conf
->gtsm_hops
!= 0)
3631 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3633 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
3635 if (peer1
->sort
== BGP_PEER_IBGP
)
3638 if (peer1
->gtsm_hops
!= 0)
3639 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3644 if (peer
->gtsm_hops
!= 0)
3645 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3651 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3653 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3655 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3656 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3657 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3659 bgp_session_reset(peer
);
3664 group
= peer
->group
;
3665 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3667 if (peer
->sort
== BGP_PEER_IBGP
)
3670 peer
->ttl
= group
->conf
->ttl
;
3672 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3673 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3674 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3676 bgp_session_reset(peer
);
3683 peer_ebgp_multihop_unset (struct peer
*peer
)
3685 struct peer_group
*group
;
3686 struct listnode
*node
, *nnode
;
3688 if (peer
->sort
== BGP_PEER_IBGP
)
3691 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3692 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3694 if (peer_group_active (peer
))
3695 peer
->ttl
= peer
->group
->conf
->ttl
;
3699 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3701 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3702 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3703 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3705 bgp_session_reset(peer
);
3709 group
= peer
->group
;
3710 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3712 if (peer
->sort
== BGP_PEER_IBGP
)
3719 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3720 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3721 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3723 bgp_session_reset(peer
);
3730 /* Neighbor description. */
3732 peer_description_set (struct peer
*peer
, char *desc
)
3735 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3737 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3743 peer_description_unset (struct peer
*peer
)
3746 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3753 /* Neighbor update-source. */
3755 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3757 struct peer_group
*group
;
3758 struct listnode
*node
, *nnode
;
3760 if (peer
->update_if
)
3762 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3763 && strcmp (peer
->update_if
, ifname
) == 0)
3766 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3767 peer
->update_if
= NULL
;
3770 if (peer
->update_source
)
3772 sockunion_free (peer
->update_source
);
3773 peer
->update_source
= NULL
;
3776 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3778 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3780 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3782 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3783 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3784 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3787 bgp_session_reset(peer
);
3791 /* peer-group member updates. */
3792 group
= peer
->group
;
3793 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3795 if (peer
->update_if
)
3797 if (strcmp (peer
->update_if
, ifname
) == 0)
3800 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3801 peer
->update_if
= NULL
;
3804 if (peer
->update_source
)
3806 sockunion_free (peer
->update_source
);
3807 peer
->update_source
= NULL
;
3810 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3812 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3814 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3815 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3816 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3819 bgp_session_reset(peer
);
3825 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3827 struct peer_group
*group
;
3828 struct listnode
*node
, *nnode
;
3830 if (peer
->update_source
)
3832 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3833 && sockunion_cmp (peer
->update_source
, su
) == 0)
3835 sockunion_free (peer
->update_source
);
3836 peer
->update_source
= NULL
;
3839 if (peer
->update_if
)
3841 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3842 peer
->update_if
= NULL
;
3846 peer
->update_source
= sockunion_dup (su
);
3848 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3850 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3852 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3853 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3854 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3857 bgp_session_reset(peer
);
3861 /* peer-group member updates. */
3862 group
= peer
->group
;
3863 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3865 if (peer
->update_source
)
3867 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3869 sockunion_free (peer
->update_source
);
3870 peer
->update_source
= NULL
;
3873 if (peer
->update_if
)
3875 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3876 peer
->update_if
= NULL
;
3879 peer
->update_source
= sockunion_dup (su
);
3881 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3883 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3884 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3885 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3888 bgp_session_reset(peer
);
3894 peer_update_source_unset (struct peer
*peer
)
3896 union sockunion
*su
;
3897 struct peer_group
*group
;
3898 struct listnode
*node
, *nnode
;
3900 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3901 && ! peer
->update_source
3902 && ! peer
->update_if
)
3905 if (peer
->update_source
)
3907 sockunion_free (peer
->update_source
);
3908 peer
->update_source
= NULL
;
3910 if (peer
->update_if
)
3912 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3913 peer
->update_if
= NULL
;
3916 if (peer_group_active (peer
))
3918 group
= peer
->group
;
3920 if (group
->conf
->update_source
)
3922 su
= sockunion_dup (group
->conf
->update_source
);
3923 peer
->update_source
= su
;
3925 else if (group
->conf
->update_if
)
3927 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3930 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
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
);
3943 /* peer-group member updates. */
3944 group
= peer
->group
;
3945 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3947 if (! peer
->update_source
&& ! peer
->update_if
)
3950 if (peer
->update_source
)
3952 sockunion_free (peer
->update_source
);
3953 peer
->update_source
= NULL
;
3956 if (peer
->update_if
)
3958 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3959 peer
->update_if
= NULL
;
3962 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3964 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3965 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3966 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3969 bgp_session_reset(peer
);
3975 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3978 struct peer_group
*group
;
3979 struct listnode
*node
, *nnode
;
3981 /* Adress family must be activated. */
3982 if (! peer
->afc
[afi
][safi
])
3983 return BGP_ERR_PEER_INACTIVE
;
3985 /* Default originate can't be used for peer group memeber. */
3986 if (peer_is_group_member (peer
, afi
, safi
))
3987 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3989 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3990 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3991 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3993 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3997 if (peer
->default_rmap
[afi
][safi
].name
)
3998 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
3999 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4000 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4004 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4006 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4007 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4008 bgp_default_originate (peer
, afi
, safi
, 0);
4009 bgp_announce_route (peer
, afi
, safi
);
4014 /* peer-group member updates. */
4015 group
= peer
->group
;
4016 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4018 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4022 if (peer
->default_rmap
[afi
][safi
].name
)
4023 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4024 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4025 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4028 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4029 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4030 bgp_default_originate (peer
, afi
, safi
, 0);
4031 bgp_announce_route (peer
, afi
, safi
);
4038 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4040 struct peer_group
*group
;
4041 struct listnode
*node
, *nnode
;
4043 /* Adress family must be activated. */
4044 if (! peer
->afc
[afi
][safi
])
4045 return BGP_ERR_PEER_INACTIVE
;
4047 /* Default originate can't be used for peer group memeber. */
4048 if (peer_is_group_member (peer
, afi
, safi
))
4049 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4051 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
4053 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4055 if (peer
->default_rmap
[afi
][safi
].name
)
4056 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4057 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4058 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4061 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4063 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4064 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4065 bgp_default_originate (peer
, afi
, safi
, 1);
4066 bgp_announce_route (peer
, afi
, safi
);
4071 /* peer-group member updates. */
4072 group
= peer
->group
;
4073 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4075 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4077 if (peer
->default_rmap
[afi
][safi
].name
)
4078 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4079 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4080 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4082 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4083 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4084 bgp_default_originate (peer
, afi
, safi
, 1);
4085 bgp_announce_route (peer
, afi
, safi
);
4092 peer_port_set (struct peer
*peer
, u_int16_t port
)
4099 peer_port_unset (struct peer
*peer
)
4101 peer
->port
= BGP_PORT_DEFAULT
;
4105 /* neighbor weight. */
4107 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
4109 struct peer_group
*group
;
4110 struct listnode
*node
, *nnode
;
4112 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4113 peer
->weight
= weight
;
4115 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4118 /* peer-group member updates. */
4119 group
= peer
->group
;
4120 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4122 peer
->weight
= group
->conf
->weight
;
4127 peer_weight_unset (struct peer
*peer
)
4129 struct peer_group
*group
;
4130 struct listnode
*node
, *nnode
;
4132 /* Set default weight. */
4133 if (peer_group_active (peer
))
4134 peer
->weight
= peer
->group
->conf
->weight
;
4138 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4140 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4143 /* peer-group member updates. */
4144 group
= peer
->group
;
4145 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4153 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
4155 struct peer_group
*group
;
4156 struct listnode
*node
, *nnode
;
4158 /* Not for peer group memeber. */
4159 if (peer_group_active (peer
))
4160 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4162 /* keepalive value check. */
4163 if (keepalive
> 65535)
4164 return BGP_ERR_INVALID_VALUE
;
4166 /* Holdtime value check. */
4167 if (holdtime
> 65535)
4168 return BGP_ERR_INVALID_VALUE
;
4170 /* Holdtime value must be either 0 or greater than 3. */
4171 if (holdtime
< 3 && holdtime
!= 0)
4172 return BGP_ERR_INVALID_VALUE
;
4174 /* Set value to the configuration. */
4175 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4176 peer
->holdtime
= holdtime
;
4177 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
4179 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4182 /* peer-group member updates. */
4183 group
= peer
->group
;
4184 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4186 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4187 peer
->holdtime
= group
->conf
->holdtime
;
4188 peer
->keepalive
= group
->conf
->keepalive
;
4194 peer_timers_unset (struct peer
*peer
)
4196 struct peer_group
*group
;
4197 struct listnode
*node
, *nnode
;
4199 if (peer_group_active (peer
))
4200 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4202 /* Clear configuration. */
4203 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4204 peer
->keepalive
= 0;
4207 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4210 /* peer-group member updates. */
4211 group
= peer
->group
;
4212 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4214 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4216 peer
->keepalive
= 0;
4223 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
4225 struct peer_group
*group
;
4226 struct listnode
*node
, *nnode
;
4228 if (peer_group_active (peer
))
4229 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4231 if (connect
> 65535)
4232 return BGP_ERR_INVALID_VALUE
;
4234 /* Set value to the configuration. */
4235 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4236 peer
->connect
= connect
;
4238 /* Set value to timer setting. */
4239 peer
->v_connect
= connect
;
4241 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4244 /* peer-group member updates. */
4245 group
= peer
->group
;
4246 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4248 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4249 peer
->connect
= connect
;
4250 peer
->v_connect
= connect
;
4256 peer_timers_connect_unset (struct peer
*peer
)
4258 struct peer_group
*group
;
4259 struct listnode
*node
, *nnode
;
4261 if (peer_group_active (peer
))
4262 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4264 /* Clear configuration. */
4265 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4268 /* Set timer setting to default value. */
4269 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4271 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4274 /* peer-group member updates. */
4275 group
= peer
->group
;
4276 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4278 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4280 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4286 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
4288 struct peer_group
*group
;
4289 struct listnode
*node
, *nnode
;
4291 if (peer_group_active (peer
))
4292 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4295 return BGP_ERR_INVALID_VALUE
;
4297 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4298 peer
->routeadv
= routeadv
;
4299 peer
->v_routeadv
= routeadv
;
4301 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4302 update_group_adjust_peer_afs (peer
);
4303 if (peer
->status
== Established
)
4304 bgp_announce_route_all (peer
);
4308 /* peer-group member updates. */
4309 group
= peer
->group
;
4310 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4312 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4313 peer
->routeadv
= routeadv
;
4314 peer
->v_routeadv
= routeadv
;
4315 update_group_adjust_peer_afs (peer
);
4316 if (peer
->status
== Established
)
4317 bgp_announce_route_all (peer
);
4324 peer_advertise_interval_unset (struct peer
*peer
)
4326 struct peer_group
*group
;
4327 struct listnode
*node
, *nnode
;
4329 if (peer_group_active (peer
))
4330 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4332 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4335 if (peer
->sort
== BGP_PEER_IBGP
)
4336 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4338 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4340 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4341 update_group_adjust_peer_afs (peer
);
4342 if (peer
->status
== Established
)
4343 bgp_announce_route_all (peer
);
4347 /* peer-group member updates. */
4348 group
= peer
->group
;
4349 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4351 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4354 if (peer
->sort
== BGP_PEER_IBGP
)
4355 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4357 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4359 update_group_adjust_peer_afs (peer
);
4360 if (peer
->status
== Established
)
4361 bgp_announce_route_all (peer
);
4367 /* neighbor interface */
4369 peer_interface_set (struct peer
*peer
, const char *str
)
4372 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
4373 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
4377 peer_interface_unset (struct peer
*peer
)
4380 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
4381 peer
->ifname
= NULL
;
4386 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
4388 struct peer_group
*group
;
4389 struct listnode
*node
, *nnode
;
4391 if (allow_num
< 1 || allow_num
> 10)
4392 return BGP_ERR_INVALID_VALUE
;
4394 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4396 peer
->allowas_in
[afi
][safi
] = allow_num
;
4397 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4398 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4401 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4404 group
= peer
->group
;
4405 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4407 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4409 peer
->allowas_in
[afi
][safi
] = allow_num
;
4410 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4411 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4419 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4421 struct peer_group
*group
;
4422 struct listnode
*node
, *nnode
;
4424 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4426 peer
->allowas_in
[afi
][safi
] = 0;
4427 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4430 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4433 group
= peer
->group
;
4434 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4436 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4438 peer
->allowas_in
[afi
][safi
] = 0;
4439 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4446 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
4448 struct bgp
*bgp
= peer
->bgp
;
4449 struct peer_group
*group
;
4450 struct listnode
*node
, *nnode
;
4452 if (peer_sort (peer
) != BGP_PEER_EBGP
4453 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
4454 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
4457 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
4459 if (peer_group_active (peer
))
4460 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4463 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
4465 if (peer
->change_local_as
== as
&&
4466 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
4467 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
4468 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
4469 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
4472 peer
->change_local_as
= as
;
4474 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4476 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4479 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4481 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4483 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4485 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4487 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4488 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4489 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4492 bgp_session_reset(peer
);
4496 group
= peer
->group
;
4497 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4499 peer
->change_local_as
= as
;
4501 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4503 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4506 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4508 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4510 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4512 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4513 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4514 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4517 BGP_EVENT_ADD (peer
, BGP_Stop
);
4524 peer_local_as_unset (struct peer
*peer
)
4526 struct peer_group
*group
;
4527 struct listnode
*node
, *nnode
;
4529 if (peer_group_active (peer
))
4530 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4532 if (! peer
->change_local_as
)
4535 peer
->change_local_as
= 0;
4536 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4537 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4539 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4541 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4543 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4544 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4545 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4548 BGP_EVENT_ADD (peer
, BGP_Stop
);
4553 group
= peer
->group
;
4554 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4556 peer
->change_local_as
= 0;
4557 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4558 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4560 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4562 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4563 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4564 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4567 bgp_session_reset(peer
);
4572 /* Set password for authenticating with the peer. */
4574 peer_password_set (struct peer
*peer
, const char *password
)
4576 struct listnode
*nn
, *nnode
;
4577 int len
= password
? strlen(password
) : 0;
4578 int ret
= BGP_SUCCESS
;
4580 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
4581 return BGP_ERR_INVALID_VALUE
;
4583 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
4584 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4588 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4590 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
4592 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4594 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4595 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4597 bgp_session_reset(peer
);
4599 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
4602 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4604 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
4608 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4610 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
4612 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4613 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4615 bgp_session_reset(peer
);
4617 if (bgp_md5_set (peer
) < 0)
4618 ret
= BGP_ERR_TCPSIG_FAILED
;
4625 peer_password_unset (struct peer
*peer
)
4627 struct listnode
*nn
, *nnode
;
4630 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4633 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4635 if (peer_group_active (peer
)
4636 && peer
->group
->conf
->password
4637 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
4638 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
4640 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4641 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4643 bgp_session_reset(peer
);
4646 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4648 peer
->password
= NULL
;
4655 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4656 peer
->password
= NULL
;
4658 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4660 if (!peer
->password
)
4663 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4664 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4666 bgp_session_reset(peer
);
4668 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4669 peer
->password
= NULL
;
4678 * Helper function that is called after the name of the policy
4679 * being used by a peer has changed (AF specific). Automatically
4680 * initiates inbound or outbound processing as needed.
4683 peer_on_policy_change (struct peer
*peer
, afi_t afi
, safi_t safi
, int outbound
)
4687 update_group_adjust_peer (peer_af_find (peer
, afi
, safi
));
4688 if (peer
->status
== Established
)
4689 bgp_announce_route(peer
, afi
, safi
);
4693 if (peer
->status
!= Established
)
4696 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4697 bgp_soft_reconfig_in (peer
, afi
, safi
);
4698 else if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4699 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4700 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4705 /* Set distribute list to the peer. */
4707 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4710 struct bgp_filter
*filter
;
4711 struct peer_group
*group
;
4712 struct listnode
*node
, *nnode
;
4714 if (! peer
->afc
[afi
][safi
])
4715 return BGP_ERR_PEER_INACTIVE
;
4717 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4718 return BGP_ERR_INVALID_VALUE
;
4720 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4721 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4723 filter
= &peer
->filter
[afi
][safi
];
4725 if (filter
->plist
[direct
].name
)
4726 return BGP_ERR_PEER_FILTER_CONFLICT
;
4728 if (filter
->dlist
[direct
].name
)
4729 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4730 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4731 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4733 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4735 peer_on_policy_change(peer
, afi
, safi
,
4736 (direct
== FILTER_OUT
) ? 1 : 0);
4740 group
= peer
->group
;
4741 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4743 filter
= &peer
->filter
[afi
][safi
];
4745 if (! peer
->af_group
[afi
][safi
])
4748 if (filter
->dlist
[direct
].name
)
4749 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4750 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4751 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4752 peer_on_policy_change(peer
, afi
, safi
,
4753 (direct
== FILTER_OUT
) ? 1 : 0);
4760 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4762 struct bgp_filter
*filter
;
4763 struct bgp_filter
*gfilter
;
4764 struct peer_group
*group
;
4765 struct listnode
*node
, *nnode
;
4767 if (! peer
->afc
[afi
][safi
])
4768 return BGP_ERR_PEER_INACTIVE
;
4770 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4771 return BGP_ERR_INVALID_VALUE
;
4773 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4774 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4776 filter
= &peer
->filter
[afi
][safi
];
4778 /* apply peer-group filter */
4779 if (peer
->af_group
[afi
][safi
])
4781 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4783 if (gfilter
->dlist
[direct
].name
)
4785 if (filter
->dlist
[direct
].name
)
4786 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4787 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[direct
].name
);
4788 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4789 peer_on_policy_change(peer
, afi
, safi
,
4790 (direct
== FILTER_OUT
) ? 1 : 0);
4795 if (filter
->dlist
[direct
].name
)
4796 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4797 filter
->dlist
[direct
].name
= NULL
;
4798 filter
->dlist
[direct
].alist
= NULL
;
4800 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4802 peer_on_policy_change(peer
, afi
, safi
,
4803 (direct
== FILTER_OUT
) ? 1 : 0);
4807 group
= peer
->group
;
4808 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4810 filter
= &peer
->filter
[afi
][safi
];
4812 if (! peer
->af_group
[afi
][safi
])
4815 if (filter
->dlist
[direct
].name
)
4816 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4817 filter
->dlist
[direct
].name
= NULL
;
4818 filter
->dlist
[direct
].alist
= NULL
;
4819 peer_on_policy_change(peer
, afi
, safi
,
4820 (direct
== FILTER_OUT
) ? 1 : 0);
4826 /* Update distribute list. */
4828 peer_distribute_update (struct access_list
*access
)
4833 struct listnode
*mnode
, *mnnode
;
4834 struct listnode
*node
, *nnode
;
4837 struct peer_group
*group
;
4838 struct bgp_filter
*filter
;
4840 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4843 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, access
->name
,
4845 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4847 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4848 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4850 filter
= &peer
->filter
[afi
][safi
];
4852 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4854 if (filter
->dlist
[direct
].name
)
4855 filter
->dlist
[direct
].alist
=
4856 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4858 filter
->dlist
[direct
].alist
= NULL
;
4862 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4864 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4865 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4867 filter
= &group
->conf
->filter
[afi
][safi
];
4869 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4871 if (filter
->dlist
[direct
].name
)
4872 filter
->dlist
[direct
].alist
=
4873 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4875 filter
->dlist
[direct
].alist
= NULL
;
4882 /* Set prefix list to the peer. */
4884 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4887 struct bgp_filter
*filter
;
4888 struct peer_group
*group
;
4889 struct listnode
*node
, *nnode
;
4891 if (! peer
->afc
[afi
][safi
])
4892 return BGP_ERR_PEER_INACTIVE
;
4894 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4895 return BGP_ERR_INVALID_VALUE
;
4897 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4898 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4900 filter
= &peer
->filter
[afi
][safi
];
4902 if (filter
->dlist
[direct
].name
)
4903 return BGP_ERR_PEER_FILTER_CONFLICT
;
4905 if (filter
->plist
[direct
].name
)
4906 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4907 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4908 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4910 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4912 peer_on_policy_change(peer
, afi
, safi
,
4913 (direct
== FILTER_OUT
) ? 1 : 0);
4917 group
= peer
->group
;
4918 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4920 filter
= &peer
->filter
[afi
][safi
];
4922 if (! peer
->af_group
[afi
][safi
])
4925 if (filter
->plist
[direct
].name
)
4926 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4927 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4928 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4929 peer_on_policy_change(peer
, afi
, safi
,
4930 (direct
== FILTER_OUT
) ? 1 : 0);
4936 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4938 struct bgp_filter
*filter
;
4939 struct bgp_filter
*gfilter
;
4940 struct peer_group
*group
;
4941 struct listnode
*node
, *nnode
;
4943 if (! peer
->afc
[afi
][safi
])
4944 return BGP_ERR_PEER_INACTIVE
;
4946 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4947 return BGP_ERR_INVALID_VALUE
;
4949 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4950 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4952 filter
= &peer
->filter
[afi
][safi
];
4954 /* apply peer-group filter */
4955 if (peer
->af_group
[afi
][safi
])
4957 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4959 if (gfilter
->plist
[direct
].name
)
4961 if (filter
->plist
[direct
].name
)
4962 XSTRDUP(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4963 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[direct
].name
);
4964 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
4965 peer_on_policy_change(peer
, afi
, safi
,
4966 (direct
== FILTER_OUT
) ? 1 : 0);
4971 if (filter
->plist
[direct
].name
)
4972 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4973 filter
->plist
[direct
].name
= NULL
;
4974 filter
->plist
[direct
].plist
= NULL
;
4976 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4978 peer_on_policy_change(peer
, afi
, safi
,
4979 (direct
== FILTER_OUT
) ? 1 : 0);
4983 group
= peer
->group
;
4984 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4986 filter
= &peer
->filter
[afi
][safi
];
4988 if (! peer
->af_group
[afi
][safi
])
4991 if (filter
->plist
[direct
].name
)
4992 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
4993 filter
->plist
[direct
].name
= NULL
;
4994 filter
->plist
[direct
].plist
= NULL
;
4995 peer_on_policy_change(peer
, afi
, safi
,
4996 (direct
== FILTER_OUT
) ? 1 : 0);
5002 /* Update prefix-list list. */
5004 peer_prefix_list_update (struct prefix_list
*plist
)
5006 struct listnode
*mnode
, *mnnode
;
5007 struct listnode
*node
, *nnode
;
5010 struct peer_group
*group
;
5011 struct bgp_filter
*filter
;
5016 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5020 * Update the prefix-list on update groups.
5022 update_group_policy_update(bgp
, BGP_POLICY_PREFIX_LIST
,
5023 plist
? plist
->name
: NULL
, 0, 0);
5025 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5027 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5028 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5030 filter
= &peer
->filter
[afi
][safi
];
5032 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5034 if (filter
->plist
[direct
].name
)
5035 filter
->plist
[direct
].plist
=
5036 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5038 filter
->plist
[direct
].plist
= NULL
;
5042 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5044 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5045 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5047 filter
= &group
->conf
->filter
[afi
][safi
];
5049 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5051 if (filter
->plist
[direct
].name
)
5052 filter
->plist
[direct
].plist
=
5053 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5055 filter
->plist
[direct
].plist
= NULL
;
5063 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5066 struct bgp_filter
*filter
;
5067 struct peer_group
*group
;
5068 struct listnode
*node
, *nnode
;
5070 if (! peer
->afc
[afi
][safi
])
5071 return BGP_ERR_PEER_INACTIVE
;
5073 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5074 return BGP_ERR_INVALID_VALUE
;
5076 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5077 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5079 filter
= &peer
->filter
[afi
][safi
];
5081 if (filter
->aslist
[direct
].name
)
5082 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5083 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5084 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5086 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5088 peer_on_policy_change(peer
, afi
, safi
,
5089 (direct
== FILTER_OUT
) ? 1 : 0);
5093 group
= peer
->group
;
5094 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5096 filter
= &peer
->filter
[afi
][safi
];
5098 if (! peer
->af_group
[afi
][safi
])
5101 if (filter
->aslist
[direct
].name
)
5102 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5103 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5104 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5105 peer_on_policy_change(peer
, afi
, safi
,
5106 (direct
== FILTER_OUT
) ? 1 : 0);
5112 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
5114 struct bgp_filter
*filter
;
5115 struct bgp_filter
*gfilter
;
5116 struct peer_group
*group
;
5117 struct listnode
*node
, *nnode
;
5119 if (! peer
->afc
[afi
][safi
])
5120 return BGP_ERR_PEER_INACTIVE
;
5122 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5123 return BGP_ERR_INVALID_VALUE
;
5125 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5126 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5128 filter
= &peer
->filter
[afi
][safi
];
5130 /* apply peer-group filter */
5131 if (peer
->af_group
[afi
][safi
])
5133 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5135 if (gfilter
->aslist
[direct
].name
)
5137 if (filter
->aslist
[direct
].name
)
5138 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5139 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[direct
].name
);
5140 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
5141 peer_on_policy_change(peer
, afi
, safi
,
5142 (direct
== FILTER_OUT
) ? 1 : 0);
5147 if (filter
->aslist
[direct
].name
)
5148 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5149 filter
->aslist
[direct
].name
= NULL
;
5150 filter
->aslist
[direct
].aslist
= NULL
;
5152 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5154 peer_on_policy_change(peer
, afi
, safi
,
5155 (direct
== FILTER_OUT
) ? 1 : 0);
5159 group
= peer
->group
;
5160 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5162 filter
= &peer
->filter
[afi
][safi
];
5164 if (! peer
->af_group
[afi
][safi
])
5167 if (filter
->aslist
[direct
].name
)
5168 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5169 filter
->aslist
[direct
].name
= NULL
;
5170 filter
->aslist
[direct
].aslist
= NULL
;
5171 peer_on_policy_change(peer
, afi
, safi
,
5172 (direct
== FILTER_OUT
) ? 1 : 0);
5179 peer_aslist_update (const char *aslist_name
)
5184 struct listnode
*mnode
, *mnnode
;
5185 struct listnode
*node
, *nnode
;
5188 struct peer_group
*group
;
5189 struct bgp_filter
*filter
;
5191 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5193 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, aslist_name
,
5196 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5198 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5199 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5201 filter
= &peer
->filter
[afi
][safi
];
5203 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5205 if (filter
->aslist
[direct
].name
)
5206 filter
->aslist
[direct
].aslist
=
5207 as_list_lookup (filter
->aslist
[direct
].name
);
5209 filter
->aslist
[direct
].aslist
= NULL
;
5213 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5215 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5216 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5218 filter
= &group
->conf
->filter
[afi
][safi
];
5220 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5222 if (filter
->aslist
[direct
].name
)
5223 filter
->aslist
[direct
].aslist
=
5224 as_list_lookup (filter
->aslist
[direct
].name
);
5226 filter
->aslist
[direct
].aslist
= NULL
;
5234 peer_aslist_add (char *aslist_name
)
5236 peer_aslist_update (aslist_name
);
5237 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
5241 peer_aslist_del (const char *aslist_name
)
5243 peer_aslist_update (aslist_name
);
5244 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
5249 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5252 struct bgp_filter
*filter
;
5253 struct peer_group
*group
;
5254 struct listnode
*node
, *nnode
;
5256 if (! peer
->afc
[afi
][safi
])
5257 return BGP_ERR_PEER_INACTIVE
;
5259 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5260 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5261 return BGP_ERR_INVALID_VALUE
;
5263 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5264 && peer_is_group_member (peer
, afi
, safi
))
5265 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5267 filter
= &peer
->filter
[afi
][safi
];
5269 if (filter
->map
[direct
].name
)
5270 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5272 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5273 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5275 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5277 peer_on_policy_change(peer
, afi
, safi
,
5278 (direct
== RMAP_OUT
) ? 1 : 0);
5282 group
= peer
->group
;
5283 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5285 filter
= &peer
->filter
[afi
][safi
];
5287 if (! peer
->af_group
[afi
][safi
])
5290 if (filter
->map
[direct
].name
)
5291 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5292 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5293 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5294 peer_on_policy_change(peer
, afi
, safi
,
5295 (direct
== RMAP_OUT
) ? 1 : 0);
5300 /* Unset route-map from the peer. */
5302 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5304 struct bgp_filter
*filter
;
5305 struct bgp_filter
*gfilter
;
5306 struct peer_group
*group
;
5307 struct listnode
*node
, *nnode
;
5309 if (! peer
->afc
[afi
][safi
])
5310 return BGP_ERR_PEER_INACTIVE
;
5312 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5313 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5314 return BGP_ERR_INVALID_VALUE
;
5316 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5317 && peer_is_group_member (peer
, afi
, safi
))
5318 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5320 filter
= &peer
->filter
[afi
][safi
];
5322 /* apply peer-group filter */
5323 if (peer
->af_group
[afi
][safi
])
5325 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5327 if (gfilter
->map
[direct
].name
)
5329 if (filter
->map
[direct
].name
)
5330 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5331 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[direct
].name
);
5332 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
5333 peer_on_policy_change(peer
, afi
, safi
,
5334 (direct
== RMAP_OUT
) ? 1 : 0);
5339 if (filter
->map
[direct
].name
)
5340 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5341 filter
->map
[direct
].name
= NULL
;
5342 filter
->map
[direct
].map
= NULL
;
5344 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5346 peer_on_policy_change(peer
, afi
, safi
,
5347 (direct
== RMAP_OUT
) ? 1 : 0);
5351 group
= peer
->group
;
5352 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5354 filter
= &peer
->filter
[afi
][safi
];
5356 if (! peer
->af_group
[afi
][safi
])
5359 if (filter
->map
[direct
].name
)
5360 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5361 filter
->map
[direct
].name
= NULL
;
5362 filter
->map
[direct
].map
= NULL
;
5363 peer_on_policy_change(peer
, afi
, safi
,
5364 (direct
== RMAP_OUT
) ? 1 : 0);
5369 /* Set unsuppress-map to the peer. */
5371 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5374 struct bgp_filter
*filter
;
5375 struct peer_group
*group
;
5376 struct listnode
*node
, *nnode
;
5378 if (! peer
->afc
[afi
][safi
])
5379 return BGP_ERR_PEER_INACTIVE
;
5381 if (peer_is_group_member (peer
, afi
, safi
))
5382 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5384 filter
= &peer
->filter
[afi
][safi
];
5386 if (filter
->usmap
.name
)
5387 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5389 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5390 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5392 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5394 peer_on_policy_change(peer
, afi
, safi
, 1);
5398 group
= peer
->group
;
5399 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5401 filter
= &peer
->filter
[afi
][safi
];
5403 if (! peer
->af_group
[afi
][safi
])
5406 if (filter
->usmap
.name
)
5407 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5408 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5409 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5410 peer_on_policy_change(peer
, afi
, safi
, 1);
5415 /* Unset route-map from the peer. */
5417 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5419 struct bgp_filter
*filter
;
5420 struct peer_group
*group
;
5421 struct listnode
*node
, *nnode
;
5423 if (! peer
->afc
[afi
][safi
])
5424 return BGP_ERR_PEER_INACTIVE
;
5426 if (peer_is_group_member (peer
, afi
, safi
))
5427 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5429 filter
= &peer
->filter
[afi
][safi
];
5431 if (filter
->usmap
.name
)
5432 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5433 filter
->usmap
.name
= NULL
;
5434 filter
->usmap
.map
= NULL
;
5436 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5438 peer_on_policy_change(peer
, afi
, safi
, 1);
5442 group
= peer
->group
;
5443 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5445 filter
= &peer
->filter
[afi
][safi
];
5447 if (! peer
->af_group
[afi
][safi
])
5450 if (filter
->usmap
.name
)
5451 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5452 filter
->usmap
.name
= NULL
;
5453 filter
->usmap
.map
= NULL
;
5454 peer_on_policy_change(peer
, afi
, safi
, 1);
5460 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5461 u_int32_t max
, u_char threshold
,
5462 int warning
, u_int16_t restart
)
5464 struct peer_group
*group
;
5465 struct listnode
*node
, *nnode
;
5467 if (! peer
->afc
[afi
][safi
])
5468 return BGP_ERR_PEER_INACTIVE
;
5470 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5471 peer
->pmax
[afi
][safi
] = max
;
5472 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5473 peer
->pmax_restart
[afi
][safi
] = restart
;
5475 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5477 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5479 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5481 group
= peer
->group
;
5482 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5484 if (! peer
->af_group
[afi
][safi
])
5487 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5488 peer
->pmax
[afi
][safi
] = max
;
5489 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5490 peer
->pmax_restart
[afi
][safi
] = restart
;
5492 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5494 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5496 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5497 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5502 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5503 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5510 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5512 struct peer_group
*group
;
5513 struct listnode
*node
, *nnode
;
5515 if (! peer
->afc
[afi
][safi
])
5516 return BGP_ERR_PEER_INACTIVE
;
5518 /* apply peer-group config */
5519 if (peer
->af_group
[afi
][safi
])
5521 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5522 PEER_FLAG_MAX_PREFIX
))
5523 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5525 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5527 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5528 PEER_FLAG_MAX_PREFIX_WARNING
))
5529 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5531 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5533 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
5534 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
5535 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
5539 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5540 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5541 peer
->pmax
[afi
][safi
] = 0;
5542 peer
->pmax_threshold
[afi
][safi
] = 0;
5543 peer
->pmax_restart
[afi
][safi
] = 0;
5545 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5548 group
= peer
->group
;
5549 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5551 if (! peer
->af_group
[afi
][safi
])
5554 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5555 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5556 peer
->pmax
[afi
][safi
] = 0;
5557 peer
->pmax_threshold
[afi
][safi
] = 0;
5558 peer
->pmax_restart
[afi
][safi
] = 0;
5563 int is_ebgp_multihop_configured (struct peer
*peer
)
5565 struct peer_group
*group
;
5566 struct listnode
*node
, *nnode
;
5569 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5571 group
= peer
->group
;
5572 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5573 (group
->conf
->ttl
!= 1))
5576 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
5578 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
5585 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5592 /* Set # of hops between us and BGP peer. */
5594 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
5596 struct peer_group
*group
;
5597 struct listnode
*node
, *nnode
;
5600 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
5602 /* We cannot configure ttl-security hops when ebgp-multihop is already
5603 set. For non peer-groups, the check is simple. For peer-groups, it's
5604 slightly messy, because we need to check both the peer-group structure
5605 and all peer-group members for any trace of ebgp-multihop configuration
5606 before actually applying the ttl-security rules. Cisco really made a
5607 mess of this configuration parameter, and OpenBGPD got it right.
5610 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
))
5612 if (is_ebgp_multihop_configured (peer
))
5613 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
5615 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5617 peer
->gtsm_hops
= gtsm_hops
;
5619 /* Calling ebgp multihop also resets the session.
5620 * On restart, NHT will get setup correctly as will the
5621 * min & max ttls on the socket. The return value is
5624 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5631 group
= peer
->group
;
5632 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5634 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5636 /* Calling ebgp multihop also resets the session.
5637 * On restart, NHT will get setup correctly as will the
5638 * min & max ttls on the socket. The return value is
5641 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5647 /* Post the first gtsm setup or if its ibgp, maxttl setting isn't
5648 * necessary, just set the minttl.
5650 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5652 peer
->gtsm_hops
= gtsm_hops
;
5655 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5656 MAXTTL
+ 1 - gtsm_hops
);
5657 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5658 (peer
->doppelganger
->fd
>= 0))
5659 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5660 MAXTTL
+ 1 - gtsm_hops
);
5664 group
= peer
->group
;
5665 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5667 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5669 /* Change setting of existing peer
5670 * established then change value (may break connectivity)
5671 * not established yet (teardown session and restart)
5672 * no session then do nothing (will get handled by next connection)
5674 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
5675 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5676 MAXTTL
+ 1 - peer
->gtsm_hops
);
5677 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5678 (peer
->doppelganger
->fd
>= 0))
5679 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5680 MAXTTL
+ 1 - gtsm_hops
);
5690 peer_ttl_security_hops_unset (struct peer
*peer
)
5692 struct peer_group
*group
;
5693 struct listnode
*node
, *nnode
;
5696 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
5698 /* if a peer-group member, then reset to peer-group default rather than 0 */
5699 if (peer_group_active (peer
))
5700 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
5702 peer
->gtsm_hops
= 0;
5704 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5706 /* Invoking ebgp_multihop_set will set the TTL back to the original
5707 * value as well as restting the NHT and such. The session is reset.
5709 if (peer
->sort
== BGP_PEER_EBGP
)
5710 ret
= peer_ebgp_multihop_unset (peer
);
5714 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5716 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5717 (peer
->doppelganger
->fd
>= 0))
5718 sockopt_minttl (peer
->su
.sa
.sa_family
,
5719 peer
->doppelganger
->fd
, 0);
5724 group
= peer
->group
;
5725 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5727 peer
->gtsm_hops
= 0;
5728 if (peer
->sort
== BGP_PEER_EBGP
)
5729 ret
= peer_ebgp_multihop_unset (peer
);
5733 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5735 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5736 (peer
->doppelganger
->fd
>= 0))
5737 sockopt_minttl (peer
->su
.sa
.sa_family
,
5738 peer
->doppelganger
->fd
, 0);
5747 * If peer clear is invoked in a loop for all peers on the BGP instance,
5748 * it may end up freeing the doppelganger, and if this was the next node
5749 * to the current node, we would end up accessing the freed next node.
5750 * Pass along additional parameter which can be updated if next node
5751 * is freed; only required when walking the peer list on BGP instance.
5754 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
5756 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5758 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
5760 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
5761 if (peer
->t_pmax_restart
)
5763 BGP_TIMER_OFF (peer
->t_pmax_restart
);
5764 if (bgp_debug_neighbor_events(peer
))
5765 zlog_debug ("%s Maximum-prefix restart timer canceled",
5768 BGP_EVENT_ADD (peer
, BGP_Start
);
5772 peer
->v_start
= BGP_INIT_START_TIMER
;
5773 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5774 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5775 BGP_NOTIFY_CEASE_ADMIN_RESET
);
5777 bgp_session_reset_safe(peer
, nnode
);
5783 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
5784 enum bgp_clear_type stype
)
5786 struct peer_af
*paf
;
5788 if (peer
->status
!= Established
)
5791 if (! peer
->afc
[afi
][safi
])
5792 return BGP_ERR_AF_UNCONFIGURED
;
5794 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
5796 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
5798 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
5799 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
5802 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
5804 /* Clear the "neighbor x.x.x.x default-originate" flag */
5805 paf
= peer_af_find (peer
, afi
, safi
);
5806 if (paf
&& paf
->subgroup
&&
5807 CHECK_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
5808 UNSET_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5810 bgp_announce_route (peer
, afi
, safi
);
5813 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5815 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
5816 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
5817 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5819 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
5822 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
5823 prefix_type
= ORF_TYPE_PREFIX
;
5825 prefix_type
= ORF_TYPE_PREFIX_OLD
;
5827 if (filter
->plist
[FILTER_IN
].plist
)
5829 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5830 bgp_route_refresh_send (peer
, afi
, safi
,
5831 prefix_type
, REFRESH_DEFER
, 1);
5832 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
5833 REFRESH_IMMEDIATE
, 0);
5837 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5838 bgp_route_refresh_send (peer
, afi
, safi
,
5839 prefix_type
, REFRESH_IMMEDIATE
, 1);
5841 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5847 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
5848 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5850 /* If neighbor has soft reconfiguration inbound flag.
5851 Use Adj-RIB-In database. */
5852 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5853 bgp_soft_reconfig_in (peer
, afi
, safi
);
5856 /* If neighbor has route refresh capability, send route refresh
5857 message to the peer. */
5858 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5859 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5860 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5862 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5868 /* Display peer uptime.*/
5869 /* XXX: why does this function return char * when it takes buffer? */
5871 peer_uptime (time_t uptime2
, char *buf
, size_t len
, u_char use_json
, json_object
*json
)
5876 /* Check buffer length. */
5877 if (len
< BGP_UPTIME_LEN
)
5881 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5882 /* XXX: should return status instead of buf... */
5883 snprintf (buf
, len
, "<error> ");
5888 /* If there is no connection has been done before print `never'. */
5892 json_object_string_add(json
, "peerUptime", "never");
5894 snprintf (buf
, len
, "never");
5898 /* Get current time. */
5899 uptime1
= bgp_clock ();
5901 tm
= gmtime (&uptime1
);
5903 /* Making formatted timer strings. */
5904 #define ONE_DAY_SECOND 60*60*24
5905 #define ONE_WEEK_SECOND 60*60*24*7
5910 int day_msec
= 86400000;
5911 int hour_msec
= 3600000;
5912 int minute_msec
= 60000;
5913 int sec_msec
= 1000;
5915 if (uptime1
< ONE_DAY_SECOND
)
5917 time_store
= hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
5918 json_object_int_add(json
, "peerUptimeMsec", time_store
);
5919 snprintf (buf
, len
, "%02d:%02d:%02d",
5920 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5922 else if (uptime1
< ONE_WEEK_SECOND
)
5924 time_store
= day_msec
* tm
->tm_yday
+ hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
5925 json_object_int_add(json
, "peerUptimeMsec", time_store
);
5926 snprintf (buf
, len
, "%dd%02dh%02dm",
5927 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5931 time_store
= day_msec
* tm
->tm_yday
+ hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
5932 json_object_int_add(json
, "peerUptimeMsec", time_store
);
5933 snprintf (buf
, len
, "%02dw%dd%02dh",
5934 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5939 if (uptime1
< ONE_DAY_SECOND
)
5940 snprintf (buf
, len
, "%02d:%02d:%02d",
5941 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5942 else if (uptime1
< ONE_WEEK_SECOND
)
5943 snprintf (buf
, len
, "%dd%02dh%02dm",
5944 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5946 snprintf (buf
, len
, "%02dw%dd%02dh",
5947 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5953 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
5954 afi_t afi
, safi_t safi
)
5956 struct bgp_filter
*filter
;
5957 struct bgp_filter
*gfilter
= NULL
;
5960 int out
= FILTER_OUT
;
5963 filter
= &peer
->filter
[afi
][safi
];
5964 if (peer
->af_group
[afi
][safi
])
5965 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5967 /* distribute-list. */
5968 if (filter
->dlist
[in
].name
)
5969 if (! gfilter
|| ! gfilter
->dlist
[in
].name
5970 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
5971 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
5972 filter
->dlist
[in
].name
, VTY_NEWLINE
);
5973 if (filter
->dlist
[out
].name
&& ! gfilter
)
5974 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
5975 filter
->dlist
[out
].name
, VTY_NEWLINE
);
5978 if (filter
->plist
[in
].name
)
5979 if (! gfilter
|| ! gfilter
->plist
[in
].name
5980 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
5981 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
5982 filter
->plist
[in
].name
, VTY_NEWLINE
);
5983 if (filter
->plist
[out
].name
&& ! gfilter
)
5984 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
5985 filter
->plist
[out
].name
, VTY_NEWLINE
);
5988 if (filter
->map
[RMAP_IN
].name
)
5989 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
5990 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
5991 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
5992 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
5993 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
5994 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
5995 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
5996 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
5997 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
5998 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
5999 if (filter
->map
[RMAP_EXPORT
].name
)
6000 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
6001 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
6002 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
6003 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
6004 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
6006 /* unsuppress-map */
6007 if (filter
->usmap
.name
&& ! gfilter
)
6008 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
6009 filter
->usmap
.name
, VTY_NEWLINE
);
6012 if (filter
->aslist
[in
].name
)
6013 if (! gfilter
|| ! gfilter
->aslist
[in
].name
6014 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
6015 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
6016 filter
->aslist
[in
].name
, VTY_NEWLINE
);
6017 if (filter
->aslist
[out
].name
&& ! gfilter
)
6018 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
6019 filter
->aslist
[out
].name
, VTY_NEWLINE
);
6022 /* BGP peer configuration display function. */
6024 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
6025 struct peer
*peer
, afi_t afi
, safi_t safi
)
6027 struct peer
*g_peer
= NULL
;
6028 char buf
[SU_ADDRSTRLEN
];
6031 /* Skip dynamic neighbors. */
6032 if (peer_dynamic_neighbor (peer
))
6036 addr
= peer
->conf_if
;
6040 if (peer_group_active (peer
))
6041 g_peer
= peer
->group
->conf
;
6043 /************************************
6044 ****** Global to the neighbor ******
6045 ************************************/
6046 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6050 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
6051 vty_out (vty
, " neighbor %s interface v6only %s", addr
, VTY_NEWLINE
);
6053 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
6057 if (! peer_group_active (peer
))
6059 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
6060 vty_out (vty
, " neighbor %s peer-group%s", addr
,
6062 if (peer
->as_type
== AS_SPECIFIED
)
6064 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6067 else if (peer
->as_type
== AS_INTERNAL
)
6069 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6071 else if (peer
->as_type
== AS_EXTERNAL
)
6073 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6080 if (peer
->as_type
== AS_SPECIFIED
)
6082 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6085 else if (peer
->as_type
== AS_INTERNAL
)
6087 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6089 else if (peer
->as_type
== AS_EXTERNAL
)
6091 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6094 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6095 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6096 peer
->group
->name
, VTY_NEWLINE
);
6100 if (peer
->change_local_as
)
6101 if (! peer_group_active (peer
))
6102 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
6103 peer
->change_local_as
,
6104 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
6106 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
6107 " replace-as" : "", VTY_NEWLINE
);
6111 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
6115 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6116 if (! peer_group_active (peer
) ||
6117 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
6118 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
6122 if (! peer_group_active (peer
) || ! g_peer
->bfd_info
)
6124 bgp_bfd_peer_config_write(vty
, peer
, addr
);
6129 if (!peer_group_active (peer
)
6130 || ! g_peer
->password
6131 || strcmp (peer
->password
, g_peer
->password
) != 0)
6132 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
6136 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
))
6137 if (!peer_group_active (peer
))
6138 vty_out (vty
, " neighbor %s solo%s", addr
, VTY_NEWLINE
);
6141 if (peer
->port
!= BGP_PORT_DEFAULT
)
6142 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
6145 /* Local interface name. */
6147 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
6151 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
6152 if (! peer_group_active (peer
) ||
6153 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
6154 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
6156 /* EBGP multihop. */
6157 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
6158 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
6159 if (! peer_group_active (peer
) ||
6160 g_peer
->ttl
!= peer
->ttl
)
6161 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
6164 /* ttl-security hops */
6165 if (peer
->gtsm_hops
!= 0)
6166 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
6167 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
6168 peer
->gtsm_hops
, VTY_NEWLINE
);
6170 /* disable-connected-check. */
6171 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6172 if (! peer_group_active (peer
) ||
6173 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6174 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
6176 /* Update-source. */
6177 if (peer
->update_if
)
6178 if (! peer_group_active (peer
) || ! g_peer
->update_if
6179 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
6180 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6181 peer
->update_if
, VTY_NEWLINE
);
6182 if (peer
->update_source
)
6183 if (! peer_group_active (peer
) || ! g_peer
->update_source
6184 || sockunion_cmp (g_peer
->update_source
,
6185 peer
->update_source
) != 0)
6186 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6187 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
6190 /* advertisement-interval */
6191 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
6192 ! peer_group_active (peer
))
6193 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
6194 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
6197 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
6198 && ! peer_group_active (peer
))
6199 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
6200 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
6202 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
6203 ! peer_group_active (peer
))
6204 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
6205 peer
->connect
, VTY_NEWLINE
);
6207 /* Default weight. */
6208 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
6209 if (! peer_group_active (peer
) ||
6210 g_peer
->weight
!= peer
->weight
)
6211 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
6214 /* Dynamic capability. */
6215 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6216 if (! peer_group_active (peer
) ||
6217 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6218 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
6221 /* Extended next-hop capability. */
6222 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6223 if (! peer_group_active (peer
) ||
6224 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6225 vty_out (vty
, " neighbor %s capability extended-nexthop%s", addr
,
6228 /* dont capability negotiation. */
6229 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6230 if (! peer_group_active (peer
) ||
6231 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6232 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
6235 /* override capability negotiation. */
6236 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6237 if (! peer_group_active (peer
) ||
6238 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6239 vty_out (vty
, " neighbor %s override-capability%s", addr
,
6242 /* strict capability negotiation. */
6243 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6244 if (! peer_group_active (peer
) ||
6245 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6246 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
6249 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6251 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6253 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6254 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6258 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6259 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
6265 /************************************
6266 ****** Per AF to the neighbor ******
6267 ************************************/
6269 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
6271 if (peer
->af_group
[afi
][safi
])
6272 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6273 peer
->group
->name
, VTY_NEWLINE
);
6275 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6278 /* ORF capability. */
6279 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6280 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6281 if (! peer
->af_group
[afi
][safi
])
6283 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
6285 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6286 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6287 vty_out (vty
, " both");
6288 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
6289 vty_out (vty
, " send");
6291 vty_out (vty
, " receive");
6292 vty_out (vty
, "%s", VTY_NEWLINE
);
6295 /* Route reflector client. */
6296 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
6297 && ! peer
->af_group
[afi
][safi
])
6298 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
6302 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_FORCE_NEXTHOP_SELF
)
6303 && ! peer
->af_group
[afi
][safi
])
6304 vty_out (vty
, " neighbor %s next-hop-self force%s",
6306 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
6307 && ! peer
->af_group
[afi
][safi
])
6308 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
6310 /* remove-private-AS */
6311 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
) && !peer
->af_group
[afi
][safi
])
6313 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
) &&
6314 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6315 vty_out (vty
, " neighbor %s remove-private-AS all replace-AS%s", addr
, VTY_NEWLINE
);
6317 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6318 vty_out (vty
, " neighbor %s remove-private-AS replace-AS%s", addr
, VTY_NEWLINE
);
6320 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
6321 vty_out (vty
, " neighbor %s remove-private-AS all%s", addr
, VTY_NEWLINE
);
6324 vty_out (vty
, " neighbor %s remove-private-AS%s", addr
, VTY_NEWLINE
);
6328 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
) &&
6329 !peer
->af_group
[afi
][safi
])
6330 vty_out (vty
, " neighbor %s as-override%s", addr
, VTY_NEWLINE
);
6332 /* send-community print. */
6333 if (! peer
->af_group
[afi
][safi
])
6335 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6337 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6338 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6339 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
6340 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6341 vty_out (vty
, " neighbor %s send-community extended%s",
6343 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6344 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
6348 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6349 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6350 vty_out (vty
, " no neighbor %s send-community both%s",
6352 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6353 vty_out (vty
, " no neighbor %s send-community extended%s",
6355 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6356 vty_out (vty
, " no neighbor %s send-community%s",
6361 /* Default information */
6362 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
6363 && ! peer
->af_group
[afi
][safi
])
6365 vty_out (vty
, " neighbor %s default-originate", addr
);
6366 if (peer
->default_rmap
[afi
][safi
].name
)
6367 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
6368 vty_out (vty
, "%s", VTY_NEWLINE
);
6371 /* Soft reconfiguration inbound. */
6372 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6373 if (! peer
->af_group
[afi
][safi
] ||
6374 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6375 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
6378 /* maximum-prefix. */
6379 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
6380 if (! peer
->af_group
[afi
][safi
]
6381 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
6382 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
6383 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
6384 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6386 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
6387 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
6388 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
6389 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6390 vty_out (vty
, " warning-only");
6391 if (peer
->pmax_restart
[afi
][safi
])
6392 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
6393 vty_out (vty
, "%s", VTY_NEWLINE
);
6396 /* Route server client. */
6397 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
6398 && ! peer
->af_group
[afi
][safi
])
6399 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
6401 /* Nexthop-local unchanged. */
6402 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
6403 && ! peer
->af_group
[afi
][safi
])
6404 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
6407 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
6408 if (! peer_group_active (peer
)
6409 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
6410 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
6412 if (peer
->allowas_in
[afi
][safi
] == 3)
6413 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
6415 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
6416 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
6420 bgp_config_write_filter (vty
, peer
, afi
, safi
);
6422 /* atribute-unchanged. */
6423 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6424 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6425 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6426 && ! peer
->af_group
[afi
][safi
])
6428 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6429 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6430 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6431 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
6433 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
6434 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
6436 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
6438 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
6439 " med" : "", VTY_NEWLINE
);
6443 /* Display "address-family" configuration header. */
6445 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
6451 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6454 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
6458 if (safi
== SAFI_MULTICAST
)
6459 vty_out (vty
, "ipv4 multicast");
6460 else if (safi
== SAFI_MPLS_VPN
)
6461 vty_out (vty
, "vpnv4 unicast");
6463 else if (afi
== AFI_IP6
)
6465 vty_out (vty
, "ipv6");
6467 if (safi
== SAFI_MULTICAST
)
6468 vty_out (vty
, " multicast");
6471 vty_out (vty
, "%s", VTY_NEWLINE
);
6476 /* Address family based peer configuration display. */
6478 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
6483 struct peer_group
*group
;
6484 struct listnode
*node
, *nnode
;
6486 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
6488 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
6490 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6492 if (group
->conf
->afc
[afi
][safi
])
6494 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6495 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
6498 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6500 /* Skip dynamic neighbors. */
6501 if (peer_dynamic_neighbor (peer
))
6504 if (peer
->afc
[afi
][safi
])
6506 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6508 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6509 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
6514 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
6515 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
6518 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
6524 bgp_config_write (struct vty
*vty
)
6528 struct peer_group
*group
;
6530 struct listnode
*node
, *nnode
;
6531 struct listnode
*mnode
, *mnnode
;
6533 /* BGP Multiple instance. */
6534 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6536 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
6540 /* BGP Config type. */
6541 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6543 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
6547 /* BGP configuration. */
6548 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6551 vty_out (vty
, "!%s", VTY_NEWLINE
);
6553 /* Router bgp ASN */
6554 vty_out (vty
, "router bgp %u", bgp
->as
);
6556 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6559 vty_out (vty
, " view %s", bgp
->name
);
6561 vty_out (vty
, "%s", VTY_NEWLINE
);
6563 /* No Synchronization */
6564 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6565 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
6567 /* BGP fast-external-failover. */
6568 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
6569 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
6571 /* BGP router ID. */
6572 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
6573 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
6576 /* BGP log-neighbor-changes. */
6577 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
6578 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
6580 /* BGP configuration. */
6581 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
6582 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
6584 /* BGP default ipv4-unicast. */
6585 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6586 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
6588 /* BGP default local-preference. */
6589 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
6590 vty_out (vty
, " bgp default local-preference %d%s",
6591 bgp
->default_local_pref
, VTY_NEWLINE
);
6593 /* BGP default subgroup-pkt-queue-max. */
6594 if (bgp
->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
6595 vty_out (vty
, " bgp default subgroup-pkt-queue-max %d%s",
6596 bgp
->default_subgroup_pkt_queue_max
, VTY_NEWLINE
);
6598 /* BGP client-to-client reflection. */
6599 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
6600 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
6602 /* BGP cluster ID. */
6603 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
6604 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
6607 /* Disable ebgp connected nexthop check */
6608 if (bgp_flag_check (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
6609 vty_out (vty
, " bgp disable-ebgp-connected-route-check%s", VTY_NEWLINE
);
6611 /* Confederation identifier*/
6612 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
6613 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
6616 /* Confederation peer */
6617 if (bgp
->confed_peers_cnt
> 0)
6621 vty_out (vty
, " bgp confederation peers");
6623 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
6624 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
6626 vty_out (vty
, "%s", VTY_NEWLINE
);
6629 /* BGP enforce-first-as. */
6630 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
6631 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
6633 /* BGP deterministic-med. */
6634 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
6635 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
6637 /* BGP update-delay. */
6638 bgp_config_write_update_delay (vty
, bgp
);
6640 if (bgp
->v_maxmed_onstartup
!= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
)
6642 vty_out (vty
, " bgp max-med on-startup %d", bgp
->v_maxmed_onstartup
);
6643 if (bgp
->maxmed_onstartup_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6644 vty_out (vty
, " %d", bgp
->maxmed_onstartup_value
);
6645 vty_out (vty
, "%s", VTY_NEWLINE
);
6647 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
)
6649 vty_out (vty
, " bgp max-med administrative");
6650 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6651 vty_out (vty
, " %d", bgp
->maxmed_admin_value
);
6652 vty_out (vty
, "%s", VTY_NEWLINE
);
6656 bgp_config_write_wpkt_quanta (vty
, bgp
);
6659 bgp_config_write_coalesce_time(vty
, bgp
);
6661 /* BGP graceful-restart. */
6662 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
6663 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
6664 bgp
->stalepath_time
, VTY_NEWLINE
);
6665 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
6666 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
6668 /* BGP bestpath method. */
6669 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
6670 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
6671 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
6672 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
6674 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
6675 if (bgp_flag_check (bgp
, BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET
)) {
6676 vty_out (vty
, " bgp bestpath as-path multipath-relax no-as-set%s", VTY_NEWLINE
);
6678 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
6682 if (bgp_flag_check (bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
6683 vty_out (vty
, " bgp route-reflector allow-outbound-policy%s",
6686 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
6687 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
6688 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
6689 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6691 vty_out (vty
, " bgp bestpath med");
6692 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
6693 vty_out (vty
, " confed");
6694 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6695 vty_out (vty
, " missing-as-worst");
6696 vty_out (vty
, "%s", VTY_NEWLINE
);
6699 /* BGP network import check. */
6700 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH
))
6701 vty_out (vty
, " bgp network import-check exact%s", VTY_NEWLINE
);
6702 else if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
6703 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
6705 /* BGP flag dampening. */
6706 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
6707 BGP_CONFIG_DAMPENING
))
6708 bgp_config_write_damp (vty
);
6710 /* BGP static route configuration. */
6711 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6713 /* BGP redistribute configuration. */
6714 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6716 /* BGP timers configuration. */
6717 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
6718 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
6719 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
6720 bgp
->default_holdtime
, VTY_NEWLINE
);
6722 if (bgp
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
6723 vty_out (vty
, " bgp route-map delay-timer %d%s", bgp
->rmap_update_timer
,
6727 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6729 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
6732 /* Normal neighbor configuration. */
6733 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6735 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6736 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
6740 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6741 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6743 /* Distance configuration. */
6744 bgp_config_write_distance (vty
, bgp
);
6746 /* listen range and limit for dynamic BGP neighbors */
6747 bgp_config_write_listen (vty
, bgp
);
6749 /* No auto-summary */
6750 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6751 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
6753 /* IPv4 multicast configuration. */
6754 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
6756 /* IPv4 VPN configuration. */
6757 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
6759 /* IPv6 unicast configuration. */
6760 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
6762 /* IPv6 multicast configuration. */
6763 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
6771 bgp_master_init (void)
6773 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
6776 bm
->bgp
= list_new ();
6777 bm
->listen_sockets
= list_new ();
6778 bm
->port
= BGP_PORT_DEFAULT
;
6779 bm
->master
= thread_master_create ();
6780 bm
->start_time
= bgp_clock ();
6788 /* allocates some vital data structures used by peer commands in vty_init */
6794 /* BGP VTY commands installation. */
6802 bgp_route_map_init ();
6803 bgp_address_init ();
6804 bgp_scan_vty_init();
6805 bgp_mplsvpn_init ();
6807 /* Access list initialize. */
6808 access_list_init ();
6809 access_list_add_hook (peer_distribute_update
);
6810 access_list_delete_hook (peer_distribute_update
);
6812 /* Filter list initialize. */
6814 as_list_add_hook (peer_aslist_add
);
6815 as_list_delete_hook (peer_aslist_del
);
6817 /* Prefix list initialize.*/
6818 prefix_list_init ();
6819 prefix_list_add_hook (peer_prefix_list_update
);
6820 prefix_list_delete_hook (peer_prefix_list_update
);
6822 /* Community list initialize. */
6823 bgp_clist
= community_list_init ();
6827 #endif /* HAVE_SNMP */
6834 bgp_terminate (void)
6838 struct listnode
*node
, *nnode
;
6839 struct listnode
*mnode
, *mnnode
;
6841 /* Close the listener sockets first as this prevents peers from attempting
6842 * to reconnect on receiving the peer unconfig message. In the presence
6843 * of a large number of peers this will ensure that no peer is left with
6844 * a dangling connection
6846 /* reverse bgp_master_init */
6848 if (bm
->listen_sockets
)
6849 list_free(bm
->listen_sockets
);
6850 bm
->listen_sockets
= NULL
;
6852 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6853 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6854 if (peer
->status
== Established
||
6855 peer
->status
== OpenSent
||
6856 peer
->status
== OpenConfirm
)
6857 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
6858 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
6860 bgp_cleanup_routes ();
6862 if (bm
->process_main_queue
)
6864 work_queue_free (bm
->process_main_queue
);
6865 bm
->process_main_queue
= NULL
;
6867 if (bm
->process_rsclient_queue
)
6869 work_queue_free (bm
->process_rsclient_queue
);
6870 bm
->process_rsclient_queue
= NULL
;