1 /* BGP-4, BGP-4+ daemon program
2 Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
29 #include "sockunion.h"
38 #include "workqueue.h"
43 #include "bgpd/bgpd.h"
44 #include "bgpd/bgp_table.h"
45 #include "bgpd/bgp_aspath.h"
46 #include "bgpd/bgp_route.h"
47 #include "bgpd/bgp_dump.h"
48 #include "bgpd/bgp_debug.h"
49 #include "bgpd/bgp_community.h"
50 #include "bgpd/bgp_attr.h"
51 #include "bgpd/bgp_regex.h"
52 #include "bgpd/bgp_clist.h"
53 #include "bgpd/bgp_fsm.h"
54 #include "bgpd/bgp_packet.h"
55 #include "bgpd/bgp_zebra.h"
56 #include "bgpd/bgp_open.h"
57 #include "bgpd/bgp_filter.h"
58 #include "bgpd/bgp_nexthop.h"
59 #include "bgpd/bgp_damp.h"
60 #include "bgpd/bgp_mplsvpn.h"
61 #include "bgpd/bgp_advertise.h"
62 #include "bgpd/bgp_network.h"
63 #include "bgpd/bgp_vty.h"
64 #include "bgpd/bgp_mpath.h"
65 #include "bgpd/bgp_nht.h"
67 #include "bgpd/bgp_snmp.h"
68 #endif /* HAVE_SNMP */
69 #include "bgpd/bgp_updgrp.h"
70 #include "bgpd/bgp_bfd.h"
72 /* BGP process wide configuration. */
73 static struct bgp_master bgp_master
;
75 extern struct in_addr router_id_zebra
;
77 /* BGP process wide configuration pointer to export. */
78 struct bgp_master
*bm
;
80 /* BGP community-list. */
81 struct community_list_handler
*bgp_clist
;
85 bgp_session_reset(struct peer
*peer
)
87 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
88 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
89 peer_delete(peer
->doppelganger
);
91 BGP_EVENT_ADD (peer
, BGP_Stop
);
95 * During session reset, we may delete the doppelganger peer, which would
96 * be the next node to the current node. If the session reset was invoked
97 * during walk of peer list, we would end up accessing the freed next
98 * node. This function moves the next node along.
101 bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
106 n
= (nnode
) ? *nnode
: NULL
;
107 npeer
= (n
) ? listgetdata(n
) : NULL
;
109 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
110 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
112 if (peer
->doppelganger
== npeer
)
113 /* nnode and *nnode are confirmed to be non-NULL here */
114 *nnode
= (*nnode
)->next
;
115 peer_delete(peer
->doppelganger
);
118 BGP_EVENT_ADD (peer
, BGP_Stop
);
121 /* BGP global flag manipulation. */
123 bgp_option_set (int flag
)
128 case BGP_OPT_MULTIPLE_INSTANCE
:
129 case BGP_OPT_CONFIG_CISCO
:
130 case BGP_OPT_NO_LISTEN
:
131 SET_FLAG (bm
->options
, flag
);
134 return BGP_ERR_INVALID_FLAG
;
140 bgp_option_unset (int flag
)
144 case BGP_OPT_MULTIPLE_INSTANCE
:
145 if (listcount (bm
->bgp
) > 1)
146 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
149 case BGP_OPT_CONFIG_CISCO
:
150 UNSET_FLAG (bm
->options
, flag
);
153 return BGP_ERR_INVALID_FLAG
;
159 bgp_option_check (int flag
)
161 return CHECK_FLAG (bm
->options
, flag
);
164 /* BGP flag manipulation. */
166 bgp_flag_set (struct bgp
*bgp
, int flag
)
168 SET_FLAG (bgp
->flags
, flag
);
173 bgp_flag_unset (struct bgp
*bgp
, int flag
)
175 UNSET_FLAG (bgp
->flags
, flag
);
180 bgp_flag_check (struct bgp
*bgp
, int flag
)
182 return CHECK_FLAG (bgp
->flags
, flag
);
185 /* Internal function to set BGP structure configureation flag. */
187 bgp_config_set (struct bgp
*bgp
, int config
)
189 SET_FLAG (bgp
->config
, config
);
193 bgp_config_unset (struct bgp
*bgp
, int config
)
195 UNSET_FLAG (bgp
->config
, config
);
199 bgp_config_check (struct bgp
*bgp
, int config
)
201 return CHECK_FLAG (bgp
->config
, config
);
204 /* Set BGP router identifier. */
206 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
209 struct listnode
*node
, *nnode
;
211 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
212 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
215 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
216 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
218 /* Set all peer's local identifier with this value. */
219 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
221 IPV4_ADDR_COPY (&peer
->local_id
, id
);
223 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
225 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
226 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
227 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
233 /* BGP's cluster-id control. */
235 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
238 struct listnode
*node
, *nnode
;
240 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
241 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
244 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
245 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
247 /* Clear all IBGP peer. */
248 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
250 if (peer
->sort
!= BGP_PEER_IBGP
)
253 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
255 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
256 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
257 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
264 bgp_cluster_id_unset (struct bgp
*bgp
)
267 struct listnode
*node
, *nnode
;
269 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
272 bgp
->cluster_id
.s_addr
= 0;
273 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
275 /* Clear all IBGP peer. */
276 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
278 if (peer
->sort
!= BGP_PEER_IBGP
)
281 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
283 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
284 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
285 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
291 /* time_t value that is monotonicly increasing
292 * and uneffected by adjustments to system clock
294 time_t bgp_clock (void)
298 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
302 /* BGP timer configuration. */
304 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
306 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
307 ? keepalive
: holdtime
/ 3);
308 bgp
->default_holdtime
= holdtime
;
314 bgp_timers_unset (struct bgp
*bgp
)
316 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
317 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
322 /* BGP confederation configuration. */
324 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
327 struct listnode
*node
, *nnode
;
331 return BGP_ERR_INVALID_AS
;
333 /* Remember - were we doing confederation before? */
334 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
336 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
338 /* If we were doing confederation already, this is just an external
339 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
340 were not doing confederation before, reset all EBGP sessions. */
341 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
343 /* We're looking for peers who's AS is not local or part of our
347 if (peer_sort (peer
) == BGP_PEER_EBGP
)
350 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
352 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
353 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
354 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
357 bgp_session_reset_safe(peer
, &nnode
);
362 /* Not doign confederation before, so reset every non-local
364 if (peer_sort (peer
) != BGP_PEER_IBGP
)
366 /* Reset the local_as to be our EBGP one */
367 if (peer_sort (peer
) == BGP_PEER_EBGP
)
369 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
371 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
372 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
373 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
376 bgp_session_reset_safe(peer
, &nnode
);
384 bgp_confederation_id_unset (struct bgp
*bgp
)
387 struct listnode
*node
, *nnode
;
390 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
392 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
394 /* We're looking for peers who's AS is not local */
395 if (peer_sort (peer
) != BGP_PEER_IBGP
)
397 peer
->local_as
= bgp
->as
;
398 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
400 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
401 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
402 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
406 bgp_session_reset_safe(peer
, &nnode
);
412 /* Is an AS part of the confed or not? */
414 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
421 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
422 if (bgp
->confed_peers
[i
] == as
)
428 /* Add an AS to the confederation set. */
430 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
433 struct listnode
*node
, *nnode
;
436 return BGP_ERR_INVALID_BGP
;
439 return BGP_ERR_INVALID_AS
;
441 if (bgp_confederation_peers_check (bgp
, as
))
444 if (bgp
->confed_peers
)
445 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
447 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
449 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
450 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
452 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
453 bgp
->confed_peers_cnt
++;
455 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
457 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
461 peer
->local_as
= bgp
->as
;
462 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
464 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
465 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
466 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
469 bgp_session_reset_safe(peer
, &nnode
);
476 /* Delete an AS from the confederation set. */
478 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
483 struct listnode
*node
, *nnode
;
488 if (! bgp_confederation_peers_check (bgp
, as
))
491 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
492 if (bgp
->confed_peers
[i
] == as
)
493 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
494 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
496 bgp
->confed_peers_cnt
--;
498 if (bgp
->confed_peers_cnt
== 0)
500 if (bgp
->confed_peers
)
501 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
502 bgp
->confed_peers
= NULL
;
505 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
507 bgp
->confed_peers_cnt
* sizeof (as_t
));
509 /* Now reset any peer who's remote AS has just been removed from the
511 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
513 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
517 peer
->local_as
= bgp
->confed_id
;
518 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
520 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
521 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
522 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
525 bgp_session_reset_safe(peer
, &nnode
);
533 /* Local preference configuration. */
535 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
540 bgp
->default_local_pref
= local_pref
;
546 bgp_default_local_preference_unset (struct bgp
*bgp
)
551 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
556 /* Local preference configuration. */
558 bgp_default_subgroup_pkt_queue_max_set (struct bgp
*bgp
, u_int32_t queue_size
)
563 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
569 bgp_default_subgroup_pkt_queue_max_unset (struct bgp
*bgp
)
573 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
578 /* Listen limit configuration. */
580 bgp_listen_limit_set (struct bgp
*bgp
, int listen_limit
)
585 bgp
->dynamic_neighbors_limit
= listen_limit
;
591 bgp_listen_limit_unset (struct bgp
*bgp
)
596 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
602 peer_af_create (struct peer
*peer
, afi_t afi
, safi_t safi
)
610 afid
= afindex(afi
, safi
);
611 if (afid
>= BGP_AF_MAX
)
614 assert(peer
->peer_af_array
[afid
] == NULL
);
616 /* Allocate new peer af */
617 af
= XCALLOC (MTYPE_BGP_PEER_AF
, sizeof (struct peer_af
));
618 peer
->peer_af_array
[afid
] = af
;
624 //update_group_adjust_peer(af);
629 peer_af_find (struct peer
*peer
, afi_t afi
, safi_t safi
)
636 afid
= afindex(afi
, safi
);
637 if (afid
>= BGP_AF_MAX
)
640 return peer
->peer_af_array
[afid
];
644 peer_af_delete (struct peer
*peer
, afi_t afi
, safi_t safi
)
652 afid
= afindex(afi
, safi
);
653 if (afid
>= BGP_AF_MAX
)
656 af
= peer
->peer_af_array
[afid
];
660 bgp_stop_announce_route_timer (af
);
664 if (BGP_DEBUG (update_groups
, UPDATE_GROUPS
))
665 zlog_debug ("u%" PRIu64
":s%" PRIu64
" remove peer %s",
666 af
->subgroup
->update_group
->id
, af
->subgroup
->id
, peer
->host
);
669 update_subgroup_remove_peer (af
->subgroup
, af
);
671 peer
->peer_af_array
[afid
] = NULL
;
672 XFREE(MTYPE_BGP_PEER_AF
, af
);
677 /* If peer is RSERVER_CLIENT in at least one address family and is not member
678 of a peer_group for that family, return 1.
679 Used to check wether the peer is included in list bgp->rsclient. */
681 peer_rsclient_active (struct peer
*peer
)
686 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
687 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
688 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
689 && ! peer
->af_group
[i
][j
])
694 /* Peer comparison function for sorting. */
696 peer_cmp (struct peer
*p1
, struct peer
*p2
)
698 return sockunion_cmp (&p1
->su
, &p2
->su
);
702 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
704 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
707 /* Reset all address family specific configuration. */
709 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
712 struct bgp_filter
*filter
;
713 char orf_name
[BUFSIZ
];
715 filter
= &peer
->filter
[afi
][safi
];
717 /* Clear neighbor filter and route-map */
718 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
720 if (filter
->dlist
[i
].name
)
722 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
723 filter
->dlist
[i
].name
= NULL
;
725 if (filter
->plist
[i
].name
)
727 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
728 filter
->plist
[i
].name
= NULL
;
730 if (filter
->aslist
[i
].name
)
732 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
733 filter
->aslist
[i
].name
= NULL
;
736 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
738 if (filter
->map
[i
].name
)
740 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
741 filter
->map
[i
].name
= NULL
;
745 /* Clear unsuppress map. */
746 if (filter
->usmap
.name
)
747 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
748 filter
->usmap
.name
= NULL
;
749 filter
->usmap
.map
= NULL
;
751 /* Clear neighbor's all address family flags. */
752 peer
->af_flags
[afi
][safi
] = 0;
754 /* Clear neighbor's all address family sflags. */
755 peer
->af_sflags
[afi
][safi
] = 0;
757 /* Clear neighbor's all address family capabilities. */
758 peer
->af_cap
[afi
][safi
] = 0;
761 peer
->orf_plist
[afi
][safi
] = NULL
;
762 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
763 prefix_bgp_orf_remove_all (orf_name
);
765 /* Set default neighbor send-community. */
766 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
768 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
769 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
772 /* Clear neighbor default_originate_rmap */
773 if (peer
->default_rmap
[afi
][safi
].name
)
774 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
775 peer
->default_rmap
[afi
][safi
].name
= NULL
;
776 peer
->default_rmap
[afi
][safi
].map
= NULL
;
778 /* Clear neighbor maximum-prefix */
779 peer
->pmax
[afi
][safi
] = 0;
780 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
783 /* peer global config reset */
785 peer_global_config_reset (struct peer
*peer
)
791 peer
->change_local_as
= 0;
792 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
793 if (peer
->update_source
)
795 sockunion_free (peer
->update_source
);
796 peer
->update_source
= NULL
;
800 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
801 peer
->update_if
= NULL
;
804 if (peer_sort (peer
) == BGP_PEER_IBGP
)
805 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
807 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
809 /* This is a per-peer specific flag and so we must preserve it */
810 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
815 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
821 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
823 /* Reset some other configs back to defaults. */
824 peer
->v_start
= BGP_INIT_START_TIMER
;
825 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
826 peer
->password
= NULL
;
827 peer
->local_id
= peer
->bgp
->router_id
;
828 peer
->v_holdtime
= peer
->bgp
->default_holdtime
;
829 peer
->v_keepalive
= peer
->bgp
->default_keepalive
;
831 bfd_info_free(&(peer
->bfd_info
));
833 /* Set back the CONFIG_NODE flag. */
834 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
837 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
838 static bgp_peer_sort_t
839 peer_calc_sort (struct peer
*peer
)
846 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
848 if (peer
->as_type
== AS_INTERNAL
)
849 return BGP_PEER_IBGP
;
851 else if (peer
->as_type
== AS_EXTERNAL
)
852 return BGP_PEER_EBGP
;
854 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
)
855 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
860 peer1
= listnode_head (peer
->group
->peer
);
865 return BGP_PEER_INTERNAL
;
869 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
871 if (peer
->local_as
== 0)
872 return BGP_PEER_INTERNAL
;
874 if (peer
->local_as
== peer
->as
)
876 if (bgp
->as
== bgp
->confed_id
)
878 if (peer
->local_as
== bgp
->as
)
879 return BGP_PEER_IBGP
;
881 return BGP_PEER_EBGP
;
885 if (peer
->local_as
== bgp
->confed_id
)
886 return BGP_PEER_EBGP
;
888 return BGP_PEER_IBGP
;
892 if (bgp_confederation_peers_check (bgp
, peer
->as
))
893 return BGP_PEER_CONFED
;
895 return BGP_PEER_EBGP
;
899 if (peer
->as_type
!= AS_SPECIFIED
)
900 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
902 return (peer
->local_as
== 0
903 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
904 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
908 /* Calculate and cache the peer "sort" */
910 peer_sort (struct peer
*peer
)
912 peer
->sort
= peer_calc_sort (peer
);
917 peer_free (struct peer
*peer
)
919 assert (peer
->status
== Deleted
);
921 bgp_unlock(peer
->bgp
);
923 /* this /ought/ to have been done already through bgp_stop earlier,
924 * but just to be sure..
926 bgp_timer_set (peer
);
927 BGP_READ_OFF (peer
->t_read
);
928 BGP_WRITE_OFF (peer
->t_write
);
929 BGP_EVENT_FLUSH (peer
);
931 /* Free connected nexthop, if present */
932 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
) &&
933 !peer_dynamic_neighbor (peer
))
934 bgp_delete_connected_nexthop (family2afi(peer
->su
.sa
.sa_family
), peer
);
937 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
939 /* Free allocated host character. */
941 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
945 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
948 /* Update source configuration. */
949 if (peer
->update_source
)
950 sockunion_free (peer
->update_source
);
953 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
955 if (peer
->notify
.data
)
956 XFREE(MTYPE_TMP
, peer
->notify
.data
);
958 if (peer
->clear_node_queue
)
959 work_queue_free(peer
->clear_node_queue
);
961 bgp_sync_delete (peer
);
964 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
966 bfd_info_free(&(peer
->bfd_info
));
968 memset (peer
, 0, sizeof (struct peer
));
970 XFREE (MTYPE_BGP_PEER
, peer
);
973 /* increase reference count on a struct peer */
975 peer_lock_with_caller (const char *name
, struct peer
*peer
)
977 assert (peer
&& (peer
->lock
>= 0));
980 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
988 /* decrease reference count on a struct peer
989 * struct peer is freed and NULL returned if last reference
992 peer_unlock_with_caller (const char *name
, struct peer
*peer
)
994 assert (peer
&& (peer
->lock
> 0));
997 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1002 if (peer
->lock
== 0)
1011 /* Allocate new peer object, implicitely locked. */
1012 static struct peer
*
1013 peer_new (struct bgp
*bgp
)
1020 /* bgp argument is absolutely required */
1025 /* Allocate new peer. */
1026 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
1028 /* Set default value. */
1030 peer
->v_start
= BGP_INIT_START_TIMER
;
1031 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1032 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
1033 peer
->status
= Idle
;
1034 peer
->ostatus
= Idle
;
1035 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1037 peer
= peer_lock (peer
); /* initial reference */
1040 peer
->password
= NULL
;
1042 /* Set default flags. */
1043 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1044 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1046 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
1048 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1049 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
1051 peer
->orf_plist
[afi
][safi
] = NULL
;
1053 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1055 /* Create buffers. */
1056 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
1057 peer
->obuf
= stream_fifo_new ();
1059 /* We use a larger buffer for peer->work in the event that:
1060 * - We RX a BGP_UPDATE where the attributes alone are just
1061 * under BGP_MAX_PACKET_SIZE
1062 * - The user configures an outbound route-map that does many as-path
1063 * prepends or adds many communities. At most they can have CMD_ARGC_MAX
1064 * args in a route-map so there is a finite limit on how large they can
1065 * make the attributes.
1067 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
1068 * checking for every single attribute as we construct an UPDATE.
1070 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1071 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
1074 bgp_sync_init (peer
);
1076 /* Get service port number. */
1077 sp
= getservbyname ("bgp", "tcp");
1078 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
1084 * This function is invoked when a duplicate peer structure associated with
1085 * a neighbor is being deleted. If this about-to-be-deleted structure is
1086 * the one with all the config, then we have to copy over the info.
1089 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
1091 struct peer_af
*paf
;
1094 enum bgp_af_index afindex
;
1099 /* The following function is used by both peer group config copy to
1100 * individual peer and when we transfer config
1102 if (peer_src
->change_local_as
)
1103 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1105 /* peer flags apply */
1106 peer_dst
->flags
= peer_src
->flags
;
1107 peer_dst
->cap
= peer_src
->cap
;
1108 peer_dst
->config
= peer_src
->config
;
1110 peer_dst
->local_as
= peer_src
->local_as
;
1111 peer_dst
->ifindex
= peer_src
->ifindex
;
1112 peer_dst
->port
= peer_src
->port
;
1113 peer_sort(peer_dst
);
1114 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1117 peer_dst
->holdtime
= peer_src
->holdtime
;
1118 peer_dst
->keepalive
= peer_src
->keepalive
;
1119 peer_dst
->connect
= peer_src
->connect
;
1120 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1121 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1122 peer_dst
->v_asorig
= peer_src
->v_asorig
;
1123 peer_dst
->routeadv
= peer_src
->routeadv
;
1124 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1126 /* password apply */
1127 if (peer_src
->password
&& !peer_dst
->password
)
1128 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
1130 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1131 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1133 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1134 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1135 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
1138 PEERAF_FOREACH(peer_src
, paf
, afindex
)
1139 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1141 /* update-source apply */
1142 if (peer_src
->update_source
)
1144 if (peer_dst
->update_source
)
1145 sockunion_free (peer_dst
->update_source
);
1146 if (peer_dst
->update_if
)
1148 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1149 peer_dst
->update_if
= NULL
;
1151 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
1153 else if (peer_src
->update_if
)
1155 if (peer_dst
->update_if
)
1156 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1157 if (peer_dst
->update_source
)
1159 sockunion_free (peer_dst
->update_source
);
1160 peer_dst
->update_source
= NULL
;
1162 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1165 if (peer_src
->ifname
)
1167 if (peer_dst
->ifname
)
1168 XFREE(MTYPE_BGP_PEER_IFNAME
, peer_dst
->ifname
);
1170 peer_dst
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, peer_src
->ifname
);
1175 bgp_peer_conf_if_to_su_update_v4 (struct peer
*peer
, struct interface
*ifp
)
1177 struct connected
*ifc
;
1180 struct listnode
*node
;
1182 /* If our IPv4 address on the interface is /30 or /31, we can derive the
1183 * IPv4 address of the other end.
1185 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
))
1187 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
))
1189 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1190 if (p
.prefixlen
== 30)
1192 peer
->su
.sa
.sa_family
= AF_INET
;
1193 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1194 if (s_addr
% 4 == 1)
1195 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1196 else if (s_addr
% 4 == 2)
1197 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1198 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1199 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1200 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1203 else if (p
.prefixlen
== 31)
1205 peer
->su
.sa
.sa_family
= AF_INET
;
1206 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1207 if (s_addr
% 2 == 0)
1208 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1210 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1211 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1212 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1213 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1217 zlog_warn("%s: IPv4 interface address is not /30 or /31, v4 session not started",
1226 bgp_peer_conf_if_to_su_update_v6 (struct peer
*peer
, struct interface
*ifp
)
1228 struct nbr_connected
*ifc_nbr
;
1230 /* Have we learnt the peer's IPv6 link-local address? */
1231 if (ifp
->nbr_connected
&&
1232 (ifc_nbr
= listnode_head(ifp
->nbr_connected
)))
1234 peer
->su
.sa
.sa_family
= AF_INET6
;
1235 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1236 sizeof (struct in6_addr
));
1238 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1240 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1248 * Set or reset the peer address socketunion structure based on the
1249 * learnt/derived peer address. If the address has changed, update the
1250 * password on the listen socket, if needed.
1253 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
1255 struct interface
*ifp
;
1257 int peer_addr_updated
= 0;
1262 prev_family
= peer
->su
.sa
.sa_family
;
1263 if ((ifp
= if_lookup_by_name(peer
->conf_if
)))
1265 /* If BGP unnumbered is not "v6only", we first see if we can derive the
1266 * peer's IPv4 address.
1268 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1269 peer_addr_updated
= bgp_peer_conf_if_to_su_update_v4 (peer
, ifp
);
1271 /* If "v6only" or we can't derive peer's IPv4 address, see if we've
1272 * learnt the peer's IPv6 link-local address. This is from the source
1273 * IPv6 address in router advertisement.
1275 if (!peer_addr_updated
)
1276 peer_addr_updated
= bgp_peer_conf_if_to_su_update_v6 (peer
, ifp
);
1278 /* If we could derive the peer address, we may need to install the password
1279 * configured for the peer, if any, on the listen socket. Otherwise, mark
1280 * that peer's address is not available and uninstall the password, if
1283 if (peer_addr_updated
)
1285 if (peer
->password
&& prev_family
== AF_UNSPEC
)
1290 if (peer
->password
&& prev_family
!= AF_UNSPEC
)
1291 bgp_md5_unset (peer
);
1292 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1293 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1297 /* Create new BGP peer. */
1299 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1300 as_t local_as
, as_t remote_as
, int as_type
, afi_t afi
, safi_t safi
)
1304 char buf
[SU_ADDRSTRLEN
];
1306 peer
= peer_new (bgp
);
1309 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1310 bgp_peer_conf_if_to_su_update(peer
);
1312 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1313 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1318 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1320 XFREE(MTYPE_BGP_PEER_HOST
, peer
->host
);
1321 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1323 peer
->local_as
= local_as
;
1324 peer
->as
= remote_as
;
1325 peer
->as_type
= as_type
;
1326 peer
->local_id
= bgp
->router_id
;
1327 peer
->v_holdtime
= bgp
->default_holdtime
;
1328 peer
->v_keepalive
= bgp
->default_keepalive
;
1329 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1330 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1332 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1334 peer
= peer_lock (peer
); /* bgp peer list reference */
1335 listnode_add_sort (bgp
->peer
, peer
);
1337 active
= peer_active (peer
);
1339 /* Last read and reset time set */
1340 peer
->readtime
= peer
->resettime
= bgp_clock ();
1342 /* Default TTL set. */
1343 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1345 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1349 peer
->afc
[afi
][safi
] = 1;
1350 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1352 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1356 /* Set up peer's events and timers. */
1357 if (! active
&& peer_active (peer
))
1358 bgp_timer_set (peer
);
1364 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1365 safi_t safi
, int v6only
)
1369 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1372 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1373 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1374 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, AS_UNSPECIFIED
, 0, 0);
1376 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, AS_UNSPECIFIED
, afi
, safi
);
1379 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1381 else if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)) ||
1382 (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)))
1385 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1387 UNSET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1389 /* v6only flag changed. Reset bgp seesion */
1390 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1392 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
1393 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1394 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1397 bgp_session_reset(peer
);
1403 /* Make accept BGP peer. Called from bgp_accept (). */
1405 peer_create_accept (struct bgp
*bgp
)
1409 peer
= peer_new (bgp
);
1411 peer
= peer_lock (peer
); /* bgp peer list reference */
1412 listnode_add_sort (bgp
->peer
, peer
);
1417 /* Change peer's AS number. */
1419 peer_as_change (struct peer
*peer
, as_t as
, int as_specified
)
1421 bgp_peer_sort_t type
;
1425 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1427 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1429 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1430 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1431 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1434 bgp_session_reset(peer
);
1436 type
= peer_sort (peer
);
1438 peer
->as_type
= as_specified
;
1440 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1441 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1442 && peer
->bgp
->as
!= as
)
1443 peer
->local_as
= peer
->bgp
->confed_id
;
1445 peer
->local_as
= peer
->bgp
->as
;
1447 /* Advertisement-interval reset */
1450 conf
= peer
->group
->conf
;
1452 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1454 peer
->v_routeadv
= conf
->routeadv
;
1456 /* Only go back to the default advertisement-interval if the user had not
1457 * already configured it */
1458 else if (!CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
1460 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1461 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1463 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1466 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1468 else if (type
== BGP_PEER_IBGP
)
1471 /* reflector-client reset */
1472 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1474 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1475 PEER_FLAG_REFLECTOR_CLIENT
);
1476 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1477 PEER_FLAG_REFLECTOR_CLIENT
);
1478 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1479 PEER_FLAG_REFLECTOR_CLIENT
);
1480 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1481 PEER_FLAG_REFLECTOR_CLIENT
);
1482 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1483 PEER_FLAG_REFLECTOR_CLIENT
);
1486 /* local-as reset */
1487 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1489 peer
->change_local_as
= 0;
1490 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1491 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1495 /* If peer does not exist, create new one. If peer already exists,
1496 set AS number to the peer. */
1498 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1499 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1505 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1507 peer
= peer_lookup (bgp
, su
);
1511 /* Not allowed for a dynamic peer. */
1512 if (peer_dynamic_neighbor (peer
))
1515 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1518 /* When this peer is a member of peer-group. */
1521 if (peer
->group
->conf
->as
)
1523 /* Return peer group's AS number. */
1524 *as
= peer
->group
->conf
->as
;
1525 return BGP_ERR_PEER_GROUP_MEMBER
;
1527 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1529 if ((as_type
!= AS_INTERNAL
) && (bgp
->as
!= *as
))
1532 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1537 if ((as_type
!= AS_EXTERNAL
) && (bgp
->as
== *as
))
1540 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1545 /* Existing peer's AS number change. */
1546 if ((peer
->as
!= *as
) || (peer
->as_type
!= as_type
))
1547 peer_as_change (peer
, *as
, as_type
);
1552 return BGP_ERR_NO_INTERFACE_CONFIG
;
1554 /* If the peer is not part of our confederation, and its not an
1555 iBGP peer then spoof the source AS */
1556 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1557 && ! bgp_confederation_peers_check (bgp
, *as
)
1559 local_as
= bgp
->confed_id
;
1563 /* If this is IPv4 unicast configuration and "no bgp default
1564 ipv4-unicast" is specified. */
1566 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1567 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1568 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0, 0);
1570 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, afi
, safi
);
1576 /* Activate the peer or peer group for specified AFI and SAFI. */
1578 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1582 if (peer
->afc
[afi
][safi
])
1585 /* Activate the address family configuration. */
1586 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1587 peer
->afc
[afi
][safi
] = 1;
1590 active
= peer_active (peer
);
1592 peer
->afc
[afi
][safi
] = 1;
1594 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1596 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1599 if (! active
&& peer_active (peer
))
1600 bgp_timer_set (peer
);
1603 if (peer
->status
== Established
)
1605 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1607 peer
->afc_adv
[afi
][safi
] = 1;
1608 bgp_capability_send (peer
, afi
, safi
,
1610 CAPABILITY_ACTION_SET
);
1611 if (peer
->afc_recv
[afi
][safi
])
1613 peer
->afc_nego
[afi
][safi
] = 1;
1614 bgp_announce_route (peer
, afi
, safi
);
1619 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1620 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1621 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1630 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1632 struct peer_group
*group
;
1634 struct listnode
*node
, *nnode
;
1636 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1638 group
= peer
->group
;
1640 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1642 if (peer1
->af_group
[afi
][safi
])
1643 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1648 if (peer
->af_group
[afi
][safi
])
1649 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1652 if (! peer
->afc
[afi
][safi
])
1655 /* De-activate the address family configuration. */
1656 peer
->afc
[afi
][safi
] = 0;
1657 peer_af_flag_reset (peer
, afi
, safi
);
1658 if (peer_af_delete(peer
, afi
, safi
) != 0)
1660 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
1663 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1665 if (peer
->status
== Established
)
1667 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1669 peer
->afc_adv
[afi
][safi
] = 0;
1670 peer
->afc_nego
[afi
][safi
] = 0;
1672 if (peer_active_nego (peer
))
1674 bgp_capability_send (peer
, afi
, safi
,
1676 CAPABILITY_ACTION_UNSET
);
1677 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1678 peer
->pcount
[afi
][safi
] = 0;
1682 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1683 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1684 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1689 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1690 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1691 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1699 peer_nsf_stop (struct peer
*peer
)
1704 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1705 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1707 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1708 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1709 peer
->nsf
[afi
][safi
] = 0;
1711 if (peer
->t_gr_restart
)
1713 BGP_TIMER_OFF (peer
->t_gr_restart
);
1714 if (bgp_debug_neighbor_events(peer
))
1715 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1717 if (peer
->t_gr_stale
)
1719 BGP_TIMER_OFF (peer
->t_gr_stale
);
1720 if (bgp_debug_neighbor_events(peer
))
1721 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1723 bgp_clear_route_all (peer
);
1726 /* Delete peer from confguration.
1728 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1729 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1731 * This function /should/ take care to be idempotent, to guard against
1732 * it being called multiple times through stray events that come in
1733 * that happen to result in this function being called again. That
1734 * said, getting here for a "Deleted" peer is a bug in the neighbour
1738 peer_delete (struct peer
*peer
)
1744 struct bgp_filter
*filter
;
1745 struct listnode
*pn
;
1748 assert (peer
->status
!= Deleted
);
1751 accept_peer
= CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1753 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1754 peer_nsf_stop (peer
);
1756 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1758 /* If this peer belongs to peer group, clear up the
1762 if (peer_dynamic_neighbor(peer
))
1763 peer_drop_dynamic_neighbor(peer
);
1765 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1767 peer
= peer_unlock (peer
); /* group->peer list reference */
1768 list_delete_node (peer
->group
->peer
, pn
);
1773 /* Withdraw all information from routing table. We can not use
1774 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1775 * executed after peer structure is deleted.
1777 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1779 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1781 if (peer
->doppelganger
)
1782 peer
->doppelganger
->doppelganger
= NULL
;
1783 peer
->doppelganger
= NULL
;
1785 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1786 bgp_fsm_change_status (peer
, Deleted
);
1788 /* Password configuration */
1791 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1792 peer
->password
= NULL
;
1795 ! BGP_PEER_SU_UNSPEC(peer
) &&
1796 ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1797 bgp_md5_unset (peer
);
1800 bgp_timer_set (peer
); /* stops all timers for Deleted */
1802 /* Delete from all peer list. */
1803 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1804 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1806 peer_unlock (peer
); /* bgp peer list reference */
1807 list_delete_node (bgp
->peer
, pn
);
1810 if (peer_rsclient_active (peer
)
1811 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1813 peer_unlock (peer
); /* rsclient list reference */
1814 list_delete_node (bgp
->rsclient
, pn
);
1816 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1818 /* Clear our own rsclient ribs. */
1819 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1820 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1821 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1822 PEER_FLAG_RSERVER_CLIENT
))
1823 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1827 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1828 member of a peer_group. */
1829 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1830 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1831 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1832 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1836 stream_free (peer
->ibuf
);
1838 stream_fifo_free (peer
->obuf
);
1840 stream_free (peer
->work
);
1842 stream_free(peer
->scratch
);
1844 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1846 /* Local and remote addresses. */
1848 sockunion_free (peer
->su_local
);
1849 if (peer
->su_remote
)
1850 sockunion_free (peer
->su_remote
);
1851 peer
->su_local
= peer
->su_remote
= NULL
;
1853 /* Free filter related memory. */
1854 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1855 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1857 filter
= &peer
->filter
[afi
][safi
];
1859 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1861 if (filter
->dlist
[i
].name
)
1862 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[i
].name
);
1863 if (filter
->plist
[i
].name
)
1864 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[i
].name
);
1865 if (filter
->aslist
[i
].name
)
1866 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[i
].name
);
1868 filter
->dlist
[i
].name
= NULL
;
1869 filter
->plist
[i
].name
= NULL
;
1870 filter
->aslist
[i
].name
= NULL
;
1872 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1874 if (filter
->map
[i
].name
)
1875 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[i
].name
);
1876 filter
->map
[i
].name
= NULL
;
1879 if (filter
->usmap
.name
)
1880 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
1882 if (peer
->default_rmap
[afi
][safi
].name
)
1883 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
1885 filter
->usmap
.name
= NULL
;
1886 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1889 FOREACH_AFI_SAFI (afi
, safi
)
1890 peer_af_delete (peer
, afi
, safi
);
1893 XFREE(MTYPE_HOST
, peer
->hostname
);
1894 if (peer
->domainname
)
1895 XFREE(MTYPE_HOST
, peer
->domainname
);
1897 peer_unlock (peer
); /* initial reference */
1903 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1905 return strcmp (g1
->name
, g2
->name
);
1908 /* Peer group cofiguration. */
1909 static struct peer_group
*
1910 peer_group_new (void)
1912 return (struct peer_group
*) XCALLOC (MTYPE_BGP_PEER_GROUP
,
1913 sizeof (struct peer_group
));
1917 peer_group_free (struct peer_group
*group
)
1919 XFREE (MTYPE_BGP_PEER_GROUP
, group
);
1923 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1925 struct peer_group
*group
;
1926 struct listnode
*node
, *nnode
;
1928 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1930 if (strcmp (group
->name
, name
) == 0)
1937 peer_group_get (struct bgp
*bgp
, const char *name
)
1939 struct peer_group
*group
;
1942 group
= peer_group_lookup (bgp
, name
);
1946 group
= peer_group_new ();
1949 XFREE(MTYPE_BGP_PEER_GROUP_HOST
, group
->name
);
1950 group
->name
= XSTRDUP(MTYPE_BGP_PEER_GROUP_HOST
, name
);
1951 group
->peer
= list_new ();
1952 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1953 group
->listen_range
[afi
] = list_new ();
1954 group
->conf
= peer_new (bgp
);
1955 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1956 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1957 if (group
->conf
->host
)
1958 XFREE(MTYPE_BGP_PEER_HOST
, group
->conf
->host
);
1959 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1960 group
->conf
->group
= group
;
1961 group
->conf
->as
= 0;
1962 group
->conf
->ttl
= 1;
1963 group
->conf
->gtsm_hops
= 0;
1964 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1965 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1966 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1967 group
->conf
->keepalive
= 0;
1968 group
->conf
->holdtime
= 0;
1969 group
->conf
->connect
= 0;
1970 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1971 listnode_add_sort (bgp
->group
, group
);
1977 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1978 afi_t afi
, safi_t safi
)
1981 int out
= FILTER_OUT
;
1983 struct bgp_filter
*pfilter
;
1984 struct bgp_filter
*gfilter
;
1988 pfilter
= &peer
->filter
[afi
][safi
];
1989 gfilter
= &conf
->filter
[afi
][safi
];
1993 peer
->as
= conf
->as
;
1996 if (conf
->change_local_as
)
1997 peer
->change_local_as
= conf
->change_local_as
;
2000 peer
->ttl
= conf
->ttl
;
2003 peer
->gtsm_hops
= conf
->gtsm_hops
;
2006 peer
->weight
= conf
->weight
;
2008 /* this flag is per-neighbor and so has to be preserved */
2009 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2011 /* peer flags apply */
2012 peer
->flags
= conf
->flags
;
2015 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2017 /* peer af_flags apply */
2018 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
2019 /* peer config apply */
2020 peer
->config
= conf
->config
;
2022 /* peer timers apply */
2023 peer
->holdtime
= conf
->holdtime
;
2024 peer
->keepalive
= conf
->keepalive
;
2025 peer
->connect
= conf
->connect
;
2026 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
2027 peer
->v_connect
= conf
->connect
;
2029 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
2031 /* advertisement-interval reset */
2032 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
2033 peer
->v_routeadv
= conf
->routeadv
;
2035 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2036 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2038 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2040 /* password apply */
2041 if (conf
->password
&& !peer
->password
)
2042 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
2044 if (! BGP_PEER_SU_UNSPEC(peer
))
2047 /* maximum-prefix */
2048 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
2049 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
2050 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
2053 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
2055 /* route-server-client */
2056 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2058 /* Make peer's RIB point to group's RIB. */
2059 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
2061 /* Import policy. */
2062 if (pfilter
->map
[RMAP_IMPORT
].name
)
2063 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2064 if (gfilter
->map
[RMAP_IMPORT
].name
)
2066 pfilter
->map
[RMAP_IMPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IMPORT
].name
);
2067 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2071 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2072 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2075 /* Export policy. */
2076 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2078 pfilter
->map
[RMAP_EXPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_EXPORT
].name
);
2079 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2083 /* default-originate route-map */
2084 if (conf
->default_rmap
[afi
][safi
].name
)
2086 if (peer
->default_rmap
[afi
][safi
].name
)
2087 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->default_rmap
[afi
][safi
].name
);
2088 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, conf
->default_rmap
[afi
][safi
].name
);
2089 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
2092 /* update-source apply */
2093 if (conf
->update_source
)
2095 if (peer
->update_source
)
2096 sockunion_free (peer
->update_source
);
2097 if (peer
->update_if
)
2099 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2100 peer
->update_if
= NULL
;
2102 peer
->update_source
= sockunion_dup (conf
->update_source
);
2104 else if (conf
->update_if
)
2106 if (peer
->update_if
)
2107 XFREE(MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2108 if (peer
->update_source
)
2110 sockunion_free (peer
->update_source
);
2111 peer
->update_source
= NULL
;
2113 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
2116 /* inbound filter apply */
2117 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
2119 if (pfilter
->dlist
[in
].name
)
2120 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[in
].name
);
2121 pfilter
->dlist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[in
].name
);
2122 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
2124 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
2126 if (pfilter
->plist
[in
].name
)
2127 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[in
].name
);
2128 pfilter
->plist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[in
].name
);
2129 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
2131 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
2133 if (pfilter
->aslist
[in
].name
)
2134 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[in
].name
);
2135 pfilter
->aslist
[in
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[in
].name
);
2136 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
2138 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
2140 if (pfilter
->map
[RMAP_IN
].name
)
2141 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IN
].name
);
2142 pfilter
->map
[RMAP_IN
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IN
].name
);
2143 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
2146 /* outbound filter apply */
2147 if (gfilter
->dlist
[out
].name
)
2149 if (pfilter
->dlist
[out
].name
)
2150 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[out
].name
);
2151 pfilter
->dlist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[out
].name
);
2152 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
2156 if (pfilter
->dlist
[out
].name
)
2157 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->dlist
[out
].name
);
2158 pfilter
->dlist
[out
].name
= NULL
;
2159 pfilter
->dlist
[out
].alist
= NULL
;
2161 if (gfilter
->plist
[out
].name
)
2163 if (pfilter
->plist
[out
].name
)
2164 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[out
].name
);
2165 pfilter
->plist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[out
].name
);
2166 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
2170 if (pfilter
->plist
[out
].name
)
2171 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->plist
[out
].name
);
2172 pfilter
->plist
[out
].name
= NULL
;
2173 pfilter
->plist
[out
].plist
= NULL
;
2175 if (gfilter
->aslist
[out
].name
)
2177 if (pfilter
->aslist
[out
].name
)
2178 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[out
].name
);
2179 pfilter
->aslist
[out
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[out
].name
);
2180 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
2184 if (pfilter
->aslist
[out
].name
)
2185 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->aslist
[out
].name
);
2186 pfilter
->aslist
[out
].name
= NULL
;
2187 pfilter
->aslist
[out
].aslist
= NULL
;
2189 if (gfilter
->map
[RMAP_OUT
].name
)
2191 if (pfilter
->map
[RMAP_OUT
].name
)
2192 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_OUT
].name
);
2193 pfilter
->map
[RMAP_OUT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_OUT
].name
);
2194 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
2198 if (pfilter
->map
[RMAP_OUT
].name
)
2199 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_OUT
].name
);
2200 pfilter
->map
[RMAP_OUT
].name
= NULL
;
2201 pfilter
->map
[RMAP_OUT
].map
= NULL
;
2204 /* RS-client's import/export route-maps. */
2205 if (gfilter
->map
[RMAP_IMPORT
].name
)
2207 if (pfilter
->map
[RMAP_IMPORT
].name
)
2208 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2209 pfilter
->map
[RMAP_IMPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_IMPORT
].name
);
2210 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2214 if (pfilter
->map
[RMAP_IMPORT
].name
)
2215 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_IMPORT
].name
);
2216 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2217 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2219 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2221 if (pfilter
->map
[RMAP_EXPORT
].name
)
2222 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->map
[RMAP_EXPORT
].name
);
2223 pfilter
->map
[RMAP_EXPORT
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[RMAP_EXPORT
].name
);
2224 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2227 if (gfilter
->usmap
.name
)
2229 if (pfilter
->usmap
.name
)
2230 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->usmap
.name
);
2231 pfilter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->usmap
.name
);
2232 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
2236 if (pfilter
->usmap
.name
)
2237 XFREE(MTYPE_BGP_FILTER_NAME
, pfilter
->usmap
.name
);
2238 pfilter
->usmap
.name
= NULL
;
2239 pfilter
->usmap
.map
= NULL
;
2242 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2245 /* Peer group's remote AS configuration. */
2247 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
,
2248 as_t
*as
, int as_type
)
2250 struct peer_group
*group
;
2252 struct listnode
*node
, *nnode
;
2254 group
= peer_group_lookup (bgp
, group_name
);
2258 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2262 /* When we setup peer-group AS number all peer group member's AS
2263 number must be updated to same number. */
2264 peer_as_change (group
->conf
, *as
, as_type
);
2266 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2268 if ((peer
->as
!= *as
) || (peer
->as_type
!= as_type
))
2269 peer_as_change (peer
, *as
, as_type
);
2276 peer_group_delete (struct peer_group
*group
)
2280 struct prefix
*prefix
;
2282 struct listnode
*node
, *nnode
;
2287 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2289 other
= peer
->doppelganger
;
2291 if (other
&& other
->status
!= Deleted
)
2293 other
->group
= NULL
;
2297 list_delete (group
->peer
);
2299 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2301 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2303 prefix_free(prefix
);
2305 list_delete (group
->listen_range
[afi
]);
2308 XFREE(MTYPE_BGP_PEER_HOST
, group
->name
);
2311 group
->conf
->group
= NULL
;
2312 peer_delete (group
->conf
);
2314 /* Delete from all peer_group list. */
2315 listnode_delete (bgp
->group
, group
);
2317 bfd_info_free(&(group
->conf
->bfd_info
));
2319 peer_group_free (group
);
2325 peer_group_remote_as_delete (struct peer_group
*group
)
2327 struct peer
*peer
, *other
;
2328 struct listnode
*node
, *nnode
;
2330 if ((group
->conf
->as_type
== AS_UNSPECIFIED
) ||
2331 ((! group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2334 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2336 other
= peer
->doppelganger
;
2340 if (other
&& other
->status
!= Deleted
)
2342 other
->group
= NULL
;
2346 list_delete_all_node (group
->peer
);
2348 group
->conf
->as
= 0;
2349 group
->conf
->as_type
= AS_UNSPECIFIED
;
2355 peer_group_listen_range_add (struct peer_group
*group
, struct prefix
*range
)
2357 struct prefix
*prefix
;
2358 struct listnode
*node
, *nnode
;
2361 afi
= family2afi(range
->family
);
2363 /* Group needs remote AS configured. */
2364 if (group
->conf
->as_type
== AS_UNSPECIFIED
)
2365 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2367 /* Ensure no duplicates. Currently we don't care about overlaps. */
2368 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2370 if (prefix_same(range
, prefix
))
2374 prefix
= prefix_new();
2375 prefix_copy(prefix
, range
);
2376 listnode_add(group
->listen_range
[afi
], prefix
);
2381 peer_group_listen_range_del (struct peer_group
*group
, struct prefix
*range
)
2383 struct prefix
*prefix
, *prefix2
;
2384 struct listnode
*node
, *nnode
;
2387 char buf
[SU_ADDRSTRLEN
];
2389 afi
= family2afi(range
->family
);
2391 /* Identify the listen range. */
2392 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2394 if (prefix_same(range
, prefix
))
2399 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2401 prefix2str(prefix
, buf
, sizeof(buf
));
2403 /* Dispose off any dynamic neighbors that exist due to this listen range */
2404 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2406 if (!peer_dynamic_neighbor (peer
))
2409 prefix2
= sockunion2hostprefix(&peer
->su
);
2410 if (prefix_match(prefix
, prefix2
))
2412 if (bgp_debug_neighbor_events(peer
))
2413 zlog_debug ("Deleting dynamic neighbor %s group %s upon "
2414 "delete of listen range %s",
2415 peer
->host
, group
->name
, buf
);
2420 /* Get rid of the listen range */
2421 listnode_delete(group
->listen_range
[afi
], prefix
);
2426 /* Bind specified peer to peer group. */
2428 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2429 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
2431 int first_member
= 0;
2433 /* Check peer group's address family. */
2434 if (! group
->conf
->afc
[afi
][safi
])
2435 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
2437 /* Lookup the peer. */
2439 peer
= peer_lookup (bgp
, su
);
2441 /* Create a new peer. */
2444 if ((group
->conf
->as_type
== AS_SPECIFIED
) && (! group
->conf
->as
)) {
2445 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2448 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, afi
, safi
);
2449 peer
->group
= group
;
2450 peer
->af_group
[afi
][safi
] = 1;
2452 peer
= peer_lock (peer
); /* group->peer list reference */
2453 listnode_add (group
->peer
, peer
);
2454 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2455 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2460 /* When the peer already belongs to peer group, check the consistency. */
2461 if (peer
->af_group
[afi
][safi
])
2463 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2464 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2469 /* Check current peer group configuration. */
2470 if (peer_group_active (peer
)
2471 && strcmp (peer
->group
->name
, group
->name
) != 0)
2472 return BGP_ERR_PEER_GROUP_MISMATCH
;
2474 if (peer
->as_type
== AS_UNSPECIFIED
)
2476 peer
->as_type
= group
->conf
->as_type
;
2477 peer
->as
= group
->conf
->as
;
2480 if (! group
->conf
->as
)
2482 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2483 && peer_sort (group
->conf
) != peer_sort (peer
))
2487 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2490 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2494 peer
->af_group
[afi
][safi
] = 1;
2495 peer
->afc
[afi
][safi
] = 1;
2496 if (!peer_af_find(peer
, afi
, safi
) &&
2497 peer_af_create(peer
, afi
, safi
) == NULL
)
2499 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2503 peer
->group
= group
;
2505 peer
= peer_lock (peer
); /* group->peer list reference */
2506 listnode_add (group
->peer
, peer
);
2509 assert (group
&& peer
->group
== group
);
2513 /* Advertisement-interval reset */
2514 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2516 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2517 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2519 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2522 /* ebgp-multihop reset */
2523 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2524 group
->conf
->ttl
= 255;
2526 /* local-as reset */
2527 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2529 group
->conf
->change_local_as
= 0;
2530 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2531 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2535 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2537 struct listnode
*pn
;
2539 /* If it's not configured as RSERVER_CLIENT in any other address
2540 family, without being member of a peer_group, remove it from
2541 list bgp->rsclient.*/
2542 if (! peer_rsclient_active (peer
)
2543 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2545 peer_unlock (peer
); /* peer rsclient reference */
2546 list_delete_node (bgp
->rsclient
, pn
);
2548 /* Clear our own rsclient rib for this afi/safi. */
2549 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2552 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2554 /* Import policy. */
2555 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2557 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2558 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2559 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2562 /* Export policy. */
2563 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2564 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2566 XFREE(MTYPE_BGP_FILTER_NAME
, peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2567 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2568 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2572 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2573 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2575 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2577 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2578 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2579 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2582 bgp_session_reset(peer
);
2588 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2589 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2593 if (! peer
->af_group
[afi
][safi
])
2596 if (group
!= peer
->group
)
2597 return BGP_ERR_PEER_GROUP_MISMATCH
;
2599 peer
->af_group
[afi
][safi
] = 0;
2600 peer
->afc
[afi
][safi
] = 0;
2601 peer_af_flag_reset (peer
, afi
, safi
);
2602 if (peer_af_delete(peer
, afi
, safi
) != 0)
2604 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
2607 if (peer
->rib
[afi
][safi
])
2608 peer
->rib
[afi
][safi
] = NULL
;
2610 if (! peer_group_active (peer
))
2612 assert (listnode_lookup (group
->peer
, peer
));
2613 peer_unlock (peer
); /* peer group list reference */
2614 listnode_delete (group
->peer
, peer
);
2616 other
= peer
->doppelganger
;
2617 if (group
->conf
->as
)
2620 if (other
&& other
->status
!= Deleted
)
2625 listnode_delete(group
->peer
, other
);
2627 other
->group
= NULL
;
2632 bgp_bfd_deregister_peer(peer
);
2633 peer_global_config_reset (peer
);
2636 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2638 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2639 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2640 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2643 bgp_session_reset(peer
);
2649 bgp_startup_timer_expire (struct thread
*thread
)
2653 bgp
= THREAD_ARG (thread
);
2654 bgp
->t_startup
= NULL
;
2660 /* BGP instance creation by `router bgp' commands. */
2662 bgp_create (as_t
*as
, const char *name
)
2668 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2672 bgp
->peer_self
= peer_new (bgp
);
2673 if (bgp
->peer_self
->host
)
2674 XFREE(MTYPE_BGP_PEER_HOST
, bgp
->peer_self
->host
);
2675 bgp
->peer_self
->host
= XSTRDUP(MTYPE_BGP_PEER_HOST
, "Static announcement");
2676 bgp
->peer
= list_new ();
2677 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2679 bgp
->group
= list_new ();
2680 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2682 bgp
->rsclient
= list_new ();
2683 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2685 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2686 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2688 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2689 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2690 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2691 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2692 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2695 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2696 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2697 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
2698 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2699 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2700 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2701 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2702 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
2703 bgp
->dynamic_neighbors_count
= 0;
2708 bgp
->name
= XSTRDUP(MTYPE_BGP
, name
);
2710 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2711 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2713 THREAD_TIMER_ON (bm
->master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2714 bgp
, bgp
->restart_time
);
2716 update_bgp_group_init(bgp
);
2720 /* Return first entry of BGP. */
2722 bgp_get_default (void)
2725 return (listgetdata (listhead (bm
->bgp
)));
2729 /* Lookup BGP entry. */
2731 bgp_lookup (as_t as
, const char *name
)
2734 struct listnode
*node
, *nnode
;
2736 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2738 && ((bgp
->name
== NULL
&& name
== NULL
)
2739 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2744 /* Lookup BGP structure by view name. */
2746 bgp_lookup_by_name (const char *name
)
2749 struct listnode
*node
, *nnode
;
2751 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2752 if ((bgp
->name
== NULL
&& name
== NULL
)
2753 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2758 /* Called from VTY commands. */
2760 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2764 /* Multiple instance check. */
2765 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2768 bgp
= bgp_lookup_by_name (name
);
2770 bgp
= bgp_get_default ();
2772 /* Already exists. */
2778 return BGP_ERR_INSTANCE_MISMATCH
;
2786 /* BGP instance name can not be specified for single instance. */
2788 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2790 /* Get default BGP structure if exists. */
2791 bgp
= bgp_get_default ();
2798 return BGP_ERR_AS_MISMATCH
;
2805 bgp
= bgp_create (as
, name
);
2806 bgp_router_id_set(bgp
, &router_id_zebra
);
2809 bgp
->t_rmap_def_originate_eval
= NULL
;
2810 bgp
->t_rmap_update
= NULL
;
2811 bgp
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
2813 /* Create BGP server socket, if first instance. */
2814 if (list_isempty(bm
->bgp
)
2815 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2817 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2818 return BGP_ERR_INVALID_VALUE
;
2821 listnode_add (bm
->bgp
, bgp
);
2826 /* Delete BGP instance. */
2828 bgp_delete (struct bgp
*bgp
)
2831 struct peer_group
*group
;
2832 struct listnode
*node
, *pnode
;
2833 struct listnode
*next
, *pnext
;
2837 THREAD_OFF (bgp
->t_startup
);
2839 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2841 if (peer
->status
== Established
||
2842 peer
->status
== OpenSent
||
2843 peer
->status
== OpenConfirm
)
2845 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2846 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2850 if (bgp
->t_rmap_update
)
2851 BGP_TIMER_OFF(bgp
->t_rmap_update
);
2853 /* Delete static route. */
2854 bgp_static_delete (bgp
);
2856 /* Unset redistribution. */
2857 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2858 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2859 if (i
!= ZEBRA_ROUTE_BGP
)
2860 bgp_redistribute_unset (bgp
, afi
, i
, 0);
2862 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2864 for (ALL_LIST_ELEMENTS (group
->peer
, pnode
, pnext
, peer
))
2866 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2868 /* Send notify to remote peer. */
2869 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2872 peer_group_delete (group
);
2875 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2877 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2879 /* Send notify to remote peer. */
2880 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2886 assert (listcount (bgp
->rsclient
) == 0);
2888 if (bgp
->peer_self
) {
2889 peer_delete(bgp
->peer_self
);
2890 bgp
->peer_self
= NULL
;
2893 if (bgp
->t_rmap_def_originate_eval
)
2895 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
2899 update_bgp_group_free (bgp
);
2900 /* Remove visibility via the master list - there may however still be
2901 * routes to be processed still referencing the struct bgp.
2903 listnode_delete (bm
->bgp
, bgp
);
2904 if (list_isempty(bm
->bgp
))
2907 thread_master_free_unused(bm
->master
);
2908 bgp_unlock(bgp
); /* initial reference */
2913 static void bgp_free (struct bgp
*);
2916 bgp_lock (struct bgp
*bgp
)
2922 bgp_unlock(struct bgp
*bgp
)
2924 assert(bgp
->lock
> 0);
2925 if (--bgp
->lock
== 0)
2930 bgp_free (struct bgp
*bgp
)
2935 list_delete (bgp
->group
);
2936 list_delete (bgp
->peer
);
2937 list_delete (bgp
->rsclient
);
2940 XFREE(MTYPE_BGP
, bgp
->name
);
2942 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2943 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2945 if (bgp
->route
[afi
][safi
])
2946 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2947 if (bgp
->aggregate
[afi
][safi
])
2948 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2949 if (bgp
->rib
[afi
][safi
])
2950 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2952 XFREE (MTYPE_BGP
, bgp
);
2956 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2959 struct listnode
*node
, *nnode
;
2966 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2967 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2968 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2971 else if (bm
->bgp
!= NULL
)
2973 struct listnode
*bgpnode
, *nbgpnode
;
2975 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2976 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2977 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2978 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2985 peer_lookup_by_hostname (struct bgp
*bgp
, const char *hostname
)
2988 struct listnode
*node
, *nnode
;
2995 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2996 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
2997 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
3000 else if (bm
->bgp
!= NULL
)
3002 struct listnode
*bgpnode
, *nbgpnode
;
3004 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3005 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3006 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
3007 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
3014 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
3017 struct listnode
*node
, *nnode
;
3021 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3022 if (sockunion_same (&peer
->su
, su
)
3023 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
3026 else if (bm
->bgp
!= NULL
)
3028 struct listnode
*bgpnode
, *nbgpnode
;
3030 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3031 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3032 if (sockunion_same (&peer
->su
, su
)
3033 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
3040 peer_create_bind_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
,
3041 struct peer_group
*group
)
3047 /* Create peer first; we've already checked group config is valid. */
3048 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, 0, 0);
3053 peer
->group
= group
;
3054 peer
= peer_lock (peer
);
3055 listnode_add (group
->peer
, peer
);
3058 * Bind peer for all AFs configured for the group. We don't call
3059 * peer_group_bind as that is sub-optimal and does some stuff we don't want.
3061 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3062 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3064 if (!group
->conf
->afc
[afi
][safi
])
3066 peer
->af_group
[afi
][safi
] = 1;
3067 peer
->afc
[afi
][safi
] = 1;
3068 if (!peer_af_find(peer
, afi
, safi
) &&
3069 peer_af_create(peer
, afi
, safi
) == NULL
)
3071 zlog_err("couldn't create af structure for peer %s", peer
->host
);
3073 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
3076 /* Mark as dynamic, but also as a "config node" for other things to work. */
3077 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
3078 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
3084 peer_group_lookup_dynamic_neighbor_range (struct peer_group
* group
,
3085 struct prefix
* prefix
)
3087 struct listnode
*node
, *nnode
;
3088 struct prefix
*range
;
3091 afi
= family2afi(prefix
->family
);
3093 if (group
->listen_range
[afi
])
3094 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, range
))
3095 if (prefix_match(range
, prefix
))
3102 peer_group_lookup_dynamic_neighbor (struct bgp
*bgp
, struct prefix
*prefix
,
3103 struct prefix
**listen_range
)
3105 struct prefix
*range
= NULL
;
3106 struct peer_group
*group
= NULL
;
3107 struct listnode
*node
, *nnode
;
3109 *listen_range
= NULL
;
3112 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3113 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3116 else if (bm
->bgp
!= NULL
)
3118 struct listnode
*bgpnode
, *nbgpnode
;
3120 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3121 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3122 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3127 *listen_range
= range
;
3128 return (group
&& range
) ? group
: NULL
;
3132 peer_lookup_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
)
3134 struct peer_group
*group
;
3137 struct prefix
*prefix
;
3138 struct prefix
*listen_range
;
3140 char buf
[SU_ADDRSTRLEN
];
3141 char buf1
[SU_ADDRSTRLEN
];
3143 prefix
= sockunion2hostprefix(su
);
3148 /* See if incoming connection matches a configured listen range. */
3149 group
= peer_group_lookup_dynamic_neighbor (bgp
, prefix
, &listen_range
);
3160 prefix2str(prefix
, buf
, sizeof(buf
));
3161 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3163 if (bgp_debug_neighbor_events(NULL
))
3164 zlog_debug ("Dynamic Neighbor %s matches group %s listen range %s",
3165 buf
, group
->name
, buf1
);
3167 /* Are we within the listen limit? */
3168 dncount
= gbgp
->dynamic_neighbors_count
;
3170 if (dncount
>= gbgp
->dynamic_neighbors_limit
)
3172 if (bgp_debug_neighbor_events(NULL
))
3173 zlog_debug ("Dynamic Neighbor %s rejected - at limit %d",
3174 inet_sutop (su
, buf
), gbgp
->dynamic_neighbors_limit
);
3178 /* Ensure group is not disabled. */
3179 if (CHECK_FLAG (group
->conf
->flags
, PEER_FLAG_SHUTDOWN
))
3181 if (bgp_debug_neighbor_events(NULL
))
3182 zlog_debug ("Dynamic Neighbor %s rejected - group %s disabled",
3187 /* Check that at least one AF is activated for the group. */
3188 if (!peer_group_af_configured (group
))
3190 if (bgp_debug_neighbor_events(NULL
))
3191 zlog_debug ("Dynamic Neighbor %s rejected - no AF activated for group %s",
3196 /* Create dynamic peer and bind to associated group. */
3197 peer
= peer_create_bind_dynamic_neighbor (gbgp
, su
, group
);
3200 gbgp
->dynamic_neighbors_count
= ++dncount
;
3202 if (bgp_debug_neighbor_events(peer
))
3203 zlog_debug ("%s Dynamic Neighbor added, group %s count %d",
3204 peer
->host
, group
->name
, dncount
);
3209 void peer_drop_dynamic_neighbor (struct peer
*peer
)
3212 if (peer
->group
&& peer
->group
->bgp
)
3214 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3216 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3218 if (bgp_debug_neighbor_events(peer
))
3219 zlog_debug ("%s dropped from group %s, count %d",
3220 peer
->host
, peer
->group
->name
, dncount
);
3224 /* If peer is configured at least one address family return 1. */
3226 peer_active (struct peer
*peer
)
3228 if (BGP_PEER_SU_UNSPEC(peer
))
3230 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
3231 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3232 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
3233 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3234 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
3239 /* If peer is negotiated at least one address family return 1. */
3241 peer_active_nego (struct peer
*peer
)
3243 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3244 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3245 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3246 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3247 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
3252 /* peer_flag_change_type. */
3253 enum peer_change_type
3257 peer_change_reset_in
,
3258 peer_change_reset_out
,
3262 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
3263 enum peer_change_type type
)
3265 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3268 if (peer
->status
!= Established
)
3271 if (type
== peer_change_reset
)
3273 /* If we're resetting session, we've to delete both peer struct */
3274 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3275 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3276 PEER_FLAG_CONFIG_NODE
)))
3277 peer_delete(peer
->doppelganger
);
3279 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3280 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3282 else if (type
== peer_change_reset_in
)
3284 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3285 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3286 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3289 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3290 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3291 PEER_FLAG_CONFIG_NODE
)))
3292 peer_delete(peer
->doppelganger
);
3294 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3295 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3298 else if (type
== peer_change_reset_out
)
3300 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3301 bgp_announce_route (peer
, afi
, safi
);
3305 struct peer_flag_action
3310 /* This flag can be set for peer-group member. */
3311 u_char not_for_member
;
3313 /* Action when the flag is changed. */
3314 enum peer_change_type type
;
3316 /* Peer down cause */
3320 static const struct peer_flag_action peer_flag_action_list
[] =
3322 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3323 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3324 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3325 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3326 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3327 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3328 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3329 { PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3333 static const struct peer_flag_action peer_af_flag_action_list
[] =
3335 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3336 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3337 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3338 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3339 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3340 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3341 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3342 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3343 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3344 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3345 { PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3346 { PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
,1, peer_change_reset_out
},
3347 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3348 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3349 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3350 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3351 { PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3352 { PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3356 /* Proper action set. */
3358 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
3359 struct peer_flag_action
*action
, u_int32_t flag
)
3365 const struct peer_flag_action
*match
= NULL
;
3367 /* Check peer's frag action. */
3368 for (i
= 0; i
< size
; i
++)
3370 match
= &action_list
[i
];
3372 if (match
->flag
== 0)
3375 if (match
->flag
& flag
)
3379 if (match
->type
== peer_change_reset_in
)
3381 if (match
->type
== peer_change_reset_out
)
3383 if (match
->type
== peer_change_reset
)
3388 if (match
->not_for_member
)
3389 action
->not_for_member
= 1;
3393 /* Set peer clear type. */
3394 if (reset_in
&& reset_out
)
3395 action
->type
= peer_change_reset
;
3397 action
->type
= peer_change_reset_in
;
3399 action
->type
= peer_change_reset_out
;
3401 action
->type
= peer_change_none
;
3407 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
3409 if (flag
== PEER_FLAG_SHUTDOWN
)
3411 if (CHECK_FLAG (peer
->flags
, flag
))
3413 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3414 peer_nsf_stop (peer
);
3416 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3417 if (peer
->t_pmax_restart
)
3419 BGP_TIMER_OFF (peer
->t_pmax_restart
);
3420 if (bgp_debug_neighbor_events(peer
))
3421 zlog_debug ("%s Maximum-prefix restart timer canceled",
3425 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3426 peer_nsf_stop (peer
);
3428 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3429 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3430 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3432 bgp_session_reset(peer
);
3436 peer
->v_start
= BGP_INIT_START_TIMER
;
3437 BGP_EVENT_ADD (peer
, BGP_Stop
);
3440 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3442 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
3443 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3444 else if (flag
== PEER_FLAG_PASSIVE
)
3445 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
3446 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
3447 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
3449 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3450 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3453 bgp_session_reset(peer
);
3456 /* Change specified peer flag. */
3458 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
3462 struct peer_group
*group
;
3463 struct listnode
*node
, *nnode
;
3464 struct peer_flag_action action
;
3466 memset (&action
, 0, sizeof (struct peer_flag_action
));
3467 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
3469 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
3471 /* No flag action is found. */
3473 return BGP_ERR_INVALID_FLAG
;
3475 /* Not for peer-group member. */
3476 if (action
.not_for_member
&& peer_group_active (peer
))
3477 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3479 /* When unset the peer-group member's flag we have to check
3480 peer-group configuration. */
3481 if (! set
&& peer_group_active (peer
))
3482 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
3484 if (flag
== PEER_FLAG_SHUTDOWN
)
3485 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
3487 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3490 /* Flag conflict check. */
3492 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
3493 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
3494 return BGP_ERR_PEER_FLAG_CONFLICT
;
3496 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3498 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3500 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3505 SET_FLAG (peer
->flags
, flag
);
3507 UNSET_FLAG (peer
->flags
, flag
);
3509 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3511 if (action
.type
== peer_change_reset
)
3512 peer_flag_modify_action (peer
, flag
);
3517 /* peer-group member updates. */
3518 group
= peer
->group
;
3520 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3522 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3525 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3529 SET_FLAG (peer
->flags
, flag
);
3531 UNSET_FLAG (peer
->flags
, flag
);
3533 if (action
.type
== peer_change_reset
)
3534 peer_flag_modify_action (peer
, flag
);
3540 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
3542 return peer_flag_modify (peer
, flag
, 1);
3546 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
3548 return peer_flag_modify (peer
, flag
, 0);
3552 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
3554 if (peer
->af_group
[afi
][safi
])
3560 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
3565 struct listnode
*node
, *nnode
;
3566 struct peer_group
*group
;
3567 struct peer_flag_action action
;
3569 memset (&action
, 0, sizeof (struct peer_flag_action
));
3570 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
3572 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
3574 /* No flag action is found. */
3576 return BGP_ERR_INVALID_FLAG
;
3578 /* Adress family must be activated. */
3579 if (! peer
->afc
[afi
][safi
])
3580 return BGP_ERR_PEER_INACTIVE
;
3582 /* Not for peer-group member. */
3583 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
3584 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3586 /* Spcecial check for reflector client. */
3587 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
3588 && peer_sort (peer
) != BGP_PEER_IBGP
)
3589 return BGP_ERR_NOT_INTERNAL_PEER
;
3591 /* Spcecial check for remove-private-AS. */
3592 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
3593 && peer_sort (peer
) == BGP_PEER_IBGP
)
3594 return BGP_ERR_REMOVE_PRIVATE_AS
;
3596 /* as-override is not allowed for IBGP peers */
3597 if (flag
& PEER_FLAG_AS_OVERRIDE
3598 && peer_sort (peer
) == BGP_PEER_IBGP
)
3599 return BGP_ERR_AS_OVERRIDE
;
3601 /* When unset the peer-group member's flag we have to check
3602 peer-group configuration. */
3603 if (! set
&& peer
->af_group
[afi
][safi
])
3604 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
3605 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3607 /* When current flag configuration is same as requested one. */
3608 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3610 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3612 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3617 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3619 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3621 /* Execute action when peer is established. */
3622 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3623 && peer
->status
== Established
)
3625 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3626 bgp_clear_adj_in (peer
, afi
, safi
);
3629 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3630 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3631 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3632 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3633 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3634 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3635 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3636 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3638 peer_change_action (peer
, afi
, safi
, action
.type
);
3643 /* Peer group member updates. */
3644 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3646 group
= peer
->group
;
3648 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3650 if (! peer
->af_group
[afi
][safi
])
3653 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3656 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3660 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3662 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3664 if (peer
->status
== Established
)
3666 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3667 bgp_clear_adj_in (peer
, afi
, safi
);
3670 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3671 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3672 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3673 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3674 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3675 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3676 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3677 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3679 peer_change_action (peer
, afi
, safi
, action
.type
);
3688 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3690 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
3694 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3696 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
3699 /* EBGP multihop configuration. */
3701 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
3703 struct peer_group
*group
;
3704 struct listnode
*node
, *nnode
;
3707 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
3710 /* see comment in peer_ttl_security_hops_set() */
3713 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3715 group
= peer
->group
;
3716 if (group
->conf
->gtsm_hops
!= 0)
3717 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3719 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
3721 if (peer1
->sort
== BGP_PEER_IBGP
)
3724 if (peer1
->gtsm_hops
!= 0)
3725 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3730 if (peer
->gtsm_hops
!= 0)
3731 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3737 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3739 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3741 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3742 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3743 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3745 bgp_session_reset(peer
);
3750 group
= peer
->group
;
3751 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3753 if (peer
->sort
== BGP_PEER_IBGP
)
3756 peer
->ttl
= group
->conf
->ttl
;
3758 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3759 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3760 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3762 bgp_session_reset(peer
);
3769 peer_ebgp_multihop_unset (struct peer
*peer
)
3771 struct peer_group
*group
;
3772 struct listnode
*node
, *nnode
;
3774 if (peer
->sort
== BGP_PEER_IBGP
)
3777 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3778 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3780 if (peer_group_active (peer
))
3781 peer
->ttl
= peer
->group
->conf
->ttl
;
3785 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3787 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3788 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3789 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3791 bgp_session_reset(peer
);
3795 group
= peer
->group
;
3796 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3798 if (peer
->sort
== BGP_PEER_IBGP
)
3805 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3806 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3807 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3809 bgp_session_reset(peer
);
3816 /* Neighbor description. */
3818 peer_description_set (struct peer
*peer
, char *desc
)
3821 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3823 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3829 peer_description_unset (struct peer
*peer
)
3832 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3839 /* Neighbor update-source. */
3841 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3843 struct peer_group
*group
;
3844 struct listnode
*node
, *nnode
;
3846 if (peer
->update_if
)
3848 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3849 && strcmp (peer
->update_if
, ifname
) == 0)
3852 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3853 peer
->update_if
= NULL
;
3856 if (peer
->update_source
)
3858 sockunion_free (peer
->update_source
);
3859 peer
->update_source
= NULL
;
3862 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3864 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3866 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3868 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3869 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3870 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3873 bgp_session_reset(peer
);
3877 /* peer-group member updates. */
3878 group
= peer
->group
;
3879 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3881 if (peer
->update_if
)
3883 if (strcmp (peer
->update_if
, ifname
) == 0)
3886 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3887 peer
->update_if
= NULL
;
3890 if (peer
->update_source
)
3892 sockunion_free (peer
->update_source
);
3893 peer
->update_source
= NULL
;
3896 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3898 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3900 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3901 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3902 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3905 bgp_session_reset(peer
);
3911 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3913 struct peer_group
*group
;
3914 struct listnode
*node
, *nnode
;
3916 if (peer
->update_source
)
3918 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3919 && sockunion_cmp (peer
->update_source
, su
) == 0)
3921 sockunion_free (peer
->update_source
);
3922 peer
->update_source
= NULL
;
3925 if (peer
->update_if
)
3927 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3928 peer
->update_if
= NULL
;
3932 peer
->update_source
= sockunion_dup (su
);
3934 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3936 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3938 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3939 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3940 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3943 bgp_session_reset(peer
);
3947 /* peer-group member updates. */
3948 group
= peer
->group
;
3949 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3951 if (peer
->update_source
)
3953 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3955 sockunion_free (peer
->update_source
);
3956 peer
->update_source
= NULL
;
3959 if (peer
->update_if
)
3961 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3962 peer
->update_if
= NULL
;
3965 peer
->update_source
= sockunion_dup (su
);
3967 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3969 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3970 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3971 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3974 bgp_session_reset(peer
);
3980 peer_update_source_unset (struct peer
*peer
)
3982 union sockunion
*su
;
3983 struct peer_group
*group
;
3984 struct listnode
*node
, *nnode
;
3986 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3987 && ! peer
->update_source
3988 && ! peer
->update_if
)
3991 if (peer
->update_source
)
3993 sockunion_free (peer
->update_source
);
3994 peer
->update_source
= NULL
;
3996 if (peer
->update_if
)
3998 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3999 peer
->update_if
= NULL
;
4002 if (peer_group_active (peer
))
4004 group
= peer
->group
;
4006 if (group
->conf
->update_source
)
4008 su
= sockunion_dup (group
->conf
->update_source
);
4009 peer
->update_source
= su
;
4011 else if (group
->conf
->update_if
)
4013 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
4016 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4018 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4020 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4021 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4022 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4025 bgp_session_reset(peer
);
4029 /* peer-group member updates. */
4030 group
= peer
->group
;
4031 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4033 if (! peer
->update_source
&& ! peer
->update_if
)
4036 if (peer
->update_source
)
4038 sockunion_free (peer
->update_source
);
4039 peer
->update_source
= NULL
;
4042 if (peer
->update_if
)
4044 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
4045 peer
->update_if
= NULL
;
4048 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4050 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
4051 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4052 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4055 bgp_session_reset(peer
);
4061 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4064 struct peer_group
*group
;
4065 struct listnode
*node
, *nnode
;
4067 /* Adress family must be activated. */
4068 if (! peer
->afc
[afi
][safi
])
4069 return BGP_ERR_PEER_INACTIVE
;
4071 /* Default originate can't be used for peer group memeber. */
4072 if (peer_is_group_member (peer
, afi
, safi
))
4073 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4075 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
4076 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
4077 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
4079 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4083 if (peer
->default_rmap
[afi
][safi
].name
)
4084 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4085 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4086 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4090 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4092 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4093 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4094 bgp_default_originate (peer
, afi
, safi
, 0);
4095 bgp_announce_route (peer
, afi
, safi
);
4100 /* peer-group member updates. */
4101 group
= peer
->group
;
4102 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4104 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4108 if (peer
->default_rmap
[afi
][safi
].name
)
4109 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4110 peer
->default_rmap
[afi
][safi
].name
= XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap
);
4111 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4114 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4115 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4116 bgp_default_originate (peer
, afi
, safi
, 0);
4117 bgp_announce_route (peer
, afi
, safi
);
4124 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4126 struct peer_group
*group
;
4127 struct listnode
*node
, *nnode
;
4129 /* Adress family must be activated. */
4130 if (! peer
->afc
[afi
][safi
])
4131 return BGP_ERR_PEER_INACTIVE
;
4133 /* Default originate can't be used for peer group memeber. */
4134 if (peer_is_group_member (peer
, afi
, safi
))
4135 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4137 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
4139 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4141 if (peer
->default_rmap
[afi
][safi
].name
)
4142 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4143 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4144 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4147 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4149 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4150 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4151 bgp_default_originate (peer
, afi
, safi
, 1);
4152 bgp_announce_route (peer
, afi
, safi
);
4157 /* peer-group member updates. */
4158 group
= peer
->group
;
4159 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4161 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4163 if (peer
->default_rmap
[afi
][safi
].name
)
4164 XFREE(MTYPE_ROUTE_MAP_NAME
, peer
->default_rmap
[afi
][safi
].name
);
4165 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4166 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4168 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4169 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4170 bgp_default_originate (peer
, afi
, safi
, 1);
4171 bgp_announce_route (peer
, afi
, safi
);
4178 peer_port_set (struct peer
*peer
, u_int16_t port
)
4185 peer_port_unset (struct peer
*peer
)
4187 peer
->port
= BGP_PORT_DEFAULT
;
4191 /* neighbor weight. */
4193 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
4195 struct peer_group
*group
;
4196 struct listnode
*node
, *nnode
;
4198 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4199 peer
->weight
= weight
;
4201 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4204 /* peer-group member updates. */
4205 group
= peer
->group
;
4206 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4208 peer
->weight
= group
->conf
->weight
;
4213 peer_weight_unset (struct peer
*peer
)
4215 struct peer_group
*group
;
4216 struct listnode
*node
, *nnode
;
4218 /* Set default weight. */
4219 if (peer_group_active (peer
))
4220 peer
->weight
= peer
->group
->conf
->weight
;
4224 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4226 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4229 /* peer-group member updates. */
4230 group
= peer
->group
;
4231 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4239 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
4241 struct peer_group
*group
;
4242 struct listnode
*node
, *nnode
;
4244 /* Not for peer group memeber. */
4245 if (peer_group_active (peer
))
4246 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4248 /* keepalive value check. */
4249 if (keepalive
> 65535)
4250 return BGP_ERR_INVALID_VALUE
;
4252 /* Holdtime value check. */
4253 if (holdtime
> 65535)
4254 return BGP_ERR_INVALID_VALUE
;
4256 /* Holdtime value must be either 0 or greater than 3. */
4257 if (holdtime
< 3 && holdtime
!= 0)
4258 return BGP_ERR_INVALID_VALUE
;
4260 /* Set value to the configuration. */
4261 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4262 peer
->holdtime
= holdtime
;
4263 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
4265 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4268 /* peer-group member updates. */
4269 group
= peer
->group
;
4270 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4272 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4273 peer
->holdtime
= group
->conf
->holdtime
;
4274 peer
->keepalive
= group
->conf
->keepalive
;
4280 peer_timers_unset (struct peer
*peer
)
4282 struct peer_group
*group
;
4283 struct listnode
*node
, *nnode
;
4285 if (peer_group_active (peer
))
4286 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4288 /* Clear configuration. */
4289 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4290 peer
->keepalive
= 0;
4293 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4296 /* peer-group member updates. */
4297 group
= peer
->group
;
4298 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4300 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4302 peer
->keepalive
= 0;
4309 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
4311 struct peer_group
*group
;
4312 struct listnode
*node
, *nnode
;
4314 if (peer_group_active (peer
))
4315 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4317 if (connect
> 65535)
4318 return BGP_ERR_INVALID_VALUE
;
4320 /* Set value to the configuration. */
4321 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4322 peer
->connect
= connect
;
4324 /* Set value to timer setting. */
4325 peer
->v_connect
= connect
;
4327 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4330 /* peer-group member updates. */
4331 group
= peer
->group
;
4332 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4334 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4335 peer
->connect
= connect
;
4336 peer
->v_connect
= connect
;
4342 peer_timers_connect_unset (struct peer
*peer
)
4344 struct peer_group
*group
;
4345 struct listnode
*node
, *nnode
;
4347 if (peer_group_active (peer
))
4348 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4350 /* Clear configuration. */
4351 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4354 /* Set timer setting to default value. */
4355 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4357 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4360 /* peer-group member updates. */
4361 group
= peer
->group
;
4362 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4364 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4366 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4372 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
4374 struct peer_group
*group
;
4375 struct listnode
*node
, *nnode
;
4377 if (peer_group_active (peer
))
4378 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4381 return BGP_ERR_INVALID_VALUE
;
4383 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4384 peer
->routeadv
= routeadv
;
4385 peer
->v_routeadv
= routeadv
;
4387 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4388 update_group_adjust_peer_afs (peer
);
4389 if (peer
->status
== Established
)
4390 bgp_announce_route_all (peer
);
4394 /* peer-group member updates. */
4395 group
= peer
->group
;
4396 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4398 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4399 peer
->routeadv
= routeadv
;
4400 peer
->v_routeadv
= routeadv
;
4401 update_group_adjust_peer_afs (peer
);
4402 if (peer
->status
== Established
)
4403 bgp_announce_route_all (peer
);
4410 peer_advertise_interval_unset (struct peer
*peer
)
4412 struct peer_group
*group
;
4413 struct listnode
*node
, *nnode
;
4415 if (peer_group_active (peer
))
4416 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4418 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4421 if (peer
->sort
== BGP_PEER_IBGP
)
4422 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4424 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4426 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4427 update_group_adjust_peer_afs (peer
);
4428 if (peer
->status
== Established
)
4429 bgp_announce_route_all (peer
);
4433 /* peer-group member updates. */
4434 group
= peer
->group
;
4435 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4437 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4440 if (peer
->sort
== BGP_PEER_IBGP
)
4441 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4443 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4445 update_group_adjust_peer_afs (peer
);
4446 if (peer
->status
== Established
)
4447 bgp_announce_route_all (peer
);
4453 /* neighbor interface */
4455 peer_interface_set (struct peer
*peer
, const char *str
)
4458 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
4459 peer
->ifname
= XSTRDUP(MTYPE_BGP_PEER_IFNAME
, str
);
4463 peer_interface_unset (struct peer
*peer
)
4466 XFREE(MTYPE_BGP_PEER_IFNAME
, peer
->ifname
);
4467 peer
->ifname
= NULL
;
4472 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
4474 struct peer_group
*group
;
4475 struct listnode
*node
, *nnode
;
4477 if (allow_num
< 1 || allow_num
> 10)
4478 return BGP_ERR_INVALID_VALUE
;
4480 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4482 peer
->allowas_in
[afi
][safi
] = allow_num
;
4483 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4484 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4487 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4490 group
= peer
->group
;
4491 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4493 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4495 peer
->allowas_in
[afi
][safi
] = allow_num
;
4496 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4497 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4505 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4507 struct peer_group
*group
;
4508 struct listnode
*node
, *nnode
;
4510 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4512 peer
->allowas_in
[afi
][safi
] = 0;
4513 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4516 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4519 group
= peer
->group
;
4520 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4522 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4524 peer
->allowas_in
[afi
][safi
] = 0;
4525 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4532 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
4534 struct bgp
*bgp
= peer
->bgp
;
4535 struct peer_group
*group
;
4536 struct listnode
*node
, *nnode
;
4538 if (peer_sort (peer
) != BGP_PEER_EBGP
4539 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
4540 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
4543 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
4545 if (peer_group_active (peer
))
4546 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4549 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
4551 if (peer
->change_local_as
== as
&&
4552 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
4553 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
4554 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
4555 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
4558 peer
->change_local_as
= as
;
4560 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4562 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4565 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4567 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4569 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4571 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4573 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4574 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4575 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4578 bgp_session_reset(peer
);
4582 group
= peer
->group
;
4583 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4585 peer
->change_local_as
= as
;
4587 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4589 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4592 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4594 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4596 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4598 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4599 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4600 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4603 BGP_EVENT_ADD (peer
, BGP_Stop
);
4610 peer_local_as_unset (struct peer
*peer
)
4612 struct peer_group
*group
;
4613 struct listnode
*node
, *nnode
;
4615 if (peer_group_active (peer
))
4616 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4618 if (! peer
->change_local_as
)
4621 peer
->change_local_as
= 0;
4622 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4623 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4625 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4627 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4629 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4630 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4631 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4634 BGP_EVENT_ADD (peer
, BGP_Stop
);
4639 group
= peer
->group
;
4640 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4642 peer
->change_local_as
= 0;
4643 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4644 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4646 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4648 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4649 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4650 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4653 bgp_session_reset(peer
);
4658 /* Set password for authenticating with the peer. */
4660 peer_password_set (struct peer
*peer
, const char *password
)
4662 struct listnode
*nn
, *nnode
;
4663 int len
= password
? strlen(password
) : 0;
4664 int ret
= BGP_SUCCESS
;
4666 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
4667 return BGP_ERR_INVALID_VALUE
;
4669 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
4670 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4674 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4676 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
4678 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4680 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4681 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4683 bgp_session_reset(peer
);
4685 if (BGP_PEER_SU_UNSPEC(peer
))
4688 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
4691 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4693 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
4697 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4699 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
4701 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4702 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4704 bgp_session_reset(peer
);
4706 if (! BGP_PEER_SU_UNSPEC(peer
))
4708 if (bgp_md5_set (peer
) < 0)
4709 ret
= BGP_ERR_TCPSIG_FAILED
;
4717 peer_password_unset (struct peer
*peer
)
4719 struct listnode
*nn
, *nnode
;
4722 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4725 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4727 if (peer_group_active (peer
)
4728 && peer
->group
->conf
->password
4729 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
4730 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
4732 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4733 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4735 bgp_session_reset(peer
);
4738 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4740 peer
->password
= NULL
;
4742 if (! BGP_PEER_SU_UNSPEC(peer
))
4743 bgp_md5_unset (peer
);
4748 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4749 peer
->password
= NULL
;
4751 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4753 if (!peer
->password
)
4756 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4757 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4759 bgp_session_reset(peer
);
4761 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4762 peer
->password
= NULL
;
4764 if (! BGP_PEER_SU_UNSPEC(peer
))
4765 bgp_md5_unset (peer
);
4772 * Helper function that is called after the name of the policy
4773 * being used by a peer has changed (AF specific). Automatically
4774 * initiates inbound or outbound processing as needed.
4777 peer_on_policy_change (struct peer
*peer
, afi_t afi
, safi_t safi
, int outbound
)
4781 update_group_adjust_peer (peer_af_find (peer
, afi
, safi
));
4782 if (peer
->status
== Established
)
4783 bgp_announce_route(peer
, afi
, safi
);
4787 if (peer
->status
!= Established
)
4790 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4791 bgp_soft_reconfig_in (peer
, afi
, safi
);
4792 else if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4793 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4794 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4799 /* Set distribute list to the peer. */
4801 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4804 struct bgp_filter
*filter
;
4805 struct peer_group
*group
;
4806 struct listnode
*node
, *nnode
;
4808 if (! peer
->afc
[afi
][safi
])
4809 return BGP_ERR_PEER_INACTIVE
;
4811 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4812 return BGP_ERR_INVALID_VALUE
;
4814 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4815 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4817 filter
= &peer
->filter
[afi
][safi
];
4819 if (filter
->plist
[direct
].name
)
4820 return BGP_ERR_PEER_FILTER_CONFLICT
;
4822 if (filter
->dlist
[direct
].name
)
4823 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4824 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4825 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4827 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4829 peer_on_policy_change(peer
, afi
, safi
,
4830 (direct
== FILTER_OUT
) ? 1 : 0);
4834 group
= peer
->group
;
4835 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4837 filter
= &peer
->filter
[afi
][safi
];
4839 if (! peer
->af_group
[afi
][safi
])
4842 if (filter
->dlist
[direct
].name
)
4843 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4844 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
4845 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4846 peer_on_policy_change(peer
, afi
, safi
,
4847 (direct
== FILTER_OUT
) ? 1 : 0);
4854 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4856 struct bgp_filter
*filter
;
4857 struct bgp_filter
*gfilter
;
4858 struct peer_group
*group
;
4859 struct listnode
*node
, *nnode
;
4861 if (! peer
->afc
[afi
][safi
])
4862 return BGP_ERR_PEER_INACTIVE
;
4864 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4865 return BGP_ERR_INVALID_VALUE
;
4867 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4868 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4870 filter
= &peer
->filter
[afi
][safi
];
4872 /* apply peer-group filter */
4873 if (peer
->af_group
[afi
][safi
])
4875 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4877 if (gfilter
->dlist
[direct
].name
)
4879 if (filter
->dlist
[direct
].name
)
4880 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4881 filter
->dlist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->dlist
[direct
].name
);
4882 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4883 peer_on_policy_change(peer
, afi
, safi
,
4884 (direct
== FILTER_OUT
) ? 1 : 0);
4889 if (filter
->dlist
[direct
].name
)
4890 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4891 filter
->dlist
[direct
].name
= NULL
;
4892 filter
->dlist
[direct
].alist
= NULL
;
4894 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4896 peer_on_policy_change(peer
, afi
, safi
,
4897 (direct
== FILTER_OUT
) ? 1 : 0);
4901 group
= peer
->group
;
4902 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4904 filter
= &peer
->filter
[afi
][safi
];
4906 if (! peer
->af_group
[afi
][safi
])
4909 if (filter
->dlist
[direct
].name
)
4910 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->dlist
[direct
].name
);
4911 filter
->dlist
[direct
].name
= NULL
;
4912 filter
->dlist
[direct
].alist
= NULL
;
4913 peer_on_policy_change(peer
, afi
, safi
,
4914 (direct
== FILTER_OUT
) ? 1 : 0);
4920 /* Update distribute list. */
4922 peer_distribute_update (struct access_list
*access
)
4927 struct listnode
*mnode
, *mnnode
;
4928 struct listnode
*node
, *nnode
;
4931 struct peer_group
*group
;
4932 struct bgp_filter
*filter
;
4934 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4937 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, access
->name
,
4939 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4941 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4942 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4944 filter
= &peer
->filter
[afi
][safi
];
4946 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4948 if (filter
->dlist
[direct
].name
)
4949 filter
->dlist
[direct
].alist
=
4950 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4952 filter
->dlist
[direct
].alist
= NULL
;
4956 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4958 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4959 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4961 filter
= &group
->conf
->filter
[afi
][safi
];
4963 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4965 if (filter
->dlist
[direct
].name
)
4966 filter
->dlist
[direct
].alist
=
4967 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4969 filter
->dlist
[direct
].alist
= NULL
;
4976 /* Set prefix list to the peer. */
4978 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4981 struct bgp_filter
*filter
;
4982 struct peer_group
*group
;
4983 struct listnode
*node
, *nnode
;
4985 if (! peer
->afc
[afi
][safi
])
4986 return BGP_ERR_PEER_INACTIVE
;
4988 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4989 return BGP_ERR_INVALID_VALUE
;
4991 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4992 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4994 filter
= &peer
->filter
[afi
][safi
];
4996 if (filter
->dlist
[direct
].name
)
4997 return BGP_ERR_PEER_FILTER_CONFLICT
;
4999 if (filter
->plist
[direct
].name
)
5000 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5001 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5002 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
5004 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5006 peer_on_policy_change(peer
, afi
, safi
,
5007 (direct
== FILTER_OUT
) ? 1 : 0);
5011 group
= peer
->group
;
5012 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5014 filter
= &peer
->filter
[afi
][safi
];
5016 if (! peer
->af_group
[afi
][safi
])
5019 if (filter
->plist
[direct
].name
)
5020 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5021 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5022 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
5023 peer_on_policy_change(peer
, afi
, safi
,
5024 (direct
== FILTER_OUT
) ? 1 : 0);
5030 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5032 struct bgp_filter
*filter
;
5033 struct bgp_filter
*gfilter
;
5034 struct peer_group
*group
;
5035 struct listnode
*node
, *nnode
;
5037 if (! peer
->afc
[afi
][safi
])
5038 return BGP_ERR_PEER_INACTIVE
;
5040 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5041 return BGP_ERR_INVALID_VALUE
;
5043 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5044 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5046 filter
= &peer
->filter
[afi
][safi
];
5048 /* apply peer-group filter */
5049 if (peer
->af_group
[afi
][safi
])
5051 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5053 if (gfilter
->plist
[direct
].name
)
5055 if (filter
->plist
[direct
].name
)
5056 XSTRDUP(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5057 filter
->plist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->plist
[direct
].name
);
5058 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
5059 peer_on_policy_change(peer
, afi
, safi
,
5060 (direct
== FILTER_OUT
) ? 1 : 0);
5065 if (filter
->plist
[direct
].name
)
5066 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5067 filter
->plist
[direct
].name
= NULL
;
5068 filter
->plist
[direct
].plist
= NULL
;
5070 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5072 peer_on_policy_change(peer
, afi
, safi
,
5073 (direct
== FILTER_OUT
) ? 1 : 0);
5077 group
= peer
->group
;
5078 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5080 filter
= &peer
->filter
[afi
][safi
];
5082 if (! peer
->af_group
[afi
][safi
])
5085 if (filter
->plist
[direct
].name
)
5086 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->plist
[direct
].name
);
5087 filter
->plist
[direct
].name
= NULL
;
5088 filter
->plist
[direct
].plist
= NULL
;
5089 peer_on_policy_change(peer
, afi
, safi
,
5090 (direct
== FILTER_OUT
) ? 1 : 0);
5096 /* Update prefix-list list. */
5098 peer_prefix_list_update (struct prefix_list
*plist
)
5100 struct listnode
*mnode
, *mnnode
;
5101 struct listnode
*node
, *nnode
;
5104 struct peer_group
*group
;
5105 struct bgp_filter
*filter
;
5110 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5114 * Update the prefix-list on update groups.
5116 update_group_policy_update(bgp
, BGP_POLICY_PREFIX_LIST
,
5117 plist
? plist
->name
: NULL
, 0, 0);
5119 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5121 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5122 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5124 filter
= &peer
->filter
[afi
][safi
];
5126 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5128 if (filter
->plist
[direct
].name
)
5129 filter
->plist
[direct
].plist
=
5130 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5132 filter
->plist
[direct
].plist
= NULL
;
5136 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5138 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5139 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5141 filter
= &group
->conf
->filter
[afi
][safi
];
5143 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5145 if (filter
->plist
[direct
].name
)
5146 filter
->plist
[direct
].plist
=
5147 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5149 filter
->plist
[direct
].plist
= NULL
;
5157 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5160 struct bgp_filter
*filter
;
5161 struct peer_group
*group
;
5162 struct listnode
*node
, *nnode
;
5164 if (! peer
->afc
[afi
][safi
])
5165 return BGP_ERR_PEER_INACTIVE
;
5167 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5168 return BGP_ERR_INVALID_VALUE
;
5170 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5171 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5173 filter
= &peer
->filter
[afi
][safi
];
5175 if (filter
->aslist
[direct
].name
)
5176 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5177 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5178 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5180 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5182 peer_on_policy_change(peer
, afi
, safi
,
5183 (direct
== FILTER_OUT
) ? 1 : 0);
5187 group
= peer
->group
;
5188 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5190 filter
= &peer
->filter
[afi
][safi
];
5192 if (! peer
->af_group
[afi
][safi
])
5195 if (filter
->aslist
[direct
].name
)
5196 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5197 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5198 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5199 peer_on_policy_change(peer
, afi
, safi
,
5200 (direct
== FILTER_OUT
) ? 1 : 0);
5206 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
5208 struct bgp_filter
*filter
;
5209 struct bgp_filter
*gfilter
;
5210 struct peer_group
*group
;
5211 struct listnode
*node
, *nnode
;
5213 if (! peer
->afc
[afi
][safi
])
5214 return BGP_ERR_PEER_INACTIVE
;
5216 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5217 return BGP_ERR_INVALID_VALUE
;
5219 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5220 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5222 filter
= &peer
->filter
[afi
][safi
];
5224 /* apply peer-group filter */
5225 if (peer
->af_group
[afi
][safi
])
5227 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5229 if (gfilter
->aslist
[direct
].name
)
5231 if (filter
->aslist
[direct
].name
)
5232 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5233 filter
->aslist
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->aslist
[direct
].name
);
5234 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
5235 peer_on_policy_change(peer
, afi
, safi
,
5236 (direct
== FILTER_OUT
) ? 1 : 0);
5241 if (filter
->aslist
[direct
].name
)
5242 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5243 filter
->aslist
[direct
].name
= NULL
;
5244 filter
->aslist
[direct
].aslist
= NULL
;
5246 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5248 peer_on_policy_change(peer
, afi
, safi
,
5249 (direct
== FILTER_OUT
) ? 1 : 0);
5253 group
= peer
->group
;
5254 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5256 filter
= &peer
->filter
[afi
][safi
];
5258 if (! peer
->af_group
[afi
][safi
])
5261 if (filter
->aslist
[direct
].name
)
5262 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->aslist
[direct
].name
);
5263 filter
->aslist
[direct
].name
= NULL
;
5264 filter
->aslist
[direct
].aslist
= NULL
;
5265 peer_on_policy_change(peer
, afi
, safi
,
5266 (direct
== FILTER_OUT
) ? 1 : 0);
5273 peer_aslist_update (const char *aslist_name
)
5278 struct listnode
*mnode
, *mnnode
;
5279 struct listnode
*node
, *nnode
;
5282 struct peer_group
*group
;
5283 struct bgp_filter
*filter
;
5285 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5287 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, aslist_name
,
5290 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5292 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5293 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5295 filter
= &peer
->filter
[afi
][safi
];
5297 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5299 if (filter
->aslist
[direct
].name
)
5300 filter
->aslist
[direct
].aslist
=
5301 as_list_lookup (filter
->aslist
[direct
].name
);
5303 filter
->aslist
[direct
].aslist
= NULL
;
5307 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5309 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5310 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5312 filter
= &group
->conf
->filter
[afi
][safi
];
5314 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5316 if (filter
->aslist
[direct
].name
)
5317 filter
->aslist
[direct
].aslist
=
5318 as_list_lookup (filter
->aslist
[direct
].name
);
5320 filter
->aslist
[direct
].aslist
= NULL
;
5328 peer_aslist_add (char *aslist_name
)
5330 peer_aslist_update (aslist_name
);
5331 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
5335 peer_aslist_del (const char *aslist_name
)
5337 peer_aslist_update (aslist_name
);
5338 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
5343 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5346 struct bgp_filter
*filter
;
5347 struct peer_group
*group
;
5348 struct listnode
*node
, *nnode
;
5350 if (! peer
->afc
[afi
][safi
])
5351 return BGP_ERR_PEER_INACTIVE
;
5353 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5354 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5355 return BGP_ERR_INVALID_VALUE
;
5357 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5358 && peer_is_group_member (peer
, afi
, safi
))
5359 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5361 filter
= &peer
->filter
[afi
][safi
];
5363 if (filter
->map
[direct
].name
)
5364 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5366 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5367 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5369 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5371 peer_on_policy_change(peer
, afi
, safi
,
5372 (direct
== RMAP_OUT
) ? 1 : 0);
5376 group
= peer
->group
;
5377 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5379 filter
= &peer
->filter
[afi
][safi
];
5381 if (! peer
->af_group
[afi
][safi
])
5384 if (filter
->map
[direct
].name
)
5385 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5386 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5387 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5388 peer_on_policy_change(peer
, afi
, safi
,
5389 (direct
== RMAP_OUT
) ? 1 : 0);
5394 /* Unset route-map from the peer. */
5396 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5398 struct bgp_filter
*filter
;
5399 struct bgp_filter
*gfilter
;
5400 struct peer_group
*group
;
5401 struct listnode
*node
, *nnode
;
5403 if (! peer
->afc
[afi
][safi
])
5404 return BGP_ERR_PEER_INACTIVE
;
5406 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5407 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5408 return BGP_ERR_INVALID_VALUE
;
5410 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5411 && peer_is_group_member (peer
, afi
, safi
))
5412 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5414 filter
= &peer
->filter
[afi
][safi
];
5416 /* apply peer-group filter */
5417 if (peer
->af_group
[afi
][safi
])
5419 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5421 if (gfilter
->map
[direct
].name
)
5423 if (filter
->map
[direct
].name
)
5424 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5425 filter
->map
[direct
].name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, gfilter
->map
[direct
].name
);
5426 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
5427 peer_on_policy_change(peer
, afi
, safi
,
5428 (direct
== RMAP_OUT
) ? 1 : 0);
5433 if (filter
->map
[direct
].name
)
5434 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5435 filter
->map
[direct
].name
= NULL
;
5436 filter
->map
[direct
].map
= NULL
;
5438 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5440 peer_on_policy_change(peer
, afi
, safi
,
5441 (direct
== RMAP_OUT
) ? 1 : 0);
5445 group
= peer
->group
;
5446 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5448 filter
= &peer
->filter
[afi
][safi
];
5450 if (! peer
->af_group
[afi
][safi
])
5453 if (filter
->map
[direct
].name
)
5454 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->map
[direct
].name
);
5455 filter
->map
[direct
].name
= NULL
;
5456 filter
->map
[direct
].map
= NULL
;
5457 peer_on_policy_change(peer
, afi
, safi
,
5458 (direct
== RMAP_OUT
) ? 1 : 0);
5463 /* Set unsuppress-map to the peer. */
5465 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5468 struct bgp_filter
*filter
;
5469 struct peer_group
*group
;
5470 struct listnode
*node
, *nnode
;
5472 if (! peer
->afc
[afi
][safi
])
5473 return BGP_ERR_PEER_INACTIVE
;
5475 if (peer_is_group_member (peer
, afi
, safi
))
5476 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5478 filter
= &peer
->filter
[afi
][safi
];
5480 if (filter
->usmap
.name
)
5481 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5483 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5484 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5486 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5488 peer_on_policy_change(peer
, afi
, safi
, 1);
5492 group
= peer
->group
;
5493 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5495 filter
= &peer
->filter
[afi
][safi
];
5497 if (! peer
->af_group
[afi
][safi
])
5500 if (filter
->usmap
.name
)
5501 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5502 filter
->usmap
.name
= XSTRDUP(MTYPE_BGP_FILTER_NAME
, name
);
5503 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5504 peer_on_policy_change(peer
, afi
, safi
, 1);
5509 /* Unset route-map from the peer. */
5511 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5513 struct bgp_filter
*filter
;
5514 struct peer_group
*group
;
5515 struct listnode
*node
, *nnode
;
5517 if (! peer
->afc
[afi
][safi
])
5518 return BGP_ERR_PEER_INACTIVE
;
5520 if (peer_is_group_member (peer
, afi
, safi
))
5521 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5523 filter
= &peer
->filter
[afi
][safi
];
5525 if (filter
->usmap
.name
)
5526 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5527 filter
->usmap
.name
= NULL
;
5528 filter
->usmap
.map
= NULL
;
5530 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5532 peer_on_policy_change(peer
, afi
, safi
, 1);
5536 group
= peer
->group
;
5537 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5539 filter
= &peer
->filter
[afi
][safi
];
5541 if (! peer
->af_group
[afi
][safi
])
5544 if (filter
->usmap
.name
)
5545 XFREE(MTYPE_BGP_FILTER_NAME
, filter
->usmap
.name
);
5546 filter
->usmap
.name
= NULL
;
5547 filter
->usmap
.map
= NULL
;
5548 peer_on_policy_change(peer
, afi
, safi
, 1);
5554 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5555 u_int32_t max
, u_char threshold
,
5556 int warning
, u_int16_t restart
)
5558 struct peer_group
*group
;
5559 struct listnode
*node
, *nnode
;
5561 if (! peer
->afc
[afi
][safi
])
5562 return BGP_ERR_PEER_INACTIVE
;
5564 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5565 peer
->pmax
[afi
][safi
] = max
;
5566 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5567 peer
->pmax_restart
[afi
][safi
] = restart
;
5569 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5571 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5573 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5575 group
= peer
->group
;
5576 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5578 if (! peer
->af_group
[afi
][safi
])
5581 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5582 peer
->pmax
[afi
][safi
] = max
;
5583 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5584 peer
->pmax_restart
[afi
][safi
] = restart
;
5586 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5588 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5590 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5591 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5596 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5597 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5604 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5606 struct peer_group
*group
;
5607 struct listnode
*node
, *nnode
;
5609 if (! peer
->afc
[afi
][safi
])
5610 return BGP_ERR_PEER_INACTIVE
;
5612 /* apply peer-group config */
5613 if (peer
->af_group
[afi
][safi
])
5615 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5616 PEER_FLAG_MAX_PREFIX
))
5617 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5619 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5621 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5622 PEER_FLAG_MAX_PREFIX_WARNING
))
5623 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5625 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5627 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
5628 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
5629 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
5633 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5634 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5635 peer
->pmax
[afi
][safi
] = 0;
5636 peer
->pmax_threshold
[afi
][safi
] = 0;
5637 peer
->pmax_restart
[afi
][safi
] = 0;
5639 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5642 group
= peer
->group
;
5643 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5645 if (! peer
->af_group
[afi
][safi
])
5648 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5649 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5650 peer
->pmax
[afi
][safi
] = 0;
5651 peer
->pmax_threshold
[afi
][safi
] = 0;
5652 peer
->pmax_restart
[afi
][safi
] = 0;
5657 int is_ebgp_multihop_configured (struct peer
*peer
)
5659 struct peer_group
*group
;
5660 struct listnode
*node
, *nnode
;
5663 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5665 group
= peer
->group
;
5666 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5667 (group
->conf
->ttl
!= 1))
5670 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
5672 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
5679 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5686 /* Set # of hops between us and BGP peer. */
5688 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
5690 struct peer_group
*group
;
5691 struct listnode
*node
, *nnode
;
5694 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
5696 /* We cannot configure ttl-security hops when ebgp-multihop is already
5697 set. For non peer-groups, the check is simple. For peer-groups, it's
5698 slightly messy, because we need to check both the peer-group structure
5699 and all peer-group members for any trace of ebgp-multihop configuration
5700 before actually applying the ttl-security rules. Cisco really made a
5701 mess of this configuration parameter, and OpenBGPD got it right.
5704 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
))
5706 if (is_ebgp_multihop_configured (peer
))
5707 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
5709 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5711 peer
->gtsm_hops
= gtsm_hops
;
5713 /* Calling ebgp multihop also resets the session.
5714 * On restart, NHT will get setup correctly as will the
5715 * min & max ttls on the socket. The return value is
5718 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5725 group
= peer
->group
;
5726 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5728 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5730 /* Calling ebgp multihop also resets the session.
5731 * On restart, NHT will get setup correctly as will the
5732 * min & max ttls on the socket. The return value is
5735 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5741 /* Post the first gtsm setup or if its ibgp, maxttl setting isn't
5742 * necessary, just set the minttl.
5744 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5746 peer
->gtsm_hops
= gtsm_hops
;
5749 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5750 MAXTTL
+ 1 - gtsm_hops
);
5751 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5752 (peer
->doppelganger
->fd
>= 0))
5753 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5754 MAXTTL
+ 1 - gtsm_hops
);
5758 group
= peer
->group
;
5759 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5761 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5763 /* Change setting of existing peer
5764 * established then change value (may break connectivity)
5765 * not established yet (teardown session and restart)
5766 * no session then do nothing (will get handled by next connection)
5768 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
5769 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5770 MAXTTL
+ 1 - peer
->gtsm_hops
);
5771 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5772 (peer
->doppelganger
->fd
>= 0))
5773 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5774 MAXTTL
+ 1 - gtsm_hops
);
5784 peer_ttl_security_hops_unset (struct peer
*peer
)
5786 struct peer_group
*group
;
5787 struct listnode
*node
, *nnode
;
5790 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
5792 /* if a peer-group member, then reset to peer-group default rather than 0 */
5793 if (peer_group_active (peer
))
5794 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
5796 peer
->gtsm_hops
= 0;
5798 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5800 /* Invoking ebgp_multihop_set will set the TTL back to the original
5801 * value as well as restting the NHT and such. The session is reset.
5803 if (peer
->sort
== BGP_PEER_EBGP
)
5804 ret
= peer_ebgp_multihop_unset (peer
);
5808 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5810 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5811 (peer
->doppelganger
->fd
>= 0))
5812 sockopt_minttl (peer
->su
.sa
.sa_family
,
5813 peer
->doppelganger
->fd
, 0);
5818 group
= peer
->group
;
5819 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5821 peer
->gtsm_hops
= 0;
5822 if (peer
->sort
== BGP_PEER_EBGP
)
5823 ret
= peer_ebgp_multihop_unset (peer
);
5827 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5829 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5830 (peer
->doppelganger
->fd
>= 0))
5831 sockopt_minttl (peer
->su
.sa
.sa_family
,
5832 peer
->doppelganger
->fd
, 0);
5841 * If peer clear is invoked in a loop for all peers on the BGP instance,
5842 * it may end up freeing the doppelganger, and if this was the next node
5843 * to the current node, we would end up accessing the freed next node.
5844 * Pass along additional parameter which can be updated if next node
5845 * is freed; only required when walking the peer list on BGP instance.
5848 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
5850 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5852 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
5854 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
5855 if (peer
->t_pmax_restart
)
5857 BGP_TIMER_OFF (peer
->t_pmax_restart
);
5858 if (bgp_debug_neighbor_events(peer
))
5859 zlog_debug ("%s Maximum-prefix restart timer canceled",
5862 BGP_EVENT_ADD (peer
, BGP_Start
);
5866 peer
->v_start
= BGP_INIT_START_TIMER
;
5867 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5868 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5869 BGP_NOTIFY_CEASE_ADMIN_RESET
);
5871 bgp_session_reset_safe(peer
, nnode
);
5877 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
5878 enum bgp_clear_type stype
)
5880 struct peer_af
*paf
;
5882 if (peer
->status
!= Established
)
5885 if (! peer
->afc
[afi
][safi
])
5886 return BGP_ERR_AF_UNCONFIGURED
;
5888 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
5890 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
5892 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
5893 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
5896 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
5898 /* Clear the "neighbor x.x.x.x default-originate" flag */
5899 paf
= peer_af_find (peer
, afi
, safi
);
5900 if (paf
&& paf
->subgroup
&&
5901 CHECK_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
5902 UNSET_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5904 bgp_announce_route (peer
, afi
, safi
);
5907 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5909 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
5910 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
5911 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5913 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
5916 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
5917 prefix_type
= ORF_TYPE_PREFIX
;
5919 prefix_type
= ORF_TYPE_PREFIX_OLD
;
5921 if (filter
->plist
[FILTER_IN
].plist
)
5923 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5924 bgp_route_refresh_send (peer
, afi
, safi
,
5925 prefix_type
, REFRESH_DEFER
, 1);
5926 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
5927 REFRESH_IMMEDIATE
, 0);
5931 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5932 bgp_route_refresh_send (peer
, afi
, safi
,
5933 prefix_type
, REFRESH_IMMEDIATE
, 1);
5935 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5941 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
5942 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5944 /* If neighbor has soft reconfiguration inbound flag.
5945 Use Adj-RIB-In database. */
5946 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5947 bgp_soft_reconfig_in (peer
, afi
, safi
);
5950 /* If neighbor has route refresh capability, send route refresh
5951 message to the peer. */
5952 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5953 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5954 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5956 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5962 /* Display peer uptime.*/
5963 /* XXX: why does this function return char * when it takes buffer? */
5965 peer_uptime (time_t uptime2
, char *buf
, size_t len
, u_char use_json
, json_object
*json
)
5970 /* Check buffer length. */
5971 if (len
< BGP_UPTIME_LEN
)
5975 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5976 /* XXX: should return status instead of buf... */
5977 snprintf (buf
, len
, "<error> ");
5982 /* If there is no connection has been done before print `never'. */
5986 json_object_string_add(json
, "peerUptime", "never");
5988 snprintf (buf
, len
, "never");
5992 /* Get current time. */
5993 uptime1
= bgp_clock ();
5995 tm
= gmtime (&uptime1
);
5997 /* Making formatted timer strings. */
5998 #define ONE_DAY_SECOND 60*60*24
5999 #define ONE_WEEK_SECOND 60*60*24*7
6004 int day_msec
= 86400000;
6005 int hour_msec
= 3600000;
6006 int minute_msec
= 60000;
6007 int sec_msec
= 1000;
6009 if (uptime1
< ONE_DAY_SECOND
)
6011 time_store
= hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
6012 json_object_int_add(json
, "peerUptimeMsec", time_store
);
6013 snprintf (buf
, len
, "%02d:%02d:%02d",
6014 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
6016 else if (uptime1
< ONE_WEEK_SECOND
)
6018 time_store
= day_msec
* tm
->tm_yday
+ hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
6019 json_object_int_add(json
, "peerUptimeMsec", time_store
);
6020 snprintf (buf
, len
, "%dd%02dh%02dm",
6021 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
6025 time_store
= day_msec
* tm
->tm_yday
+ hour_msec
* tm
->tm_hour
+ minute_msec
* tm
->tm_min
+ sec_msec
* tm
->tm_sec
;
6026 json_object_int_add(json
, "peerUptimeMsec", time_store
);
6027 snprintf (buf
, len
, "%02dw%dd%02dh",
6028 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
6033 if (uptime1
< ONE_DAY_SECOND
)
6034 snprintf (buf
, len
, "%02d:%02d:%02d",
6035 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
6036 else if (uptime1
< ONE_WEEK_SECOND
)
6037 snprintf (buf
, len
, "%dd%02dh%02dm",
6038 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
6040 snprintf (buf
, len
, "%02dw%dd%02dh",
6041 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
6047 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
6048 afi_t afi
, safi_t safi
)
6050 struct bgp_filter
*filter
;
6051 struct bgp_filter
*gfilter
= NULL
;
6054 int out
= FILTER_OUT
;
6057 filter
= &peer
->filter
[afi
][safi
];
6058 if (peer
->af_group
[afi
][safi
])
6059 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
6061 /* distribute-list. */
6062 if (filter
->dlist
[in
].name
)
6063 if (! gfilter
|| ! gfilter
->dlist
[in
].name
6064 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
6065 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
6066 filter
->dlist
[in
].name
, VTY_NEWLINE
);
6067 if (filter
->dlist
[out
].name
&& ! gfilter
)
6068 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
6069 filter
->dlist
[out
].name
, VTY_NEWLINE
);
6072 if (filter
->plist
[in
].name
)
6073 if (! gfilter
|| ! gfilter
->plist
[in
].name
6074 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
6075 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
6076 filter
->plist
[in
].name
, VTY_NEWLINE
);
6077 if (filter
->plist
[out
].name
&& ! gfilter
)
6078 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
6079 filter
->plist
[out
].name
, VTY_NEWLINE
);
6082 if (filter
->map
[RMAP_IN
].name
)
6083 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
6084 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
6085 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
6086 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
6087 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
6088 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
6089 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
6090 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
6091 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
6092 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
6093 if (filter
->map
[RMAP_EXPORT
].name
)
6094 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
6095 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
6096 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
6097 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
6098 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
6100 /* unsuppress-map */
6101 if (filter
->usmap
.name
&& ! gfilter
)
6102 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
6103 filter
->usmap
.name
, VTY_NEWLINE
);
6106 if (filter
->aslist
[in
].name
)
6107 if (! gfilter
|| ! gfilter
->aslist
[in
].name
6108 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
6109 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
6110 filter
->aslist
[in
].name
, VTY_NEWLINE
);
6111 if (filter
->aslist
[out
].name
&& ! gfilter
)
6112 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
6113 filter
->aslist
[out
].name
, VTY_NEWLINE
);
6116 /* BGP peer configuration display function. */
6118 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
6119 struct peer
*peer
, afi_t afi
, safi_t safi
)
6121 struct peer
*g_peer
= NULL
;
6122 char buf
[SU_ADDRSTRLEN
];
6125 /* Skip dynamic neighbors. */
6126 if (peer_dynamic_neighbor (peer
))
6130 addr
= peer
->conf_if
;
6134 if (peer_group_active (peer
))
6135 g_peer
= peer
->group
->conf
;
6137 /************************************
6138 ****** Global to the neighbor ******
6139 ************************************/
6140 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6144 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
6145 vty_out (vty
, " neighbor %s interface v6only %s", addr
, VTY_NEWLINE
);
6147 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
6151 if (! peer_group_active (peer
))
6153 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
6154 vty_out (vty
, " neighbor %s peer-group%s", addr
,
6156 if (peer
->as_type
== AS_SPECIFIED
)
6158 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6161 else if (peer
->as_type
== AS_INTERNAL
)
6163 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6165 else if (peer
->as_type
== AS_EXTERNAL
)
6167 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6174 if (peer
->as_type
== AS_SPECIFIED
)
6176 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6179 else if (peer
->as_type
== AS_INTERNAL
)
6181 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6183 else if (peer
->as_type
== AS_EXTERNAL
)
6185 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6188 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6189 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6190 peer
->group
->name
, VTY_NEWLINE
);
6194 if (peer
->change_local_as
)
6195 if (! peer_group_active (peer
))
6196 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
6197 peer
->change_local_as
,
6198 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
6200 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
6201 " replace-as" : "", VTY_NEWLINE
);
6205 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
6209 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6210 if (! peer_group_active (peer
) ||
6211 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
6212 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
6216 if (! peer_group_active (peer
) || ! g_peer
->bfd_info
)
6218 bgp_bfd_peer_config_write(vty
, peer
, addr
);
6223 if (!peer_group_active (peer
)
6224 || ! g_peer
->password
6225 || strcmp (peer
->password
, g_peer
->password
) != 0)
6226 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
6230 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
))
6231 if (!peer_group_active (peer
))
6232 vty_out (vty
, " neighbor %s solo%s", addr
, VTY_NEWLINE
);
6235 if (peer
->port
!= BGP_PORT_DEFAULT
)
6236 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
6239 /* Local interface name. */
6241 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
6245 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
6246 if (! peer_group_active (peer
) ||
6247 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
6248 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
6250 /* EBGP multihop. */
6251 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
6252 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
6253 if (! peer_group_active (peer
) ||
6254 g_peer
->ttl
!= peer
->ttl
)
6255 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
6258 /* ttl-security hops */
6259 if (peer
->gtsm_hops
!= 0)
6260 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
6261 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
6262 peer
->gtsm_hops
, VTY_NEWLINE
);
6264 /* disable-connected-check. */
6265 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6266 if (! peer_group_active (peer
) ||
6267 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6268 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
6270 /* Update-source. */
6271 if (peer
->update_if
)
6272 if (! peer_group_active (peer
) || ! g_peer
->update_if
6273 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
6274 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6275 peer
->update_if
, VTY_NEWLINE
);
6276 if (peer
->update_source
)
6277 if (! peer_group_active (peer
) || ! g_peer
->update_source
6278 || sockunion_cmp (g_peer
->update_source
,
6279 peer
->update_source
) != 0)
6280 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6281 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
6284 /* advertisement-interval */
6285 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
6286 ! peer_group_active (peer
))
6287 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
6288 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
6291 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
6292 && ! peer_group_active (peer
))
6293 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
6294 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
6296 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
6297 ! peer_group_active (peer
))
6298 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
6299 peer
->connect
, VTY_NEWLINE
);
6301 /* Default weight. */
6302 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
6303 if (! peer_group_active (peer
) ||
6304 g_peer
->weight
!= peer
->weight
)
6305 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
6308 /* Dynamic capability. */
6309 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6310 if (! peer_group_active (peer
) ||
6311 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6312 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
6315 /* Extended next-hop capability. */
6316 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6317 if (! peer_group_active (peer
) ||
6318 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6319 vty_out (vty
, " neighbor %s capability extended-nexthop%s", addr
,
6322 /* dont capability negotiation. */
6323 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6324 if (! peer_group_active (peer
) ||
6325 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6326 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
6329 /* override capability negotiation. */
6330 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6331 if (! peer_group_active (peer
) ||
6332 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6333 vty_out (vty
, " neighbor %s override-capability%s", addr
,
6336 /* strict capability negotiation. */
6337 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6338 if (! peer_group_active (peer
) ||
6339 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6340 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
6343 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6345 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6347 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6348 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6352 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6353 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
6359 /************************************
6360 ****** Per AF to the neighbor ******
6361 ************************************/
6363 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
6365 if (peer
->af_group
[afi
][safi
])
6366 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6367 peer
->group
->name
, VTY_NEWLINE
);
6369 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6372 /* ORF capability. */
6373 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6374 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6375 if (! peer
->af_group
[afi
][safi
])
6377 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
6379 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6380 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6381 vty_out (vty
, " both");
6382 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
6383 vty_out (vty
, " send");
6385 vty_out (vty
, " receive");
6386 vty_out (vty
, "%s", VTY_NEWLINE
);
6389 /* Route reflector client. */
6390 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
6391 && ! peer
->af_group
[afi
][safi
])
6392 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
6396 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_FORCE_NEXTHOP_SELF
)
6397 && ! peer
->af_group
[afi
][safi
])
6398 vty_out (vty
, " neighbor %s next-hop-self force%s",
6400 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
6401 && ! peer
->af_group
[afi
][safi
])
6402 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
6404 /* remove-private-AS */
6405 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
) && !peer
->af_group
[afi
][safi
])
6407 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
) &&
6408 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6409 vty_out (vty
, " neighbor %s remove-private-AS all replace-AS%s", addr
, VTY_NEWLINE
);
6411 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6412 vty_out (vty
, " neighbor %s remove-private-AS replace-AS%s", addr
, VTY_NEWLINE
);
6414 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
6415 vty_out (vty
, " neighbor %s remove-private-AS all%s", addr
, VTY_NEWLINE
);
6418 vty_out (vty
, " neighbor %s remove-private-AS%s", addr
, VTY_NEWLINE
);
6422 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
) &&
6423 !peer
->af_group
[afi
][safi
])
6424 vty_out (vty
, " neighbor %s as-override%s", addr
, VTY_NEWLINE
);
6426 /* send-community print. */
6427 if (! peer
->af_group
[afi
][safi
])
6429 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6431 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6432 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6433 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
6434 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6435 vty_out (vty
, " neighbor %s send-community extended%s",
6437 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6438 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
6442 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6443 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6444 vty_out (vty
, " no neighbor %s send-community both%s",
6446 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6447 vty_out (vty
, " no neighbor %s send-community extended%s",
6449 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6450 vty_out (vty
, " no neighbor %s send-community%s",
6455 /* Default information */
6456 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
6457 && ! peer
->af_group
[afi
][safi
])
6459 vty_out (vty
, " neighbor %s default-originate", addr
);
6460 if (peer
->default_rmap
[afi
][safi
].name
)
6461 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
6462 vty_out (vty
, "%s", VTY_NEWLINE
);
6465 /* Soft reconfiguration inbound. */
6466 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6467 if (! peer
->af_group
[afi
][safi
] ||
6468 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6469 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
6472 /* maximum-prefix. */
6473 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
6474 if (! peer
->af_group
[afi
][safi
]
6475 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
6476 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
6477 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
6478 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6480 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
6481 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
6482 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
6483 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6484 vty_out (vty
, " warning-only");
6485 if (peer
->pmax_restart
[afi
][safi
])
6486 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
6487 vty_out (vty
, "%s", VTY_NEWLINE
);
6490 /* Route server client. */
6491 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
6492 && ! peer
->af_group
[afi
][safi
])
6493 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
6495 /* Nexthop-local unchanged. */
6496 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
6497 && ! peer
->af_group
[afi
][safi
])
6498 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
6501 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
6502 if (! peer_group_active (peer
)
6503 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
6504 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
6506 if (peer
->allowas_in
[afi
][safi
] == 3)
6507 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
6509 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
6510 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
6514 bgp_config_write_filter (vty
, peer
, afi
, safi
);
6516 /* atribute-unchanged. */
6517 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6518 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6519 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6520 && ! peer
->af_group
[afi
][safi
])
6522 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6523 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6524 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6525 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
6527 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
6528 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
6530 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
6532 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
6533 " med" : "", VTY_NEWLINE
);
6537 /* Display "address-family" configuration header. */
6539 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
6545 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6548 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
6552 if (safi
== SAFI_MULTICAST
)
6553 vty_out (vty
, "ipv4 multicast");
6554 else if (safi
== SAFI_MPLS_VPN
)
6555 vty_out (vty
, "vpnv4 unicast");
6557 else if (afi
== AFI_IP6
)
6559 vty_out (vty
, "ipv6");
6561 if (safi
== SAFI_MULTICAST
)
6562 vty_out (vty
, " multicast");
6565 vty_out (vty
, "%s", VTY_NEWLINE
);
6570 /* Address family based peer configuration display. */
6572 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
6577 struct peer_group
*group
;
6578 struct listnode
*node
, *nnode
;
6580 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
6582 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
6584 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6586 if (group
->conf
->afc
[afi
][safi
])
6588 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6589 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
6592 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6594 /* Skip dynamic neighbors. */
6595 if (peer_dynamic_neighbor (peer
))
6598 if (peer
->afc
[afi
][safi
])
6600 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6602 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6603 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
6608 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
6609 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
6612 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
6618 bgp_config_write (struct vty
*vty
)
6622 struct peer_group
*group
;
6624 struct listnode
*node
, *nnode
;
6625 struct listnode
*mnode
, *mnnode
;
6627 /* BGP Multiple instance. */
6628 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6630 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
6634 /* BGP Config type. */
6635 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6637 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
6641 /* BGP configuration. */
6642 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6645 vty_out (vty
, "!%s", VTY_NEWLINE
);
6647 /* Router bgp ASN */
6648 vty_out (vty
, "router bgp %u", bgp
->as
);
6650 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6653 vty_out (vty
, " view %s", bgp
->name
);
6655 vty_out (vty
, "%s", VTY_NEWLINE
);
6657 /* No Synchronization */
6658 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6659 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
6661 /* BGP fast-external-failover. */
6662 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
6663 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
6665 /* BGP router ID. */
6666 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
6667 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
6670 /* BGP log-neighbor-changes. */
6671 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
6672 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
6674 /* BGP configuration. */
6675 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
6676 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
6678 /* BGP default ipv4-unicast. */
6679 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6680 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
6682 /* BGP default local-preference. */
6683 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
6684 vty_out (vty
, " bgp default local-preference %d%s",
6685 bgp
->default_local_pref
, VTY_NEWLINE
);
6687 /* BGP default show-hostname */
6688 if (bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
6689 vty_out (vty
, " bgp default show-hostname%s", VTY_NEWLINE
);
6691 /* BGP default subgroup-pkt-queue-max. */
6692 if (bgp
->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
6693 vty_out (vty
, " bgp default subgroup-pkt-queue-max %d%s",
6694 bgp
->default_subgroup_pkt_queue_max
, VTY_NEWLINE
);
6696 /* BGP client-to-client reflection. */
6697 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
6698 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
6700 /* BGP cluster ID. */
6701 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
6702 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
6705 /* Disable ebgp connected nexthop check */
6706 if (bgp_flag_check (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
6707 vty_out (vty
, " bgp disable-ebgp-connected-route-check%s", VTY_NEWLINE
);
6709 /* Confederation identifier*/
6710 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
6711 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
6714 /* Confederation peer */
6715 if (bgp
->confed_peers_cnt
> 0)
6719 vty_out (vty
, " bgp confederation peers");
6721 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
6722 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
6724 vty_out (vty
, "%s", VTY_NEWLINE
);
6727 /* BGP enforce-first-as. */
6728 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
6729 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
6731 /* BGP deterministic-med. */
6732 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
6733 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
6735 /* BGP update-delay. */
6736 bgp_config_write_update_delay (vty
, bgp
);
6738 if (bgp
->v_maxmed_onstartup
!= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
)
6740 vty_out (vty
, " bgp max-med on-startup %d", bgp
->v_maxmed_onstartup
);
6741 if (bgp
->maxmed_onstartup_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6742 vty_out (vty
, " %d", bgp
->maxmed_onstartup_value
);
6743 vty_out (vty
, "%s", VTY_NEWLINE
);
6745 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
)
6747 vty_out (vty
, " bgp max-med administrative");
6748 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6749 vty_out (vty
, " %d", bgp
->maxmed_admin_value
);
6750 vty_out (vty
, "%s", VTY_NEWLINE
);
6754 bgp_config_write_wpkt_quanta (vty
, bgp
);
6757 bgp_config_write_coalesce_time(vty
, bgp
);
6759 /* BGP graceful-restart. */
6760 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
6761 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
6762 bgp
->stalepath_time
, VTY_NEWLINE
);
6763 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
6764 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
6766 /* BGP bestpath method. */
6767 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
6768 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
6769 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
6770 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
6772 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
6773 if (bgp_flag_check (bgp
, BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET
)) {
6774 vty_out (vty
, " bgp bestpath as-path multipath-relax no-as-set%s", VTY_NEWLINE
);
6776 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
6780 if (bgp_flag_check (bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
6781 vty_out (vty
, " bgp route-reflector allow-outbound-policy%s",
6784 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
6785 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
6786 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
6787 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6789 vty_out (vty
, " bgp bestpath med");
6790 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
6791 vty_out (vty
, " confed");
6792 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6793 vty_out (vty
, " missing-as-worst");
6794 vty_out (vty
, "%s", VTY_NEWLINE
);
6797 /* BGP network import check. */
6798 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH
))
6799 vty_out (vty
, " bgp network import-check exact%s", VTY_NEWLINE
);
6800 else if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
6801 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
6803 /* BGP flag dampening. */
6804 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
6805 BGP_CONFIG_DAMPENING
))
6806 bgp_config_write_damp (vty
);
6808 /* BGP static route configuration. */
6809 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6811 /* BGP redistribute configuration. */
6812 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6814 /* BGP timers configuration. */
6815 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
6816 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
6817 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
6818 bgp
->default_holdtime
, VTY_NEWLINE
);
6820 if (bgp
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
6821 vty_out (vty
, " bgp route-map delay-timer %d%s", bgp
->rmap_update_timer
,
6825 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6827 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
6830 /* Normal neighbor configuration. */
6831 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6833 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6834 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
6838 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6839 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6841 /* Distance configuration. */
6842 bgp_config_write_distance (vty
, bgp
);
6844 /* listen range and limit for dynamic BGP neighbors */
6845 bgp_config_write_listen (vty
, bgp
);
6847 /* No auto-summary */
6848 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6849 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
6851 /* IPv4 multicast configuration. */
6852 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
6854 /* IPv4 VPN configuration. */
6855 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
6857 /* IPv6 unicast configuration. */
6858 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
6860 /* IPv6 multicast configuration. */
6861 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
6869 bgp_master_init (void)
6871 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
6874 bm
->bgp
= list_new ();
6875 bm
->listen_sockets
= list_new ();
6876 bm
->port
= BGP_PORT_DEFAULT
;
6877 bm
->master
= thread_master_create ();
6878 bm
->start_time
= bgp_clock ();
6880 bgp_process_queue_init();
6888 /* allocates some vital data structures used by peer commands in vty_init */
6892 bgp_zebra_init(bm
->master
);
6894 /* BGP VTY commands installation. */
6902 bgp_route_map_init ();
6903 bgp_address_init ();
6904 bgp_scan_vty_init();
6905 bgp_mplsvpn_init ();
6907 /* Access list initialize. */
6908 access_list_init ();
6909 access_list_add_hook (peer_distribute_update
);
6910 access_list_delete_hook (peer_distribute_update
);
6912 /* Filter list initialize. */
6914 as_list_add_hook (peer_aslist_add
);
6915 as_list_delete_hook (peer_aslist_del
);
6917 /* Prefix list initialize.*/
6918 prefix_list_init ();
6919 prefix_list_add_hook (peer_prefix_list_update
);
6920 prefix_list_delete_hook (peer_prefix_list_update
);
6922 /* Community list initialize. */
6923 bgp_clist
= community_list_init ();
6927 #endif /* HAVE_SNMP */
6934 bgp_terminate (void)
6938 struct listnode
*node
, *nnode
;
6939 struct listnode
*mnode
, *mnnode
;
6941 /* Close the listener sockets first as this prevents peers from attempting
6942 * to reconnect on receiving the peer unconfig message. In the presence
6943 * of a large number of peers this will ensure that no peer is left with
6944 * a dangling connection
6946 /* reverse bgp_master_init */
6948 if (bm
->listen_sockets
)
6949 list_free(bm
->listen_sockets
);
6950 bm
->listen_sockets
= NULL
;
6952 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6953 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6954 if (peer
->status
== Established
||
6955 peer
->status
== OpenSent
||
6956 peer
->status
== OpenConfirm
)
6957 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
6958 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
6960 bgp_cleanup_routes ();
6962 if (bm
->process_main_queue
)
6964 work_queue_free (bm
->process_main_queue
);
6965 bm
->process_main_queue
= NULL
;
6967 if (bm
->process_rsclient_queue
)
6969 work_queue_free (bm
->process_rsclient_queue
);
6970 bm
->process_rsclient_queue
= NULL
;