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
28 #include "sockunion.h"
37 #include "workqueue.h"
42 #include "bgpd/bgpd.h"
43 #include "bgpd/bgp_table.h"
44 #include "bgpd/bgp_aspath.h"
45 #include "bgpd/bgp_route.h"
46 #include "bgpd/bgp_dump.h"
47 #include "bgpd/bgp_debug.h"
48 #include "bgpd/bgp_community.h"
49 #include "bgpd/bgp_attr.h"
50 #include "bgpd/bgp_regex.h"
51 #include "bgpd/bgp_clist.h"
52 #include "bgpd/bgp_fsm.h"
53 #include "bgpd/bgp_packet.h"
54 #include "bgpd/bgp_zebra.h"
55 #include "bgpd/bgp_open.h"
56 #include "bgpd/bgp_filter.h"
57 #include "bgpd/bgp_nexthop.h"
58 #include "bgpd/bgp_damp.h"
59 #include "bgpd/bgp_mplsvpn.h"
60 #include "bgpd/bgp_advertise.h"
61 #include "bgpd/bgp_network.h"
62 #include "bgpd/bgp_vty.h"
63 #include "bgpd/bgp_mpath.h"
64 #include "bgpd/bgp_nht.h"
66 #include "bgpd/bgp_snmp.h"
67 #endif /* HAVE_SNMP */
68 #include "bgpd/bgp_updgrp.h"
69 #include "bgpd/bgp_bfd.h"
71 /* BGP process wide configuration. */
72 static struct bgp_master bgp_master
;
74 extern struct in_addr router_id_zebra
;
76 /* BGP process wide configuration pointer to export. */
77 struct bgp_master
*bm
;
79 /* BGP community-list. */
80 struct community_list_handler
*bgp_clist
;
84 bgp_session_reset(struct peer
*peer
)
86 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
87 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
88 peer_delete(peer
->doppelganger
);
90 BGP_EVENT_ADD (peer
, BGP_Stop
);
94 * During session reset, we may delete the doppelganger peer, which would
95 * be the next node to the current node. If the session reset was invoked
96 * during walk of peer list, we would end up accessing the freed next
97 * node. This function moves the next node along.
100 bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
105 n
= (nnode
) ? *nnode
: NULL
;
106 npeer
= (n
) ? listgetdata(n
) : NULL
;
108 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
109 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
111 if (peer
->doppelganger
== npeer
)
112 /* nnode and *nnode are confirmed to be non-NULL here */
113 *nnode
= (*nnode
)->next
;
114 peer_delete(peer
->doppelganger
);
117 BGP_EVENT_ADD (peer
, BGP_Stop
);
120 /* BGP global flag manipulation. */
122 bgp_option_set (int flag
)
127 case BGP_OPT_MULTIPLE_INSTANCE
:
128 case BGP_OPT_CONFIG_CISCO
:
129 case BGP_OPT_NO_LISTEN
:
130 SET_FLAG (bm
->options
, flag
);
133 return BGP_ERR_INVALID_FLAG
;
139 bgp_option_unset (int flag
)
143 case BGP_OPT_MULTIPLE_INSTANCE
:
144 if (listcount (bm
->bgp
) > 1)
145 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
148 case BGP_OPT_CONFIG_CISCO
:
149 UNSET_FLAG (bm
->options
, flag
);
152 return BGP_ERR_INVALID_FLAG
;
158 bgp_option_check (int flag
)
160 return CHECK_FLAG (bm
->options
, flag
);
163 /* BGP flag manipulation. */
165 bgp_flag_set (struct bgp
*bgp
, int flag
)
167 SET_FLAG (bgp
->flags
, flag
);
172 bgp_flag_unset (struct bgp
*bgp
, int flag
)
174 UNSET_FLAG (bgp
->flags
, flag
);
179 bgp_flag_check (struct bgp
*bgp
, int flag
)
181 return CHECK_FLAG (bgp
->flags
, flag
);
184 /* Internal function to set BGP structure configureation flag. */
186 bgp_config_set (struct bgp
*bgp
, int config
)
188 SET_FLAG (bgp
->config
, config
);
192 bgp_config_unset (struct bgp
*bgp
, int config
)
194 UNSET_FLAG (bgp
->config
, config
);
198 bgp_config_check (struct bgp
*bgp
, int config
)
200 return CHECK_FLAG (bgp
->config
, config
);
203 /* Set BGP router identifier. */
205 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
208 struct listnode
*node
, *nnode
;
210 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
211 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
214 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
215 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
217 /* Set all peer's local identifier with this value. */
218 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
220 IPV4_ADDR_COPY (&peer
->local_id
, id
);
222 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
224 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
225 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
226 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
232 /* BGP's cluster-id control. */
234 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
237 struct listnode
*node
, *nnode
;
239 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
240 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
243 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
244 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
246 /* Clear all IBGP peer. */
247 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
249 if (peer
->sort
!= BGP_PEER_IBGP
)
252 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
254 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
255 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
256 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
263 bgp_cluster_id_unset (struct bgp
*bgp
)
266 struct listnode
*node
, *nnode
;
268 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
271 bgp
->cluster_id
.s_addr
= 0;
272 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
274 /* Clear all IBGP peer. */
275 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
277 if (peer
->sort
!= BGP_PEER_IBGP
)
280 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
282 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
283 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
284 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
290 /* time_t value that is monotonicly increasing
291 * and uneffected by adjustments to system clock
293 time_t bgp_clock (void)
297 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
301 /* BGP timer configuration. */
303 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
305 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
306 ? keepalive
: holdtime
/ 3);
307 bgp
->default_holdtime
= holdtime
;
313 bgp_timers_unset (struct bgp
*bgp
)
315 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
316 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
321 /* BGP confederation configuration. */
323 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
326 struct listnode
*node
, *nnode
;
330 return BGP_ERR_INVALID_AS
;
332 /* Remember - were we doing confederation before? */
333 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
335 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
337 /* If we were doing confederation already, this is just an external
338 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
339 were not doing confederation before, reset all EBGP sessions. */
340 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
342 /* We're looking for peers who's AS is not local or part of our
346 if (peer_sort (peer
) == BGP_PEER_EBGP
)
349 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
351 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
352 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
353 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
356 bgp_session_reset_safe(peer
, &nnode
);
361 /* Not doign confederation before, so reset every non-local
363 if (peer_sort (peer
) != BGP_PEER_IBGP
)
365 /* Reset the local_as to be our EBGP one */
366 if (peer_sort (peer
) == BGP_PEER_EBGP
)
368 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
370 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
371 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
372 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
375 bgp_session_reset_safe(peer
, &nnode
);
383 bgp_confederation_id_unset (struct bgp
*bgp
)
386 struct listnode
*node
, *nnode
;
389 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
391 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
393 /* We're looking for peers who's AS is not local */
394 if (peer_sort (peer
) != BGP_PEER_IBGP
)
396 peer
->local_as
= bgp
->as
;
397 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
399 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
400 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
401 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
405 bgp_session_reset_safe(peer
, &nnode
);
411 /* Is an AS part of the confed or not? */
413 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
420 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
421 if (bgp
->confed_peers
[i
] == as
)
427 /* Add an AS to the confederation set. */
429 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
432 struct listnode
*node
, *nnode
;
435 return BGP_ERR_INVALID_BGP
;
438 return BGP_ERR_INVALID_AS
;
440 if (bgp_confederation_peers_check (bgp
, as
))
443 if (bgp
->confed_peers
)
444 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
446 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
448 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
449 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
451 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
452 bgp
->confed_peers_cnt
++;
454 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
456 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
460 peer
->local_as
= bgp
->as
;
461 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
463 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
464 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
465 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
468 bgp_session_reset_safe(peer
, &nnode
);
475 /* Delete an AS from the confederation set. */
477 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
482 struct listnode
*node
, *nnode
;
487 if (! bgp_confederation_peers_check (bgp
, as
))
490 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
491 if (bgp
->confed_peers
[i
] == as
)
492 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
493 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
495 bgp
->confed_peers_cnt
--;
497 if (bgp
->confed_peers_cnt
== 0)
499 if (bgp
->confed_peers
)
500 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
501 bgp
->confed_peers
= NULL
;
504 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
506 bgp
->confed_peers_cnt
* sizeof (as_t
));
508 /* Now reset any peer who's remote AS has just been removed from the
510 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
512 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
516 peer
->local_as
= bgp
->confed_id
;
517 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
519 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
520 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
521 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
524 bgp_session_reset_safe(peer
, &nnode
);
532 /* Local preference configuration. */
534 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
539 bgp
->default_local_pref
= local_pref
;
545 bgp_default_local_preference_unset (struct bgp
*bgp
)
550 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
555 /* Local preference configuration. */
557 bgp_default_subgroup_pkt_queue_max_set (struct bgp
*bgp
, u_int32_t queue_size
)
562 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
568 bgp_default_subgroup_pkt_queue_max_unset (struct bgp
*bgp
)
572 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
577 /* Listen limit configuration. */
579 bgp_listen_limit_set (struct bgp
*bgp
, int listen_limit
)
584 bgp
->dynamic_neighbors_limit
= listen_limit
;
590 bgp_listen_limit_unset (struct bgp
*bgp
)
595 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
601 peer_af_create (struct peer
*peer
, afi_t afi
, safi_t safi
)
609 afid
= afindex(afi
, safi
);
610 if (afid
>= BGP_AF_MAX
)
613 assert(peer
->peer_af_array
[afid
] == NULL
);
615 /* Allocate new peer af */
616 af
= XCALLOC (MTYPE_BGP_PEER_AF
, sizeof (struct peer_af
));
617 peer
->peer_af_array
[afid
] = af
;
623 //update_group_adjust_peer(af);
628 peer_af_find (struct peer
*peer
, afi_t afi
, safi_t safi
)
635 afid
= afindex(afi
, safi
);
636 if (afid
>= BGP_AF_MAX
)
639 return peer
->peer_af_array
[afid
];
643 peer_af_delete (struct peer
*peer
, afi_t afi
, safi_t safi
)
651 afid
= afindex(afi
, safi
);
652 if (afid
>= BGP_AF_MAX
)
655 af
= peer
->peer_af_array
[afid
];
659 bgp_stop_announce_route_timer (af
);
663 if (BGP_DEBUG (update_groups
, UPDATE_GROUPS
))
664 zlog_debug ("u%" PRIu64
":s%" PRIu64
" remove peer %s",
665 af
->subgroup
->update_group
->id
, af
->subgroup
->id
, peer
->host
);
668 update_subgroup_remove_peer (af
->subgroup
, af
);
670 peer
->peer_af_array
[afid
] = NULL
;
671 XFREE(MTYPE_BGP_PEER_AF
, af
);
676 /* If peer is RSERVER_CLIENT in at least one address family and is not member
677 of a peer_group for that family, return 1.
678 Used to check wether the peer is included in list bgp->rsclient. */
680 peer_rsclient_active (struct peer
*peer
)
685 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
686 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
687 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
688 && ! peer
->af_group
[i
][j
])
693 /* Peer comparison function for sorting. */
695 peer_cmp (struct peer
*p1
, struct peer
*p2
)
697 return sockunion_cmp (&p1
->su
, &p2
->su
);
701 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
703 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
706 /* Reset all address family specific configuration. */
708 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
711 struct bgp_filter
*filter
;
712 char orf_name
[BUFSIZ
];
714 filter
= &peer
->filter
[afi
][safi
];
716 /* Clear neighbor filter and route-map */
717 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
719 if (filter
->dlist
[i
].name
)
721 free (filter
->dlist
[i
].name
);
722 filter
->dlist
[i
].name
= NULL
;
724 if (filter
->plist
[i
].name
)
726 free (filter
->plist
[i
].name
);
727 filter
->plist
[i
].name
= NULL
;
729 if (filter
->aslist
[i
].name
)
731 free (filter
->aslist
[i
].name
);
732 filter
->aslist
[i
].name
= NULL
;
735 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
737 if (filter
->map
[i
].name
)
739 free (filter
->map
[i
].name
);
740 filter
->map
[i
].name
= NULL
;
744 /* Clear unsuppress map. */
745 if (filter
->usmap
.name
)
746 free (filter
->usmap
.name
);
747 filter
->usmap
.name
= NULL
;
748 filter
->usmap
.map
= NULL
;
750 /* Clear neighbor's all address family flags. */
751 peer
->af_flags
[afi
][safi
] = 0;
753 /* Clear neighbor's all address family sflags. */
754 peer
->af_sflags
[afi
][safi
] = 0;
756 /* Clear neighbor's all address family capabilities. */
757 peer
->af_cap
[afi
][safi
] = 0;
760 peer
->orf_plist
[afi
][safi
] = NULL
;
761 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
762 prefix_bgp_orf_remove_all (orf_name
);
764 /* Set default neighbor send-community. */
765 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
767 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
768 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
771 /* Clear neighbor default_originate_rmap */
772 if (peer
->default_rmap
[afi
][safi
].name
)
773 free (peer
->default_rmap
[afi
][safi
].name
);
774 peer
->default_rmap
[afi
][safi
].name
= NULL
;
775 peer
->default_rmap
[afi
][safi
].map
= NULL
;
777 /* Clear neighbor maximum-prefix */
778 peer
->pmax
[afi
][safi
] = 0;
779 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
782 /* peer global config reset */
784 peer_global_config_reset (struct peer
*peer
)
790 peer
->change_local_as
= 0;
791 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
792 if (peer
->update_source
)
794 sockunion_free (peer
->update_source
);
795 peer
->update_source
= NULL
;
799 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
800 peer
->update_if
= NULL
;
803 if (peer_sort (peer
) == BGP_PEER_IBGP
)
804 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
806 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
808 /* This is a per-peer specific flag and so we must preserve it */
809 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
814 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
820 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
822 /* Reset some other configs back to defaults. */
823 peer
->v_start
= BGP_INIT_START_TIMER
;
824 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
825 peer
->password
= NULL
;
826 peer
->local_id
= peer
->bgp
->router_id
;
827 peer
->v_holdtime
= peer
->bgp
->default_holdtime
;
828 peer
->v_keepalive
= peer
->bgp
->default_keepalive
;
830 bfd_info_free(&(peer
->bfd_info
));
832 /* Set back the CONFIG_NODE flag. */
833 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
836 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
837 static bgp_peer_sort_t
838 peer_calc_sort (struct peer
*peer
)
845 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
847 if (peer
->as_type
== AS_INTERNAL
)
848 return BGP_PEER_IBGP
;
850 else if (peer
->as_type
== AS_EXTERNAL
)
851 return BGP_PEER_EBGP
;
853 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
)
854 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
859 peer1
= listnode_head (peer
->group
->peer
);
864 return BGP_PEER_INTERNAL
;
868 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
870 if (peer
->local_as
== 0)
871 return BGP_PEER_INTERNAL
;
873 if (peer
->local_as
== peer
->as
)
875 if (bgp
->as
== bgp
->confed_id
)
877 if (peer
->local_as
== bgp
->as
)
878 return BGP_PEER_IBGP
;
880 return BGP_PEER_EBGP
;
884 if (peer
->local_as
== bgp
->confed_id
)
885 return BGP_PEER_EBGP
;
887 return BGP_PEER_IBGP
;
891 if (bgp_confederation_peers_check (bgp
, peer
->as
))
892 return BGP_PEER_CONFED
;
894 return BGP_PEER_EBGP
;
898 if (peer
->as_type
!= AS_SPECIFIED
)
899 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
901 return (peer
->local_as
== 0
902 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
903 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
907 /* Calculate and cache the peer "sort" */
909 peer_sort (struct peer
*peer
)
911 peer
->sort
= peer_calc_sort (peer
);
916 peer_free (struct peer
*peer
)
918 assert (peer
->status
== Deleted
);
920 bgp_unlock(peer
->bgp
);
922 /* this /ought/ to have been done already through bgp_stop earlier,
923 * but just to be sure..
925 bgp_timer_set (peer
);
926 BGP_READ_OFF (peer
->t_read
);
927 BGP_WRITE_OFF (peer
->t_write
);
928 BGP_EVENT_FLUSH (peer
);
930 /* Free connected nexthop, if present */
931 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
) &&
932 !peer_dynamic_neighbor (peer
))
933 bgp_delete_connected_nexthop (family2afi(peer
->su
.sa
.sa_family
), peer
);
936 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
938 /* Free allocated host character. */
940 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
942 /* Update source configuration. */
943 if (peer
->update_source
)
944 sockunion_free (peer
->update_source
);
947 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
949 if (peer
->clear_node_queue
)
950 work_queue_free (peer
->clear_node_queue
);
952 bgp_sync_delete (peer
);
955 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
957 bfd_info_free(&(peer
->bfd_info
));
959 memset (peer
, 0, sizeof (struct peer
));
961 XFREE (MTYPE_BGP_PEER
, peer
);
964 /* increase reference count on a struct peer */
966 peer_lock_with_caller (const char *name
, struct peer
*peer
)
968 assert (peer
&& (peer
->lock
>= 0));
971 zlog_debug("%s peer_lock %p %d", name
, peer
, peer
->lock
);
979 /* decrease reference count on a struct peer
980 * struct peer is freed and NULL returned if last reference
983 peer_unlock_with_caller (const char *name
, struct peer
*peer
)
985 assert (peer
&& (peer
->lock
> 0));
988 zlog_debug("%s peer_unlock %p %d", name
, peer
, peer
->lock
);
1002 /* Allocate new peer object, implicitely locked. */
1003 static struct peer
*
1004 peer_new (struct bgp
*bgp
)
1011 /* bgp argument is absolutely required */
1016 /* Allocate new peer. */
1017 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
1019 /* Set default value. */
1021 peer
->v_start
= BGP_INIT_START_TIMER
;
1022 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1023 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
1024 peer
->status
= Idle
;
1025 peer
->ostatus
= Idle
;
1026 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1028 peer
= peer_lock (peer
); /* initial reference */
1031 peer
->password
= NULL
;
1033 /* Set default flags. */
1034 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1035 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1037 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
1039 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1040 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
1042 peer
->orf_plist
[afi
][safi
] = NULL
;
1044 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1046 /* Create buffers. */
1047 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
1048 peer
->obuf
= stream_fifo_new ();
1050 /* We use a larger buffer for peer->work in the event that:
1051 * - We RX a BGP_UPDATE where the attributes alone are just
1052 * under BGP_MAX_PACKET_SIZE
1053 * - The user configures an outbound route-map that does many as-path
1054 * prepends or adds many communities. At most they can have CMD_ARGC_MAX
1055 * args in a route-map so there is a finite limit on how large they can
1056 * make the attributes.
1058 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
1059 * checking for every single attribute as we construct an UPDATE.
1061 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1062 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
1065 bgp_sync_init (peer
);
1067 /* Get service port number. */
1068 sp
= getservbyname ("bgp", "tcp");
1069 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
1075 * This function is invoked when a duplicate peer structure associated with
1076 * a neighbor is being deleted. If this about-to-be-deleted structure is
1077 * the one with all the config, then we have to copy over the info.
1080 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
1082 struct peer_af
*paf
;
1090 /* The following function is used by both peer group config copy to
1091 * individual peer and when we transfer config
1093 if (peer_src
->change_local_as
)
1094 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1096 /* peer flags apply */
1097 peer_dst
->flags
= peer_src
->flags
;
1098 peer_dst
->cap
= peer_src
->cap
;
1099 peer_dst
->config
= peer_src
->config
;
1101 peer_dst
->local_as
= peer_src
->local_as
;
1102 peer_dst
->ifindex
= peer_src
->ifindex
;
1103 peer_dst
->port
= peer_src
->port
;
1104 peer_sort(peer_dst
);
1105 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1108 peer_dst
->holdtime
= peer_src
->holdtime
;
1109 peer_dst
->keepalive
= peer_src
->keepalive
;
1110 peer_dst
->connect
= peer_src
->connect
;
1111 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1112 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1113 peer_dst
->v_asorig
= peer_src
->v_asorig
;
1114 peer_dst
->routeadv
= peer_src
->routeadv
;
1115 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1117 /* password apply */
1118 if (peer_src
->password
&& !peer_dst
->password
)
1119 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
1121 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1122 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1124 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1125 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1126 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
1129 PEERAF_FOREACH(peer_src
, paf
, afindex
)
1130 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1132 /* update-source apply */
1133 if (peer_src
->update_source
)
1135 if (peer_dst
->update_source
)
1136 sockunion_free (peer_dst
->update_source
);
1137 if (peer_dst
->update_if
)
1139 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1140 peer_dst
->update_if
= NULL
;
1142 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
1144 else if (peer_src
->update_if
)
1146 if (peer_dst
->update_if
)
1147 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1148 if (peer_dst
->update_source
)
1150 sockunion_free (peer_dst
->update_source
);
1151 peer_dst
->update_source
= NULL
;
1153 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1156 if (peer_src
->ifname
)
1158 if (peer_dst
->ifname
)
1159 free(peer_dst
->ifname
);
1161 peer_dst
->ifname
= strdup(peer_src
->ifname
);
1166 * Set or reset the peer address socketunion structure based on the
1167 * learnt peer address. Currently via the source address of the
1168 * ipv6 ND router-advertisement.
1171 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
1173 struct interface
*ifp
;
1174 struct nbr_connected
*ifc_nbr
;
1175 struct connected
*ifc
;
1178 struct listnode
*node
;
1183 if ((ifp
= if_lookup_by_name(peer
->conf_if
)))
1185 /* if multiple IP addresses assigned to link, we pick the first */
1186 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
1187 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, node
, ifc
))
1188 if (ifc
->address
&& (ifc
->address
->family
== AF_INET
))
1190 /* Try IPv4 connection first, if present */
1191 PREFIX_COPY_IPV4(&p
, CONNECTED_PREFIX(ifc
));
1192 /* We can determine peer's IP address if prefixlen is 30/31 */
1193 if (p
.prefixlen
== 30)
1195 peer
->su
.sa
.sa_family
= AF_INET
;
1196 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1197 if (s_addr
% 4 == 1)
1198 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1199 else if (s_addr
% 4 == 2)
1200 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1201 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1202 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1203 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1206 else if (p
.prefixlen
== 31)
1208 peer
->su
.sa
.sa_family
= AF_INET
;
1209 s_addr
= ntohl(p
.u
.prefix4
.s_addr
);
1210 if (s_addr
% 2 == 0)
1211 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
+1);
1213 peer
->su
.sin
.sin_addr
.s_addr
= htonl(s_addr
-1);
1214 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1215 peer
->su
->sin
.sin_len
= sizeof(struct sockaddr_in
);
1216 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1220 zlog_warn("%s neighbor interface with IPv4 numbered links used without /30 or /31",
1224 if (ifp
->nbr_connected
&&
1225 (ifc_nbr
= listnode_head(ifp
->nbr_connected
)))
1227 peer
->su
.sa
.sa_family
= AF_INET6
;
1228 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc_nbr
->address
->u
.prefix
,
1229 sizeof (struct in6_addr
));
1231 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1233 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1238 /* This works as an indication of unresolved peer address
1239 on a BGP interface*/
1240 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1241 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1244 /* Create new BGP peer. */
1246 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1247 as_t local_as
, as_t remote_as
, int as_type
, afi_t afi
, safi_t safi
)
1251 char buf
[SU_ADDRSTRLEN
];
1253 peer
= peer_new (bgp
);
1256 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1257 bgp_peer_conf_if_to_su_update(peer
);
1258 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1263 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1264 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1266 peer
->local_as
= local_as
;
1267 peer
->as
= remote_as
;
1268 peer
->as_type
= as_type
;
1269 peer
->local_id
= bgp
->router_id
;
1270 peer
->v_holdtime
= bgp
->default_holdtime
;
1271 peer
->v_keepalive
= bgp
->default_keepalive
;
1272 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1273 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1275 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1277 peer
= peer_lock (peer
); /* bgp peer list reference */
1278 listnode_add_sort (bgp
->peer
, peer
);
1280 active
= peer_active (peer
);
1282 /* Last read and reset time set */
1283 peer
->readtime
= peer
->resettime
= bgp_clock ();
1285 /* Default TTL set. */
1286 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1288 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1292 peer
->afc
[afi
][safi
] = 1;
1293 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1295 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1299 /* Set up peer's events and timers. */
1300 if (! active
&& peer_active (peer
))
1301 bgp_timer_set (peer
);
1307 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1308 safi_t safi
, int v6only
)
1312 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1315 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1316 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1317 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, AS_SPECIFIED
, 0, 0, 0);
1319 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, AS_SPECIFIED
, 0, afi
, safi
);
1322 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1324 else if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)) ||
1325 (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)))
1328 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1330 UNSET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1332 /* v6only flag changed. Reset bgp seesion */
1333 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1335 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
1336 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1337 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1340 bgp_session_reset(peer
);
1346 /* Make accept BGP peer. Called from bgp_accept (). */
1348 peer_create_accept (struct bgp
*bgp
)
1352 peer
= peer_new (bgp
);
1354 peer
= peer_lock (peer
); /* bgp peer list reference */
1355 listnode_add_sort (bgp
->peer
, peer
);
1360 /* Change peer's AS number. */
1362 peer_as_change (struct peer
*peer
, as_t as
, int as_specified
)
1364 bgp_peer_sort_t type
;
1368 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1370 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1372 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1373 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1374 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1377 bgp_session_reset(peer
);
1379 type
= peer_sort (peer
);
1381 peer
->as_type
= as_specified
;
1383 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1384 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1385 && peer
->bgp
->as
!= as
)
1386 peer
->local_as
= peer
->bgp
->confed_id
;
1388 peer
->local_as
= peer
->bgp
->as
;
1390 /* Advertisement-interval reset */
1393 conf
= peer
->group
->conf
;
1395 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1397 peer
->v_routeadv
= conf
->routeadv
;
1399 /* Only go back to the default advertisement-interval if the user had not
1400 * already configured it */
1401 else if (!CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
1403 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1404 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1406 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1409 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1411 else if (type
== BGP_PEER_IBGP
)
1414 /* reflector-client reset */
1415 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1417 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1418 PEER_FLAG_REFLECTOR_CLIENT
);
1419 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1420 PEER_FLAG_REFLECTOR_CLIENT
);
1421 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1422 PEER_FLAG_REFLECTOR_CLIENT
);
1423 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1424 PEER_FLAG_REFLECTOR_CLIENT
);
1425 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1426 PEER_FLAG_REFLECTOR_CLIENT
);
1429 /* local-as reset */
1430 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1432 peer
->change_local_as
= 0;
1433 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1434 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1438 /* If peer does not exist, create new one. If peer already exists,
1439 set AS number to the peer. */
1441 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1442 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1448 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1450 peer
= peer_lookup (bgp
, su
);
1454 /* Not allowed for a dynamic peer. */
1455 if (peer_dynamic_neighbor (peer
))
1458 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1461 /* When this peer is a member of peer-group. */
1464 if (peer
->group
->conf
->as
)
1466 /* Return peer group's AS number. */
1467 *as
= peer
->group
->conf
->as
;
1468 return BGP_ERR_PEER_GROUP_MEMBER
;
1470 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1472 if ((as_type
!= AS_INTERNAL
) && (bgp
->as
!= *as
))
1475 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1480 if ((as_type
!= AS_EXTERNAL
) && (bgp
->as
== *as
))
1483 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1488 /* Existing peer's AS number change. */
1489 if (peer
->as
!= *as
)
1490 peer_as_change (peer
, *as
, as_type
);
1495 return BGP_ERR_NO_INTERFACE_CONFIG
;
1497 /* If the peer is not part of our confederation, and its not an
1498 iBGP peer then spoof the source AS */
1499 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1500 && ! bgp_confederation_peers_check (bgp
, *as
)
1502 local_as
= bgp
->confed_id
;
1506 /* If this is IPv4 unicast configuration and "no bgp default
1507 ipv4-unicast" is specified. */
1509 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1510 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1511 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0, 0);
1513 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, afi
, safi
);
1519 /* Activate the peer or peer group for specified AFI and SAFI. */
1521 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1525 if (peer
->afc
[afi
][safi
])
1528 /* Activate the address family configuration. */
1529 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1530 peer
->afc
[afi
][safi
] = 1;
1533 active
= peer_active (peer
);
1535 peer
->afc
[afi
][safi
] = 1;
1537 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1539 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1542 if (! active
&& peer_active (peer
))
1543 bgp_timer_set (peer
);
1546 if (peer
->status
== Established
)
1548 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1550 peer
->afc_adv
[afi
][safi
] = 1;
1551 bgp_capability_send (peer
, afi
, safi
,
1553 CAPABILITY_ACTION_SET
);
1554 if (peer
->afc_recv
[afi
][safi
])
1556 peer
->afc_nego
[afi
][safi
] = 1;
1557 bgp_announce_route (peer
, afi
, safi
);
1562 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1563 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1564 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1573 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1575 struct peer_group
*group
;
1577 struct listnode
*node
, *nnode
;
1579 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1581 group
= peer
->group
;
1583 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1585 if (peer1
->af_group
[afi
][safi
])
1586 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1591 if (peer
->af_group
[afi
][safi
])
1592 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1595 if (! peer
->afc
[afi
][safi
])
1598 /* De-activate the address family configuration. */
1599 peer
->afc
[afi
][safi
] = 0;
1600 peer_af_flag_reset (peer
, afi
, safi
);
1601 if (peer_af_delete(peer
, afi
, safi
) != 0)
1603 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
1606 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1608 if (peer
->status
== Established
)
1610 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1612 peer
->afc_adv
[afi
][safi
] = 0;
1613 peer
->afc_nego
[afi
][safi
] = 0;
1615 if (peer_active_nego (peer
))
1617 bgp_capability_send (peer
, afi
, safi
,
1619 CAPABILITY_ACTION_UNSET
);
1620 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1621 peer
->pcount
[afi
][safi
] = 0;
1625 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1626 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1627 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1632 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1633 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1634 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1642 peer_nsf_stop (struct peer
*peer
)
1647 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1648 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1650 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1651 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1652 peer
->nsf
[afi
][safi
] = 0;
1654 if (peer
->t_gr_restart
)
1656 BGP_TIMER_OFF (peer
->t_gr_restart
);
1657 if (bgp_debug_neighbor_events(peer
))
1658 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1660 if (peer
->t_gr_stale
)
1662 BGP_TIMER_OFF (peer
->t_gr_stale
);
1663 if (bgp_debug_neighbor_events(peer
))
1664 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1666 bgp_clear_route_all (peer
);
1669 /* Delete peer from confguration.
1671 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1672 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1674 * This function /should/ take care to be idempotent, to guard against
1675 * it being called multiple times through stray events that come in
1676 * that happen to result in this function being called again. That
1677 * said, getting here for a "Deleted" peer is a bug in the neighbour
1681 peer_delete (struct peer
*peer
)
1687 struct bgp_filter
*filter
;
1688 struct listnode
*pn
;
1691 assert (peer
->status
!= Deleted
);
1694 accept_peer
= CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1696 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1697 peer_nsf_stop (peer
);
1699 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1701 /* If this peer belongs to peer group, clear up the
1705 if (peer_dynamic_neighbor(peer
))
1706 peer_drop_dynamic_neighbor(peer
);
1708 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1710 peer
= peer_unlock (peer
); /* group->peer list reference */
1711 list_delete_node (peer
->group
->peer
, pn
);
1716 /* Withdraw all information from routing table. We can not use
1717 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1718 * executed after peer structure is deleted.
1720 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1722 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1724 if (peer
->doppelganger
)
1725 peer
->doppelganger
->doppelganger
= NULL
;
1726 peer
->doppelganger
= NULL
;
1728 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1729 bgp_fsm_change_status (peer
, Deleted
);
1731 /* Password configuration */
1734 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1735 peer
->password
= NULL
;
1738 ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1742 bgp_timer_set (peer
); /* stops all timers for Deleted */
1744 /* Delete from all peer list. */
1745 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1746 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1748 peer_unlock (peer
); /* bgp peer list reference */
1749 list_delete_node (bgp
->peer
, pn
);
1752 if (peer_rsclient_active (peer
)
1753 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1755 peer_unlock (peer
); /* rsclient list reference */
1756 list_delete_node (bgp
->rsclient
, pn
);
1758 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1760 /* Clear our own rsclient ribs. */
1761 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1762 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1763 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1764 PEER_FLAG_RSERVER_CLIENT
))
1765 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1769 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1770 member of a peer_group. */
1771 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1772 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1773 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1774 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1778 stream_free (peer
->ibuf
);
1780 stream_fifo_free (peer
->obuf
);
1782 stream_free (peer
->work
);
1784 stream_free(peer
->scratch
);
1786 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1788 /* Local and remote addresses. */
1790 sockunion_free (peer
->su_local
);
1791 if (peer
->su_remote
)
1792 sockunion_free (peer
->su_remote
);
1793 peer
->su_local
= peer
->su_remote
= NULL
;
1795 /* Free filter related memory. */
1796 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1797 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1799 filter
= &peer
->filter
[afi
][safi
];
1801 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1803 if (filter
->dlist
[i
].name
)
1804 free (filter
->dlist
[i
].name
);
1805 if (filter
->plist
[i
].name
)
1806 free (filter
->plist
[i
].name
);
1807 if (filter
->aslist
[i
].name
)
1808 free (filter
->aslist
[i
].name
);
1810 filter
->dlist
[i
].name
= NULL
;
1811 filter
->plist
[i
].name
= NULL
;
1812 filter
->aslist
[i
].name
= NULL
;
1814 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1816 if (filter
->map
[i
].name
)
1817 free (filter
->map
[i
].name
);
1818 filter
->map
[i
].name
= NULL
;
1821 if (filter
->usmap
.name
)
1822 free (filter
->usmap
.name
);
1824 if (peer
->default_rmap
[afi
][safi
].name
)
1825 free (peer
->default_rmap
[afi
][safi
].name
);
1827 filter
->usmap
.name
= NULL
;
1828 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1831 FOREACH_AFI_SAFI (afi
, safi
)
1832 peer_af_delete (peer
, afi
, safi
);
1833 peer_unlock (peer
); /* initial reference */
1839 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1841 return strcmp (g1
->name
, g2
->name
);
1844 /* Peer group cofiguration. */
1845 static struct peer_group
*
1846 peer_group_new (void)
1848 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1849 sizeof (struct peer_group
));
1853 peer_group_free (struct peer_group
*group
)
1855 XFREE (MTYPE_PEER_GROUP
, group
);
1859 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1861 struct peer_group
*group
;
1862 struct listnode
*node
, *nnode
;
1864 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1866 if (strcmp (group
->name
, name
) == 0)
1873 peer_group_get (struct bgp
*bgp
, const char *name
)
1875 struct peer_group
*group
;
1878 group
= peer_group_lookup (bgp
, name
);
1882 group
= peer_group_new ();
1884 group
->name
= strdup (name
);
1885 group
->peer
= list_new ();
1886 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1887 group
->listen_range
[afi
] = list_new ();
1888 group
->conf
= peer_new (bgp
);
1889 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1890 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1891 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1892 group
->conf
->group
= group
;
1893 group
->conf
->as
= 0;
1894 group
->conf
->ttl
= 1;
1895 group
->conf
->gtsm_hops
= 0;
1896 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1897 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1898 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1899 group
->conf
->keepalive
= 0;
1900 group
->conf
->holdtime
= 0;
1901 group
->conf
->connect
= 0;
1902 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1903 listnode_add_sort (bgp
->group
, group
);
1909 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1910 afi_t afi
, safi_t safi
)
1913 int out
= FILTER_OUT
;
1915 struct bgp_filter
*pfilter
;
1916 struct bgp_filter
*gfilter
;
1920 pfilter
= &peer
->filter
[afi
][safi
];
1921 gfilter
= &conf
->filter
[afi
][safi
];
1925 peer
->as
= conf
->as
;
1928 if (conf
->change_local_as
)
1929 peer
->change_local_as
= conf
->change_local_as
;
1932 peer
->ttl
= conf
->ttl
;
1935 peer
->gtsm_hops
= conf
->gtsm_hops
;
1938 peer
->weight
= conf
->weight
;
1940 /* this flag is per-neighbor and so has to be preserved */
1941 v6only
= CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1943 /* peer flags apply */
1944 peer
->flags
= conf
->flags
;
1947 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
1949 /* peer af_flags apply */
1950 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1951 /* peer config apply */
1952 peer
->config
= conf
->config
;
1954 /* peer timers apply */
1955 peer
->holdtime
= conf
->holdtime
;
1956 peer
->keepalive
= conf
->keepalive
;
1957 peer
->connect
= conf
->connect
;
1958 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1959 peer
->v_connect
= conf
->connect
;
1961 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1963 /* advertisement-interval reset */
1964 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1965 peer
->v_routeadv
= conf
->routeadv
;
1967 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1968 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1970 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1972 /* password apply */
1973 if (conf
->password
&& !peer
->password
)
1974 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1978 /* maximum-prefix */
1979 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1980 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1981 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1984 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1986 /* route-server-client */
1987 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1989 /* Make peer's RIB point to group's RIB. */
1990 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1992 /* Import policy. */
1993 if (pfilter
->map
[RMAP_IMPORT
].name
)
1994 free (pfilter
->map
[RMAP_IMPORT
].name
);
1995 if (gfilter
->map
[RMAP_IMPORT
].name
)
1997 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1998 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2002 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2003 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2006 /* Export policy. */
2007 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2009 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
2010 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2014 /* default-originate route-map */
2015 if (conf
->default_rmap
[afi
][safi
].name
)
2017 if (peer
->default_rmap
[afi
][safi
].name
)
2018 free (peer
->default_rmap
[afi
][safi
].name
);
2019 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
2020 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
2023 /* update-source apply */
2024 if (conf
->update_source
)
2026 if (peer
->update_source
)
2027 sockunion_free (peer
->update_source
);
2028 if (peer
->update_if
)
2030 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2031 peer
->update_if
= NULL
;
2033 peer
->update_source
= sockunion_dup (conf
->update_source
);
2035 else if (conf
->update_if
)
2037 if (peer
->update_if
)
2038 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2039 if (peer
->update_source
)
2041 sockunion_free (peer
->update_source
);
2042 peer
->update_source
= NULL
;
2044 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
2047 /* inbound filter apply */
2048 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
2050 if (pfilter
->dlist
[in
].name
)
2051 free (pfilter
->dlist
[in
].name
);
2052 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
2053 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
2055 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
2057 if (pfilter
->plist
[in
].name
)
2058 free (pfilter
->plist
[in
].name
);
2059 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
2060 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
2062 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
2064 if (pfilter
->aslist
[in
].name
)
2065 free (pfilter
->aslist
[in
].name
);
2066 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
2067 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
2069 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
2071 if (pfilter
->map
[RMAP_IN
].name
)
2072 free (pfilter
->map
[RMAP_IN
].name
);
2073 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
2074 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
2077 /* outbound filter apply */
2078 if (gfilter
->dlist
[out
].name
)
2080 if (pfilter
->dlist
[out
].name
)
2081 free (pfilter
->dlist
[out
].name
);
2082 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
2083 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
2087 if (pfilter
->dlist
[out
].name
)
2088 free (pfilter
->dlist
[out
].name
);
2089 pfilter
->dlist
[out
].name
= NULL
;
2090 pfilter
->dlist
[out
].alist
= NULL
;
2092 if (gfilter
->plist
[out
].name
)
2094 if (pfilter
->plist
[out
].name
)
2095 free (pfilter
->plist
[out
].name
);
2096 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
2097 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
2101 if (pfilter
->plist
[out
].name
)
2102 free (pfilter
->plist
[out
].name
);
2103 pfilter
->plist
[out
].name
= NULL
;
2104 pfilter
->plist
[out
].plist
= NULL
;
2106 if (gfilter
->aslist
[out
].name
)
2108 if (pfilter
->aslist
[out
].name
)
2109 free (pfilter
->aslist
[out
].name
);
2110 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
2111 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
2115 if (pfilter
->aslist
[out
].name
)
2116 free (pfilter
->aslist
[out
].name
);
2117 pfilter
->aslist
[out
].name
= NULL
;
2118 pfilter
->aslist
[out
].aslist
= NULL
;
2120 if (gfilter
->map
[RMAP_OUT
].name
)
2122 if (pfilter
->map
[RMAP_OUT
].name
)
2123 free (pfilter
->map
[RMAP_OUT
].name
);
2124 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
2125 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
2129 if (pfilter
->map
[RMAP_OUT
].name
)
2130 free (pfilter
->map
[RMAP_OUT
].name
);
2131 pfilter
->map
[RMAP_OUT
].name
= NULL
;
2132 pfilter
->map
[RMAP_OUT
].map
= NULL
;
2135 /* RS-client's import/export route-maps. */
2136 if (gfilter
->map
[RMAP_IMPORT
].name
)
2138 if (pfilter
->map
[RMAP_IMPORT
].name
)
2139 free (pfilter
->map
[RMAP_IMPORT
].name
);
2140 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
2141 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2145 if (pfilter
->map
[RMAP_IMPORT
].name
)
2146 free (pfilter
->map
[RMAP_IMPORT
].name
);
2147 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2148 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2150 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2152 if (pfilter
->map
[RMAP_EXPORT
].name
)
2153 free (pfilter
->map
[RMAP_EXPORT
].name
);
2154 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
2155 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2158 if (gfilter
->usmap
.name
)
2160 if (pfilter
->usmap
.name
)
2161 free (pfilter
->usmap
.name
);
2162 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
2163 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
2167 if (pfilter
->usmap
.name
)
2168 free (pfilter
->usmap
.name
);
2169 pfilter
->usmap
.name
= NULL
;
2170 pfilter
->usmap
.map
= NULL
;
2173 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2176 /* Peer group's remote AS configuration. */
2178 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
,
2179 as_t
*as
, int as_type
)
2181 struct peer_group
*group
;
2183 struct listnode
*node
, *nnode
;
2185 group
= peer_group_lookup (bgp
, group_name
);
2189 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2193 /* When we setup peer-group AS number all peer group member's AS
2194 number must be updated to same number. */
2195 peer_as_change (group
->conf
, *as
, as_type
);
2197 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2199 if (peer
->as
!= *as
)
2200 peer_as_change (peer
, *as
, as_type
);
2207 peer_group_delete (struct peer_group
*group
)
2211 struct prefix
*prefix
;
2213 struct listnode
*node
, *nnode
;
2218 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2220 other
= peer
->doppelganger
;
2222 if (other
&& other
->status
!= Deleted
)
2224 other
->group
= NULL
;
2228 list_delete (group
->peer
);
2230 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2232 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2234 prefix_free(prefix
);
2236 list_delete (group
->listen_range
[afi
]);
2242 group
->conf
->group
= NULL
;
2243 peer_delete (group
->conf
);
2245 /* Delete from all peer_group list. */
2246 listnode_delete (bgp
->group
, group
);
2248 bfd_info_free(&(group
->conf
->bfd_info
));
2250 peer_group_free (group
);
2256 peer_group_remote_as_delete (struct peer_group
*group
)
2258 struct peer
*peer
, *other
;
2259 struct listnode
*node
, *nnode
;
2261 if ((group
->conf
->as_type
== AS_UNSPECIFIED
) ||
2262 ((! group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2265 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2267 other
= peer
->doppelganger
;
2271 if (other
&& other
->status
!= Deleted
)
2273 other
->group
= NULL
;
2277 list_delete_all_node (group
->peer
);
2279 group
->conf
->as
= 0;
2280 group
->conf
->as_type
= AS_UNSPECIFIED
;
2286 peer_group_listen_range_add (struct peer_group
*group
, struct prefix
*range
)
2288 struct prefix
*prefix
;
2289 struct listnode
*node
, *nnode
;
2292 afi
= family2afi(range
->family
);
2294 /* Group needs remote AS configured. */
2295 if (! group
->conf
->as
)
2296 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2298 /* Ensure no duplicates. Currently we don't care about overlaps. */
2299 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2301 if (prefix_same(range
, prefix
))
2302 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
;
2305 prefix
= prefix_new();
2306 prefix_copy(prefix
, range
);
2307 listnode_add(group
->listen_range
[afi
], prefix
);
2312 peer_group_listen_range_del (struct peer_group
*group
, struct prefix
*range
)
2314 struct prefix
*prefix
, *prefix2
;
2315 struct listnode
*node
, *nnode
;
2318 char buf
[SU_ADDRSTRLEN
];
2320 afi
= family2afi(range
->family
);
2322 /* Identify the listen range. */
2323 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2325 if (prefix_same(range
, prefix
))
2330 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2332 prefix2str(prefix
, buf
, sizeof(buf
));
2334 /* Dispose off any dynamic neighbors that exist due to this listen range */
2335 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2337 if (!peer_dynamic_neighbor (peer
))
2340 prefix2
= sockunion2hostprefix(&peer
->su
);
2341 if (prefix_match(prefix
, prefix2
))
2343 if (bgp_debug_neighbor_events(peer
))
2344 zlog_debug ("Deleting dynamic neighbor %s group %s upon "
2345 "delete of listen range %s",
2346 peer
->host
, group
->name
, buf
);
2351 /* Get rid of the listen range */
2352 listnode_delete(group
->listen_range
[afi
], prefix
);
2357 /* Bind specified peer to peer group. */
2359 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2360 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
2362 int first_member
= 0;
2364 /* Check peer group's address family. */
2365 if (! group
->conf
->afc
[afi
][safi
])
2366 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
2368 /* Lookup the peer. */
2370 peer
= peer_lookup (bgp
, su
);
2372 /* Create a new peer. */
2375 if ((group
->conf
->as_type
== AS_SPECIFIED
) && (! group
->conf
->as
)) {
2376 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2379 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, afi
, safi
);
2380 peer
->group
= group
;
2381 peer
->af_group
[afi
][safi
] = 1;
2383 peer
= peer_lock (peer
); /* group->peer list reference */
2384 listnode_add (group
->peer
, peer
);
2385 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2386 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2391 /* When the peer already belongs to peer group, check the consistency. */
2392 if (peer
->af_group
[afi
][safi
])
2394 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2395 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2400 /* Check current peer group configuration. */
2401 if (peer_group_active (peer
)
2402 && strcmp (peer
->group
->name
, group
->name
) != 0)
2403 return BGP_ERR_PEER_GROUP_MISMATCH
;
2405 if (peer
->as_type
== AS_UNSPECIFIED
)
2407 peer
->as_type
= group
->conf
->as_type
;
2408 peer
->as
= group
->conf
->as
;
2411 if (! group
->conf
->as
)
2413 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2414 && peer_sort (group
->conf
) != peer_sort (peer
))
2418 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2421 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2425 peer
->af_group
[afi
][safi
] = 1;
2426 peer
->afc
[afi
][safi
] = 1;
2427 if (!peer_af_find(peer
, afi
, safi
) &&
2428 peer_af_create(peer
, afi
, safi
) == NULL
)
2430 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2434 peer
->group
= group
;
2436 peer
= peer_lock (peer
); /* group->peer list reference */
2437 listnode_add (group
->peer
, peer
);
2440 assert (group
&& peer
->group
== group
);
2444 /* Advertisement-interval reset */
2445 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2447 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2448 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2450 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2453 /* ebgp-multihop reset */
2454 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2455 group
->conf
->ttl
= 255;
2457 /* local-as reset */
2458 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2460 group
->conf
->change_local_as
= 0;
2461 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2462 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2466 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2468 struct listnode
*pn
;
2470 /* If it's not configured as RSERVER_CLIENT in any other address
2471 family, without being member of a peer_group, remove it from
2472 list bgp->rsclient.*/
2473 if (! peer_rsclient_active (peer
)
2474 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2476 peer_unlock (peer
); /* peer rsclient reference */
2477 list_delete_node (bgp
->rsclient
, pn
);
2479 /* Clear our own rsclient rib for this afi/safi. */
2480 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2483 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2485 /* Import policy. */
2486 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2488 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2489 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2490 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2493 /* Export policy. */
2494 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2495 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2497 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2498 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2499 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2503 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2504 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2506 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2508 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2509 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2510 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2513 bgp_session_reset(peer
);
2519 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2520 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2524 if (! peer
->af_group
[afi
][safi
])
2527 if (group
!= peer
->group
)
2528 return BGP_ERR_PEER_GROUP_MISMATCH
;
2530 peer
->af_group
[afi
][safi
] = 0;
2531 peer
->afc
[afi
][safi
] = 0;
2532 peer_af_flag_reset (peer
, afi
, safi
);
2533 if (peer_af_delete(peer
, afi
, safi
) != 0)
2535 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
2538 if (peer
->rib
[afi
][safi
])
2539 peer
->rib
[afi
][safi
] = NULL
;
2541 if (! peer_group_active (peer
))
2543 assert (listnode_lookup (group
->peer
, peer
));
2544 peer_unlock (peer
); /* peer group list reference */
2545 listnode_delete (group
->peer
, peer
);
2547 other
= peer
->doppelganger
;
2548 if (group
->conf
->as
)
2551 if (other
&& other
->status
!= Deleted
)
2556 listnode_delete(group
->peer
, other
);
2558 other
->group
= NULL
;
2563 bgp_bfd_deregister_peer(peer
);
2564 peer_global_config_reset (peer
);
2567 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2569 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2570 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2571 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2574 bgp_session_reset(peer
);
2580 bgp_startup_timer_expire (struct thread
*thread
)
2584 bgp
= THREAD_ARG (thread
);
2585 bgp
->t_startup
= NULL
;
2591 /* BGP instance creation by `router bgp' commands. */
2593 bgp_create (as_t
*as
, const char *name
)
2599 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2603 bgp
->peer_self
= peer_new (bgp
);
2604 bgp
->peer_self
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, "Static announcement");
2606 bgp
->peer
= list_new ();
2607 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2609 bgp
->group
= list_new ();
2610 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2612 bgp
->rsclient
= list_new ();
2613 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2615 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2616 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2618 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2619 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2620 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2621 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2622 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2625 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2626 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2627 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
2628 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2629 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2630 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2631 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2632 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
2633 bgp
->dynamic_neighbors_count
= 0;
2638 bgp
->name
= strdup (name
);
2640 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2641 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2643 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2644 bgp
, bgp
->restart_time
);
2646 update_bgp_group_init(bgp
);
2650 /* Return first entry of BGP. */
2652 bgp_get_default (void)
2655 return (listgetdata (listhead (bm
->bgp
)));
2659 /* Lookup BGP entry. */
2661 bgp_lookup (as_t as
, const char *name
)
2664 struct listnode
*node
, *nnode
;
2666 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2668 && ((bgp
->name
== NULL
&& name
== NULL
)
2669 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2674 /* Lookup BGP structure by view name. */
2676 bgp_lookup_by_name (const char *name
)
2679 struct listnode
*node
, *nnode
;
2681 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2682 if ((bgp
->name
== NULL
&& name
== NULL
)
2683 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2688 /* Called from VTY commands. */
2690 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2694 /* Multiple instance check. */
2695 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2698 bgp
= bgp_lookup_by_name (name
);
2700 bgp
= bgp_get_default ();
2702 /* Already exists. */
2708 return BGP_ERR_INSTANCE_MISMATCH
;
2716 /* BGP instance name can not be specified for single instance. */
2718 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2720 /* Get default BGP structure if exists. */
2721 bgp
= bgp_get_default ();
2728 return BGP_ERR_AS_MISMATCH
;
2735 bgp
= bgp_create (as
, name
);
2736 bgp_router_id_set(bgp
, &router_id_zebra
);
2739 bgp
->t_rmap_def_originate_eval
= NULL
;
2740 bgp
->t_rmap_update
= NULL
;
2741 bgp
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
2743 /* Create BGP server socket, if first instance. */
2744 if (list_isempty(bm
->bgp
)
2745 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2747 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2748 return BGP_ERR_INVALID_VALUE
;
2751 listnode_add (bm
->bgp
, bgp
);
2756 /* Delete BGP instance. */
2758 bgp_delete (struct bgp
*bgp
)
2761 struct peer_group
*group
;
2762 struct listnode
*node
;
2763 struct listnode
*next
;
2767 THREAD_OFF (bgp
->t_startup
);
2769 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2771 if (peer
->status
== Established
||
2772 peer
->status
== OpenSent
||
2773 peer
->status
== OpenConfirm
)
2775 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2776 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2780 if (bgp
->t_rmap_update
)
2781 BGP_TIMER_OFF(bgp
->t_rmap_update
);
2783 /* Delete static route. */
2784 bgp_static_delete (bgp
);
2786 /* Unset redistribution. */
2787 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2788 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2789 if (i
!= ZEBRA_ROUTE_BGP
)
2790 bgp_redistribute_unset (bgp
, afi
, i
, 0);
2792 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2794 for (ALL_LIST_ELEMENTS (group
->peer
, node
, next
, peer
))
2796 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2798 /* Send notify to remote peer. */
2799 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2802 peer_group_delete (group
);
2805 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2807 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2809 /* Send notify to remote peer. */
2810 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2816 assert (listcount (bgp
->rsclient
) == 0);
2818 if (bgp
->peer_self
) {
2819 peer_delete(bgp
->peer_self
);
2820 bgp
->peer_self
= NULL
;
2823 if (bgp
->t_rmap_def_originate_eval
)
2825 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
2829 update_bgp_group_free (bgp
);
2830 /* Remove visibility via the master list - there may however still be
2831 * routes to be processed still referencing the struct bgp.
2833 listnode_delete (bm
->bgp
, bgp
);
2834 if (list_isempty(bm
->bgp
))
2837 bgp_unlock(bgp
); /* initial reference */
2842 static void bgp_free (struct bgp
*);
2845 bgp_lock (struct bgp
*bgp
)
2851 bgp_unlock(struct bgp
*bgp
)
2853 assert(bgp
->lock
> 0);
2854 if (--bgp
->lock
== 0)
2859 bgp_free (struct bgp
*bgp
)
2864 list_delete (bgp
->group
);
2865 list_delete (bgp
->peer
);
2866 list_delete (bgp
->rsclient
);
2871 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2872 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2874 if (bgp
->route
[afi
][safi
])
2875 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2876 if (bgp
->aggregate
[afi
][safi
])
2877 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2878 if (bgp
->rib
[afi
][safi
])
2879 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2881 XFREE (MTYPE_BGP
, bgp
);
2885 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2888 struct listnode
*node
, *nnode
;
2895 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2896 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2897 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2900 else if (bm
->bgp
!= NULL
)
2902 struct listnode
*bgpnode
, *nbgpnode
;
2904 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2905 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2906 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2907 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2914 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2917 struct listnode
*node
, *nnode
;
2921 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2922 if (sockunion_same (&peer
->su
, su
)
2923 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2926 else if (bm
->bgp
!= NULL
)
2928 struct listnode
*bgpnode
, *nbgpnode
;
2930 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2931 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2932 if (sockunion_same (&peer
->su
, su
)
2933 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2940 peer_create_bind_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
,
2941 struct peer_group
*group
)
2947 /* Create peer first; we've already checked group config is valid. */
2948 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, 0, 0);
2953 peer
->group
= group
;
2954 peer
= peer_lock (peer
);
2955 listnode_add (group
->peer
, peer
);
2958 * Bind peer for all AFs configured for the group. We don't call
2959 * peer_group_bind as that is sub-optimal and does some stuff we don't want.
2961 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2962 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2964 if (!group
->conf
->afc
[afi
][safi
])
2966 peer
->af_group
[afi
][safi
] = 1;
2967 peer
->afc
[afi
][safi
] = 1;
2968 if (!peer_af_find(peer
, afi
, safi
) &&
2969 peer_af_create(peer
, afi
, safi
) == NULL
)
2971 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2973 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2976 /* Mark as dynamic, but also as a "config node" for other things to work. */
2977 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
2978 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2984 peer_group_lookup_dynamic_neighbor_range (struct peer_group
* group
,
2985 struct prefix
* prefix
)
2987 struct listnode
*node
, *nnode
;
2988 struct prefix
*range
;
2991 afi
= family2afi(prefix
->family
);
2993 if (group
->listen_range
[afi
])
2994 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, range
))
2995 if (prefix_match(range
, prefix
))
3002 peer_group_lookup_dynamic_neighbor (struct bgp
*bgp
, struct prefix
*prefix
,
3003 struct prefix
**listen_range
)
3005 struct prefix
*range
= NULL
;
3006 struct peer_group
*group
= NULL
;
3007 struct listnode
*node
, *nnode
;
3009 *listen_range
= NULL
;
3012 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3013 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3016 else if (bm
->bgp
!= NULL
)
3018 struct listnode
*bgpnode
, *nbgpnode
;
3020 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
3021 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3022 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
3026 *listen_range
= range
;
3027 return (group
&& range
) ? group
: NULL
;
3031 peer_lookup_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
)
3033 struct peer_group
*group
;
3036 struct prefix
*prefix
;
3037 struct prefix
*listen_range
;
3039 char buf
[SU_ADDRSTRLEN
];
3040 char buf1
[SU_ADDRSTRLEN
];
3042 prefix
= sockunion2hostprefix(su
);
3047 /* See if incoming connection matches a configured listen range. */
3048 group
= peer_group_lookup_dynamic_neighbor (bgp
, prefix
, &listen_range
);
3059 prefix2str(prefix
, buf
, sizeof(buf
));
3060 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3062 if (bgp_debug_neighbor_events(NULL
))
3063 zlog_debug ("Dynamic Neighbor %s matches group %s listen range %s",
3064 buf
, group
->name
, buf1
);
3066 /* Are we within the listen limit? */
3067 dncount
= gbgp
->dynamic_neighbors_count
;
3069 if (dncount
>= gbgp
->dynamic_neighbors_limit
)
3071 if (bgp_debug_neighbor_events(NULL
))
3072 zlog_debug ("Dynamic Neighbor %s rejected - at limit %d",
3073 inet_sutop (su
, buf
), gbgp
->dynamic_neighbors_limit
);
3077 /* Ensure group is not disabled. */
3078 if (CHECK_FLAG (group
->conf
->flags
, PEER_FLAG_SHUTDOWN
))
3080 if (bgp_debug_neighbor_events(NULL
))
3081 zlog_debug ("Dynamic Neighbor %s rejected - group %s disabled",
3086 /* Check that at least one AF is activated for the group. */
3087 if (!peer_group_af_configured (group
))
3089 if (bgp_debug_neighbor_events(NULL
))
3090 zlog_debug ("Dynamic Neighbor %s rejected - no AF activated for group %s",
3095 /* Create dynamic peer and bind to associated group. */
3096 peer
= peer_create_bind_dynamic_neighbor (gbgp
, su
, group
);
3099 gbgp
->dynamic_neighbors_count
= ++dncount
;
3101 if (bgp_debug_neighbor_events(peer
))
3102 zlog_debug ("%s Dynamic Neighbor added, group %s count %d",
3103 peer
->host
, group
->name
, dncount
);
3108 void peer_drop_dynamic_neighbor (struct peer
*peer
)
3111 if (peer
->group
&& peer
->group
->bgp
)
3113 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3115 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3117 if (bgp_debug_neighbor_events(peer
))
3118 zlog_debug ("%s dropped from group %s, count %d",
3119 peer
->host
, peer
->group
->name
, dncount
);
3123 /* If peer is configured at least one address family return 1. */
3125 peer_active (struct peer
*peer
)
3127 if (BGP_PEER_SU_UNSPEC(peer
))
3129 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
3130 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3131 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
3132 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3133 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
3138 /* If peer is negotiated at least one address family return 1. */
3140 peer_active_nego (struct peer
*peer
)
3142 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3143 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3144 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3145 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3146 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
3151 /* peer_flag_change_type. */
3152 enum peer_change_type
3156 peer_change_reset_in
,
3157 peer_change_reset_out
,
3161 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
3162 enum peer_change_type type
)
3164 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3167 if (peer
->status
!= Established
)
3170 if (type
== peer_change_reset
)
3172 /* If we're resetting session, we've to delete both peer struct */
3173 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3174 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3175 PEER_FLAG_CONFIG_NODE
)))
3176 peer_delete(peer
->doppelganger
);
3178 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3179 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3181 else if (type
== peer_change_reset_in
)
3183 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3184 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3185 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3188 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3189 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3190 PEER_FLAG_CONFIG_NODE
)))
3191 peer_delete(peer
->doppelganger
);
3193 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3194 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3197 else if (type
== peer_change_reset_out
)
3199 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3200 bgp_announce_route (peer
, afi
, safi
);
3204 struct peer_flag_action
3209 /* This flag can be set for peer-group member. */
3210 u_char not_for_member
;
3212 /* Action when the flag is changed. */
3213 enum peer_change_type type
;
3215 /* Peer down cause */
3219 static const struct peer_flag_action peer_flag_action_list
[] =
3221 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3222 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3223 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3224 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3225 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3226 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3227 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3228 { PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3232 static const struct peer_flag_action peer_af_flag_action_list
[] =
3234 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3235 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3236 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3237 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3238 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3239 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3240 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3241 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3242 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3243 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3244 { PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3245 { PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
,1, peer_change_reset_out
},
3246 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3247 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3248 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3249 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3250 { PEER_FLAG_FORCE_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3251 { PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3255 /* Proper action set. */
3257 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
3258 struct peer_flag_action
*action
, u_int32_t flag
)
3264 const struct peer_flag_action
*match
= NULL
;
3266 /* Check peer's frag action. */
3267 for (i
= 0; i
< size
; i
++)
3269 match
= &action_list
[i
];
3271 if (match
->flag
== 0)
3274 if (match
->flag
& flag
)
3278 if (match
->type
== peer_change_reset_in
)
3280 if (match
->type
== peer_change_reset_out
)
3282 if (match
->type
== peer_change_reset
)
3287 if (match
->not_for_member
)
3288 action
->not_for_member
= 1;
3292 /* Set peer clear type. */
3293 if (reset_in
&& reset_out
)
3294 action
->type
= peer_change_reset
;
3296 action
->type
= peer_change_reset_in
;
3298 action
->type
= peer_change_reset_out
;
3300 action
->type
= peer_change_none
;
3306 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
3308 if (flag
== PEER_FLAG_SHUTDOWN
)
3310 if (CHECK_FLAG (peer
->flags
, flag
))
3312 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3313 peer_nsf_stop (peer
);
3315 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3316 if (peer
->t_pmax_restart
)
3318 BGP_TIMER_OFF (peer
->t_pmax_restart
);
3319 if (bgp_debug_neighbor_events(peer
))
3320 zlog_debug ("%s Maximum-prefix restart timer canceled",
3324 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3325 peer_nsf_stop (peer
);
3327 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3328 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3329 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3331 bgp_session_reset(peer
);
3335 peer
->v_start
= BGP_INIT_START_TIMER
;
3336 BGP_EVENT_ADD (peer
, BGP_Stop
);
3339 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3341 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
3342 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3343 else if (flag
== PEER_FLAG_PASSIVE
)
3344 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
3345 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
3346 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
3348 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3349 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3352 bgp_session_reset(peer
);
3355 /* Change specified peer flag. */
3357 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
3361 struct peer_group
*group
;
3362 struct listnode
*node
, *nnode
;
3363 struct peer_flag_action action
;
3365 memset (&action
, 0, sizeof (struct peer_flag_action
));
3366 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
3368 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
3370 /* No flag action is found. */
3372 return BGP_ERR_INVALID_FLAG
;
3374 /* Not for peer-group member. */
3375 if (action
.not_for_member
&& peer_group_active (peer
))
3376 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3378 /* When unset the peer-group member's flag we have to check
3379 peer-group configuration. */
3380 if (! set
&& peer_group_active (peer
))
3381 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
3383 if (flag
== PEER_FLAG_SHUTDOWN
)
3384 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
3386 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3389 /* Flag conflict check. */
3391 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
3392 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
3393 return BGP_ERR_PEER_FLAG_CONFLICT
;
3395 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3397 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3399 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3404 SET_FLAG (peer
->flags
, flag
);
3406 UNSET_FLAG (peer
->flags
, flag
);
3408 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3410 if (action
.type
== peer_change_reset
)
3411 peer_flag_modify_action (peer
, flag
);
3416 /* peer-group member updates. */
3417 group
= peer
->group
;
3419 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3421 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3424 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3428 SET_FLAG (peer
->flags
, flag
);
3430 UNSET_FLAG (peer
->flags
, flag
);
3432 if (action
.type
== peer_change_reset
)
3433 peer_flag_modify_action (peer
, flag
);
3439 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
3441 return peer_flag_modify (peer
, flag
, 1);
3445 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
3447 return peer_flag_modify (peer
, flag
, 0);
3451 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
3453 if (peer
->af_group
[afi
][safi
])
3459 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
3464 struct listnode
*node
, *nnode
;
3465 struct peer_group
*group
;
3466 struct peer_flag_action action
;
3468 memset (&action
, 0, sizeof (struct peer_flag_action
));
3469 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
3471 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
3473 /* No flag action is found. */
3475 return BGP_ERR_INVALID_FLAG
;
3477 /* Adress family must be activated. */
3478 if (! peer
->afc
[afi
][safi
])
3479 return BGP_ERR_PEER_INACTIVE
;
3481 /* Not for peer-group member. */
3482 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
3483 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3485 /* Spcecial check for reflector client. */
3486 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
3487 && peer_sort (peer
) != BGP_PEER_IBGP
)
3488 return BGP_ERR_NOT_INTERNAL_PEER
;
3490 /* Spcecial check for remove-private-AS. */
3491 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
3492 && peer_sort (peer
) == BGP_PEER_IBGP
)
3493 return BGP_ERR_REMOVE_PRIVATE_AS
;
3495 /* as-override is not allowed for IBGP peers */
3496 if (flag
& PEER_FLAG_AS_OVERRIDE
3497 && peer_sort (peer
) == BGP_PEER_IBGP
)
3498 return BGP_ERR_AS_OVERRIDE
;
3500 /* When unset the peer-group member's flag we have to check
3501 peer-group configuration. */
3502 if (! set
&& peer
->af_group
[afi
][safi
])
3503 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
3504 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3506 /* When current flag configuration is same as requested one. */
3507 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3509 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3511 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3516 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3518 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3520 /* Execute action when peer is established. */
3521 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3522 && peer
->status
== Established
)
3524 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3525 bgp_clear_adj_in (peer
, afi
, safi
);
3528 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3529 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3530 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3531 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3532 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3533 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3534 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3535 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3537 peer_change_action (peer
, afi
, safi
, action
.type
);
3542 /* Peer group member updates. */
3543 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3545 group
= peer
->group
;
3547 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3549 if (! peer
->af_group
[afi
][safi
])
3552 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3555 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3559 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3561 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3563 if (peer
->status
== Established
)
3565 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3566 bgp_clear_adj_in (peer
, afi
, safi
);
3569 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3570 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3571 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3572 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3573 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3574 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3575 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3576 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3578 peer_change_action (peer
, afi
, safi
, action
.type
);
3587 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3589 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
3593 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3595 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
3598 /* EBGP multihop configuration. */
3600 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
3602 struct peer_group
*group
;
3603 struct listnode
*node
, *nnode
;
3606 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
3609 /* see comment in peer_ttl_security_hops_set() */
3612 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3614 group
= peer
->group
;
3615 if (group
->conf
->gtsm_hops
!= 0)
3616 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3618 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
3620 if (peer1
->sort
== BGP_PEER_IBGP
)
3623 if (peer1
->gtsm_hops
!= 0)
3624 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3629 if (peer
->gtsm_hops
!= 0)
3630 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3636 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3638 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3640 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3641 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3642 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3644 bgp_session_reset(peer
);
3649 group
= peer
->group
;
3650 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3652 if (peer
->sort
== BGP_PEER_IBGP
)
3655 peer
->ttl
= group
->conf
->ttl
;
3657 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3658 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3659 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3661 bgp_session_reset(peer
);
3668 peer_ebgp_multihop_unset (struct peer
*peer
)
3670 struct peer_group
*group
;
3671 struct listnode
*node
, *nnode
;
3673 if (peer
->sort
== BGP_PEER_IBGP
)
3676 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3677 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3679 if (peer_group_active (peer
))
3680 peer
->ttl
= peer
->group
->conf
->ttl
;
3684 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3686 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3687 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3688 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3690 bgp_session_reset(peer
);
3694 group
= peer
->group
;
3695 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3697 if (peer
->sort
== BGP_PEER_IBGP
)
3704 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3705 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3706 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3708 bgp_session_reset(peer
);
3715 /* Neighbor description. */
3717 peer_description_set (struct peer
*peer
, char *desc
)
3720 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3722 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3728 peer_description_unset (struct peer
*peer
)
3731 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3738 /* Neighbor update-source. */
3740 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3742 struct peer_group
*group
;
3743 struct listnode
*node
, *nnode
;
3745 if (peer
->update_if
)
3747 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3748 && strcmp (peer
->update_if
, ifname
) == 0)
3751 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3752 peer
->update_if
= NULL
;
3755 if (peer
->update_source
)
3757 sockunion_free (peer
->update_source
);
3758 peer
->update_source
= NULL
;
3761 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3763 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3765 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3767 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3768 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3769 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3772 bgp_session_reset(peer
);
3776 /* peer-group member updates. */
3777 group
= peer
->group
;
3778 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3780 if (peer
->update_if
)
3782 if (strcmp (peer
->update_if
, ifname
) == 0)
3785 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3786 peer
->update_if
= NULL
;
3789 if (peer
->update_source
)
3791 sockunion_free (peer
->update_source
);
3792 peer
->update_source
= NULL
;
3795 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3797 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3799 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3800 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3801 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3804 bgp_session_reset(peer
);
3810 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3812 struct peer_group
*group
;
3813 struct listnode
*node
, *nnode
;
3815 if (peer
->update_source
)
3817 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3818 && sockunion_cmp (peer
->update_source
, su
) == 0)
3820 sockunion_free (peer
->update_source
);
3821 peer
->update_source
= NULL
;
3824 if (peer
->update_if
)
3826 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3827 peer
->update_if
= NULL
;
3831 peer
->update_source
= sockunion_dup (su
);
3833 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3835 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3837 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3838 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3839 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3842 bgp_session_reset(peer
);
3846 /* peer-group member updates. */
3847 group
= peer
->group
;
3848 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3850 if (peer
->update_source
)
3852 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3854 sockunion_free (peer
->update_source
);
3855 peer
->update_source
= NULL
;
3858 if (peer
->update_if
)
3860 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3861 peer
->update_if
= NULL
;
3864 peer
->update_source
= sockunion_dup (su
);
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
);
3879 peer_update_source_unset (struct peer
*peer
)
3881 union sockunion
*su
;
3882 struct peer_group
*group
;
3883 struct listnode
*node
, *nnode
;
3885 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3886 && ! peer
->update_source
3887 && ! peer
->update_if
)
3890 if (peer
->update_source
)
3892 sockunion_free (peer
->update_source
);
3893 peer
->update_source
= NULL
;
3895 if (peer
->update_if
)
3897 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3898 peer
->update_if
= NULL
;
3901 if (peer_group_active (peer
))
3903 group
= peer
->group
;
3905 if (group
->conf
->update_source
)
3907 su
= sockunion_dup (group
->conf
->update_source
);
3908 peer
->update_source
= su
;
3910 else if (group
->conf
->update_if
)
3912 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3915 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3917 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3919 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3920 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3921 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3924 bgp_session_reset(peer
);
3928 /* peer-group member updates. */
3929 group
= peer
->group
;
3930 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3932 if (! peer
->update_source
&& ! peer
->update_if
)
3935 if (peer
->update_source
)
3937 sockunion_free (peer
->update_source
);
3938 peer
->update_source
= NULL
;
3941 if (peer
->update_if
)
3943 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3944 peer
->update_if
= NULL
;
3947 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3949 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3950 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3951 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3954 bgp_session_reset(peer
);
3960 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3963 struct peer_group
*group
;
3964 struct listnode
*node
, *nnode
;
3966 /* Adress family must be activated. */
3967 if (! peer
->afc
[afi
][safi
])
3968 return BGP_ERR_PEER_INACTIVE
;
3970 /* Default originate can't be used for peer group memeber. */
3971 if (peer_is_group_member (peer
, afi
, safi
))
3972 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3974 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3975 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3976 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3978 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3982 if (peer
->default_rmap
[afi
][safi
].name
)
3983 free (peer
->default_rmap
[afi
][safi
].name
);
3984 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3985 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3989 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3991 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
3992 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3993 bgp_default_originate (peer
, afi
, safi
, 0);
3994 bgp_announce_route (peer
, afi
, safi
);
3999 /* peer-group member updates. */
4000 group
= peer
->group
;
4001 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4003 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4007 if (peer
->default_rmap
[afi
][safi
].name
)
4008 free (peer
->default_rmap
[afi
][safi
].name
);
4009 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
4010 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
4013 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4014 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4015 bgp_default_originate (peer
, afi
, safi
, 0);
4016 bgp_announce_route (peer
, afi
, safi
);
4023 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4025 struct peer_group
*group
;
4026 struct listnode
*node
, *nnode
;
4028 /* Adress family must be activated. */
4029 if (! peer
->afc
[afi
][safi
])
4030 return BGP_ERR_PEER_INACTIVE
;
4032 /* Default originate can't be used for peer group memeber. */
4033 if (peer_is_group_member (peer
, afi
, safi
))
4034 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4036 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
4038 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4040 if (peer
->default_rmap
[afi
][safi
].name
)
4041 free (peer
->default_rmap
[afi
][safi
].name
);
4042 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4043 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4046 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4048 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4049 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4050 bgp_default_originate (peer
, afi
, safi
, 1);
4051 bgp_announce_route (peer
, afi
, safi
);
4056 /* peer-group member updates. */
4057 group
= peer
->group
;
4058 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4060 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4062 if (peer
->default_rmap
[afi
][safi
].name
)
4063 free (peer
->default_rmap
[afi
][safi
].name
);
4064 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4065 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4067 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4068 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4069 bgp_default_originate (peer
, afi
, safi
, 1);
4070 bgp_announce_route (peer
, afi
, safi
);
4077 peer_port_set (struct peer
*peer
, u_int16_t port
)
4084 peer_port_unset (struct peer
*peer
)
4086 peer
->port
= BGP_PORT_DEFAULT
;
4090 /* neighbor weight. */
4092 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
4094 struct peer_group
*group
;
4095 struct listnode
*node
, *nnode
;
4097 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4098 peer
->weight
= weight
;
4100 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4103 /* peer-group member updates. */
4104 group
= peer
->group
;
4105 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4107 peer
->weight
= group
->conf
->weight
;
4112 peer_weight_unset (struct peer
*peer
)
4114 struct peer_group
*group
;
4115 struct listnode
*node
, *nnode
;
4117 /* Set default weight. */
4118 if (peer_group_active (peer
))
4119 peer
->weight
= peer
->group
->conf
->weight
;
4123 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4125 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4128 /* peer-group member updates. */
4129 group
= peer
->group
;
4130 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4138 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
4140 struct peer_group
*group
;
4141 struct listnode
*node
, *nnode
;
4143 /* Not for peer group memeber. */
4144 if (peer_group_active (peer
))
4145 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4147 /* keepalive value check. */
4148 if (keepalive
> 65535)
4149 return BGP_ERR_INVALID_VALUE
;
4151 /* Holdtime value check. */
4152 if (holdtime
> 65535)
4153 return BGP_ERR_INVALID_VALUE
;
4155 /* Holdtime value must be either 0 or greater than 3. */
4156 if (holdtime
< 3 && holdtime
!= 0)
4157 return BGP_ERR_INVALID_VALUE
;
4159 /* Set value to the configuration. */
4160 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4161 peer
->holdtime
= holdtime
;
4162 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
4164 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4167 /* peer-group member updates. */
4168 group
= peer
->group
;
4169 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4171 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4172 peer
->holdtime
= group
->conf
->holdtime
;
4173 peer
->keepalive
= group
->conf
->keepalive
;
4179 peer_timers_unset (struct peer
*peer
)
4181 struct peer_group
*group
;
4182 struct listnode
*node
, *nnode
;
4184 if (peer_group_active (peer
))
4185 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4187 /* Clear configuration. */
4188 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4189 peer
->keepalive
= 0;
4192 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4195 /* peer-group member updates. */
4196 group
= peer
->group
;
4197 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4199 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4201 peer
->keepalive
= 0;
4208 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
4210 struct peer_group
*group
;
4211 struct listnode
*node
, *nnode
;
4213 if (peer_group_active (peer
))
4214 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4216 if (connect
> 65535)
4217 return BGP_ERR_INVALID_VALUE
;
4219 /* Set value to the configuration. */
4220 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4221 peer
->connect
= connect
;
4223 /* Set value to timer setting. */
4224 peer
->v_connect
= connect
;
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
))
4233 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4234 peer
->connect
= connect
;
4235 peer
->v_connect
= connect
;
4241 peer_timers_connect_unset (struct peer
*peer
)
4243 struct peer_group
*group
;
4244 struct listnode
*node
, *nnode
;
4246 if (peer_group_active (peer
))
4247 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4249 /* Clear configuration. */
4250 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4253 /* Set timer setting to default value. */
4254 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4256 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4259 /* peer-group member updates. */
4260 group
= peer
->group
;
4261 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4263 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4265 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4271 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
4273 struct peer_group
*group
;
4274 struct listnode
*node
, *nnode
;
4276 if (peer_group_active (peer
))
4277 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4280 return BGP_ERR_INVALID_VALUE
;
4282 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4283 peer
->routeadv
= routeadv
;
4284 peer
->v_routeadv
= routeadv
;
4286 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4287 update_group_adjust_peer_afs (peer
);
4288 if (peer
->status
== Established
)
4289 bgp_announce_route_all (peer
);
4293 /* peer-group member updates. */
4294 group
= peer
->group
;
4295 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4297 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4298 peer
->routeadv
= routeadv
;
4299 peer
->v_routeadv
= routeadv
;
4300 update_group_adjust_peer_afs (peer
);
4301 if (peer
->status
== Established
)
4302 bgp_announce_route_all (peer
);
4309 peer_advertise_interval_unset (struct peer
*peer
)
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 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4320 if (peer
->sort
== BGP_PEER_IBGP
)
4321 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4323 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4325 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4326 update_group_adjust_peer_afs (peer
);
4327 if (peer
->status
== Established
)
4328 bgp_announce_route_all (peer
);
4332 /* peer-group member updates. */
4333 group
= peer
->group
;
4334 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4336 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4339 if (peer
->sort
== BGP_PEER_IBGP
)
4340 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4342 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4344 update_group_adjust_peer_afs (peer
);
4345 if (peer
->status
== Established
)
4346 bgp_announce_route_all (peer
);
4352 /* neighbor interface */
4354 peer_interface_set (struct peer
*peer
, const char *str
)
4357 free (peer
->ifname
);
4358 peer
->ifname
= strdup (str
);
4362 peer_interface_unset (struct peer
*peer
)
4365 free (peer
->ifname
);
4366 peer
->ifname
= NULL
;
4371 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
4373 struct peer_group
*group
;
4374 struct listnode
*node
, *nnode
;
4376 if (allow_num
< 1 || allow_num
> 10)
4377 return BGP_ERR_INVALID_VALUE
;
4379 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4381 peer
->allowas_in
[afi
][safi
] = allow_num
;
4382 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4383 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4386 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4389 group
= peer
->group
;
4390 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4392 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4394 peer
->allowas_in
[afi
][safi
] = allow_num
;
4395 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4396 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4404 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4406 struct peer_group
*group
;
4407 struct listnode
*node
, *nnode
;
4409 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4411 peer
->allowas_in
[afi
][safi
] = 0;
4412 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4415 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4418 group
= peer
->group
;
4419 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4421 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4423 peer
->allowas_in
[afi
][safi
] = 0;
4424 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4431 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
4433 struct bgp
*bgp
= peer
->bgp
;
4434 struct peer_group
*group
;
4435 struct listnode
*node
, *nnode
;
4437 if (peer_sort (peer
) != BGP_PEER_EBGP
4438 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
4439 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
4442 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
4444 if (peer_group_active (peer
))
4445 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4448 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
4450 if (peer
->change_local_as
== as
&&
4451 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
4452 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
4453 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
4454 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
4457 peer
->change_local_as
= as
;
4459 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4461 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4464 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4466 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4468 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4470 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4472 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4473 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4474 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4477 bgp_session_reset(peer
);
4481 group
= peer
->group
;
4482 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4484 peer
->change_local_as
= as
;
4486 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4488 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4491 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4493 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4495 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4497 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4498 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4499 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4502 BGP_EVENT_ADD (peer
, BGP_Stop
);
4509 peer_local_as_unset (struct peer
*peer
)
4511 struct peer_group
*group
;
4512 struct listnode
*node
, *nnode
;
4514 if (peer_group_active (peer
))
4515 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4517 if (! peer
->change_local_as
)
4520 peer
->change_local_as
= 0;
4521 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4522 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4524 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4526 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4528 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4529 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4530 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4533 BGP_EVENT_ADD (peer
, BGP_Stop
);
4538 group
= peer
->group
;
4539 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4541 peer
->change_local_as
= 0;
4542 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4543 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4545 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4547 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4548 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4549 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4552 bgp_session_reset(peer
);
4557 /* Set password for authenticating with the peer. */
4559 peer_password_set (struct peer
*peer
, const char *password
)
4561 struct listnode
*nn
, *nnode
;
4562 int len
= password
? strlen(password
) : 0;
4563 int ret
= BGP_SUCCESS
;
4565 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
4566 return BGP_ERR_INVALID_VALUE
;
4568 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
4569 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4573 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4575 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
4577 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4579 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4580 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4582 bgp_session_reset(peer
);
4584 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
4587 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4589 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
4593 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4595 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
4597 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4598 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4600 bgp_session_reset(peer
);
4602 if (bgp_md5_set (peer
) < 0)
4603 ret
= BGP_ERR_TCPSIG_FAILED
;
4610 peer_password_unset (struct peer
*peer
)
4612 struct listnode
*nn
, *nnode
;
4615 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4618 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4620 if (peer_group_active (peer
)
4621 && peer
->group
->conf
->password
4622 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
4623 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
4625 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4626 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4628 bgp_session_reset(peer
);
4631 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4633 peer
->password
= NULL
;
4640 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4641 peer
->password
= NULL
;
4643 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4645 if (!peer
->password
)
4648 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4649 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4651 bgp_session_reset(peer
);
4653 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4654 peer
->password
= NULL
;
4663 * Helper function that is called after the name of the policy
4664 * being used by a peer has changed (AF specific). Automatically
4665 * initiates inbound or outbound processing as needed.
4668 peer_on_policy_change (struct peer
*peer
, afi_t afi
, safi_t safi
, int outbound
)
4672 update_group_adjust_peer (peer_af_find (peer
, afi
, safi
));
4673 if (peer
->status
== Established
)
4674 bgp_announce_route(peer
, afi
, safi
);
4678 if (peer
->status
!= Established
)
4681 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4682 bgp_soft_reconfig_in (peer
, afi
, safi
);
4683 else if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4684 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4685 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4690 /* Set distribute list to the peer. */
4692 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4695 struct bgp_filter
*filter
;
4696 struct peer_group
*group
;
4697 struct listnode
*node
, *nnode
;
4699 if (! peer
->afc
[afi
][safi
])
4700 return BGP_ERR_PEER_INACTIVE
;
4702 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4703 return BGP_ERR_INVALID_VALUE
;
4705 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4706 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4708 filter
= &peer
->filter
[afi
][safi
];
4710 if (filter
->plist
[direct
].name
)
4711 return BGP_ERR_PEER_FILTER_CONFLICT
;
4713 if (filter
->dlist
[direct
].name
)
4714 free (filter
->dlist
[direct
].name
);
4715 filter
->dlist
[direct
].name
= strdup (name
);
4716 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4718 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4720 peer_on_policy_change(peer
, afi
, safi
,
4721 (direct
== FILTER_OUT
) ? 1 : 0);
4725 group
= peer
->group
;
4726 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4728 filter
= &peer
->filter
[afi
][safi
];
4730 if (! peer
->af_group
[afi
][safi
])
4733 if (filter
->dlist
[direct
].name
)
4734 free (filter
->dlist
[direct
].name
);
4735 filter
->dlist
[direct
].name
= strdup (name
);
4736 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4737 peer_on_policy_change(peer
, afi
, safi
,
4738 (direct
== FILTER_OUT
) ? 1 : 0);
4745 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4747 struct bgp_filter
*filter
;
4748 struct bgp_filter
*gfilter
;
4749 struct peer_group
*group
;
4750 struct listnode
*node
, *nnode
;
4752 if (! peer
->afc
[afi
][safi
])
4753 return BGP_ERR_PEER_INACTIVE
;
4755 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4756 return BGP_ERR_INVALID_VALUE
;
4758 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4759 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4761 filter
= &peer
->filter
[afi
][safi
];
4763 /* apply peer-group filter */
4764 if (peer
->af_group
[afi
][safi
])
4766 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4768 if (gfilter
->dlist
[direct
].name
)
4770 if (filter
->dlist
[direct
].name
)
4771 free (filter
->dlist
[direct
].name
);
4772 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
4773 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4774 peer_on_policy_change(peer
, afi
, safi
,
4775 (direct
== FILTER_OUT
) ? 1 : 0);
4780 if (filter
->dlist
[direct
].name
)
4781 free (filter
->dlist
[direct
].name
);
4782 filter
->dlist
[direct
].name
= NULL
;
4783 filter
->dlist
[direct
].alist
= NULL
;
4785 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4787 peer_on_policy_change(peer
, afi
, safi
,
4788 (direct
== FILTER_OUT
) ? 1 : 0);
4792 group
= peer
->group
;
4793 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4795 filter
= &peer
->filter
[afi
][safi
];
4797 if (! peer
->af_group
[afi
][safi
])
4800 if (filter
->dlist
[direct
].name
)
4801 free (filter
->dlist
[direct
].name
);
4802 filter
->dlist
[direct
].name
= NULL
;
4803 filter
->dlist
[direct
].alist
= NULL
;
4804 peer_on_policy_change(peer
, afi
, safi
,
4805 (direct
== FILTER_OUT
) ? 1 : 0);
4811 /* Update distribute list. */
4813 peer_distribute_update (struct access_list
*access
)
4818 struct listnode
*mnode
, *mnnode
;
4819 struct listnode
*node
, *nnode
;
4822 struct peer_group
*group
;
4823 struct bgp_filter
*filter
;
4825 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4828 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, access
->name
,
4830 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4832 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4833 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4835 filter
= &peer
->filter
[afi
][safi
];
4837 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4839 if (filter
->dlist
[direct
].name
)
4840 filter
->dlist
[direct
].alist
=
4841 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4843 filter
->dlist
[direct
].alist
= NULL
;
4847 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4849 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4850 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4852 filter
= &group
->conf
->filter
[afi
][safi
];
4854 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4856 if (filter
->dlist
[direct
].name
)
4857 filter
->dlist
[direct
].alist
=
4858 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4860 filter
->dlist
[direct
].alist
= NULL
;
4867 /* Set prefix list to the peer. */
4869 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4872 struct bgp_filter
*filter
;
4873 struct peer_group
*group
;
4874 struct listnode
*node
, *nnode
;
4876 if (! peer
->afc
[afi
][safi
])
4877 return BGP_ERR_PEER_INACTIVE
;
4879 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4880 return BGP_ERR_INVALID_VALUE
;
4882 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4883 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4885 filter
= &peer
->filter
[afi
][safi
];
4887 if (filter
->dlist
[direct
].name
)
4888 return BGP_ERR_PEER_FILTER_CONFLICT
;
4890 if (filter
->plist
[direct
].name
)
4891 free (filter
->plist
[direct
].name
);
4892 filter
->plist
[direct
].name
= strdup (name
);
4893 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4895 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4897 peer_on_policy_change(peer
, afi
, safi
,
4898 (direct
== FILTER_OUT
) ? 1 : 0);
4902 group
= peer
->group
;
4903 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4905 filter
= &peer
->filter
[afi
][safi
];
4907 if (! peer
->af_group
[afi
][safi
])
4910 if (filter
->plist
[direct
].name
)
4911 free (filter
->plist
[direct
].name
);
4912 filter
->plist
[direct
].name
= strdup (name
);
4913 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4914 peer_on_policy_change(peer
, afi
, safi
,
4915 (direct
== FILTER_OUT
) ? 1 : 0);
4921 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4923 struct bgp_filter
*filter
;
4924 struct bgp_filter
*gfilter
;
4925 struct peer_group
*group
;
4926 struct listnode
*node
, *nnode
;
4928 if (! peer
->afc
[afi
][safi
])
4929 return BGP_ERR_PEER_INACTIVE
;
4931 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4932 return BGP_ERR_INVALID_VALUE
;
4934 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4935 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4937 filter
= &peer
->filter
[afi
][safi
];
4939 /* apply peer-group filter */
4940 if (peer
->af_group
[afi
][safi
])
4942 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4944 if (gfilter
->plist
[direct
].name
)
4946 if (filter
->plist
[direct
].name
)
4947 free (filter
->plist
[direct
].name
);
4948 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
4949 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
4950 peer_on_policy_change(peer
, afi
, safi
,
4951 (direct
== FILTER_OUT
) ? 1 : 0);
4956 if (filter
->plist
[direct
].name
)
4957 free (filter
->plist
[direct
].name
);
4958 filter
->plist
[direct
].name
= NULL
;
4959 filter
->plist
[direct
].plist
= NULL
;
4961 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4963 peer_on_policy_change(peer
, afi
, safi
,
4964 (direct
== FILTER_OUT
) ? 1 : 0);
4968 group
= peer
->group
;
4969 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4971 filter
= &peer
->filter
[afi
][safi
];
4973 if (! peer
->af_group
[afi
][safi
])
4976 if (filter
->plist
[direct
].name
)
4977 free (filter
->plist
[direct
].name
);
4978 filter
->plist
[direct
].name
= NULL
;
4979 filter
->plist
[direct
].plist
= NULL
;
4980 peer_on_policy_change(peer
, afi
, safi
,
4981 (direct
== FILTER_OUT
) ? 1 : 0);
4987 /* Update prefix-list list. */
4989 peer_prefix_list_update (struct prefix_list
*plist
)
4991 struct listnode
*mnode
, *mnnode
;
4992 struct listnode
*node
, *nnode
;
4995 struct peer_group
*group
;
4996 struct bgp_filter
*filter
;
5001 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5005 * Update the prefix-list on update groups.
5007 update_group_policy_update(bgp
, BGP_POLICY_PREFIX_LIST
,
5008 plist
? plist
->name
: NULL
, 0, 0);
5010 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5012 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5013 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5015 filter
= &peer
->filter
[afi
][safi
];
5017 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5019 if (filter
->plist
[direct
].name
)
5020 filter
->plist
[direct
].plist
=
5021 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5023 filter
->plist
[direct
].plist
= NULL
;
5027 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5029 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5030 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5032 filter
= &group
->conf
->filter
[afi
][safi
];
5034 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5036 if (filter
->plist
[direct
].name
)
5037 filter
->plist
[direct
].plist
=
5038 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5040 filter
->plist
[direct
].plist
= NULL
;
5048 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5051 struct bgp_filter
*filter
;
5052 struct peer_group
*group
;
5053 struct listnode
*node
, *nnode
;
5055 if (! peer
->afc
[afi
][safi
])
5056 return BGP_ERR_PEER_INACTIVE
;
5058 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5059 return BGP_ERR_INVALID_VALUE
;
5061 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5062 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5064 filter
= &peer
->filter
[afi
][safi
];
5066 if (filter
->aslist
[direct
].name
)
5067 free (filter
->aslist
[direct
].name
);
5068 filter
->aslist
[direct
].name
= strdup (name
);
5069 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5071 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5073 peer_on_policy_change(peer
, afi
, safi
,
5074 (direct
== FILTER_OUT
) ? 1 : 0);
5078 group
= peer
->group
;
5079 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5081 filter
= &peer
->filter
[afi
][safi
];
5083 if (! peer
->af_group
[afi
][safi
])
5086 if (filter
->aslist
[direct
].name
)
5087 free (filter
->aslist
[direct
].name
);
5088 filter
->aslist
[direct
].name
= strdup (name
);
5089 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5090 peer_on_policy_change(peer
, afi
, safi
,
5091 (direct
== FILTER_OUT
) ? 1 : 0);
5097 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
5099 struct bgp_filter
*filter
;
5100 struct bgp_filter
*gfilter
;
5101 struct peer_group
*group
;
5102 struct listnode
*node
, *nnode
;
5104 if (! peer
->afc
[afi
][safi
])
5105 return BGP_ERR_PEER_INACTIVE
;
5107 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5108 return BGP_ERR_INVALID_VALUE
;
5110 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5111 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5113 filter
= &peer
->filter
[afi
][safi
];
5115 /* apply peer-group filter */
5116 if (peer
->af_group
[afi
][safi
])
5118 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5120 if (gfilter
->aslist
[direct
].name
)
5122 if (filter
->aslist
[direct
].name
)
5123 free (filter
->aslist
[direct
].name
);
5124 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
5125 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
5126 peer_on_policy_change(peer
, afi
, safi
,
5127 (direct
== FILTER_OUT
) ? 1 : 0);
5132 if (filter
->aslist
[direct
].name
)
5133 free (filter
->aslist
[direct
].name
);
5134 filter
->aslist
[direct
].name
= NULL
;
5135 filter
->aslist
[direct
].aslist
= NULL
;
5137 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5139 peer_on_policy_change(peer
, afi
, safi
,
5140 (direct
== FILTER_OUT
) ? 1 : 0);
5144 group
= peer
->group
;
5145 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5147 filter
= &peer
->filter
[afi
][safi
];
5149 if (! peer
->af_group
[afi
][safi
])
5152 if (filter
->aslist
[direct
].name
)
5153 free (filter
->aslist
[direct
].name
);
5154 filter
->aslist
[direct
].name
= NULL
;
5155 filter
->aslist
[direct
].aslist
= NULL
;
5156 peer_on_policy_change(peer
, afi
, safi
,
5157 (direct
== FILTER_OUT
) ? 1 : 0);
5164 peer_aslist_update (const char *aslist_name
)
5169 struct listnode
*mnode
, *mnnode
;
5170 struct listnode
*node
, *nnode
;
5173 struct peer_group
*group
;
5174 struct bgp_filter
*filter
;
5176 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5178 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, aslist_name
,
5181 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5183 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5184 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5186 filter
= &peer
->filter
[afi
][safi
];
5188 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5190 if (filter
->aslist
[direct
].name
)
5191 filter
->aslist
[direct
].aslist
=
5192 as_list_lookup (filter
->aslist
[direct
].name
);
5194 filter
->aslist
[direct
].aslist
= NULL
;
5198 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5200 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5201 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5203 filter
= &group
->conf
->filter
[afi
][safi
];
5205 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5207 if (filter
->aslist
[direct
].name
)
5208 filter
->aslist
[direct
].aslist
=
5209 as_list_lookup (filter
->aslist
[direct
].name
);
5211 filter
->aslist
[direct
].aslist
= NULL
;
5219 peer_aslist_add (char *aslist_name
)
5221 peer_aslist_update (aslist_name
);
5222 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
5226 peer_aslist_del (const char *aslist_name
)
5228 peer_aslist_update (aslist_name
);
5229 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
5234 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5237 struct bgp_filter
*filter
;
5238 struct peer_group
*group
;
5239 struct listnode
*node
, *nnode
;
5241 if (! peer
->afc
[afi
][safi
])
5242 return BGP_ERR_PEER_INACTIVE
;
5244 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5245 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5246 return BGP_ERR_INVALID_VALUE
;
5248 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5249 && peer_is_group_member (peer
, afi
, safi
))
5250 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5252 filter
= &peer
->filter
[afi
][safi
];
5254 if (filter
->map
[direct
].name
)
5255 free (filter
->map
[direct
].name
);
5257 filter
->map
[direct
].name
= strdup (name
);
5258 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5260 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5262 peer_on_policy_change(peer
, afi
, safi
,
5263 (direct
== RMAP_OUT
) ? 1 : 0);
5267 group
= peer
->group
;
5268 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5270 filter
= &peer
->filter
[afi
][safi
];
5272 if (! peer
->af_group
[afi
][safi
])
5275 if (filter
->map
[direct
].name
)
5276 free (filter
->map
[direct
].name
);
5277 filter
->map
[direct
].name
= strdup (name
);
5278 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5279 peer_on_policy_change(peer
, afi
, safi
,
5280 (direct
== RMAP_OUT
) ? 1 : 0);
5285 /* Unset route-map from the peer. */
5287 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5289 struct bgp_filter
*filter
;
5290 struct bgp_filter
*gfilter
;
5291 struct peer_group
*group
;
5292 struct listnode
*node
, *nnode
;
5294 if (! peer
->afc
[afi
][safi
])
5295 return BGP_ERR_PEER_INACTIVE
;
5297 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5298 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5299 return BGP_ERR_INVALID_VALUE
;
5301 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5302 && peer_is_group_member (peer
, afi
, safi
))
5303 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5305 filter
= &peer
->filter
[afi
][safi
];
5307 /* apply peer-group filter */
5308 if (peer
->af_group
[afi
][safi
])
5310 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5312 if (gfilter
->map
[direct
].name
)
5314 if (filter
->map
[direct
].name
)
5315 free (filter
->map
[direct
].name
);
5316 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
5317 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
5318 peer_on_policy_change(peer
, afi
, safi
,
5319 (direct
== RMAP_OUT
) ? 1 : 0);
5324 if (filter
->map
[direct
].name
)
5325 free (filter
->map
[direct
].name
);
5326 filter
->map
[direct
].name
= NULL
;
5327 filter
->map
[direct
].map
= NULL
;
5329 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5331 peer_on_policy_change(peer
, afi
, safi
,
5332 (direct
== RMAP_OUT
) ? 1 : 0);
5336 group
= peer
->group
;
5337 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5339 filter
= &peer
->filter
[afi
][safi
];
5341 if (! peer
->af_group
[afi
][safi
])
5344 if (filter
->map
[direct
].name
)
5345 free (filter
->map
[direct
].name
);
5346 filter
->map
[direct
].name
= NULL
;
5347 filter
->map
[direct
].map
= NULL
;
5348 peer_on_policy_change(peer
, afi
, safi
,
5349 (direct
== RMAP_OUT
) ? 1 : 0);
5354 /* Set unsuppress-map to the peer. */
5356 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5359 struct bgp_filter
*filter
;
5360 struct peer_group
*group
;
5361 struct listnode
*node
, *nnode
;
5363 if (! peer
->afc
[afi
][safi
])
5364 return BGP_ERR_PEER_INACTIVE
;
5366 if (peer_is_group_member (peer
, afi
, safi
))
5367 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5369 filter
= &peer
->filter
[afi
][safi
];
5371 if (filter
->usmap
.name
)
5372 free (filter
->usmap
.name
);
5374 filter
->usmap
.name
= strdup (name
);
5375 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5377 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5379 peer_on_policy_change(peer
, afi
, safi
, 1);
5383 group
= peer
->group
;
5384 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5386 filter
= &peer
->filter
[afi
][safi
];
5388 if (! peer
->af_group
[afi
][safi
])
5391 if (filter
->usmap
.name
)
5392 free (filter
->usmap
.name
);
5393 filter
->usmap
.name
= strdup (name
);
5394 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5395 peer_on_policy_change(peer
, afi
, safi
, 1);
5400 /* Unset route-map from the peer. */
5402 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5404 struct bgp_filter
*filter
;
5405 struct peer_group
*group
;
5406 struct listnode
*node
, *nnode
;
5408 if (! peer
->afc
[afi
][safi
])
5409 return BGP_ERR_PEER_INACTIVE
;
5411 if (peer_is_group_member (peer
, afi
, safi
))
5412 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5414 filter
= &peer
->filter
[afi
][safi
];
5416 if (filter
->usmap
.name
)
5417 free (filter
->usmap
.name
);
5418 filter
->usmap
.name
= NULL
;
5419 filter
->usmap
.map
= NULL
;
5421 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5423 peer_on_policy_change(peer
, afi
, safi
, 1);
5427 group
= peer
->group
;
5428 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5430 filter
= &peer
->filter
[afi
][safi
];
5432 if (! peer
->af_group
[afi
][safi
])
5435 if (filter
->usmap
.name
)
5436 free (filter
->usmap
.name
);
5437 filter
->usmap
.name
= NULL
;
5438 filter
->usmap
.map
= NULL
;
5439 peer_on_policy_change(peer
, afi
, safi
, 1);
5445 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5446 u_int32_t max
, u_char threshold
,
5447 int warning
, u_int16_t restart
)
5449 struct peer_group
*group
;
5450 struct listnode
*node
, *nnode
;
5452 if (! peer
->afc
[afi
][safi
])
5453 return BGP_ERR_PEER_INACTIVE
;
5455 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5456 peer
->pmax
[afi
][safi
] = max
;
5457 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5458 peer
->pmax_restart
[afi
][safi
] = restart
;
5460 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5462 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5464 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5466 group
= peer
->group
;
5467 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5469 if (! peer
->af_group
[afi
][safi
])
5472 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5473 peer
->pmax
[afi
][safi
] = max
;
5474 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5475 peer
->pmax_restart
[afi
][safi
] = restart
;
5477 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5479 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5481 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5482 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5487 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5488 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5495 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5497 struct peer_group
*group
;
5498 struct listnode
*node
, *nnode
;
5500 if (! peer
->afc
[afi
][safi
])
5501 return BGP_ERR_PEER_INACTIVE
;
5503 /* apply peer-group config */
5504 if (peer
->af_group
[afi
][safi
])
5506 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5507 PEER_FLAG_MAX_PREFIX
))
5508 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5510 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5512 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5513 PEER_FLAG_MAX_PREFIX_WARNING
))
5514 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5516 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5518 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
5519 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
5520 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
5524 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5525 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5526 peer
->pmax
[afi
][safi
] = 0;
5527 peer
->pmax_threshold
[afi
][safi
] = 0;
5528 peer
->pmax_restart
[afi
][safi
] = 0;
5530 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5533 group
= peer
->group
;
5534 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5536 if (! peer
->af_group
[afi
][safi
])
5539 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5540 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5541 peer
->pmax
[afi
][safi
] = 0;
5542 peer
->pmax_threshold
[afi
][safi
] = 0;
5543 peer
->pmax_restart
[afi
][safi
] = 0;
5548 int is_ebgp_multihop_configured (struct peer
*peer
)
5550 struct peer_group
*group
;
5551 struct listnode
*node
, *nnode
;
5554 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5556 group
= peer
->group
;
5557 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5558 (group
->conf
->ttl
!= 1))
5561 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
5563 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
5570 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5577 /* Set # of hops between us and BGP peer. */
5579 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
5581 struct peer_group
*group
;
5582 struct listnode
*node
, *nnode
;
5585 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
5587 /* We cannot configure ttl-security hops when ebgp-multihop is already
5588 set. For non peer-groups, the check is simple. For peer-groups, it's
5589 slightly messy, because we need to check both the peer-group structure
5590 and all peer-group members for any trace of ebgp-multihop configuration
5591 before actually applying the ttl-security rules. Cisco really made a
5592 mess of this configuration parameter, and OpenBGPD got it right.
5595 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
))
5597 if (is_ebgp_multihop_configured (peer
))
5598 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
5600 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5602 peer
->gtsm_hops
= gtsm_hops
;
5604 /* Calling ebgp multihop also resets the session.
5605 * On restart, NHT will get setup correctly as will the
5606 * min & max ttls on the socket. The return value is
5609 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5616 group
= peer
->group
;
5617 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5619 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5621 /* Calling ebgp multihop also resets the session.
5622 * On restart, NHT will get setup correctly as will the
5623 * min & max ttls on the socket. The return value is
5626 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5632 /* Post the first gtsm setup or if its ibgp, maxttl setting isn't
5633 * necessary, just set the minttl.
5635 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5637 peer
->gtsm_hops
= gtsm_hops
;
5640 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5641 MAXTTL
+ 1 - gtsm_hops
);
5642 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5643 (peer
->doppelganger
->fd
>= 0))
5644 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5645 MAXTTL
+ 1 - gtsm_hops
);
5649 group
= peer
->group
;
5650 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5652 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5654 /* Change setting of existing peer
5655 * established then change value (may break connectivity)
5656 * not established yet (teardown session and restart)
5657 * no session then do nothing (will get handled by next connection)
5659 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
5660 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5661 MAXTTL
+ 1 - peer
->gtsm_hops
);
5662 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5663 (peer
->doppelganger
->fd
>= 0))
5664 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5665 MAXTTL
+ 1 - gtsm_hops
);
5675 peer_ttl_security_hops_unset (struct peer
*peer
)
5677 struct peer_group
*group
;
5678 struct listnode
*node
, *nnode
;
5681 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
5683 /* if a peer-group member, then reset to peer-group default rather than 0 */
5684 if (peer_group_active (peer
))
5685 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
5687 peer
->gtsm_hops
= 0;
5689 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5691 /* Invoking ebgp_multihop_set will set the TTL back to the original
5692 * value as well as restting the NHT and such. The session is reset.
5694 if (peer
->sort
== BGP_PEER_EBGP
)
5695 ret
= peer_ebgp_multihop_unset (peer
);
5699 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5701 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5702 (peer
->doppelganger
->fd
>= 0))
5703 sockopt_minttl (peer
->su
.sa
.sa_family
,
5704 peer
->doppelganger
->fd
, 0);
5709 group
= peer
->group
;
5710 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5712 peer
->gtsm_hops
= 0;
5713 if (peer
->sort
== BGP_PEER_EBGP
)
5714 ret
= peer_ebgp_multihop_unset (peer
);
5718 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5720 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5721 (peer
->doppelganger
->fd
>= 0))
5722 sockopt_minttl (peer
->su
.sa
.sa_family
,
5723 peer
->doppelganger
->fd
, 0);
5732 * If peer clear is invoked in a loop for all peers on the BGP instance,
5733 * it may end up freeing the doppelganger, and if this was the next node
5734 * to the current node, we would end up accessing the freed next node.
5735 * Pass along additional parameter which can be updated if next node
5736 * is freed; only required when walking the peer list on BGP instance.
5739 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
5741 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5743 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
5745 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
5746 if (peer
->t_pmax_restart
)
5748 BGP_TIMER_OFF (peer
->t_pmax_restart
);
5749 if (bgp_debug_neighbor_events(peer
))
5750 zlog_debug ("%s Maximum-prefix restart timer canceled",
5753 BGP_EVENT_ADD (peer
, BGP_Start
);
5757 peer
->v_start
= BGP_INIT_START_TIMER
;
5758 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5759 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5760 BGP_NOTIFY_CEASE_ADMIN_RESET
);
5762 bgp_session_reset_safe(peer
, nnode
);
5768 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
5769 enum bgp_clear_type stype
)
5771 struct peer_af
*paf
;
5773 if (peer
->status
!= Established
)
5776 if (! peer
->afc
[afi
][safi
])
5777 return BGP_ERR_AF_UNCONFIGURED
;
5779 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
5781 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
5783 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
5784 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
5787 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
5789 /* Clear the "neighbor x.x.x.x default-originate" flag */
5790 paf
= peer_af_find (peer
, afi
, safi
);
5791 if (paf
&& paf
->subgroup
&&
5792 CHECK_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
5793 UNSET_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5795 bgp_announce_route (peer
, afi
, safi
);
5798 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5800 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
5801 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
5802 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5804 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
5807 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
5808 prefix_type
= ORF_TYPE_PREFIX
;
5810 prefix_type
= ORF_TYPE_PREFIX_OLD
;
5812 if (filter
->plist
[FILTER_IN
].plist
)
5814 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5815 bgp_route_refresh_send (peer
, afi
, safi
,
5816 prefix_type
, REFRESH_DEFER
, 1);
5817 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
5818 REFRESH_IMMEDIATE
, 0);
5822 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5823 bgp_route_refresh_send (peer
, afi
, safi
,
5824 prefix_type
, REFRESH_IMMEDIATE
, 1);
5826 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5832 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
5833 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5835 /* If neighbor has soft reconfiguration inbound flag.
5836 Use Adj-RIB-In database. */
5837 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5838 bgp_soft_reconfig_in (peer
, afi
, safi
);
5841 /* If neighbor has route refresh capability, send route refresh
5842 message to the peer. */
5843 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5844 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5845 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5847 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5853 /* Display peer uptime.*/
5854 /* XXX: why does this function return char * when it takes buffer? */
5856 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
5861 /* Check buffer length. */
5862 if (len
< BGP_UPTIME_LEN
)
5864 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5865 /* XXX: should return status instead of buf... */
5866 snprintf (buf
, len
, "<error> ");
5870 /* If there is no connection has been done before print `never'. */
5873 snprintf (buf
, len
, "never");
5877 /* Get current time. */
5878 uptime1
= bgp_clock ();
5880 tm
= gmtime (&uptime1
);
5882 /* Making formatted timer strings. */
5883 #define ONE_DAY_SECOND 60*60*24
5884 #define ONE_WEEK_SECOND 60*60*24*7
5886 if (uptime1
< ONE_DAY_SECOND
)
5887 snprintf (buf
, len
, "%02d:%02d:%02d",
5888 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5889 else if (uptime1
< ONE_WEEK_SECOND
)
5890 snprintf (buf
, len
, "%dd%02dh%02dm",
5891 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5893 snprintf (buf
, len
, "%02dw%dd%02dh",
5894 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5899 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
5900 afi_t afi
, safi_t safi
)
5902 struct bgp_filter
*filter
;
5903 struct bgp_filter
*gfilter
= NULL
;
5906 int out
= FILTER_OUT
;
5909 filter
= &peer
->filter
[afi
][safi
];
5910 if (peer
->af_group
[afi
][safi
])
5911 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5913 /* distribute-list. */
5914 if (filter
->dlist
[in
].name
)
5915 if (! gfilter
|| ! gfilter
->dlist
[in
].name
5916 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
5917 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
5918 filter
->dlist
[in
].name
, VTY_NEWLINE
);
5919 if (filter
->dlist
[out
].name
&& ! gfilter
)
5920 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
5921 filter
->dlist
[out
].name
, VTY_NEWLINE
);
5924 if (filter
->plist
[in
].name
)
5925 if (! gfilter
|| ! gfilter
->plist
[in
].name
5926 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
5927 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
5928 filter
->plist
[in
].name
, VTY_NEWLINE
);
5929 if (filter
->plist
[out
].name
&& ! gfilter
)
5930 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
5931 filter
->plist
[out
].name
, VTY_NEWLINE
);
5934 if (filter
->map
[RMAP_IN
].name
)
5935 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
5936 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
5937 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
5938 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
5939 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
5940 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
5941 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
5942 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
5943 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
5944 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
5945 if (filter
->map
[RMAP_EXPORT
].name
)
5946 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
5947 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
5948 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
5949 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
5950 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
5952 /* unsuppress-map */
5953 if (filter
->usmap
.name
&& ! gfilter
)
5954 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
5955 filter
->usmap
.name
, VTY_NEWLINE
);
5958 if (filter
->aslist
[in
].name
)
5959 if (! gfilter
|| ! gfilter
->aslist
[in
].name
5960 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
5961 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
5962 filter
->aslist
[in
].name
, VTY_NEWLINE
);
5963 if (filter
->aslist
[out
].name
&& ! gfilter
)
5964 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
5965 filter
->aslist
[out
].name
, VTY_NEWLINE
);
5968 /* BGP peer configuration display function. */
5970 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
5971 struct peer
*peer
, afi_t afi
, safi_t safi
)
5973 struct peer
*g_peer
= NULL
;
5974 char buf
[SU_ADDRSTRLEN
];
5977 /* Skip dynamic neighbors. */
5978 if (peer_dynamic_neighbor (peer
))
5982 addr
= peer
->conf_if
;
5986 if (peer_group_active (peer
))
5987 g_peer
= peer
->group
->conf
;
5989 /************************************
5990 ****** Global to the neighbor ******
5991 ************************************/
5992 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5996 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
5997 vty_out (vty
, " neighbor %s interface v6only %s", addr
, VTY_NEWLINE
);
5999 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
6003 if (! peer_group_active (peer
))
6005 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
6006 vty_out (vty
, " neighbor %s peer-group%s", addr
,
6008 if (peer
->as_type
== AS_SPECIFIED
)
6010 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6013 else if (peer
->as_type
== AS_INTERNAL
)
6015 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6017 else if (peer
->as_type
== AS_EXTERNAL
)
6019 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6026 if (peer
->as_type
== AS_SPECIFIED
)
6028 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
6031 else if (peer
->as_type
== AS_INTERNAL
)
6033 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
6035 else if (peer
->as_type
== AS_EXTERNAL
)
6037 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
6040 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6041 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6042 peer
->group
->name
, VTY_NEWLINE
);
6046 if (peer
->change_local_as
)
6047 if (! peer_group_active (peer
))
6048 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
6049 peer
->change_local_as
,
6050 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
6052 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
6053 " replace-as" : "", VTY_NEWLINE
);
6057 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
6061 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6062 if (! peer_group_active (peer
) ||
6063 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
6064 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
6068 if (! peer_group_active (peer
) || ! g_peer
->bfd_info
)
6070 bgp_bfd_peer_config_write(vty
, peer
, addr
);
6075 if (!peer_group_active (peer
)
6076 || ! g_peer
->password
6077 || strcmp (peer
->password
, g_peer
->password
) != 0)
6078 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
6082 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
))
6083 if (!peer_group_active (peer
))
6084 vty_out (vty
, " neighbor %s solo%s", addr
, VTY_NEWLINE
);
6087 if (peer
->port
!= BGP_PORT_DEFAULT
)
6088 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
6091 /* Local interface name. */
6093 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
6097 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
6098 if (! peer_group_active (peer
) ||
6099 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
6100 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
6102 /* EBGP multihop. */
6103 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
6104 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
6105 if (! peer_group_active (peer
) ||
6106 g_peer
->ttl
!= peer
->ttl
)
6107 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
6110 /* ttl-security hops */
6111 if (peer
->gtsm_hops
!= 0)
6112 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
6113 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
6114 peer
->gtsm_hops
, VTY_NEWLINE
);
6116 /* disable-connected-check. */
6117 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6118 if (! peer_group_active (peer
) ||
6119 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6120 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
6122 /* Update-source. */
6123 if (peer
->update_if
)
6124 if (! peer_group_active (peer
) || ! g_peer
->update_if
6125 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
6126 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6127 peer
->update_if
, VTY_NEWLINE
);
6128 if (peer
->update_source
)
6129 if (! peer_group_active (peer
) || ! g_peer
->update_source
6130 || sockunion_cmp (g_peer
->update_source
,
6131 peer
->update_source
) != 0)
6132 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6133 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
6136 /* advertisement-interval */
6137 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
6138 ! peer_group_active (peer
))
6139 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
6140 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
6143 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
6144 && ! peer_group_active (peer
))
6145 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
6146 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
6148 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
6149 ! peer_group_active (peer
))
6150 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
6151 peer
->connect
, VTY_NEWLINE
);
6153 /* Default weight. */
6154 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
6155 if (! peer_group_active (peer
) ||
6156 g_peer
->weight
!= peer
->weight
)
6157 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
6160 /* Dynamic capability. */
6161 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6162 if (! peer_group_active (peer
) ||
6163 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6164 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
6167 /* Extended next-hop capability. */
6168 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6169 if (! peer_group_active (peer
) ||
6170 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6171 vty_out (vty
, " neighbor %s capability extended-nexthop%s", addr
,
6174 /* dont capability negotiation. */
6175 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6176 if (! peer_group_active (peer
) ||
6177 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6178 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
6181 /* override capability negotiation. */
6182 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6183 if (! peer_group_active (peer
) ||
6184 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6185 vty_out (vty
, " neighbor %s override-capability%s", addr
,
6188 /* strict capability negotiation. */
6189 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6190 if (! peer_group_active (peer
) ||
6191 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6192 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
6195 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6197 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6199 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6200 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6204 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6205 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
6211 /************************************
6212 ****** Per AF to the neighbor ******
6213 ************************************/
6215 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
6217 if (peer
->af_group
[afi
][safi
])
6218 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6219 peer
->group
->name
, VTY_NEWLINE
);
6221 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6224 /* ORF capability. */
6225 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6226 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6227 if (! peer
->af_group
[afi
][safi
])
6229 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
6231 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6232 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6233 vty_out (vty
, " both");
6234 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
6235 vty_out (vty
, " send");
6237 vty_out (vty
, " receive");
6238 vty_out (vty
, "%s", VTY_NEWLINE
);
6241 /* Route reflector client. */
6242 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
6243 && ! peer
->af_group
[afi
][safi
])
6244 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
6248 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_FORCE_NEXTHOP_SELF
)
6249 && ! peer
->af_group
[afi
][safi
])
6250 vty_out (vty
, " neighbor %s next-hop-self force%s",
6252 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
6253 && ! peer
->af_group
[afi
][safi
])
6254 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
6256 /* remove-private-AS */
6257 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
) && !peer
->af_group
[afi
][safi
])
6259 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
) &&
6260 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6261 vty_out (vty
, " neighbor %s remove-private-AS all replace-AS%s", addr
, VTY_NEWLINE
);
6263 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6264 vty_out (vty
, " neighbor %s remove-private-AS replace-AS%s", addr
, VTY_NEWLINE
);
6266 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
6267 vty_out (vty
, " neighbor %s remove-private-AS all%s", addr
, VTY_NEWLINE
);
6270 vty_out (vty
, " neighbor %s remove-private-AS%s", addr
, VTY_NEWLINE
);
6274 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
) &&
6275 !peer
->af_group
[afi
][safi
])
6276 vty_out (vty
, " neighbor %s as-override%s", addr
, VTY_NEWLINE
);
6278 /* send-community print. */
6279 if (! peer
->af_group
[afi
][safi
])
6281 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6283 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6284 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6285 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
6286 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6287 vty_out (vty
, " neighbor %s send-community extended%s",
6289 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6290 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
6294 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6295 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6296 vty_out (vty
, " no neighbor %s send-community both%s",
6298 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6299 vty_out (vty
, " no neighbor %s send-community extended%s",
6301 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6302 vty_out (vty
, " no neighbor %s send-community%s",
6307 /* Default information */
6308 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
6309 && ! peer
->af_group
[afi
][safi
])
6311 vty_out (vty
, " neighbor %s default-originate", addr
);
6312 if (peer
->default_rmap
[afi
][safi
].name
)
6313 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
6314 vty_out (vty
, "%s", VTY_NEWLINE
);
6317 /* Soft reconfiguration inbound. */
6318 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6319 if (! peer
->af_group
[afi
][safi
] ||
6320 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6321 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
6324 /* maximum-prefix. */
6325 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
6326 if (! peer
->af_group
[afi
][safi
]
6327 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
6328 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
6329 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
6330 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6332 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
6333 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
6334 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
6335 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6336 vty_out (vty
, " warning-only");
6337 if (peer
->pmax_restart
[afi
][safi
])
6338 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
6339 vty_out (vty
, "%s", VTY_NEWLINE
);
6342 /* Route server client. */
6343 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
6344 && ! peer
->af_group
[afi
][safi
])
6345 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
6347 /* Nexthop-local unchanged. */
6348 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
6349 && ! peer
->af_group
[afi
][safi
])
6350 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
6353 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
6354 if (! peer_group_active (peer
)
6355 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
6356 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
6358 if (peer
->allowas_in
[afi
][safi
] == 3)
6359 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
6361 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
6362 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
6366 bgp_config_write_filter (vty
, peer
, afi
, safi
);
6368 /* atribute-unchanged. */
6369 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6370 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6371 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6372 && ! peer
->af_group
[afi
][safi
])
6374 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6375 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6376 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6377 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
6379 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
6380 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
6382 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
6384 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
6385 " med" : "", VTY_NEWLINE
);
6389 /* Display "address-family" configuration header. */
6391 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
6397 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6400 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
6404 if (safi
== SAFI_MULTICAST
)
6405 vty_out (vty
, "ipv4 multicast");
6406 else if (safi
== SAFI_MPLS_VPN
)
6407 vty_out (vty
, "vpnv4 unicast");
6409 else if (afi
== AFI_IP6
)
6411 vty_out (vty
, "ipv6");
6413 if (safi
== SAFI_MULTICAST
)
6414 vty_out (vty
, " multicast");
6417 vty_out (vty
, "%s", VTY_NEWLINE
);
6422 /* Address family based peer configuration display. */
6424 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
6429 struct peer_group
*group
;
6430 struct listnode
*node
, *nnode
;
6432 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
6434 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
6436 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6438 if (group
->conf
->afc
[afi
][safi
])
6440 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6441 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
6444 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6446 /* Skip dynamic neighbors. */
6447 if (peer_dynamic_neighbor (peer
))
6450 if (peer
->afc
[afi
][safi
])
6452 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6454 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6455 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
6460 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
6461 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
6464 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
6470 bgp_config_write (struct vty
*vty
)
6474 struct peer_group
*group
;
6476 struct listnode
*node
, *nnode
;
6477 struct listnode
*mnode
, *mnnode
;
6479 /* BGP Multiple instance. */
6480 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6482 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
6486 /* BGP Config type. */
6487 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6489 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
6493 /* BGP configuration. */
6494 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6497 vty_out (vty
, "!%s", VTY_NEWLINE
);
6499 /* Router bgp ASN */
6500 vty_out (vty
, "router bgp %u", bgp
->as
);
6502 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6505 vty_out (vty
, " view %s", bgp
->name
);
6507 vty_out (vty
, "%s", VTY_NEWLINE
);
6509 /* No Synchronization */
6510 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6511 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
6513 /* BGP fast-external-failover. */
6514 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
6515 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
6517 /* BGP router ID. */
6518 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
6519 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
6522 /* BGP log-neighbor-changes. */
6523 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
6524 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
6526 /* BGP configuration. */
6527 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
6528 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
6530 /* BGP default ipv4-unicast. */
6531 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6532 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
6534 /* BGP default local-preference. */
6535 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
6536 vty_out (vty
, " bgp default local-preference %d%s",
6537 bgp
->default_local_pref
, VTY_NEWLINE
);
6539 /* BGP default subgroup-pkt-queue-max. */
6540 if (bgp
->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
6541 vty_out (vty
, " bgp default subgroup-pkt-queue-max %d%s",
6542 bgp
->default_subgroup_pkt_queue_max
, VTY_NEWLINE
);
6544 /* BGP client-to-client reflection. */
6545 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
6546 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
6548 /* BGP cluster ID. */
6549 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
6550 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
6553 /* Disable ebgp connected nexthop check */
6554 if (bgp_flag_check (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
6555 vty_out (vty
, " bgp disable-ebgp-connected-route-check%s", VTY_NEWLINE
);
6557 /* Confederation identifier*/
6558 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
6559 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
6562 /* Confederation peer */
6563 if (bgp
->confed_peers_cnt
> 0)
6567 vty_out (vty
, " bgp confederation peers");
6569 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
6570 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
6572 vty_out (vty
, "%s", VTY_NEWLINE
);
6575 /* BGP enforce-first-as. */
6576 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
6577 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
6579 /* BGP deterministic-med. */
6580 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
6581 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
6583 /* BGP update-delay. */
6584 bgp_config_write_update_delay (vty
, bgp
);
6586 if (bgp
->v_maxmed_onstartup
!= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
)
6588 vty_out (vty
, " bgp max-med on-startup %d", bgp
->v_maxmed_onstartup
);
6589 if (bgp
->maxmed_onstartup_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6590 vty_out (vty
, " %d", bgp
->maxmed_onstartup_value
);
6591 vty_out (vty
, "%s", VTY_NEWLINE
);
6593 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
)
6595 vty_out (vty
, " bgp max-med administrative");
6596 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6597 vty_out (vty
, " %d", bgp
->maxmed_admin_value
);
6598 vty_out (vty
, "%s", VTY_NEWLINE
);
6602 bgp_config_write_wpkt_quanta (vty
, bgp
);
6605 bgp_config_write_coalesce_time(vty
, bgp
);
6607 /* BGP graceful-restart. */
6608 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
6609 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
6610 bgp
->stalepath_time
, VTY_NEWLINE
);
6611 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
6612 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
6614 /* BGP bestpath method. */
6615 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
6616 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
6617 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
6618 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
6620 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
6621 if (bgp_flag_check (bgp
, BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET
)) {
6622 vty_out (vty
, " bgp bestpath as-path multipath-relax no-as-set%s", VTY_NEWLINE
);
6624 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
6628 if (bgp_flag_check (bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
6629 vty_out (vty
, " bgp route-reflector allow-outbound-policy%s",
6632 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
6633 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
6634 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
6635 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6637 vty_out (vty
, " bgp bestpath med");
6638 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
6639 vty_out (vty
, " confed");
6640 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6641 vty_out (vty
, " missing-as-worst");
6642 vty_out (vty
, "%s", VTY_NEWLINE
);
6645 /* BGP network import check. */
6646 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH
))
6647 vty_out (vty
, " bgp network import-check exact%s", VTY_NEWLINE
);
6648 else if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
6649 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
6651 /* BGP flag dampening. */
6652 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
6653 BGP_CONFIG_DAMPENING
))
6654 bgp_config_write_damp (vty
);
6656 /* BGP static route configuration. */
6657 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6659 /* BGP redistribute configuration. */
6660 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6662 /* BGP timers configuration. */
6663 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
6664 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
6665 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
6666 bgp
->default_holdtime
, VTY_NEWLINE
);
6668 if (bgp
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
6669 vty_out (vty
, " bgp route-map delay-timer %d%s", bgp
->rmap_update_timer
,
6673 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6675 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
6678 /* Normal neighbor configuration. */
6679 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6681 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6682 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
6686 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6687 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6689 /* Distance configuration. */
6690 bgp_config_write_distance (vty
, bgp
);
6692 /* listen range and limit for dynamic BGP neighbors */
6693 bgp_config_write_listen (vty
, bgp
);
6695 /* No auto-summary */
6696 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6697 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
6699 /* IPv4 multicast configuration. */
6700 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
6702 /* IPv4 VPN configuration. */
6703 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
6705 /* IPv6 unicast configuration. */
6706 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
6708 /* IPv6 multicast configuration. */
6709 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
6717 bgp_master_init (void)
6719 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
6722 bm
->bgp
= list_new ();
6723 bm
->listen_sockets
= list_new ();
6724 bm
->port
= BGP_PORT_DEFAULT
;
6725 bm
->master
= thread_master_create ();
6726 bm
->start_time
= bgp_clock ();
6734 /* allocates some vital data structures used by peer commands in vty_init */
6740 /* BGP VTY commands installation. */
6748 bgp_route_map_init ();
6749 bgp_address_init ();
6750 bgp_scan_vty_init();
6751 bgp_mplsvpn_init ();
6753 /* Access list initialize. */
6754 access_list_init ();
6755 access_list_add_hook (peer_distribute_update
);
6756 access_list_delete_hook (peer_distribute_update
);
6758 /* Filter list initialize. */
6760 as_list_add_hook (peer_aslist_add
);
6761 as_list_delete_hook (peer_aslist_del
);
6763 /* Prefix list initialize.*/
6764 prefix_list_init ();
6765 prefix_list_add_hook (peer_prefix_list_update
);
6766 prefix_list_delete_hook (peer_prefix_list_update
);
6768 /* Community list initialize. */
6769 bgp_clist
= community_list_init ();
6773 #endif /* HAVE_SNMP */
6780 bgp_terminate (void)
6784 struct listnode
*node
, *nnode
;
6785 struct listnode
*mnode
, *mnnode
;
6787 /* Close the listener sockets first as this prevents peers from attempting
6788 * to reconnect on receiving the peer unconfig message. In the presence
6789 * of a large number of peers this will ensure that no peer is left with
6790 * a dangling connection
6792 /* reverse bgp_master_init */
6794 if (bm
->listen_sockets
)
6795 list_free(bm
->listen_sockets
);
6796 bm
->listen_sockets
= NULL
;
6798 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6799 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6800 if (peer
->status
== Established
||
6801 peer
->status
== OpenSent
||
6802 peer
->status
== OpenConfirm
)
6803 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
6804 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
6806 bgp_cleanup_routes ();
6808 if (bm
->process_main_queue
)
6810 work_queue_free (bm
->process_main_queue
);
6811 bm
->process_main_queue
= NULL
;
6813 if (bm
->process_rsclient_queue
)
6815 work_queue_free (bm
->process_rsclient_queue
);
6816 bm
->process_rsclient_queue
= NULL
;