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
},
2361 /* Proper action set. */
2363 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
2364 struct peer_flag_action
*action
, u_int32_t flag
)
2370 const struct peer_flag_action
*match
= NULL
;
2372 /* Check peer's frag action. */
2373 for (i
= 0; i
< size
; i
++)
2375 match
= &action_list
[i
];
2377 if (match
->flag
== 0)
2380 if (match
->flag
& flag
)
2384 if (match
->type
== peer_change_reset_in
)
2386 if (match
->type
== peer_change_reset_out
)
2388 if (match
->type
== peer_change_reset
)
2393 if (match
->not_for_member
)
2394 action
->not_for_member
= 1;
2398 /* Set peer clear type. */
2399 if (reset_in
&& reset_out
)
2400 action
->type
= peer_change_reset
;
2402 action
->type
= peer_change_reset_in
;
2404 action
->type
= peer_change_reset_out
;
2406 action
->type
= peer_change_none
;
2412 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2414 if (flag
== PEER_FLAG_SHUTDOWN
)
2416 if (CHECK_FLAG (peer
->flags
, flag
))
2418 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2419 peer_nsf_stop (peer
);
2421 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
2422 if (peer
->t_pmax_restart
)
2424 BGP_TIMER_OFF (peer
->t_pmax_restart
);
2425 if (BGP_DEBUG (events
, EVENTS
))
2426 zlog_debug ("%s Maximum-prefix restart timer canceled",
2430 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2431 peer_nsf_stop (peer
);
2433 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2434 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2435 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2437 BGP_EVENT_ADD (peer
, BGP_Stop
);
2441 peer
->v_start
= BGP_INIT_START_TIMER
;
2442 BGP_EVENT_ADD (peer
, BGP_Stop
);
2445 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2447 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2448 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2449 else if (flag
== PEER_FLAG_PASSIVE
)
2450 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2451 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
2452 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2454 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2455 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2458 BGP_EVENT_ADD (peer
, BGP_Stop
);
2461 /* Change specified peer flag. */
2463 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2467 struct peer_group
*group
;
2468 struct listnode
*node
, *nnode
;
2469 struct peer_flag_action action
;
2471 memset (&action
, 0, sizeof (struct peer_flag_action
));
2472 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2474 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2476 /* No flag action is found. */
2478 return BGP_ERR_INVALID_FLAG
;
2480 /* Not for peer-group member. */
2481 if (action
.not_for_member
&& peer_group_active (peer
))
2482 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2484 /* When unset the peer-group member's flag we have to check
2485 peer-group configuration. */
2486 if (! set
&& peer_group_active (peer
))
2487 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2489 if (flag
== PEER_FLAG_SHUTDOWN
)
2490 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2492 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2495 /* Flag conflict check. */
2497 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2498 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2499 return BGP_ERR_PEER_FLAG_CONFLICT
;
2501 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2503 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2505 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2510 SET_FLAG (peer
->flags
, flag
);
2512 UNSET_FLAG (peer
->flags
, flag
);
2514 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2516 if (action
.type
== peer_change_reset
)
2517 peer_flag_modify_action (peer
, flag
);
2522 /* peer-group member updates. */
2523 group
= peer
->group
;
2525 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2527 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2530 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2534 SET_FLAG (peer
->flags
, flag
);
2536 UNSET_FLAG (peer
->flags
, flag
);
2538 if (action
.type
== peer_change_reset
)
2539 peer_flag_modify_action (peer
, flag
);
2545 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2547 return peer_flag_modify (peer
, flag
, 1);
2551 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2553 return peer_flag_modify (peer
, flag
, 0);
2557 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2559 if (peer
->af_group
[afi
][safi
])
2565 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2570 struct listnode
*node
, *nnode
;
2571 struct peer_group
*group
;
2572 struct peer_flag_action action
;
2574 memset (&action
, 0, sizeof (struct peer_flag_action
));
2575 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2577 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2579 /* No flag action is found. */
2581 return BGP_ERR_INVALID_FLAG
;
2583 /* Adress family must be activated. */
2584 if (! peer
->afc
[afi
][safi
])
2585 return BGP_ERR_PEER_INACTIVE
;
2587 /* Not for peer-group member. */
2588 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2589 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2591 /* Spcecial check for reflector client. */
2592 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2593 && peer_sort (peer
) != BGP_PEER_IBGP
)
2594 return BGP_ERR_NOT_INTERNAL_PEER
;
2596 /* Spcecial check for remove-private-AS. */
2597 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2598 && peer_sort (peer
) == BGP_PEER_IBGP
)
2599 return BGP_ERR_REMOVE_PRIVATE_AS
;
2601 /* When unset the peer-group member's flag we have to check
2602 peer-group configuration. */
2603 if (! set
&& peer
->af_group
[afi
][safi
])
2604 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2605 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2607 /* When current flag configuration is same as requested one. */
2608 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2610 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2612 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2617 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2619 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2621 /* Execute action when peer is established. */
2622 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2623 && peer
->status
== Established
)
2625 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2626 bgp_clear_adj_in (peer
, afi
, safi
);
2629 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2630 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2631 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2632 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2633 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2634 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2635 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2636 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2638 peer_change_action (peer
, afi
, safi
, action
.type
);
2643 /* Peer group member updates. */
2644 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2646 group
= peer
->group
;
2648 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2650 if (! peer
->af_group
[afi
][safi
])
2653 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2656 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2660 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2662 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2664 if (peer
->status
== Established
)
2666 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2667 bgp_clear_adj_in (peer
, afi
, safi
);
2670 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2671 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2672 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2673 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2674 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2675 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2676 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2677 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2679 peer_change_action (peer
, afi
, safi
, action
.type
);
2688 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2690 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2694 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2696 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2699 /* EBGP multihop configuration. */
2701 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2703 struct peer_group
*group
;
2704 struct listnode
*node
, *nnode
;
2707 if (peer
->sort
== BGP_PEER_IBGP
)
2710 /* see comment in peer_ttl_security_hops_set() */
2713 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2715 group
= peer
->group
;
2716 if (group
->conf
->gtsm_hops
!= 0)
2717 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2719 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
2721 if (peer1
->sort
== BGP_PEER_IBGP
)
2724 if (peer1
->gtsm_hops
!= 0)
2725 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2730 if (peer
->gtsm_hops
!= 0)
2731 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2737 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2739 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2740 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2744 group
= peer
->group
;
2745 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2747 if (peer
->sort
== BGP_PEER_IBGP
)
2750 peer
->ttl
= group
->conf
->ttl
;
2753 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2760 peer_ebgp_multihop_unset (struct peer
*peer
)
2762 struct peer_group
*group
;
2763 struct listnode
*node
, *nnode
;
2765 if (peer
->sort
== BGP_PEER_IBGP
)
2768 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
2769 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2771 if (peer_group_active (peer
))
2772 peer
->ttl
= peer
->group
->conf
->ttl
;
2776 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2778 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2779 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2783 group
= peer
->group
;
2784 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2786 if (peer
->sort
== BGP_PEER_IBGP
)
2792 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2798 /* Neighbor description. */
2800 peer_description_set (struct peer
*peer
, char *desc
)
2803 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2805 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
2811 peer_description_unset (struct peer
*peer
)
2814 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2821 /* Neighbor update-source. */
2823 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
2825 struct peer_group
*group
;
2826 struct listnode
*node
, *nnode
;
2828 if (peer
->update_if
)
2830 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2831 && strcmp (peer
->update_if
, ifname
) == 0)
2834 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2835 peer
->update_if
= NULL
;
2838 if (peer
->update_source
)
2840 sockunion_free (peer
->update_source
);
2841 peer
->update_source
= NULL
;
2844 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2846 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2848 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2850 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2851 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2852 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2855 BGP_EVENT_ADD (peer
, BGP_Stop
);
2859 /* peer-group member updates. */
2860 group
= peer
->group
;
2861 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2863 if (peer
->update_if
)
2865 if (strcmp (peer
->update_if
, ifname
) == 0)
2868 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2869 peer
->update_if
= NULL
;
2872 if (peer
->update_source
)
2874 sockunion_free (peer
->update_source
);
2875 peer
->update_source
= NULL
;
2878 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2880 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2882 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2883 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2884 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2887 BGP_EVENT_ADD (peer
, BGP_Stop
);
2893 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
2895 struct peer_group
*group
;
2896 struct listnode
*node
, *nnode
;
2898 if (peer
->update_source
)
2900 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2901 && sockunion_cmp (peer
->update_source
, su
) == 0)
2903 sockunion_free (peer
->update_source
);
2904 peer
->update_source
= NULL
;
2907 if (peer
->update_if
)
2909 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2910 peer
->update_if
= NULL
;
2913 peer
->update_source
= sockunion_dup (su
);
2915 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2917 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2919 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2920 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2921 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2924 BGP_EVENT_ADD (peer
, BGP_Stop
);
2928 /* peer-group member updates. */
2929 group
= peer
->group
;
2930 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2932 if (peer
->update_source
)
2934 if (sockunion_cmp (peer
->update_source
, su
) == 0)
2936 sockunion_free (peer
->update_source
);
2937 peer
->update_source
= NULL
;
2940 if (peer
->update_if
)
2942 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2943 peer
->update_if
= NULL
;
2946 peer
->update_source
= sockunion_dup (su
);
2948 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2950 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2951 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2952 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2955 BGP_EVENT_ADD (peer
, BGP_Stop
);
2961 peer_update_source_unset (struct peer
*peer
)
2963 union sockunion
*su
;
2964 struct peer_group
*group
;
2965 struct listnode
*node
, *nnode
;
2967 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2968 && ! peer
->update_source
2969 && ! peer
->update_if
)
2972 if (peer
->update_source
)
2974 sockunion_free (peer
->update_source
);
2975 peer
->update_source
= NULL
;
2977 if (peer
->update_if
)
2979 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2980 peer
->update_if
= NULL
;
2983 if (peer_group_active (peer
))
2985 group
= peer
->group
;
2987 if (group
->conf
->update_source
)
2989 su
= sockunion_dup (group
->conf
->update_source
);
2990 peer
->update_source
= su
;
2992 else if (group
->conf
->update_if
)
2994 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
2997 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2999 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3001 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3002 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3003 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3006 BGP_EVENT_ADD (peer
, BGP_Stop
);
3010 /* peer-group member updates. */
3011 group
= peer
->group
;
3012 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3014 if (! peer
->update_source
&& ! peer
->update_if
)
3017 if (peer
->update_source
)
3019 sockunion_free (peer
->update_source
);
3020 peer
->update_source
= NULL
;
3023 if (peer
->update_if
)
3025 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3026 peer
->update_if
= NULL
;
3029 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3031 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3032 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3033 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3036 BGP_EVENT_ADD (peer
, BGP_Stop
);
3042 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3045 struct peer_group
*group
;
3046 struct listnode
*node
, *nnode
;
3048 /* Adress family must be activated. */
3049 if (! peer
->afc
[afi
][safi
])
3050 return BGP_ERR_PEER_INACTIVE
;
3052 /* Default originate can't be used for peer group memeber. */
3053 if (peer_is_group_member (peer
, afi
, safi
))
3054 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3056 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3057 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3058 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3060 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3064 if (peer
->default_rmap
[afi
][safi
].name
)
3065 free (peer
->default_rmap
[afi
][safi
].name
);
3066 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3067 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3071 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3073 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3074 bgp_default_originate (peer
, afi
, safi
, 0);
3078 /* peer-group member updates. */
3079 group
= peer
->group
;
3080 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3082 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3086 if (peer
->default_rmap
[afi
][safi
].name
)
3087 free (peer
->default_rmap
[afi
][safi
].name
);
3088 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3089 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3092 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3093 bgp_default_originate (peer
, afi
, safi
, 0);
3099 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3101 struct peer_group
*group
;
3102 struct listnode
*node
, *nnode
;
3104 /* Adress family must be activated. */
3105 if (! peer
->afc
[afi
][safi
])
3106 return BGP_ERR_PEER_INACTIVE
;
3108 /* Default originate can't be used for peer group memeber. */
3109 if (peer_is_group_member (peer
, afi
, safi
))
3110 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3112 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3114 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3116 if (peer
->default_rmap
[afi
][safi
].name
)
3117 free (peer
->default_rmap
[afi
][safi
].name
);
3118 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3119 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3122 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3124 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3125 bgp_default_originate (peer
, afi
, safi
, 1);
3129 /* peer-group member updates. */
3130 group
= peer
->group
;
3131 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3133 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3135 if (peer
->default_rmap
[afi
][safi
].name
)
3136 free (peer
->default_rmap
[afi
][safi
].name
);
3137 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3138 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3140 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3141 bgp_default_originate (peer
, afi
, safi
, 1);
3147 peer_port_set (struct peer
*peer
, u_int16_t port
)
3154 peer_port_unset (struct peer
*peer
)
3156 peer
->port
= BGP_PORT_DEFAULT
;
3160 /* neighbor weight. */
3162 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
3164 struct peer_group
*group
;
3165 struct listnode
*node
, *nnode
;
3167 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3168 peer
->weight
= weight
;
3170 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3173 /* peer-group member updates. */
3174 group
= peer
->group
;
3175 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3177 peer
->weight
= group
->conf
->weight
;
3183 peer_weight_unset (struct peer
*peer
)
3185 struct peer_group
*group
;
3186 struct listnode
*node
, *nnode
;
3188 /* Set default weight. */
3189 if (peer_group_active (peer
))
3190 peer
->weight
= peer
->group
->conf
->weight
;
3194 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3196 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3199 /* peer-group member updates. */
3200 group
= peer
->group
;
3201 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3209 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
3211 struct peer_group
*group
;
3212 struct listnode
*node
, *nnode
;
3214 /* Not for peer group memeber. */
3215 if (peer_group_active (peer
))
3216 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3218 /* keepalive value check. */
3219 if (keepalive
> 65535)
3220 return BGP_ERR_INVALID_VALUE
;
3222 /* Holdtime value check. */
3223 if (holdtime
> 65535)
3224 return BGP_ERR_INVALID_VALUE
;
3226 /* Holdtime value must be either 0 or greater than 3. */
3227 if (holdtime
< 3 && holdtime
!= 0)
3228 return BGP_ERR_INVALID_VALUE
;
3230 /* Set value to the configuration. */
3231 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3232 peer
->holdtime
= holdtime
;
3233 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
3235 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3238 /* peer-group member updates. */
3239 group
= peer
->group
;
3240 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3242 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3243 peer
->holdtime
= group
->conf
->holdtime
;
3244 peer
->keepalive
= group
->conf
->keepalive
;
3250 peer_timers_unset (struct peer
*peer
)
3252 struct peer_group
*group
;
3253 struct listnode
*node
, *nnode
;
3255 if (peer_group_active (peer
))
3256 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3258 /* Clear configuration. */
3259 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3260 peer
->keepalive
= 0;
3263 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3266 /* peer-group member updates. */
3267 group
= peer
->group
;
3268 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3270 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3272 peer
->keepalive
= 0;
3279 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
3281 if (peer_group_active (peer
))
3282 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3284 if (connect
> 65535)
3285 return BGP_ERR_INVALID_VALUE
;
3287 /* Set value to the configuration. */
3288 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3289 peer
->connect
= connect
;
3291 /* Set value to timer setting. */
3292 peer
->v_connect
= connect
;
3298 peer_timers_connect_unset (struct peer
*peer
)
3300 if (peer_group_active (peer
))
3301 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3303 /* Clear configuration. */
3304 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3307 /* Set timer setting to default value. */
3308 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3314 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3316 if (peer_group_active (peer
))
3317 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3320 return BGP_ERR_INVALID_VALUE
;
3322 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3323 peer
->routeadv
= routeadv
;
3324 peer
->v_routeadv
= routeadv
;
3330 peer_advertise_interval_unset (struct peer
*peer
)
3332 if (peer_group_active (peer
))
3333 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3335 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3338 if (peer
->sort
== BGP_PEER_IBGP
)
3339 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3341 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3346 /* neighbor interface */
3348 peer_interface_set (struct peer
*peer
, const char *str
)
3351 free (peer
->ifname
);
3352 peer
->ifname
= strdup (str
);
3358 peer_interface_unset (struct peer
*peer
)
3361 free (peer
->ifname
);
3362 peer
->ifname
= NULL
;
3369 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3371 struct peer_group
*group
;
3372 struct listnode
*node
, *nnode
;
3374 if (allow_num
< 1 || allow_num
> 10)
3375 return BGP_ERR_INVALID_VALUE
;
3377 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3379 peer
->allowas_in
[afi
][safi
] = allow_num
;
3380 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3381 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3384 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3387 group
= peer
->group
;
3388 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3390 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3392 peer
->allowas_in
[afi
][safi
] = allow_num
;
3393 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3394 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3402 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3404 struct peer_group
*group
;
3405 struct listnode
*node
, *nnode
;
3407 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3409 peer
->allowas_in
[afi
][safi
] = 0;
3410 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3413 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3416 group
= peer
->group
;
3417 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3419 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3421 peer
->allowas_in
[afi
][safi
] = 0;
3422 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3429 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
3431 struct bgp
*bgp
= peer
->bgp
;
3432 struct peer_group
*group
;
3433 struct listnode
*node
, *nnode
;
3435 if (peer_sort (peer
) != BGP_PEER_EBGP
3436 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3437 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3440 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3442 if (peer_group_active (peer
))
3443 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3446 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
3448 if (peer
->change_local_as
== as
&&
3449 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3450 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
3451 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
3452 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
3455 peer
->change_local_as
= as
;
3457 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3459 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3462 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3464 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3466 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3468 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3470 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3471 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3472 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3475 BGP_EVENT_ADD (peer
, BGP_Stop
);
3480 group
= peer
->group
;
3481 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3483 peer
->change_local_as
= as
;
3485 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3487 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3490 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3492 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3494 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3496 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3497 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3498 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3501 BGP_EVENT_ADD (peer
, BGP_Stop
);
3508 peer_local_as_unset (struct peer
*peer
)
3510 struct peer_group
*group
;
3511 struct listnode
*node
, *nnode
;
3513 if (peer_group_active (peer
))
3514 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3516 if (! peer
->change_local_as
)
3519 peer
->change_local_as
= 0;
3520 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3521 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3523 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3525 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3527 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3528 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3529 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3532 BGP_EVENT_ADD (peer
, BGP_Stop
);
3537 group
= peer
->group
;
3538 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3540 peer
->change_local_as
= 0;
3541 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3542 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3544 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3546 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3547 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3548 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3551 BGP_EVENT_ADD (peer
, BGP_Stop
);
3556 /* Set password for authenticating with the peer. */
3558 peer_password_set (struct peer
*peer
, const char *password
)
3560 struct listnode
*nn
, *nnode
;
3561 int len
= password
? strlen(password
) : 0;
3562 int ret
= BGP_SUCCESS
;
3564 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
3565 return BGP_ERR_INVALID_VALUE
;
3567 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
3568 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3572 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3574 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
3576 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3578 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3579 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3581 BGP_EVENT_ADD (peer
, BGP_Stop
);
3583 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
3586 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3588 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
3592 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3594 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
3596 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3597 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3599 BGP_EVENT_ADD (peer
, BGP_Stop
);
3601 if (bgp_md5_set (peer
) < 0)
3602 ret
= BGP_ERR_TCPSIG_FAILED
;
3609 peer_password_unset (struct peer
*peer
)
3611 struct listnode
*nn
, *nnode
;
3614 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3617 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3619 if (peer_group_active (peer
)
3620 && peer
->group
->conf
->password
3621 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
3622 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3624 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3625 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3627 BGP_EVENT_ADD (peer
, BGP_Stop
);
3630 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3632 peer
->password
= NULL
;
3639 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3640 peer
->password
= NULL
;
3642 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3644 if (!peer
->password
)
3647 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3648 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3650 BGP_EVENT_ADD (peer
, BGP_Stop
);
3652 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3653 peer
->password
= NULL
;
3661 /* Set distribute list to the peer. */
3663 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3666 struct bgp_filter
*filter
;
3667 struct peer_group
*group
;
3668 struct listnode
*node
, *nnode
;
3670 if (! peer
->afc
[afi
][safi
])
3671 return BGP_ERR_PEER_INACTIVE
;
3673 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3674 return BGP_ERR_INVALID_VALUE
;
3676 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3677 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3679 filter
= &peer
->filter
[afi
][safi
];
3681 if (filter
->plist
[direct
].name
)
3682 return BGP_ERR_PEER_FILTER_CONFLICT
;
3684 if (filter
->dlist
[direct
].name
)
3685 free (filter
->dlist
[direct
].name
);
3686 filter
->dlist
[direct
].name
= strdup (name
);
3687 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3689 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3692 group
= peer
->group
;
3693 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3695 filter
= &peer
->filter
[afi
][safi
];
3697 if (! peer
->af_group
[afi
][safi
])
3700 if (filter
->dlist
[direct
].name
)
3701 free (filter
->dlist
[direct
].name
);
3702 filter
->dlist
[direct
].name
= strdup (name
);
3703 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3710 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3712 struct bgp_filter
*filter
;
3713 struct bgp_filter
*gfilter
;
3714 struct peer_group
*group
;
3715 struct listnode
*node
, *nnode
;
3717 if (! peer
->afc
[afi
][safi
])
3718 return BGP_ERR_PEER_INACTIVE
;
3720 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3721 return BGP_ERR_INVALID_VALUE
;
3723 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3724 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3726 filter
= &peer
->filter
[afi
][safi
];
3728 /* apply peer-group filter */
3729 if (peer
->af_group
[afi
][safi
])
3731 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3733 if (gfilter
->dlist
[direct
].name
)
3735 if (filter
->dlist
[direct
].name
)
3736 free (filter
->dlist
[direct
].name
);
3737 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
3738 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
3743 if (filter
->dlist
[direct
].name
)
3744 free (filter
->dlist
[direct
].name
);
3745 filter
->dlist
[direct
].name
= NULL
;
3746 filter
->dlist
[direct
].alist
= NULL
;
3748 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3751 group
= peer
->group
;
3752 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3754 filter
= &peer
->filter
[afi
][safi
];
3756 if (! peer
->af_group
[afi
][safi
])
3759 if (filter
->dlist
[direct
].name
)
3760 free (filter
->dlist
[direct
].name
);
3761 filter
->dlist
[direct
].name
= NULL
;
3762 filter
->dlist
[direct
].alist
= NULL
;
3768 /* Update distribute list. */
3770 peer_distribute_update (struct access_list
*access
)
3775 struct listnode
*mnode
, *mnnode
;
3776 struct listnode
*node
, *nnode
;
3779 struct peer_group
*group
;
3780 struct bgp_filter
*filter
;
3782 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3784 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3786 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3787 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3789 filter
= &peer
->filter
[afi
][safi
];
3791 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3793 if (filter
->dlist
[direct
].name
)
3794 filter
->dlist
[direct
].alist
=
3795 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3797 filter
->dlist
[direct
].alist
= NULL
;
3801 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3803 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3804 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3806 filter
= &group
->conf
->filter
[afi
][safi
];
3808 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3810 if (filter
->dlist
[direct
].name
)
3811 filter
->dlist
[direct
].alist
=
3812 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3814 filter
->dlist
[direct
].alist
= NULL
;
3821 /* Set prefix list to the peer. */
3823 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3826 struct bgp_filter
*filter
;
3827 struct peer_group
*group
;
3828 struct listnode
*node
, *nnode
;
3830 if (! peer
->afc
[afi
][safi
])
3831 return BGP_ERR_PEER_INACTIVE
;
3833 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3834 return BGP_ERR_INVALID_VALUE
;
3836 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3837 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3839 filter
= &peer
->filter
[afi
][safi
];
3841 if (filter
->dlist
[direct
].name
)
3842 return BGP_ERR_PEER_FILTER_CONFLICT
;
3844 if (filter
->plist
[direct
].name
)
3845 free (filter
->plist
[direct
].name
);
3846 filter
->plist
[direct
].name
= strdup (name
);
3847 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3849 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3852 group
= peer
->group
;
3853 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3855 filter
= &peer
->filter
[afi
][safi
];
3857 if (! peer
->af_group
[afi
][safi
])
3860 if (filter
->plist
[direct
].name
)
3861 free (filter
->plist
[direct
].name
);
3862 filter
->plist
[direct
].name
= strdup (name
);
3863 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3869 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3871 struct bgp_filter
*filter
;
3872 struct bgp_filter
*gfilter
;
3873 struct peer_group
*group
;
3874 struct listnode
*node
, *nnode
;
3876 if (! peer
->afc
[afi
][safi
])
3877 return BGP_ERR_PEER_INACTIVE
;
3879 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3880 return BGP_ERR_INVALID_VALUE
;
3882 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3883 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3885 filter
= &peer
->filter
[afi
][safi
];
3887 /* apply peer-group filter */
3888 if (peer
->af_group
[afi
][safi
])
3890 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3892 if (gfilter
->plist
[direct
].name
)
3894 if (filter
->plist
[direct
].name
)
3895 free (filter
->plist
[direct
].name
);
3896 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
3897 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
3902 if (filter
->plist
[direct
].name
)
3903 free (filter
->plist
[direct
].name
);
3904 filter
->plist
[direct
].name
= NULL
;
3905 filter
->plist
[direct
].plist
= NULL
;
3907 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3910 group
= peer
->group
;
3911 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3913 filter
= &peer
->filter
[afi
][safi
];
3915 if (! peer
->af_group
[afi
][safi
])
3918 if (filter
->plist
[direct
].name
)
3919 free (filter
->plist
[direct
].name
);
3920 filter
->plist
[direct
].name
= NULL
;
3921 filter
->plist
[direct
].plist
= NULL
;
3927 /* Update prefix-list list. */
3929 peer_prefix_list_update (struct prefix_list
*plist
)
3931 struct listnode
*mnode
, *mnnode
;
3932 struct listnode
*node
, *nnode
;
3935 struct peer_group
*group
;
3936 struct bgp_filter
*filter
;
3941 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3943 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3945 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3946 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3948 filter
= &peer
->filter
[afi
][safi
];
3950 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3952 if (filter
->plist
[direct
].name
)
3953 filter
->plist
[direct
].plist
=
3954 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3956 filter
->plist
[direct
].plist
= NULL
;
3960 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3962 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3963 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3965 filter
= &group
->conf
->filter
[afi
][safi
];
3967 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3969 if (filter
->plist
[direct
].name
)
3970 filter
->plist
[direct
].plist
=
3971 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3973 filter
->plist
[direct
].plist
= NULL
;
3981 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3984 struct bgp_filter
*filter
;
3985 struct peer_group
*group
;
3986 struct listnode
*node
, *nnode
;
3988 if (! peer
->afc
[afi
][safi
])
3989 return BGP_ERR_PEER_INACTIVE
;
3991 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3992 return BGP_ERR_INVALID_VALUE
;
3994 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3995 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3997 filter
= &peer
->filter
[afi
][safi
];
3999 if (filter
->aslist
[direct
].name
)
4000 free (filter
->aslist
[direct
].name
);
4001 filter
->aslist
[direct
].name
= strdup (name
);
4002 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4004 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4007 group
= peer
->group
;
4008 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4010 filter
= &peer
->filter
[afi
][safi
];
4012 if (! peer
->af_group
[afi
][safi
])
4015 if (filter
->aslist
[direct
].name
)
4016 free (filter
->aslist
[direct
].name
);
4017 filter
->aslist
[direct
].name
= strdup (name
);
4018 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4024 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
4026 struct bgp_filter
*filter
;
4027 struct bgp_filter
*gfilter
;
4028 struct peer_group
*group
;
4029 struct listnode
*node
, *nnode
;
4031 if (! peer
->afc
[afi
][safi
])
4032 return BGP_ERR_PEER_INACTIVE
;
4034 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4035 return BGP_ERR_INVALID_VALUE
;
4037 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4038 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4040 filter
= &peer
->filter
[afi
][safi
];
4042 /* apply peer-group filter */
4043 if (peer
->af_group
[afi
][safi
])
4045 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4047 if (gfilter
->aslist
[direct
].name
)
4049 if (filter
->aslist
[direct
].name
)
4050 free (filter
->aslist
[direct
].name
);
4051 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
4052 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
4057 if (filter
->aslist
[direct
].name
)
4058 free (filter
->aslist
[direct
].name
);
4059 filter
->aslist
[direct
].name
= NULL
;
4060 filter
->aslist
[direct
].aslist
= NULL
;
4062 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4065 group
= peer
->group
;
4066 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4068 filter
= &peer
->filter
[afi
][safi
];
4070 if (! peer
->af_group
[afi
][safi
])
4073 if (filter
->aslist
[direct
].name
)
4074 free (filter
->aslist
[direct
].name
);
4075 filter
->aslist
[direct
].name
= NULL
;
4076 filter
->aslist
[direct
].aslist
= NULL
;
4083 peer_aslist_update (void)
4088 struct listnode
*mnode
, *mnnode
;
4089 struct listnode
*node
, *nnode
;
4092 struct peer_group
*group
;
4093 struct bgp_filter
*filter
;
4095 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4097 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4099 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4100 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4102 filter
= &peer
->filter
[afi
][safi
];
4104 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4106 if (filter
->aslist
[direct
].name
)
4107 filter
->aslist
[direct
].aslist
=
4108 as_list_lookup (filter
->aslist
[direct
].name
);
4110 filter
->aslist
[direct
].aslist
= NULL
;
4114 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4116 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4117 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4119 filter
= &group
->conf
->filter
[afi
][safi
];
4121 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4123 if (filter
->aslist
[direct
].name
)
4124 filter
->aslist
[direct
].aslist
=
4125 as_list_lookup (filter
->aslist
[direct
].name
);
4127 filter
->aslist
[direct
].aslist
= NULL
;
4134 /* Set route-map to the peer. */
4136 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4139 struct bgp_filter
*filter
;
4140 struct peer_group
*group
;
4141 struct listnode
*node
, *nnode
;
4143 if (! peer
->afc
[afi
][safi
])
4144 return BGP_ERR_PEER_INACTIVE
;
4146 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4147 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4148 return BGP_ERR_INVALID_VALUE
;
4150 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4151 && peer_is_group_member (peer
, afi
, safi
))
4152 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4154 filter
= &peer
->filter
[afi
][safi
];
4156 if (filter
->map
[direct
].name
)
4157 free (filter
->map
[direct
].name
);
4159 filter
->map
[direct
].name
= strdup (name
);
4160 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4162 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4165 group
= peer
->group
;
4166 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4168 filter
= &peer
->filter
[afi
][safi
];
4170 if (! peer
->af_group
[afi
][safi
])
4173 if (filter
->map
[direct
].name
)
4174 free (filter
->map
[direct
].name
);
4175 filter
->map
[direct
].name
= strdup (name
);
4176 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4181 /* Unset route-map from the peer. */
4183 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4185 struct bgp_filter
*filter
;
4186 struct bgp_filter
*gfilter
;
4187 struct peer_group
*group
;
4188 struct listnode
*node
, *nnode
;
4190 if (! peer
->afc
[afi
][safi
])
4191 return BGP_ERR_PEER_INACTIVE
;
4193 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4194 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4195 return BGP_ERR_INVALID_VALUE
;
4197 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4198 && peer_is_group_member (peer
, afi
, safi
))
4199 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4201 filter
= &peer
->filter
[afi
][safi
];
4203 /* apply peer-group filter */
4204 if (peer
->af_group
[afi
][safi
])
4206 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4208 if (gfilter
->map
[direct
].name
)
4210 if (filter
->map
[direct
].name
)
4211 free (filter
->map
[direct
].name
);
4212 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
4213 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
4218 if (filter
->map
[direct
].name
)
4219 free (filter
->map
[direct
].name
);
4220 filter
->map
[direct
].name
= NULL
;
4221 filter
->map
[direct
].map
= NULL
;
4223 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4226 group
= peer
->group
;
4227 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4229 filter
= &peer
->filter
[afi
][safi
];
4231 if (! peer
->af_group
[afi
][safi
])
4234 if (filter
->map
[direct
].name
)
4235 free (filter
->map
[direct
].name
);
4236 filter
->map
[direct
].name
= NULL
;
4237 filter
->map
[direct
].map
= NULL
;
4242 /* Set unsuppress-map to the peer. */
4244 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4247 struct bgp_filter
*filter
;
4248 struct peer_group
*group
;
4249 struct listnode
*node
, *nnode
;
4251 if (! peer
->afc
[afi
][safi
])
4252 return BGP_ERR_PEER_INACTIVE
;
4254 if (peer_is_group_member (peer
, afi
, safi
))
4255 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4257 filter
= &peer
->filter
[afi
][safi
];
4259 if (filter
->usmap
.name
)
4260 free (filter
->usmap
.name
);
4262 filter
->usmap
.name
= strdup (name
);
4263 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4265 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4268 group
= peer
->group
;
4269 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4271 filter
= &peer
->filter
[afi
][safi
];
4273 if (! peer
->af_group
[afi
][safi
])
4276 if (filter
->usmap
.name
)
4277 free (filter
->usmap
.name
);
4278 filter
->usmap
.name
= strdup (name
);
4279 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4284 /* Unset route-map from the peer. */
4286 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4288 struct bgp_filter
*filter
;
4289 struct peer_group
*group
;
4290 struct listnode
*node
, *nnode
;
4292 if (! peer
->afc
[afi
][safi
])
4293 return BGP_ERR_PEER_INACTIVE
;
4295 if (peer_is_group_member (peer
, afi
, safi
))
4296 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4298 filter
= &peer
->filter
[afi
][safi
];
4300 if (filter
->usmap
.name
)
4301 free (filter
->usmap
.name
);
4302 filter
->usmap
.name
= NULL
;
4303 filter
->usmap
.map
= NULL
;
4305 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4308 group
= peer
->group
;
4309 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4311 filter
= &peer
->filter
[afi
][safi
];
4313 if (! peer
->af_group
[afi
][safi
])
4316 if (filter
->usmap
.name
)
4317 free (filter
->usmap
.name
);
4318 filter
->usmap
.name
= NULL
;
4319 filter
->usmap
.map
= NULL
;
4325 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4326 u_int32_t max
, u_char threshold
,
4327 int warning
, u_int16_t restart
)
4329 struct peer_group
*group
;
4330 struct listnode
*node
, *nnode
;
4332 if (! peer
->afc
[afi
][safi
])
4333 return BGP_ERR_PEER_INACTIVE
;
4335 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4336 peer
->pmax
[afi
][safi
] = max
;
4337 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4338 peer
->pmax_restart
[afi
][safi
] = restart
;
4340 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4342 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4344 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4347 group
= peer
->group
;
4348 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4350 if (! peer
->af_group
[afi
][safi
])
4353 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4354 peer
->pmax
[afi
][safi
] = max
;
4355 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4356 peer
->pmax_restart
[afi
][safi
] = restart
;
4358 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4360 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4366 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4368 struct peer_group
*group
;
4369 struct listnode
*node
, *nnode
;
4371 if (! peer
->afc
[afi
][safi
])
4372 return BGP_ERR_PEER_INACTIVE
;
4374 /* apply peer-group config */
4375 if (peer
->af_group
[afi
][safi
])
4377 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4378 PEER_FLAG_MAX_PREFIX
))
4379 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4381 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4383 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4384 PEER_FLAG_MAX_PREFIX_WARNING
))
4385 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4387 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4389 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
4390 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4391 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
4395 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4396 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4397 peer
->pmax
[afi
][safi
] = 0;
4398 peer
->pmax_threshold
[afi
][safi
] = 0;
4399 peer
->pmax_restart
[afi
][safi
] = 0;
4401 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4404 group
= peer
->group
;
4405 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4407 if (! peer
->af_group
[afi
][safi
])
4410 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4411 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4412 peer
->pmax
[afi
][safi
] = 0;
4413 peer
->pmax_threshold
[afi
][safi
] = 0;
4414 peer
->pmax_restart
[afi
][safi
] = 0;
4419 static int is_ebgp_multihop_configured (struct peer
*peer
)
4421 struct peer_group
*group
;
4422 struct listnode
*node
, *nnode
;
4425 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4427 group
= peer
->group
;
4428 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4429 (group
->conf
->ttl
!= 1))
4432 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
4434 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
4441 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4448 /* Set # of hops between us and BGP peer. */
4450 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
4452 struct peer_group
*group
;
4453 struct listnode
*node
, *nnode
;
4456 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
4458 /* We cannot configure ttl-security hops when ebgp-multihop is already
4459 set. For non peer-groups, the check is simple. For peer-groups, it's
4460 slightly messy, because we need to check both the peer-group structure
4461 and all peer-group members for any trace of ebgp-multihop configuration
4462 before actually applying the ttl-security rules. Cisco really made a
4463 mess of this configuration parameter, and OpenBGPD got it right.
4466 if (peer
->gtsm_hops
== 0)
4468 if (is_ebgp_multihop_configured (peer
))
4469 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4471 /* specify MAXTTL on outgoing packets */
4472 /* Routine handles iBGP peers correctly */
4473 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
4478 peer
->gtsm_hops
= gtsm_hops
;
4480 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4483 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, MAXTTL
+ 1 - gtsm_hops
);
4487 group
= peer
->group
;
4488 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4490 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
4492 /* Change setting of existing peer
4493 * established then change value (may break connectivity)
4494 * not established yet (teardown session and restart)
4495 * no session then do nothing (will get handled by next connection)
4497 if (peer
->status
== Established
)
4499 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
4500 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4501 MAXTTL
+ 1 - peer
->gtsm_hops
);
4503 else if (peer
->status
< Established
)
4505 if (BGP_DEBUG (events
, EVENTS
))
4506 zlog_debug ("%s Min-ttl changed", peer
->host
);
4507 BGP_EVENT_ADD (peer
, BGP_Stop
);
4516 peer_ttl_security_hops_unset (struct peer
*peer
)
4518 struct peer_group
*group
;
4519 struct listnode
*node
, *nnode
;
4522 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
4524 /* if a peer-group member, then reset to peer-group default rather than 0 */
4525 if (peer_group_active (peer
))
4526 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
4528 peer
->gtsm_hops
= 0;
4531 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4534 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4538 group
= peer
->group
;
4539 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4541 peer
->gtsm_hops
= 0;
4544 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4548 return peer_ebgp_multihop_unset (opeer
);
4552 peer_clear (struct peer
*peer
)
4554 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4556 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
4558 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4559 if (peer
->t_pmax_restart
)
4561 BGP_TIMER_OFF (peer
->t_pmax_restart
);
4562 if (BGP_DEBUG (events
, EVENTS
))
4563 zlog_debug ("%s Maximum-prefix restart timer canceled",
4566 BGP_EVENT_ADD (peer
, BGP_Start
);
4570 peer
->v_start
= BGP_INIT_START_TIMER
;
4571 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4572 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4573 BGP_NOTIFY_CEASE_ADMIN_RESET
);
4575 BGP_EVENT_ADD (peer
, BGP_Stop
);
4581 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
4582 enum bgp_clear_type stype
)
4584 if (peer
->status
!= Established
)
4587 if (! peer
->afc
[afi
][safi
])
4588 return BGP_ERR_AF_UNCONFIGURED
;
4590 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
4592 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
4594 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
4595 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
4598 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
4599 bgp_announce_route (peer
, afi
, safi
);
4601 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4603 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
4604 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
4605 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
4607 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
4610 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
4611 prefix_type
= ORF_TYPE_PREFIX
;
4613 prefix_type
= ORF_TYPE_PREFIX_OLD
;
4615 if (filter
->plist
[FILTER_IN
].plist
)
4617 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4618 bgp_route_refresh_send (peer
, afi
, safi
,
4619 prefix_type
, REFRESH_DEFER
, 1);
4620 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
4621 REFRESH_IMMEDIATE
, 0);
4625 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4626 bgp_route_refresh_send (peer
, afi
, safi
,
4627 prefix_type
, REFRESH_IMMEDIATE
, 1);
4629 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4635 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
4636 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4638 /* If neighbor has soft reconfiguration inbound flag.
4639 Use Adj-RIB-In database. */
4640 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4641 bgp_soft_reconfig_in (peer
, afi
, safi
);
4644 /* If neighbor has route refresh capability, send route refresh
4645 message to the peer. */
4646 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4647 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4648 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4650 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
4656 /* Display peer uptime.*/
4657 /* XXX: why does this function return char * when it takes buffer? */
4659 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
4664 /* Check buffer length. */
4665 if (len
< BGP_UPTIME_LEN
)
4667 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
4668 /* XXX: should return status instead of buf... */
4669 snprintf (buf
, len
, "<error> ");
4673 /* If there is no connection has been done before print `never'. */
4676 snprintf (buf
, len
, "never ");
4680 /* Get current time. */
4681 uptime1
= bgp_clock ();
4683 tm
= gmtime (&uptime1
);
4685 /* Making formatted timer strings. */
4686 #define ONE_DAY_SECOND 60*60*24
4687 #define ONE_WEEK_SECOND 60*60*24*7
4689 if (uptime1
< ONE_DAY_SECOND
)
4690 snprintf (buf
, len
, "%02d:%02d:%02d",
4691 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
4692 else if (uptime1
< ONE_WEEK_SECOND
)
4693 snprintf (buf
, len
, "%dd%02dh%02dm",
4694 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
4696 snprintf (buf
, len
, "%02dw%dd%02dh",
4697 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
4702 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
4703 afi_t afi
, safi_t safi
)
4705 struct bgp_filter
*filter
;
4706 struct bgp_filter
*gfilter
= NULL
;
4709 int out
= FILTER_OUT
;
4712 filter
= &peer
->filter
[afi
][safi
];
4713 if (peer
->af_group
[afi
][safi
])
4714 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4716 /* distribute-list. */
4717 if (filter
->dlist
[in
].name
)
4718 if (! gfilter
|| ! gfilter
->dlist
[in
].name
4719 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
4720 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
4721 filter
->dlist
[in
].name
, VTY_NEWLINE
);
4722 if (filter
->dlist
[out
].name
&& ! gfilter
)
4723 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
4724 filter
->dlist
[out
].name
, VTY_NEWLINE
);
4727 if (filter
->plist
[in
].name
)
4728 if (! gfilter
|| ! gfilter
->plist
[in
].name
4729 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
4730 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
4731 filter
->plist
[in
].name
, VTY_NEWLINE
);
4732 if (filter
->plist
[out
].name
&& ! gfilter
)
4733 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
4734 filter
->plist
[out
].name
, VTY_NEWLINE
);
4737 if (filter
->map
[RMAP_IN
].name
)
4738 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
4739 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
4740 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
4741 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
4742 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
4743 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
4744 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
4745 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
4746 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
4747 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
4748 if (filter
->map
[RMAP_EXPORT
].name
)
4749 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
4750 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
4751 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
4752 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
4753 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
4755 /* unsuppress-map */
4756 if (filter
->usmap
.name
&& ! gfilter
)
4757 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
4758 filter
->usmap
.name
, VTY_NEWLINE
);
4761 if (filter
->aslist
[in
].name
)
4762 if (! gfilter
|| ! gfilter
->aslist
[in
].name
4763 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
4764 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
4765 filter
->aslist
[in
].name
, VTY_NEWLINE
);
4766 if (filter
->aslist
[out
].name
&& ! gfilter
)
4767 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
4768 filter
->aslist
[out
].name
, VTY_NEWLINE
);
4771 /* BGP peer configuration display function. */
4773 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
4774 struct peer
*peer
, afi_t afi
, safi_t safi
)
4776 struct peer
*g_peer
= NULL
;
4777 char buf
[SU_ADDRSTRLEN
];
4781 if (peer_group_active (peer
))
4782 g_peer
= peer
->group
->conf
;
4784 /************************************
4785 ****** Global to the neighbor ******
4786 ************************************/
4787 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4790 if (! peer_group_active (peer
))
4792 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4793 vty_out (vty
, " neighbor %s peer-group%s", addr
,
4796 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4802 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4804 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4805 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4806 peer
->group
->name
, VTY_NEWLINE
);
4810 if (peer
->change_local_as
)
4811 if (! peer_group_active (peer
))
4812 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
4813 peer
->change_local_as
,
4814 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
4816 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
4817 " replace-as" : "", VTY_NEWLINE
);
4821 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
4825 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4826 if (! peer_group_active (peer
) ||
4827 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
4828 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
4832 if (!peer_group_active (peer
)
4833 || ! g_peer
->password
4834 || strcmp (peer
->password
, g_peer
->password
) != 0)
4835 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
4839 if (peer
->port
!= BGP_PORT_DEFAULT
)
4840 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
4843 /* Local interface name. */
4845 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
4849 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
4850 if (! peer_group_active (peer
) ||
4851 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
4852 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
4854 /* EBGP multihop. */
4855 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
4856 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
4857 if (! peer_group_active (peer
) ||
4858 g_peer
->ttl
!= peer
->ttl
)
4859 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
4862 /* ttl-security hops */
4863 if (peer
->gtsm_hops
!= 0)
4864 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
4865 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
4866 peer
->gtsm_hops
, VTY_NEWLINE
);
4868 /* disable-connected-check. */
4869 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4870 if (! peer_group_active (peer
) ||
4871 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4872 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
4874 /* Update-source. */
4875 if (peer
->update_if
)
4876 if (! peer_group_active (peer
) || ! g_peer
->update_if
4877 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
4878 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4879 peer
->update_if
, VTY_NEWLINE
);
4880 if (peer
->update_source
)
4881 if (! peer_group_active (peer
) || ! g_peer
->update_source
4882 || sockunion_cmp (g_peer
->update_source
,
4883 peer
->update_source
) != 0)
4884 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4885 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
4888 /* advertisement-interval */
4889 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
4890 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
4891 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
4894 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
4895 && ! peer_group_active (peer
))
4896 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
4897 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
4899 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
))
4900 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
4901 peer
->connect
, VTY_NEWLINE
);
4903 /* Default weight. */
4904 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
4905 if (! peer_group_active (peer
) ||
4906 g_peer
->weight
!= peer
->weight
)
4907 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
4910 /* Dynamic capability. */
4911 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4912 if (! peer_group_active (peer
) ||
4913 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4914 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
4917 /* dont capability negotiation. */
4918 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4919 if (! peer_group_active (peer
) ||
4920 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4921 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
4924 /* override capability negotiation. */
4925 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4926 if (! peer_group_active (peer
) ||
4927 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4928 vty_out (vty
, " neighbor %s override-capability%s", addr
,
4931 /* strict capability negotiation. */
4932 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4933 if (! peer_group_active (peer
) ||
4934 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4935 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
4938 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4940 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4942 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4943 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4947 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4948 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
4954 /************************************
4955 ****** Per AF to the neighbor ******
4956 ************************************/
4958 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
4960 if (peer
->af_group
[afi
][safi
])
4961 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4962 peer
->group
->name
, VTY_NEWLINE
);
4964 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4967 /* ORF capability. */
4968 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4969 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4970 if (! peer
->af_group
[afi
][safi
])
4972 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
4974 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4975 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4976 vty_out (vty
, " both");
4977 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
4978 vty_out (vty
, " send");
4980 vty_out (vty
, " receive");
4981 vty_out (vty
, "%s", VTY_NEWLINE
);
4984 /* Route reflector client. */
4985 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
4986 && ! peer
->af_group
[afi
][safi
])
4987 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
4991 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
4992 && ! peer
->af_group
[afi
][safi
])
4993 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
4995 /* Remove private AS. */
4996 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
4997 && ! peer
->af_group
[afi
][safi
])
4998 vty_out (vty
, " neighbor %s remove-private-AS%s",
5001 /* send-community print. */
5002 if (! peer
->af_group
[afi
][safi
])
5004 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5006 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5007 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5008 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
5009 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5010 vty_out (vty
, " neighbor %s send-community extended%s",
5012 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5013 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
5017 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5018 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5019 vty_out (vty
, " no neighbor %s send-community both%s",
5021 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5022 vty_out (vty
, " no neighbor %s send-community extended%s",
5024 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5025 vty_out (vty
, " no neighbor %s send-community%s",
5030 /* Default information */
5031 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
5032 && ! peer
->af_group
[afi
][safi
])
5034 vty_out (vty
, " neighbor %s default-originate", addr
);
5035 if (peer
->default_rmap
[afi
][safi
].name
)
5036 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
5037 vty_out (vty
, "%s", VTY_NEWLINE
);
5040 /* Soft reconfiguration inbound. */
5041 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5042 if (! peer
->af_group
[afi
][safi
] ||
5043 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5044 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
5047 /* maximum-prefix. */
5048 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
5049 if (! peer
->af_group
[afi
][safi
]
5050 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
5051 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
5052 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
5053 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5055 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
5056 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
5057 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
5058 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5059 vty_out (vty
, " warning-only");
5060 if (peer
->pmax_restart
[afi
][safi
])
5061 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
5062 vty_out (vty
, "%s", VTY_NEWLINE
);
5065 /* Route server client. */
5066 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
5067 && ! peer
->af_group
[afi
][safi
])
5068 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
5070 /* Nexthop-local unchanged. */
5071 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
5072 && ! peer
->af_group
[afi
][safi
])
5073 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
5076 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
5077 if (! peer_group_active (peer
)
5078 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
5079 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
5081 if (peer
->allowas_in
[afi
][safi
] == 3)
5082 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
5084 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
5085 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
5089 bgp_config_write_filter (vty
, peer
, afi
, safi
);
5091 /* atribute-unchanged. */
5092 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5093 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5094 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5095 && ! peer
->af_group
[afi
][safi
])
5097 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5098 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5099 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5100 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
5102 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
5103 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
5105 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
5107 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
5108 " med" : "", VTY_NEWLINE
);
5112 /* Display "address-family" configuration header. */
5114 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
5120 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5123 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
5127 if (safi
== SAFI_MULTICAST
)
5128 vty_out (vty
, "ipv4 multicast");
5129 else if (safi
== SAFI_MPLS_VPN
)
5130 vty_out (vty
, "vpnv4 unicast");
5132 else if (afi
== AFI_IP6
)
5134 vty_out (vty
, "ipv6");
5136 if (safi
== SAFI_MULTICAST
)
5137 vty_out (vty
, " multicast");
5140 vty_out (vty
, "%s", VTY_NEWLINE
);
5145 /* Address family based peer configuration display. */
5147 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
5152 struct peer_group
*group
;
5153 struct listnode
*node
, *nnode
;
5155 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
5157 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
5159 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5161 if (group
->conf
->afc
[afi
][safi
])
5163 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5164 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
5167 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5169 if (peer
->afc
[afi
][safi
])
5171 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5173 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5174 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
5179 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
5182 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
5188 bgp_config_write (struct vty
*vty
)
5192 struct peer_group
*group
;
5194 struct listnode
*node
, *nnode
;
5195 struct listnode
*mnode
, *mnnode
;
5197 /* BGP Multiple instance. */
5198 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5200 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
5204 /* BGP Config type. */
5205 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5207 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
5211 /* BGP configuration. */
5212 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5215 vty_out (vty
, "!%s", VTY_NEWLINE
);
5217 /* Router bgp ASN */
5218 vty_out (vty
, "router bgp %u", bgp
->as
);
5220 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5223 vty_out (vty
, " view %s", bgp
->name
);
5225 vty_out (vty
, "%s", VTY_NEWLINE
);
5227 /* No Synchronization */
5228 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5229 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
5231 /* BGP fast-external-failover. */
5232 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
5233 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
5235 /* BGP router ID. */
5236 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
5237 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
5240 /* BGP log-neighbor-changes. */
5241 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
5242 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
5244 /* BGP configuration. */
5245 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
5246 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
5248 /* BGP default ipv4-unicast. */
5249 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5250 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
5252 /* BGP default local-preference. */
5253 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
5254 vty_out (vty
, " bgp default local-preference %d%s",
5255 bgp
->default_local_pref
, VTY_NEWLINE
);
5257 /* BGP client-to-client reflection. */
5258 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
5259 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
5261 /* BGP cluster ID. */
5262 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
5263 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
5266 /* Confederation identifier*/
5267 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
5268 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
5271 /* Confederation peer */
5272 if (bgp
->confed_peers_cnt
> 0)
5276 vty_out (vty
, " bgp confederation peers");
5278 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
5279 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
5281 vty_out (vty
, "%s", VTY_NEWLINE
);
5284 /* BGP enforce-first-as. */
5285 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
5286 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
5288 /* BGP deterministic-med. */
5289 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
5290 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
5292 /* BGP graceful-restart. */
5293 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
5294 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
5295 bgp
->stalepath_time
, VTY_NEWLINE
);
5296 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
5297 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
5299 /* BGP bestpath method. */
5300 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
5301 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
5302 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
5303 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
5304 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
5305 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
5307 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
5308 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
5309 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
5310 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5312 vty_out (vty
, " bgp bestpath med");
5313 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
5314 vty_out (vty
, " confed");
5315 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5316 vty_out (vty
, " missing-as-worst");
5317 vty_out (vty
, "%s", VTY_NEWLINE
);
5320 /* BGP network import check. */
5321 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
5322 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
5324 /* BGP scan interval. */
5325 bgp_config_write_scan_time (vty
);
5327 /* BGP flag dampening. */
5328 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
5329 BGP_CONFIG_DAMPENING
))
5330 bgp_config_write_damp (vty
);
5332 /* BGP static route configuration. */
5333 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5335 /* BGP redistribute configuration. */
5336 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5338 /* BGP timers configuration. */
5339 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
5340 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
5341 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
5342 bgp
->default_holdtime
, VTY_NEWLINE
);
5345 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5347 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
5350 /* Normal neighbor configuration. */
5351 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5353 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5354 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
5358 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5360 /* Distance configuration. */
5361 bgp_config_write_distance (vty
, bgp
);
5363 /* No auto-summary */
5364 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5365 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
5367 /* IPv4 multicast configuration. */
5368 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
5370 /* IPv4 VPN configuration. */
5371 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
5373 /* IPv6 unicast configuration. */
5374 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
5376 /* IPv6 multicast configuration. */
5377 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
5385 bgp_master_init (void)
5387 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
5390 bm
->bgp
= list_new ();
5391 bm
->listen_sockets
= list_new ();
5392 bm
->port
= BGP_PORT_DEFAULT
;
5393 bm
->master
= thread_master_create ();
5394 bm
->start_time
= bgp_clock ();
5401 /* BGP VTY commands installation. */
5412 bgp_route_map_init ();
5413 bgp_address_init ();
5415 bgp_mplsvpn_init ();
5417 /* Access list initialize. */
5418 access_list_init ();
5419 access_list_add_hook (peer_distribute_update
);
5420 access_list_delete_hook (peer_distribute_update
);
5422 /* Filter list initialize. */
5424 as_list_add_hook (peer_aslist_update
);
5425 as_list_delete_hook (peer_aslist_update
);
5427 /* Prefix list initialize.*/
5428 prefix_list_init ();
5429 prefix_list_add_hook (peer_prefix_list_update
);
5430 prefix_list_delete_hook (peer_prefix_list_update
);
5432 /* Community list initialize. */
5433 bgp_clist
= community_list_init ();
5437 #endif /* HAVE_SNMP */
5441 bgp_terminate (void)
5445 struct listnode
*node
, *nnode
;
5446 struct listnode
*mnode
, *mnnode
;
5448 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5449 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5450 if (peer
->status
== Established
)
5451 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5452 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
5454 bgp_cleanup_routes ();
5456 if (bm
->process_main_queue
)
5458 work_queue_free (bm
->process_main_queue
);
5459 bm
->process_main_queue
= NULL
;
5461 if (bm
->process_rsclient_queue
)
5463 work_queue_free (bm
->process_rsclient_queue
);
5464 bm
->process_rsclient_queue
= NULL
;