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"
39 #include "bgpd/bgpd.h"
40 #include "bgpd/bgp_table.h"
41 #include "bgpd/bgp_aspath.h"
42 #include "bgpd/bgp_route.h"
43 #include "bgpd/bgp_dump.h"
44 #include "bgpd/bgp_debug.h"
45 #include "bgpd/bgp_community.h"
46 #include "bgpd/bgp_attr.h"
47 #include "bgpd/bgp_regex.h"
48 #include "bgpd/bgp_clist.h"
49 #include "bgpd/bgp_fsm.h"
50 #include "bgpd/bgp_packet.h"
51 #include "bgpd/bgp_zebra.h"
52 #include "bgpd/bgp_open.h"
53 #include "bgpd/bgp_filter.h"
54 #include "bgpd/bgp_nexthop.h"
55 #include "bgpd/bgp_damp.h"
56 #include "bgpd/bgp_mplsvpn.h"
57 #include "bgpd/bgp_advertise.h"
58 #include "bgpd/bgp_network.h"
59 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_mpath.h"
62 #include "bgpd/bgp_snmp.h"
63 #endif /* HAVE_SNMP */
65 /* BGP process wide configuration. */
66 static struct bgp_master bgp_master
;
68 extern struct in_addr router_id_zebra
;
70 /* BGP process wide configuration pointer to export. */
71 struct bgp_master
*bm
;
73 /* BGP community-list. */
74 struct community_list_handler
*bgp_clist
;
76 /* BGP global flag manipulation. */
78 bgp_option_set (int flag
)
83 case BGP_OPT_MULTIPLE_INSTANCE
:
84 case BGP_OPT_CONFIG_CISCO
:
85 case BGP_OPT_NO_LISTEN
:
86 SET_FLAG (bm
->options
, flag
);
89 return BGP_ERR_INVALID_FLAG
;
95 bgp_option_unset (int flag
)
99 case BGP_OPT_MULTIPLE_INSTANCE
:
100 if (listcount (bm
->bgp
) > 1)
101 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
104 case BGP_OPT_CONFIG_CISCO
:
105 UNSET_FLAG (bm
->options
, flag
);
108 return BGP_ERR_INVALID_FLAG
;
114 bgp_option_check (int flag
)
116 return CHECK_FLAG (bm
->options
, flag
);
119 /* BGP flag manipulation. */
121 bgp_flag_set (struct bgp
*bgp
, int flag
)
123 SET_FLAG (bgp
->flags
, flag
);
128 bgp_flag_unset (struct bgp
*bgp
, int flag
)
130 UNSET_FLAG (bgp
->flags
, flag
);
135 bgp_flag_check (struct bgp
*bgp
, int flag
)
137 return CHECK_FLAG (bgp
->flags
, flag
);
140 /* Internal function to set BGP structure configureation flag. */
142 bgp_config_set (struct bgp
*bgp
, int config
)
144 SET_FLAG (bgp
->config
, config
);
148 bgp_config_unset (struct bgp
*bgp
, int config
)
150 UNSET_FLAG (bgp
->config
, config
);
154 bgp_config_check (struct bgp
*bgp
, int config
)
156 return CHECK_FLAG (bgp
->config
, config
);
159 /* Set BGP router identifier. */
161 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
164 struct listnode
*node
, *nnode
;
166 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
167 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
170 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
171 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
173 /* Set all peer's local identifier with this value. */
174 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
176 IPV4_ADDR_COPY (&peer
->local_id
, id
);
178 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
180 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
181 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
182 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
188 /* BGP's cluster-id control. */
190 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
193 struct listnode
*node
, *nnode
;
195 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
196 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
199 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
200 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
202 /* Clear all IBGP peer. */
203 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
205 if (peer
->sort
!= BGP_PEER_IBGP
)
208 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
210 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
211 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
212 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
219 bgp_cluster_id_unset (struct bgp
*bgp
)
222 struct listnode
*node
, *nnode
;
224 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
227 bgp
->cluster_id
.s_addr
= 0;
228 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
230 /* Clear all IBGP peer. */
231 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
233 if (peer
->sort
!= BGP_PEER_IBGP
)
236 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
238 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
239 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
240 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
246 /* time_t value that is monotonicly increasing
247 * and uneffected by adjustments to system clock
249 time_t bgp_clock (void)
253 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
257 /* BGP timer configuration. */
259 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
261 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
262 ? keepalive
: holdtime
/ 3);
263 bgp
->default_holdtime
= holdtime
;
269 bgp_timers_unset (struct bgp
*bgp
)
271 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
272 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
277 /* BGP confederation configuration. */
279 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
282 struct listnode
*node
, *nnode
;
286 return BGP_ERR_INVALID_AS
;
288 /* Remember - were we doing confederation before? */
289 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
291 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
293 /* If we were doing confederation already, this is just an external
294 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
295 were not doing confederation before, reset all EBGP sessions. */
296 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
298 /* We're looking for peers who's AS is not local or part of our
302 if (peer_sort (peer
) == BGP_PEER_EBGP
)
305 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
307 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
308 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
309 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
313 BGP_EVENT_ADD (peer
, BGP_Stop
);
318 /* Not doign confederation before, so reset every non-local
320 if (peer_sort (peer
) != BGP_PEER_IBGP
)
322 /* Reset the local_as to be our EBGP one */
323 if (peer_sort (peer
) == BGP_PEER_EBGP
)
325 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
327 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
328 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
329 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
332 BGP_EVENT_ADD (peer
, BGP_Stop
);
340 bgp_confederation_id_unset (struct bgp
*bgp
)
343 struct listnode
*node
, *nnode
;
346 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
348 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
350 /* We're looking for peers who's AS is not local */
351 if (peer_sort (peer
) != BGP_PEER_IBGP
)
353 peer
->local_as
= bgp
->as
;
354 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
356 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
357 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
358 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
362 BGP_EVENT_ADD (peer
, BGP_Stop
);
368 /* Is an AS part of the confed or not? */
370 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
377 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
378 if (bgp
->confed_peers
[i
] == as
)
384 /* Add an AS to the confederation set. */
386 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
389 struct listnode
*node
, *nnode
;
392 return BGP_ERR_INVALID_BGP
;
395 return BGP_ERR_INVALID_AS
;
397 if (bgp_confederation_peers_check (bgp
, as
))
400 if (bgp
->confed_peers
)
401 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
403 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
405 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
406 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
408 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
409 bgp
->confed_peers_cnt
++;
411 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
413 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
417 peer
->local_as
= bgp
->as
;
418 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
420 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
421 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
422 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
425 BGP_EVENT_ADD (peer
, BGP_Stop
);
432 /* Delete an AS from the confederation set. */
434 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
439 struct listnode
*node
, *nnode
;
444 if (! bgp_confederation_peers_check (bgp
, as
))
447 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
448 if (bgp
->confed_peers
[i
] == as
)
449 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
450 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
452 bgp
->confed_peers_cnt
--;
454 if (bgp
->confed_peers_cnt
== 0)
456 if (bgp
->confed_peers
)
457 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
458 bgp
->confed_peers
= NULL
;
461 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
463 bgp
->confed_peers_cnt
* sizeof (as_t
));
465 /* Now reset any peer who's remote AS has just been removed from the
467 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
469 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
473 peer
->local_as
= bgp
->confed_id
;
474 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
476 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
477 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
478 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
481 BGP_EVENT_ADD (peer
, BGP_Stop
);
489 /* Local preference configuration. */
491 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
496 bgp
->default_local_pref
= local_pref
;
502 bgp_default_local_preference_unset (struct bgp
*bgp
)
507 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
512 /* If peer is RSERVER_CLIENT in at least one address family and is not member
513 of a peer_group for that family, return 1.
514 Used to check wether the peer is included in list bgp->rsclient. */
516 peer_rsclient_active (struct peer
*peer
)
521 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
522 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
523 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
524 && ! peer
->af_group
[i
][j
])
529 /* Peer comparison function for sorting. */
531 peer_cmp (struct peer
*p1
, struct peer
*p2
)
533 return sockunion_cmp (&p1
->su
, &p2
->su
);
537 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
539 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
542 /* Reset all address family specific configuration. */
544 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
547 struct bgp_filter
*filter
;
548 char orf_name
[BUFSIZ
];
550 filter
= &peer
->filter
[afi
][safi
];
552 /* Clear neighbor filter and route-map */
553 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
555 if (filter
->dlist
[i
].name
)
557 free (filter
->dlist
[i
].name
);
558 filter
->dlist
[i
].name
= NULL
;
560 if (filter
->plist
[i
].name
)
562 free (filter
->plist
[i
].name
);
563 filter
->plist
[i
].name
= NULL
;
565 if (filter
->aslist
[i
].name
)
567 free (filter
->aslist
[i
].name
);
568 filter
->aslist
[i
].name
= NULL
;
571 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
573 if (filter
->map
[i
].name
)
575 free (filter
->map
[i
].name
);
576 filter
->map
[i
].name
= NULL
;
580 /* Clear unsuppress map. */
581 if (filter
->usmap
.name
)
582 free (filter
->usmap
.name
);
583 filter
->usmap
.name
= NULL
;
584 filter
->usmap
.map
= NULL
;
586 /* Clear neighbor's all address family flags. */
587 peer
->af_flags
[afi
][safi
] = 0;
589 /* Clear neighbor's all address family sflags. */
590 peer
->af_sflags
[afi
][safi
] = 0;
592 /* Clear neighbor's all address family capabilities. */
593 peer
->af_cap
[afi
][safi
] = 0;
596 peer
->orf_plist
[afi
][safi
] = NULL
;
597 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
598 prefix_bgp_orf_remove_all (orf_name
);
600 /* Set default neighbor send-community. */
601 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
603 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
604 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
607 /* Clear neighbor default_originate_rmap */
608 if (peer
->default_rmap
[afi
][safi
].name
)
609 free (peer
->default_rmap
[afi
][safi
].name
);
610 peer
->default_rmap
[afi
][safi
].name
= NULL
;
611 peer
->default_rmap
[afi
][safi
].map
= NULL
;
613 /* Clear neighbor maximum-prefix */
614 peer
->pmax
[afi
][safi
] = 0;
615 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
618 /* peer global config reset */
620 peer_global_config_reset (struct peer
*peer
)
623 peer
->change_local_as
= 0;
624 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
625 if (peer
->update_source
)
627 sockunion_free (peer
->update_source
);
628 peer
->update_source
= NULL
;
632 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
633 peer
->update_if
= NULL
;
636 if (peer_sort (peer
) == BGP_PEER_IBGP
)
637 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
639 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
646 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
649 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
650 static bgp_peer_sort_t
651 peer_calc_sort (struct peer
*peer
)
658 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
661 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
665 peer1
= listnode_head (peer
->group
->peer
);
667 return (peer1
->local_as
== peer1
->as
668 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
670 return BGP_PEER_INTERNAL
;
674 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
676 if (peer
->local_as
== 0)
677 return BGP_PEER_INTERNAL
;
679 if (peer
->local_as
== peer
->as
)
681 if (peer
->local_as
== bgp
->confed_id
)
682 return BGP_PEER_EBGP
;
684 return BGP_PEER_IBGP
;
687 if (bgp_confederation_peers_check (bgp
, peer
->as
))
688 return BGP_PEER_CONFED
;
690 return BGP_PEER_EBGP
;
694 return (peer
->local_as
== 0
695 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
696 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
700 /* Calculate and cache the peer "sort" */
702 peer_sort (struct peer
*peer
)
704 peer
->sort
= peer_calc_sort (peer
);
709 peer_free (struct peer
*peer
)
711 assert (peer
->status
== Deleted
);
713 bgp_unlock(peer
->bgp
);
715 /* this /ought/ to have been done already through bgp_stop earlier,
716 * but just to be sure..
718 bgp_timer_set (peer
);
719 BGP_READ_OFF (peer
->t_read
);
720 BGP_WRITE_OFF (peer
->t_write
);
721 BGP_EVENT_FLUSH (peer
);
724 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
726 /* Free allocated host character. */
728 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
730 /* Update source configuration. */
731 if (peer
->update_source
)
732 sockunion_free (peer
->update_source
);
735 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
737 if (peer
->clear_node_queue
)
738 work_queue_free (peer
->clear_node_queue
);
740 bgp_sync_delete (peer
);
741 memset (peer
, 0, sizeof (struct peer
));
743 XFREE (MTYPE_BGP_PEER
, peer
);
746 /* increase reference count on a struct peer */
748 peer_lock (struct peer
*peer
)
750 assert (peer
&& (peer
->lock
>= 0));
757 /* decrease reference count on a struct peer
758 * struct peer is freed and NULL returned if last reference
761 peer_unlock (struct peer
*peer
)
763 assert (peer
&& (peer
->lock
> 0));
770 zlog_debug ("unlocked and freeing");
771 zlog_backtrace (LOG_DEBUG
);
780 zlog_debug ("unlocked to 1");
781 zlog_backtrace (LOG_DEBUG
);
788 /* Allocate new peer object, implicitely locked. */
790 peer_new (struct bgp
*bgp
)
797 /* bgp argument is absolutely required */
802 /* Allocate new peer. */
803 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
805 /* Set default value. */
807 peer
->v_start
= BGP_INIT_START_TIMER
;
808 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
809 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
811 peer
->ostatus
= Idle
;
813 peer
->password
= NULL
;
815 peer
= peer_lock (peer
); /* initial reference */
818 /* Set default flags. */
819 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
820 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
822 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
824 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
825 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
827 peer
->orf_plist
[afi
][safi
] = NULL
;
829 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
831 /* Create buffers. */
832 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
833 peer
->obuf
= stream_fifo_new ();
834 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
);
835 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
837 bgp_sync_init (peer
);
839 /* Get service port number. */
840 sp
= getservbyname ("bgp", "tcp");
841 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
846 /* Create new BGP peer. */
848 peer_create (union sockunion
*su
, struct bgp
*bgp
, as_t local_as
,
849 as_t remote_as
, afi_t afi
, safi_t safi
)
853 char buf
[SU_ADDRSTRLEN
];
855 peer
= peer_new (bgp
);
857 peer
->local_as
= local_as
;
858 peer
->as
= remote_as
;
859 peer
->local_id
= bgp
->router_id
;
860 peer
->v_holdtime
= bgp
->default_holdtime
;
861 peer
->v_keepalive
= bgp
->default_keepalive
;
862 if (peer_sort (peer
) == BGP_PEER_IBGP
)
863 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
865 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
867 peer
= peer_lock (peer
); /* bgp peer list reference */
868 listnode_add_sort (bgp
->peer
, peer
);
870 active
= peer_active (peer
);
873 peer
->afc
[afi
][safi
] = 1;
875 /* Last read and reset time set */
876 peer
->readtime
= peer
->resettime
= bgp_clock ();
878 /* Default TTL set. */
879 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
881 /* Make peer's address string. */
882 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
883 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
885 /* Set up peer's events and timers. */
886 if (! active
&& peer_active (peer
))
887 bgp_timer_set (peer
);
892 /* Make accept BGP peer. Called from bgp_accept (). */
894 peer_create_accept (struct bgp
*bgp
)
898 peer
= peer_new (bgp
);
900 peer
= peer_lock (peer
); /* bgp peer list reference */
901 listnode_add_sort (bgp
->peer
, peer
);
906 /* Change peer's AS number. */
908 peer_as_change (struct peer
*peer
, as_t as
)
910 bgp_peer_sort_t type
;
914 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
916 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
918 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
919 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
920 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
923 BGP_EVENT_ADD (peer
, BGP_Stop
);
925 type
= peer_sort (peer
);
928 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
929 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
930 && peer
->bgp
->as
!= as
)
931 peer
->local_as
= peer
->bgp
->confed_id
;
933 peer
->local_as
= peer
->bgp
->as
;
935 /* Advertisement-interval reset */
938 conf
= peer
->group
->conf
;
940 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
941 peer
->v_routeadv
= conf
->routeadv
;
943 if (peer_sort (peer
) == BGP_PEER_IBGP
)
944 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
946 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
949 if (peer_sort (peer
) == BGP_PEER_IBGP
)
951 else if (type
== BGP_PEER_IBGP
)
954 /* reflector-client reset */
955 if (peer_sort (peer
) != BGP_PEER_IBGP
)
957 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
958 PEER_FLAG_REFLECTOR_CLIENT
);
959 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
960 PEER_FLAG_REFLECTOR_CLIENT
);
961 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
962 PEER_FLAG_REFLECTOR_CLIENT
);
963 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
964 PEER_FLAG_REFLECTOR_CLIENT
);
965 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
966 PEER_FLAG_REFLECTOR_CLIENT
);
970 if (peer_sort (peer
) != BGP_PEER_EBGP
)
972 peer
->change_local_as
= 0;
973 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
974 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
978 /* If peer does not exist, create new one. If peer already exists,
979 set AS number to the peer. */
981 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, as_t
*as
,
982 afi_t afi
, safi_t safi
)
987 peer
= peer_lookup (bgp
, su
);
991 /* When this peer is a member of peer-group. */
994 if (peer
->group
->conf
->as
)
996 /* Return peer group's AS number. */
997 *as
= peer
->group
->conf
->as
;
998 return BGP_ERR_PEER_GROUP_MEMBER
;
1000 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1005 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1013 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1018 /* Existing peer's AS number change. */
1019 if (peer
->as
!= *as
)
1020 peer_as_change (peer
, *as
);
1025 /* If the peer is not part of our confederation, and its not an
1026 iBGP peer then spoof the source AS */
1027 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1028 && ! bgp_confederation_peers_check (bgp
, *as
)
1030 local_as
= bgp
->confed_id
;
1034 /* If this is IPv4 unicast configuration and "no bgp default
1035 ipv4-unicast" is specified. */
1037 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1038 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1039 peer
= peer_create (su
, bgp
, local_as
, *as
, 0, 0);
1041 peer
= peer_create (su
, bgp
, local_as
, *as
, afi
, safi
);
1047 /* Activate the peer or peer group for specified AFI and SAFI. */
1049 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1053 if (peer
->afc
[afi
][safi
])
1056 /* Activate the address family configuration. */
1057 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1058 peer
->afc
[afi
][safi
] = 1;
1061 active
= peer_active (peer
);
1063 peer
->afc
[afi
][safi
] = 1;
1065 if (! active
&& peer_active (peer
))
1066 bgp_timer_set (peer
);
1069 if (peer
->status
== Established
)
1071 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1073 peer
->afc_adv
[afi
][safi
] = 1;
1074 bgp_capability_send (peer
, afi
, safi
,
1076 CAPABILITY_ACTION_SET
);
1077 if (peer
->afc_recv
[afi
][safi
])
1079 peer
->afc_nego
[afi
][safi
] = 1;
1080 bgp_announce_route (peer
, afi
, safi
);
1085 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1086 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1087 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1096 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1098 struct peer_group
*group
;
1100 struct listnode
*node
, *nnode
;
1102 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1104 group
= peer
->group
;
1106 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1108 if (peer1
->af_group
[afi
][safi
])
1109 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1114 if (peer
->af_group
[afi
][safi
])
1115 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1118 if (! peer
->afc
[afi
][safi
])
1121 /* De-activate the address family configuration. */
1122 peer
->afc
[afi
][safi
] = 0;
1123 peer_af_flag_reset (peer
, afi
, safi
);
1125 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1127 if (peer
->status
== Established
)
1129 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1131 peer
->afc_adv
[afi
][safi
] = 0;
1132 peer
->afc_nego
[afi
][safi
] = 0;
1134 if (peer_active_nego (peer
))
1136 bgp_capability_send (peer
, afi
, safi
,
1138 CAPABILITY_ACTION_UNSET
);
1139 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1140 peer
->pcount
[afi
][safi
] = 0;
1144 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1145 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1146 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1151 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1152 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1153 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1161 peer_nsf_stop (struct peer
*peer
)
1166 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1167 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1169 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1170 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1171 peer
->nsf
[afi
][safi
] = 0;
1173 if (peer
->t_gr_restart
)
1175 BGP_TIMER_OFF (peer
->t_gr_restart
);
1176 if (BGP_DEBUG (events
, EVENTS
))
1177 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1179 if (peer
->t_gr_stale
)
1181 BGP_TIMER_OFF (peer
->t_gr_stale
);
1182 if (BGP_DEBUG (events
, EVENTS
))
1183 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1185 bgp_clear_route_all (peer
);
1188 /* Delete peer from confguration.
1190 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1191 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1193 * This function /should/ take care to be idempotent, to guard against
1194 * it being called multiple times through stray events that come in
1195 * that happen to result in this function being called again. That
1196 * said, getting here for a "Deleted" peer is a bug in the neighbour
1200 peer_delete (struct peer
*peer
)
1206 struct bgp_filter
*filter
;
1207 struct listnode
*pn
;
1209 assert (peer
->status
!= Deleted
);
1213 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1214 peer_nsf_stop (peer
);
1216 /* If this peer belongs to peer group, clear up the
1220 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1222 peer
= peer_unlock (peer
); /* group->peer list reference */
1223 list_delete_node (peer
->group
->peer
, pn
);
1228 /* Withdraw all information from routing table. We can not use
1229 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1230 * executed after peer structure is deleted.
1232 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1234 bgp_fsm_change_status (peer
, Deleted
);
1236 /* Password configuration */
1239 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1240 peer
->password
= NULL
;
1242 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1246 bgp_timer_set (peer
); /* stops all timers for Deleted */
1248 /* Delete from all peer list. */
1249 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1250 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1252 peer_unlock (peer
); /* bgp peer list reference */
1253 list_delete_node (bgp
->peer
, pn
);
1256 if (peer_rsclient_active (peer
)
1257 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1259 peer_unlock (peer
); /* rsclient list reference */
1260 list_delete_node (bgp
->rsclient
, pn
);
1262 /* Clear our own rsclient ribs. */
1263 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1264 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1265 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1266 PEER_FLAG_RSERVER_CLIENT
))
1267 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1270 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1271 member of a peer_group. */
1272 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1273 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1274 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1275 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1279 stream_free (peer
->ibuf
);
1281 stream_fifo_free (peer
->obuf
);
1283 stream_free (peer
->work
);
1285 stream_free(peer
->scratch
);
1287 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1289 /* Local and remote addresses. */
1291 sockunion_free (peer
->su_local
);
1292 if (peer
->su_remote
)
1293 sockunion_free (peer
->su_remote
);
1294 peer
->su_local
= peer
->su_remote
= NULL
;
1296 /* Free filter related memory. */
1297 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1298 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1300 filter
= &peer
->filter
[afi
][safi
];
1302 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1304 if (filter
->dlist
[i
].name
)
1305 free (filter
->dlist
[i
].name
);
1306 if (filter
->plist
[i
].name
)
1307 free (filter
->plist
[i
].name
);
1308 if (filter
->aslist
[i
].name
)
1309 free (filter
->aslist
[i
].name
);
1311 filter
->dlist
[i
].name
= NULL
;
1312 filter
->plist
[i
].name
= NULL
;
1313 filter
->aslist
[i
].name
= NULL
;
1315 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1317 if (filter
->map
[i
].name
)
1318 free (filter
->map
[i
].name
);
1319 filter
->map
[i
].name
= NULL
;
1322 if (filter
->usmap
.name
)
1323 free (filter
->usmap
.name
);
1325 if (peer
->default_rmap
[afi
][safi
].name
)
1326 free (peer
->default_rmap
[afi
][safi
].name
);
1328 filter
->usmap
.name
= NULL
;
1329 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1332 peer_unlock (peer
); /* initial reference */
1338 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1340 return strcmp (g1
->name
, g2
->name
);
1343 /* If peer is configured at least one address family return 1. */
1345 peer_group_active (struct peer
*peer
)
1347 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1348 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1349 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1350 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1351 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1356 /* Peer group cofiguration. */
1357 static struct peer_group
*
1358 peer_group_new (void)
1360 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1361 sizeof (struct peer_group
));
1365 peer_group_free (struct peer_group
*group
)
1367 XFREE (MTYPE_PEER_GROUP
, group
);
1371 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1373 struct peer_group
*group
;
1374 struct listnode
*node
, *nnode
;
1376 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1378 if (strcmp (group
->name
, name
) == 0)
1385 peer_group_get (struct bgp
*bgp
, const char *name
)
1387 struct peer_group
*group
;
1389 group
= peer_group_lookup (bgp
, name
);
1393 group
= peer_group_new ();
1395 group
->name
= strdup (name
);
1396 group
->peer
= list_new ();
1397 group
->conf
= peer_new (bgp
);
1398 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1399 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1400 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1401 group
->conf
->group
= group
;
1402 group
->conf
->as
= 0;
1403 group
->conf
->ttl
= 1;
1404 group
->conf
->gtsm_hops
= 0;
1405 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1406 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1407 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1408 group
->conf
->keepalive
= 0;
1409 group
->conf
->holdtime
= 0;
1410 group
->conf
->connect
= 0;
1411 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1412 listnode_add_sort (bgp
->group
, group
);
1418 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1419 afi_t afi
, safi_t safi
)
1422 int out
= FILTER_OUT
;
1424 struct bgp_filter
*pfilter
;
1425 struct bgp_filter
*gfilter
;
1428 pfilter
= &peer
->filter
[afi
][safi
];
1429 gfilter
= &conf
->filter
[afi
][safi
];
1433 peer
->as
= conf
->as
;
1436 if (conf
->change_local_as
)
1437 peer
->change_local_as
= conf
->change_local_as
;
1440 peer
->ttl
= conf
->ttl
;
1443 peer
->gtsm_hops
= conf
->gtsm_hops
;
1446 peer
->weight
= conf
->weight
;
1448 /* peer flags apply */
1449 peer
->flags
= conf
->flags
;
1450 /* peer af_flags apply */
1451 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1452 /* peer config apply */
1453 peer
->config
= conf
->config
;
1455 /* peer timers apply */
1456 peer
->holdtime
= conf
->holdtime
;
1457 peer
->keepalive
= conf
->keepalive
;
1458 peer
->connect
= conf
->connect
;
1459 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1460 peer
->v_connect
= conf
->connect
;
1462 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1464 /* advertisement-interval reset */
1465 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1466 peer
->v_routeadv
= conf
->routeadv
;
1468 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1469 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1471 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1473 /* password apply */
1474 if (conf
->password
&& !peer
->password
)
1475 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1479 /* maximum-prefix */
1480 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1481 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1482 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1485 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1487 /* route-server-client */
1488 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1490 /* Make peer's RIB point to group's RIB. */
1491 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1493 /* Import policy. */
1494 if (pfilter
->map
[RMAP_IMPORT
].name
)
1495 free (pfilter
->map
[RMAP_IMPORT
].name
);
1496 if (gfilter
->map
[RMAP_IMPORT
].name
)
1498 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1499 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1503 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1504 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1507 /* Export policy. */
1508 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1510 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1511 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1515 /* default-originate route-map */
1516 if (conf
->default_rmap
[afi
][safi
].name
)
1518 if (peer
->default_rmap
[afi
][safi
].name
)
1519 free (peer
->default_rmap
[afi
][safi
].name
);
1520 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1521 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1524 /* update-source apply */
1525 if (conf
->update_source
)
1527 if (peer
->update_source
)
1528 sockunion_free (peer
->update_source
);
1529 if (peer
->update_if
)
1531 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1532 peer
->update_if
= NULL
;
1534 peer
->update_source
= sockunion_dup (conf
->update_source
);
1536 else if (conf
->update_if
)
1538 if (peer
->update_if
)
1539 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1540 if (peer
->update_source
)
1542 sockunion_free (peer
->update_source
);
1543 peer
->update_source
= NULL
;
1545 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1548 /* inbound filter apply */
1549 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1551 if (pfilter
->dlist
[in
].name
)
1552 free (pfilter
->dlist
[in
].name
);
1553 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1554 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1556 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1558 if (pfilter
->plist
[in
].name
)
1559 free (pfilter
->plist
[in
].name
);
1560 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1561 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1563 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1565 if (pfilter
->aslist
[in
].name
)
1566 free (pfilter
->aslist
[in
].name
);
1567 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1568 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1570 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1572 if (pfilter
->map
[RMAP_IN
].name
)
1573 free (pfilter
->map
[RMAP_IN
].name
);
1574 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
1575 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
1578 /* outbound filter apply */
1579 if (gfilter
->dlist
[out
].name
)
1581 if (pfilter
->dlist
[out
].name
)
1582 free (pfilter
->dlist
[out
].name
);
1583 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1584 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1588 if (pfilter
->dlist
[out
].name
)
1589 free (pfilter
->dlist
[out
].name
);
1590 pfilter
->dlist
[out
].name
= NULL
;
1591 pfilter
->dlist
[out
].alist
= NULL
;
1593 if (gfilter
->plist
[out
].name
)
1595 if (pfilter
->plist
[out
].name
)
1596 free (pfilter
->plist
[out
].name
);
1597 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1598 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1602 if (pfilter
->plist
[out
].name
)
1603 free (pfilter
->plist
[out
].name
);
1604 pfilter
->plist
[out
].name
= NULL
;
1605 pfilter
->plist
[out
].plist
= NULL
;
1607 if (gfilter
->aslist
[out
].name
)
1609 if (pfilter
->aslist
[out
].name
)
1610 free (pfilter
->aslist
[out
].name
);
1611 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1612 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1616 if (pfilter
->aslist
[out
].name
)
1617 free (pfilter
->aslist
[out
].name
);
1618 pfilter
->aslist
[out
].name
= NULL
;
1619 pfilter
->aslist
[out
].aslist
= NULL
;
1621 if (gfilter
->map
[RMAP_OUT
].name
)
1623 if (pfilter
->map
[RMAP_OUT
].name
)
1624 free (pfilter
->map
[RMAP_OUT
].name
);
1625 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
1626 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
1630 if (pfilter
->map
[RMAP_OUT
].name
)
1631 free (pfilter
->map
[RMAP_OUT
].name
);
1632 pfilter
->map
[RMAP_OUT
].name
= NULL
;
1633 pfilter
->map
[RMAP_OUT
].map
= NULL
;
1636 /* RS-client's import/export route-maps. */
1637 if (gfilter
->map
[RMAP_IMPORT
].name
)
1639 if (pfilter
->map
[RMAP_IMPORT
].name
)
1640 free (pfilter
->map
[RMAP_IMPORT
].name
);
1641 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1642 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1646 if (pfilter
->map
[RMAP_IMPORT
].name
)
1647 free (pfilter
->map
[RMAP_IMPORT
].name
);
1648 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1649 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1651 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1653 if (pfilter
->map
[RMAP_EXPORT
].name
)
1654 free (pfilter
->map
[RMAP_EXPORT
].name
);
1655 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1656 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1659 if (gfilter
->usmap
.name
)
1661 if (pfilter
->usmap
.name
)
1662 free (pfilter
->usmap
.name
);
1663 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1664 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1668 if (pfilter
->usmap
.name
)
1669 free (pfilter
->usmap
.name
);
1670 pfilter
->usmap
.name
= NULL
;
1671 pfilter
->usmap
.map
= NULL
;
1675 /* Peer group's remote AS configuration. */
1677 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
, as_t
*as
)
1679 struct peer_group
*group
;
1681 struct listnode
*node
, *nnode
;
1683 group
= peer_group_lookup (bgp
, group_name
);
1687 if (group
->conf
->as
== *as
)
1690 /* When we setup peer-group AS number all peer group member's AS
1691 number must be updated to same number. */
1692 peer_as_change (group
->conf
, *as
);
1694 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1696 if (peer
->as
!= *as
)
1697 peer_as_change (peer
, *as
);
1704 peer_group_delete (struct peer_group
*group
)
1708 struct listnode
*node
, *nnode
;
1712 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1717 list_delete (group
->peer
);
1722 group
->conf
->group
= NULL
;
1723 peer_delete (group
->conf
);
1725 /* Delete from all peer_group list. */
1726 listnode_delete (bgp
->group
, group
);
1728 peer_group_free (group
);
1734 peer_group_remote_as_delete (struct peer_group
*group
)
1737 struct listnode
*node
, *nnode
;
1739 if (! group
->conf
->as
)
1742 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1747 list_delete_all_node (group
->peer
);
1749 group
->conf
->as
= 0;
1754 /* Bind specified peer to peer group. */
1756 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
,
1757 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1760 int first_member
= 0;
1762 /* Check peer group's address family. */
1763 if (! group
->conf
->afc
[afi
][safi
])
1764 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
1766 /* Lookup the peer. */
1767 peer
= peer_lookup (bgp
, su
);
1769 /* Create a new peer. */
1772 if (! group
->conf
->as
)
1773 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
1775 peer
= peer_create (su
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
1776 peer
->group
= group
;
1777 peer
->af_group
[afi
][safi
] = 1;
1779 peer
= peer_lock (peer
); /* group->peer list reference */
1780 listnode_add (group
->peer
, peer
);
1781 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1786 /* When the peer already belongs to peer group, check the consistency. */
1787 if (peer
->af_group
[afi
][safi
])
1789 if (strcmp (peer
->group
->name
, group
->name
) != 0)
1790 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
1795 /* Check current peer group configuration. */
1796 if (peer_group_active (peer
)
1797 && strcmp (peer
->group
->name
, group
->name
) != 0)
1798 return BGP_ERR_PEER_GROUP_MISMATCH
;
1800 if (! group
->conf
->as
)
1802 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
1803 && peer_sort (group
->conf
) != peer_sort (peer
))
1807 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1810 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
1814 peer
->af_group
[afi
][safi
] = 1;
1815 peer
->afc
[afi
][safi
] = 1;
1818 peer
->group
= group
;
1820 peer
= peer_lock (peer
); /* group->peer list reference */
1821 listnode_add (group
->peer
, peer
);
1824 assert (group
&& peer
->group
== group
);
1828 /* Advertisement-interval reset */
1829 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
1830 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1831 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1833 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1835 /* ebgp-multihop reset */
1836 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1837 group
->conf
->ttl
= 255;
1839 /* local-as reset */
1840 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
1842 group
->conf
->change_local_as
= 0;
1843 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1844 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1848 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1850 struct listnode
*pn
;
1852 /* If it's not configured as RSERVER_CLIENT in any other address
1853 family, without being member of a peer_group, remove it from
1854 list bgp->rsclient.*/
1855 if (! peer_rsclient_active (peer
)
1856 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1858 peer_unlock (peer
); /* peer rsclient reference */
1859 list_delete_node (bgp
->rsclient
, pn
);
1861 /* Clear our own rsclient rib for this afi/safi. */
1862 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1865 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1867 /* Import policy. */
1868 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
1870 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
1871 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
1872 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
1875 /* Export policy. */
1876 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
1877 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
1879 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
1880 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
1881 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
1885 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1887 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1889 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
1890 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1891 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1894 BGP_EVENT_ADD (peer
, BGP_Stop
);
1900 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
1901 struct peer_group
*group
, afi_t afi
, safi_t safi
)
1903 if (! peer
->af_group
[afi
][safi
])
1906 if (group
!= peer
->group
)
1907 return BGP_ERR_PEER_GROUP_MISMATCH
;
1909 peer
->af_group
[afi
][safi
] = 0;
1910 peer
->afc
[afi
][safi
] = 0;
1911 peer_af_flag_reset (peer
, afi
, safi
);
1913 if (peer
->rib
[afi
][safi
])
1914 peer
->rib
[afi
][safi
] = NULL
;
1916 if (! peer_group_active (peer
))
1918 assert (listnode_lookup (group
->peer
, peer
));
1919 peer_unlock (peer
); /* peer group list reference */
1920 listnode_delete (group
->peer
, peer
);
1922 if (group
->conf
->as
)
1927 peer_global_config_reset (peer
);
1930 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1932 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
1933 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1934 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1937 BGP_EVENT_ADD (peer
, BGP_Stop
);
1943 bgp_startup_timer_expire (struct thread
*thread
)
1947 bgp
= THREAD_ARG (thread
);
1948 bgp
->t_startup
= NULL
;
1954 /* BGP instance creation by `router bgp' commands. */
1956 bgp_create (as_t
*as
, const char *name
)
1962 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
1966 bgp
->peer_self
= peer_new (bgp
);
1967 bgp
->peer_self
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, "Static announcement");
1969 bgp
->peer
= list_new ();
1970 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
1972 bgp
->group
= list_new ();
1973 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
1975 bgp
->rsclient
= list_new ();
1976 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
1978 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1979 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1981 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
1982 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
1983 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
1984 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
1985 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
1988 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1989 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
1990 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
1991 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
1992 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
1993 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1998 bgp
->name
= strdup (name
);
2000 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2002 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2003 bgp
, bgp
->restart_time
);
2008 /* Return first entry of BGP. */
2010 bgp_get_default (void)
2013 return (listgetdata (listhead (bm
->bgp
)));
2017 /* Lookup BGP entry. */
2019 bgp_lookup (as_t as
, const char *name
)
2022 struct listnode
*node
, *nnode
;
2024 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2026 && ((bgp
->name
== NULL
&& name
== NULL
)
2027 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2032 /* Lookup BGP structure by view name. */
2034 bgp_lookup_by_name (const char *name
)
2037 struct listnode
*node
, *nnode
;
2039 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2040 if ((bgp
->name
== NULL
&& name
== NULL
)
2041 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2046 /* Called from VTY commands. */
2048 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2052 /* Multiple instance check. */
2053 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2056 bgp
= bgp_lookup_by_name (name
);
2058 bgp
= bgp_get_default ();
2060 /* Already exists. */
2066 return BGP_ERR_INSTANCE_MISMATCH
;
2074 /* BGP instance name can not be specified for single instance. */
2076 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2078 /* Get default BGP structure if exists. */
2079 bgp
= bgp_get_default ();
2086 return BGP_ERR_AS_MISMATCH
;
2093 bgp
= bgp_create (as
, name
);
2094 bgp_router_id_set(bgp
, &router_id_zebra
);
2097 /* Create BGP server socket, if first instance. */
2098 if (list_isempty(bm
->bgp
)
2099 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2101 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2102 return BGP_ERR_INVALID_VALUE
;
2105 listnode_add (bm
->bgp
, bgp
);
2110 /* Delete BGP instance. */
2112 bgp_delete (struct bgp
*bgp
)
2115 struct peer_group
*group
;
2116 struct listnode
*node
;
2117 struct listnode
*next
;
2121 /* Delete static route. */
2122 bgp_static_delete (bgp
);
2124 /* Unset redistribution. */
2125 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2126 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2127 if (i
!= ZEBRA_ROUTE_BGP
)
2128 bgp_redistribute_unset (bgp
, afi
, i
);
2130 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2132 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2134 /* Send notify to remote peer. */
2135 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2141 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2143 for (ALL_LIST_ELEMENTS (group
->peer
, node
, next
, peer
))
2145 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2147 /* Send notify to remote peer. */
2148 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2151 peer_group_delete (group
);
2154 assert (listcount (bgp
->rsclient
) == 0);
2156 if (bgp
->peer_self
) {
2157 peer_delete(bgp
->peer_self
);
2158 bgp
->peer_self
= NULL
;
2161 /* Remove visibility via the master list - there may however still be
2162 * routes to be processed still referencing the struct bgp.
2164 listnode_delete (bm
->bgp
, bgp
);
2165 if (list_isempty(bm
->bgp
))
2168 bgp_unlock(bgp
); /* initial reference */
2173 static void bgp_free (struct bgp
*);
2176 bgp_lock (struct bgp
*bgp
)
2182 bgp_unlock(struct bgp
*bgp
)
2184 assert(bgp
->lock
> 0);
2185 if (--bgp
->lock
== 0)
2190 bgp_free (struct bgp
*bgp
)
2195 list_delete (bgp
->group
);
2196 list_delete (bgp
->peer
);
2197 list_delete (bgp
->rsclient
);
2202 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2203 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2205 if (bgp
->route
[afi
][safi
])
2206 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2207 if (bgp
->aggregate
[afi
][safi
])
2208 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2209 if (bgp
->rib
[afi
][safi
])
2210 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2212 XFREE (MTYPE_BGP
, bgp
);
2216 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2219 struct listnode
*node
, *nnode
;
2223 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2224 if (sockunion_same (&peer
->su
, su
)
2225 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2228 else if (bm
->bgp
!= NULL
)
2230 struct listnode
*bgpnode
, *nbgpnode
;
2232 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2233 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2234 if (sockunion_same (&peer
->su
, su
)
2235 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2242 peer_lookup_with_open (union sockunion
*su
, as_t remote_as
,
2243 struct in_addr
*remote_id
, int *as
)
2246 struct listnode
*node
;
2247 struct listnode
*bgpnode
;
2253 for (ALL_LIST_ELEMENTS_RO (bm
->bgp
, bgpnode
, bgp
))
2255 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
2257 if (sockunion_same (&peer
->su
, su
)
2258 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2260 if (peer
->as
== remote_as
2261 && peer
->remote_id
.s_addr
== remote_id
->s_addr
)
2263 if (peer
->as
== remote_as
)
2268 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
2270 if (sockunion_same (&peer
->su
, su
)
2271 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2273 if (peer
->as
== remote_as
2274 && peer
->remote_id
.s_addr
== 0)
2276 if (peer
->as
== remote_as
)
2284 /* If peer is configured at least one address family return 1. */
2286 peer_active (struct peer
*peer
)
2288 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
2289 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
2290 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
2291 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
2292 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
2297 /* If peer is negotiated at least one address family return 1. */
2299 peer_active_nego (struct peer
*peer
)
2301 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
2302 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
2303 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
2304 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
2305 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
2310 /* peer_flag_change_type. */
2311 enum peer_change_type
2315 peer_change_reset_in
,
2316 peer_change_reset_out
,
2320 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
2321 enum peer_change_type type
)
2323 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2326 if (peer
->status
!= Established
)
2329 if (type
== peer_change_reset
)
2330 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2331 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2332 else if (type
== peer_change_reset_in
)
2334 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
2335 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
2336 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
2338 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2339 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2341 else if (type
== peer_change_reset_out
)
2342 bgp_announce_route (peer
, afi
, safi
);
2345 struct peer_flag_action
2350 /* This flag can be set for peer-group member. */
2351 u_char not_for_member
;
2353 /* Action when the flag is changed. */
2354 enum peer_change_type type
;
2356 /* Peer down cause */
2360 static const struct peer_flag_action peer_flag_action_list
[] =
2362 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
2363 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
2364 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
2365 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
2366 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
2367 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
2368 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
2372 static const struct peer_flag_action peer_af_flag_action_list
[] =
2374 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
2375 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
2376 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
2377 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
2378 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
2379 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
2380 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
2381 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
2382 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
2383 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
2384 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
2385 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
2386 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
2387 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
2388 { PEER_FLAG_NEXTHOP_SELF_ALL
, 1, peer_change_reset_out
},
2392 /* Proper action set. */
2394 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
2395 struct peer_flag_action
*action
, u_int32_t flag
)
2401 const struct peer_flag_action
*match
= NULL
;
2403 /* Check peer's frag action. */
2404 for (i
= 0; i
< size
; i
++)
2406 match
= &action_list
[i
];
2408 if (match
->flag
== 0)
2411 if (match
->flag
& flag
)
2415 if (match
->type
== peer_change_reset_in
)
2417 if (match
->type
== peer_change_reset_out
)
2419 if (match
->type
== peer_change_reset
)
2424 if (match
->not_for_member
)
2425 action
->not_for_member
= 1;
2429 /* Set peer clear type. */
2430 if (reset_in
&& reset_out
)
2431 action
->type
= peer_change_reset
;
2433 action
->type
= peer_change_reset_in
;
2435 action
->type
= peer_change_reset_out
;
2437 action
->type
= peer_change_none
;
2443 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2445 if (flag
== PEER_FLAG_SHUTDOWN
)
2447 if (CHECK_FLAG (peer
->flags
, flag
))
2449 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2450 peer_nsf_stop (peer
);
2452 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
2453 if (peer
->t_pmax_restart
)
2455 BGP_TIMER_OFF (peer
->t_pmax_restart
);
2456 if (BGP_DEBUG (events
, EVENTS
))
2457 zlog_debug ("%s Maximum-prefix restart timer canceled",
2461 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2462 peer_nsf_stop (peer
);
2464 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2465 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2466 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2468 BGP_EVENT_ADD (peer
, BGP_Stop
);
2472 peer
->v_start
= BGP_INIT_START_TIMER
;
2473 BGP_EVENT_ADD (peer
, BGP_Stop
);
2476 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2478 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2479 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2480 else if (flag
== PEER_FLAG_PASSIVE
)
2481 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2482 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
2483 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2485 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2486 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2489 BGP_EVENT_ADD (peer
, BGP_Stop
);
2492 /* Change specified peer flag. */
2494 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2498 struct peer_group
*group
;
2499 struct listnode
*node
, *nnode
;
2500 struct peer_flag_action action
;
2502 memset (&action
, 0, sizeof (struct peer_flag_action
));
2503 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2505 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2507 /* No flag action is found. */
2509 return BGP_ERR_INVALID_FLAG
;
2511 /* Not for peer-group member. */
2512 if (action
.not_for_member
&& peer_group_active (peer
))
2513 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2515 /* When unset the peer-group member's flag we have to check
2516 peer-group configuration. */
2517 if (! set
&& peer_group_active (peer
))
2518 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2520 if (flag
== PEER_FLAG_SHUTDOWN
)
2521 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2523 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2526 /* Flag conflict check. */
2528 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2529 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2530 return BGP_ERR_PEER_FLAG_CONFLICT
;
2532 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2534 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2536 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2541 SET_FLAG (peer
->flags
, flag
);
2543 UNSET_FLAG (peer
->flags
, flag
);
2545 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2547 if (action
.type
== peer_change_reset
)
2548 peer_flag_modify_action (peer
, flag
);
2553 /* peer-group member updates. */
2554 group
= peer
->group
;
2556 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2558 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2561 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2565 SET_FLAG (peer
->flags
, flag
);
2567 UNSET_FLAG (peer
->flags
, flag
);
2569 if (action
.type
== peer_change_reset
)
2570 peer_flag_modify_action (peer
, flag
);
2576 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2578 return peer_flag_modify (peer
, flag
, 1);
2582 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2584 return peer_flag_modify (peer
, flag
, 0);
2588 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2590 if (peer
->af_group
[afi
][safi
])
2596 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2601 struct listnode
*node
, *nnode
;
2602 struct peer_group
*group
;
2603 struct peer_flag_action action
;
2605 memset (&action
, 0, sizeof (struct peer_flag_action
));
2606 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2608 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2610 /* No flag action is found. */
2612 return BGP_ERR_INVALID_FLAG
;
2614 /* Adress family must be activated. */
2615 if (! peer
->afc
[afi
][safi
])
2616 return BGP_ERR_PEER_INACTIVE
;
2618 /* Not for peer-group member. */
2619 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2620 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2622 /* Spcecial check for reflector client. */
2623 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2624 && peer_sort (peer
) != BGP_PEER_IBGP
)
2625 return BGP_ERR_NOT_INTERNAL_PEER
;
2627 /* Spcecial check for remove-private-AS. */
2628 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2629 && peer_sort (peer
) == BGP_PEER_IBGP
)
2630 return BGP_ERR_REMOVE_PRIVATE_AS
;
2632 /* When unset the peer-group member's flag we have to check
2633 peer-group configuration. */
2634 if (! set
&& peer
->af_group
[afi
][safi
])
2635 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2636 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2638 /* When current flag configuration is same as requested one. */
2639 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2641 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2643 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2648 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2650 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2652 /* Execute action when peer is established. */
2653 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2654 && peer
->status
== Established
)
2656 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2657 bgp_clear_adj_in (peer
, afi
, safi
);
2660 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2661 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2662 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2663 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2664 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2665 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2666 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2667 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2669 peer_change_action (peer
, afi
, safi
, action
.type
);
2674 /* Peer group member updates. */
2675 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2677 group
= peer
->group
;
2679 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2681 if (! peer
->af_group
[afi
][safi
])
2684 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2687 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2691 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2693 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2695 if (peer
->status
== Established
)
2697 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2698 bgp_clear_adj_in (peer
, afi
, safi
);
2701 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2702 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2703 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2704 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2705 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2706 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2707 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2708 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2710 peer_change_action (peer
, afi
, safi
, action
.type
);
2719 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2721 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2725 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2727 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2730 /* EBGP multihop configuration. */
2732 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2734 struct peer_group
*group
;
2735 struct listnode
*node
, *nnode
;
2738 if (peer
->sort
== BGP_PEER_IBGP
)
2741 /* see comment in peer_ttl_security_hops_set() */
2744 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2746 group
= peer
->group
;
2747 if (group
->conf
->gtsm_hops
!= 0)
2748 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2750 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
2752 if (peer1
->sort
== BGP_PEER_IBGP
)
2755 if (peer1
->gtsm_hops
!= 0)
2756 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2761 if (peer
->gtsm_hops
!= 0)
2762 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2768 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2770 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2771 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2775 group
= peer
->group
;
2776 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2778 if (peer
->sort
== BGP_PEER_IBGP
)
2781 peer
->ttl
= group
->conf
->ttl
;
2784 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2791 peer_ebgp_multihop_unset (struct peer
*peer
)
2793 struct peer_group
*group
;
2794 struct listnode
*node
, *nnode
;
2796 if (peer
->sort
== BGP_PEER_IBGP
)
2799 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
2800 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2802 if (peer_group_active (peer
))
2803 peer
->ttl
= peer
->group
->conf
->ttl
;
2807 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2809 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2810 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2814 group
= peer
->group
;
2815 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2817 if (peer
->sort
== BGP_PEER_IBGP
)
2823 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2829 /* Neighbor description. */
2831 peer_description_set (struct peer
*peer
, char *desc
)
2834 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2836 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
2842 peer_description_unset (struct peer
*peer
)
2845 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2852 /* Neighbor update-source. */
2854 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
2856 struct peer_group
*group
;
2857 struct listnode
*node
, *nnode
;
2859 if (peer
->update_if
)
2861 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2862 && strcmp (peer
->update_if
, ifname
) == 0)
2865 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2866 peer
->update_if
= NULL
;
2869 if (peer
->update_source
)
2871 sockunion_free (peer
->update_source
);
2872 peer
->update_source
= NULL
;
2875 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2877 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2879 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2881 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2882 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2883 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2886 BGP_EVENT_ADD (peer
, BGP_Stop
);
2890 /* peer-group member updates. */
2891 group
= peer
->group
;
2892 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2894 if (peer
->update_if
)
2896 if (strcmp (peer
->update_if
, ifname
) == 0)
2899 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2900 peer
->update_if
= NULL
;
2903 if (peer
->update_source
)
2905 sockunion_free (peer
->update_source
);
2906 peer
->update_source
= NULL
;
2909 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2911 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2913 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2914 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2915 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2918 BGP_EVENT_ADD (peer
, BGP_Stop
);
2924 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
2926 struct peer_group
*group
;
2927 struct listnode
*node
, *nnode
;
2929 if (peer
->update_source
)
2931 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2932 && sockunion_cmp (peer
->update_source
, su
) == 0)
2934 sockunion_free (peer
->update_source
);
2935 peer
->update_source
= NULL
;
2938 if (peer
->update_if
)
2940 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2941 peer
->update_if
= NULL
;
2944 peer
->update_source
= sockunion_dup (su
);
2946 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2948 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2950 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2951 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2952 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2955 BGP_EVENT_ADD (peer
, BGP_Stop
);
2959 /* peer-group member updates. */
2960 group
= peer
->group
;
2961 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2963 if (peer
->update_source
)
2965 if (sockunion_cmp (peer
->update_source
, su
) == 0)
2967 sockunion_free (peer
->update_source
);
2968 peer
->update_source
= NULL
;
2971 if (peer
->update_if
)
2973 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2974 peer
->update_if
= NULL
;
2977 peer
->update_source
= sockunion_dup (su
);
2979 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2981 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2982 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2983 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2986 BGP_EVENT_ADD (peer
, BGP_Stop
);
2992 peer_update_source_unset (struct peer
*peer
)
2994 union sockunion
*su
;
2995 struct peer_group
*group
;
2996 struct listnode
*node
, *nnode
;
2998 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2999 && ! peer
->update_source
3000 && ! peer
->update_if
)
3003 if (peer
->update_source
)
3005 sockunion_free (peer
->update_source
);
3006 peer
->update_source
= NULL
;
3008 if (peer
->update_if
)
3010 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3011 peer
->update_if
= NULL
;
3014 if (peer_group_active (peer
))
3016 group
= peer
->group
;
3018 if (group
->conf
->update_source
)
3020 su
= sockunion_dup (group
->conf
->update_source
);
3021 peer
->update_source
= su
;
3023 else if (group
->conf
->update_if
)
3025 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3028 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3030 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3032 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3033 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3034 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3037 BGP_EVENT_ADD (peer
, BGP_Stop
);
3041 /* peer-group member updates. */
3042 group
= peer
->group
;
3043 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3045 if (! peer
->update_source
&& ! peer
->update_if
)
3048 if (peer
->update_source
)
3050 sockunion_free (peer
->update_source
);
3051 peer
->update_source
= NULL
;
3054 if (peer
->update_if
)
3056 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3057 peer
->update_if
= NULL
;
3060 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3062 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3063 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3064 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3067 BGP_EVENT_ADD (peer
, BGP_Stop
);
3073 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3076 struct peer_group
*group
;
3077 struct listnode
*node
, *nnode
;
3079 /* Adress family must be activated. */
3080 if (! peer
->afc
[afi
][safi
])
3081 return BGP_ERR_PEER_INACTIVE
;
3083 /* Default originate can't be used for peer group memeber. */
3084 if (peer_is_group_member (peer
, afi
, safi
))
3085 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3087 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3088 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3089 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3091 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3095 if (peer
->default_rmap
[afi
][safi
].name
)
3096 free (peer
->default_rmap
[afi
][safi
].name
);
3097 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3098 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3102 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3104 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3105 bgp_default_originate (peer
, afi
, safi
, 0);
3109 /* peer-group member updates. */
3110 group
= peer
->group
;
3111 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3113 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3117 if (peer
->default_rmap
[afi
][safi
].name
)
3118 free (peer
->default_rmap
[afi
][safi
].name
);
3119 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3120 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3123 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3124 bgp_default_originate (peer
, afi
, safi
, 0);
3130 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3132 struct peer_group
*group
;
3133 struct listnode
*node
, *nnode
;
3135 /* Adress family must be activated. */
3136 if (! peer
->afc
[afi
][safi
])
3137 return BGP_ERR_PEER_INACTIVE
;
3139 /* Default originate can't be used for peer group memeber. */
3140 if (peer_is_group_member (peer
, afi
, safi
))
3141 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3143 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3145 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3147 if (peer
->default_rmap
[afi
][safi
].name
)
3148 free (peer
->default_rmap
[afi
][safi
].name
);
3149 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3150 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3153 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3155 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3156 bgp_default_originate (peer
, afi
, safi
, 1);
3160 /* peer-group member updates. */
3161 group
= peer
->group
;
3162 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3164 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3166 if (peer
->default_rmap
[afi
][safi
].name
)
3167 free (peer
->default_rmap
[afi
][safi
].name
);
3168 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3169 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3171 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3172 bgp_default_originate (peer
, afi
, safi
, 1);
3178 peer_port_set (struct peer
*peer
, u_int16_t port
)
3185 peer_port_unset (struct peer
*peer
)
3187 peer
->port
= BGP_PORT_DEFAULT
;
3191 /* neighbor weight. */
3193 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
3195 struct peer_group
*group
;
3196 struct listnode
*node
, *nnode
;
3198 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3199 peer
->weight
= weight
;
3201 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3204 /* peer-group member updates. */
3205 group
= peer
->group
;
3206 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3208 peer
->weight
= group
->conf
->weight
;
3214 peer_weight_unset (struct peer
*peer
)
3216 struct peer_group
*group
;
3217 struct listnode
*node
, *nnode
;
3219 /* Set default weight. */
3220 if (peer_group_active (peer
))
3221 peer
->weight
= peer
->group
->conf
->weight
;
3225 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3227 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3230 /* peer-group member updates. */
3231 group
= peer
->group
;
3232 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3240 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
3242 struct peer_group
*group
;
3243 struct listnode
*node
, *nnode
;
3245 /* Not for peer group memeber. */
3246 if (peer_group_active (peer
))
3247 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3249 /* keepalive value check. */
3250 if (keepalive
> 65535)
3251 return BGP_ERR_INVALID_VALUE
;
3253 /* Holdtime value check. */
3254 if (holdtime
> 65535)
3255 return BGP_ERR_INVALID_VALUE
;
3257 /* Holdtime value must be either 0 or greater than 3. */
3258 if (holdtime
< 3 && holdtime
!= 0)
3259 return BGP_ERR_INVALID_VALUE
;
3261 /* Set value to the configuration. */
3262 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3263 peer
->holdtime
= holdtime
;
3264 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
3266 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3269 /* peer-group member updates. */
3270 group
= peer
->group
;
3271 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3273 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3274 peer
->holdtime
= group
->conf
->holdtime
;
3275 peer
->keepalive
= group
->conf
->keepalive
;
3281 peer_timers_unset (struct peer
*peer
)
3283 struct peer_group
*group
;
3284 struct listnode
*node
, *nnode
;
3286 if (peer_group_active (peer
))
3287 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3289 /* Clear configuration. */
3290 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3291 peer
->keepalive
= 0;
3294 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3297 /* peer-group member updates. */
3298 group
= peer
->group
;
3299 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3301 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3303 peer
->keepalive
= 0;
3310 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
3312 struct peer_group
*group
;
3313 struct listnode
*node
, *nnode
;
3315 if (peer_group_active (peer
))
3316 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3318 if (connect
> 65535)
3319 return BGP_ERR_INVALID_VALUE
;
3321 /* Set value to the configuration. */
3322 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3323 peer
->connect
= connect
;
3325 /* Set value to timer setting. */
3326 peer
->v_connect
= connect
;
3328 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3331 /* peer-group member updates. */
3332 group
= peer
->group
;
3333 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3335 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3336 peer
->connect
= connect
;
3337 peer
->v_connect
= connect
;
3343 peer_timers_connect_unset (struct peer
*peer
)
3345 struct peer_group
*group
;
3346 struct listnode
*node
, *nnode
;
3348 if (peer_group_active (peer
))
3349 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3351 /* Clear configuration. */
3352 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3355 /* Set timer setting to default value. */
3356 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3358 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3361 /* peer-group member updates. */
3362 group
= peer
->group
;
3363 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3365 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3367 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3373 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3375 struct peer_group
*group
;
3376 struct listnode
*node
, *nnode
;
3378 if (peer_group_active (peer
))
3379 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3382 return BGP_ERR_INVALID_VALUE
;
3384 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3385 peer
->routeadv
= routeadv
;
3386 peer
->v_routeadv
= routeadv
;
3388 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3391 /* peer-group member updates. */
3392 group
= peer
->group
;
3393 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3395 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3396 peer
->routeadv
= routeadv
;
3397 peer
->v_routeadv
= routeadv
;
3404 peer_advertise_interval_unset (struct peer
*peer
)
3406 struct peer_group
*group
;
3407 struct listnode
*node
, *nnode
;
3409 if (peer_group_active (peer
))
3410 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3412 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3415 if (peer
->sort
== BGP_PEER_IBGP
)
3416 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3418 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3420 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3423 /* peer-group member updates. */
3424 group
= peer
->group
;
3425 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3427 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3430 if (peer
->sort
== BGP_PEER_IBGP
)
3431 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3433 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3439 /* neighbor interface */
3441 peer_interface_set (struct peer
*peer
, const char *str
)
3444 free (peer
->ifname
);
3445 peer
->ifname
= strdup (str
);
3451 peer_interface_unset (struct peer
*peer
)
3454 free (peer
->ifname
);
3455 peer
->ifname
= NULL
;
3462 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3464 struct peer_group
*group
;
3465 struct listnode
*node
, *nnode
;
3467 if (allow_num
< 1 || allow_num
> 10)
3468 return BGP_ERR_INVALID_VALUE
;
3470 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3472 peer
->allowas_in
[afi
][safi
] = allow_num
;
3473 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3474 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3477 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3480 group
= peer
->group
;
3481 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3483 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3485 peer
->allowas_in
[afi
][safi
] = allow_num
;
3486 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3487 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3495 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3497 struct peer_group
*group
;
3498 struct listnode
*node
, *nnode
;
3500 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3502 peer
->allowas_in
[afi
][safi
] = 0;
3503 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3506 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3509 group
= peer
->group
;
3510 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3512 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3514 peer
->allowas_in
[afi
][safi
] = 0;
3515 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3522 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
3524 struct bgp
*bgp
= peer
->bgp
;
3525 struct peer_group
*group
;
3526 struct listnode
*node
, *nnode
;
3528 if (peer_sort (peer
) != BGP_PEER_EBGP
3529 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3530 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3533 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3535 if (peer_group_active (peer
))
3536 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3539 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
3541 if (peer
->change_local_as
== as
&&
3542 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3543 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
3544 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
3545 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
3548 peer
->change_local_as
= as
;
3550 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3552 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3555 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3557 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3559 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3561 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3563 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3564 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3565 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3568 BGP_EVENT_ADD (peer
, BGP_Stop
);
3573 group
= peer
->group
;
3574 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3576 peer
->change_local_as
= as
;
3578 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3580 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3583 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3585 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3587 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3589 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3590 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3591 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3594 BGP_EVENT_ADD (peer
, BGP_Stop
);
3601 peer_local_as_unset (struct peer
*peer
)
3603 struct peer_group
*group
;
3604 struct listnode
*node
, *nnode
;
3606 if (peer_group_active (peer
))
3607 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3609 if (! peer
->change_local_as
)
3612 peer
->change_local_as
= 0;
3613 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3614 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3616 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3618 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3620 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3621 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3622 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3625 BGP_EVENT_ADD (peer
, BGP_Stop
);
3630 group
= peer
->group
;
3631 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3633 peer
->change_local_as
= 0;
3634 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3635 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3637 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3639 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3640 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3641 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3644 BGP_EVENT_ADD (peer
, BGP_Stop
);
3649 /* Set password for authenticating with the peer. */
3651 peer_password_set (struct peer
*peer
, const char *password
)
3653 struct listnode
*nn
, *nnode
;
3654 int len
= password
? strlen(password
) : 0;
3655 int ret
= BGP_SUCCESS
;
3657 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
3658 return BGP_ERR_INVALID_VALUE
;
3660 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
3661 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3665 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3667 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
3669 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3671 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3672 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3674 BGP_EVENT_ADD (peer
, BGP_Stop
);
3676 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
3679 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3681 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
3685 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3687 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
3689 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3690 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3692 BGP_EVENT_ADD (peer
, BGP_Stop
);
3694 if (bgp_md5_set (peer
) < 0)
3695 ret
= BGP_ERR_TCPSIG_FAILED
;
3702 peer_password_unset (struct peer
*peer
)
3704 struct listnode
*nn
, *nnode
;
3707 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3710 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3712 if (peer_group_active (peer
)
3713 && peer
->group
->conf
->password
3714 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
3715 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3717 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3718 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3720 BGP_EVENT_ADD (peer
, BGP_Stop
);
3723 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3725 peer
->password
= NULL
;
3732 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3733 peer
->password
= NULL
;
3735 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3737 if (!peer
->password
)
3740 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3741 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3743 BGP_EVENT_ADD (peer
, BGP_Stop
);
3745 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3746 peer
->password
= NULL
;
3754 /* Set distribute list to the peer. */
3756 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3759 struct bgp_filter
*filter
;
3760 struct peer_group
*group
;
3761 struct listnode
*node
, *nnode
;
3763 if (! peer
->afc
[afi
][safi
])
3764 return BGP_ERR_PEER_INACTIVE
;
3766 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3767 return BGP_ERR_INVALID_VALUE
;
3769 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3770 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3772 filter
= &peer
->filter
[afi
][safi
];
3774 if (filter
->plist
[direct
].name
)
3775 return BGP_ERR_PEER_FILTER_CONFLICT
;
3777 if (filter
->dlist
[direct
].name
)
3778 free (filter
->dlist
[direct
].name
);
3779 filter
->dlist
[direct
].name
= strdup (name
);
3780 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3782 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3785 group
= peer
->group
;
3786 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3788 filter
= &peer
->filter
[afi
][safi
];
3790 if (! peer
->af_group
[afi
][safi
])
3793 if (filter
->dlist
[direct
].name
)
3794 free (filter
->dlist
[direct
].name
);
3795 filter
->dlist
[direct
].name
= strdup (name
);
3796 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3803 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3805 struct bgp_filter
*filter
;
3806 struct bgp_filter
*gfilter
;
3807 struct peer_group
*group
;
3808 struct listnode
*node
, *nnode
;
3810 if (! peer
->afc
[afi
][safi
])
3811 return BGP_ERR_PEER_INACTIVE
;
3813 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3814 return BGP_ERR_INVALID_VALUE
;
3816 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3817 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3819 filter
= &peer
->filter
[afi
][safi
];
3821 /* apply peer-group filter */
3822 if (peer
->af_group
[afi
][safi
])
3824 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3826 if (gfilter
->dlist
[direct
].name
)
3828 if (filter
->dlist
[direct
].name
)
3829 free (filter
->dlist
[direct
].name
);
3830 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
3831 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
3836 if (filter
->dlist
[direct
].name
)
3837 free (filter
->dlist
[direct
].name
);
3838 filter
->dlist
[direct
].name
= NULL
;
3839 filter
->dlist
[direct
].alist
= NULL
;
3841 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3844 group
= peer
->group
;
3845 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3847 filter
= &peer
->filter
[afi
][safi
];
3849 if (! peer
->af_group
[afi
][safi
])
3852 if (filter
->dlist
[direct
].name
)
3853 free (filter
->dlist
[direct
].name
);
3854 filter
->dlist
[direct
].name
= NULL
;
3855 filter
->dlist
[direct
].alist
= NULL
;
3861 /* Update distribute list. */
3863 peer_distribute_update (struct access_list
*access
)
3868 struct listnode
*mnode
, *mnnode
;
3869 struct listnode
*node
, *nnode
;
3872 struct peer_group
*group
;
3873 struct bgp_filter
*filter
;
3875 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3877 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3879 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3880 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3882 filter
= &peer
->filter
[afi
][safi
];
3884 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3886 if (filter
->dlist
[direct
].name
)
3887 filter
->dlist
[direct
].alist
=
3888 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3890 filter
->dlist
[direct
].alist
= NULL
;
3894 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3896 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3897 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3899 filter
= &group
->conf
->filter
[afi
][safi
];
3901 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3903 if (filter
->dlist
[direct
].name
)
3904 filter
->dlist
[direct
].alist
=
3905 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3907 filter
->dlist
[direct
].alist
= NULL
;
3914 /* Set prefix list to the peer. */
3916 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3919 struct bgp_filter
*filter
;
3920 struct peer_group
*group
;
3921 struct listnode
*node
, *nnode
;
3923 if (! peer
->afc
[afi
][safi
])
3924 return BGP_ERR_PEER_INACTIVE
;
3926 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3927 return BGP_ERR_INVALID_VALUE
;
3929 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3930 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3932 filter
= &peer
->filter
[afi
][safi
];
3934 if (filter
->dlist
[direct
].name
)
3935 return BGP_ERR_PEER_FILTER_CONFLICT
;
3937 if (filter
->plist
[direct
].name
)
3938 free (filter
->plist
[direct
].name
);
3939 filter
->plist
[direct
].name
= strdup (name
);
3940 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3942 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3945 group
= peer
->group
;
3946 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3948 filter
= &peer
->filter
[afi
][safi
];
3950 if (! peer
->af_group
[afi
][safi
])
3953 if (filter
->plist
[direct
].name
)
3954 free (filter
->plist
[direct
].name
);
3955 filter
->plist
[direct
].name
= strdup (name
);
3956 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3962 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3964 struct bgp_filter
*filter
;
3965 struct bgp_filter
*gfilter
;
3966 struct peer_group
*group
;
3967 struct listnode
*node
, *nnode
;
3969 if (! peer
->afc
[afi
][safi
])
3970 return BGP_ERR_PEER_INACTIVE
;
3972 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3973 return BGP_ERR_INVALID_VALUE
;
3975 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3976 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3978 filter
= &peer
->filter
[afi
][safi
];
3980 /* apply peer-group filter */
3981 if (peer
->af_group
[afi
][safi
])
3983 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3985 if (gfilter
->plist
[direct
].name
)
3987 if (filter
->plist
[direct
].name
)
3988 free (filter
->plist
[direct
].name
);
3989 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
3990 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
3995 if (filter
->plist
[direct
].name
)
3996 free (filter
->plist
[direct
].name
);
3997 filter
->plist
[direct
].name
= NULL
;
3998 filter
->plist
[direct
].plist
= NULL
;
4000 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4003 group
= peer
->group
;
4004 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4006 filter
= &peer
->filter
[afi
][safi
];
4008 if (! peer
->af_group
[afi
][safi
])
4011 if (filter
->plist
[direct
].name
)
4012 free (filter
->plist
[direct
].name
);
4013 filter
->plist
[direct
].name
= NULL
;
4014 filter
->plist
[direct
].plist
= NULL
;
4020 /* Update prefix-list list. */
4022 peer_prefix_list_update (struct prefix_list
*plist
)
4024 struct listnode
*mnode
, *mnnode
;
4025 struct listnode
*node
, *nnode
;
4028 struct peer_group
*group
;
4029 struct bgp_filter
*filter
;
4034 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4036 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4038 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4039 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4041 filter
= &peer
->filter
[afi
][safi
];
4043 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4045 if (filter
->plist
[direct
].name
)
4046 filter
->plist
[direct
].plist
=
4047 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4049 filter
->plist
[direct
].plist
= NULL
;
4053 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4055 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4056 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4058 filter
= &group
->conf
->filter
[afi
][safi
];
4060 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4062 if (filter
->plist
[direct
].name
)
4063 filter
->plist
[direct
].plist
=
4064 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4066 filter
->plist
[direct
].plist
= NULL
;
4074 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4077 struct bgp_filter
*filter
;
4078 struct peer_group
*group
;
4079 struct listnode
*node
, *nnode
;
4081 if (! peer
->afc
[afi
][safi
])
4082 return BGP_ERR_PEER_INACTIVE
;
4084 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4085 return BGP_ERR_INVALID_VALUE
;
4087 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4088 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4090 filter
= &peer
->filter
[afi
][safi
];
4092 if (filter
->aslist
[direct
].name
)
4093 free (filter
->aslist
[direct
].name
);
4094 filter
->aslist
[direct
].name
= strdup (name
);
4095 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4097 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4100 group
= peer
->group
;
4101 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4103 filter
= &peer
->filter
[afi
][safi
];
4105 if (! peer
->af_group
[afi
][safi
])
4108 if (filter
->aslist
[direct
].name
)
4109 free (filter
->aslist
[direct
].name
);
4110 filter
->aslist
[direct
].name
= strdup (name
);
4111 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4117 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
4119 struct bgp_filter
*filter
;
4120 struct bgp_filter
*gfilter
;
4121 struct peer_group
*group
;
4122 struct listnode
*node
, *nnode
;
4124 if (! peer
->afc
[afi
][safi
])
4125 return BGP_ERR_PEER_INACTIVE
;
4127 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4128 return BGP_ERR_INVALID_VALUE
;
4130 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4131 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4133 filter
= &peer
->filter
[afi
][safi
];
4135 /* apply peer-group filter */
4136 if (peer
->af_group
[afi
][safi
])
4138 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4140 if (gfilter
->aslist
[direct
].name
)
4142 if (filter
->aslist
[direct
].name
)
4143 free (filter
->aslist
[direct
].name
);
4144 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
4145 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
4150 if (filter
->aslist
[direct
].name
)
4151 free (filter
->aslist
[direct
].name
);
4152 filter
->aslist
[direct
].name
= NULL
;
4153 filter
->aslist
[direct
].aslist
= NULL
;
4155 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4158 group
= peer
->group
;
4159 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4161 filter
= &peer
->filter
[afi
][safi
];
4163 if (! peer
->af_group
[afi
][safi
])
4166 if (filter
->aslist
[direct
].name
)
4167 free (filter
->aslist
[direct
].name
);
4168 filter
->aslist
[direct
].name
= NULL
;
4169 filter
->aslist
[direct
].aslist
= NULL
;
4176 peer_aslist_update (void)
4181 struct listnode
*mnode
, *mnnode
;
4182 struct listnode
*node
, *nnode
;
4185 struct peer_group
*group
;
4186 struct bgp_filter
*filter
;
4188 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4190 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4192 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4193 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4195 filter
= &peer
->filter
[afi
][safi
];
4197 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4199 if (filter
->aslist
[direct
].name
)
4200 filter
->aslist
[direct
].aslist
=
4201 as_list_lookup (filter
->aslist
[direct
].name
);
4203 filter
->aslist
[direct
].aslist
= NULL
;
4207 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4209 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4210 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4212 filter
= &group
->conf
->filter
[afi
][safi
];
4214 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4216 if (filter
->aslist
[direct
].name
)
4217 filter
->aslist
[direct
].aslist
=
4218 as_list_lookup (filter
->aslist
[direct
].name
);
4220 filter
->aslist
[direct
].aslist
= NULL
;
4227 /* Set route-map to the peer. */
4229 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4232 struct bgp_filter
*filter
;
4233 struct peer_group
*group
;
4234 struct listnode
*node
, *nnode
;
4236 if (! peer
->afc
[afi
][safi
])
4237 return BGP_ERR_PEER_INACTIVE
;
4239 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4240 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4241 return BGP_ERR_INVALID_VALUE
;
4243 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4244 && peer_is_group_member (peer
, afi
, safi
))
4245 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4247 filter
= &peer
->filter
[afi
][safi
];
4249 if (filter
->map
[direct
].name
)
4250 free (filter
->map
[direct
].name
);
4252 filter
->map
[direct
].name
= strdup (name
);
4253 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4255 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4258 group
= peer
->group
;
4259 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4261 filter
= &peer
->filter
[afi
][safi
];
4263 if (! peer
->af_group
[afi
][safi
])
4266 if (filter
->map
[direct
].name
)
4267 free (filter
->map
[direct
].name
);
4268 filter
->map
[direct
].name
= strdup (name
);
4269 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4274 /* Unset route-map from the peer. */
4276 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4278 struct bgp_filter
*filter
;
4279 struct bgp_filter
*gfilter
;
4280 struct peer_group
*group
;
4281 struct listnode
*node
, *nnode
;
4283 if (! peer
->afc
[afi
][safi
])
4284 return BGP_ERR_PEER_INACTIVE
;
4286 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4287 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4288 return BGP_ERR_INVALID_VALUE
;
4290 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4291 && peer_is_group_member (peer
, afi
, safi
))
4292 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4294 filter
= &peer
->filter
[afi
][safi
];
4296 /* apply peer-group filter */
4297 if (peer
->af_group
[afi
][safi
])
4299 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4301 if (gfilter
->map
[direct
].name
)
4303 if (filter
->map
[direct
].name
)
4304 free (filter
->map
[direct
].name
);
4305 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
4306 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
4311 if (filter
->map
[direct
].name
)
4312 free (filter
->map
[direct
].name
);
4313 filter
->map
[direct
].name
= NULL
;
4314 filter
->map
[direct
].map
= NULL
;
4316 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4319 group
= peer
->group
;
4320 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4322 filter
= &peer
->filter
[afi
][safi
];
4324 if (! peer
->af_group
[afi
][safi
])
4327 if (filter
->map
[direct
].name
)
4328 free (filter
->map
[direct
].name
);
4329 filter
->map
[direct
].name
= NULL
;
4330 filter
->map
[direct
].map
= NULL
;
4335 /* Set unsuppress-map to the peer. */
4337 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4340 struct bgp_filter
*filter
;
4341 struct peer_group
*group
;
4342 struct listnode
*node
, *nnode
;
4344 if (! peer
->afc
[afi
][safi
])
4345 return BGP_ERR_PEER_INACTIVE
;
4347 if (peer_is_group_member (peer
, afi
, safi
))
4348 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4350 filter
= &peer
->filter
[afi
][safi
];
4352 if (filter
->usmap
.name
)
4353 free (filter
->usmap
.name
);
4355 filter
->usmap
.name
= strdup (name
);
4356 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4358 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4361 group
= peer
->group
;
4362 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4364 filter
= &peer
->filter
[afi
][safi
];
4366 if (! peer
->af_group
[afi
][safi
])
4369 if (filter
->usmap
.name
)
4370 free (filter
->usmap
.name
);
4371 filter
->usmap
.name
= strdup (name
);
4372 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4377 /* Unset route-map from the peer. */
4379 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4381 struct bgp_filter
*filter
;
4382 struct peer_group
*group
;
4383 struct listnode
*node
, *nnode
;
4385 if (! peer
->afc
[afi
][safi
])
4386 return BGP_ERR_PEER_INACTIVE
;
4388 if (peer_is_group_member (peer
, afi
, safi
))
4389 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4391 filter
= &peer
->filter
[afi
][safi
];
4393 if (filter
->usmap
.name
)
4394 free (filter
->usmap
.name
);
4395 filter
->usmap
.name
= NULL
;
4396 filter
->usmap
.map
= NULL
;
4398 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4401 group
= peer
->group
;
4402 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4404 filter
= &peer
->filter
[afi
][safi
];
4406 if (! peer
->af_group
[afi
][safi
])
4409 if (filter
->usmap
.name
)
4410 free (filter
->usmap
.name
);
4411 filter
->usmap
.name
= NULL
;
4412 filter
->usmap
.map
= NULL
;
4418 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4419 u_int32_t max
, u_char threshold
,
4420 int warning
, u_int16_t restart
)
4422 struct peer_group
*group
;
4423 struct listnode
*node
, *nnode
;
4425 if (! peer
->afc
[afi
][safi
])
4426 return BGP_ERR_PEER_INACTIVE
;
4428 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4429 peer
->pmax
[afi
][safi
] = max
;
4430 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4431 peer
->pmax_restart
[afi
][safi
] = restart
;
4433 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4435 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4437 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4440 group
= peer
->group
;
4441 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4443 if (! peer
->af_group
[afi
][safi
])
4446 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4447 peer
->pmax
[afi
][safi
] = max
;
4448 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4449 peer
->pmax_restart
[afi
][safi
] = restart
;
4451 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4453 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4459 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4461 struct peer_group
*group
;
4462 struct listnode
*node
, *nnode
;
4464 if (! peer
->afc
[afi
][safi
])
4465 return BGP_ERR_PEER_INACTIVE
;
4467 /* apply peer-group config */
4468 if (peer
->af_group
[afi
][safi
])
4470 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4471 PEER_FLAG_MAX_PREFIX
))
4472 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4474 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4476 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4477 PEER_FLAG_MAX_PREFIX_WARNING
))
4478 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4480 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4482 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
4483 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4484 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
4488 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4489 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4490 peer
->pmax
[afi
][safi
] = 0;
4491 peer
->pmax_threshold
[afi
][safi
] = 0;
4492 peer
->pmax_restart
[afi
][safi
] = 0;
4494 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4497 group
= peer
->group
;
4498 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4500 if (! peer
->af_group
[afi
][safi
])
4503 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4504 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4505 peer
->pmax
[afi
][safi
] = 0;
4506 peer
->pmax_threshold
[afi
][safi
] = 0;
4507 peer
->pmax_restart
[afi
][safi
] = 0;
4512 static int is_ebgp_multihop_configured (struct peer
*peer
)
4514 struct peer_group
*group
;
4515 struct listnode
*node
, *nnode
;
4518 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4520 group
= peer
->group
;
4521 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4522 (group
->conf
->ttl
!= 1))
4525 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
4527 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
4534 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4541 /* Set # of hops between us and BGP peer. */
4543 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
4545 struct peer_group
*group
;
4546 struct listnode
*node
, *nnode
;
4549 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
4551 /* We cannot configure ttl-security hops when ebgp-multihop is already
4552 set. For non peer-groups, the check is simple. For peer-groups, it's
4553 slightly messy, because we need to check both the peer-group structure
4554 and all peer-group members for any trace of ebgp-multihop configuration
4555 before actually applying the ttl-security rules. Cisco really made a
4556 mess of this configuration parameter, and OpenBGPD got it right.
4559 if (peer
->gtsm_hops
== 0)
4561 if (is_ebgp_multihop_configured (peer
))
4562 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4564 /* specify MAXTTL on outgoing packets */
4565 /* Routine handles iBGP peers correctly */
4566 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
4571 peer
->gtsm_hops
= gtsm_hops
;
4573 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4576 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, MAXTTL
+ 1 - gtsm_hops
);
4580 group
= peer
->group
;
4581 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4583 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
4585 /* Change setting of existing peer
4586 * established then change value (may break connectivity)
4587 * not established yet (teardown session and restart)
4588 * no session then do nothing (will get handled by next connection)
4590 if (peer
->status
== Established
)
4592 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
4593 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4594 MAXTTL
+ 1 - peer
->gtsm_hops
);
4596 else if (peer
->status
< Established
)
4598 if (BGP_DEBUG (events
, EVENTS
))
4599 zlog_debug ("%s Min-ttl changed", peer
->host
);
4600 BGP_EVENT_ADD (peer
, BGP_Stop
);
4609 peer_ttl_security_hops_unset (struct peer
*peer
)
4611 struct peer_group
*group
;
4612 struct listnode
*node
, *nnode
;
4615 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
4617 /* if a peer-group member, then reset to peer-group default rather than 0 */
4618 if (peer_group_active (peer
))
4619 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
4621 peer
->gtsm_hops
= 0;
4624 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4627 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4631 group
= peer
->group
;
4632 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4634 peer
->gtsm_hops
= 0;
4637 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4641 return peer_ebgp_multihop_unset (opeer
);
4645 peer_clear (struct peer
*peer
)
4647 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4649 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
4651 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4652 if (peer
->t_pmax_restart
)
4654 BGP_TIMER_OFF (peer
->t_pmax_restart
);
4655 if (BGP_DEBUG (events
, EVENTS
))
4656 zlog_debug ("%s Maximum-prefix restart timer canceled",
4659 BGP_EVENT_ADD (peer
, BGP_Start
);
4663 peer
->v_start
= BGP_INIT_START_TIMER
;
4664 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4665 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4666 BGP_NOTIFY_CEASE_ADMIN_RESET
);
4668 BGP_EVENT_ADD (peer
, BGP_Stop
);
4674 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
4675 enum bgp_clear_type stype
)
4677 if (peer
->status
!= Established
)
4680 if (! peer
->afc
[afi
][safi
])
4681 return BGP_ERR_AF_UNCONFIGURED
;
4683 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
4685 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
4687 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
4688 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
4691 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
4692 bgp_announce_route (peer
, afi
, safi
);
4694 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4696 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
4697 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
4698 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
4700 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
4703 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
4704 prefix_type
= ORF_TYPE_PREFIX
;
4706 prefix_type
= ORF_TYPE_PREFIX_OLD
;
4708 if (filter
->plist
[FILTER_IN
].plist
)
4710 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4711 bgp_route_refresh_send (peer
, afi
, safi
,
4712 prefix_type
, REFRESH_DEFER
, 1);
4713 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
4714 REFRESH_IMMEDIATE
, 0);
4718 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4719 bgp_route_refresh_send (peer
, afi
, safi
,
4720 prefix_type
, REFRESH_IMMEDIATE
, 1);
4722 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4728 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
4729 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4731 /* If neighbor has soft reconfiguration inbound flag.
4732 Use Adj-RIB-In database. */
4733 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4734 bgp_soft_reconfig_in (peer
, afi
, safi
);
4737 /* If neighbor has route refresh capability, send route refresh
4738 message to the peer. */
4739 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4740 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4741 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4743 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
4749 /* Display peer uptime.*/
4750 /* XXX: why does this function return char * when it takes buffer? */
4752 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
4757 /* Check buffer length. */
4758 if (len
< BGP_UPTIME_LEN
)
4760 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
4761 /* XXX: should return status instead of buf... */
4762 snprintf (buf
, len
, "<error> ");
4766 /* If there is no connection has been done before print `never'. */
4769 snprintf (buf
, len
, "never ");
4773 /* Get current time. */
4774 uptime1
= bgp_clock ();
4776 tm
= gmtime (&uptime1
);
4778 /* Making formatted timer strings. */
4779 #define ONE_DAY_SECOND 60*60*24
4780 #define ONE_WEEK_SECOND 60*60*24*7
4782 if (uptime1
< ONE_DAY_SECOND
)
4783 snprintf (buf
, len
, "%02d:%02d:%02d",
4784 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
4785 else if (uptime1
< ONE_WEEK_SECOND
)
4786 snprintf (buf
, len
, "%dd%02dh%02dm",
4787 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
4789 snprintf (buf
, len
, "%02dw%dd%02dh",
4790 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
4795 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
4796 afi_t afi
, safi_t safi
)
4798 struct bgp_filter
*filter
;
4799 struct bgp_filter
*gfilter
= NULL
;
4802 int out
= FILTER_OUT
;
4805 filter
= &peer
->filter
[afi
][safi
];
4806 if (peer
->af_group
[afi
][safi
])
4807 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4809 /* distribute-list. */
4810 if (filter
->dlist
[in
].name
)
4811 if (! gfilter
|| ! gfilter
->dlist
[in
].name
4812 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
4813 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
4814 filter
->dlist
[in
].name
, VTY_NEWLINE
);
4815 if (filter
->dlist
[out
].name
&& ! gfilter
)
4816 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
4817 filter
->dlist
[out
].name
, VTY_NEWLINE
);
4820 if (filter
->plist
[in
].name
)
4821 if (! gfilter
|| ! gfilter
->plist
[in
].name
4822 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
4823 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
4824 filter
->plist
[in
].name
, VTY_NEWLINE
);
4825 if (filter
->plist
[out
].name
&& ! gfilter
)
4826 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
4827 filter
->plist
[out
].name
, VTY_NEWLINE
);
4830 if (filter
->map
[RMAP_IN
].name
)
4831 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
4832 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
4833 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
4834 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
4835 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
4836 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
4837 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
4838 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
4839 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
4840 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
4841 if (filter
->map
[RMAP_EXPORT
].name
)
4842 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
4843 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
4844 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
4845 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
4846 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
4848 /* unsuppress-map */
4849 if (filter
->usmap
.name
&& ! gfilter
)
4850 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
4851 filter
->usmap
.name
, VTY_NEWLINE
);
4854 if (filter
->aslist
[in
].name
)
4855 if (! gfilter
|| ! gfilter
->aslist
[in
].name
4856 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
4857 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
4858 filter
->aslist
[in
].name
, VTY_NEWLINE
);
4859 if (filter
->aslist
[out
].name
&& ! gfilter
)
4860 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
4861 filter
->aslist
[out
].name
, VTY_NEWLINE
);
4864 /* BGP peer configuration display function. */
4866 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
4867 struct peer
*peer
, afi_t afi
, safi_t safi
)
4869 struct peer
*g_peer
= NULL
;
4870 char buf
[SU_ADDRSTRLEN
];
4874 if (peer_group_active (peer
))
4875 g_peer
= peer
->group
->conf
;
4877 /************************************
4878 ****** Global to the neighbor ******
4879 ************************************/
4880 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4883 if (! peer_group_active (peer
))
4885 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4886 vty_out (vty
, " neighbor %s peer-group%s", addr
,
4889 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4895 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4897 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4898 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4899 peer
->group
->name
, VTY_NEWLINE
);
4903 if (peer
->change_local_as
)
4904 if (! peer_group_active (peer
))
4905 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
4906 peer
->change_local_as
,
4907 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
4909 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
4910 " replace-as" : "", VTY_NEWLINE
);
4914 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
4918 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4919 if (! peer_group_active (peer
) ||
4920 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
4921 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
4925 if (!peer_group_active (peer
)
4926 || ! g_peer
->password
4927 || strcmp (peer
->password
, g_peer
->password
) != 0)
4928 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
4932 if (peer
->port
!= BGP_PORT_DEFAULT
)
4933 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
4936 /* Local interface name. */
4938 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
4942 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
4943 if (! peer_group_active (peer
) ||
4944 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
4945 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
4947 /* EBGP multihop. */
4948 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
4949 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
4950 if (! peer_group_active (peer
) ||
4951 g_peer
->ttl
!= peer
->ttl
)
4952 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
4955 /* ttl-security hops */
4956 if (peer
->gtsm_hops
!= 0)
4957 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
4958 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
4959 peer
->gtsm_hops
, VTY_NEWLINE
);
4961 /* disable-connected-check. */
4962 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4963 if (! peer_group_active (peer
) ||
4964 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4965 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
4967 /* Update-source. */
4968 if (peer
->update_if
)
4969 if (! peer_group_active (peer
) || ! g_peer
->update_if
4970 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
4971 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4972 peer
->update_if
, VTY_NEWLINE
);
4973 if (peer
->update_source
)
4974 if (! peer_group_active (peer
) || ! g_peer
->update_source
4975 || sockunion_cmp (g_peer
->update_source
,
4976 peer
->update_source
) != 0)
4977 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4978 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
4981 /* advertisement-interval */
4982 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
4983 ! peer_group_active (peer
))
4984 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
4985 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
4988 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
4989 && ! peer_group_active (peer
))
4990 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
4991 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
4993 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
4994 ! peer_group_active (peer
))
4995 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
4996 peer
->connect
, VTY_NEWLINE
);
4998 /* Default weight. */
4999 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
5000 if (! peer_group_active (peer
) ||
5001 g_peer
->weight
!= peer
->weight
)
5002 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
5005 /* Dynamic capability. */
5006 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
5007 if (! peer_group_active (peer
) ||
5008 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
5009 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
5012 /* dont capability negotiation. */
5013 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
5014 if (! peer_group_active (peer
) ||
5015 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
5016 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
5019 /* override capability negotiation. */
5020 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
5021 if (! peer_group_active (peer
) ||
5022 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
5023 vty_out (vty
, " neighbor %s override-capability%s", addr
,
5026 /* strict capability negotiation. */
5027 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
5028 if (! peer_group_active (peer
) ||
5029 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
5030 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
5033 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
5035 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5037 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
5038 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
5042 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
5043 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
5049 /************************************
5050 ****** Per AF to the neighbor ******
5051 ************************************/
5053 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
5055 if (peer
->af_group
[afi
][safi
])
5056 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
5057 peer
->group
->name
, VTY_NEWLINE
);
5059 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
5062 /* ORF capability. */
5063 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
5064 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
5065 if (! peer
->af_group
[afi
][safi
])
5067 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
5069 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
5070 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
5071 vty_out (vty
, " both");
5072 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
5073 vty_out (vty
, " send");
5075 vty_out (vty
, " receive");
5076 vty_out (vty
, "%s", VTY_NEWLINE
);
5079 /* Route reflector client. */
5080 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
5081 && ! peer
->af_group
[afi
][safi
])
5082 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
5086 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
5087 && ! peer
->af_group
[afi
][safi
])
5088 vty_out (vty
, " neighbor %s next-hop-self%s%s", addr
,
5089 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF_ALL
) ?
5090 " all" : "", VTY_NEWLINE
);
5092 /* Remove private AS. */
5093 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
5094 && ! peer
->af_group
[afi
][safi
])
5095 vty_out (vty
, " neighbor %s remove-private-AS%s",
5098 /* send-community print. */
5099 if (! peer
->af_group
[afi
][safi
])
5101 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5103 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5104 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5105 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
5106 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5107 vty_out (vty
, " neighbor %s send-community extended%s",
5109 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5110 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
5114 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5115 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5116 vty_out (vty
, " no neighbor %s send-community both%s",
5118 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5119 vty_out (vty
, " no neighbor %s send-community extended%s",
5121 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5122 vty_out (vty
, " no neighbor %s send-community%s",
5127 /* Default information */
5128 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
5129 && ! peer
->af_group
[afi
][safi
])
5131 vty_out (vty
, " neighbor %s default-originate", addr
);
5132 if (peer
->default_rmap
[afi
][safi
].name
)
5133 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
5134 vty_out (vty
, "%s", VTY_NEWLINE
);
5137 /* Soft reconfiguration inbound. */
5138 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5139 if (! peer
->af_group
[afi
][safi
] ||
5140 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5141 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
5144 /* maximum-prefix. */
5145 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
5146 if (! peer
->af_group
[afi
][safi
]
5147 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
5148 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
5149 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
5150 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5152 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
5153 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
5154 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
5155 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5156 vty_out (vty
, " warning-only");
5157 if (peer
->pmax_restart
[afi
][safi
])
5158 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
5159 vty_out (vty
, "%s", VTY_NEWLINE
);
5162 /* Route server client. */
5163 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
5164 && ! peer
->af_group
[afi
][safi
])
5165 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
5167 /* Nexthop-local unchanged. */
5168 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
5169 && ! peer
->af_group
[afi
][safi
])
5170 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
5173 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
5174 if (! peer_group_active (peer
)
5175 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
5176 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
5178 if (peer
->allowas_in
[afi
][safi
] == 3)
5179 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
5181 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
5182 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
5186 bgp_config_write_filter (vty
, peer
, afi
, safi
);
5188 /* atribute-unchanged. */
5189 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5190 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5191 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5192 && ! peer
->af_group
[afi
][safi
])
5194 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5195 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5196 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5197 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
5199 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
5200 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
5202 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
5204 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
5205 " med" : "", VTY_NEWLINE
);
5209 /* Display "address-family" configuration header. */
5211 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
5217 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5220 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
5224 if (safi
== SAFI_MULTICAST
)
5225 vty_out (vty
, "ipv4 multicast");
5226 else if (safi
== SAFI_MPLS_VPN
)
5227 vty_out (vty
, "vpnv4 unicast");
5229 else if (afi
== AFI_IP6
)
5231 vty_out (vty
, "ipv6");
5233 if (safi
== SAFI_MULTICAST
)
5234 vty_out (vty
, " multicast");
5237 vty_out (vty
, "%s", VTY_NEWLINE
);
5242 /* Address family based peer configuration display. */
5244 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
5249 struct peer_group
*group
;
5250 struct listnode
*node
, *nnode
;
5252 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
5254 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
5256 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5258 if (group
->conf
->afc
[afi
][safi
])
5260 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5261 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
5264 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5266 if (peer
->afc
[afi
][safi
])
5268 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5270 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5271 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
5276 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
5277 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
5280 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
5286 bgp_config_write (struct vty
*vty
)
5290 struct peer_group
*group
;
5292 struct listnode
*node
, *nnode
;
5293 struct listnode
*mnode
, *mnnode
;
5295 /* BGP Multiple instance. */
5296 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5298 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
5302 /* BGP Config type. */
5303 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5305 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
5309 /* BGP configuration. */
5310 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5313 vty_out (vty
, "!%s", VTY_NEWLINE
);
5315 /* Router bgp ASN */
5316 vty_out (vty
, "router bgp %u", bgp
->as
);
5318 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5321 vty_out (vty
, " view %s", bgp
->name
);
5323 vty_out (vty
, "%s", VTY_NEWLINE
);
5325 /* No Synchronization */
5326 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5327 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
5329 /* BGP fast-external-failover. */
5330 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
5331 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
5333 /* BGP router ID. */
5334 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
5335 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
5338 /* BGP log-neighbor-changes. */
5339 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
5340 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
5342 /* BGP configuration. */
5343 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
5344 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
5346 /* BGP default ipv4-unicast. */
5347 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5348 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
5350 /* BGP default local-preference. */
5351 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
5352 vty_out (vty
, " bgp default local-preference %d%s",
5353 bgp
->default_local_pref
, VTY_NEWLINE
);
5355 /* BGP client-to-client reflection. */
5356 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
5357 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
5359 /* BGP cluster ID. */
5360 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
5361 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
5364 /* Confederation identifier*/
5365 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
5366 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
5369 /* Confederation peer */
5370 if (bgp
->confed_peers_cnt
> 0)
5374 vty_out (vty
, " bgp confederation peers");
5376 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
5377 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
5379 vty_out (vty
, "%s", VTY_NEWLINE
);
5382 /* BGP enforce-first-as. */
5383 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
5384 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
5386 /* BGP deterministic-med. */
5387 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
5388 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
5390 /* BGP update-delay. */
5391 bgp_config_write_update_delay (vty
, bgp
);
5394 bgp_config_write_wpkt_quanta (vty
, bgp
);
5396 /* BGP graceful-restart. */
5397 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
5398 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
5399 bgp
->stalepath_time
, VTY_NEWLINE
);
5400 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
5401 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
5403 /* BGP bestpath method. */
5404 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
5405 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
5406 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
5407 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
5408 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
5409 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
5411 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
5412 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
5413 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
5414 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5416 vty_out (vty
, " bgp bestpath med");
5417 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
5418 vty_out (vty
, " confed");
5419 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5420 vty_out (vty
, " missing-as-worst");
5421 vty_out (vty
, "%s", VTY_NEWLINE
);
5424 /* BGP network import check. */
5425 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
5426 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
5428 /* BGP scan interval. */
5429 bgp_config_write_scan_time (vty
);
5431 /* BGP flag dampening. */
5432 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
5433 BGP_CONFIG_DAMPENING
))
5434 bgp_config_write_damp (vty
);
5436 /* BGP static route configuration. */
5437 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5439 /* BGP redistribute configuration. */
5440 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5442 /* BGP timers configuration. */
5443 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
5444 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
5445 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
5446 bgp
->default_holdtime
, VTY_NEWLINE
);
5449 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5451 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
5454 /* Normal neighbor configuration. */
5455 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5457 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5458 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
5462 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5463 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5465 /* Distance configuration. */
5466 bgp_config_write_distance (vty
, bgp
);
5468 /* No auto-summary */
5469 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5470 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
5472 /* IPv4 multicast configuration. */
5473 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
5475 /* IPv4 VPN configuration. */
5476 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
5478 /* IPv6 unicast configuration. */
5479 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
5481 /* IPv6 multicast configuration. */
5482 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
5490 bgp_master_init (void)
5492 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
5495 bm
->bgp
= list_new ();
5496 bm
->listen_sockets
= list_new ();
5497 bm
->port
= BGP_PORT_DEFAULT
;
5498 bm
->master
= thread_master_create ();
5499 bm
->start_time
= bgp_clock ();
5506 /* BGP VTY commands installation. */
5517 bgp_route_map_init ();
5518 bgp_address_init ();
5520 bgp_mplsvpn_init ();
5522 /* Access list initialize. */
5523 access_list_init ();
5524 access_list_add_hook (peer_distribute_update
);
5525 access_list_delete_hook (peer_distribute_update
);
5527 /* Filter list initialize. */
5529 as_list_add_hook (peer_aslist_update
);
5530 as_list_delete_hook (peer_aslist_update
);
5532 /* Prefix list initialize.*/
5533 prefix_list_init ();
5534 prefix_list_add_hook (peer_prefix_list_update
);
5535 prefix_list_delete_hook (peer_prefix_list_update
);
5537 /* Community list initialize. */
5538 bgp_clist
= community_list_init ();
5542 #endif /* HAVE_SNMP */
5546 bgp_terminate (void)
5550 struct listnode
*node
, *nnode
;
5551 struct listnode
*mnode
, *mnnode
;
5553 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5554 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5555 if (peer
->status
== Established
)
5556 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5557 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
5559 bgp_cleanup_routes ();
5561 if (bm
->process_main_queue
)
5563 work_queue_free (bm
->process_main_queue
);
5564 bm
->process_main_queue
= NULL
;
5566 if (bm
->process_rsclient_queue
)
5568 work_queue_free (bm
->process_rsclient_queue
);
5569 bm
->process_rsclient_queue
= NULL
;