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"
40 #include "bgpd/bgpd.h"
41 #include "bgpd/bgp_table.h"
42 #include "bgpd/bgp_aspath.h"
43 #include "bgpd/bgp_route.h"
44 #include "bgpd/bgp_dump.h"
45 #include "bgpd/bgp_debug.h"
46 #include "bgpd/bgp_community.h"
47 #include "bgpd/bgp_attr.h"
48 #include "bgpd/bgp_regex.h"
49 #include "bgpd/bgp_clist.h"
50 #include "bgpd/bgp_fsm.h"
51 #include "bgpd/bgp_packet.h"
52 #include "bgpd/bgp_zebra.h"
53 #include "bgpd/bgp_open.h"
54 #include "bgpd/bgp_filter.h"
55 #include "bgpd/bgp_nexthop.h"
56 #include "bgpd/bgp_damp.h"
57 #include "bgpd/bgp_mplsvpn.h"
58 #include "bgpd/bgp_advertise.h"
59 #include "bgpd/bgp_network.h"
60 #include "bgpd/bgp_vty.h"
61 #include "bgpd/bgp_mpath.h"
62 #include "bgpd/bgp_nht.h"
64 #include "bgpd/bgp_snmp.h"
65 #endif /* HAVE_SNMP */
66 #include "bgpd/bgp_updgrp.h"
67 #include "bgpd/bgp_bfd.h"
70 /* BGP process wide configuration. */
71 static struct bgp_master bgp_master
;
73 extern struct in_addr router_id_zebra
;
75 /* BGP process wide configuration pointer to export. */
76 struct bgp_master
*bm
;
78 /* BGP community-list. */
79 struct community_list_handler
*bgp_clist
;
83 bgp_session_reset(struct peer
*peer
)
85 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
86 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
87 peer_delete(peer
->doppelganger
);
89 BGP_EVENT_ADD (peer
, BGP_Stop
);
93 * During session reset, we may delete the doppelganger peer, which would
94 * be the next node to the current node. If the session reset was invoked
95 * during walk of peer list, we would end up accessing the freed next
96 * node. This function moves the next node along.
99 bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
104 n
= (nnode
) ? *nnode
: NULL
;
105 npeer
= (n
) ? listgetdata(n
) : NULL
;
107 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
108 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
110 if (peer
->doppelganger
== npeer
)
111 /* nnode and *nnode are confirmed to be non-NULL here */
112 *nnode
= (*nnode
)->next
;
113 peer_delete(peer
->doppelganger
);
116 BGP_EVENT_ADD (peer
, BGP_Stop
);
119 /* BGP global flag manipulation. */
121 bgp_option_set (int flag
)
126 case BGP_OPT_MULTIPLE_INSTANCE
:
127 case BGP_OPT_CONFIG_CISCO
:
128 case BGP_OPT_NO_LISTEN
:
129 SET_FLAG (bm
->options
, flag
);
132 return BGP_ERR_INVALID_FLAG
;
138 bgp_option_unset (int flag
)
142 case BGP_OPT_MULTIPLE_INSTANCE
:
143 if (listcount (bm
->bgp
) > 1)
144 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
147 case BGP_OPT_CONFIG_CISCO
:
148 UNSET_FLAG (bm
->options
, flag
);
151 return BGP_ERR_INVALID_FLAG
;
157 bgp_option_check (int flag
)
159 return CHECK_FLAG (bm
->options
, flag
);
162 /* BGP flag manipulation. */
164 bgp_flag_set (struct bgp
*bgp
, int flag
)
166 SET_FLAG (bgp
->flags
, flag
);
171 bgp_flag_unset (struct bgp
*bgp
, int flag
)
173 UNSET_FLAG (bgp
->flags
, flag
);
178 bgp_flag_check (struct bgp
*bgp
, int flag
)
180 return CHECK_FLAG (bgp
->flags
, flag
);
183 /* Internal function to set BGP structure configureation flag. */
185 bgp_config_set (struct bgp
*bgp
, int config
)
187 SET_FLAG (bgp
->config
, config
);
191 bgp_config_unset (struct bgp
*bgp
, int config
)
193 UNSET_FLAG (bgp
->config
, config
);
197 bgp_config_check (struct bgp
*bgp
, int config
)
199 return CHECK_FLAG (bgp
->config
, config
);
202 /* Set BGP router identifier. */
204 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
207 struct listnode
*node
, *nnode
;
209 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
210 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
213 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
214 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
216 /* Set all peer's local identifier with this value. */
217 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
219 IPV4_ADDR_COPY (&peer
->local_id
, id
);
221 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
223 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
224 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
225 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
231 /* BGP's cluster-id control. */
233 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
236 struct listnode
*node
, *nnode
;
238 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
239 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
242 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
243 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
245 /* Clear all IBGP peer. */
246 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
248 if (peer
->sort
!= BGP_PEER_IBGP
)
251 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
253 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
254 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
255 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
262 bgp_cluster_id_unset (struct bgp
*bgp
)
265 struct listnode
*node
, *nnode
;
267 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
270 bgp
->cluster_id
.s_addr
= 0;
271 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
273 /* Clear all IBGP peer. */
274 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
276 if (peer
->sort
!= BGP_PEER_IBGP
)
279 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
281 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
282 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
283 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
289 /* time_t value that is monotonicly increasing
290 * and uneffected by adjustments to system clock
292 time_t bgp_clock (void)
296 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
300 /* BGP timer configuration. */
302 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
304 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
305 ? keepalive
: holdtime
/ 3);
306 bgp
->default_holdtime
= holdtime
;
312 bgp_timers_unset (struct bgp
*bgp
)
314 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
315 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
320 /* BGP confederation configuration. */
322 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
325 struct listnode
*node
, *nnode
;
329 return BGP_ERR_INVALID_AS
;
331 /* Remember - were we doing confederation before? */
332 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
334 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
336 /* If we were doing confederation already, this is just an external
337 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
338 were not doing confederation before, reset all EBGP sessions. */
339 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
341 /* We're looking for peers who's AS is not local or part of our
345 if (peer_sort (peer
) == BGP_PEER_EBGP
)
348 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
350 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
351 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
352 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
355 bgp_session_reset_safe(peer
, &nnode
);
360 /* Not doign confederation before, so reset every non-local
362 if (peer_sort (peer
) != BGP_PEER_IBGP
)
364 /* Reset the local_as to be our EBGP one */
365 if (peer_sort (peer
) == BGP_PEER_EBGP
)
367 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
369 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
370 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
371 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
374 bgp_session_reset_safe(peer
, &nnode
);
382 bgp_confederation_id_unset (struct bgp
*bgp
)
385 struct listnode
*node
, *nnode
;
388 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
390 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
392 /* We're looking for peers who's AS is not local */
393 if (peer_sort (peer
) != BGP_PEER_IBGP
)
395 peer
->local_as
= bgp
->as
;
396 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
398 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
399 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
400 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
404 bgp_session_reset_safe(peer
, &nnode
);
410 /* Is an AS part of the confed or not? */
412 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
419 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
420 if (bgp
->confed_peers
[i
] == as
)
426 /* Add an AS to the confederation set. */
428 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
431 struct listnode
*node
, *nnode
;
434 return BGP_ERR_INVALID_BGP
;
437 return BGP_ERR_INVALID_AS
;
439 if (bgp_confederation_peers_check (bgp
, as
))
442 if (bgp
->confed_peers
)
443 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
445 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
447 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
448 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
450 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
451 bgp
->confed_peers_cnt
++;
453 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
455 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
459 peer
->local_as
= bgp
->as
;
460 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
462 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
463 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
464 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
467 bgp_session_reset_safe(peer
, &nnode
);
474 /* Delete an AS from the confederation set. */
476 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
481 struct listnode
*node
, *nnode
;
486 if (! bgp_confederation_peers_check (bgp
, as
))
489 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
490 if (bgp
->confed_peers
[i
] == as
)
491 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
492 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
494 bgp
->confed_peers_cnt
--;
496 if (bgp
->confed_peers_cnt
== 0)
498 if (bgp
->confed_peers
)
499 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
500 bgp
->confed_peers
= NULL
;
503 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
505 bgp
->confed_peers_cnt
* sizeof (as_t
));
507 /* Now reset any peer who's remote AS has just been removed from the
509 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
511 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
515 peer
->local_as
= bgp
->confed_id
;
516 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
518 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
519 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
520 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
523 bgp_session_reset_safe(peer
, &nnode
);
531 /* Local preference configuration. */
533 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
538 bgp
->default_local_pref
= local_pref
;
544 bgp_default_local_preference_unset (struct bgp
*bgp
)
549 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
554 /* Local preference configuration. */
556 bgp_default_subgroup_pkt_queue_max_set (struct bgp
*bgp
, u_int32_t queue_size
)
561 bgp
->default_subgroup_pkt_queue_max
= queue_size
;
567 bgp_default_subgroup_pkt_queue_max_unset (struct bgp
*bgp
)
571 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
576 /* Listen limit configuration. */
578 bgp_listen_limit_set (struct bgp
*bgp
, int listen_limit
)
583 bgp
->dynamic_neighbors_limit
= listen_limit
;
589 bgp_listen_limit_unset (struct bgp
*bgp
)
594 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
600 peer_af_create (struct peer
*peer
, afi_t afi
, safi_t safi
)
608 afid
= afindex(afi
, safi
);
609 if (afid
>= BGP_AF_MAX
)
612 assert(peer
->peer_af_array
[afid
] == NULL
);
614 /* Allocate new peer af */
615 af
= XCALLOC (MTYPE_BGP_PEER_AF
, sizeof (struct peer_af
));
616 peer
->peer_af_array
[afid
] = af
;
622 //update_group_adjust_peer(af);
627 peer_af_find (struct peer
*peer
, afi_t afi
, safi_t safi
)
634 afid
= afindex(afi
, safi
);
635 if (afid
>= BGP_AF_MAX
)
638 return peer
->peer_af_array
[afid
];
642 peer_af_delete (struct peer
*peer
, afi_t afi
, safi_t safi
)
650 afid
= afindex(afi
, safi
);
651 if (afid
>= BGP_AF_MAX
)
654 af
= peer
->peer_af_array
[afid
];
658 bgp_stop_announce_route_timer (af
);
662 if (BGP_DEBUG (update_groups
, UPDATE_GROUPS
))
663 zlog_debug ("u%" PRIu64
":s%" PRIu64
" remove peer %s",
664 af
->subgroup
->update_group
->id
, af
->subgroup
->id
, peer
->host
);
667 update_subgroup_remove_peer (af
->subgroup
, af
);
669 peer
->peer_af_array
[afid
] = NULL
;
670 XFREE(MTYPE_BGP_PEER_AF
, af
);
675 /* If peer is RSERVER_CLIENT in at least one address family and is not member
676 of a peer_group for that family, return 1.
677 Used to check wether the peer is included in list bgp->rsclient. */
679 peer_rsclient_active (struct peer
*peer
)
684 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
685 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
686 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
687 && ! peer
->af_group
[i
][j
])
692 /* Peer comparison function for sorting. */
694 peer_cmp (struct peer
*p1
, struct peer
*p2
)
696 return sockunion_cmp (&p1
->su
, &p2
->su
);
700 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
702 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
705 /* Reset all address family specific configuration. */
707 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
710 struct bgp_filter
*filter
;
711 char orf_name
[BUFSIZ
];
713 filter
= &peer
->filter
[afi
][safi
];
715 /* Clear neighbor filter and route-map */
716 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
718 if (filter
->dlist
[i
].name
)
720 free (filter
->dlist
[i
].name
);
721 filter
->dlist
[i
].name
= NULL
;
723 if (filter
->plist
[i
].name
)
725 free (filter
->plist
[i
].name
);
726 filter
->plist
[i
].name
= NULL
;
728 if (filter
->aslist
[i
].name
)
730 free (filter
->aslist
[i
].name
);
731 filter
->aslist
[i
].name
= NULL
;
734 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
736 if (filter
->map
[i
].name
)
738 free (filter
->map
[i
].name
);
739 filter
->map
[i
].name
= NULL
;
743 /* Clear unsuppress map. */
744 if (filter
->usmap
.name
)
745 free (filter
->usmap
.name
);
746 filter
->usmap
.name
= NULL
;
747 filter
->usmap
.map
= NULL
;
749 /* Clear neighbor's all address family flags. */
750 peer
->af_flags
[afi
][safi
] = 0;
752 /* Clear neighbor's all address family sflags. */
753 peer
->af_sflags
[afi
][safi
] = 0;
755 /* Clear neighbor's all address family capabilities. */
756 peer
->af_cap
[afi
][safi
] = 0;
759 peer
->orf_plist
[afi
][safi
] = NULL
;
760 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
761 prefix_bgp_orf_remove_all (orf_name
);
763 /* Set default neighbor send-community. */
764 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
766 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
767 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
770 /* Clear neighbor default_originate_rmap */
771 if (peer
->default_rmap
[afi
][safi
].name
)
772 free (peer
->default_rmap
[afi
][safi
].name
);
773 peer
->default_rmap
[afi
][safi
].name
= NULL
;
774 peer
->default_rmap
[afi
][safi
].map
= NULL
;
776 /* Clear neighbor maximum-prefix */
777 peer
->pmax
[afi
][safi
] = 0;
778 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
781 /* peer global config reset */
783 peer_global_config_reset (struct peer
*peer
)
786 peer
->change_local_as
= 0;
787 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
788 if (peer
->update_source
)
790 sockunion_free (peer
->update_source
);
791 peer
->update_source
= NULL
;
795 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
796 peer
->update_if
= NULL
;
799 if (peer_sort (peer
) == BGP_PEER_IBGP
)
800 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
802 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
809 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
811 /* Reset some other configs back to defaults. */
812 peer
->v_start
= BGP_INIT_START_TIMER
;
813 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
814 peer
->password
= NULL
;
815 peer
->local_id
= peer
->bgp
->router_id
;
816 peer
->v_holdtime
= peer
->bgp
->default_holdtime
;
817 peer
->v_keepalive
= peer
->bgp
->default_keepalive
;
819 /* Set back the CONFIG_NODE flag. */
820 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
823 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
824 static bgp_peer_sort_t
825 peer_calc_sort (struct peer
*peer
)
832 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
834 if (peer
->as_type
== AS_INTERNAL
)
835 return BGP_PEER_IBGP
;
837 else if (peer
->as_type
== AS_EXTERNAL
)
838 return BGP_PEER_EBGP
;
840 else if (peer
->as_type
== AS_SPECIFIED
&& peer
->as
)
841 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
846 peer1
= listnode_head (peer
->group
->peer
);
851 return BGP_PEER_INTERNAL
;
855 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
857 if (peer
->local_as
== 0)
858 return BGP_PEER_INTERNAL
;
860 if (peer
->local_as
== peer
->as
)
862 if (bgp
->as
== bgp
->confed_id
)
864 if (peer
->local_as
== bgp
->as
)
865 return BGP_PEER_IBGP
;
867 return BGP_PEER_EBGP
;
871 if (peer
->local_as
== bgp
->confed_id
)
872 return BGP_PEER_EBGP
;
874 return BGP_PEER_IBGP
;
878 if (bgp_confederation_peers_check (bgp
, peer
->as
))
879 return BGP_PEER_CONFED
;
881 return BGP_PEER_EBGP
;
885 if (peer
->as_type
!= AS_SPECIFIED
)
886 return (peer
->as_type
== AS_INTERNAL
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
888 return (peer
->local_as
== 0
889 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
890 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
894 /* Calculate and cache the peer "sort" */
896 peer_sort (struct peer
*peer
)
898 peer
->sort
= peer_calc_sort (peer
);
903 peer_free (struct peer
*peer
)
905 assert (peer
->status
== Deleted
);
907 bgp_unlock(peer
->bgp
);
909 /* this /ought/ to have been done already through bgp_stop earlier,
910 * but just to be sure..
912 bgp_timer_set (peer
);
913 BGP_READ_OFF (peer
->t_read
);
914 BGP_WRITE_OFF (peer
->t_write
);
915 BGP_EVENT_FLUSH (peer
);
917 /* Free connected nexthop, if present */
918 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
) &&
919 !peer_dynamic_neighbor (peer
))
920 bgp_delete_connected_nexthop (family2afi(peer
->su
.sa
.sa_family
), peer
);
923 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
925 /* Free allocated host character. */
927 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
929 /* Update source configuration. */
930 if (peer
->update_source
)
931 sockunion_free (peer
->update_source
);
934 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
936 if (peer
->clear_node_queue
)
937 work_queue_free (peer
->clear_node_queue
);
939 bgp_sync_delete (peer
);
942 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
945 bgp_bfd_peer_free(peer
);
947 memset (peer
, 0, sizeof (struct peer
));
949 XFREE (MTYPE_BGP_PEER
, peer
);
952 /* increase reference count on a struct peer */
954 peer_lock (struct peer
*peer
)
956 assert (peer
&& (peer
->lock
>= 0));
963 /* decrease reference count on a struct peer
964 * struct peer is freed and NULL returned if last reference
967 peer_unlock (struct peer
*peer
)
969 assert (peer
&& (peer
->lock
> 0));
976 zlog_debug ("unlocked and freeing");
977 zlog_backtrace (LOG_DEBUG
);
986 zlog_debug ("unlocked to 1");
987 zlog_backtrace (LOG_DEBUG
);
994 /* Allocate new peer object, implicitely locked. */
996 peer_new (struct bgp
*bgp
)
1003 /* bgp argument is absolutely required */
1008 /* Allocate new peer. */
1009 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
1011 /* Set default value. */
1013 peer
->v_start
= BGP_INIT_START_TIMER
;
1014 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1015 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
1016 peer
->status
= Idle
;
1017 peer
->ostatus
= Idle
;
1018 peer
->cur_event
= peer
->last_event
= peer
->last_major_event
= 0;
1020 peer
= peer_lock (peer
); /* initial reference */
1023 peer
->password
= NULL
;
1025 /* Set default flags. */
1026 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1027 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1029 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
1031 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
1032 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
1034 peer
->orf_plist
[afi
][safi
] = NULL
;
1036 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1038 /* Create buffers. */
1039 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
1040 peer
->obuf
= stream_fifo_new ();
1042 /* We use a larger buffer for peer->work in the event that:
1043 * - We RX a BGP_UPDATE where the attributes alone are just
1044 * under BGP_MAX_PACKET_SIZE
1045 * - The user configures an outbound route-map that does many as-path
1046 * prepends or adds many communities. At most they can have CMD_ARGC_MAX
1047 * args in a route-map so there is a finite limit on how large they can
1048 * make the attributes.
1050 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
1051 * checking for every single attribute as we construct an UPDATE.
1053 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
1054 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
1057 bgp_sync_init (peer
);
1059 /* Get service port number. */
1060 sp
= getservbyname ("bgp", "tcp");
1061 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
1067 * This function is invoked when a duplicate peer structure associated with
1068 * a neighbor is being deleted. If this about-to-be-deleted structure is
1069 * the one with all the config, then we have to copy over the info.
1072 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
1074 struct peer_af
*paf
;
1082 /* The following function is used by both peer group config copy to
1083 * individual peer and when we transfer config
1085 if (peer_src
->change_local_as
)
1086 peer_dst
->change_local_as
= peer_src
->change_local_as
;
1088 /* peer flags apply */
1089 peer_dst
->flags
= peer_src
->flags
;
1090 peer_dst
->cap
= peer_src
->cap
;
1091 peer_dst
->config
= peer_src
->config
;
1093 peer_dst
->local_as
= peer_src
->local_as
;
1094 peer_dst
->ifindex
= peer_src
->ifindex
;
1095 peer_dst
->port
= peer_src
->port
;
1096 peer_sort(peer_dst
);
1097 peer_dst
->rmap_type
= peer_src
->rmap_type
;
1100 peer_dst
->holdtime
= peer_src
->holdtime
;
1101 peer_dst
->keepalive
= peer_src
->keepalive
;
1102 peer_dst
->connect
= peer_src
->connect
;
1103 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
1104 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
1105 peer_dst
->v_asorig
= peer_src
->v_asorig
;
1106 peer_dst
->routeadv
= peer_src
->routeadv
;
1107 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
1109 /* password apply */
1110 if (peer_src
->password
&& !peer_dst
->password
)
1111 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
1113 bgp_md5_set (peer_dst
);
1115 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1116 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1118 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
1119 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
1120 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
1123 PEERAF_FOREACH(peer_src
, paf
, afindex
)
1124 peer_af_create(peer_dst
, paf
->afi
, paf
->safi
);
1126 /* update-source apply */
1127 if (peer_src
->update_source
)
1129 if (peer_dst
->update_source
)
1130 sockunion_free (peer_dst
->update_source
);
1131 if (peer_dst
->update_if
)
1133 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1134 peer_dst
->update_if
= NULL
;
1136 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
1138 else if (peer_src
->update_if
)
1140 if (peer_dst
->update_if
)
1141 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
1142 if (peer_dst
->update_source
)
1144 sockunion_free (peer_dst
->update_source
);
1145 peer_dst
->update_source
= NULL
;
1147 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
1150 if (peer_src
->ifname
)
1152 if (peer_dst
->ifname
)
1153 free(peer_dst
->ifname
);
1155 peer_dst
->ifname
= strdup(peer_src
->ifname
);
1160 * Set or reset the peer address socketunion structure based on the
1161 * learnt peer address. Currently via the source address of the
1162 * ipv6 ND router-advertisement.
1165 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
1167 struct interface
*ifp
;
1168 struct nbr_connected
*ifc
;
1173 if ((ifp
= if_lookup_by_name(peer
->conf_if
)) &&
1174 ifp
->nbr_connected
&&
1175 (ifc
= listnode_head(ifp
->nbr_connected
)))
1177 peer
->su
.sa
.sa_family
= AF_INET6
;
1178 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc
->address
->u
.prefix
,
1179 sizeof (struct in6_addr
));
1181 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1183 peer
->su
.sin6
.sin6_scope_id
= ifp
->ifindex
;
1187 /* This works as an indication of unresolved peer address
1188 on a BGP interface*/
1189 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1190 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1194 /* Create new BGP peer. */
1196 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1197 as_t local_as
, as_t remote_as
, int as_type
, afi_t afi
, safi_t safi
)
1201 char buf
[SU_ADDRSTRLEN
];
1203 peer
= peer_new (bgp
);
1206 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1207 bgp_peer_conf_if_to_su_update(peer
);
1208 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1213 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1214 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1216 peer
->local_as
= local_as
;
1217 peer
->as
= remote_as
;
1218 peer
->as_type
= as_type
;
1219 peer
->local_id
= bgp
->router_id
;
1220 peer
->v_holdtime
= bgp
->default_holdtime
;
1221 peer
->v_keepalive
= bgp
->default_keepalive
;
1222 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1223 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1225 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1227 peer
= peer_lock (peer
); /* bgp peer list reference */
1228 listnode_add_sort (bgp
->peer
, peer
);
1230 active
= peer_active (peer
);
1232 /* Last read and reset time set */
1233 peer
->readtime
= peer
->resettime
= bgp_clock ();
1235 /* Default TTL set. */
1236 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1238 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1242 peer
->afc
[afi
][safi
] = 1;
1243 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1245 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1249 bgp_bfd_peer_init(peer
);
1251 /* Set up peer's events and timers. */
1252 if (! active
&& peer_active (peer
))
1253 bgp_timer_set (peer
);
1259 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1264 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1267 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1268 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1269 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, AS_SPECIFIED
, 0, 0, 0);
1271 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, AS_SPECIFIED
, 0, afi
, safi
);
1278 /* Make accept BGP peer. Called from bgp_accept (). */
1280 peer_create_accept (struct bgp
*bgp
)
1284 peer
= peer_new (bgp
);
1286 peer
= peer_lock (peer
); /* bgp peer list reference */
1287 listnode_add_sort (bgp
->peer
, peer
);
1292 /* Change peer's AS number. */
1294 peer_as_change (struct peer
*peer
, as_t as
, int as_specified
)
1296 bgp_peer_sort_t type
;
1300 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1302 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1304 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1305 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1306 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1309 bgp_session_reset(peer
);
1311 type
= peer_sort (peer
);
1313 peer
->as_type
= as_specified
;
1315 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1316 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1317 && peer
->bgp
->as
!= as
)
1318 peer
->local_as
= peer
->bgp
->confed_id
;
1320 peer
->local_as
= peer
->bgp
->as
;
1322 /* Advertisement-interval reset */
1325 conf
= peer
->group
->conf
;
1327 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1329 peer
->v_routeadv
= conf
->routeadv
;
1331 /* Only go back to the default advertisement-interval if the user had not
1332 * already configured it */
1333 else if (!CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
1335 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1336 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1338 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1341 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1343 else if (type
== BGP_PEER_IBGP
)
1346 /* reflector-client reset */
1347 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1349 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1350 PEER_FLAG_REFLECTOR_CLIENT
);
1351 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1352 PEER_FLAG_REFLECTOR_CLIENT
);
1353 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1354 PEER_FLAG_REFLECTOR_CLIENT
);
1355 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1356 PEER_FLAG_REFLECTOR_CLIENT
);
1357 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1358 PEER_FLAG_REFLECTOR_CLIENT
);
1361 /* local-as reset */
1362 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1364 peer
->change_local_as
= 0;
1365 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1366 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1370 /* If peer does not exist, create new one. If peer already exists,
1371 set AS number to the peer. */
1373 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
,
1374 as_t
*as
, int as_type
, afi_t afi
, safi_t safi
)
1380 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1382 peer
= peer_lookup (bgp
, su
);
1386 /* Not allowed for a dynamic peer. */
1387 if (peer_dynamic_neighbor (peer
))
1390 return BGP_ERR_INVALID_FOR_DYNAMIC_PEER
;
1393 /* When this peer is a member of peer-group. */
1396 if (peer
->group
->conf
->as
)
1398 /* Return peer group's AS number. */
1399 *as
= peer
->group
->conf
->as
;
1400 return BGP_ERR_PEER_GROUP_MEMBER
;
1402 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1404 if ((as_type
!= AS_INTERNAL
) && (bgp
->as
!= *as
))
1407 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1412 if ((as_type
!= AS_EXTERNAL
) && (bgp
->as
== *as
))
1415 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1420 /* Existing peer's AS number change. */
1421 if (peer
->as
!= *as
)
1422 peer_as_change (peer
, *as
, as_type
);
1427 return BGP_ERR_NO_INTERFACE_CONFIG
;
1429 /* If the peer is not part of our confederation, and its not an
1430 iBGP peer then spoof the source AS */
1431 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1432 && ! bgp_confederation_peers_check (bgp
, *as
)
1434 local_as
= bgp
->confed_id
;
1438 /* If this is IPv4 unicast configuration and "no bgp default
1439 ipv4-unicast" is specified. */
1441 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1442 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1443 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, 0, 0);
1445 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, as_type
, afi
, safi
);
1451 /* Activate the peer or peer group for specified AFI and SAFI. */
1453 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1457 if (peer
->afc
[afi
][safi
])
1460 /* Activate the address family configuration. */
1461 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1462 peer
->afc
[afi
][safi
] = 1;
1465 active
= peer_active (peer
);
1467 peer
->afc
[afi
][safi
] = 1;
1469 if (peer_af_create(peer
, afi
, safi
) == NULL
)
1471 zlog_err("couldn't create af structure for peer %s", peer
->host
);
1474 if (! active
&& peer_active (peer
))
1475 bgp_timer_set (peer
);
1478 if (peer
->status
== Established
)
1480 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1482 peer
->afc_adv
[afi
][safi
] = 1;
1483 bgp_capability_send (peer
, afi
, safi
,
1485 CAPABILITY_ACTION_SET
);
1486 if (peer
->afc_recv
[afi
][safi
])
1488 peer
->afc_nego
[afi
][safi
] = 1;
1489 bgp_announce_route (peer
, afi
, safi
);
1494 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1495 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1496 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1505 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1507 struct peer_group
*group
;
1509 struct listnode
*node
, *nnode
;
1511 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1513 group
= peer
->group
;
1515 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1517 if (peer1
->af_group
[afi
][safi
])
1518 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1523 if (peer
->af_group
[afi
][safi
])
1524 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1527 if (! peer
->afc
[afi
][safi
])
1530 /* De-activate the address family configuration. */
1531 peer
->afc
[afi
][safi
] = 0;
1532 peer_af_flag_reset (peer
, afi
, safi
);
1533 if (peer_af_delete(peer
, afi
, safi
) != 0)
1535 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
1538 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1540 if (peer
->status
== Established
)
1542 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1544 peer
->afc_adv
[afi
][safi
] = 0;
1545 peer
->afc_nego
[afi
][safi
] = 0;
1547 if (peer_active_nego (peer
))
1549 bgp_capability_send (peer
, afi
, safi
,
1551 CAPABILITY_ACTION_UNSET
);
1552 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1553 peer
->pcount
[afi
][safi
] = 0;
1557 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1558 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1559 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1564 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1565 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1566 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1574 peer_nsf_stop (struct peer
*peer
)
1579 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1580 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1582 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1583 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1584 peer
->nsf
[afi
][safi
] = 0;
1586 if (peer
->t_gr_restart
)
1588 BGP_TIMER_OFF (peer
->t_gr_restart
);
1589 if (bgp_debug_neighbor_events(peer
))
1590 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1592 if (peer
->t_gr_stale
)
1594 BGP_TIMER_OFF (peer
->t_gr_stale
);
1595 if (bgp_debug_neighbor_events(peer
))
1596 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1598 bgp_clear_route_all (peer
);
1601 /* Delete peer from confguration.
1603 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1604 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1606 * This function /should/ take care to be idempotent, to guard against
1607 * it being called multiple times through stray events that come in
1608 * that happen to result in this function being called again. That
1609 * said, getting here for a "Deleted" peer is a bug in the neighbour
1613 peer_delete (struct peer
*peer
)
1619 struct bgp_filter
*filter
;
1620 struct listnode
*pn
;
1622 assert (peer
->status
!= Deleted
);
1626 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1627 peer_nsf_stop (peer
);
1629 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1631 /* If this peer belongs to peer group, clear up the
1635 if (peer_dynamic_neighbor(peer
))
1636 peer_drop_dynamic_neighbor(peer
);
1638 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1640 peer
= peer_unlock (peer
); /* group->peer list reference */
1641 list_delete_node (peer
->group
->peer
, pn
);
1646 /* Withdraw all information from routing table. We can not use
1647 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1648 * executed after peer structure is deleted.
1650 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1652 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1654 if (peer
->doppelganger
)
1655 peer
->doppelganger
->doppelganger
= NULL
;
1656 peer
->doppelganger
= NULL
;
1658 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1659 bgp_fsm_change_status (peer
, Deleted
);
1661 /* Password configuration */
1664 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1665 peer
->password
= NULL
;
1667 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1671 bgp_timer_set (peer
); /* stops all timers for Deleted */
1673 /* Delete from all peer list. */
1674 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1675 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1677 peer_unlock (peer
); /* bgp peer list reference */
1678 list_delete_node (bgp
->peer
, pn
);
1681 if (peer_rsclient_active (peer
)
1682 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1684 peer_unlock (peer
); /* rsclient list reference */
1685 list_delete_node (bgp
->rsclient
, pn
);
1687 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1689 /* Clear our own rsclient ribs. */
1690 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1691 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1692 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1693 PEER_FLAG_RSERVER_CLIENT
))
1694 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1698 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1699 member of a peer_group. */
1700 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1701 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1702 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1703 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1707 stream_free (peer
->ibuf
);
1709 stream_fifo_free (peer
->obuf
);
1711 stream_free (peer
->work
);
1713 stream_free(peer
->scratch
);
1715 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1717 /* Local and remote addresses. */
1719 sockunion_free (peer
->su_local
);
1720 if (peer
->su_remote
)
1721 sockunion_free (peer
->su_remote
);
1722 peer
->su_local
= peer
->su_remote
= NULL
;
1724 /* Free filter related memory. */
1725 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1726 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1728 filter
= &peer
->filter
[afi
][safi
];
1730 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1732 if (filter
->dlist
[i
].name
)
1733 free (filter
->dlist
[i
].name
);
1734 if (filter
->plist
[i
].name
)
1735 free (filter
->plist
[i
].name
);
1736 if (filter
->aslist
[i
].name
)
1737 free (filter
->aslist
[i
].name
);
1739 filter
->dlist
[i
].name
= NULL
;
1740 filter
->plist
[i
].name
= NULL
;
1741 filter
->aslist
[i
].name
= NULL
;
1743 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1745 if (filter
->map
[i
].name
)
1746 free (filter
->map
[i
].name
);
1747 filter
->map
[i
].name
= NULL
;
1750 if (filter
->usmap
.name
)
1751 free (filter
->usmap
.name
);
1753 if (peer
->default_rmap
[afi
][safi
].name
)
1754 free (peer
->default_rmap
[afi
][safi
].name
);
1756 filter
->usmap
.name
= NULL
;
1757 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1760 FOREACH_AFI_SAFI (afi
, safi
)
1761 peer_af_delete (peer
, afi
, safi
);
1764 XFREE(MTYPE_HOST
, peer
->hostname
);
1765 if (peer
->domainname
)
1766 XFREE(MTYPE_HOST
, peer
->domainname
);
1768 peer_unlock (peer
); /* initial reference */
1774 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1776 return strcmp (g1
->name
, g2
->name
);
1779 /* Peer group cofiguration. */
1780 static struct peer_group
*
1781 peer_group_new (void)
1783 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1784 sizeof (struct peer_group
));
1788 peer_group_free (struct peer_group
*group
)
1790 XFREE (MTYPE_PEER_GROUP
, group
);
1794 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1796 struct peer_group
*group
;
1797 struct listnode
*node
, *nnode
;
1799 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1801 if (strcmp (group
->name
, name
) == 0)
1808 peer_group_get (struct bgp
*bgp
, const char *name
)
1810 struct peer_group
*group
;
1813 group
= peer_group_lookup (bgp
, name
);
1817 group
= peer_group_new ();
1819 group
->name
= strdup (name
);
1820 group
->peer
= list_new ();
1821 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1822 group
->listen_range
[afi
] = list_new ();
1823 group
->conf
= peer_new (bgp
);
1824 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1825 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1826 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1827 group
->conf
->group
= group
;
1828 group
->conf
->as
= 0;
1829 group
->conf
->ttl
= 1;
1830 group
->conf
->gtsm_hops
= 0;
1831 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1832 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1833 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1834 group
->conf
->keepalive
= 0;
1835 group
->conf
->holdtime
= 0;
1836 group
->conf
->connect
= 0;
1837 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1838 listnode_add_sort (bgp
->group
, group
);
1839 bgp_bfd_peer_init(group
->conf
);
1845 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1846 afi_t afi
, safi_t safi
)
1849 int out
= FILTER_OUT
;
1851 struct bgp_filter
*pfilter
;
1852 struct bgp_filter
*gfilter
;
1855 pfilter
= &peer
->filter
[afi
][safi
];
1856 gfilter
= &conf
->filter
[afi
][safi
];
1860 peer
->as
= conf
->as
;
1863 if (conf
->change_local_as
)
1864 peer
->change_local_as
= conf
->change_local_as
;
1867 peer
->ttl
= conf
->ttl
;
1870 peer
->gtsm_hops
= conf
->gtsm_hops
;
1873 peer
->weight
= conf
->weight
;
1875 /* peer flags apply */
1876 peer
->flags
= conf
->flags
;
1877 /* peer af_flags apply */
1878 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1879 /* peer config apply */
1880 peer
->config
= conf
->config
;
1882 /* peer timers apply */
1883 peer
->holdtime
= conf
->holdtime
;
1884 peer
->keepalive
= conf
->keepalive
;
1885 peer
->connect
= conf
->connect
;
1886 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1887 peer
->v_connect
= conf
->connect
;
1889 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1891 /* advertisement-interval reset */
1892 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1893 peer
->v_routeadv
= conf
->routeadv
;
1895 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1896 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1898 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1900 /* password apply */
1901 if (conf
->password
&& !peer
->password
)
1902 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1906 /* maximum-prefix */
1907 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1908 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1909 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1912 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1914 /* route-server-client */
1915 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1917 /* Make peer's RIB point to group's RIB. */
1918 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1920 /* Import policy. */
1921 if (pfilter
->map
[RMAP_IMPORT
].name
)
1922 free (pfilter
->map
[RMAP_IMPORT
].name
);
1923 if (gfilter
->map
[RMAP_IMPORT
].name
)
1925 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1926 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1930 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1931 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1934 /* Export policy. */
1935 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1937 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1938 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1942 /* default-originate route-map */
1943 if (conf
->default_rmap
[afi
][safi
].name
)
1945 if (peer
->default_rmap
[afi
][safi
].name
)
1946 free (peer
->default_rmap
[afi
][safi
].name
);
1947 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1948 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1951 /* update-source apply */
1952 if (conf
->update_source
)
1954 if (peer
->update_source
)
1955 sockunion_free (peer
->update_source
);
1956 if (peer
->update_if
)
1958 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1959 peer
->update_if
= NULL
;
1961 peer
->update_source
= sockunion_dup (conf
->update_source
);
1963 else if (conf
->update_if
)
1965 if (peer
->update_if
)
1966 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1967 if (peer
->update_source
)
1969 sockunion_free (peer
->update_source
);
1970 peer
->update_source
= NULL
;
1972 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1975 /* inbound filter apply */
1976 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1978 if (pfilter
->dlist
[in
].name
)
1979 free (pfilter
->dlist
[in
].name
);
1980 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1981 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1983 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1985 if (pfilter
->plist
[in
].name
)
1986 free (pfilter
->plist
[in
].name
);
1987 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1988 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1990 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1992 if (pfilter
->aslist
[in
].name
)
1993 free (pfilter
->aslist
[in
].name
);
1994 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1995 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1997 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1999 if (pfilter
->map
[RMAP_IN
].name
)
2000 free (pfilter
->map
[RMAP_IN
].name
);
2001 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
2002 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
2005 /* outbound filter apply */
2006 if (gfilter
->dlist
[out
].name
)
2008 if (pfilter
->dlist
[out
].name
)
2009 free (pfilter
->dlist
[out
].name
);
2010 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
2011 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
2015 if (pfilter
->dlist
[out
].name
)
2016 free (pfilter
->dlist
[out
].name
);
2017 pfilter
->dlist
[out
].name
= NULL
;
2018 pfilter
->dlist
[out
].alist
= NULL
;
2020 if (gfilter
->plist
[out
].name
)
2022 if (pfilter
->plist
[out
].name
)
2023 free (pfilter
->plist
[out
].name
);
2024 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
2025 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
2029 if (pfilter
->plist
[out
].name
)
2030 free (pfilter
->plist
[out
].name
);
2031 pfilter
->plist
[out
].name
= NULL
;
2032 pfilter
->plist
[out
].plist
= NULL
;
2034 if (gfilter
->aslist
[out
].name
)
2036 if (pfilter
->aslist
[out
].name
)
2037 free (pfilter
->aslist
[out
].name
);
2038 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
2039 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
2043 if (pfilter
->aslist
[out
].name
)
2044 free (pfilter
->aslist
[out
].name
);
2045 pfilter
->aslist
[out
].name
= NULL
;
2046 pfilter
->aslist
[out
].aslist
= NULL
;
2048 if (gfilter
->map
[RMAP_OUT
].name
)
2050 if (pfilter
->map
[RMAP_OUT
].name
)
2051 free (pfilter
->map
[RMAP_OUT
].name
);
2052 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
2053 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
2057 if (pfilter
->map
[RMAP_OUT
].name
)
2058 free (pfilter
->map
[RMAP_OUT
].name
);
2059 pfilter
->map
[RMAP_OUT
].name
= NULL
;
2060 pfilter
->map
[RMAP_OUT
].map
= NULL
;
2063 /* RS-client's import/export route-maps. */
2064 if (gfilter
->map
[RMAP_IMPORT
].name
)
2066 if (pfilter
->map
[RMAP_IMPORT
].name
)
2067 free (pfilter
->map
[RMAP_IMPORT
].name
);
2068 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
2069 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
2073 if (pfilter
->map
[RMAP_IMPORT
].name
)
2074 free (pfilter
->map
[RMAP_IMPORT
].name
);
2075 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
2076 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
2078 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
2080 if (pfilter
->map
[RMAP_EXPORT
].name
)
2081 free (pfilter
->map
[RMAP_EXPORT
].name
);
2082 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
2083 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
2086 if (gfilter
->usmap
.name
)
2088 if (pfilter
->usmap
.name
)
2089 free (pfilter
->usmap
.name
);
2090 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
2091 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
2095 if (pfilter
->usmap
.name
)
2096 free (pfilter
->usmap
.name
);
2097 pfilter
->usmap
.name
= NULL
;
2098 pfilter
->usmap
.map
= NULL
;
2101 bgp_bfd_peer_group2peer_copy(conf
, peer
);
2104 /* Peer group's remote AS configuration. */
2106 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
,
2107 as_t
*as
, int as_type
)
2109 struct peer_group
*group
;
2111 struct listnode
*node
, *nnode
;
2113 group
= peer_group_lookup (bgp
, group_name
);
2117 if ((as_type
== group
->conf
->as_type
) && (group
->conf
->as
== *as
))
2121 /* When we setup peer-group AS number all peer group member's AS
2122 number must be updated to same number. */
2123 peer_as_change (group
->conf
, *as
, as_type
);
2125 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2127 if (peer
->as
!= *as
)
2128 peer_as_change (peer
, *as
, as_type
);
2135 peer_group_delete (struct peer_group
*group
)
2139 struct prefix
*prefix
;
2141 struct listnode
*node
, *nnode
;
2146 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2148 other
= peer
->doppelganger
;
2151 if (other
&& other
->status
!= Deleted
)
2153 other
->group
= NULL
;
2157 list_delete (group
->peer
);
2159 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2161 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2163 prefix_free(prefix
);
2165 list_delete (group
->listen_range
[afi
]);
2171 group
->conf
->group
= NULL
;
2172 peer_delete (group
->conf
);
2174 /* Delete from all peer_group list. */
2175 listnode_delete (bgp
->group
, group
);
2177 if (group
->conf
->bfd_info
)
2178 bgp_bfd_peer_free(group
->conf
);
2180 peer_group_free (group
);
2186 peer_group_remote_as_delete (struct peer_group
*group
)
2188 struct peer
*peer
, *other
;
2189 struct listnode
*node
, *nnode
;
2191 if ((group
->conf
->as_type
== AS_UNSPECIFIED
) ||
2192 ((! group
->conf
->as
) && (group
->conf
->as_type
== AS_SPECIFIED
)))
2195 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2197 other
= peer
->doppelganger
;
2202 if (other
&& other
->status
!= Deleted
)
2204 other
->group
= NULL
;
2208 list_delete_all_node (group
->peer
);
2210 group
->conf
->as
= 0;
2211 group
->conf
->as_type
= AS_UNSPECIFIED
;
2217 peer_group_listen_range_add (struct peer_group
*group
, struct prefix
*range
)
2219 struct prefix
*prefix
;
2220 struct listnode
*node
, *nnode
;
2223 afi
= family2afi(range
->family
);
2225 /* Group needs remote AS configured. */
2226 if (! group
->conf
->as
)
2227 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2229 /* Ensure no duplicates. Currently we don't care about overlaps. */
2230 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2232 if (prefix_same(range
, prefix
))
2233 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
;
2236 prefix
= prefix_new();
2237 prefix_copy(prefix
, range
);
2238 listnode_add(group
->listen_range
[afi
], prefix
);
2243 peer_group_listen_range_del (struct peer_group
*group
, struct prefix
*range
)
2245 struct prefix
*prefix
, *prefix2
;
2246 struct listnode
*node
, *nnode
;
2249 char buf
[SU_ADDRSTRLEN
];
2251 afi
= family2afi(range
->family
);
2253 /* Identify the listen range. */
2254 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, prefix
))
2256 if (prefix_same(range
, prefix
))
2261 return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
;
2263 prefix2str(prefix
, buf
, sizeof(buf
));
2265 /* Dispose off any dynamic neighbors that exist due to this listen range */
2266 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2268 if (!peer_dynamic_neighbor (peer
))
2271 prefix2
= sockunion2hostprefix(&peer
->su
);
2272 if (prefix_match(prefix
, prefix2
))
2274 if (bgp_debug_neighbor_events(peer
))
2275 zlog_debug ("Deleting dynamic neighbor %s group %s upon "
2276 "delete of listen range %s",
2277 peer
->host
, group
->name
, buf
);
2282 /* Get rid of the listen range */
2283 listnode_delete(group
->listen_range
[afi
], prefix
);
2288 /* Bind specified peer to peer group. */
2290 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
2291 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
2293 int first_member
= 0;
2295 /* Check peer group's address family. */
2296 if (! group
->conf
->afc
[afi
][safi
])
2297 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
2299 /* Lookup the peer. */
2301 peer
= peer_lookup (bgp
, su
);
2303 /* Create a new peer. */
2306 if ((group
->conf
->as_type
== AS_SPECIFIED
) && (! group
->conf
->as
)) {
2307 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2310 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, afi
, safi
);
2311 peer
->group
= group
;
2312 peer
->af_group
[afi
][safi
] = 1;
2314 peer
= peer_lock (peer
); /* group->peer list reference */
2315 listnode_add (group
->peer
, peer
);
2316 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2317 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2322 /* When the peer already belongs to peer group, check the consistency. */
2323 if (peer
->af_group
[afi
][safi
])
2325 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2326 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2331 /* Check current peer group configuration. */
2332 if (peer_group_active (peer
)
2333 && strcmp (peer
->group
->name
, group
->name
) != 0)
2334 return BGP_ERR_PEER_GROUP_MISMATCH
;
2336 if (peer
->as_type
== AS_UNSPECIFIED
)
2338 peer
->as_type
= group
->conf
->as_type
;
2339 peer
->as
= group
->conf
->as
;
2342 if (! group
->conf
->as
)
2344 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2345 && peer_sort (group
->conf
) != peer_sort (peer
))
2349 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2352 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2356 peer
->af_group
[afi
][safi
] = 1;
2357 peer
->afc
[afi
][safi
] = 1;
2358 if (!peer_af_find(peer
, afi
, safi
) &&
2359 peer_af_create(peer
, afi
, safi
) == NULL
)
2361 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2365 peer
->group
= group
;
2367 peer
= peer_lock (peer
); /* group->peer list reference */
2368 listnode_add (group
->peer
, peer
);
2371 assert (group
&& peer
->group
== group
);
2375 /* Advertisement-interval reset */
2376 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2378 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2379 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2381 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2384 /* ebgp-multihop reset */
2385 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2386 group
->conf
->ttl
= 255;
2388 /* local-as reset */
2389 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2391 group
->conf
->change_local_as
= 0;
2392 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2393 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2397 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2399 struct listnode
*pn
;
2401 /* If it's not configured as RSERVER_CLIENT in any other address
2402 family, without being member of a peer_group, remove it from
2403 list bgp->rsclient.*/
2404 if (! peer_rsclient_active (peer
)
2405 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2407 peer_unlock (peer
); /* peer rsclient reference */
2408 list_delete_node (bgp
->rsclient
, pn
);
2410 /* Clear our own rsclient rib for this afi/safi. */
2411 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2414 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2416 /* Import policy. */
2417 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2419 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2420 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2421 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2424 /* Export policy. */
2425 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2426 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2428 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2429 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2430 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2434 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2435 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2437 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2439 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2440 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2441 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2444 bgp_session_reset(peer
);
2450 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2451 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2455 if (! peer
->af_group
[afi
][safi
])
2458 if (group
!= peer
->group
)
2459 return BGP_ERR_PEER_GROUP_MISMATCH
;
2461 peer
->af_group
[afi
][safi
] = 0;
2462 peer
->afc
[afi
][safi
] = 0;
2463 peer_af_flag_reset (peer
, afi
, safi
);
2464 if (peer_af_delete(peer
, afi
, safi
) != 0)
2466 zlog_err("couldn't delete af structure for peer %s", peer
->host
);
2469 if (peer
->rib
[afi
][safi
])
2470 peer
->rib
[afi
][safi
] = NULL
;
2472 if (! peer_group_active (peer
))
2474 assert (listnode_lookup (group
->peer
, peer
));
2475 peer_unlock (peer
); /* peer group list reference */
2476 listnode_delete (group
->peer
, peer
);
2478 other
= peer
->doppelganger
;
2479 if (group
->conf
->as
)
2482 if (other
&& other
->status
!= Deleted
)
2487 listnode_delete(group
->peer
, other
);
2489 other
->group
= NULL
;
2494 peer_global_config_reset (peer
);
2497 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2499 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2500 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2501 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2504 bgp_session_reset(peer
);
2510 bgp_startup_timer_expire (struct thread
*thread
)
2514 bgp
= THREAD_ARG (thread
);
2515 bgp
->t_startup
= NULL
;
2521 /* BGP instance creation by `router bgp' commands. */
2523 bgp_create (as_t
*as
, const char *name
)
2529 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2533 bgp
->peer_self
= peer_new (bgp
);
2534 bgp
->peer_self
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, "Static announcement");
2536 bgp
->peer
= list_new ();
2537 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2539 bgp
->group
= list_new ();
2540 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2542 bgp
->rsclient
= list_new ();
2543 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2545 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2546 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2548 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2549 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2550 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2551 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2552 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2555 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2556 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2557 bgp
->default_subgroup_pkt_queue_max
= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
;
2558 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2559 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2560 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2561 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2562 bgp
->dynamic_neighbors_limit
= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
;
2563 bgp
->dynamic_neighbors_count
= 0;
2568 bgp
->name
= strdup (name
);
2570 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2571 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2573 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2574 bgp
, bgp
->restart_time
);
2576 update_bgp_group_init(bgp
);
2580 /* Return first entry of BGP. */
2582 bgp_get_default (void)
2585 return (listgetdata (listhead (bm
->bgp
)));
2589 /* Lookup BGP entry. */
2591 bgp_lookup (as_t as
, const char *name
)
2594 struct listnode
*node
, *nnode
;
2596 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2598 && ((bgp
->name
== NULL
&& name
== NULL
)
2599 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2604 /* Lookup BGP structure by view name. */
2606 bgp_lookup_by_name (const char *name
)
2609 struct listnode
*node
, *nnode
;
2611 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2612 if ((bgp
->name
== NULL
&& name
== NULL
)
2613 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2618 /* Called from VTY commands. */
2620 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2624 /* Multiple instance check. */
2625 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2628 bgp
= bgp_lookup_by_name (name
);
2630 bgp
= bgp_get_default ();
2632 /* Already exists. */
2638 return BGP_ERR_INSTANCE_MISMATCH
;
2646 /* BGP instance name can not be specified for single instance. */
2648 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2650 /* Get default BGP structure if exists. */
2651 bgp
= bgp_get_default ();
2658 return BGP_ERR_AS_MISMATCH
;
2665 bgp
= bgp_create (as
, name
);
2666 bgp_router_id_set(bgp
, &router_id_zebra
);
2669 bgp
->t_rmap_def_originate_eval
= NULL
;
2670 bgp
->t_rmap_update
= NULL
;
2671 bgp
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
2673 /* Create BGP server socket, if first instance. */
2674 if (list_isempty(bm
->bgp
)
2675 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2677 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2678 return BGP_ERR_INVALID_VALUE
;
2681 listnode_add (bm
->bgp
, bgp
);
2686 /* Delete BGP instance. */
2688 bgp_delete (struct bgp
*bgp
)
2691 struct peer_group
*group
;
2692 struct listnode
*node
;
2693 struct listnode
*next
;
2697 THREAD_OFF (bgp
->t_startup
);
2699 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2701 if (peer
->status
== Established
||
2702 peer
->status
== OpenSent
||
2703 peer
->status
== OpenConfirm
)
2705 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2706 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2710 if (bgp
->t_rmap_update
)
2711 BGP_TIMER_OFF(bgp
->t_rmap_update
);
2713 /* Delete static route. */
2714 bgp_static_delete (bgp
);
2716 /* Unset redistribution. */
2717 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2718 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2719 if (i
!= ZEBRA_ROUTE_BGP
)
2720 bgp_redistribute_unset (bgp
, afi
, i
, 0);
2722 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2724 for (ALL_LIST_ELEMENTS (group
->peer
, node
, next
, peer
))
2726 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2728 /* Send notify to remote peer. */
2729 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2732 peer_group_delete (group
);
2735 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2737 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2739 /* Send notify to remote peer. */
2740 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2746 assert (listcount (bgp
->rsclient
) == 0);
2748 if (bgp
->peer_self
) {
2749 peer_delete(bgp
->peer_self
);
2750 bgp
->peer_self
= NULL
;
2753 if (bgp
->t_rmap_def_originate_eval
)
2755 BGP_TIMER_OFF(bgp
->t_rmap_def_originate_eval
);
2759 update_bgp_group_free (bgp
);
2760 /* Remove visibility via the master list - there may however still be
2761 * routes to be processed still referencing the struct bgp.
2763 listnode_delete (bm
->bgp
, bgp
);
2764 if (list_isempty(bm
->bgp
))
2767 bgp_unlock(bgp
); /* initial reference */
2772 static void bgp_free (struct bgp
*);
2775 bgp_lock (struct bgp
*bgp
)
2781 bgp_unlock(struct bgp
*bgp
)
2783 assert(bgp
->lock
> 0);
2784 if (--bgp
->lock
== 0)
2789 bgp_free (struct bgp
*bgp
)
2794 list_delete (bgp
->group
);
2795 list_delete (bgp
->peer
);
2796 list_delete (bgp
->rsclient
);
2801 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2802 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2804 if (bgp
->route
[afi
][safi
])
2805 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2806 if (bgp
->aggregate
[afi
][safi
])
2807 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2808 if (bgp
->rib
[afi
][safi
])
2809 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2811 XFREE (MTYPE_BGP
, bgp
);
2815 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2818 struct listnode
*node
, *nnode
;
2825 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2826 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2827 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2830 else if (bm
->bgp
!= NULL
)
2832 struct listnode
*bgpnode
, *nbgpnode
;
2834 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2835 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2836 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2837 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2844 peer_lookup_by_hostname (struct bgp
*bgp
, const char *hostname
)
2847 struct listnode
*node
, *nnode
;
2854 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2855 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
2856 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2859 else if (bm
->bgp
!= NULL
)
2861 struct listnode
*bgpnode
, *nbgpnode
;
2863 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2864 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2865 if (peer
->hostname
&& !strcmp(peer
->hostname
, hostname
)
2866 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2873 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2876 struct listnode
*node
, *nnode
;
2880 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2881 if (sockunion_same (&peer
->su
, su
)
2882 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2885 else if (bm
->bgp
!= NULL
)
2887 struct listnode
*bgpnode
, *nbgpnode
;
2889 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2890 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2891 if (sockunion_same (&peer
->su
, su
)
2892 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2899 peer_create_bind_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
,
2900 struct peer_group
*group
)
2906 /* Create peer first; we've already checked group config is valid. */
2907 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, group
->conf
->as_type
, 0, 0);
2912 peer
->group
= group
;
2913 peer
= peer_lock (peer
);
2914 listnode_add (group
->peer
, peer
);
2917 * Bind peer for all AFs configured for the group. We don't call
2918 * peer_group_bind as that is sub-optimal and does some stuff we don't want.
2920 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2921 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2923 if (!group
->conf
->afc
[afi
][safi
])
2925 peer
->af_group
[afi
][safi
] = 1;
2926 peer
->afc
[afi
][safi
] = 1;
2927 if (!peer_af_find(peer
, afi
, safi
) &&
2928 peer_af_create(peer
, afi
, safi
) == NULL
)
2930 zlog_err("couldn't create af structure for peer %s", peer
->host
);
2932 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2935 /* Mark as dynamic, but also as a "config node" for other things to work. */
2936 SET_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_NEIGHBOR
);
2937 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2943 peer_group_lookup_dynamic_neighbor_range (struct peer_group
* group
,
2944 struct prefix
* prefix
)
2946 struct listnode
*node
, *nnode
;
2947 struct prefix
*range
;
2950 afi
= family2afi(prefix
->family
);
2952 if (group
->listen_range
[afi
])
2953 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
, nnode
, range
))
2954 if (prefix_match(range
, prefix
))
2961 peer_group_lookup_dynamic_neighbor (struct bgp
*bgp
, struct prefix
*prefix
,
2962 struct prefix
**listen_range
)
2964 struct prefix
*range
= NULL
;
2965 struct peer_group
*group
= NULL
;
2966 struct listnode
*node
, *nnode
;
2968 *listen_range
= NULL
;
2971 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
2972 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
2975 else if (bm
->bgp
!= NULL
)
2977 struct listnode
*bgpnode
, *nbgpnode
;
2979 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2980 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
2981 if ((range
= peer_group_lookup_dynamic_neighbor_range(group
, prefix
)))
2985 *listen_range
= range
;
2986 return (group
&& range
) ? group
: NULL
;
2990 peer_lookup_dynamic_neighbor (struct bgp
*bgp
, union sockunion
*su
)
2992 struct peer_group
*group
;
2995 struct prefix
*prefix
;
2996 struct prefix
*listen_range
;
2998 char buf
[SU_ADDRSTRLEN
];
2999 char buf1
[SU_ADDRSTRLEN
];
3001 prefix
= sockunion2hostprefix(su
);
3006 /* See if incoming connection matches a configured listen range. */
3007 group
= peer_group_lookup_dynamic_neighbor (bgp
, prefix
, &listen_range
);
3018 prefix2str(prefix
, buf
, sizeof(buf
));
3019 prefix2str(listen_range
, buf1
, sizeof(buf1
));
3021 if (bgp_debug_neighbor_events(NULL
))
3022 zlog_debug ("Dynamic Neighbor %s matches group %s listen range %s",
3023 buf
, group
->name
, buf1
);
3025 /* Are we within the listen limit? */
3026 dncount
= gbgp
->dynamic_neighbors_count
;
3028 if (dncount
>= gbgp
->dynamic_neighbors_limit
)
3030 if (bgp_debug_neighbor_events(NULL
))
3031 zlog_debug ("Dynamic Neighbor %s rejected - at limit %d",
3032 inet_sutop (su
, buf
), gbgp
->dynamic_neighbors_limit
);
3036 /* Ensure group is not disabled. */
3037 if (CHECK_FLAG (group
->conf
->flags
, PEER_FLAG_SHUTDOWN
))
3039 if (bgp_debug_neighbor_events(NULL
))
3040 zlog_debug ("Dynamic Neighbor %s rejected - group %s disabled",
3045 /* Check that at least one AF is activated for the group. */
3046 if (!peer_group_af_configured (group
))
3048 if (bgp_debug_neighbor_events(NULL
))
3049 zlog_debug ("Dynamic Neighbor %s rejected - no AF activated for group %s",
3054 /* Create dynamic peer and bind to associated group. */
3055 peer
= peer_create_bind_dynamic_neighbor (gbgp
, su
, group
);
3058 gbgp
->dynamic_neighbors_count
= ++dncount
;
3060 if (bgp_debug_neighbor_events(peer
))
3061 zlog_debug ("%s Dynamic Neighbor added, group %s count %d",
3062 peer
->host
, group
->name
, dncount
);
3067 void peer_drop_dynamic_neighbor (struct peer
*peer
)
3070 if (peer
->group
&& peer
->group
->bgp
)
3072 dncount
= peer
->group
->bgp
->dynamic_neighbors_count
;
3074 peer
->group
->bgp
->dynamic_neighbors_count
= --dncount
;
3076 if (bgp_debug_neighbor_events(peer
))
3077 zlog_debug ("%s dropped from group %s, count %d",
3078 peer
->host
, peer
->group
->name
, dncount
);
3082 /* If peer is configured at least one address family return 1. */
3084 peer_active (struct peer
*peer
)
3086 if (BGP_PEER_SU_UNSPEC(peer
))
3088 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
3089 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
3090 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
3091 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
3092 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
3097 /* If peer is negotiated at least one address family return 1. */
3099 peer_active_nego (struct peer
*peer
)
3101 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
3102 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
3103 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
3104 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
3105 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
3110 /* peer_flag_change_type. */
3111 enum peer_change_type
3115 peer_change_reset_in
,
3116 peer_change_reset_out
,
3120 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
3121 enum peer_change_type type
)
3123 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3126 if (peer
->status
!= Established
)
3129 if (type
== peer_change_reset
)
3131 /* If we're resetting session, we've to delete both peer struct */
3132 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3133 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3134 PEER_FLAG_CONFIG_NODE
)))
3135 peer_delete(peer
->doppelganger
);
3137 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3138 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3140 else if (type
== peer_change_reset_in
)
3142 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
3143 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
3144 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
3147 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
3148 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
3149 PEER_FLAG_CONFIG_NODE
)))
3150 peer_delete(peer
->doppelganger
);
3152 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3153 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3156 else if (type
== peer_change_reset_out
)
3158 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3159 bgp_announce_route (peer
, afi
, safi
);
3163 struct peer_flag_action
3168 /* This flag can be set for peer-group member. */
3169 u_char not_for_member
;
3171 /* Action when the flag is changed. */
3172 enum peer_change_type type
;
3174 /* Peer down cause */
3178 static const struct peer_flag_action peer_flag_action_list
[] =
3180 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
3181 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
3182 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
3183 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
3184 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
3185 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
3186 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
3187 { PEER_FLAG_CAPABILITY_ENHE
, 0, peer_change_reset
},
3188 { PEER_FLAG_BFD
, 0, peer_change_none
},
3192 static const struct peer_flag_action peer_af_flag_action_list
[] =
3194 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
3195 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
3196 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
3197 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
3198 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
3199 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
3200 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
3201 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
3202 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
3203 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
3204 { PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
3205 { PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
,1, peer_change_reset_out
},
3206 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
3207 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
3208 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
3209 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
3210 { PEER_FLAG_NEXTHOP_SELF_ALL
, 1, peer_change_reset_out
},
3211 { PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
3215 /* Proper action set. */
3217 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
3218 struct peer_flag_action
*action
, u_int32_t flag
)
3224 const struct peer_flag_action
*match
= NULL
;
3226 /* Check peer's frag action. */
3227 for (i
= 0; i
< size
; i
++)
3229 match
= &action_list
[i
];
3231 if (match
->flag
== 0)
3234 if (match
->flag
& flag
)
3238 if (match
->type
== peer_change_reset_in
)
3240 if (match
->type
== peer_change_reset_out
)
3242 if (match
->type
== peer_change_reset
)
3247 if (match
->not_for_member
)
3248 action
->not_for_member
= 1;
3252 /* Set peer clear type. */
3253 if (reset_in
&& reset_out
)
3254 action
->type
= peer_change_reset
;
3256 action
->type
= peer_change_reset_in
;
3258 action
->type
= peer_change_reset_out
;
3260 action
->type
= peer_change_none
;
3266 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
3268 if (flag
== PEER_FLAG_SHUTDOWN
)
3270 if (CHECK_FLAG (peer
->flags
, flag
))
3272 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3273 peer_nsf_stop (peer
);
3275 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
3276 if (peer
->t_pmax_restart
)
3278 BGP_TIMER_OFF (peer
->t_pmax_restart
);
3279 if (bgp_debug_neighbor_events(peer
))
3280 zlog_debug ("%s Maximum-prefix restart timer canceled",
3284 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
3285 peer_nsf_stop (peer
);
3287 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3288 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3289 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
3291 bgp_session_reset(peer
);
3295 peer
->v_start
= BGP_INIT_START_TIMER
;
3296 BGP_EVENT_ADD (peer
, BGP_Stop
);
3299 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3301 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
3302 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3303 else if (flag
== PEER_FLAG_PASSIVE
)
3304 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
3305 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
3306 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
3308 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3309 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3312 bgp_session_reset(peer
);
3315 /* Change specified peer flag. */
3317 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
3321 struct peer_group
*group
;
3322 struct listnode
*node
, *nnode
;
3323 struct peer_flag_action action
;
3325 memset (&action
, 0, sizeof (struct peer_flag_action
));
3326 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
3328 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
3330 /* No flag action is found. */
3332 return BGP_ERR_INVALID_FLAG
;
3334 /* Not for peer-group member. */
3335 if (action
.not_for_member
&& peer_group_active (peer
))
3336 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3338 /* When unset the peer-group member's flag we have to check
3339 peer-group configuration. */
3340 if (! set
&& peer_group_active (peer
))
3341 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
3343 if (flag
== PEER_FLAG_SHUTDOWN
)
3344 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
3346 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3349 /* Flag conflict check. */
3351 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
3352 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
3353 return BGP_ERR_PEER_FLAG_CONFLICT
;
3355 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3357 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3359 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3364 SET_FLAG (peer
->flags
, flag
);
3366 UNSET_FLAG (peer
->flags
, flag
);
3368 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3370 if (action
.type
== peer_change_reset
)
3371 peer_flag_modify_action (peer
, flag
);
3376 /* peer-group member updates. */
3377 group
= peer
->group
;
3379 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3381 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
3384 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
3388 SET_FLAG (peer
->flags
, flag
);
3390 UNSET_FLAG (peer
->flags
, flag
);
3392 if (action
.type
== peer_change_reset
)
3393 peer_flag_modify_action (peer
, flag
);
3399 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
3401 return peer_flag_modify (peer
, flag
, 1);
3405 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
3407 return peer_flag_modify (peer
, flag
, 0);
3411 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
3413 if (peer
->af_group
[afi
][safi
])
3419 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
3424 struct listnode
*node
, *nnode
;
3425 struct peer_group
*group
;
3426 struct peer_flag_action action
;
3428 memset (&action
, 0, sizeof (struct peer_flag_action
));
3429 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
3431 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
3433 /* No flag action is found. */
3435 return BGP_ERR_INVALID_FLAG
;
3437 /* Adress family must be activated. */
3438 if (! peer
->afc
[afi
][safi
])
3439 return BGP_ERR_PEER_INACTIVE
;
3441 /* Not for peer-group member. */
3442 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
3443 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3445 /* Spcecial check for reflector client. */
3446 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
3447 && peer_sort (peer
) != BGP_PEER_IBGP
)
3448 return BGP_ERR_NOT_INTERNAL_PEER
;
3450 /* Spcecial check for remove-private-AS. */
3451 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
3452 && peer_sort (peer
) == BGP_PEER_IBGP
)
3453 return BGP_ERR_REMOVE_PRIVATE_AS
;
3455 /* as-override is not allowed for IBGP peers */
3456 if (flag
& PEER_FLAG_AS_OVERRIDE
3457 && peer_sort (peer
) == BGP_PEER_IBGP
)
3458 return BGP_ERR_AS_OVERRIDE
;
3460 /* When unset the peer-group member's flag we have to check
3461 peer-group configuration. */
3462 if (! set
&& peer
->af_group
[afi
][safi
])
3463 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
3464 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3466 /* When current flag configuration is same as requested one. */
3467 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3469 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3471 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3476 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3478 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3480 /* Execute action when peer is established. */
3481 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3482 && peer
->status
== Established
)
3484 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3485 bgp_clear_adj_in (peer
, afi
, safi
);
3488 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3489 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3490 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3491 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3492 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3493 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3494 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3495 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3497 peer_change_action (peer
, afi
, safi
, action
.type
);
3502 /* Peer group member updates. */
3503 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3505 group
= peer
->group
;
3507 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3509 if (! peer
->af_group
[afi
][safi
])
3512 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
3515 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
3519 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3521 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
3523 if (peer
->status
== Established
)
3525 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
3526 bgp_clear_adj_in (peer
, afi
, safi
);
3529 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
3530 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
3531 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
3532 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
3533 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
3534 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3535 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
3536 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
3538 peer_change_action (peer
, afi
, safi
, action
.type
);
3547 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3549 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
3553 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3555 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
3558 /* EBGP multihop configuration. */
3560 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
3562 struct peer_group
*group
;
3563 struct listnode
*node
, *nnode
;
3566 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
3569 /* see comment in peer_ttl_security_hops_set() */
3572 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3574 group
= peer
->group
;
3575 if (group
->conf
->gtsm_hops
!= 0)
3576 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3578 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
3580 if (peer1
->sort
== BGP_PEER_IBGP
)
3583 if (peer1
->gtsm_hops
!= 0)
3584 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3589 if (peer
->gtsm_hops
!= 0)
3590 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3596 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3598 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3600 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3601 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3602 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3604 bgp_session_reset(peer
);
3609 group
= peer
->group
;
3610 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3612 if (peer
->sort
== BGP_PEER_IBGP
)
3615 peer
->ttl
= group
->conf
->ttl
;
3617 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3618 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3619 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3621 bgp_session_reset(peer
);
3628 peer_ebgp_multihop_unset (struct peer
*peer
)
3630 struct peer_group
*group
;
3631 struct listnode
*node
, *nnode
;
3633 if (peer
->sort
== BGP_PEER_IBGP
)
3636 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3637 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3639 if (peer_group_active (peer
))
3640 peer
->ttl
= peer
->group
->conf
->ttl
;
3644 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3646 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3647 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3648 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3650 bgp_session_reset(peer
);
3654 group
= peer
->group
;
3655 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3657 if (peer
->sort
== BGP_PEER_IBGP
)
3664 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3665 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3666 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3668 bgp_session_reset(peer
);
3675 /* Neighbor description. */
3677 peer_description_set (struct peer
*peer
, char *desc
)
3680 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3682 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3688 peer_description_unset (struct peer
*peer
)
3691 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3698 /* Neighbor update-source. */
3700 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3702 struct peer_group
*group
;
3703 struct listnode
*node
, *nnode
;
3705 if (peer
->update_if
)
3707 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3708 && strcmp (peer
->update_if
, ifname
) == 0)
3711 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3712 peer
->update_if
= NULL
;
3715 if (peer
->update_source
)
3717 sockunion_free (peer
->update_source
);
3718 peer
->update_source
= NULL
;
3721 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3723 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3725 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3727 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3728 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3729 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3732 bgp_session_reset(peer
);
3736 /* peer-group member updates. */
3737 group
= peer
->group
;
3738 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3740 if (peer
->update_if
)
3742 if (strcmp (peer
->update_if
, ifname
) == 0)
3745 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3746 peer
->update_if
= NULL
;
3749 if (peer
->update_source
)
3751 sockunion_free (peer
->update_source
);
3752 peer
->update_source
= NULL
;
3755 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3757 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3759 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3760 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3761 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3764 bgp_session_reset(peer
);
3770 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3772 struct peer_group
*group
;
3773 struct listnode
*node
, *nnode
;
3775 if (peer
->update_source
)
3777 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3778 && sockunion_cmp (peer
->update_source
, su
) == 0)
3780 sockunion_free (peer
->update_source
);
3781 peer
->update_source
= NULL
;
3784 if (peer
->update_if
)
3786 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3787 peer
->update_if
= NULL
;
3791 peer
->update_source
= sockunion_dup (su
);
3793 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3795 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3797 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3798 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3799 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3802 bgp_session_reset(peer
);
3806 /* peer-group member updates. */
3807 group
= peer
->group
;
3808 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3810 if (peer
->update_source
)
3812 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3814 sockunion_free (peer
->update_source
);
3815 peer
->update_source
= NULL
;
3818 if (peer
->update_if
)
3820 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3821 peer
->update_if
= NULL
;
3824 peer
->update_source
= sockunion_dup (su
);
3826 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3828 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3829 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3830 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3833 bgp_session_reset(peer
);
3839 peer_update_source_unset (struct peer
*peer
)
3841 union sockunion
*su
;
3842 struct peer_group
*group
;
3843 struct listnode
*node
, *nnode
;
3845 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3846 && ! peer
->update_source
3847 && ! peer
->update_if
)
3850 if (peer
->update_source
)
3852 sockunion_free (peer
->update_source
);
3853 peer
->update_source
= NULL
;
3855 if (peer
->update_if
)
3857 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3858 peer
->update_if
= NULL
;
3861 if (peer_group_active (peer
))
3863 group
= peer
->group
;
3865 if (group
->conf
->update_source
)
3867 su
= sockunion_dup (group
->conf
->update_source
);
3868 peer
->update_source
= su
;
3870 else if (group
->conf
->update_if
)
3872 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3875 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3877 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3879 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3880 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3881 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3884 bgp_session_reset(peer
);
3888 /* peer-group member updates. */
3889 group
= peer
->group
;
3890 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3892 if (! peer
->update_source
&& ! peer
->update_if
)
3895 if (peer
->update_source
)
3897 sockunion_free (peer
->update_source
);
3898 peer
->update_source
= NULL
;
3901 if (peer
->update_if
)
3903 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3904 peer
->update_if
= NULL
;
3907 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3909 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3910 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3911 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3914 bgp_session_reset(peer
);
3920 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3923 struct peer_group
*group
;
3924 struct listnode
*node
, *nnode
;
3926 /* Adress family must be activated. */
3927 if (! peer
->afc
[afi
][safi
])
3928 return BGP_ERR_PEER_INACTIVE
;
3930 /* Default originate can't be used for peer group memeber. */
3931 if (peer_is_group_member (peer
, afi
, safi
))
3932 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3934 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3935 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3936 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3938 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3942 if (peer
->default_rmap
[afi
][safi
].name
)
3943 free (peer
->default_rmap
[afi
][safi
].name
);
3944 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3945 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3949 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3951 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
3952 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3953 bgp_default_originate (peer
, afi
, safi
, 0);
3954 bgp_announce_route (peer
, afi
, safi
);
3959 /* peer-group member updates. */
3960 group
= peer
->group
;
3961 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3963 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3967 if (peer
->default_rmap
[afi
][safi
].name
)
3968 free (peer
->default_rmap
[afi
][safi
].name
);
3969 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3970 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3973 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
3974 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
3975 bgp_default_originate (peer
, afi
, safi
, 0);
3976 bgp_announce_route (peer
, afi
, safi
);
3983 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3985 struct peer_group
*group
;
3986 struct listnode
*node
, *nnode
;
3988 /* Adress family must be activated. */
3989 if (! peer
->afc
[afi
][safi
])
3990 return BGP_ERR_PEER_INACTIVE
;
3992 /* Default originate can't be used for peer group memeber. */
3993 if (peer_is_group_member (peer
, afi
, safi
))
3994 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3996 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3998 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4000 if (peer
->default_rmap
[afi
][safi
].name
)
4001 free (peer
->default_rmap
[afi
][safi
].name
);
4002 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4003 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4006 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4008 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4009 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4010 bgp_default_originate (peer
, afi
, safi
, 1);
4011 bgp_announce_route (peer
, afi
, safi
);
4016 /* peer-group member updates. */
4017 group
= peer
->group
;
4018 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4020 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
4022 if (peer
->default_rmap
[afi
][safi
].name
)
4023 free (peer
->default_rmap
[afi
][safi
].name
);
4024 peer
->default_rmap
[afi
][safi
].name
= NULL
;
4025 peer
->default_rmap
[afi
][safi
].map
= NULL
;
4027 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
]) {
4028 update_group_adjust_peer(peer_af_find(peer
, afi
, safi
));
4029 bgp_default_originate (peer
, afi
, safi
, 1);
4030 bgp_announce_route (peer
, afi
, safi
);
4037 peer_port_set (struct peer
*peer
, u_int16_t port
)
4044 peer_port_unset (struct peer
*peer
)
4046 peer
->port
= BGP_PORT_DEFAULT
;
4050 /* neighbor weight. */
4052 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
4054 struct peer_group
*group
;
4055 struct listnode
*node
, *nnode
;
4057 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4058 peer
->weight
= weight
;
4060 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4063 /* peer-group member updates. */
4064 group
= peer
->group
;
4065 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4067 peer
->weight
= group
->conf
->weight
;
4072 peer_weight_unset (struct peer
*peer
)
4074 struct peer_group
*group
;
4075 struct listnode
*node
, *nnode
;
4077 /* Set default weight. */
4078 if (peer_group_active (peer
))
4079 peer
->weight
= peer
->group
->conf
->weight
;
4083 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
4085 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4088 /* peer-group member updates. */
4089 group
= peer
->group
;
4090 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4098 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
4100 struct peer_group
*group
;
4101 struct listnode
*node
, *nnode
;
4103 /* Not for peer group memeber. */
4104 if (peer_group_active (peer
))
4105 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4107 /* keepalive value check. */
4108 if (keepalive
> 65535)
4109 return BGP_ERR_INVALID_VALUE
;
4111 /* Holdtime value check. */
4112 if (holdtime
> 65535)
4113 return BGP_ERR_INVALID_VALUE
;
4115 /* Holdtime value must be either 0 or greater than 3. */
4116 if (holdtime
< 3 && holdtime
!= 0)
4117 return BGP_ERR_INVALID_VALUE
;
4119 /* Set value to the configuration. */
4120 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4121 peer
->holdtime
= holdtime
;
4122 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
4124 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4127 /* peer-group member updates. */
4128 group
= peer
->group
;
4129 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4131 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4132 peer
->holdtime
= group
->conf
->holdtime
;
4133 peer
->keepalive
= group
->conf
->keepalive
;
4139 peer_timers_unset (struct peer
*peer
)
4141 struct peer_group
*group
;
4142 struct listnode
*node
, *nnode
;
4144 if (peer_group_active (peer
))
4145 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4147 /* Clear configuration. */
4148 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4149 peer
->keepalive
= 0;
4152 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4155 /* peer-group member updates. */
4156 group
= peer
->group
;
4157 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4159 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
4161 peer
->keepalive
= 0;
4168 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
4170 struct peer_group
*group
;
4171 struct listnode
*node
, *nnode
;
4173 if (peer_group_active (peer
))
4174 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4176 if (connect
> 65535)
4177 return BGP_ERR_INVALID_VALUE
;
4179 /* Set value to the configuration. */
4180 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4181 peer
->connect
= connect
;
4183 /* Set value to timer setting. */
4184 peer
->v_connect
= connect
;
4186 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4189 /* peer-group member updates. */
4190 group
= peer
->group
;
4191 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4193 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4194 peer
->connect
= connect
;
4195 peer
->v_connect
= connect
;
4201 peer_timers_connect_unset (struct peer
*peer
)
4203 struct peer_group
*group
;
4204 struct listnode
*node
, *nnode
;
4206 if (peer_group_active (peer
))
4207 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4209 /* Clear configuration. */
4210 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4213 /* Set timer setting to default value. */
4214 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4216 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4219 /* peer-group member updates. */
4220 group
= peer
->group
;
4221 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4223 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
4225 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
4231 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
4233 struct peer_group
*group
;
4234 struct listnode
*node
, *nnode
;
4236 if (peer_group_active (peer
))
4237 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4240 return BGP_ERR_INVALID_VALUE
;
4242 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4243 peer
->routeadv
= routeadv
;
4244 peer
->v_routeadv
= routeadv
;
4246 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4247 update_group_adjust_peer_afs (peer
);
4248 if (peer
->status
== Established
)
4249 bgp_announce_route_all (peer
);
4253 /* peer-group member updates. */
4254 group
= peer
->group
;
4255 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4257 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4258 peer
->routeadv
= routeadv
;
4259 peer
->v_routeadv
= routeadv
;
4260 update_group_adjust_peer_afs (peer
);
4261 if (peer
->status
== Established
)
4262 bgp_announce_route_all (peer
);
4269 peer_advertise_interval_unset (struct peer
*peer
)
4271 struct peer_group
*group
;
4272 struct listnode
*node
, *nnode
;
4274 if (peer_group_active (peer
))
4275 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4277 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4280 if (peer
->sort
== BGP_PEER_IBGP
)
4281 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4283 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4285 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)) {
4286 update_group_adjust_peer_afs (peer
);
4287 if (peer
->status
== Established
)
4288 bgp_announce_route_all (peer
);
4292 /* peer-group member updates. */
4293 group
= peer
->group
;
4294 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4296 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
4299 if (peer
->sort
== BGP_PEER_IBGP
)
4300 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
4302 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
4304 update_group_adjust_peer_afs (peer
);
4305 if (peer
->status
== Established
)
4306 bgp_announce_route_all (peer
);
4312 /* neighbor interface */
4314 peer_interface_set (struct peer
*peer
, const char *str
)
4317 free (peer
->ifname
);
4318 peer
->ifname
= strdup (str
);
4322 peer_interface_unset (struct peer
*peer
)
4325 free (peer
->ifname
);
4326 peer
->ifname
= NULL
;
4331 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
4333 struct peer_group
*group
;
4334 struct listnode
*node
, *nnode
;
4336 if (allow_num
< 1 || allow_num
> 10)
4337 return BGP_ERR_INVALID_VALUE
;
4339 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4341 peer
->allowas_in
[afi
][safi
] = allow_num
;
4342 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4343 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4346 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4349 group
= peer
->group
;
4350 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4352 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
4354 peer
->allowas_in
[afi
][safi
] = allow_num
;
4355 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
4356 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
4364 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4366 struct peer_group
*group
;
4367 struct listnode
*node
, *nnode
;
4369 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4371 peer
->allowas_in
[afi
][safi
] = 0;
4372 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4375 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4378 group
= peer
->group
;
4379 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4381 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
4383 peer
->allowas_in
[afi
][safi
] = 0;
4384 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
4391 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
4393 struct bgp
*bgp
= peer
->bgp
;
4394 struct peer_group
*group
;
4395 struct listnode
*node
, *nnode
;
4397 if (peer_sort (peer
) != BGP_PEER_EBGP
4398 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
4399 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
4402 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
4404 if (peer_group_active (peer
))
4405 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4408 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
4410 if (peer
->change_local_as
== as
&&
4411 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
4412 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
4413 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
4414 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
4417 peer
->change_local_as
= as
;
4419 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4421 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4424 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4426 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4428 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4430 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4432 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4433 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4434 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4437 bgp_session_reset(peer
);
4441 group
= peer
->group
;
4442 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4444 peer
->change_local_as
= as
;
4446 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4448 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4451 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4453 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4455 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4457 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4458 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4459 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4462 BGP_EVENT_ADD (peer
, BGP_Stop
);
4469 peer_local_as_unset (struct peer
*peer
)
4471 struct peer_group
*group
;
4472 struct listnode
*node
, *nnode
;
4474 if (peer_group_active (peer
))
4475 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4477 if (! peer
->change_local_as
)
4480 peer
->change_local_as
= 0;
4481 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4482 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4484 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4486 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4488 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4489 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4490 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4493 BGP_EVENT_ADD (peer
, BGP_Stop
);
4498 group
= peer
->group
;
4499 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4501 peer
->change_local_as
= 0;
4502 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
4503 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
4505 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4507 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
4508 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4509 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4512 bgp_session_reset(peer
);
4517 /* Set password for authenticating with the peer. */
4519 peer_password_set (struct peer
*peer
, const char *password
)
4521 struct listnode
*nn
, *nnode
;
4522 int len
= password
? strlen(password
) : 0;
4523 int ret
= BGP_SUCCESS
;
4525 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
4526 return BGP_ERR_INVALID_VALUE
;
4528 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
4529 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4533 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4535 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
4537 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4539 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4540 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4542 bgp_session_reset(peer
);
4544 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
4547 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4549 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
4553 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4555 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
4557 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4558 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4560 bgp_session_reset(peer
);
4562 if (bgp_md5_set (peer
) < 0)
4563 ret
= BGP_ERR_TCPSIG_FAILED
;
4570 peer_password_unset (struct peer
*peer
)
4572 struct listnode
*nn
, *nnode
;
4575 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4578 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4580 if (peer_group_active (peer
)
4581 && peer
->group
->conf
->password
4582 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
4583 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
4585 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4586 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4588 bgp_session_reset(peer
);
4591 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4593 peer
->password
= NULL
;
4600 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4601 peer
->password
= NULL
;
4603 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4605 if (!peer
->password
)
4608 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4609 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4611 bgp_session_reset(peer
);
4613 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4614 peer
->password
= NULL
;
4623 * Helper function that is called after the name of the policy
4624 * being used by a peer has changed (AF specific). Automatically
4625 * initiates inbound or outbound processing as needed.
4628 peer_on_policy_change (struct peer
*peer
, afi_t afi
, safi_t safi
, int outbound
)
4632 update_group_adjust_peer (peer_af_find (peer
, afi
, safi
));
4633 if (peer
->status
== Established
)
4634 bgp_announce_route(peer
, afi
, safi
);
4638 if (peer
->status
!= Established
)
4641 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4642 bgp_soft_reconfig_in (peer
, afi
, safi
);
4643 else if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4644 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4645 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4650 /* Set distribute list to the peer. */
4652 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4655 struct bgp_filter
*filter
;
4656 struct peer_group
*group
;
4657 struct listnode
*node
, *nnode
;
4659 if (! peer
->afc
[afi
][safi
])
4660 return BGP_ERR_PEER_INACTIVE
;
4662 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4663 return BGP_ERR_INVALID_VALUE
;
4665 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4666 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4668 filter
= &peer
->filter
[afi
][safi
];
4670 if (filter
->plist
[direct
].name
)
4671 return BGP_ERR_PEER_FILTER_CONFLICT
;
4673 if (filter
->dlist
[direct
].name
)
4674 free (filter
->dlist
[direct
].name
);
4675 filter
->dlist
[direct
].name
= strdup (name
);
4676 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4678 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4680 peer_on_policy_change(peer
, afi
, safi
,
4681 (direct
== FILTER_OUT
) ? 1 : 0);
4685 group
= peer
->group
;
4686 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4688 filter
= &peer
->filter
[afi
][safi
];
4690 if (! peer
->af_group
[afi
][safi
])
4693 if (filter
->dlist
[direct
].name
)
4694 free (filter
->dlist
[direct
].name
);
4695 filter
->dlist
[direct
].name
= strdup (name
);
4696 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4697 peer_on_policy_change(peer
, afi
, safi
,
4698 (direct
== FILTER_OUT
) ? 1 : 0);
4705 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4707 struct bgp_filter
*filter
;
4708 struct bgp_filter
*gfilter
;
4709 struct peer_group
*group
;
4710 struct listnode
*node
, *nnode
;
4712 if (! peer
->afc
[afi
][safi
])
4713 return BGP_ERR_PEER_INACTIVE
;
4715 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4716 return BGP_ERR_INVALID_VALUE
;
4718 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4719 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4721 filter
= &peer
->filter
[afi
][safi
];
4723 /* apply peer-group filter */
4724 if (peer
->af_group
[afi
][safi
])
4726 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4728 if (gfilter
->dlist
[direct
].name
)
4730 if (filter
->dlist
[direct
].name
)
4731 free (filter
->dlist
[direct
].name
);
4732 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
4733 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4734 peer_on_policy_change(peer
, afi
, safi
,
4735 (direct
== FILTER_OUT
) ? 1 : 0);
4740 if (filter
->dlist
[direct
].name
)
4741 free (filter
->dlist
[direct
].name
);
4742 filter
->dlist
[direct
].name
= NULL
;
4743 filter
->dlist
[direct
].alist
= NULL
;
4745 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4747 peer_on_policy_change(peer
, afi
, safi
,
4748 (direct
== FILTER_OUT
) ? 1 : 0);
4752 group
= peer
->group
;
4753 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4755 filter
= &peer
->filter
[afi
][safi
];
4757 if (! peer
->af_group
[afi
][safi
])
4760 if (filter
->dlist
[direct
].name
)
4761 free (filter
->dlist
[direct
].name
);
4762 filter
->dlist
[direct
].name
= NULL
;
4763 filter
->dlist
[direct
].alist
= NULL
;
4764 peer_on_policy_change(peer
, afi
, safi
,
4765 (direct
== FILTER_OUT
) ? 1 : 0);
4771 /* Update distribute list. */
4773 peer_distribute_update (struct access_list
*access
)
4778 struct listnode
*mnode
, *mnnode
;
4779 struct listnode
*node
, *nnode
;
4782 struct peer_group
*group
;
4783 struct bgp_filter
*filter
;
4785 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4788 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, access
->name
,
4790 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4792 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4793 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4795 filter
= &peer
->filter
[afi
][safi
];
4797 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4799 if (filter
->dlist
[direct
].name
)
4800 filter
->dlist
[direct
].alist
=
4801 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4803 filter
->dlist
[direct
].alist
= NULL
;
4807 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4809 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4810 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4812 filter
= &group
->conf
->filter
[afi
][safi
];
4814 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4816 if (filter
->dlist
[direct
].name
)
4817 filter
->dlist
[direct
].alist
=
4818 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4820 filter
->dlist
[direct
].alist
= NULL
;
4827 /* Set prefix list to the peer. */
4829 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4832 struct bgp_filter
*filter
;
4833 struct peer_group
*group
;
4834 struct listnode
*node
, *nnode
;
4836 if (! peer
->afc
[afi
][safi
])
4837 return BGP_ERR_PEER_INACTIVE
;
4839 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4840 return BGP_ERR_INVALID_VALUE
;
4842 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4843 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4845 filter
= &peer
->filter
[afi
][safi
];
4847 if (filter
->dlist
[direct
].name
)
4848 return BGP_ERR_PEER_FILTER_CONFLICT
;
4850 if (filter
->plist
[direct
].name
)
4851 free (filter
->plist
[direct
].name
);
4852 filter
->plist
[direct
].name
= strdup (name
);
4853 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4855 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4857 peer_on_policy_change(peer
, afi
, safi
,
4858 (direct
== FILTER_OUT
) ? 1 : 0);
4862 group
= peer
->group
;
4863 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4865 filter
= &peer
->filter
[afi
][safi
];
4867 if (! peer
->af_group
[afi
][safi
])
4870 if (filter
->plist
[direct
].name
)
4871 free (filter
->plist
[direct
].name
);
4872 filter
->plist
[direct
].name
= strdup (name
);
4873 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4874 peer_on_policy_change(peer
, afi
, safi
,
4875 (direct
== FILTER_OUT
) ? 1 : 0);
4881 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4883 struct bgp_filter
*filter
;
4884 struct bgp_filter
*gfilter
;
4885 struct peer_group
*group
;
4886 struct listnode
*node
, *nnode
;
4888 if (! peer
->afc
[afi
][safi
])
4889 return BGP_ERR_PEER_INACTIVE
;
4891 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4892 return BGP_ERR_INVALID_VALUE
;
4894 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4895 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4897 filter
= &peer
->filter
[afi
][safi
];
4899 /* apply peer-group filter */
4900 if (peer
->af_group
[afi
][safi
])
4902 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4904 if (gfilter
->plist
[direct
].name
)
4906 if (filter
->plist
[direct
].name
)
4907 free (filter
->plist
[direct
].name
);
4908 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
4909 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
4910 peer_on_policy_change(peer
, afi
, safi
,
4911 (direct
== FILTER_OUT
) ? 1 : 0);
4916 if (filter
->plist
[direct
].name
)
4917 free (filter
->plist
[direct
].name
);
4918 filter
->plist
[direct
].name
= NULL
;
4919 filter
->plist
[direct
].plist
= NULL
;
4921 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4923 peer_on_policy_change(peer
, afi
, safi
,
4924 (direct
== FILTER_OUT
) ? 1 : 0);
4928 group
= peer
->group
;
4929 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4931 filter
= &peer
->filter
[afi
][safi
];
4933 if (! peer
->af_group
[afi
][safi
])
4936 if (filter
->plist
[direct
].name
)
4937 free (filter
->plist
[direct
].name
);
4938 filter
->plist
[direct
].name
= NULL
;
4939 filter
->plist
[direct
].plist
= NULL
;
4940 peer_on_policy_change(peer
, afi
, safi
,
4941 (direct
== FILTER_OUT
) ? 1 : 0);
4947 /* Update prefix-list list. */
4949 peer_prefix_list_update (struct prefix_list
*plist
)
4951 struct listnode
*mnode
, *mnnode
;
4952 struct listnode
*node
, *nnode
;
4955 struct peer_group
*group
;
4956 struct bgp_filter
*filter
;
4961 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4965 * Update the prefix-list on update groups.
4967 update_group_policy_update(bgp
, BGP_POLICY_PREFIX_LIST
,
4968 plist
? plist
->name
: NULL
, 0, 0);
4970 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4972 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4973 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4975 filter
= &peer
->filter
[afi
][safi
];
4977 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4979 if (filter
->plist
[direct
].name
)
4980 filter
->plist
[direct
].plist
=
4981 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4983 filter
->plist
[direct
].plist
= NULL
;
4987 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4989 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4990 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4992 filter
= &group
->conf
->filter
[afi
][safi
];
4994 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4996 if (filter
->plist
[direct
].name
)
4997 filter
->plist
[direct
].plist
=
4998 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
5000 filter
->plist
[direct
].plist
= NULL
;
5008 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5011 struct bgp_filter
*filter
;
5012 struct peer_group
*group
;
5013 struct listnode
*node
, *nnode
;
5015 if (! peer
->afc
[afi
][safi
])
5016 return BGP_ERR_PEER_INACTIVE
;
5018 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5019 return BGP_ERR_INVALID_VALUE
;
5021 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5022 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5024 filter
= &peer
->filter
[afi
][safi
];
5026 if (filter
->aslist
[direct
].name
)
5027 free (filter
->aslist
[direct
].name
);
5028 filter
->aslist
[direct
].name
= strdup (name
);
5029 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5031 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5033 peer_on_policy_change(peer
, afi
, safi
,
5034 (direct
== FILTER_OUT
) ? 1 : 0);
5038 group
= peer
->group
;
5039 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5041 filter
= &peer
->filter
[afi
][safi
];
5043 if (! peer
->af_group
[afi
][safi
])
5046 if (filter
->aslist
[direct
].name
)
5047 free (filter
->aslist
[direct
].name
);
5048 filter
->aslist
[direct
].name
= strdup (name
);
5049 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
5050 peer_on_policy_change(peer
, afi
, safi
,
5051 (direct
== FILTER_OUT
) ? 1 : 0);
5057 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
5059 struct bgp_filter
*filter
;
5060 struct bgp_filter
*gfilter
;
5061 struct peer_group
*group
;
5062 struct listnode
*node
, *nnode
;
5064 if (! peer
->afc
[afi
][safi
])
5065 return BGP_ERR_PEER_INACTIVE
;
5067 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
5068 return BGP_ERR_INVALID_VALUE
;
5070 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
5071 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5073 filter
= &peer
->filter
[afi
][safi
];
5075 /* apply peer-group filter */
5076 if (peer
->af_group
[afi
][safi
])
5078 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5080 if (gfilter
->aslist
[direct
].name
)
5082 if (filter
->aslist
[direct
].name
)
5083 free (filter
->aslist
[direct
].name
);
5084 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
5085 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
5086 peer_on_policy_change(peer
, afi
, safi
,
5087 (direct
== FILTER_OUT
) ? 1 : 0);
5092 if (filter
->aslist
[direct
].name
)
5093 free (filter
->aslist
[direct
].name
);
5094 filter
->aslist
[direct
].name
= NULL
;
5095 filter
->aslist
[direct
].aslist
= NULL
;
5097 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5099 peer_on_policy_change(peer
, afi
, safi
,
5100 (direct
== FILTER_OUT
) ? 1 : 0);
5104 group
= peer
->group
;
5105 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5107 filter
= &peer
->filter
[afi
][safi
];
5109 if (! peer
->af_group
[afi
][safi
])
5112 if (filter
->aslist
[direct
].name
)
5113 free (filter
->aslist
[direct
].name
);
5114 filter
->aslist
[direct
].name
= NULL
;
5115 filter
->aslist
[direct
].aslist
= NULL
;
5116 peer_on_policy_change(peer
, afi
, safi
,
5117 (direct
== FILTER_OUT
) ? 1 : 0);
5124 peer_aslist_update (const char *aslist_name
)
5129 struct listnode
*mnode
, *mnnode
;
5130 struct listnode
*node
, *nnode
;
5133 struct peer_group
*group
;
5134 struct bgp_filter
*filter
;
5136 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5138 update_group_policy_update(bgp
, BGP_POLICY_FILTER_LIST
, aslist_name
,
5141 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5143 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5144 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5146 filter
= &peer
->filter
[afi
][safi
];
5148 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5150 if (filter
->aslist
[direct
].name
)
5151 filter
->aslist
[direct
].aslist
=
5152 as_list_lookup (filter
->aslist
[direct
].name
);
5154 filter
->aslist
[direct
].aslist
= NULL
;
5158 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5160 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
5161 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
5163 filter
= &group
->conf
->filter
[afi
][safi
];
5165 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
5167 if (filter
->aslist
[direct
].name
)
5168 filter
->aslist
[direct
].aslist
=
5169 as_list_lookup (filter
->aslist
[direct
].name
);
5171 filter
->aslist
[direct
].aslist
= NULL
;
5179 peer_aslist_add (char *aslist_name
)
5181 peer_aslist_update (aslist_name
);
5182 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
5186 peer_aslist_del (const char *aslist_name
)
5188 peer_aslist_update (aslist_name
);
5189 route_map_notify_dependencies(aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
5194 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
5197 struct bgp_filter
*filter
;
5198 struct peer_group
*group
;
5199 struct listnode
*node
, *nnode
;
5201 if (! peer
->afc
[afi
][safi
])
5202 return BGP_ERR_PEER_INACTIVE
;
5204 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5205 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5206 return BGP_ERR_INVALID_VALUE
;
5208 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5209 && peer_is_group_member (peer
, afi
, safi
))
5210 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5212 filter
= &peer
->filter
[afi
][safi
];
5214 if (filter
->map
[direct
].name
)
5215 free (filter
->map
[direct
].name
);
5217 filter
->map
[direct
].name
= strdup (name
);
5218 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5220 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5222 peer_on_policy_change(peer
, afi
, safi
,
5223 (direct
== RMAP_OUT
) ? 1 : 0);
5227 group
= peer
->group
;
5228 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5230 filter
= &peer
->filter
[afi
][safi
];
5232 if (! peer
->af_group
[afi
][safi
])
5235 if (filter
->map
[direct
].name
)
5236 free (filter
->map
[direct
].name
);
5237 filter
->map
[direct
].name
= strdup (name
);
5238 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
5239 peer_on_policy_change(peer
, afi
, safi
,
5240 (direct
== RMAP_OUT
) ? 1 : 0);
5245 /* Unset route-map from the peer. */
5247 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
5249 struct bgp_filter
*filter
;
5250 struct bgp_filter
*gfilter
;
5251 struct peer_group
*group
;
5252 struct listnode
*node
, *nnode
;
5254 if (! peer
->afc
[afi
][safi
])
5255 return BGP_ERR_PEER_INACTIVE
;
5257 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
5258 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
5259 return BGP_ERR_INVALID_VALUE
;
5261 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
5262 && peer_is_group_member (peer
, afi
, safi
))
5263 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5265 filter
= &peer
->filter
[afi
][safi
];
5267 /* apply peer-group filter */
5268 if (peer
->af_group
[afi
][safi
])
5270 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5272 if (gfilter
->map
[direct
].name
)
5274 if (filter
->map
[direct
].name
)
5275 free (filter
->map
[direct
].name
);
5276 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
5277 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
5278 peer_on_policy_change(peer
, afi
, safi
,
5279 (direct
== RMAP_OUT
) ? 1 : 0);
5284 if (filter
->map
[direct
].name
)
5285 free (filter
->map
[direct
].name
);
5286 filter
->map
[direct
].name
= NULL
;
5287 filter
->map
[direct
].map
= NULL
;
5289 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5291 peer_on_policy_change(peer
, afi
, safi
,
5292 (direct
== RMAP_OUT
) ? 1 : 0);
5296 group
= peer
->group
;
5297 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5299 filter
= &peer
->filter
[afi
][safi
];
5301 if (! peer
->af_group
[afi
][safi
])
5304 if (filter
->map
[direct
].name
)
5305 free (filter
->map
[direct
].name
);
5306 filter
->map
[direct
].name
= NULL
;
5307 filter
->map
[direct
].map
= NULL
;
5308 peer_on_policy_change(peer
, afi
, safi
,
5309 (direct
== RMAP_OUT
) ? 1 : 0);
5314 /* Set unsuppress-map to the peer. */
5316 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5319 struct bgp_filter
*filter
;
5320 struct peer_group
*group
;
5321 struct listnode
*node
, *nnode
;
5323 if (! peer
->afc
[afi
][safi
])
5324 return BGP_ERR_PEER_INACTIVE
;
5326 if (peer_is_group_member (peer
, afi
, safi
))
5327 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5329 filter
= &peer
->filter
[afi
][safi
];
5331 if (filter
->usmap
.name
)
5332 free (filter
->usmap
.name
);
5334 filter
->usmap
.name
= strdup (name
);
5335 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5337 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5339 peer_on_policy_change(peer
, afi
, safi
, 1);
5343 group
= peer
->group
;
5344 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5346 filter
= &peer
->filter
[afi
][safi
];
5348 if (! peer
->af_group
[afi
][safi
])
5351 if (filter
->usmap
.name
)
5352 free (filter
->usmap
.name
);
5353 filter
->usmap
.name
= strdup (name
);
5354 filter
->usmap
.map
= route_map_lookup_by_name (name
);
5355 peer_on_policy_change(peer
, afi
, safi
, 1);
5360 /* Unset route-map from the peer. */
5362 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5364 struct bgp_filter
*filter
;
5365 struct peer_group
*group
;
5366 struct listnode
*node
, *nnode
;
5368 if (! peer
->afc
[afi
][safi
])
5369 return BGP_ERR_PEER_INACTIVE
;
5371 if (peer_is_group_member (peer
, afi
, safi
))
5372 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
5374 filter
= &peer
->filter
[afi
][safi
];
5376 if (filter
->usmap
.name
)
5377 free (filter
->usmap
.name
);
5378 filter
->usmap
.name
= NULL
;
5379 filter
->usmap
.map
= NULL
;
5381 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5383 peer_on_policy_change(peer
, afi
, safi
, 1);
5387 group
= peer
->group
;
5388 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5390 filter
= &peer
->filter
[afi
][safi
];
5392 if (! peer
->af_group
[afi
][safi
])
5395 if (filter
->usmap
.name
)
5396 free (filter
->usmap
.name
);
5397 filter
->usmap
.name
= NULL
;
5398 filter
->usmap
.map
= NULL
;
5399 peer_on_policy_change(peer
, afi
, safi
, 1);
5405 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
5406 u_int32_t max
, u_char threshold
,
5407 int warning
, u_int16_t restart
)
5409 struct peer_group
*group
;
5410 struct listnode
*node
, *nnode
;
5412 if (! peer
->afc
[afi
][safi
])
5413 return BGP_ERR_PEER_INACTIVE
;
5415 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5416 peer
->pmax
[afi
][safi
] = max
;
5417 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5418 peer
->pmax_restart
[afi
][safi
] = restart
;
5420 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5422 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5424 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5426 group
= peer
->group
;
5427 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5429 if (! peer
->af_group
[afi
][safi
])
5432 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5433 peer
->pmax
[afi
][safi
] = max
;
5434 peer
->pmax_threshold
[afi
][safi
] = threshold
;
5435 peer
->pmax_restart
[afi
][safi
] = restart
;
5437 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5439 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5441 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5442 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5447 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
5448 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
5455 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
5457 struct peer_group
*group
;
5458 struct listnode
*node
, *nnode
;
5460 if (! peer
->afc
[afi
][safi
])
5461 return BGP_ERR_PEER_INACTIVE
;
5463 /* apply peer-group config */
5464 if (peer
->af_group
[afi
][safi
])
5466 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5467 PEER_FLAG_MAX_PREFIX
))
5468 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5470 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5472 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
5473 PEER_FLAG_MAX_PREFIX_WARNING
))
5474 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5476 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5478 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
5479 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
5480 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
5484 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5485 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5486 peer
->pmax
[afi
][safi
] = 0;
5487 peer
->pmax_threshold
[afi
][safi
] = 0;
5488 peer
->pmax_restart
[afi
][safi
] = 0;
5490 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5493 group
= peer
->group
;
5494 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5496 if (! peer
->af_group
[afi
][safi
])
5499 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
5500 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
5501 peer
->pmax
[afi
][safi
] = 0;
5502 peer
->pmax_threshold
[afi
][safi
] = 0;
5503 peer
->pmax_restart
[afi
][safi
] = 0;
5508 int is_ebgp_multihop_configured (struct peer
*peer
)
5510 struct peer_group
*group
;
5511 struct listnode
*node
, *nnode
;
5514 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5516 group
= peer
->group
;
5517 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5518 (group
->conf
->ttl
!= 1))
5521 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
5523 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
5530 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
5537 /* Set # of hops between us and BGP peer. */
5539 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
5541 struct peer_group
*group
;
5542 struct listnode
*node
, *nnode
;
5545 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
5547 /* We cannot configure ttl-security hops when ebgp-multihop is already
5548 set. For non peer-groups, the check is simple. For peer-groups, it's
5549 slightly messy, because we need to check both the peer-group structure
5550 and all peer-group members for any trace of ebgp-multihop configuration
5551 before actually applying the ttl-security rules. Cisco really made a
5552 mess of this configuration parameter, and OpenBGPD got it right.
5555 if ((peer
->gtsm_hops
== 0) && (peer
->sort
!= BGP_PEER_IBGP
))
5557 if (is_ebgp_multihop_configured (peer
))
5558 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
5560 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5562 peer
->gtsm_hops
= gtsm_hops
;
5564 /* Calling ebgp multihop also resets the session.
5565 * On restart, NHT will get setup correctly as will the
5566 * min & max ttls on the socket. The return value is
5569 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5576 group
= peer
->group
;
5577 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5579 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5581 /* Calling ebgp multihop also resets the session.
5582 * On restart, NHT will get setup correctly as will the
5583 * min & max ttls on the socket. The return value is
5586 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
5592 /* Post the first gtsm setup or if its ibgp, maxttl setting isn't
5593 * necessary, just set the minttl.
5595 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5597 peer
->gtsm_hops
= gtsm_hops
;
5600 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5601 MAXTTL
+ 1 - gtsm_hops
);
5602 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5603 (peer
->doppelganger
->fd
>= 0))
5604 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5605 MAXTTL
+ 1 - gtsm_hops
);
5609 group
= peer
->group
;
5610 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5612 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
5614 /* Change setting of existing peer
5615 * established then change value (may break connectivity)
5616 * not established yet (teardown session and restart)
5617 * no session then do nothing (will get handled by next connection)
5619 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
5620 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
5621 MAXTTL
+ 1 - peer
->gtsm_hops
);
5622 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5623 (peer
->doppelganger
->fd
>= 0))
5624 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
5625 MAXTTL
+ 1 - gtsm_hops
);
5635 peer_ttl_security_hops_unset (struct peer
*peer
)
5637 struct peer_group
*group
;
5638 struct listnode
*node
, *nnode
;
5641 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
5643 /* if a peer-group member, then reset to peer-group default rather than 0 */
5644 if (peer_group_active (peer
))
5645 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
5647 peer
->gtsm_hops
= 0;
5649 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5651 /* Invoking ebgp_multihop_set will set the TTL back to the original
5652 * value as well as restting the NHT and such. The session is reset.
5654 if (peer
->sort
== BGP_PEER_EBGP
)
5655 ret
= peer_ebgp_multihop_unset (peer
);
5659 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5661 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5662 (peer
->doppelganger
->fd
>= 0))
5663 sockopt_minttl (peer
->su
.sa
.sa_family
,
5664 peer
->doppelganger
->fd
, 0);
5669 group
= peer
->group
;
5670 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
5672 peer
->gtsm_hops
= 0;
5673 if (peer
->sort
== BGP_PEER_EBGP
)
5674 ret
= peer_ebgp_multihop_unset (peer
);
5678 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
5680 if ((peer
->status
< Established
) && peer
->doppelganger
&&
5681 (peer
->doppelganger
->fd
>= 0))
5682 sockopt_minttl (peer
->su
.sa
.sa_family
,
5683 peer
->doppelganger
->fd
, 0);
5692 * If peer clear is invoked in a loop for all peers on the BGP instance,
5693 * it may end up freeing the doppelganger, and if this was the next node
5694 * to the current node, we would end up accessing the freed next node.
5695 * Pass along additional parameter which can be updated if next node
5696 * is freed; only required when walking the peer list on BGP instance.
5699 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
5701 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5703 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
5705 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
5706 if (peer
->t_pmax_restart
)
5708 BGP_TIMER_OFF (peer
->t_pmax_restart
);
5709 if (bgp_debug_neighbor_events(peer
))
5710 zlog_debug ("%s Maximum-prefix restart timer canceled",
5713 BGP_EVENT_ADD (peer
, BGP_Start
);
5717 peer
->v_start
= BGP_INIT_START_TIMER
;
5718 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5719 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5720 BGP_NOTIFY_CEASE_ADMIN_RESET
);
5722 bgp_session_reset_safe(peer
, nnode
);
5728 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
5729 enum bgp_clear_type stype
)
5731 struct peer_af
*paf
;
5733 if (peer
->status
!= Established
)
5736 if (! peer
->afc
[afi
][safi
])
5737 return BGP_ERR_AF_UNCONFIGURED
;
5739 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
5741 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
5743 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
5744 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
5747 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
5749 /* Clear the "neighbor x.x.x.x default-originate" flag */
5750 paf
= peer_af_find (peer
, afi
, safi
);
5751 if (paf
&& paf
->subgroup
&&
5752 CHECK_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
5753 UNSET_FLAG (paf
->subgroup
->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
);
5755 bgp_announce_route (peer
, afi
, safi
);
5758 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5760 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
5761 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
5762 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5764 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
5767 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
5768 prefix_type
= ORF_TYPE_PREFIX
;
5770 prefix_type
= ORF_TYPE_PREFIX_OLD
;
5772 if (filter
->plist
[FILTER_IN
].plist
)
5774 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5775 bgp_route_refresh_send (peer
, afi
, safi
,
5776 prefix_type
, REFRESH_DEFER
, 1);
5777 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
5778 REFRESH_IMMEDIATE
, 0);
5782 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5783 bgp_route_refresh_send (peer
, afi
, safi
,
5784 prefix_type
, REFRESH_IMMEDIATE
, 1);
5786 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5792 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
5793 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5795 /* If neighbor has soft reconfiguration inbound flag.
5796 Use Adj-RIB-In database. */
5797 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5798 bgp_soft_reconfig_in (peer
, afi
, safi
);
5801 /* If neighbor has route refresh capability, send route refresh
5802 message to the peer. */
5803 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5804 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5805 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5807 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5813 /* Display peer uptime.*/
5814 /* XXX: why does this function return char * when it takes buffer? */
5816 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
5821 /* Check buffer length. */
5822 if (len
< BGP_UPTIME_LEN
)
5824 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5825 /* XXX: should return status instead of buf... */
5826 snprintf (buf
, len
, "<error> ");
5830 /* If there is no connection has been done before print `never'. */
5833 snprintf (buf
, len
, "never");
5837 /* Get current time. */
5838 uptime1
= bgp_clock ();
5840 tm
= gmtime (&uptime1
);
5842 /* Making formatted timer strings. */
5843 #define ONE_DAY_SECOND 60*60*24
5844 #define ONE_WEEK_SECOND 60*60*24*7
5846 if (uptime1
< ONE_DAY_SECOND
)
5847 snprintf (buf
, len
, "%02d:%02d:%02d",
5848 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5849 else if (uptime1
< ONE_WEEK_SECOND
)
5850 snprintf (buf
, len
, "%dd%02dh%02dm",
5851 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5853 snprintf (buf
, len
, "%02dw%dd%02dh",
5854 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5859 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
5860 afi_t afi
, safi_t safi
)
5862 struct bgp_filter
*filter
;
5863 struct bgp_filter
*gfilter
= NULL
;
5866 int out
= FILTER_OUT
;
5869 filter
= &peer
->filter
[afi
][safi
];
5870 if (peer
->af_group
[afi
][safi
])
5871 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5873 /* distribute-list. */
5874 if (filter
->dlist
[in
].name
)
5875 if (! gfilter
|| ! gfilter
->dlist
[in
].name
5876 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
5877 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
5878 filter
->dlist
[in
].name
, VTY_NEWLINE
);
5879 if (filter
->dlist
[out
].name
&& ! gfilter
)
5880 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
5881 filter
->dlist
[out
].name
, VTY_NEWLINE
);
5884 if (filter
->plist
[in
].name
)
5885 if (! gfilter
|| ! gfilter
->plist
[in
].name
5886 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
5887 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
5888 filter
->plist
[in
].name
, VTY_NEWLINE
);
5889 if (filter
->plist
[out
].name
&& ! gfilter
)
5890 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
5891 filter
->plist
[out
].name
, VTY_NEWLINE
);
5894 if (filter
->map
[RMAP_IN
].name
)
5895 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
5896 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
5897 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
5898 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
5899 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
5900 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
5901 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
5902 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
5903 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
5904 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
5905 if (filter
->map
[RMAP_EXPORT
].name
)
5906 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
5907 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
5908 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
5909 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
5910 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
5912 /* unsuppress-map */
5913 if (filter
->usmap
.name
&& ! gfilter
)
5914 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
5915 filter
->usmap
.name
, VTY_NEWLINE
);
5918 if (filter
->aslist
[in
].name
)
5919 if (! gfilter
|| ! gfilter
->aslist
[in
].name
5920 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
5921 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
5922 filter
->aslist
[in
].name
, VTY_NEWLINE
);
5923 if (filter
->aslist
[out
].name
&& ! gfilter
)
5924 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
5925 filter
->aslist
[out
].name
, VTY_NEWLINE
);
5928 /* BGP peer configuration display function. */
5930 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
5931 struct peer
*peer
, afi_t afi
, safi_t safi
)
5933 struct peer
*g_peer
= NULL
;
5934 char buf
[SU_ADDRSTRLEN
];
5937 /* Skip dynamic neighbors. */
5938 if (peer_dynamic_neighbor (peer
))
5942 addr
= peer
->conf_if
;
5946 if (peer_group_active (peer
))
5947 g_peer
= peer
->group
->conf
;
5949 /************************************
5950 ****** Global to the neighbor ******
5951 ************************************/
5952 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5955 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
5958 if (! peer_group_active (peer
))
5960 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5961 vty_out (vty
, " neighbor %s peer-group%s", addr
,
5963 if (peer
->as_type
== AS_SPECIFIED
)
5965 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
5968 else if (peer
->as_type
== AS_INTERNAL
)
5970 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
5972 else if (peer
->as_type
== AS_EXTERNAL
)
5974 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
5981 if (peer
->as_type
== AS_SPECIFIED
)
5983 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
5986 else if (peer
->as_type
== AS_INTERNAL
)
5988 vty_out (vty
, " neighbor %s remote-as internal%s", addr
, VTY_NEWLINE
);
5990 else if (peer
->as_type
== AS_EXTERNAL
)
5992 vty_out (vty
, " neighbor %s remote-as external%s", addr
, VTY_NEWLINE
);
5995 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
5996 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
5997 peer
->group
->name
, VTY_NEWLINE
);
6001 if (peer
->change_local_as
)
6002 if (! peer_group_active (peer
))
6003 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
6004 peer
->change_local_as
,
6005 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
6007 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
6008 " replace-as" : "", VTY_NEWLINE
);
6012 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
6016 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6017 if (! peer_group_active (peer
) ||
6018 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
6019 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
6022 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_BFD
))
6023 if (! peer_group_active (peer
) ||
6024 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_BFD
))
6026 bgp_bfd_peer_config_write(vty
, peer
, addr
);
6031 if (!peer_group_active (peer
)
6032 || ! g_peer
->password
6033 || strcmp (peer
->password
, g_peer
->password
) != 0)
6034 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
6038 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
))
6039 if (!peer_group_active (peer
))
6040 vty_out (vty
, " neighbor %s solo%s", addr
, VTY_NEWLINE
);
6043 if (peer
->port
!= BGP_PORT_DEFAULT
)
6044 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
6047 /* Local interface name. */
6049 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
6053 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
6054 if (! peer_group_active (peer
) ||
6055 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
6056 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
6058 /* EBGP multihop. */
6059 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
6060 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
6061 if (! peer_group_active (peer
) ||
6062 g_peer
->ttl
!= peer
->ttl
)
6063 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
6066 /* ttl-security hops */
6067 if (peer
->gtsm_hops
!= 0)
6068 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
6069 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
6070 peer
->gtsm_hops
, VTY_NEWLINE
);
6072 /* disable-connected-check. */
6073 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6074 if (! peer_group_active (peer
) ||
6075 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
6076 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
6078 /* Update-source. */
6079 if (peer
->update_if
)
6080 if (! peer_group_active (peer
) || ! g_peer
->update_if
6081 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
6082 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6083 peer
->update_if
, VTY_NEWLINE
);
6084 if (peer
->update_source
)
6085 if (! peer_group_active (peer
) || ! g_peer
->update_source
6086 || sockunion_cmp (g_peer
->update_source
,
6087 peer
->update_source
) != 0)
6088 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
6089 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
6092 /* advertisement-interval */
6093 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
6094 ! peer_group_active (peer
))
6095 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
6096 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
6099 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
6100 && ! peer_group_active (peer
))
6101 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
6102 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
6104 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
6105 ! peer_group_active (peer
))
6106 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
6107 peer
->connect
, VTY_NEWLINE
);
6109 /* Default weight. */
6110 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
6111 if (! peer_group_active (peer
) ||
6112 g_peer
->weight
!= peer
->weight
)
6113 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
6116 /* Dynamic capability. */
6117 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6118 if (! peer_group_active (peer
) ||
6119 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
6120 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
6123 /* Extended next-hop capability. */
6124 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6125 if (! peer_group_active (peer
) ||
6126 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
6127 vty_out (vty
, " neighbor %s capability extended-nexthop%s", addr
,
6130 /* dont capability negotiation. */
6131 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6132 if (! peer_group_active (peer
) ||
6133 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
6134 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
6137 /* override capability negotiation. */
6138 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6139 if (! peer_group_active (peer
) ||
6140 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
6141 vty_out (vty
, " neighbor %s override-capability%s", addr
,
6144 /* strict capability negotiation. */
6145 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6146 if (! peer_group_active (peer
) ||
6147 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
6148 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
6151 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
6153 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6155 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6156 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6160 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
6161 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
6167 /************************************
6168 ****** Per AF to the neighbor ******
6169 ************************************/
6171 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
6173 if (peer
->af_group
[afi
][safi
])
6174 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
6175 peer
->group
->name
, VTY_NEWLINE
);
6177 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
6180 /* ORF capability. */
6181 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6182 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6183 if (! peer
->af_group
[afi
][safi
])
6185 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
6187 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
6188 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
6189 vty_out (vty
, " both");
6190 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
6191 vty_out (vty
, " send");
6193 vty_out (vty
, " receive");
6194 vty_out (vty
, "%s", VTY_NEWLINE
);
6197 /* Route reflector client. */
6198 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
6199 && ! peer
->af_group
[afi
][safi
])
6200 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
6204 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
6205 && ! peer
->af_group
[afi
][safi
])
6206 vty_out (vty
, " neighbor %s next-hop-self%s%s", addr
,
6207 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF_ALL
) ?
6208 " all" : "", VTY_NEWLINE
);
6210 /* remove-private-AS */
6211 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
) && !peer
->af_group
[afi
][safi
])
6213 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
) &&
6214 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6215 vty_out (vty
, " neighbor %s remove-private-AS all replace-AS%s", addr
, VTY_NEWLINE
);
6217 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
6218 vty_out (vty
, " neighbor %s remove-private-AS replace-AS%s", addr
, VTY_NEWLINE
);
6220 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
6221 vty_out (vty
, " neighbor %s remove-private-AS all%s", addr
, VTY_NEWLINE
);
6224 vty_out (vty
, " neighbor %s remove-private-AS%s", addr
, VTY_NEWLINE
);
6228 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
) &&
6229 !peer
->af_group
[afi
][safi
])
6230 vty_out (vty
, " neighbor %s as-override%s", addr
, VTY_NEWLINE
);
6232 /* send-community print. */
6233 if (! peer
->af_group
[afi
][safi
])
6235 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6237 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6238 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6239 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
6240 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6241 vty_out (vty
, " neighbor %s send-community extended%s",
6243 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6244 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
6248 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
6249 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6250 vty_out (vty
, " no neighbor %s send-community both%s",
6252 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
6253 vty_out (vty
, " no neighbor %s send-community extended%s",
6255 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
6256 vty_out (vty
, " no neighbor %s send-community%s",
6261 /* Default information */
6262 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
6263 && ! peer
->af_group
[afi
][safi
])
6265 vty_out (vty
, " neighbor %s default-originate", addr
);
6266 if (peer
->default_rmap
[afi
][safi
].name
)
6267 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
6268 vty_out (vty
, "%s", VTY_NEWLINE
);
6271 /* Soft reconfiguration inbound. */
6272 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6273 if (! peer
->af_group
[afi
][safi
] ||
6274 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
6275 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
6278 /* maximum-prefix. */
6279 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
6280 if (! peer
->af_group
[afi
][safi
]
6281 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
6282 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
6283 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
6284 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6286 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
6287 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
6288 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
6289 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
6290 vty_out (vty
, " warning-only");
6291 if (peer
->pmax_restart
[afi
][safi
])
6292 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
6293 vty_out (vty
, "%s", VTY_NEWLINE
);
6296 /* Route server client. */
6297 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
6298 && ! peer
->af_group
[afi
][safi
])
6299 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
6301 /* Nexthop-local unchanged. */
6302 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
6303 && ! peer
->af_group
[afi
][safi
])
6304 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
6307 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
6308 if (! peer_group_active (peer
)
6309 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
6310 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
6312 if (peer
->allowas_in
[afi
][safi
] == 3)
6313 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
6315 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
6316 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
6320 bgp_config_write_filter (vty
, peer
, afi
, safi
);
6322 /* atribute-unchanged. */
6323 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6324 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6325 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6326 && ! peer
->af_group
[afi
][safi
])
6328 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
6329 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
6330 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
6331 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
6333 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
6334 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
6336 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
6338 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
6339 " med" : "", VTY_NEWLINE
);
6343 /* Display "address-family" configuration header. */
6345 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
6351 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6354 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
6358 if (safi
== SAFI_MULTICAST
)
6359 vty_out (vty
, "ipv4 multicast");
6360 else if (safi
== SAFI_MPLS_VPN
)
6361 vty_out (vty
, "vpnv4 unicast");
6363 else if (afi
== AFI_IP6
)
6365 vty_out (vty
, "ipv6");
6367 if (safi
== SAFI_MULTICAST
)
6368 vty_out (vty
, " multicast");
6371 vty_out (vty
, "%s", VTY_NEWLINE
);
6376 /* Address family based peer configuration display. */
6378 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
6383 struct peer_group
*group
;
6384 struct listnode
*node
, *nnode
;
6386 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
6388 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
6390 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6392 if (group
->conf
->afc
[afi
][safi
])
6394 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6395 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
6398 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6400 /* Skip dynamic neighbors. */
6401 if (peer_dynamic_neighbor (peer
))
6404 if (peer
->afc
[afi
][safi
])
6406 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6408 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
6409 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
6414 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
6415 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
6418 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
6424 bgp_config_write (struct vty
*vty
)
6428 struct peer_group
*group
;
6430 struct listnode
*node
, *nnode
;
6431 struct listnode
*mnode
, *mnnode
;
6433 /* BGP Multiple instance. */
6434 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6436 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
6440 /* BGP Config type. */
6441 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6443 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
6447 /* BGP configuration. */
6448 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6451 vty_out (vty
, "!%s", VTY_NEWLINE
);
6453 /* Router bgp ASN */
6454 vty_out (vty
, "router bgp %u", bgp
->as
);
6456 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6459 vty_out (vty
, " view %s", bgp
->name
);
6461 vty_out (vty
, "%s", VTY_NEWLINE
);
6463 /* No Synchronization */
6464 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6465 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
6467 /* BGP fast-external-failover. */
6468 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
6469 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
6471 /* BGP router ID. */
6472 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
6473 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
6476 /* BGP log-neighbor-changes. */
6477 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
6478 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
6480 /* BGP configuration. */
6481 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
6482 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
6484 /* BGP default ipv4-unicast. */
6485 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
6486 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
6488 /* BGP default local-preference. */
6489 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
6490 vty_out (vty
, " bgp default local-preference %d%s",
6491 bgp
->default_local_pref
, VTY_NEWLINE
);
6493 /* BGP default show-hostname */
6494 if (bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
6495 vty_out (vty
, " bgp default show-hostname%s", VTY_NEWLINE
);
6497 /* BGP default subgroup-pkt-queue-max. */
6498 if (bgp
->default_subgroup_pkt_queue_max
!= BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
6499 vty_out (vty
, " bgp default subgroup-pkt-queue-max %d%s",
6500 bgp
->default_subgroup_pkt_queue_max
, VTY_NEWLINE
);
6502 /* BGP client-to-client reflection. */
6503 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
6504 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
6506 /* BGP cluster ID. */
6507 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
6508 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
6511 /* Disable ebgp connected nexthop check */
6512 if (bgp_flag_check (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
6513 vty_out (vty
, " bgp disable-ebgp-connected-route-check%s", VTY_NEWLINE
);
6515 /* Confederation identifier*/
6516 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
6517 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
6520 /* Confederation peer */
6521 if (bgp
->confed_peers_cnt
> 0)
6525 vty_out (vty
, " bgp confederation peers");
6527 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
6528 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
6530 vty_out (vty
, "%s", VTY_NEWLINE
);
6533 /* BGP enforce-first-as. */
6534 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
6535 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
6537 /* BGP deterministic-med. */
6538 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
6539 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
6541 /* BGP update-delay. */
6542 bgp_config_write_update_delay (vty
, bgp
);
6544 if (bgp
->v_maxmed_onstartup
!= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
)
6546 vty_out (vty
, " bgp max-med on-startup %d", bgp
->v_maxmed_onstartup
);
6547 if (bgp
->maxmed_onstartup_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6548 vty_out (vty
, " %d", bgp
->maxmed_onstartup_value
);
6549 vty_out (vty
, "%s", VTY_NEWLINE
);
6551 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
)
6553 vty_out (vty
, " bgp max-med administrative");
6554 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
6555 vty_out (vty
, " %d", bgp
->maxmed_admin_value
);
6556 vty_out (vty
, "%s", VTY_NEWLINE
);
6560 bgp_config_write_wpkt_quanta (vty
, bgp
);
6563 bgp_config_write_coalesce_time(vty
, bgp
);
6565 /* BGP graceful-restart. */
6566 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
6567 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
6568 bgp
->stalepath_time
, VTY_NEWLINE
);
6569 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
6570 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
6572 /* BGP bestpath method. */
6573 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
6574 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
6575 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
6576 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
6578 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
6579 if (bgp_flag_check (bgp
, BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET
)) {
6580 vty_out (vty
, " bgp bestpath as-path multipath-relax no-as-set%s", VTY_NEWLINE
);
6582 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
6586 if (bgp_flag_check (bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
6587 vty_out (vty
, " bgp route-reflector allow-outbound-policy%s",
6590 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
6591 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
6592 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
6593 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6595 vty_out (vty
, " bgp bestpath med");
6596 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
6597 vty_out (vty
, " confed");
6598 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
6599 vty_out (vty
, " missing-as-worst");
6600 vty_out (vty
, "%s", VTY_NEWLINE
);
6603 /* BGP network import check. */
6604 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH
))
6605 vty_out (vty
, " bgp network import-check exact%s", VTY_NEWLINE
);
6606 else if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
6607 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
6609 /* BGP flag dampening. */
6610 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
6611 BGP_CONFIG_DAMPENING
))
6612 bgp_config_write_damp (vty
);
6614 /* BGP static route configuration. */
6615 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6617 /* BGP redistribute configuration. */
6618 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6620 /* BGP timers configuration. */
6621 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
6622 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
6623 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
6624 bgp
->default_holdtime
, VTY_NEWLINE
);
6626 if (bgp
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
6627 vty_out (vty
, " bgp route-map delay-timer %d%s", bgp
->rmap_update_timer
,
6631 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
6633 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
6636 /* Normal neighbor configuration. */
6637 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6639 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6640 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
6644 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6645 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
6647 /* Distance configuration. */
6648 bgp_config_write_distance (vty
, bgp
);
6650 /* listen range and limit for dynamic BGP neighbors */
6651 bgp_config_write_listen (vty
, bgp
);
6653 /* No auto-summary */
6654 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
6655 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
6657 /* IPv4 multicast configuration. */
6658 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
6660 /* IPv4 VPN configuration. */
6661 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
6663 /* IPv6 unicast configuration. */
6664 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
6666 /* IPv6 multicast configuration. */
6667 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
6675 bgp_master_init (void)
6677 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
6680 bm
->bgp
= list_new ();
6681 bm
->listen_sockets
= list_new ();
6682 bm
->port
= BGP_PORT_DEFAULT
;
6683 bm
->master
= thread_master_create ();
6684 bm
->start_time
= bgp_clock ();
6692 /* allocates some vital data structures used by peer commands in vty_init */
6698 /* BGP VTY commands installation. */
6706 bgp_route_map_init ();
6707 bgp_address_init ();
6708 bgp_scan_vty_init();
6709 bgp_mplsvpn_init ();
6711 /* Access list initialize. */
6712 access_list_init ();
6713 access_list_add_hook (peer_distribute_update
);
6714 access_list_delete_hook (peer_distribute_update
);
6716 /* Filter list initialize. */
6718 as_list_add_hook (peer_aslist_add
);
6719 as_list_delete_hook (peer_aslist_del
);
6721 /* Prefix list initialize.*/
6722 prefix_list_init ();
6723 prefix_list_add_hook (peer_prefix_list_update
);
6724 prefix_list_delete_hook (peer_prefix_list_update
);
6726 /* Community list initialize. */
6727 bgp_clist
= community_list_init ();
6731 #endif /* HAVE_SNMP */
6738 bgp_terminate (void)
6742 struct listnode
*node
, *nnode
;
6743 struct listnode
*mnode
, *mnnode
;
6745 /* Close the listener sockets first as this prevents peers from attempting
6746 * to reconnect on receiving the peer unconfig message. In the presence
6747 * of a large number of peers this will ensure that no peer is left with
6748 * a dangling connection
6750 /* reverse bgp_master_init */
6752 if (bm
->listen_sockets
)
6753 list_free(bm
->listen_sockets
);
6754 bm
->listen_sockets
= NULL
;
6756 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
6757 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6758 if (peer
->status
== Established
||
6759 peer
->status
== OpenSent
||
6760 peer
->status
== OpenConfirm
)
6761 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
6762 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
6764 bgp_cleanup_routes ();
6766 if (bm
->process_main_queue
)
6768 work_queue_free (bm
->process_main_queue
);
6769 bm
->process_main_queue
= NULL
;
6771 if (bm
->process_rsclient_queue
)
6773 work_queue_free (bm
->process_rsclient_queue
);
6774 bm
->process_rsclient_queue
= NULL
;