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
;
913 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
915 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
917 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
918 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
919 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
922 BGP_EVENT_ADD (peer
, BGP_Stop
);
924 type
= peer_sort (peer
);
927 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
928 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
929 && peer
->bgp
->as
!= as
)
930 peer
->local_as
= peer
->bgp
->confed_id
;
932 peer
->local_as
= peer
->bgp
->as
;
934 /* Advertisement-interval reset */
935 if (peer_sort (peer
) == BGP_PEER_IBGP
)
936 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
938 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
941 if (peer_sort (peer
) == BGP_PEER_IBGP
)
943 else if (type
== BGP_PEER_IBGP
)
946 /* reflector-client reset */
947 if (peer_sort (peer
) != BGP_PEER_IBGP
)
949 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
950 PEER_FLAG_REFLECTOR_CLIENT
);
951 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
952 PEER_FLAG_REFLECTOR_CLIENT
);
953 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
954 PEER_FLAG_REFLECTOR_CLIENT
);
955 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
956 PEER_FLAG_REFLECTOR_CLIENT
);
957 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
958 PEER_FLAG_REFLECTOR_CLIENT
);
962 if (peer_sort (peer
) != BGP_PEER_EBGP
)
964 peer
->change_local_as
= 0;
965 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
966 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
970 /* If peer does not exist, create new one. If peer already exists,
971 set AS number to the peer. */
973 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, as_t
*as
,
974 afi_t afi
, safi_t safi
)
979 peer
= peer_lookup (bgp
, su
);
983 /* When this peer is a member of peer-group. */
986 if (peer
->group
->conf
->as
)
988 /* Return peer group's AS number. */
989 *as
= peer
->group
->conf
->as
;
990 return BGP_ERR_PEER_GROUP_MEMBER
;
992 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
997 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1005 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1010 /* Existing peer's AS number change. */
1011 if (peer
->as
!= *as
)
1012 peer_as_change (peer
, *as
);
1017 /* If the peer is not part of our confederation, and its not an
1018 iBGP peer then spoof the source AS */
1019 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1020 && ! bgp_confederation_peers_check (bgp
, *as
)
1022 local_as
= bgp
->confed_id
;
1026 /* If this is IPv4 unicast configuration and "no bgp default
1027 ipv4-unicast" is specified. */
1029 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1030 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1031 peer
= peer_create (su
, bgp
, local_as
, *as
, 0, 0);
1033 peer
= peer_create (su
, bgp
, local_as
, *as
, afi
, safi
);
1039 /* Activate the peer or peer group for specified AFI and SAFI. */
1041 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1045 if (peer
->afc
[afi
][safi
])
1048 /* Activate the address family configuration. */
1049 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1050 peer
->afc
[afi
][safi
] = 1;
1053 active
= peer_active (peer
);
1055 peer
->afc
[afi
][safi
] = 1;
1057 if (! active
&& peer_active (peer
))
1058 bgp_timer_set (peer
);
1061 if (peer
->status
== Established
)
1063 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1065 peer
->afc_adv
[afi
][safi
] = 1;
1066 bgp_capability_send (peer
, afi
, safi
,
1068 CAPABILITY_ACTION_SET
);
1069 if (peer
->afc_recv
[afi
][safi
])
1071 peer
->afc_nego
[afi
][safi
] = 1;
1072 bgp_announce_route (peer
, afi
, safi
);
1077 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1078 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1079 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1088 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1090 struct peer_group
*group
;
1092 struct listnode
*node
, *nnode
;
1094 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1096 group
= peer
->group
;
1098 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1100 if (peer1
->af_group
[afi
][safi
])
1101 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1106 if (peer
->af_group
[afi
][safi
])
1107 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1110 if (! peer
->afc
[afi
][safi
])
1113 /* De-activate the address family configuration. */
1114 peer
->afc
[afi
][safi
] = 0;
1115 peer_af_flag_reset (peer
, afi
, safi
);
1117 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1119 if (peer
->status
== Established
)
1121 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1123 peer
->afc_adv
[afi
][safi
] = 0;
1124 peer
->afc_nego
[afi
][safi
] = 0;
1126 if (peer_active_nego (peer
))
1128 bgp_capability_send (peer
, afi
, safi
,
1130 CAPABILITY_ACTION_UNSET
);
1131 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1132 peer
->pcount
[afi
][safi
] = 0;
1136 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1137 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1138 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1143 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1144 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1145 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1153 peer_nsf_stop (struct peer
*peer
)
1158 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1159 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1161 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1162 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1163 peer
->nsf
[afi
][safi
] = 0;
1165 if (peer
->t_gr_restart
)
1167 BGP_TIMER_OFF (peer
->t_gr_restart
);
1168 if (BGP_DEBUG (events
, EVENTS
))
1169 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1171 if (peer
->t_gr_stale
)
1173 BGP_TIMER_OFF (peer
->t_gr_stale
);
1174 if (BGP_DEBUG (events
, EVENTS
))
1175 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1177 bgp_clear_route_all (peer
);
1180 /* Delete peer from confguration.
1182 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1183 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1185 * This function /should/ take care to be idempotent, to guard against
1186 * it being called multiple times through stray events that come in
1187 * that happen to result in this function being called again. That
1188 * said, getting here for a "Deleted" peer is a bug in the neighbour
1192 peer_delete (struct peer
*peer
)
1198 struct bgp_filter
*filter
;
1199 struct listnode
*pn
;
1201 assert (peer
->status
!= Deleted
);
1205 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1206 peer_nsf_stop (peer
);
1208 /* If this peer belongs to peer group, clear up the
1212 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1214 peer
= peer_unlock (peer
); /* group->peer list reference */
1215 list_delete_node (peer
->group
->peer
, pn
);
1220 /* Withdraw all information from routing table. We can not use
1221 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1222 * executed after peer structure is deleted.
1224 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1226 bgp_fsm_change_status (peer
, Deleted
);
1228 /* Password configuration */
1231 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1232 peer
->password
= NULL
;
1234 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1238 bgp_timer_set (peer
); /* stops all timers for Deleted */
1240 /* Delete from all peer list. */
1241 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1242 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1244 peer_unlock (peer
); /* bgp peer list reference */
1245 list_delete_node (bgp
->peer
, pn
);
1248 if (peer_rsclient_active (peer
)
1249 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1251 peer_unlock (peer
); /* rsclient list reference */
1252 list_delete_node (bgp
->rsclient
, pn
);
1254 /* Clear our own rsclient ribs. */
1255 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1256 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1257 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1258 PEER_FLAG_RSERVER_CLIENT
))
1259 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1262 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1263 member of a peer_group. */
1264 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1265 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1266 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1267 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1271 stream_free (peer
->ibuf
);
1273 stream_fifo_free (peer
->obuf
);
1275 stream_free (peer
->work
);
1277 stream_free(peer
->scratch
);
1279 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1281 /* Local and remote addresses. */
1283 sockunion_free (peer
->su_local
);
1284 if (peer
->su_remote
)
1285 sockunion_free (peer
->su_remote
);
1286 peer
->su_local
= peer
->su_remote
= NULL
;
1288 /* Free filter related memory. */
1289 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1290 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1292 filter
= &peer
->filter
[afi
][safi
];
1294 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1296 if (filter
->dlist
[i
].name
)
1297 free (filter
->dlist
[i
].name
);
1298 if (filter
->plist
[i
].name
)
1299 free (filter
->plist
[i
].name
);
1300 if (filter
->aslist
[i
].name
)
1301 free (filter
->aslist
[i
].name
);
1303 filter
->dlist
[i
].name
= NULL
;
1304 filter
->plist
[i
].name
= NULL
;
1305 filter
->aslist
[i
].name
= NULL
;
1307 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1309 if (filter
->map
[i
].name
)
1310 free (filter
->map
[i
].name
);
1311 filter
->map
[i
].name
= NULL
;
1314 if (filter
->usmap
.name
)
1315 free (filter
->usmap
.name
);
1317 if (peer
->default_rmap
[afi
][safi
].name
)
1318 free (peer
->default_rmap
[afi
][safi
].name
);
1320 filter
->usmap
.name
= NULL
;
1321 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1324 peer_unlock (peer
); /* initial reference */
1330 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1332 return strcmp (g1
->name
, g2
->name
);
1335 /* If peer is configured at least one address family return 1. */
1337 peer_group_active (struct peer
*peer
)
1339 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1340 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1341 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1342 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1343 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1348 /* Peer group cofiguration. */
1349 static struct peer_group
*
1350 peer_group_new (void)
1352 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1353 sizeof (struct peer_group
));
1357 peer_group_free (struct peer_group
*group
)
1359 XFREE (MTYPE_PEER_GROUP
, group
);
1363 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1365 struct peer_group
*group
;
1366 struct listnode
*node
, *nnode
;
1368 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1370 if (strcmp (group
->name
, name
) == 0)
1377 peer_group_get (struct bgp
*bgp
, const char *name
)
1379 struct peer_group
*group
;
1381 group
= peer_group_lookup (bgp
, name
);
1385 group
= peer_group_new ();
1387 group
->name
= strdup (name
);
1388 group
->peer
= list_new ();
1389 group
->conf
= peer_new (bgp
);
1390 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1391 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1392 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1393 group
->conf
->group
= group
;
1394 group
->conf
->as
= 0;
1395 group
->conf
->ttl
= 1;
1396 group
->conf
->gtsm_hops
= 0;
1397 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1398 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1399 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1400 group
->conf
->keepalive
= 0;
1401 group
->conf
->holdtime
= 0;
1402 group
->conf
->connect
= 0;
1403 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1404 listnode_add_sort (bgp
->group
, group
);
1410 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1411 afi_t afi
, safi_t safi
)
1414 int out
= FILTER_OUT
;
1416 struct bgp_filter
*pfilter
;
1417 struct bgp_filter
*gfilter
;
1420 pfilter
= &peer
->filter
[afi
][safi
];
1421 gfilter
= &conf
->filter
[afi
][safi
];
1425 peer
->as
= conf
->as
;
1428 if (conf
->change_local_as
)
1429 peer
->change_local_as
= conf
->change_local_as
;
1432 peer
->ttl
= conf
->ttl
;
1435 peer
->gtsm_hops
= conf
->gtsm_hops
;
1438 peer
->weight
= conf
->weight
;
1440 /* peer flags apply */
1441 peer
->flags
= conf
->flags
;
1442 /* peer af_flags apply */
1443 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1444 /* peer config apply */
1445 peer
->config
= conf
->config
;
1447 /* peer timers apply */
1448 peer
->holdtime
= conf
->holdtime
;
1449 peer
->keepalive
= conf
->keepalive
;
1450 peer
->connect
= conf
->connect
;
1451 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1452 peer
->v_connect
= conf
->connect
;
1454 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1456 /* advertisement-interval reset */
1457 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1458 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1460 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1462 /* password apply */
1463 if (conf
->password
&& !peer
->password
)
1464 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1468 /* maximum-prefix */
1469 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1470 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1471 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1474 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1476 /* route-server-client */
1477 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1479 /* Make peer's RIB point to group's RIB. */
1480 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1482 /* Import policy. */
1483 if (pfilter
->map
[RMAP_IMPORT
].name
)
1484 free (pfilter
->map
[RMAP_IMPORT
].name
);
1485 if (gfilter
->map
[RMAP_IMPORT
].name
)
1487 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1488 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1492 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1493 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1496 /* Export policy. */
1497 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1499 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1500 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1504 /* default-originate route-map */
1505 if (conf
->default_rmap
[afi
][safi
].name
)
1507 if (peer
->default_rmap
[afi
][safi
].name
)
1508 free (peer
->default_rmap
[afi
][safi
].name
);
1509 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1510 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1513 /* update-source apply */
1514 if (conf
->update_source
)
1516 if (peer
->update_source
)
1517 sockunion_free (peer
->update_source
);
1518 if (peer
->update_if
)
1520 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1521 peer
->update_if
= NULL
;
1523 peer
->update_source
= sockunion_dup (conf
->update_source
);
1525 else if (conf
->update_if
)
1527 if (peer
->update_if
)
1528 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1529 if (peer
->update_source
)
1531 sockunion_free (peer
->update_source
);
1532 peer
->update_source
= NULL
;
1534 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1537 /* inbound filter apply */
1538 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1540 if (pfilter
->dlist
[in
].name
)
1541 free (pfilter
->dlist
[in
].name
);
1542 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1543 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1545 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1547 if (pfilter
->plist
[in
].name
)
1548 free (pfilter
->plist
[in
].name
);
1549 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1550 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1552 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1554 if (pfilter
->aslist
[in
].name
)
1555 free (pfilter
->aslist
[in
].name
);
1556 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1557 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1559 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1561 if (pfilter
->map
[RMAP_IN
].name
)
1562 free (pfilter
->map
[RMAP_IN
].name
);
1563 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
1564 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
1567 /* outbound filter apply */
1568 if (gfilter
->dlist
[out
].name
)
1570 if (pfilter
->dlist
[out
].name
)
1571 free (pfilter
->dlist
[out
].name
);
1572 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1573 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1577 if (pfilter
->dlist
[out
].name
)
1578 free (pfilter
->dlist
[out
].name
);
1579 pfilter
->dlist
[out
].name
= NULL
;
1580 pfilter
->dlist
[out
].alist
= NULL
;
1582 if (gfilter
->plist
[out
].name
)
1584 if (pfilter
->plist
[out
].name
)
1585 free (pfilter
->plist
[out
].name
);
1586 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1587 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1591 if (pfilter
->plist
[out
].name
)
1592 free (pfilter
->plist
[out
].name
);
1593 pfilter
->plist
[out
].name
= NULL
;
1594 pfilter
->plist
[out
].plist
= NULL
;
1596 if (gfilter
->aslist
[out
].name
)
1598 if (pfilter
->aslist
[out
].name
)
1599 free (pfilter
->aslist
[out
].name
);
1600 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1601 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1605 if (pfilter
->aslist
[out
].name
)
1606 free (pfilter
->aslist
[out
].name
);
1607 pfilter
->aslist
[out
].name
= NULL
;
1608 pfilter
->aslist
[out
].aslist
= NULL
;
1610 if (gfilter
->map
[RMAP_OUT
].name
)
1612 if (pfilter
->map
[RMAP_OUT
].name
)
1613 free (pfilter
->map
[RMAP_OUT
].name
);
1614 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
1615 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
1619 if (pfilter
->map
[RMAP_OUT
].name
)
1620 free (pfilter
->map
[RMAP_OUT
].name
);
1621 pfilter
->map
[RMAP_OUT
].name
= NULL
;
1622 pfilter
->map
[RMAP_OUT
].map
= NULL
;
1625 /* RS-client's import/export route-maps. */
1626 if (gfilter
->map
[RMAP_IMPORT
].name
)
1628 if (pfilter
->map
[RMAP_IMPORT
].name
)
1629 free (pfilter
->map
[RMAP_IMPORT
].name
);
1630 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1631 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1635 if (pfilter
->map
[RMAP_IMPORT
].name
)
1636 free (pfilter
->map
[RMAP_IMPORT
].name
);
1637 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1638 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1640 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1642 if (pfilter
->map
[RMAP_EXPORT
].name
)
1643 free (pfilter
->map
[RMAP_EXPORT
].name
);
1644 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1645 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1648 if (gfilter
->usmap
.name
)
1650 if (pfilter
->usmap
.name
)
1651 free (pfilter
->usmap
.name
);
1652 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1653 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1657 if (pfilter
->usmap
.name
)
1658 free (pfilter
->usmap
.name
);
1659 pfilter
->usmap
.name
= NULL
;
1660 pfilter
->usmap
.map
= NULL
;
1664 /* Peer group's remote AS configuration. */
1666 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
, as_t
*as
)
1668 struct peer_group
*group
;
1670 struct listnode
*node
, *nnode
;
1672 group
= peer_group_lookup (bgp
, group_name
);
1676 if (group
->conf
->as
== *as
)
1679 /* When we setup peer-group AS number all peer group member's AS
1680 number must be updated to same number. */
1681 peer_as_change (group
->conf
, *as
);
1683 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1685 if (peer
->as
!= *as
)
1686 peer_as_change (peer
, *as
);
1693 peer_group_delete (struct peer_group
*group
)
1697 struct listnode
*node
, *nnode
;
1701 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1706 list_delete (group
->peer
);
1711 group
->conf
->group
= NULL
;
1712 peer_delete (group
->conf
);
1714 /* Delete from all peer_group list. */
1715 listnode_delete (bgp
->group
, group
);
1717 peer_group_free (group
);
1723 peer_group_remote_as_delete (struct peer_group
*group
)
1726 struct listnode
*node
, *nnode
;
1728 if (! group
->conf
->as
)
1731 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1736 list_delete_all_node (group
->peer
);
1738 group
->conf
->as
= 0;
1743 /* Bind specified peer to peer group. */
1745 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
,
1746 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1749 int first_member
= 0;
1751 /* Check peer group's address family. */
1752 if (! group
->conf
->afc
[afi
][safi
])
1753 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
1755 /* Lookup the peer. */
1756 peer
= peer_lookup (bgp
, su
);
1758 /* Create a new peer. */
1761 if (! group
->conf
->as
)
1762 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
1764 peer
= peer_create (su
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
1765 peer
->group
= group
;
1766 peer
->af_group
[afi
][safi
] = 1;
1768 peer
= peer_lock (peer
); /* group->peer list reference */
1769 listnode_add (group
->peer
, peer
);
1770 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1775 /* When the peer already belongs to peer group, check the consistency. */
1776 if (peer
->af_group
[afi
][safi
])
1778 if (strcmp (peer
->group
->name
, group
->name
) != 0)
1779 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
1784 /* Check current peer group configuration. */
1785 if (peer_group_active (peer
)
1786 && strcmp (peer
->group
->name
, group
->name
) != 0)
1787 return BGP_ERR_PEER_GROUP_MISMATCH
;
1789 if (! group
->conf
->as
)
1791 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
1792 && peer_sort (group
->conf
) != peer_sort (peer
))
1796 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1799 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
1803 peer
->af_group
[afi
][safi
] = 1;
1804 peer
->afc
[afi
][safi
] = 1;
1807 peer
->group
= group
;
1809 peer
= peer_lock (peer
); /* group->peer list reference */
1810 listnode_add (group
->peer
, peer
);
1813 assert (group
&& peer
->group
== group
);
1817 /* Advertisement-interval reset */
1818 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1819 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1821 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1823 /* ebgp-multihop reset */
1824 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1825 group
->conf
->ttl
= 255;
1827 /* local-as reset */
1828 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
1830 group
->conf
->change_local_as
= 0;
1831 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1832 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1836 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1838 struct listnode
*pn
;
1840 /* If it's not configured as RSERVER_CLIENT in any other address
1841 family, without being member of a peer_group, remove it from
1842 list bgp->rsclient.*/
1843 if (! peer_rsclient_active (peer
)
1844 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1846 peer_unlock (peer
); /* peer rsclient reference */
1847 list_delete_node (bgp
->rsclient
, pn
);
1849 /* Clear our own rsclient rib for this afi/safi. */
1850 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1853 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1855 /* Import policy. */
1856 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
1858 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
1859 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
1860 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
1863 /* Export policy. */
1864 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
1865 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
1867 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
1868 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
1869 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
1873 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1875 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1877 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
1878 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1879 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1882 BGP_EVENT_ADD (peer
, BGP_Stop
);
1888 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
1889 struct peer_group
*group
, afi_t afi
, safi_t safi
)
1891 if (! peer
->af_group
[afi
][safi
])
1894 if (group
!= peer
->group
)
1895 return BGP_ERR_PEER_GROUP_MISMATCH
;
1897 peer
->af_group
[afi
][safi
] = 0;
1898 peer
->afc
[afi
][safi
] = 0;
1899 peer_af_flag_reset (peer
, afi
, safi
);
1901 if (peer
->rib
[afi
][safi
])
1902 peer
->rib
[afi
][safi
] = NULL
;
1904 if (! peer_group_active (peer
))
1906 assert (listnode_lookup (group
->peer
, peer
));
1907 peer_unlock (peer
); /* peer group list reference */
1908 listnode_delete (group
->peer
, peer
);
1910 if (group
->conf
->as
)
1915 peer_global_config_reset (peer
);
1918 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1920 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
1921 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1922 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1925 BGP_EVENT_ADD (peer
, BGP_Stop
);
1930 /* BGP instance creation by `router bgp' commands. */
1932 bgp_create (as_t
*as
, const char *name
)
1938 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
1942 bgp
->peer_self
= peer_new (bgp
);
1943 bgp
->peer_self
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, "Static announcement");
1945 bgp
->peer
= list_new ();
1946 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
1948 bgp
->group
= list_new ();
1949 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
1951 bgp
->rsclient
= list_new ();
1952 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
1954 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1955 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1957 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
1958 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
1959 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
1960 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
1961 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
1964 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
1965 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
1966 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
1967 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
1968 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1973 bgp
->name
= strdup (name
);
1978 /* Return first entry of BGP. */
1980 bgp_get_default (void)
1983 return (listgetdata (listhead (bm
->bgp
)));
1987 /* Lookup BGP entry. */
1989 bgp_lookup (as_t as
, const char *name
)
1992 struct listnode
*node
, *nnode
;
1994 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
1996 && ((bgp
->name
== NULL
&& name
== NULL
)
1997 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2002 /* Lookup BGP structure by view name. */
2004 bgp_lookup_by_name (const char *name
)
2007 struct listnode
*node
, *nnode
;
2009 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2010 if ((bgp
->name
== NULL
&& name
== NULL
)
2011 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2016 /* Called from VTY commands. */
2018 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2022 /* Multiple instance check. */
2023 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2026 bgp
= bgp_lookup_by_name (name
);
2028 bgp
= bgp_get_default ();
2030 /* Already exists. */
2036 return BGP_ERR_INSTANCE_MISMATCH
;
2044 /* BGP instance name can not be specified for single instance. */
2046 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2048 /* Get default BGP structure if exists. */
2049 bgp
= bgp_get_default ();
2056 return BGP_ERR_AS_MISMATCH
;
2063 bgp
= bgp_create (as
, name
);
2064 bgp_router_id_set(bgp
, &router_id_zebra
);
2067 /* Create BGP server socket, if first instance. */
2068 if (list_isempty(bm
->bgp
)
2069 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2071 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2072 return BGP_ERR_INVALID_VALUE
;
2075 listnode_add (bm
->bgp
, bgp
);
2080 /* Delete BGP instance. */
2082 bgp_delete (struct bgp
*bgp
)
2085 struct peer_group
*group
;
2086 struct listnode
*node
;
2087 struct listnode
*next
;
2091 /* Delete static route. */
2092 bgp_static_delete (bgp
);
2094 /* Unset redistribution. */
2095 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2096 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2097 if (i
!= ZEBRA_ROUTE_BGP
)
2098 bgp_redistribute_unset (bgp
, afi
, i
);
2100 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2102 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2104 /* Send notify to remote peer. */
2105 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2111 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2113 for (ALL_LIST_ELEMENTS (group
->peer
, node
, next
, peer
))
2115 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2117 /* Send notify to remote peer. */
2118 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2121 peer_group_delete (group
);
2124 assert (listcount (bgp
->rsclient
) == 0);
2126 if (bgp
->peer_self
) {
2127 peer_delete(bgp
->peer_self
);
2128 bgp
->peer_self
= NULL
;
2131 /* Remove visibility via the master list - there may however still be
2132 * routes to be processed still referencing the struct bgp.
2134 listnode_delete (bm
->bgp
, bgp
);
2135 if (list_isempty(bm
->bgp
))
2138 bgp_unlock(bgp
); /* initial reference */
2143 static void bgp_free (struct bgp
*);
2146 bgp_lock (struct bgp
*bgp
)
2152 bgp_unlock(struct bgp
*bgp
)
2154 assert(bgp
->lock
> 0);
2155 if (--bgp
->lock
== 0)
2160 bgp_free (struct bgp
*bgp
)
2165 list_delete (bgp
->group
);
2166 list_delete (bgp
->peer
);
2167 list_delete (bgp
->rsclient
);
2172 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2173 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2175 if (bgp
->route
[afi
][safi
])
2176 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2177 if (bgp
->aggregate
[afi
][safi
])
2178 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2179 if (bgp
->rib
[afi
][safi
])
2180 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2182 XFREE (MTYPE_BGP
, bgp
);
2186 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2189 struct listnode
*node
, *nnode
;
2193 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2194 if (sockunion_same (&peer
->su
, su
)
2195 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2198 else if (bm
->bgp
!= NULL
)
2200 struct listnode
*bgpnode
, *nbgpnode
;
2202 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2203 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2204 if (sockunion_same (&peer
->su
, su
)
2205 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2212 peer_lookup_with_open (union sockunion
*su
, as_t remote_as
,
2213 struct in_addr
*remote_id
, int *as
)
2216 struct listnode
*node
;
2217 struct listnode
*bgpnode
;
2223 for (ALL_LIST_ELEMENTS_RO (bm
->bgp
, bgpnode
, bgp
))
2225 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
2227 if (sockunion_same (&peer
->su
, su
)
2228 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2230 if (peer
->as
== remote_as
2231 && peer
->remote_id
.s_addr
== remote_id
->s_addr
)
2233 if (peer
->as
== remote_as
)
2238 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
2240 if (sockunion_same (&peer
->su
, su
)
2241 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2243 if (peer
->as
== remote_as
2244 && peer
->remote_id
.s_addr
== 0)
2246 if (peer
->as
== remote_as
)
2254 /* If peer is configured at least one address family return 1. */
2256 peer_active (struct peer
*peer
)
2258 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
2259 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
2260 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
2261 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
2262 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
2267 /* If peer is negotiated at least one address family return 1. */
2269 peer_active_nego (struct peer
*peer
)
2271 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
2272 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
2273 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
2274 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
2275 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
2280 /* peer_flag_change_type. */
2281 enum peer_change_type
2285 peer_change_reset_in
,
2286 peer_change_reset_out
,
2290 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
2291 enum peer_change_type type
)
2293 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2296 if (peer
->status
!= Established
)
2299 if (type
== peer_change_reset
)
2300 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2301 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2302 else if (type
== peer_change_reset_in
)
2304 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
2305 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
2306 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
2308 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2309 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2311 else if (type
== peer_change_reset_out
)
2312 bgp_announce_route (peer
, afi
, safi
);
2315 struct peer_flag_action
2320 /* This flag can be set for peer-group member. */
2321 u_char not_for_member
;
2323 /* Action when the flag is changed. */
2324 enum peer_change_type type
;
2326 /* Peer down cause */
2330 static const struct peer_flag_action peer_flag_action_list
[] =
2332 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
2333 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
2334 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
2335 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
2336 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
2337 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
2338 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
2342 static const struct peer_flag_action peer_af_flag_action_list
[] =
2344 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
2345 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
2346 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
2347 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
2348 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
2349 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
2350 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
2351 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
2352 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
2353 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
2354 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
2355 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
2356 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
2357 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
2358 { PEER_FLAG_NEXTHOP_SELF_ALL
, 1, peer_change_reset_out
},
2362 /* Proper action set. */
2364 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
2365 struct peer_flag_action
*action
, u_int32_t flag
)
2371 const struct peer_flag_action
*match
= NULL
;
2373 /* Check peer's frag action. */
2374 for (i
= 0; i
< size
; i
++)
2376 match
= &action_list
[i
];
2378 if (match
->flag
== 0)
2381 if (match
->flag
& flag
)
2385 if (match
->type
== peer_change_reset_in
)
2387 if (match
->type
== peer_change_reset_out
)
2389 if (match
->type
== peer_change_reset
)
2394 if (match
->not_for_member
)
2395 action
->not_for_member
= 1;
2399 /* Set peer clear type. */
2400 if (reset_in
&& reset_out
)
2401 action
->type
= peer_change_reset
;
2403 action
->type
= peer_change_reset_in
;
2405 action
->type
= peer_change_reset_out
;
2407 action
->type
= peer_change_none
;
2413 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2415 if (flag
== PEER_FLAG_SHUTDOWN
)
2417 if (CHECK_FLAG (peer
->flags
, flag
))
2419 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2420 peer_nsf_stop (peer
);
2422 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
2423 if (peer
->t_pmax_restart
)
2425 BGP_TIMER_OFF (peer
->t_pmax_restart
);
2426 if (BGP_DEBUG (events
, EVENTS
))
2427 zlog_debug ("%s Maximum-prefix restart timer canceled",
2431 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2432 peer_nsf_stop (peer
);
2434 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2435 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2436 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2438 BGP_EVENT_ADD (peer
, BGP_Stop
);
2442 peer
->v_start
= BGP_INIT_START_TIMER
;
2443 BGP_EVENT_ADD (peer
, BGP_Stop
);
2446 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2448 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2449 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2450 else if (flag
== PEER_FLAG_PASSIVE
)
2451 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2452 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
2453 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2455 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2456 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2459 BGP_EVENT_ADD (peer
, BGP_Stop
);
2462 /* Change specified peer flag. */
2464 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2468 struct peer_group
*group
;
2469 struct listnode
*node
, *nnode
;
2470 struct peer_flag_action action
;
2472 memset (&action
, 0, sizeof (struct peer_flag_action
));
2473 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2475 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2477 /* No flag action is found. */
2479 return BGP_ERR_INVALID_FLAG
;
2481 /* Not for peer-group member. */
2482 if (action
.not_for_member
&& peer_group_active (peer
))
2483 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2485 /* When unset the peer-group member's flag we have to check
2486 peer-group configuration. */
2487 if (! set
&& peer_group_active (peer
))
2488 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2490 if (flag
== PEER_FLAG_SHUTDOWN
)
2491 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2493 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2496 /* Flag conflict check. */
2498 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2499 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2500 return BGP_ERR_PEER_FLAG_CONFLICT
;
2502 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2504 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2506 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2511 SET_FLAG (peer
->flags
, flag
);
2513 UNSET_FLAG (peer
->flags
, flag
);
2515 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2517 if (action
.type
== peer_change_reset
)
2518 peer_flag_modify_action (peer
, flag
);
2523 /* peer-group member updates. */
2524 group
= peer
->group
;
2526 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2528 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2531 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2535 SET_FLAG (peer
->flags
, flag
);
2537 UNSET_FLAG (peer
->flags
, flag
);
2539 if (action
.type
== peer_change_reset
)
2540 peer_flag_modify_action (peer
, flag
);
2546 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2548 return peer_flag_modify (peer
, flag
, 1);
2552 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2554 return peer_flag_modify (peer
, flag
, 0);
2558 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2560 if (peer
->af_group
[afi
][safi
])
2566 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2571 struct listnode
*node
, *nnode
;
2572 struct peer_group
*group
;
2573 struct peer_flag_action action
;
2575 memset (&action
, 0, sizeof (struct peer_flag_action
));
2576 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2578 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2580 /* No flag action is found. */
2582 return BGP_ERR_INVALID_FLAG
;
2584 /* Adress family must be activated. */
2585 if (! peer
->afc
[afi
][safi
])
2586 return BGP_ERR_PEER_INACTIVE
;
2588 /* Not for peer-group member. */
2589 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2590 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2592 /* Spcecial check for reflector client. */
2593 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2594 && peer_sort (peer
) != BGP_PEER_IBGP
)
2595 return BGP_ERR_NOT_INTERNAL_PEER
;
2597 /* Spcecial check for remove-private-AS. */
2598 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2599 && peer_sort (peer
) == BGP_PEER_IBGP
)
2600 return BGP_ERR_REMOVE_PRIVATE_AS
;
2602 /* When unset the peer-group member's flag we have to check
2603 peer-group configuration. */
2604 if (! set
&& peer
->af_group
[afi
][safi
])
2605 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2606 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2608 /* When current flag configuration is same as requested one. */
2609 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2611 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2613 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2618 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2620 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2622 /* Execute action when peer is established. */
2623 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2624 && peer
->status
== Established
)
2626 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2627 bgp_clear_adj_in (peer
, afi
, safi
);
2630 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2631 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2632 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2633 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2634 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2635 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2636 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2637 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2639 peer_change_action (peer
, afi
, safi
, action
.type
);
2644 /* Peer group member updates. */
2645 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2647 group
= peer
->group
;
2649 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2651 if (! peer
->af_group
[afi
][safi
])
2654 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2657 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2661 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2663 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2665 if (peer
->status
== Established
)
2667 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2668 bgp_clear_adj_in (peer
, afi
, safi
);
2671 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2672 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2673 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2674 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2675 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2676 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2677 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2678 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2680 peer_change_action (peer
, afi
, safi
, action
.type
);
2689 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2691 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2695 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2697 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2700 /* EBGP multihop configuration. */
2702 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2704 struct peer_group
*group
;
2705 struct listnode
*node
, *nnode
;
2708 if (peer
->sort
== BGP_PEER_IBGP
)
2711 /* see comment in peer_ttl_security_hops_set() */
2714 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2716 group
= peer
->group
;
2717 if (group
->conf
->gtsm_hops
!= 0)
2718 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2720 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
2722 if (peer1
->sort
== BGP_PEER_IBGP
)
2725 if (peer1
->gtsm_hops
!= 0)
2726 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2731 if (peer
->gtsm_hops
!= 0)
2732 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2738 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2740 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2741 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2745 group
= peer
->group
;
2746 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2748 if (peer
->sort
== BGP_PEER_IBGP
)
2751 peer
->ttl
= group
->conf
->ttl
;
2754 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2761 peer_ebgp_multihop_unset (struct peer
*peer
)
2763 struct peer_group
*group
;
2764 struct listnode
*node
, *nnode
;
2766 if (peer
->sort
== BGP_PEER_IBGP
)
2769 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
2770 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2772 if (peer_group_active (peer
))
2773 peer
->ttl
= peer
->group
->conf
->ttl
;
2777 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2779 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2780 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2784 group
= peer
->group
;
2785 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2787 if (peer
->sort
== BGP_PEER_IBGP
)
2793 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2799 /* Neighbor description. */
2801 peer_description_set (struct peer
*peer
, char *desc
)
2804 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2806 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
2812 peer_description_unset (struct peer
*peer
)
2815 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2822 /* Neighbor update-source. */
2824 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
2826 struct peer_group
*group
;
2827 struct listnode
*node
, *nnode
;
2829 if (peer
->update_if
)
2831 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2832 && strcmp (peer
->update_if
, ifname
) == 0)
2835 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2836 peer
->update_if
= NULL
;
2839 if (peer
->update_source
)
2841 sockunion_free (peer
->update_source
);
2842 peer
->update_source
= NULL
;
2845 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2847 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2849 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2851 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2852 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2853 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2856 BGP_EVENT_ADD (peer
, BGP_Stop
);
2860 /* peer-group member updates. */
2861 group
= peer
->group
;
2862 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2864 if (peer
->update_if
)
2866 if (strcmp (peer
->update_if
, ifname
) == 0)
2869 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2870 peer
->update_if
= NULL
;
2873 if (peer
->update_source
)
2875 sockunion_free (peer
->update_source
);
2876 peer
->update_source
= NULL
;
2879 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2881 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2883 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2884 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2885 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2888 BGP_EVENT_ADD (peer
, BGP_Stop
);
2894 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
2896 struct peer_group
*group
;
2897 struct listnode
*node
, *nnode
;
2899 if (peer
->update_source
)
2901 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2902 && sockunion_cmp (peer
->update_source
, su
) == 0)
2904 sockunion_free (peer
->update_source
);
2905 peer
->update_source
= NULL
;
2908 if (peer
->update_if
)
2910 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2911 peer
->update_if
= NULL
;
2914 peer
->update_source
= sockunion_dup (su
);
2916 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2918 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2920 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2921 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2922 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2925 BGP_EVENT_ADD (peer
, BGP_Stop
);
2929 /* peer-group member updates. */
2930 group
= peer
->group
;
2931 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2933 if (peer
->update_source
)
2935 if (sockunion_cmp (peer
->update_source
, su
) == 0)
2937 sockunion_free (peer
->update_source
);
2938 peer
->update_source
= NULL
;
2941 if (peer
->update_if
)
2943 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2944 peer
->update_if
= NULL
;
2947 peer
->update_source
= sockunion_dup (su
);
2949 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2951 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2952 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2953 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2956 BGP_EVENT_ADD (peer
, BGP_Stop
);
2962 peer_update_source_unset (struct peer
*peer
)
2964 union sockunion
*su
;
2965 struct peer_group
*group
;
2966 struct listnode
*node
, *nnode
;
2968 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2969 && ! peer
->update_source
2970 && ! peer
->update_if
)
2973 if (peer
->update_source
)
2975 sockunion_free (peer
->update_source
);
2976 peer
->update_source
= NULL
;
2978 if (peer
->update_if
)
2980 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2981 peer
->update_if
= NULL
;
2984 if (peer_group_active (peer
))
2986 group
= peer
->group
;
2988 if (group
->conf
->update_source
)
2990 su
= sockunion_dup (group
->conf
->update_source
);
2991 peer
->update_source
= su
;
2993 else if (group
->conf
->update_if
)
2995 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
2998 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3000 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3002 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3003 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3004 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3007 BGP_EVENT_ADD (peer
, BGP_Stop
);
3011 /* peer-group member updates. */
3012 group
= peer
->group
;
3013 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3015 if (! peer
->update_source
&& ! peer
->update_if
)
3018 if (peer
->update_source
)
3020 sockunion_free (peer
->update_source
);
3021 peer
->update_source
= NULL
;
3024 if (peer
->update_if
)
3026 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3027 peer
->update_if
= NULL
;
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
);
3043 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3046 struct peer_group
*group
;
3047 struct listnode
*node
, *nnode
;
3049 /* Adress family must be activated. */
3050 if (! peer
->afc
[afi
][safi
])
3051 return BGP_ERR_PEER_INACTIVE
;
3053 /* Default originate can't be used for peer group memeber. */
3054 if (peer_is_group_member (peer
, afi
, safi
))
3055 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3057 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3058 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3059 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3061 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3065 if (peer
->default_rmap
[afi
][safi
].name
)
3066 free (peer
->default_rmap
[afi
][safi
].name
);
3067 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3068 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3072 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3074 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3075 bgp_default_originate (peer
, afi
, safi
, 0);
3079 /* peer-group member updates. */
3080 group
= peer
->group
;
3081 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3083 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3087 if (peer
->default_rmap
[afi
][safi
].name
)
3088 free (peer
->default_rmap
[afi
][safi
].name
);
3089 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3090 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3093 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3094 bgp_default_originate (peer
, afi
, safi
, 0);
3100 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3102 struct peer_group
*group
;
3103 struct listnode
*node
, *nnode
;
3105 /* Adress family must be activated. */
3106 if (! peer
->afc
[afi
][safi
])
3107 return BGP_ERR_PEER_INACTIVE
;
3109 /* Default originate can't be used for peer group memeber. */
3110 if (peer_is_group_member (peer
, afi
, safi
))
3111 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3113 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3115 UNSET_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
= NULL
;
3120 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3123 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3125 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3126 bgp_default_originate (peer
, afi
, safi
, 1);
3130 /* peer-group member updates. */
3131 group
= peer
->group
;
3132 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3134 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3136 if (peer
->default_rmap
[afi
][safi
].name
)
3137 free (peer
->default_rmap
[afi
][safi
].name
);
3138 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3139 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3141 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3142 bgp_default_originate (peer
, afi
, safi
, 1);
3148 peer_port_set (struct peer
*peer
, u_int16_t port
)
3155 peer_port_unset (struct peer
*peer
)
3157 peer
->port
= BGP_PORT_DEFAULT
;
3161 /* neighbor weight. */
3163 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
3165 struct peer_group
*group
;
3166 struct listnode
*node
, *nnode
;
3168 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3169 peer
->weight
= weight
;
3171 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3174 /* peer-group member updates. */
3175 group
= peer
->group
;
3176 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3178 peer
->weight
= group
->conf
->weight
;
3184 peer_weight_unset (struct peer
*peer
)
3186 struct peer_group
*group
;
3187 struct listnode
*node
, *nnode
;
3189 /* Set default weight. */
3190 if (peer_group_active (peer
))
3191 peer
->weight
= peer
->group
->conf
->weight
;
3195 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3197 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3200 /* peer-group member updates. */
3201 group
= peer
->group
;
3202 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3210 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
3212 struct peer_group
*group
;
3213 struct listnode
*node
, *nnode
;
3215 /* Not for peer group memeber. */
3216 if (peer_group_active (peer
))
3217 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3219 /* keepalive value check. */
3220 if (keepalive
> 65535)
3221 return BGP_ERR_INVALID_VALUE
;
3223 /* Holdtime value check. */
3224 if (holdtime
> 65535)
3225 return BGP_ERR_INVALID_VALUE
;
3227 /* Holdtime value must be either 0 or greater than 3. */
3228 if (holdtime
< 3 && holdtime
!= 0)
3229 return BGP_ERR_INVALID_VALUE
;
3231 /* Set value to the configuration. */
3232 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3233 peer
->holdtime
= holdtime
;
3234 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
3236 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3239 /* peer-group member updates. */
3240 group
= peer
->group
;
3241 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3243 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3244 peer
->holdtime
= group
->conf
->holdtime
;
3245 peer
->keepalive
= group
->conf
->keepalive
;
3251 peer_timers_unset (struct peer
*peer
)
3253 struct peer_group
*group
;
3254 struct listnode
*node
, *nnode
;
3256 if (peer_group_active (peer
))
3257 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3259 /* Clear configuration. */
3260 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3261 peer
->keepalive
= 0;
3264 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3267 /* peer-group member updates. */
3268 group
= peer
->group
;
3269 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3271 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3273 peer
->keepalive
= 0;
3280 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
3282 if (peer_group_active (peer
))
3283 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3285 if (connect
> 65535)
3286 return BGP_ERR_INVALID_VALUE
;
3288 /* Set value to the configuration. */
3289 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3290 peer
->connect
= connect
;
3292 /* Set value to timer setting. */
3293 peer
->v_connect
= connect
;
3299 peer_timers_connect_unset (struct peer
*peer
)
3301 if (peer_group_active (peer
))
3302 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3304 /* Clear configuration. */
3305 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3308 /* Set timer setting to default value. */
3309 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3315 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3317 if (peer_group_active (peer
))
3318 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3321 return BGP_ERR_INVALID_VALUE
;
3323 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3324 peer
->routeadv
= routeadv
;
3325 peer
->v_routeadv
= routeadv
;
3331 peer_advertise_interval_unset (struct peer
*peer
)
3333 if (peer_group_active (peer
))
3334 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3336 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3339 if (peer
->sort
== BGP_PEER_IBGP
)
3340 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3342 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3347 /* neighbor interface */
3349 peer_interface_set (struct peer
*peer
, const char *str
)
3352 free (peer
->ifname
);
3353 peer
->ifname
= strdup (str
);
3359 peer_interface_unset (struct peer
*peer
)
3362 free (peer
->ifname
);
3363 peer
->ifname
= NULL
;
3370 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3372 struct peer_group
*group
;
3373 struct listnode
*node
, *nnode
;
3375 if (allow_num
< 1 || allow_num
> 10)
3376 return BGP_ERR_INVALID_VALUE
;
3378 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3380 peer
->allowas_in
[afi
][safi
] = allow_num
;
3381 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3382 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3385 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3388 group
= peer
->group
;
3389 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3391 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3393 peer
->allowas_in
[afi
][safi
] = allow_num
;
3394 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3395 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3403 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3405 struct peer_group
*group
;
3406 struct listnode
*node
, *nnode
;
3408 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3410 peer
->allowas_in
[afi
][safi
] = 0;
3411 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3414 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3417 group
= peer
->group
;
3418 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3420 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3422 peer
->allowas_in
[afi
][safi
] = 0;
3423 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3430 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
3432 struct bgp
*bgp
= peer
->bgp
;
3433 struct peer_group
*group
;
3434 struct listnode
*node
, *nnode
;
3436 if (peer_sort (peer
) != BGP_PEER_EBGP
3437 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3438 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3441 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3443 if (peer_group_active (peer
))
3444 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3447 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
3449 if (peer
->change_local_as
== as
&&
3450 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3451 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
3452 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
3453 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
3456 peer
->change_local_as
= as
;
3458 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3460 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3463 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3465 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3467 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3469 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3471 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3472 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3473 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3476 BGP_EVENT_ADD (peer
, BGP_Stop
);
3481 group
= peer
->group
;
3482 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3484 peer
->change_local_as
= as
;
3486 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3488 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3491 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3493 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3495 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3497 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3498 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3499 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3502 BGP_EVENT_ADD (peer
, BGP_Stop
);
3509 peer_local_as_unset (struct peer
*peer
)
3511 struct peer_group
*group
;
3512 struct listnode
*node
, *nnode
;
3514 if (peer_group_active (peer
))
3515 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3517 if (! peer
->change_local_as
)
3520 peer
->change_local_as
= 0;
3521 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3522 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3524 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3526 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3528 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3529 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3530 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3533 BGP_EVENT_ADD (peer
, BGP_Stop
);
3538 group
= peer
->group
;
3539 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3541 peer
->change_local_as
= 0;
3542 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3543 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3545 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3547 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3548 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3549 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3552 BGP_EVENT_ADD (peer
, BGP_Stop
);
3557 /* Set password for authenticating with the peer. */
3559 peer_password_set (struct peer
*peer
, const char *password
)
3561 struct listnode
*nn
, *nnode
;
3562 int len
= password
? strlen(password
) : 0;
3563 int ret
= BGP_SUCCESS
;
3565 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
3566 return BGP_ERR_INVALID_VALUE
;
3568 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
3569 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3573 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3575 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
3577 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3579 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3580 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3582 BGP_EVENT_ADD (peer
, BGP_Stop
);
3584 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
3587 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3589 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
3593 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3595 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
3597 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3598 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3600 BGP_EVENT_ADD (peer
, BGP_Stop
);
3602 if (bgp_md5_set (peer
) < 0)
3603 ret
= BGP_ERR_TCPSIG_FAILED
;
3610 peer_password_unset (struct peer
*peer
)
3612 struct listnode
*nn
, *nnode
;
3615 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3618 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3620 if (peer_group_active (peer
)
3621 && peer
->group
->conf
->password
3622 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
3623 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3625 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3626 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3628 BGP_EVENT_ADD (peer
, BGP_Stop
);
3631 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3633 peer
->password
= NULL
;
3640 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3641 peer
->password
= NULL
;
3643 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3645 if (!peer
->password
)
3648 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3649 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3651 BGP_EVENT_ADD (peer
, BGP_Stop
);
3653 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3654 peer
->password
= NULL
;
3662 /* Set distribute list to the peer. */
3664 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3667 struct bgp_filter
*filter
;
3668 struct peer_group
*group
;
3669 struct listnode
*node
, *nnode
;
3671 if (! peer
->afc
[afi
][safi
])
3672 return BGP_ERR_PEER_INACTIVE
;
3674 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3675 return BGP_ERR_INVALID_VALUE
;
3677 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3678 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3680 filter
= &peer
->filter
[afi
][safi
];
3682 if (filter
->plist
[direct
].name
)
3683 return BGP_ERR_PEER_FILTER_CONFLICT
;
3685 if (filter
->dlist
[direct
].name
)
3686 free (filter
->dlist
[direct
].name
);
3687 filter
->dlist
[direct
].name
= strdup (name
);
3688 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3690 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3693 group
= peer
->group
;
3694 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3696 filter
= &peer
->filter
[afi
][safi
];
3698 if (! peer
->af_group
[afi
][safi
])
3701 if (filter
->dlist
[direct
].name
)
3702 free (filter
->dlist
[direct
].name
);
3703 filter
->dlist
[direct
].name
= strdup (name
);
3704 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3711 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3713 struct bgp_filter
*filter
;
3714 struct bgp_filter
*gfilter
;
3715 struct peer_group
*group
;
3716 struct listnode
*node
, *nnode
;
3718 if (! peer
->afc
[afi
][safi
])
3719 return BGP_ERR_PEER_INACTIVE
;
3721 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3722 return BGP_ERR_INVALID_VALUE
;
3724 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3725 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3727 filter
= &peer
->filter
[afi
][safi
];
3729 /* apply peer-group filter */
3730 if (peer
->af_group
[afi
][safi
])
3732 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3734 if (gfilter
->dlist
[direct
].name
)
3736 if (filter
->dlist
[direct
].name
)
3737 free (filter
->dlist
[direct
].name
);
3738 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
3739 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
3744 if (filter
->dlist
[direct
].name
)
3745 free (filter
->dlist
[direct
].name
);
3746 filter
->dlist
[direct
].name
= NULL
;
3747 filter
->dlist
[direct
].alist
= NULL
;
3749 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3752 group
= peer
->group
;
3753 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3755 filter
= &peer
->filter
[afi
][safi
];
3757 if (! peer
->af_group
[afi
][safi
])
3760 if (filter
->dlist
[direct
].name
)
3761 free (filter
->dlist
[direct
].name
);
3762 filter
->dlist
[direct
].name
= NULL
;
3763 filter
->dlist
[direct
].alist
= NULL
;
3769 /* Update distribute list. */
3771 peer_distribute_update (struct access_list
*access
)
3776 struct listnode
*mnode
, *mnnode
;
3777 struct listnode
*node
, *nnode
;
3780 struct peer_group
*group
;
3781 struct bgp_filter
*filter
;
3783 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3785 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3787 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3788 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3790 filter
= &peer
->filter
[afi
][safi
];
3792 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3794 if (filter
->dlist
[direct
].name
)
3795 filter
->dlist
[direct
].alist
=
3796 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3798 filter
->dlist
[direct
].alist
= NULL
;
3802 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3804 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3805 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3807 filter
= &group
->conf
->filter
[afi
][safi
];
3809 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3811 if (filter
->dlist
[direct
].name
)
3812 filter
->dlist
[direct
].alist
=
3813 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3815 filter
->dlist
[direct
].alist
= NULL
;
3822 /* Set prefix list to the peer. */
3824 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3827 struct bgp_filter
*filter
;
3828 struct peer_group
*group
;
3829 struct listnode
*node
, *nnode
;
3831 if (! peer
->afc
[afi
][safi
])
3832 return BGP_ERR_PEER_INACTIVE
;
3834 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3835 return BGP_ERR_INVALID_VALUE
;
3837 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3838 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3840 filter
= &peer
->filter
[afi
][safi
];
3842 if (filter
->dlist
[direct
].name
)
3843 return BGP_ERR_PEER_FILTER_CONFLICT
;
3845 if (filter
->plist
[direct
].name
)
3846 free (filter
->plist
[direct
].name
);
3847 filter
->plist
[direct
].name
= strdup (name
);
3848 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3850 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3853 group
= peer
->group
;
3854 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3856 filter
= &peer
->filter
[afi
][safi
];
3858 if (! peer
->af_group
[afi
][safi
])
3861 if (filter
->plist
[direct
].name
)
3862 free (filter
->plist
[direct
].name
);
3863 filter
->plist
[direct
].name
= strdup (name
);
3864 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3870 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3872 struct bgp_filter
*filter
;
3873 struct bgp_filter
*gfilter
;
3874 struct peer_group
*group
;
3875 struct listnode
*node
, *nnode
;
3877 if (! peer
->afc
[afi
][safi
])
3878 return BGP_ERR_PEER_INACTIVE
;
3880 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3881 return BGP_ERR_INVALID_VALUE
;
3883 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3884 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3886 filter
= &peer
->filter
[afi
][safi
];
3888 /* apply peer-group filter */
3889 if (peer
->af_group
[afi
][safi
])
3891 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3893 if (gfilter
->plist
[direct
].name
)
3895 if (filter
->plist
[direct
].name
)
3896 free (filter
->plist
[direct
].name
);
3897 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
3898 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
3903 if (filter
->plist
[direct
].name
)
3904 free (filter
->plist
[direct
].name
);
3905 filter
->plist
[direct
].name
= NULL
;
3906 filter
->plist
[direct
].plist
= NULL
;
3908 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3911 group
= peer
->group
;
3912 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3914 filter
= &peer
->filter
[afi
][safi
];
3916 if (! peer
->af_group
[afi
][safi
])
3919 if (filter
->plist
[direct
].name
)
3920 free (filter
->plist
[direct
].name
);
3921 filter
->plist
[direct
].name
= NULL
;
3922 filter
->plist
[direct
].plist
= NULL
;
3928 /* Update prefix-list list. */
3930 peer_prefix_list_update (struct prefix_list
*plist
)
3932 struct listnode
*mnode
, *mnnode
;
3933 struct listnode
*node
, *nnode
;
3936 struct peer_group
*group
;
3937 struct bgp_filter
*filter
;
3942 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3944 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3946 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3947 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3949 filter
= &peer
->filter
[afi
][safi
];
3951 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3953 if (filter
->plist
[direct
].name
)
3954 filter
->plist
[direct
].plist
=
3955 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3957 filter
->plist
[direct
].plist
= NULL
;
3961 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3963 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3964 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3966 filter
= &group
->conf
->filter
[afi
][safi
];
3968 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3970 if (filter
->plist
[direct
].name
)
3971 filter
->plist
[direct
].plist
=
3972 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3974 filter
->plist
[direct
].plist
= NULL
;
3982 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3985 struct bgp_filter
*filter
;
3986 struct peer_group
*group
;
3987 struct listnode
*node
, *nnode
;
3989 if (! peer
->afc
[afi
][safi
])
3990 return BGP_ERR_PEER_INACTIVE
;
3992 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3993 return BGP_ERR_INVALID_VALUE
;
3995 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3996 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3998 filter
= &peer
->filter
[afi
][safi
];
4000 if (filter
->aslist
[direct
].name
)
4001 free (filter
->aslist
[direct
].name
);
4002 filter
->aslist
[direct
].name
= strdup (name
);
4003 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4005 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4008 group
= peer
->group
;
4009 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4011 filter
= &peer
->filter
[afi
][safi
];
4013 if (! peer
->af_group
[afi
][safi
])
4016 if (filter
->aslist
[direct
].name
)
4017 free (filter
->aslist
[direct
].name
);
4018 filter
->aslist
[direct
].name
= strdup (name
);
4019 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4025 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
4027 struct bgp_filter
*filter
;
4028 struct bgp_filter
*gfilter
;
4029 struct peer_group
*group
;
4030 struct listnode
*node
, *nnode
;
4032 if (! peer
->afc
[afi
][safi
])
4033 return BGP_ERR_PEER_INACTIVE
;
4035 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4036 return BGP_ERR_INVALID_VALUE
;
4038 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4039 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4041 filter
= &peer
->filter
[afi
][safi
];
4043 /* apply peer-group filter */
4044 if (peer
->af_group
[afi
][safi
])
4046 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4048 if (gfilter
->aslist
[direct
].name
)
4050 if (filter
->aslist
[direct
].name
)
4051 free (filter
->aslist
[direct
].name
);
4052 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
4053 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
4058 if (filter
->aslist
[direct
].name
)
4059 free (filter
->aslist
[direct
].name
);
4060 filter
->aslist
[direct
].name
= NULL
;
4061 filter
->aslist
[direct
].aslist
= NULL
;
4063 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4066 group
= peer
->group
;
4067 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4069 filter
= &peer
->filter
[afi
][safi
];
4071 if (! peer
->af_group
[afi
][safi
])
4074 if (filter
->aslist
[direct
].name
)
4075 free (filter
->aslist
[direct
].name
);
4076 filter
->aslist
[direct
].name
= NULL
;
4077 filter
->aslist
[direct
].aslist
= NULL
;
4084 peer_aslist_update (void)
4089 struct listnode
*mnode
, *mnnode
;
4090 struct listnode
*node
, *nnode
;
4093 struct peer_group
*group
;
4094 struct bgp_filter
*filter
;
4096 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4098 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4100 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4101 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4103 filter
= &peer
->filter
[afi
][safi
];
4105 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4107 if (filter
->aslist
[direct
].name
)
4108 filter
->aslist
[direct
].aslist
=
4109 as_list_lookup (filter
->aslist
[direct
].name
);
4111 filter
->aslist
[direct
].aslist
= NULL
;
4115 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4117 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4118 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4120 filter
= &group
->conf
->filter
[afi
][safi
];
4122 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4124 if (filter
->aslist
[direct
].name
)
4125 filter
->aslist
[direct
].aslist
=
4126 as_list_lookup (filter
->aslist
[direct
].name
);
4128 filter
->aslist
[direct
].aslist
= NULL
;
4135 /* Set route-map to the peer. */
4137 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4140 struct bgp_filter
*filter
;
4141 struct peer_group
*group
;
4142 struct listnode
*node
, *nnode
;
4144 if (! peer
->afc
[afi
][safi
])
4145 return BGP_ERR_PEER_INACTIVE
;
4147 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4148 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4149 return BGP_ERR_INVALID_VALUE
;
4151 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4152 && peer_is_group_member (peer
, afi
, safi
))
4153 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4155 filter
= &peer
->filter
[afi
][safi
];
4157 if (filter
->map
[direct
].name
)
4158 free (filter
->map
[direct
].name
);
4160 filter
->map
[direct
].name
= strdup (name
);
4161 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4163 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4166 group
= peer
->group
;
4167 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4169 filter
= &peer
->filter
[afi
][safi
];
4171 if (! peer
->af_group
[afi
][safi
])
4174 if (filter
->map
[direct
].name
)
4175 free (filter
->map
[direct
].name
);
4176 filter
->map
[direct
].name
= strdup (name
);
4177 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4182 /* Unset route-map from the peer. */
4184 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4186 struct bgp_filter
*filter
;
4187 struct bgp_filter
*gfilter
;
4188 struct peer_group
*group
;
4189 struct listnode
*node
, *nnode
;
4191 if (! peer
->afc
[afi
][safi
])
4192 return BGP_ERR_PEER_INACTIVE
;
4194 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4195 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4196 return BGP_ERR_INVALID_VALUE
;
4198 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4199 && peer_is_group_member (peer
, afi
, safi
))
4200 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4202 filter
= &peer
->filter
[afi
][safi
];
4204 /* apply peer-group filter */
4205 if (peer
->af_group
[afi
][safi
])
4207 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4209 if (gfilter
->map
[direct
].name
)
4211 if (filter
->map
[direct
].name
)
4212 free (filter
->map
[direct
].name
);
4213 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
4214 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
4219 if (filter
->map
[direct
].name
)
4220 free (filter
->map
[direct
].name
);
4221 filter
->map
[direct
].name
= NULL
;
4222 filter
->map
[direct
].map
= NULL
;
4224 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4227 group
= peer
->group
;
4228 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4230 filter
= &peer
->filter
[afi
][safi
];
4232 if (! peer
->af_group
[afi
][safi
])
4235 if (filter
->map
[direct
].name
)
4236 free (filter
->map
[direct
].name
);
4237 filter
->map
[direct
].name
= NULL
;
4238 filter
->map
[direct
].map
= NULL
;
4243 /* Set unsuppress-map to the peer. */
4245 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4248 struct bgp_filter
*filter
;
4249 struct peer_group
*group
;
4250 struct listnode
*node
, *nnode
;
4252 if (! peer
->afc
[afi
][safi
])
4253 return BGP_ERR_PEER_INACTIVE
;
4255 if (peer_is_group_member (peer
, afi
, safi
))
4256 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4258 filter
= &peer
->filter
[afi
][safi
];
4260 if (filter
->usmap
.name
)
4261 free (filter
->usmap
.name
);
4263 filter
->usmap
.name
= strdup (name
);
4264 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4266 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4269 group
= peer
->group
;
4270 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4272 filter
= &peer
->filter
[afi
][safi
];
4274 if (! peer
->af_group
[afi
][safi
])
4277 if (filter
->usmap
.name
)
4278 free (filter
->usmap
.name
);
4279 filter
->usmap
.name
= strdup (name
);
4280 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4285 /* Unset route-map from the peer. */
4287 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4289 struct bgp_filter
*filter
;
4290 struct peer_group
*group
;
4291 struct listnode
*node
, *nnode
;
4293 if (! peer
->afc
[afi
][safi
])
4294 return BGP_ERR_PEER_INACTIVE
;
4296 if (peer_is_group_member (peer
, afi
, safi
))
4297 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4299 filter
= &peer
->filter
[afi
][safi
];
4301 if (filter
->usmap
.name
)
4302 free (filter
->usmap
.name
);
4303 filter
->usmap
.name
= NULL
;
4304 filter
->usmap
.map
= NULL
;
4306 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4309 group
= peer
->group
;
4310 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4312 filter
= &peer
->filter
[afi
][safi
];
4314 if (! peer
->af_group
[afi
][safi
])
4317 if (filter
->usmap
.name
)
4318 free (filter
->usmap
.name
);
4319 filter
->usmap
.name
= NULL
;
4320 filter
->usmap
.map
= NULL
;
4326 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4327 u_int32_t max
, u_char threshold
,
4328 int warning
, u_int16_t restart
)
4330 struct peer_group
*group
;
4331 struct listnode
*node
, *nnode
;
4333 if (! peer
->afc
[afi
][safi
])
4334 return BGP_ERR_PEER_INACTIVE
;
4336 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4337 peer
->pmax
[afi
][safi
] = max
;
4338 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4339 peer
->pmax_restart
[afi
][safi
] = restart
;
4341 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4343 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4345 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4348 group
= peer
->group
;
4349 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4351 if (! peer
->af_group
[afi
][safi
])
4354 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4355 peer
->pmax
[afi
][safi
] = max
;
4356 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4357 peer
->pmax_restart
[afi
][safi
] = restart
;
4359 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4361 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4367 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4369 struct peer_group
*group
;
4370 struct listnode
*node
, *nnode
;
4372 if (! peer
->afc
[afi
][safi
])
4373 return BGP_ERR_PEER_INACTIVE
;
4375 /* apply peer-group config */
4376 if (peer
->af_group
[afi
][safi
])
4378 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4379 PEER_FLAG_MAX_PREFIX
))
4380 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4382 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4384 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4385 PEER_FLAG_MAX_PREFIX_WARNING
))
4386 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4388 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4390 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
4391 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4392 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
4396 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4397 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4398 peer
->pmax
[afi
][safi
] = 0;
4399 peer
->pmax_threshold
[afi
][safi
] = 0;
4400 peer
->pmax_restart
[afi
][safi
] = 0;
4402 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4405 group
= peer
->group
;
4406 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4408 if (! peer
->af_group
[afi
][safi
])
4411 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4412 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4413 peer
->pmax
[afi
][safi
] = 0;
4414 peer
->pmax_threshold
[afi
][safi
] = 0;
4415 peer
->pmax_restart
[afi
][safi
] = 0;
4420 static int is_ebgp_multihop_configured (struct peer
*peer
)
4422 struct peer_group
*group
;
4423 struct listnode
*node
, *nnode
;
4426 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4428 group
= peer
->group
;
4429 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4430 (group
->conf
->ttl
!= 1))
4433 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
4435 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
4442 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4449 /* Set # of hops between us and BGP peer. */
4451 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
4453 struct peer_group
*group
;
4454 struct listnode
*node
, *nnode
;
4457 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
4459 /* We cannot configure ttl-security hops when ebgp-multihop is already
4460 set. For non peer-groups, the check is simple. For peer-groups, it's
4461 slightly messy, because we need to check both the peer-group structure
4462 and all peer-group members for any trace of ebgp-multihop configuration
4463 before actually applying the ttl-security rules. Cisco really made a
4464 mess of this configuration parameter, and OpenBGPD got it right.
4467 if (peer
->gtsm_hops
== 0)
4469 if (is_ebgp_multihop_configured (peer
))
4470 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4472 /* specify MAXTTL on outgoing packets */
4473 /* Routine handles iBGP peers correctly */
4474 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
4479 peer
->gtsm_hops
= gtsm_hops
;
4481 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4484 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, MAXTTL
+ 1 - gtsm_hops
);
4488 group
= peer
->group
;
4489 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4491 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
4493 /* Change setting of existing peer
4494 * established then change value (may break connectivity)
4495 * not established yet (teardown session and restart)
4496 * no session then do nothing (will get handled by next connection)
4498 if (peer
->status
== Established
)
4500 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
4501 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4502 MAXTTL
+ 1 - peer
->gtsm_hops
);
4504 else if (peer
->status
< Established
)
4506 if (BGP_DEBUG (events
, EVENTS
))
4507 zlog_debug ("%s Min-ttl changed", peer
->host
);
4508 BGP_EVENT_ADD (peer
, BGP_Stop
);
4517 peer_ttl_security_hops_unset (struct peer
*peer
)
4519 struct peer_group
*group
;
4520 struct listnode
*node
, *nnode
;
4523 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
4525 /* if a peer-group member, then reset to peer-group default rather than 0 */
4526 if (peer_group_active (peer
))
4527 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
4529 peer
->gtsm_hops
= 0;
4532 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4535 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4539 group
= peer
->group
;
4540 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4542 peer
->gtsm_hops
= 0;
4545 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4549 return peer_ebgp_multihop_unset (opeer
);
4553 peer_clear (struct peer
*peer
)
4555 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4557 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
4559 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4560 if (peer
->t_pmax_restart
)
4562 BGP_TIMER_OFF (peer
->t_pmax_restart
);
4563 if (BGP_DEBUG (events
, EVENTS
))
4564 zlog_debug ("%s Maximum-prefix restart timer canceled",
4567 BGP_EVENT_ADD (peer
, BGP_Start
);
4571 peer
->v_start
= BGP_INIT_START_TIMER
;
4572 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4573 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4574 BGP_NOTIFY_CEASE_ADMIN_RESET
);
4576 BGP_EVENT_ADD (peer
, BGP_Stop
);
4582 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
4583 enum bgp_clear_type stype
)
4585 if (peer
->status
!= Established
)
4588 if (! peer
->afc
[afi
][safi
])
4589 return BGP_ERR_AF_UNCONFIGURED
;
4591 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
4593 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
4595 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
4596 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
4599 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
4600 bgp_announce_route (peer
, afi
, safi
);
4602 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4604 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
4605 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
4606 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
4608 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
4611 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
4612 prefix_type
= ORF_TYPE_PREFIX
;
4614 prefix_type
= ORF_TYPE_PREFIX_OLD
;
4616 if (filter
->plist
[FILTER_IN
].plist
)
4618 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4619 bgp_route_refresh_send (peer
, afi
, safi
,
4620 prefix_type
, REFRESH_DEFER
, 1);
4621 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
4622 REFRESH_IMMEDIATE
, 0);
4626 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4627 bgp_route_refresh_send (peer
, afi
, safi
,
4628 prefix_type
, REFRESH_IMMEDIATE
, 1);
4630 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4636 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
4637 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4639 /* If neighbor has soft reconfiguration inbound flag.
4640 Use Adj-RIB-In database. */
4641 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4642 bgp_soft_reconfig_in (peer
, afi
, safi
);
4645 /* If neighbor has route refresh capability, send route refresh
4646 message to the peer. */
4647 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4648 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4649 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4651 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
4657 /* Display peer uptime.*/
4658 /* XXX: why does this function return char * when it takes buffer? */
4660 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
4665 /* Check buffer length. */
4666 if (len
< BGP_UPTIME_LEN
)
4668 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
4669 /* XXX: should return status instead of buf... */
4670 snprintf (buf
, len
, "<error> ");
4674 /* If there is no connection has been done before print `never'. */
4677 snprintf (buf
, len
, "never ");
4681 /* Get current time. */
4682 uptime1
= bgp_clock ();
4684 tm
= gmtime (&uptime1
);
4686 /* Making formatted timer strings. */
4687 #define ONE_DAY_SECOND 60*60*24
4688 #define ONE_WEEK_SECOND 60*60*24*7
4690 if (uptime1
< ONE_DAY_SECOND
)
4691 snprintf (buf
, len
, "%02d:%02d:%02d",
4692 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
4693 else if (uptime1
< ONE_WEEK_SECOND
)
4694 snprintf (buf
, len
, "%dd%02dh%02dm",
4695 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
4697 snprintf (buf
, len
, "%02dw%dd%02dh",
4698 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
4703 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
4704 afi_t afi
, safi_t safi
)
4706 struct bgp_filter
*filter
;
4707 struct bgp_filter
*gfilter
= NULL
;
4710 int out
= FILTER_OUT
;
4713 filter
= &peer
->filter
[afi
][safi
];
4714 if (peer
->af_group
[afi
][safi
])
4715 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4717 /* distribute-list. */
4718 if (filter
->dlist
[in
].name
)
4719 if (! gfilter
|| ! gfilter
->dlist
[in
].name
4720 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
4721 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
4722 filter
->dlist
[in
].name
, VTY_NEWLINE
);
4723 if (filter
->dlist
[out
].name
&& ! gfilter
)
4724 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
4725 filter
->dlist
[out
].name
, VTY_NEWLINE
);
4728 if (filter
->plist
[in
].name
)
4729 if (! gfilter
|| ! gfilter
->plist
[in
].name
4730 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
4731 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
4732 filter
->plist
[in
].name
, VTY_NEWLINE
);
4733 if (filter
->plist
[out
].name
&& ! gfilter
)
4734 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
4735 filter
->plist
[out
].name
, VTY_NEWLINE
);
4738 if (filter
->map
[RMAP_IN
].name
)
4739 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
4740 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
4741 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
4742 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
4743 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
4744 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
4745 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
4746 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
4747 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
4748 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
4749 if (filter
->map
[RMAP_EXPORT
].name
)
4750 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
4751 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
4752 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
4753 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
4754 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
4756 /* unsuppress-map */
4757 if (filter
->usmap
.name
&& ! gfilter
)
4758 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
4759 filter
->usmap
.name
, VTY_NEWLINE
);
4762 if (filter
->aslist
[in
].name
)
4763 if (! gfilter
|| ! gfilter
->aslist
[in
].name
4764 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
4765 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
4766 filter
->aslist
[in
].name
, VTY_NEWLINE
);
4767 if (filter
->aslist
[out
].name
&& ! gfilter
)
4768 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
4769 filter
->aslist
[out
].name
, VTY_NEWLINE
);
4772 /* BGP peer configuration display function. */
4774 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
4775 struct peer
*peer
, afi_t afi
, safi_t safi
)
4777 struct peer
*g_peer
= NULL
;
4778 char buf
[SU_ADDRSTRLEN
];
4782 if (peer_group_active (peer
))
4783 g_peer
= peer
->group
->conf
;
4785 /************************************
4786 ****** Global to the neighbor ******
4787 ************************************/
4788 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4791 if (! peer_group_active (peer
))
4793 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4794 vty_out (vty
, " neighbor %s peer-group%s", addr
,
4797 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4803 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4805 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4806 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4807 peer
->group
->name
, VTY_NEWLINE
);
4811 if (peer
->change_local_as
)
4812 if (! peer_group_active (peer
))
4813 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
4814 peer
->change_local_as
,
4815 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
4817 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
4818 " replace-as" : "", VTY_NEWLINE
);
4822 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
4826 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4827 if (! peer_group_active (peer
) ||
4828 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
4829 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
4833 if (!peer_group_active (peer
)
4834 || ! g_peer
->password
4835 || strcmp (peer
->password
, g_peer
->password
) != 0)
4836 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
4840 if (peer
->port
!= BGP_PORT_DEFAULT
)
4841 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
4844 /* Local interface name. */
4846 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
4850 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
4851 if (! peer_group_active (peer
) ||
4852 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
4853 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
4855 /* EBGP multihop. */
4856 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
4857 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
4858 if (! peer_group_active (peer
) ||
4859 g_peer
->ttl
!= peer
->ttl
)
4860 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
4863 /* ttl-security hops */
4864 if (peer
->gtsm_hops
!= 0)
4865 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
4866 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
4867 peer
->gtsm_hops
, VTY_NEWLINE
);
4869 /* disable-connected-check. */
4870 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4871 if (! peer_group_active (peer
) ||
4872 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4873 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
4875 /* Update-source. */
4876 if (peer
->update_if
)
4877 if (! peer_group_active (peer
) || ! g_peer
->update_if
4878 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
4879 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4880 peer
->update_if
, VTY_NEWLINE
);
4881 if (peer
->update_source
)
4882 if (! peer_group_active (peer
) || ! g_peer
->update_source
4883 || sockunion_cmp (g_peer
->update_source
,
4884 peer
->update_source
) != 0)
4885 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4886 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
4889 /* advertisement-interval */
4890 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
4891 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
4892 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
4895 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
4896 && ! peer_group_active (peer
))
4897 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
4898 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
4900 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
))
4901 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
4902 peer
->connect
, VTY_NEWLINE
);
4904 /* Default weight. */
4905 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
4906 if (! peer_group_active (peer
) ||
4907 g_peer
->weight
!= peer
->weight
)
4908 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
4911 /* Dynamic capability. */
4912 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4913 if (! peer_group_active (peer
) ||
4914 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4915 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
4918 /* dont capability negotiation. */
4919 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4920 if (! peer_group_active (peer
) ||
4921 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4922 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
4925 /* override capability negotiation. */
4926 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4927 if (! peer_group_active (peer
) ||
4928 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4929 vty_out (vty
, " neighbor %s override-capability%s", addr
,
4932 /* strict capability negotiation. */
4933 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4934 if (! peer_group_active (peer
) ||
4935 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4936 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
4939 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4941 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4943 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4944 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4948 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4949 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
4955 /************************************
4956 ****** Per AF to the neighbor ******
4957 ************************************/
4959 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
4961 if (peer
->af_group
[afi
][safi
])
4962 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4963 peer
->group
->name
, VTY_NEWLINE
);
4965 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4968 /* ORF capability. */
4969 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4970 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4971 if (! peer
->af_group
[afi
][safi
])
4973 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
4975 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4976 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4977 vty_out (vty
, " both");
4978 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
4979 vty_out (vty
, " send");
4981 vty_out (vty
, " receive");
4982 vty_out (vty
, "%s", VTY_NEWLINE
);
4985 /* Route reflector client. */
4986 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
4987 && ! peer
->af_group
[afi
][safi
])
4988 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
4992 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
4993 && ! peer
->af_group
[afi
][safi
])
4994 vty_out (vty
, " neighbor %s next-hop-self%s%s", addr
,
4995 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF_ALL
) ?
4996 " all" : "", VTY_NEWLINE
);
4998 /* Remove private AS. */
4999 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
5000 && ! peer
->af_group
[afi
][safi
])
5001 vty_out (vty
, " neighbor %s remove-private-AS%s",
5004 /* send-community print. */
5005 if (! peer
->af_group
[afi
][safi
])
5007 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5009 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5010 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5011 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
5012 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5013 vty_out (vty
, " neighbor %s send-community extended%s",
5015 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5016 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
5020 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5021 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5022 vty_out (vty
, " no neighbor %s send-community both%s",
5024 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5025 vty_out (vty
, " no neighbor %s send-community extended%s",
5027 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5028 vty_out (vty
, " no neighbor %s send-community%s",
5033 /* Default information */
5034 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
5035 && ! peer
->af_group
[afi
][safi
])
5037 vty_out (vty
, " neighbor %s default-originate", addr
);
5038 if (peer
->default_rmap
[afi
][safi
].name
)
5039 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
5040 vty_out (vty
, "%s", VTY_NEWLINE
);
5043 /* Soft reconfiguration inbound. */
5044 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5045 if (! peer
->af_group
[afi
][safi
] ||
5046 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5047 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
5050 /* maximum-prefix. */
5051 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
5052 if (! peer
->af_group
[afi
][safi
]
5053 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
5054 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
5055 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
5056 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5058 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
5059 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
5060 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
5061 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5062 vty_out (vty
, " warning-only");
5063 if (peer
->pmax_restart
[afi
][safi
])
5064 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
5065 vty_out (vty
, "%s", VTY_NEWLINE
);
5068 /* Route server client. */
5069 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
5070 && ! peer
->af_group
[afi
][safi
])
5071 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
5073 /* Nexthop-local unchanged. */
5074 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
5075 && ! peer
->af_group
[afi
][safi
])
5076 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
5079 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
5080 if (! peer_group_active (peer
)
5081 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
5082 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
5084 if (peer
->allowas_in
[afi
][safi
] == 3)
5085 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
5087 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
5088 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
5092 bgp_config_write_filter (vty
, peer
, afi
, safi
);
5094 /* atribute-unchanged. */
5095 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5096 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5097 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5098 && ! peer
->af_group
[afi
][safi
])
5100 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5101 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5102 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5103 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
5105 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
5106 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
5108 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
5110 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
5111 " med" : "", VTY_NEWLINE
);
5115 /* Display "address-family" configuration header. */
5117 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
5123 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5126 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
5130 if (safi
== SAFI_MULTICAST
)
5131 vty_out (vty
, "ipv4 multicast");
5132 else if (safi
== SAFI_MPLS_VPN
)
5133 vty_out (vty
, "vpnv4 unicast");
5135 else if (afi
== AFI_IP6
)
5137 vty_out (vty
, "ipv6");
5139 if (safi
== SAFI_MULTICAST
)
5140 vty_out (vty
, " multicast");
5143 vty_out (vty
, "%s", VTY_NEWLINE
);
5148 /* Address family based peer configuration display. */
5150 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
5155 struct peer_group
*group
;
5156 struct listnode
*node
, *nnode
;
5158 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
5160 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
5162 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5164 if (group
->conf
->afc
[afi
][safi
])
5166 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5167 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
5170 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5172 if (peer
->afc
[afi
][safi
])
5174 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5176 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5177 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
5182 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
5185 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
5191 bgp_config_write (struct vty
*vty
)
5195 struct peer_group
*group
;
5197 struct listnode
*node
, *nnode
;
5198 struct listnode
*mnode
, *mnnode
;
5200 /* BGP Multiple instance. */
5201 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5203 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
5207 /* BGP Config type. */
5208 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5210 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
5214 /* BGP configuration. */
5215 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5218 vty_out (vty
, "!%s", VTY_NEWLINE
);
5220 /* Router bgp ASN */
5221 vty_out (vty
, "router bgp %u", bgp
->as
);
5223 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5226 vty_out (vty
, " view %s", bgp
->name
);
5228 vty_out (vty
, "%s", VTY_NEWLINE
);
5230 /* No Synchronization */
5231 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5232 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
5234 /* BGP fast-external-failover. */
5235 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
5236 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
5238 /* BGP router ID. */
5239 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
5240 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
5243 /* BGP log-neighbor-changes. */
5244 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
5245 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
5247 /* BGP configuration. */
5248 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
5249 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
5251 /* BGP default ipv4-unicast. */
5252 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5253 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
5255 /* BGP default local-preference. */
5256 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
5257 vty_out (vty
, " bgp default local-preference %d%s",
5258 bgp
->default_local_pref
, VTY_NEWLINE
);
5260 /* BGP client-to-client reflection. */
5261 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
5262 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
5264 /* BGP cluster ID. */
5265 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
5266 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
5269 /* Confederation identifier*/
5270 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
5271 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
5274 /* Confederation peer */
5275 if (bgp
->confed_peers_cnt
> 0)
5279 vty_out (vty
, " bgp confederation peers");
5281 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
5282 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
5284 vty_out (vty
, "%s", VTY_NEWLINE
);
5287 /* BGP enforce-first-as. */
5288 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
5289 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
5291 /* BGP deterministic-med. */
5292 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
5293 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
5295 /* BGP graceful-restart. */
5296 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
5297 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
5298 bgp
->stalepath_time
, VTY_NEWLINE
);
5299 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
5300 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
5302 /* BGP bestpath method. */
5303 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
5304 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
5305 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
5306 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
5307 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
5308 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
5310 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
5311 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
5312 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
5313 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5315 vty_out (vty
, " bgp bestpath med");
5316 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
5317 vty_out (vty
, " confed");
5318 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5319 vty_out (vty
, " missing-as-worst");
5320 vty_out (vty
, "%s", VTY_NEWLINE
);
5323 /* BGP network import check. */
5324 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
5325 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
5327 /* BGP scan interval. */
5328 bgp_config_write_scan_time (vty
);
5330 /* BGP flag dampening. */
5331 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
5332 BGP_CONFIG_DAMPENING
))
5333 bgp_config_write_damp (vty
);
5335 /* BGP static route configuration. */
5336 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5338 /* BGP redistribute configuration. */
5339 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5341 /* BGP timers configuration. */
5342 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
5343 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
5344 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
5345 bgp
->default_holdtime
, VTY_NEWLINE
);
5348 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5350 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
5353 /* Normal neighbor configuration. */
5354 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5356 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5357 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
5361 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5363 /* Distance configuration. */
5364 bgp_config_write_distance (vty
, bgp
);
5366 /* No auto-summary */
5367 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5368 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
5370 /* IPv4 multicast configuration. */
5371 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
5373 /* IPv4 VPN configuration. */
5374 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
5376 /* IPv6 unicast configuration. */
5377 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
5379 /* IPv6 multicast configuration. */
5380 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
5388 bgp_master_init (void)
5390 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
5393 bm
->bgp
= list_new ();
5394 bm
->listen_sockets
= list_new ();
5395 bm
->port
= BGP_PORT_DEFAULT
;
5396 bm
->master
= thread_master_create ();
5397 bm
->start_time
= bgp_clock ();
5404 /* BGP VTY commands installation. */
5415 bgp_route_map_init ();
5416 bgp_address_init ();
5418 bgp_mplsvpn_init ();
5420 /* Access list initialize. */
5421 access_list_init ();
5422 access_list_add_hook (peer_distribute_update
);
5423 access_list_delete_hook (peer_distribute_update
);
5425 /* Filter list initialize. */
5427 as_list_add_hook (peer_aslist_update
);
5428 as_list_delete_hook (peer_aslist_update
);
5430 /* Prefix list initialize.*/
5431 prefix_list_init ();
5432 prefix_list_add_hook (peer_prefix_list_update
);
5433 prefix_list_delete_hook (peer_prefix_list_update
);
5435 /* Community list initialize. */
5436 bgp_clist
= community_list_init ();
5440 #endif /* HAVE_SNMP */
5444 bgp_terminate (void)
5448 struct listnode
*node
, *nnode
;
5449 struct listnode
*mnode
, *mnnode
;
5451 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5452 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5453 if (peer
->status
== Established
)
5454 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5455 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
5457 bgp_cleanup_routes ();
5459 if (bm
->process_main_queue
)
5461 work_queue_free (bm
->process_main_queue
);
5462 bm
->process_main_queue
= NULL
;
5464 if (bm
->process_rsclient_queue
)
5466 work_queue_free (bm
->process_rsclient_queue
);
5467 bm
->process_rsclient_queue
= NULL
;