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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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
);
836 bgp_sync_init (peer
);
838 /* Get service port number. */
839 sp
= getservbyname ("bgp", "tcp");
840 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
845 /* Create new BGP peer. */
847 peer_create (union sockunion
*su
, struct bgp
*bgp
, as_t local_as
,
848 as_t remote_as
, afi_t afi
, safi_t safi
)
852 char buf
[SU_ADDRSTRLEN
];
854 peer
= peer_new (bgp
);
856 peer
->local_as
= local_as
;
857 peer
->as
= remote_as
;
858 peer
->local_id
= bgp
->router_id
;
859 peer
->v_holdtime
= bgp
->default_holdtime
;
860 peer
->v_keepalive
= bgp
->default_keepalive
;
861 if (peer_sort (peer
) == BGP_PEER_IBGP
)
862 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
864 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
866 peer
= peer_lock (peer
); /* bgp peer list reference */
867 listnode_add_sort (bgp
->peer
, peer
);
869 active
= peer_active (peer
);
872 peer
->afc
[afi
][safi
] = 1;
874 /* Last read and reset time set */
875 peer
->readtime
= peer
->resettime
= bgp_clock ();
877 /* Default TTL set. */
878 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
880 /* Make peer's address string. */
881 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
882 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
884 /* Set up peer's events and timers. */
885 if (! active
&& peer_active (peer
))
886 bgp_timer_set (peer
);
891 /* Make accept BGP peer. Called from bgp_accept (). */
893 peer_create_accept (struct bgp
*bgp
)
897 peer
= peer_new (bgp
);
899 peer
= peer_lock (peer
); /* bgp peer list reference */
900 listnode_add_sort (bgp
->peer
, peer
);
905 /* Change peer's AS number. */
907 peer_as_change (struct peer
*peer
, as_t as
)
909 bgp_peer_sort_t type
;
912 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
914 if (peer
->status
== Established
)
916 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
917 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
918 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
921 BGP_EVENT_ADD (peer
, BGP_Stop
);
923 type
= peer_sort (peer
);
926 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
927 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
928 && peer
->bgp
->as
!= as
)
929 peer
->local_as
= peer
->bgp
->confed_id
;
931 peer
->local_as
= peer
->bgp
->as
;
933 /* Advertisement-interval reset */
934 if (peer_sort (peer
) == BGP_PEER_IBGP
)
935 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
937 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
940 if (peer_sort (peer
) == BGP_PEER_IBGP
)
942 else if (type
== BGP_PEER_IBGP
)
945 /* reflector-client reset */
946 if (peer_sort (peer
) != BGP_PEER_IBGP
)
948 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
949 PEER_FLAG_REFLECTOR_CLIENT
);
950 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
951 PEER_FLAG_REFLECTOR_CLIENT
);
952 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
953 PEER_FLAG_REFLECTOR_CLIENT
);
954 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
955 PEER_FLAG_REFLECTOR_CLIENT
);
956 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
957 PEER_FLAG_REFLECTOR_CLIENT
);
961 if (peer_sort (peer
) != BGP_PEER_EBGP
)
963 peer
->change_local_as
= 0;
964 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
968 /* If peer does not exist, create new one. If peer already exists,
969 set AS number to the peer. */
971 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, as_t
*as
,
972 afi_t afi
, safi_t safi
)
977 peer
= peer_lookup (bgp
, su
);
981 /* When this peer is a member of peer-group. */
984 if (peer
->group
->conf
->as
)
986 /* Return peer group's AS number. */
987 *as
= peer
->group
->conf
->as
;
988 return BGP_ERR_PEER_GROUP_MEMBER
;
990 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
995 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1003 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1008 /* Existing peer's AS number change. */
1009 if (peer
->as
!= *as
)
1010 peer_as_change (peer
, *as
);
1015 /* If the peer is not part of our confederation, and its not an
1016 iBGP peer then spoof the source AS */
1017 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1018 && ! bgp_confederation_peers_check (bgp
, *as
)
1020 local_as
= bgp
->confed_id
;
1024 /* If this is IPv4 unicast configuration and "no bgp default
1025 ipv4-unicast" is specified. */
1027 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1028 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1029 peer
= peer_create (su
, bgp
, local_as
, *as
, 0, 0);
1031 peer
= peer_create (su
, bgp
, local_as
, *as
, afi
, safi
);
1037 /* Activate the peer or peer group for specified AFI and SAFI. */
1039 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1043 if (peer
->afc
[afi
][safi
])
1046 /* Activate the address family configuration. */
1047 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1048 peer
->afc
[afi
][safi
] = 1;
1051 active
= peer_active (peer
);
1053 peer
->afc
[afi
][safi
] = 1;
1055 if (! active
&& peer_active (peer
))
1056 bgp_timer_set (peer
);
1059 if (peer
->status
== Established
)
1061 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1063 peer
->afc_adv
[afi
][safi
] = 1;
1064 bgp_capability_send (peer
, afi
, safi
,
1066 CAPABILITY_ACTION_SET
);
1067 if (peer
->afc_recv
[afi
][safi
])
1069 peer
->afc_nego
[afi
][safi
] = 1;
1070 bgp_announce_route (peer
, afi
, safi
);
1075 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1076 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1077 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1086 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1088 struct peer_group
*group
;
1090 struct listnode
*node
, *nnode
;
1092 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1094 group
= peer
->group
;
1096 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1098 if (peer1
->af_group
[afi
][safi
])
1099 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1104 if (peer
->af_group
[afi
][safi
])
1105 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1108 if (! peer
->afc
[afi
][safi
])
1111 /* De-activate the address family configuration. */
1112 peer
->afc
[afi
][safi
] = 0;
1113 peer_af_flag_reset (peer
, afi
, safi
);
1115 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1117 if (peer
->status
== Established
)
1119 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1121 peer
->afc_adv
[afi
][safi
] = 0;
1122 peer
->afc_nego
[afi
][safi
] = 0;
1124 if (peer_active_nego (peer
))
1126 bgp_capability_send (peer
, afi
, safi
,
1128 CAPABILITY_ACTION_UNSET
);
1129 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1130 peer
->pcount
[afi
][safi
] = 0;
1134 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1135 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1136 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1141 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1142 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1143 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1151 peer_nsf_stop (struct peer
*peer
)
1156 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1157 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1159 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1160 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1161 peer
->nsf
[afi
][safi
] = 0;
1163 if (peer
->t_gr_restart
)
1165 BGP_TIMER_OFF (peer
->t_gr_restart
);
1166 if (BGP_DEBUG (events
, EVENTS
))
1167 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1169 if (peer
->t_gr_stale
)
1171 BGP_TIMER_OFF (peer
->t_gr_stale
);
1172 if (BGP_DEBUG (events
, EVENTS
))
1173 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1175 bgp_clear_route_all (peer
);
1178 /* Delete peer from confguration.
1180 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1181 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1183 * This function /should/ take care to be idempotent, to guard against
1184 * it being called multiple times through stray events that come in
1185 * that happen to result in this function being called again. That
1186 * said, getting here for a "Deleted" peer is a bug in the neighbour
1190 peer_delete (struct peer
*peer
)
1196 struct bgp_filter
*filter
;
1197 struct listnode
*pn
;
1199 assert (peer
->status
!= Deleted
);
1203 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1204 peer_nsf_stop (peer
);
1206 /* If this peer belongs to peer group, clear up the
1210 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1212 peer
= peer_unlock (peer
); /* group->peer list reference */
1213 list_delete_node (peer
->group
->peer
, pn
);
1218 /* Withdraw all information from routing table. We can not use
1219 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1220 * executed after peer structure is deleted.
1222 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1224 bgp_fsm_change_status (peer
, Deleted
);
1226 /* Password configuration */
1229 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1230 peer
->password
= NULL
;
1232 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1236 bgp_timer_set (peer
); /* stops all timers for Deleted */
1238 /* Delete from all peer list. */
1239 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1240 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1242 peer_unlock (peer
); /* bgp peer list reference */
1243 list_delete_node (bgp
->peer
, pn
);
1246 if (peer_rsclient_active (peer
)
1247 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1249 peer_unlock (peer
); /* rsclient list reference */
1250 list_delete_node (bgp
->rsclient
, pn
);
1252 /* Clear our own rsclient ribs. */
1253 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1254 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1255 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1256 PEER_FLAG_RSERVER_CLIENT
))
1257 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1260 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1261 member of a peer_group. */
1262 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1263 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1264 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1265 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1269 stream_free (peer
->ibuf
);
1271 stream_fifo_free (peer
->obuf
);
1273 stream_free (peer
->work
);
1275 peer
->work
= peer
->ibuf
= NULL
;
1277 /* Local and remote addresses. */
1279 sockunion_free (peer
->su_local
);
1280 if (peer
->su_remote
)
1281 sockunion_free (peer
->su_remote
);
1282 peer
->su_local
= peer
->su_remote
= NULL
;
1284 /* Free filter related memory. */
1285 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1286 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1288 filter
= &peer
->filter
[afi
][safi
];
1290 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1292 if (filter
->dlist
[i
].name
)
1293 free (filter
->dlist
[i
].name
);
1294 if (filter
->plist
[i
].name
)
1295 free (filter
->plist
[i
].name
);
1296 if (filter
->aslist
[i
].name
)
1297 free (filter
->aslist
[i
].name
);
1299 filter
->dlist
[i
].name
= NULL
;
1300 filter
->plist
[i
].name
= NULL
;
1301 filter
->aslist
[i
].name
= NULL
;
1303 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1305 if (filter
->map
[i
].name
)
1306 free (filter
->map
[i
].name
);
1307 filter
->map
[i
].name
= NULL
;
1310 if (filter
->usmap
.name
)
1311 free (filter
->usmap
.name
);
1313 if (peer
->default_rmap
[afi
][safi
].name
)
1314 free (peer
->default_rmap
[afi
][safi
].name
);
1316 filter
->usmap
.name
= NULL
;
1317 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1320 peer_unlock (peer
); /* initial reference */
1326 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1328 return strcmp (g1
->name
, g2
->name
);
1331 /* If peer is configured at least one address family return 1. */
1333 peer_group_active (struct peer
*peer
)
1335 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1336 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1337 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1338 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1339 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1344 /* Peer group cofiguration. */
1345 static struct peer_group
*
1346 peer_group_new (void)
1348 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1349 sizeof (struct peer_group
));
1353 peer_group_free (struct peer_group
*group
)
1355 XFREE (MTYPE_PEER_GROUP
, group
);
1359 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1361 struct peer_group
*group
;
1362 struct listnode
*node
, *nnode
;
1364 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1366 if (strcmp (group
->name
, name
) == 0)
1373 peer_group_get (struct bgp
*bgp
, const char *name
)
1375 struct peer_group
*group
;
1377 group
= peer_group_lookup (bgp
, name
);
1381 group
= peer_group_new ();
1383 group
->name
= strdup (name
);
1384 group
->peer
= list_new ();
1385 group
->conf
= peer_new (bgp
);
1386 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1387 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1388 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1389 group
->conf
->group
= group
;
1390 group
->conf
->as
= 0;
1391 group
->conf
->ttl
= 1;
1392 group
->conf
->gtsm_hops
= 0;
1393 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1394 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1395 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1396 group
->conf
->keepalive
= 0;
1397 group
->conf
->holdtime
= 0;
1398 group
->conf
->connect
= 0;
1399 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1400 listnode_add_sort (bgp
->group
, group
);
1406 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1407 afi_t afi
, safi_t safi
)
1410 int out
= FILTER_OUT
;
1412 struct bgp_filter
*pfilter
;
1413 struct bgp_filter
*gfilter
;
1416 pfilter
= &peer
->filter
[afi
][safi
];
1417 gfilter
= &conf
->filter
[afi
][safi
];
1421 peer
->as
= conf
->as
;
1424 if (conf
->change_local_as
)
1425 peer
->change_local_as
= conf
->change_local_as
;
1428 peer
->ttl
= conf
->ttl
;
1431 peer
->gtsm_hops
= conf
->gtsm_hops
;
1434 peer
->weight
= conf
->weight
;
1436 /* peer flags apply */
1437 peer
->flags
= conf
->flags
;
1438 /* peer af_flags apply */
1439 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1440 /* peer config apply */
1441 peer
->config
= conf
->config
;
1443 /* peer timers apply */
1444 peer
->holdtime
= conf
->holdtime
;
1445 peer
->keepalive
= conf
->keepalive
;
1446 peer
->connect
= conf
->connect
;
1447 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1448 peer
->v_connect
= conf
->connect
;
1450 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1452 /* advertisement-interval reset */
1453 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1454 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1456 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1458 /* password apply */
1460 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1463 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1465 peer
->password
= NULL
;
1469 /* maximum-prefix */
1470 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1471 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1472 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1475 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1477 /* route-server-client */
1478 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1480 /* Make peer's RIB point to group's RIB. */
1481 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1483 /* Import policy. */
1484 if (pfilter
->map
[RMAP_IMPORT
].name
)
1485 free (pfilter
->map
[RMAP_IMPORT
].name
);
1486 if (gfilter
->map
[RMAP_IMPORT
].name
)
1488 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1489 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1493 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1494 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1497 /* Export policy. */
1498 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1500 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1501 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1505 /* default-originate route-map */
1506 if (conf
->default_rmap
[afi
][safi
].name
)
1508 if (peer
->default_rmap
[afi
][safi
].name
)
1509 free (peer
->default_rmap
[afi
][safi
].name
);
1510 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1511 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1514 /* update-source apply */
1515 if (conf
->update_source
)
1517 if (peer
->update_source
)
1518 sockunion_free (peer
->update_source
);
1519 if (peer
->update_if
)
1521 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1522 peer
->update_if
= NULL
;
1524 peer
->update_source
= sockunion_dup (conf
->update_source
);
1526 else if (conf
->update_if
)
1528 if (peer
->update_if
)
1529 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1530 if (peer
->update_source
)
1532 sockunion_free (peer
->update_source
);
1533 peer
->update_source
= NULL
;
1535 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1538 /* inbound filter apply */
1539 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1541 if (pfilter
->dlist
[in
].name
)
1542 free (pfilter
->dlist
[in
].name
);
1543 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1544 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1546 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1548 if (pfilter
->plist
[in
].name
)
1549 free (pfilter
->plist
[in
].name
);
1550 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1551 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1553 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1555 if (pfilter
->aslist
[in
].name
)
1556 free (pfilter
->aslist
[in
].name
);
1557 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1558 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1560 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1562 if (pfilter
->map
[RMAP_IN
].name
)
1563 free (pfilter
->map
[RMAP_IN
].name
);
1564 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
1565 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
1568 /* outbound filter apply */
1569 if (gfilter
->dlist
[out
].name
)
1571 if (pfilter
->dlist
[out
].name
)
1572 free (pfilter
->dlist
[out
].name
);
1573 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1574 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1578 if (pfilter
->dlist
[out
].name
)
1579 free (pfilter
->dlist
[out
].name
);
1580 pfilter
->dlist
[out
].name
= NULL
;
1581 pfilter
->dlist
[out
].alist
= NULL
;
1583 if (gfilter
->plist
[out
].name
)
1585 if (pfilter
->plist
[out
].name
)
1586 free (pfilter
->plist
[out
].name
);
1587 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1588 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1592 if (pfilter
->plist
[out
].name
)
1593 free (pfilter
->plist
[out
].name
);
1594 pfilter
->plist
[out
].name
= NULL
;
1595 pfilter
->plist
[out
].plist
= NULL
;
1597 if (gfilter
->aslist
[out
].name
)
1599 if (pfilter
->aslist
[out
].name
)
1600 free (pfilter
->aslist
[out
].name
);
1601 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1602 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1606 if (pfilter
->aslist
[out
].name
)
1607 free (pfilter
->aslist
[out
].name
);
1608 pfilter
->aslist
[out
].name
= NULL
;
1609 pfilter
->aslist
[out
].aslist
= NULL
;
1611 if (gfilter
->map
[RMAP_OUT
].name
)
1613 if (pfilter
->map
[RMAP_OUT
].name
)
1614 free (pfilter
->map
[RMAP_OUT
].name
);
1615 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
1616 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
1620 if (pfilter
->map
[RMAP_OUT
].name
)
1621 free (pfilter
->map
[RMAP_OUT
].name
);
1622 pfilter
->map
[RMAP_OUT
].name
= NULL
;
1623 pfilter
->map
[RMAP_OUT
].map
= NULL
;
1626 /* RS-client's import/export route-maps. */
1627 if (gfilter
->map
[RMAP_IMPORT
].name
)
1629 if (pfilter
->map
[RMAP_IMPORT
].name
)
1630 free (pfilter
->map
[RMAP_IMPORT
].name
);
1631 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1632 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1636 if (pfilter
->map
[RMAP_IMPORT
].name
)
1637 free (pfilter
->map
[RMAP_IMPORT
].name
);
1638 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1639 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1641 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1643 if (pfilter
->map
[RMAP_EXPORT
].name
)
1644 free (pfilter
->map
[RMAP_EXPORT
].name
);
1645 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1646 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1649 if (gfilter
->usmap
.name
)
1651 if (pfilter
->usmap
.name
)
1652 free (pfilter
->usmap
.name
);
1653 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1654 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1658 if (pfilter
->usmap
.name
)
1659 free (pfilter
->usmap
.name
);
1660 pfilter
->usmap
.name
= NULL
;
1661 pfilter
->usmap
.map
= NULL
;
1665 /* Peer group's remote AS configuration. */
1667 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
, as_t
*as
)
1669 struct peer_group
*group
;
1671 struct listnode
*node
, *nnode
;
1673 group
= peer_group_lookup (bgp
, group_name
);
1677 if (group
->conf
->as
== *as
)
1680 /* When we setup peer-group AS number all peer group member's AS
1681 number must be updated to same number. */
1682 peer_as_change (group
->conf
, *as
);
1684 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1686 if (peer
->as
!= *as
)
1687 peer_as_change (peer
, *as
);
1694 peer_group_delete (struct peer_group
*group
)
1698 struct listnode
*node
, *nnode
;
1702 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1707 list_delete (group
->peer
);
1712 group
->conf
->group
= NULL
;
1713 peer_delete (group
->conf
);
1715 /* Delete from all peer_group list. */
1716 listnode_delete (bgp
->group
, group
);
1718 peer_group_free (group
);
1724 peer_group_remote_as_delete (struct peer_group
*group
)
1727 struct listnode
*node
, *nnode
;
1729 if (! group
->conf
->as
)
1732 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1737 list_delete_all_node (group
->peer
);
1739 group
->conf
->as
= 0;
1744 /* Bind specified peer to peer group. */
1746 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
,
1747 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1750 int first_member
= 0;
1752 /* Check peer group's address family. */
1753 if (! group
->conf
->afc
[afi
][safi
])
1754 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
1756 /* Lookup the peer. */
1757 peer
= peer_lookup (bgp
, su
);
1759 /* Create a new peer. */
1762 if (! group
->conf
->as
)
1763 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
1765 peer
= peer_create (su
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
1766 peer
->group
= group
;
1767 peer
->af_group
[afi
][safi
] = 1;
1769 peer
= peer_lock (peer
); /* group->peer list reference */
1770 listnode_add (group
->peer
, peer
);
1771 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1776 /* When the peer already belongs to peer group, check the consistency. */
1777 if (peer
->af_group
[afi
][safi
])
1779 if (strcmp (peer
->group
->name
, group
->name
) != 0)
1780 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
1785 /* Check current peer group configuration. */
1786 if (peer_group_active (peer
)
1787 && strcmp (peer
->group
->name
, group
->name
) != 0)
1788 return BGP_ERR_PEER_GROUP_MISMATCH
;
1790 if (! group
->conf
->as
)
1792 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
1793 && peer_sort (group
->conf
) != peer_sort (peer
))
1797 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1800 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
1804 peer
->af_group
[afi
][safi
] = 1;
1805 peer
->afc
[afi
][safi
] = 1;
1808 peer
->group
= group
;
1810 peer
= peer_lock (peer
); /* group->peer list reference */
1811 listnode_add (group
->peer
, peer
);
1814 assert (group
&& peer
->group
== group
);
1818 /* Advertisement-interval reset */
1819 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1820 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1822 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1824 /* ebgp-multihop reset */
1825 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1826 group
->conf
->ttl
= 255;
1828 /* local-as reset */
1829 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
1831 group
->conf
->change_local_as
= 0;
1832 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
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 (peer
->status
== Established
)
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 (peer
->status
== Established
)
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
))
2103 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2104 peer_group_delete (group
);
2106 assert (listcount (bgp
->rsclient
) == 0);
2108 if (bgp
->peer_self
) {
2109 peer_delete(bgp
->peer_self
);
2110 bgp
->peer_self
= NULL
;
2113 /* Remove visibility via the master list - there may however still be
2114 * routes to be processed still referencing the struct bgp.
2116 listnode_delete (bm
->bgp
, bgp
);
2117 if (list_isempty(bm
->bgp
))
2120 bgp_unlock(bgp
); /* initial reference */
2125 static void bgp_free (struct bgp
*);
2128 bgp_lock (struct bgp
*bgp
)
2134 bgp_unlock(struct bgp
*bgp
)
2136 assert(bgp
->lock
> 0);
2137 if (--bgp
->lock
== 0)
2142 bgp_free (struct bgp
*bgp
)
2147 list_delete (bgp
->group
);
2148 list_delete (bgp
->peer
);
2149 list_delete (bgp
->rsclient
);
2154 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2155 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2157 if (bgp
->route
[afi
][safi
])
2158 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2159 if (bgp
->aggregate
[afi
][safi
])
2160 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2161 if (bgp
->rib
[afi
][safi
])
2162 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2164 XFREE (MTYPE_BGP
, bgp
);
2168 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2171 struct listnode
*node
, *nnode
;
2175 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2176 if (sockunion_same (&peer
->su
, su
)
2177 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2180 else if (bm
->bgp
!= NULL
)
2182 struct listnode
*bgpnode
, *nbgpnode
;
2184 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2185 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2186 if (sockunion_same (&peer
->su
, su
)
2187 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2194 peer_lookup_with_open (union sockunion
*su
, as_t remote_as
,
2195 struct in_addr
*remote_id
, int *as
)
2198 struct listnode
*node
;
2199 struct listnode
*bgpnode
;
2205 for (ALL_LIST_ELEMENTS_RO (bm
->bgp
, bgpnode
, bgp
))
2207 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
2209 if (sockunion_same (&peer
->su
, su
)
2210 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2212 if (peer
->as
== remote_as
2213 && peer
->remote_id
.s_addr
== remote_id
->s_addr
)
2215 if (peer
->as
== remote_as
)
2220 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
2222 if (sockunion_same (&peer
->su
, su
)
2223 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2225 if (peer
->as
== remote_as
2226 && peer
->remote_id
.s_addr
== 0)
2228 if (peer
->as
== remote_as
)
2236 /* If peer is configured at least one address family return 1. */
2238 peer_active (struct peer
*peer
)
2240 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
2241 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
2242 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
2243 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
2244 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
2249 /* If peer is negotiated at least one address family return 1. */
2251 peer_active_nego (struct peer
*peer
)
2253 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
2254 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
2255 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
2256 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
2257 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
2262 /* peer_flag_change_type. */
2263 enum peer_change_type
2267 peer_change_reset_in
,
2268 peer_change_reset_out
,
2272 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
2273 enum peer_change_type type
)
2275 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2278 if (type
== peer_change_reset
)
2279 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2280 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2281 else if (type
== peer_change_reset_in
)
2283 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
2284 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
2285 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
2287 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2288 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2290 else if (type
== peer_change_reset_out
)
2291 bgp_announce_route (peer
, afi
, safi
);
2294 struct peer_flag_action
2299 /* This flag can be set for peer-group member. */
2300 u_char not_for_member
;
2302 /* Action when the flag is changed. */
2303 enum peer_change_type type
;
2305 /* Peer down cause */
2309 static const struct peer_flag_action peer_flag_action_list
[] =
2311 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
2312 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
2313 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
2314 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
2315 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
2316 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
2317 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
2321 static const struct peer_flag_action peer_af_flag_action_list
[] =
2323 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
2324 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
2325 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
2326 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
2327 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
2328 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
2329 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
2330 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
2331 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
2332 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
2333 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
2334 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
2335 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
2336 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
2340 /* Proper action set. */
2342 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
2343 struct peer_flag_action
*action
, u_int32_t flag
)
2349 const struct peer_flag_action
*match
= NULL
;
2351 /* Check peer's frag action. */
2352 for (i
= 0; i
< size
; i
++)
2354 match
= &action_list
[i
];
2356 if (match
->flag
== 0)
2359 if (match
->flag
& flag
)
2363 if (match
->type
== peer_change_reset_in
)
2365 if (match
->type
== peer_change_reset_out
)
2367 if (match
->type
== peer_change_reset
)
2372 if (match
->not_for_member
)
2373 action
->not_for_member
= 1;
2377 /* Set peer clear type. */
2378 if (reset_in
&& reset_out
)
2379 action
->type
= peer_change_reset
;
2381 action
->type
= peer_change_reset_in
;
2383 action
->type
= peer_change_reset_out
;
2385 action
->type
= peer_change_none
;
2391 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2393 if (flag
== PEER_FLAG_SHUTDOWN
)
2395 if (CHECK_FLAG (peer
->flags
, flag
))
2397 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2398 peer_nsf_stop (peer
);
2400 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
2401 if (peer
->t_pmax_restart
)
2403 BGP_TIMER_OFF (peer
->t_pmax_restart
);
2404 if (BGP_DEBUG (events
, EVENTS
))
2405 zlog_debug ("%s Maximum-prefix restart timer canceled",
2409 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2410 peer_nsf_stop (peer
);
2412 if (peer
->status
== Established
)
2413 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2414 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2416 BGP_EVENT_ADD (peer
, BGP_Stop
);
2420 peer
->v_start
= BGP_INIT_START_TIMER
;
2421 BGP_EVENT_ADD (peer
, BGP_Stop
);
2424 else if (peer
->status
== Established
)
2426 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2427 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2428 else if (flag
== PEER_FLAG_PASSIVE
)
2429 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2430 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
2431 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2433 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2434 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2437 BGP_EVENT_ADD (peer
, BGP_Stop
);
2440 /* Change specified peer flag. */
2442 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2446 struct peer_group
*group
;
2447 struct listnode
*node
, *nnode
;
2448 struct peer_flag_action action
;
2450 memset (&action
, 0, sizeof (struct peer_flag_action
));
2451 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2453 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2455 /* No flag action is found. */
2457 return BGP_ERR_INVALID_FLAG
;
2459 /* Not for peer-group member. */
2460 if (action
.not_for_member
&& peer_group_active (peer
))
2461 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2463 /* When unset the peer-group member's flag we have to check
2464 peer-group configuration. */
2465 if (! set
&& peer_group_active (peer
))
2466 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2468 if (flag
== PEER_FLAG_SHUTDOWN
)
2469 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2471 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2474 /* Flag conflict check. */
2476 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2477 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2478 return BGP_ERR_PEER_FLAG_CONFLICT
;
2480 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2482 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2484 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2489 SET_FLAG (peer
->flags
, flag
);
2491 UNSET_FLAG (peer
->flags
, flag
);
2493 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2495 if (action
.type
== peer_change_reset
)
2496 peer_flag_modify_action (peer
, flag
);
2501 /* peer-group member updates. */
2502 group
= peer
->group
;
2504 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2506 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2509 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2513 SET_FLAG (peer
->flags
, flag
);
2515 UNSET_FLAG (peer
->flags
, flag
);
2517 if (action
.type
== peer_change_reset
)
2518 peer_flag_modify_action (peer
, flag
);
2524 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2526 return peer_flag_modify (peer
, flag
, 1);
2530 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2532 return peer_flag_modify (peer
, flag
, 0);
2536 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2538 if (peer
->af_group
[afi
][safi
])
2544 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2549 struct listnode
*node
, *nnode
;
2550 struct peer_group
*group
;
2551 struct peer_flag_action action
;
2553 memset (&action
, 0, sizeof (struct peer_flag_action
));
2554 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2556 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2558 /* No flag action is found. */
2560 return BGP_ERR_INVALID_FLAG
;
2562 /* Adress family must be activated. */
2563 if (! peer
->afc
[afi
][safi
])
2564 return BGP_ERR_PEER_INACTIVE
;
2566 /* Not for peer-group member. */
2567 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2568 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2570 /* Spcecial check for reflector client. */
2571 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2572 && peer_sort (peer
) != BGP_PEER_IBGP
)
2573 return BGP_ERR_NOT_INTERNAL_PEER
;
2575 /* Spcecial check for remove-private-AS. */
2576 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2577 && peer_sort (peer
) == BGP_PEER_IBGP
)
2578 return BGP_ERR_REMOVE_PRIVATE_AS
;
2580 /* When unset the peer-group member's flag we have to check
2581 peer-group configuration. */
2582 if (! set
&& peer
->af_group
[afi
][safi
])
2583 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2584 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2586 /* When current flag configuration is same as requested one. */
2587 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2589 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2591 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2596 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2598 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2600 /* Execute action when peer is established. */
2601 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2602 && peer
->status
== Established
)
2604 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2605 bgp_clear_adj_in (peer
, afi
, safi
);
2608 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2609 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2610 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2611 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2612 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2613 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2614 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2615 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2617 peer_change_action (peer
, afi
, safi
, action
.type
);
2622 /* Peer group member updates. */
2623 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2625 group
= peer
->group
;
2627 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2629 if (! peer
->af_group
[afi
][safi
])
2632 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2635 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2639 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2641 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2643 if (peer
->status
== Established
)
2645 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2646 bgp_clear_adj_in (peer
, afi
, safi
);
2649 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2650 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2651 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2652 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2653 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2654 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2655 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2656 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2658 peer_change_action (peer
, afi
, safi
, action
.type
);
2667 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2669 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2673 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2675 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2678 /* EBGP multihop configuration. */
2680 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2682 struct peer_group
*group
;
2683 struct listnode
*node
, *nnode
;
2686 if (peer
->sort
== BGP_PEER_IBGP
)
2689 /* see comment in peer_ttl_security_hops_set() */
2692 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2694 group
= peer
->group
;
2695 if (group
->conf
->gtsm_hops
!= 0)
2696 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2698 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
2700 if (peer1
->sort
== BGP_PEER_IBGP
)
2703 if (peer1
->gtsm_hops
!= 0)
2704 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2709 if (peer
->gtsm_hops
!= 0)
2710 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2716 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2718 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2719 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2723 group
= peer
->group
;
2724 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2726 if (peer
->sort
== BGP_PEER_IBGP
)
2729 peer
->ttl
= group
->conf
->ttl
;
2732 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2739 peer_ebgp_multihop_unset (struct peer
*peer
)
2741 struct peer_group
*group
;
2742 struct listnode
*node
, *nnode
;
2744 if (peer
->sort
== BGP_PEER_IBGP
)
2747 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
2748 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2750 if (peer_group_active (peer
))
2751 peer
->ttl
= peer
->group
->conf
->ttl
;
2755 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2757 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
2758 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2762 group
= peer
->group
;
2763 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2765 if (peer
->sort
== BGP_PEER_IBGP
)
2771 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2777 /* Neighbor description. */
2779 peer_description_set (struct peer
*peer
, char *desc
)
2782 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2784 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
2790 peer_description_unset (struct peer
*peer
)
2793 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2800 /* Neighbor update-source. */
2802 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
2804 struct peer_group
*group
;
2805 struct listnode
*node
, *nnode
;
2807 if (peer
->update_if
)
2809 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2810 && strcmp (peer
->update_if
, ifname
) == 0)
2813 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2814 peer
->update_if
= NULL
;
2817 if (peer
->update_source
)
2819 sockunion_free (peer
->update_source
);
2820 peer
->update_source
= NULL
;
2823 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2825 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2827 if (peer
->status
== Established
)
2829 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2830 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2831 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2834 BGP_EVENT_ADD (peer
, BGP_Stop
);
2838 /* peer-group member updates. */
2839 group
= peer
->group
;
2840 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2842 if (peer
->update_if
)
2844 if (strcmp (peer
->update_if
, ifname
) == 0)
2847 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2848 peer
->update_if
= NULL
;
2851 if (peer
->update_source
)
2853 sockunion_free (peer
->update_source
);
2854 peer
->update_source
= NULL
;
2857 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2859 if (peer
->status
== Established
)
2861 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2862 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2863 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2866 BGP_EVENT_ADD (peer
, BGP_Stop
);
2872 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
2874 struct peer_group
*group
;
2875 struct listnode
*node
, *nnode
;
2877 if (peer
->update_source
)
2879 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2880 && sockunion_cmp (peer
->update_source
, su
) == 0)
2882 sockunion_free (peer
->update_source
);
2883 peer
->update_source
= NULL
;
2886 if (peer
->update_if
)
2888 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2889 peer
->update_if
= NULL
;
2892 peer
->update_source
= sockunion_dup (su
);
2894 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2896 if (peer
->status
== Established
)
2898 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2899 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2900 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2903 BGP_EVENT_ADD (peer
, BGP_Stop
);
2907 /* peer-group member updates. */
2908 group
= peer
->group
;
2909 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2911 if (peer
->update_source
)
2913 if (sockunion_cmp (peer
->update_source
, su
) == 0)
2915 sockunion_free (peer
->update_source
);
2916 peer
->update_source
= NULL
;
2919 if (peer
->update_if
)
2921 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2922 peer
->update_if
= NULL
;
2925 peer
->update_source
= sockunion_dup (su
);
2927 if (peer
->status
== Established
)
2929 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2930 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2931 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2934 BGP_EVENT_ADD (peer
, BGP_Stop
);
2940 peer_update_source_unset (struct peer
*peer
)
2942 union sockunion
*su
;
2943 struct peer_group
*group
;
2944 struct listnode
*node
, *nnode
;
2946 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2947 && ! peer
->update_source
2948 && ! peer
->update_if
)
2951 if (peer
->update_source
)
2953 sockunion_free (peer
->update_source
);
2954 peer
->update_source
= NULL
;
2956 if (peer
->update_if
)
2958 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2959 peer
->update_if
= NULL
;
2962 if (peer_group_active (peer
))
2964 group
= peer
->group
;
2966 if (group
->conf
->update_source
)
2968 su
= sockunion_dup (group
->conf
->update_source
);
2969 peer
->update_source
= su
;
2971 else if (group
->conf
->update_if
)
2973 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
2976 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2978 if (peer
->status
== Established
)
2980 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2981 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2982 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2985 BGP_EVENT_ADD (peer
, BGP_Stop
);
2989 /* peer-group member updates. */
2990 group
= peer
->group
;
2991 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2993 if (! peer
->update_source
&& ! peer
->update_if
)
2996 if (peer
->update_source
)
2998 sockunion_free (peer
->update_source
);
2999 peer
->update_source
= NULL
;
3002 if (peer
->update_if
)
3004 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3005 peer
->update_if
= NULL
;
3008 if (peer
->status
== Established
)
3010 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3011 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3012 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3015 BGP_EVENT_ADD (peer
, BGP_Stop
);
3021 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3024 struct peer_group
*group
;
3025 struct listnode
*node
, *nnode
;
3027 /* Adress family must be activated. */
3028 if (! peer
->afc
[afi
][safi
])
3029 return BGP_ERR_PEER_INACTIVE
;
3031 /* Default originate can't be used for peer group memeber. */
3032 if (peer_is_group_member (peer
, afi
, safi
))
3033 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3035 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3036 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3037 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3039 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3043 if (peer
->default_rmap
[afi
][safi
].name
)
3044 free (peer
->default_rmap
[afi
][safi
].name
);
3045 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3046 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3050 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3052 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3053 bgp_default_originate (peer
, afi
, safi
, 0);
3057 /* peer-group member updates. */
3058 group
= peer
->group
;
3059 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3061 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3065 if (peer
->default_rmap
[afi
][safi
].name
)
3066 free (peer
->default_rmap
[afi
][safi
].name
);
3067 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3068 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3071 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3072 bgp_default_originate (peer
, afi
, safi
, 0);
3078 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3080 struct peer_group
*group
;
3081 struct listnode
*node
, *nnode
;
3083 /* Adress family must be activated. */
3084 if (! peer
->afc
[afi
][safi
])
3085 return BGP_ERR_PEER_INACTIVE
;
3087 /* Default originate can't be used for peer group memeber. */
3088 if (peer_is_group_member (peer
, afi
, safi
))
3089 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3091 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3093 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3095 if (peer
->default_rmap
[afi
][safi
].name
)
3096 free (peer
->default_rmap
[afi
][safi
].name
);
3097 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3098 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3101 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3103 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3104 bgp_default_originate (peer
, afi
, safi
, 1);
3108 /* peer-group member updates. */
3109 group
= peer
->group
;
3110 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3112 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3114 if (peer
->default_rmap
[afi
][safi
].name
)
3115 free (peer
->default_rmap
[afi
][safi
].name
);
3116 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3117 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3119 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3120 bgp_default_originate (peer
, afi
, safi
, 1);
3126 peer_port_set (struct peer
*peer
, u_int16_t port
)
3133 peer_port_unset (struct peer
*peer
)
3135 peer
->port
= BGP_PORT_DEFAULT
;
3139 /* neighbor weight. */
3141 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
3143 struct peer_group
*group
;
3144 struct listnode
*node
, *nnode
;
3146 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3147 peer
->weight
= weight
;
3149 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3152 /* peer-group member updates. */
3153 group
= peer
->group
;
3154 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3156 peer
->weight
= group
->conf
->weight
;
3162 peer_weight_unset (struct peer
*peer
)
3164 struct peer_group
*group
;
3165 struct listnode
*node
, *nnode
;
3167 /* Set default weight. */
3168 if (peer_group_active (peer
))
3169 peer
->weight
= peer
->group
->conf
->weight
;
3173 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3175 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3178 /* peer-group member updates. */
3179 group
= peer
->group
;
3180 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3188 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
3190 struct peer_group
*group
;
3191 struct listnode
*node
, *nnode
;
3193 /* Not for peer group memeber. */
3194 if (peer_group_active (peer
))
3195 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3197 /* keepalive value check. */
3198 if (keepalive
> 65535)
3199 return BGP_ERR_INVALID_VALUE
;
3201 /* Holdtime value check. */
3202 if (holdtime
> 65535)
3203 return BGP_ERR_INVALID_VALUE
;
3205 /* Holdtime value must be either 0 or greater than 3. */
3206 if (holdtime
< 3 && holdtime
!= 0)
3207 return BGP_ERR_INVALID_VALUE
;
3209 /* Set value to the configuration. */
3210 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3211 peer
->holdtime
= holdtime
;
3212 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
3214 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3217 /* peer-group member updates. */
3218 group
= peer
->group
;
3219 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3221 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3222 peer
->holdtime
= group
->conf
->holdtime
;
3223 peer
->keepalive
= group
->conf
->keepalive
;
3229 peer_timers_unset (struct peer
*peer
)
3231 struct peer_group
*group
;
3232 struct listnode
*node
, *nnode
;
3234 if (peer_group_active (peer
))
3235 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3237 /* Clear configuration. */
3238 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3239 peer
->keepalive
= 0;
3242 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3245 /* peer-group member updates. */
3246 group
= peer
->group
;
3247 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3249 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3251 peer
->keepalive
= 0;
3258 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
3260 if (peer_group_active (peer
))
3261 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3263 if (connect
> 65535)
3264 return BGP_ERR_INVALID_VALUE
;
3266 /* Set value to the configuration. */
3267 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3268 peer
->connect
= connect
;
3270 /* Set value to timer setting. */
3271 peer
->v_connect
= connect
;
3277 peer_timers_connect_unset (struct peer
*peer
)
3279 if (peer_group_active (peer
))
3280 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3282 /* Clear configuration. */
3283 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3286 /* Set timer setting to default value. */
3287 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3293 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3295 if (peer_group_active (peer
))
3296 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3299 return BGP_ERR_INVALID_VALUE
;
3301 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3302 peer
->routeadv
= routeadv
;
3303 peer
->v_routeadv
= routeadv
;
3309 peer_advertise_interval_unset (struct peer
*peer
)
3311 if (peer_group_active (peer
))
3312 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3314 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3317 if (peer
->sort
== BGP_PEER_IBGP
)
3318 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3320 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3325 /* neighbor interface */
3327 peer_interface_set (struct peer
*peer
, const char *str
)
3330 free (peer
->ifname
);
3331 peer
->ifname
= strdup (str
);
3337 peer_interface_unset (struct peer
*peer
)
3340 free (peer
->ifname
);
3341 peer
->ifname
= NULL
;
3348 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3350 struct peer_group
*group
;
3351 struct listnode
*node
, *nnode
;
3353 if (allow_num
< 1 || allow_num
> 10)
3354 return BGP_ERR_INVALID_VALUE
;
3356 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3358 peer
->allowas_in
[afi
][safi
] = allow_num
;
3359 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3360 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3363 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3366 group
= peer
->group
;
3367 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3369 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3371 peer
->allowas_in
[afi
][safi
] = allow_num
;
3372 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3373 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3381 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3383 struct peer_group
*group
;
3384 struct listnode
*node
, *nnode
;
3386 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3388 peer
->allowas_in
[afi
][safi
] = 0;
3389 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3392 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3395 group
= peer
->group
;
3396 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3398 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3400 peer
->allowas_in
[afi
][safi
] = 0;
3401 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3408 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
)
3410 struct bgp
*bgp
= peer
->bgp
;
3411 struct peer_group
*group
;
3412 struct listnode
*node
, *nnode
;
3414 if (peer_sort (peer
) != BGP_PEER_EBGP
3415 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3416 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3419 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3421 if (peer_group_active (peer
))
3422 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3424 if (peer
->change_local_as
== as
&&
3425 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3426 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)))
3429 peer
->change_local_as
= as
;
3431 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3433 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3435 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3437 if (peer
->status
== Established
)
3439 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3440 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3441 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3444 BGP_EVENT_ADD (peer
, BGP_Stop
);
3449 group
= peer
->group
;
3450 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3452 peer
->change_local_as
= as
;
3454 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3456 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3458 if (peer
->status
== Established
)
3460 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3461 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3462 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3465 BGP_EVENT_ADD (peer
, BGP_Stop
);
3472 peer_local_as_unset (struct peer
*peer
)
3474 struct peer_group
*group
;
3475 struct listnode
*node
, *nnode
;
3477 if (peer_group_active (peer
))
3478 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3480 if (! peer
->change_local_as
)
3483 peer
->change_local_as
= 0;
3484 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3486 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3488 if (peer
->status
== Established
)
3490 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3491 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3492 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3495 BGP_EVENT_ADD (peer
, BGP_Stop
);
3500 group
= peer
->group
;
3501 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3503 peer
->change_local_as
= 0;
3504 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3506 if (peer
->status
== Established
)
3508 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3509 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3510 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3513 BGP_EVENT_ADD (peer
, BGP_Stop
);
3518 /* Set password for authenticating with the peer. */
3520 peer_password_set (struct peer
*peer
, const char *password
)
3522 struct listnode
*nn
, *nnode
;
3523 int len
= password
? strlen(password
) : 0;
3524 int ret
= BGP_SUCCESS
;
3526 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
3527 return BGP_ERR_INVALID_VALUE
;
3529 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
3530 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3534 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3536 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
3538 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3540 if (peer
->status
== Established
)
3541 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3543 BGP_EVENT_ADD (peer
, BGP_Stop
);
3545 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
3548 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3550 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
3554 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3556 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
3558 if (peer
->status
== Established
)
3559 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3561 BGP_EVENT_ADD (peer
, BGP_Stop
);
3563 if (bgp_md5_set (peer
) < 0)
3564 ret
= BGP_ERR_TCPSIG_FAILED
;
3571 peer_password_unset (struct peer
*peer
)
3573 struct listnode
*nn
, *nnode
;
3576 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3579 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3581 if (peer_group_active (peer
)
3582 && peer
->group
->conf
->password
3583 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
3584 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3586 if (peer
->status
== Established
)
3587 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3589 BGP_EVENT_ADD (peer
, BGP_Stop
);
3592 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3594 peer
->password
= NULL
;
3601 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3602 peer
->password
= NULL
;
3604 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3606 if (!peer
->password
)
3609 if (peer
->status
== Established
)
3610 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3612 BGP_EVENT_ADD (peer
, BGP_Stop
);
3614 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3615 peer
->password
= NULL
;
3623 /* Set distribute list to the peer. */
3625 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3628 struct bgp_filter
*filter
;
3629 struct peer_group
*group
;
3630 struct listnode
*node
, *nnode
;
3632 if (! peer
->afc
[afi
][safi
])
3633 return BGP_ERR_PEER_INACTIVE
;
3635 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3636 return BGP_ERR_INVALID_VALUE
;
3638 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3639 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3641 filter
= &peer
->filter
[afi
][safi
];
3643 if (filter
->plist
[direct
].name
)
3644 return BGP_ERR_PEER_FILTER_CONFLICT
;
3646 if (filter
->dlist
[direct
].name
)
3647 free (filter
->dlist
[direct
].name
);
3648 filter
->dlist
[direct
].name
= strdup (name
);
3649 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3651 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3654 group
= peer
->group
;
3655 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3657 filter
= &peer
->filter
[afi
][safi
];
3659 if (! peer
->af_group
[afi
][safi
])
3662 if (filter
->dlist
[direct
].name
)
3663 free (filter
->dlist
[direct
].name
);
3664 filter
->dlist
[direct
].name
= strdup (name
);
3665 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3672 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3674 struct bgp_filter
*filter
;
3675 struct bgp_filter
*gfilter
;
3676 struct peer_group
*group
;
3677 struct listnode
*node
, *nnode
;
3679 if (! peer
->afc
[afi
][safi
])
3680 return BGP_ERR_PEER_INACTIVE
;
3682 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3683 return BGP_ERR_INVALID_VALUE
;
3685 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3686 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3688 filter
= &peer
->filter
[afi
][safi
];
3690 /* apply peer-group filter */
3691 if (peer
->af_group
[afi
][safi
])
3693 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3695 if (gfilter
->dlist
[direct
].name
)
3697 if (filter
->dlist
[direct
].name
)
3698 free (filter
->dlist
[direct
].name
);
3699 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
3700 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
3705 if (filter
->dlist
[direct
].name
)
3706 free (filter
->dlist
[direct
].name
);
3707 filter
->dlist
[direct
].name
= NULL
;
3708 filter
->dlist
[direct
].alist
= NULL
;
3710 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3713 group
= peer
->group
;
3714 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3716 filter
= &peer
->filter
[afi
][safi
];
3718 if (! peer
->af_group
[afi
][safi
])
3721 if (filter
->dlist
[direct
].name
)
3722 free (filter
->dlist
[direct
].name
);
3723 filter
->dlist
[direct
].name
= NULL
;
3724 filter
->dlist
[direct
].alist
= NULL
;
3730 /* Update distribute list. */
3732 peer_distribute_update (struct access_list
*access
)
3737 struct listnode
*mnode
, *mnnode
;
3738 struct listnode
*node
, *nnode
;
3741 struct peer_group
*group
;
3742 struct bgp_filter
*filter
;
3744 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3746 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3748 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3749 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3751 filter
= &peer
->filter
[afi
][safi
];
3753 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3755 if (filter
->dlist
[direct
].name
)
3756 filter
->dlist
[direct
].alist
=
3757 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3759 filter
->dlist
[direct
].alist
= NULL
;
3763 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3765 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3766 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3768 filter
= &group
->conf
->filter
[afi
][safi
];
3770 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3772 if (filter
->dlist
[direct
].name
)
3773 filter
->dlist
[direct
].alist
=
3774 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3776 filter
->dlist
[direct
].alist
= NULL
;
3783 /* Set prefix list to the peer. */
3785 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3788 struct bgp_filter
*filter
;
3789 struct peer_group
*group
;
3790 struct listnode
*node
, *nnode
;
3792 if (! peer
->afc
[afi
][safi
])
3793 return BGP_ERR_PEER_INACTIVE
;
3795 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3796 return BGP_ERR_INVALID_VALUE
;
3798 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3799 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3801 filter
= &peer
->filter
[afi
][safi
];
3803 if (filter
->dlist
[direct
].name
)
3804 return BGP_ERR_PEER_FILTER_CONFLICT
;
3806 if (filter
->plist
[direct
].name
)
3807 free (filter
->plist
[direct
].name
);
3808 filter
->plist
[direct
].name
= strdup (name
);
3809 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3811 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3814 group
= peer
->group
;
3815 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3817 filter
= &peer
->filter
[afi
][safi
];
3819 if (! peer
->af_group
[afi
][safi
])
3822 if (filter
->plist
[direct
].name
)
3823 free (filter
->plist
[direct
].name
);
3824 filter
->plist
[direct
].name
= strdup (name
);
3825 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3831 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3833 struct bgp_filter
*filter
;
3834 struct bgp_filter
*gfilter
;
3835 struct peer_group
*group
;
3836 struct listnode
*node
, *nnode
;
3838 if (! peer
->afc
[afi
][safi
])
3839 return BGP_ERR_PEER_INACTIVE
;
3841 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3842 return BGP_ERR_INVALID_VALUE
;
3844 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3845 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3847 filter
= &peer
->filter
[afi
][safi
];
3849 /* apply peer-group filter */
3850 if (peer
->af_group
[afi
][safi
])
3852 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3854 if (gfilter
->plist
[direct
].name
)
3856 if (filter
->plist
[direct
].name
)
3857 free (filter
->plist
[direct
].name
);
3858 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
3859 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
3864 if (filter
->plist
[direct
].name
)
3865 free (filter
->plist
[direct
].name
);
3866 filter
->plist
[direct
].name
= NULL
;
3867 filter
->plist
[direct
].plist
= NULL
;
3869 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3872 group
= peer
->group
;
3873 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3875 filter
= &peer
->filter
[afi
][safi
];
3877 if (! peer
->af_group
[afi
][safi
])
3880 if (filter
->plist
[direct
].name
)
3881 free (filter
->plist
[direct
].name
);
3882 filter
->plist
[direct
].name
= NULL
;
3883 filter
->plist
[direct
].plist
= NULL
;
3889 /* Update prefix-list list. */
3891 peer_prefix_list_update (struct prefix_list
*plist
)
3893 struct listnode
*mnode
, *mnnode
;
3894 struct listnode
*node
, *nnode
;
3897 struct peer_group
*group
;
3898 struct bgp_filter
*filter
;
3903 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
3905 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
3907 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3908 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3910 filter
= &peer
->filter
[afi
][safi
];
3912 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3914 if (filter
->plist
[direct
].name
)
3915 filter
->plist
[direct
].plist
=
3916 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3918 filter
->plist
[direct
].plist
= NULL
;
3922 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
3924 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3925 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3927 filter
= &group
->conf
->filter
[afi
][safi
];
3929 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3931 if (filter
->plist
[direct
].name
)
3932 filter
->plist
[direct
].plist
=
3933 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3935 filter
->plist
[direct
].plist
= NULL
;
3943 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3946 struct bgp_filter
*filter
;
3947 struct peer_group
*group
;
3948 struct listnode
*node
, *nnode
;
3950 if (! peer
->afc
[afi
][safi
])
3951 return BGP_ERR_PEER_INACTIVE
;
3953 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3954 return BGP_ERR_INVALID_VALUE
;
3956 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3957 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3959 filter
= &peer
->filter
[afi
][safi
];
3961 if (filter
->aslist
[direct
].name
)
3962 free (filter
->aslist
[direct
].name
);
3963 filter
->aslist
[direct
].name
= strdup (name
);
3964 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
3966 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3969 group
= peer
->group
;
3970 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3972 filter
= &peer
->filter
[afi
][safi
];
3974 if (! peer
->af_group
[afi
][safi
])
3977 if (filter
->aslist
[direct
].name
)
3978 free (filter
->aslist
[direct
].name
);
3979 filter
->aslist
[direct
].name
= strdup (name
);
3980 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
3986 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
3988 struct bgp_filter
*filter
;
3989 struct bgp_filter
*gfilter
;
3990 struct peer_group
*group
;
3991 struct listnode
*node
, *nnode
;
3993 if (! peer
->afc
[afi
][safi
])
3994 return BGP_ERR_PEER_INACTIVE
;
3996 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3997 return BGP_ERR_INVALID_VALUE
;
3999 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4000 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4002 filter
= &peer
->filter
[afi
][safi
];
4004 /* apply peer-group filter */
4005 if (peer
->af_group
[afi
][safi
])
4007 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4009 if (gfilter
->aslist
[direct
].name
)
4011 if (filter
->aslist
[direct
].name
)
4012 free (filter
->aslist
[direct
].name
);
4013 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
4014 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
4019 if (filter
->aslist
[direct
].name
)
4020 free (filter
->aslist
[direct
].name
);
4021 filter
->aslist
[direct
].name
= NULL
;
4022 filter
->aslist
[direct
].aslist
= NULL
;
4024 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4027 group
= peer
->group
;
4028 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4030 filter
= &peer
->filter
[afi
][safi
];
4032 if (! peer
->af_group
[afi
][safi
])
4035 if (filter
->aslist
[direct
].name
)
4036 free (filter
->aslist
[direct
].name
);
4037 filter
->aslist
[direct
].name
= NULL
;
4038 filter
->aslist
[direct
].aslist
= NULL
;
4045 peer_aslist_update (void)
4050 struct listnode
*mnode
, *mnnode
;
4051 struct listnode
*node
, *nnode
;
4054 struct peer_group
*group
;
4055 struct bgp_filter
*filter
;
4057 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4059 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4061 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4062 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4064 filter
= &peer
->filter
[afi
][safi
];
4066 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4068 if (filter
->aslist
[direct
].name
)
4069 filter
->aslist
[direct
].aslist
=
4070 as_list_lookup (filter
->aslist
[direct
].name
);
4072 filter
->aslist
[direct
].aslist
= NULL
;
4076 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4078 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4079 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4081 filter
= &group
->conf
->filter
[afi
][safi
];
4083 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4085 if (filter
->aslist
[direct
].name
)
4086 filter
->aslist
[direct
].aslist
=
4087 as_list_lookup (filter
->aslist
[direct
].name
);
4089 filter
->aslist
[direct
].aslist
= NULL
;
4096 /* Set route-map to the peer. */
4098 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4101 struct bgp_filter
*filter
;
4102 struct peer_group
*group
;
4103 struct listnode
*node
, *nnode
;
4105 if (! peer
->afc
[afi
][safi
])
4106 return BGP_ERR_PEER_INACTIVE
;
4108 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4109 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4110 return BGP_ERR_INVALID_VALUE
;
4112 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4113 && peer_is_group_member (peer
, afi
, safi
))
4114 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4116 filter
= &peer
->filter
[afi
][safi
];
4118 if (filter
->map
[direct
].name
)
4119 free (filter
->map
[direct
].name
);
4121 filter
->map
[direct
].name
= strdup (name
);
4122 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4124 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4127 group
= peer
->group
;
4128 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4130 filter
= &peer
->filter
[afi
][safi
];
4132 if (! peer
->af_group
[afi
][safi
])
4135 if (filter
->map
[direct
].name
)
4136 free (filter
->map
[direct
].name
);
4137 filter
->map
[direct
].name
= strdup (name
);
4138 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4143 /* Unset route-map from the peer. */
4145 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4147 struct bgp_filter
*filter
;
4148 struct bgp_filter
*gfilter
;
4149 struct peer_group
*group
;
4150 struct listnode
*node
, *nnode
;
4152 if (! peer
->afc
[afi
][safi
])
4153 return BGP_ERR_PEER_INACTIVE
;
4155 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4156 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4157 return BGP_ERR_INVALID_VALUE
;
4159 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4160 && peer_is_group_member (peer
, afi
, safi
))
4161 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4163 filter
= &peer
->filter
[afi
][safi
];
4165 /* apply peer-group filter */
4166 if (peer
->af_group
[afi
][safi
])
4168 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4170 if (gfilter
->map
[direct
].name
)
4172 if (filter
->map
[direct
].name
)
4173 free (filter
->map
[direct
].name
);
4174 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
4175 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
4180 if (filter
->map
[direct
].name
)
4181 free (filter
->map
[direct
].name
);
4182 filter
->map
[direct
].name
= NULL
;
4183 filter
->map
[direct
].map
= NULL
;
4185 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4188 group
= peer
->group
;
4189 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4191 filter
= &peer
->filter
[afi
][safi
];
4193 if (! peer
->af_group
[afi
][safi
])
4196 if (filter
->map
[direct
].name
)
4197 free (filter
->map
[direct
].name
);
4198 filter
->map
[direct
].name
= NULL
;
4199 filter
->map
[direct
].map
= NULL
;
4204 /* Set unsuppress-map to the peer. */
4206 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4209 struct bgp_filter
*filter
;
4210 struct peer_group
*group
;
4211 struct listnode
*node
, *nnode
;
4213 if (! peer
->afc
[afi
][safi
])
4214 return BGP_ERR_PEER_INACTIVE
;
4216 if (peer_is_group_member (peer
, afi
, safi
))
4217 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4219 filter
= &peer
->filter
[afi
][safi
];
4221 if (filter
->usmap
.name
)
4222 free (filter
->usmap
.name
);
4224 filter
->usmap
.name
= strdup (name
);
4225 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4227 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4230 group
= peer
->group
;
4231 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4233 filter
= &peer
->filter
[afi
][safi
];
4235 if (! peer
->af_group
[afi
][safi
])
4238 if (filter
->usmap
.name
)
4239 free (filter
->usmap
.name
);
4240 filter
->usmap
.name
= strdup (name
);
4241 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4246 /* Unset route-map from the peer. */
4248 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4250 struct bgp_filter
*filter
;
4251 struct peer_group
*group
;
4252 struct listnode
*node
, *nnode
;
4254 if (! peer
->afc
[afi
][safi
])
4255 return BGP_ERR_PEER_INACTIVE
;
4257 if (peer_is_group_member (peer
, afi
, safi
))
4258 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4260 filter
= &peer
->filter
[afi
][safi
];
4262 if (filter
->usmap
.name
)
4263 free (filter
->usmap
.name
);
4264 filter
->usmap
.name
= NULL
;
4265 filter
->usmap
.map
= NULL
;
4267 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4270 group
= peer
->group
;
4271 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4273 filter
= &peer
->filter
[afi
][safi
];
4275 if (! peer
->af_group
[afi
][safi
])
4278 if (filter
->usmap
.name
)
4279 free (filter
->usmap
.name
);
4280 filter
->usmap
.name
= NULL
;
4281 filter
->usmap
.map
= NULL
;
4287 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4288 u_int32_t max
, u_char threshold
,
4289 int warning
, u_int16_t restart
)
4291 struct peer_group
*group
;
4292 struct listnode
*node
, *nnode
;
4294 if (! peer
->afc
[afi
][safi
])
4295 return BGP_ERR_PEER_INACTIVE
;
4297 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4298 peer
->pmax
[afi
][safi
] = max
;
4299 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4300 peer
->pmax_restart
[afi
][safi
] = restart
;
4302 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4304 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4306 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4309 group
= peer
->group
;
4310 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4312 if (! peer
->af_group
[afi
][safi
])
4315 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4316 peer
->pmax
[afi
][safi
] = max
;
4317 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4318 peer
->pmax_restart
[afi
][safi
] = restart
;
4320 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4322 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4328 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4330 struct peer_group
*group
;
4331 struct listnode
*node
, *nnode
;
4333 if (! peer
->afc
[afi
][safi
])
4334 return BGP_ERR_PEER_INACTIVE
;
4336 /* apply peer-group config */
4337 if (peer
->af_group
[afi
][safi
])
4339 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4340 PEER_FLAG_MAX_PREFIX
))
4341 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4343 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4345 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4346 PEER_FLAG_MAX_PREFIX_WARNING
))
4347 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4349 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4351 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
4352 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4353 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
4357 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4358 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4359 peer
->pmax
[afi
][safi
] = 0;
4360 peer
->pmax_threshold
[afi
][safi
] = 0;
4361 peer
->pmax_restart
[afi
][safi
] = 0;
4363 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4366 group
= peer
->group
;
4367 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4369 if (! peer
->af_group
[afi
][safi
])
4372 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4373 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4374 peer
->pmax
[afi
][safi
] = 0;
4375 peer
->pmax_threshold
[afi
][safi
] = 0;
4376 peer
->pmax_restart
[afi
][safi
] = 0;
4381 /* Set # of hops between us and BGP peer. */
4383 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
4385 struct peer_group
*group
;
4386 struct listnode
*node
, *nnode
;
4390 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
4392 if (peer
->sort
== BGP_PEER_IBGP
)
4393 return BGP_ERR_NO_IBGP_WITH_TTLHACK
;
4395 /* We cannot configure ttl-security hops when ebgp-multihop is already
4396 set. For non peer-groups, the check is simple. For peer-groups, it's
4397 slightly messy, because we need to check both the peer-group structure
4398 and all peer-group members for any trace of ebgp-multihop configuration
4399 before actually applying the ttl-security rules. Cisco really made a
4400 mess of this configuration parameter, and OpenBGPD got it right.
4403 if (peer
->gtsm_hops
== 0) {
4404 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4406 group
= peer
->group
;
4407 if (group
->conf
->ttl
!= 1)
4408 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4410 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
4412 if (peer1
->sort
== BGP_PEER_IBGP
)
4415 if (peer1
->ttl
!= 1)
4416 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4422 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4424 /* specify MAXTTL on outgoing packets */
4425 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
4430 peer
->gtsm_hops
= gtsm_hops
;
4432 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4434 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
4435 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, MAXTTL
+ 1 - gtsm_hops
);
4439 group
= peer
->group
;
4440 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4442 if (peer
->sort
== BGP_PEER_IBGP
)
4445 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
4447 /* Change setting of existing peer
4448 * established then change value (may break connectivity)
4449 * not established yet (teardown session and restart)
4450 * no session then do nothing (will get handled by next connection)
4452 if (peer
->status
== Established
)
4454 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
4455 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4456 MAXTTL
+ 1 - peer
->gtsm_hops
);
4458 else if (peer
->status
< Established
)
4460 if (BGP_DEBUG (events
, EVENTS
))
4461 zlog_debug ("%s Min-ttl changed", peer
->host
);
4462 BGP_EVENT_ADD (peer
, BGP_Stop
);
4471 peer_ttl_security_hops_unset (struct peer
*peer
)
4473 struct peer_group
*group
;
4474 struct listnode
*node
, *nnode
;
4477 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
4479 if (peer
->sort
== BGP_PEER_IBGP
)
4482 /* if a peer-group member, then reset to peer-group default rather than 0 */
4483 if (peer_group_active (peer
))
4484 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
4486 peer
->gtsm_hops
= 0;
4489 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4491 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
4492 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4496 group
= peer
->group
;
4497 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4499 if (peer
->sort
== BGP_PEER_IBGP
)
4502 peer
->gtsm_hops
= 0;
4505 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4509 return peer_ebgp_multihop_unset (opeer
);
4513 peer_clear (struct peer
*peer
)
4515 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4517 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
4519 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4520 if (peer
->t_pmax_restart
)
4522 BGP_TIMER_OFF (peer
->t_pmax_restart
);
4523 if (BGP_DEBUG (events
, EVENTS
))
4524 zlog_debug ("%s Maximum-prefix restart timer canceled",
4527 BGP_EVENT_ADD (peer
, BGP_Start
);
4531 peer
->v_start
= BGP_INIT_START_TIMER
;
4532 if (peer
->status
== Established
)
4533 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4534 BGP_NOTIFY_CEASE_ADMIN_RESET
);
4536 BGP_EVENT_ADD (peer
, BGP_Stop
);
4542 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
4543 enum bgp_clear_type stype
)
4545 if (peer
->status
!= Established
)
4548 if (! peer
->afc
[afi
][safi
])
4549 return BGP_ERR_AF_UNCONFIGURED
;
4551 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
4553 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
4555 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
4556 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
4559 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
4560 bgp_announce_route (peer
, afi
, safi
);
4562 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4564 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
4565 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
4566 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
4568 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
4571 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
4572 prefix_type
= ORF_TYPE_PREFIX
;
4574 prefix_type
= ORF_TYPE_PREFIX_OLD
;
4576 if (filter
->plist
[FILTER_IN
].plist
)
4578 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4579 bgp_route_refresh_send (peer
, afi
, safi
,
4580 prefix_type
, REFRESH_DEFER
, 1);
4581 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
4582 REFRESH_IMMEDIATE
, 0);
4586 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4587 bgp_route_refresh_send (peer
, afi
, safi
,
4588 prefix_type
, REFRESH_IMMEDIATE
, 1);
4590 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4596 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
4597 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4599 /* If neighbor has soft reconfiguration inbound flag.
4600 Use Adj-RIB-In database. */
4601 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4602 bgp_soft_reconfig_in (peer
, afi
, safi
);
4605 /* If neighbor has route refresh capability, send route refresh
4606 message to the peer. */
4607 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4608 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4609 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4611 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
4617 /* Display peer uptime.*/
4618 /* XXX: why does this function return char * when it takes buffer? */
4620 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
4625 /* Check buffer length. */
4626 if (len
< BGP_UPTIME_LEN
)
4628 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
4629 /* XXX: should return status instead of buf... */
4630 snprintf (buf
, len
, "<error> ");
4634 /* If there is no connection has been done before print `never'. */
4637 snprintf (buf
, len
, "never ");
4641 /* Get current time. */
4642 uptime1
= bgp_clock ();
4644 tm
= gmtime (&uptime1
);
4646 /* Making formatted timer strings. */
4647 #define ONE_DAY_SECOND 60*60*24
4648 #define ONE_WEEK_SECOND 60*60*24*7
4650 if (uptime1
< ONE_DAY_SECOND
)
4651 snprintf (buf
, len
, "%02d:%02d:%02d",
4652 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
4653 else if (uptime1
< ONE_WEEK_SECOND
)
4654 snprintf (buf
, len
, "%dd%02dh%02dm",
4655 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
4657 snprintf (buf
, len
, "%02dw%dd%02dh",
4658 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
4663 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
4664 afi_t afi
, safi_t safi
)
4666 struct bgp_filter
*filter
;
4667 struct bgp_filter
*gfilter
= NULL
;
4670 int out
= FILTER_OUT
;
4673 filter
= &peer
->filter
[afi
][safi
];
4674 if (peer
->af_group
[afi
][safi
])
4675 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4677 /* distribute-list. */
4678 if (filter
->dlist
[in
].name
)
4679 if (! gfilter
|| ! gfilter
->dlist
[in
].name
4680 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
4681 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
4682 filter
->dlist
[in
].name
, VTY_NEWLINE
);
4683 if (filter
->dlist
[out
].name
&& ! gfilter
)
4684 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
4685 filter
->dlist
[out
].name
, VTY_NEWLINE
);
4688 if (filter
->plist
[in
].name
)
4689 if (! gfilter
|| ! gfilter
->plist
[in
].name
4690 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
4691 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
4692 filter
->plist
[in
].name
, VTY_NEWLINE
);
4693 if (filter
->plist
[out
].name
&& ! gfilter
)
4694 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
4695 filter
->plist
[out
].name
, VTY_NEWLINE
);
4698 if (filter
->map
[RMAP_IN
].name
)
4699 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
4700 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
4701 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
4702 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
4703 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
4704 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
4705 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
4706 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
4707 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
4708 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
4709 if (filter
->map
[RMAP_EXPORT
].name
)
4710 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
4711 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
4712 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
4713 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
4714 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
4716 /* unsuppress-map */
4717 if (filter
->usmap
.name
&& ! gfilter
)
4718 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
4719 filter
->usmap
.name
, VTY_NEWLINE
);
4722 if (filter
->aslist
[in
].name
)
4723 if (! gfilter
|| ! gfilter
->aslist
[in
].name
4724 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
4725 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
4726 filter
->aslist
[in
].name
, VTY_NEWLINE
);
4727 if (filter
->aslist
[out
].name
&& ! gfilter
)
4728 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
4729 filter
->aslist
[out
].name
, VTY_NEWLINE
);
4732 /* BGP peer configuration display function. */
4734 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
4735 struct peer
*peer
, afi_t afi
, safi_t safi
)
4737 struct peer
*g_peer
= NULL
;
4738 char buf
[SU_ADDRSTRLEN
];
4742 if (peer_group_active (peer
))
4743 g_peer
= peer
->group
->conf
;
4745 /************************************
4746 ****** Global to the neighbor ******
4747 ************************************/
4748 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4751 if (! peer_group_active (peer
))
4753 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4754 vty_out (vty
, " neighbor %s peer-group%s", addr
,
4757 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4763 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
4765 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4766 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4767 peer
->group
->name
, VTY_NEWLINE
);
4771 if (peer
->change_local_as
)
4772 if (! peer_group_active (peer
))
4773 vty_out (vty
, " neighbor %s local-as %u%s%s", addr
,
4774 peer
->change_local_as
,
4775 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
4776 " no-prepend" : "", VTY_NEWLINE
);
4780 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
4784 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4785 if (! peer_group_active (peer
) ||
4786 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
4787 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
4791 if (!peer_group_active (peer
)
4792 || ! g_peer
->password
4793 || strcmp (peer
->password
, g_peer
->password
) != 0)
4794 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
4798 if (peer
->port
!= BGP_PORT_DEFAULT
)
4799 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
4802 /* Local interface name. */
4804 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
4808 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
4809 if (! peer_group_active (peer
) ||
4810 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
4811 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
4813 /* EBGP multihop. */
4814 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
4815 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
4816 if (! peer_group_active (peer
) ||
4817 g_peer
->ttl
!= peer
->ttl
)
4818 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
4821 /* ttl-security hops */
4822 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->gtsm_hops
!= 0)
4823 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
4824 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
4825 peer
->gtsm_hops
, VTY_NEWLINE
);
4827 /* disable-connected-check. */
4828 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4829 if (! peer_group_active (peer
) ||
4830 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
4831 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
4833 /* Update-source. */
4834 if (peer
->update_if
)
4835 if (! peer_group_active (peer
) || ! g_peer
->update_if
4836 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
4837 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4838 peer
->update_if
, VTY_NEWLINE
);
4839 if (peer
->update_source
)
4840 if (! peer_group_active (peer
) || ! g_peer
->update_source
4841 || sockunion_cmp (g_peer
->update_source
,
4842 peer
->update_source
) != 0)
4843 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4844 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
4847 /* advertisement-interval */
4848 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
4849 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
4850 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
4853 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
4854 && ! peer_group_active (peer
))
4855 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
4856 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
4858 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
))
4859 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
4860 peer
->connect
, VTY_NEWLINE
);
4862 /* Default weight. */
4863 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
4864 if (! peer_group_active (peer
) ||
4865 g_peer
->weight
!= peer
->weight
)
4866 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
4869 /* Dynamic capability. */
4870 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4871 if (! peer_group_active (peer
) ||
4872 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4873 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
4876 /* dont capability negotiation. */
4877 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4878 if (! peer_group_active (peer
) ||
4879 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4880 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
4883 /* override capability negotiation. */
4884 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4885 if (! peer_group_active (peer
) ||
4886 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4887 vty_out (vty
, " neighbor %s override-capability%s", addr
,
4890 /* strict capability negotiation. */
4891 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4892 if (! peer_group_active (peer
) ||
4893 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4894 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
4897 if (! peer_group_active (peer
))
4899 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4901 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4902 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4906 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4907 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
4913 /************************************
4914 ****** Per AF to the neighbor ******
4915 ************************************/
4917 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
4919 if (peer
->af_group
[afi
][safi
])
4920 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4921 peer
->group
->name
, VTY_NEWLINE
);
4923 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4926 /* ORF capability. */
4927 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4928 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4929 if (! peer
->af_group
[afi
][safi
])
4931 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
4933 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4934 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4935 vty_out (vty
, " both");
4936 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
4937 vty_out (vty
, " send");
4939 vty_out (vty
, " receive");
4940 vty_out (vty
, "%s", VTY_NEWLINE
);
4943 /* Route reflector client. */
4944 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
4945 && ! peer
->af_group
[afi
][safi
])
4946 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
4950 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
4951 && ! peer
->af_group
[afi
][safi
])
4952 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
4954 /* Remove private AS. */
4955 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
4956 && ! peer
->af_group
[afi
][safi
])
4957 vty_out (vty
, " neighbor %s remove-private-AS%s",
4960 /* send-community print. */
4961 if (! peer
->af_group
[afi
][safi
])
4963 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4965 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
4966 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4967 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
4968 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4969 vty_out (vty
, " neighbor %s send-community extended%s",
4971 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
4972 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
4976 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
4977 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4978 vty_out (vty
, " no neighbor %s send-community both%s",
4980 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4981 vty_out (vty
, " no neighbor %s send-community extended%s",
4983 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
4984 vty_out (vty
, " no neighbor %s send-community%s",
4989 /* Default information */
4990 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
4991 && ! peer
->af_group
[afi
][safi
])
4993 vty_out (vty
, " neighbor %s default-originate", addr
);
4994 if (peer
->default_rmap
[afi
][safi
].name
)
4995 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
4996 vty_out (vty
, "%s", VTY_NEWLINE
);
4999 /* Soft reconfiguration inbound. */
5000 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5001 if (! peer
->af_group
[afi
][safi
] ||
5002 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5003 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
5006 /* maximum-prefix. */
5007 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
5008 if (! peer
->af_group
[afi
][safi
]
5009 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
5010 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
5011 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
5012 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5014 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
5015 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
5016 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
5017 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5018 vty_out (vty
, " warning-only");
5019 if (peer
->pmax_restart
[afi
][safi
])
5020 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
5021 vty_out (vty
, "%s", VTY_NEWLINE
);
5024 /* Route server client. */
5025 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
5026 && ! peer
->af_group
[afi
][safi
])
5027 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
5029 /* Nexthop-local unchanged. */
5030 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
5031 && ! peer
->af_group
[afi
][safi
])
5032 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
5035 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
5036 if (! peer_group_active (peer
)
5037 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
5038 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
5040 if (peer
->allowas_in
[afi
][safi
] == 3)
5041 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
5043 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
5044 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
5048 bgp_config_write_filter (vty
, peer
, afi
, safi
);
5050 /* atribute-unchanged. */
5051 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5052 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5053 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5054 && ! peer
->af_group
[afi
][safi
])
5056 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5057 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5058 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5059 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
5061 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
5062 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
5064 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
5066 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
5067 " med" : "", VTY_NEWLINE
);
5071 /* Display "address-family" configuration header. */
5073 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
5079 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5082 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
5086 if (safi
== SAFI_MULTICAST
)
5087 vty_out (vty
, "ipv4 multicast");
5088 else if (safi
== SAFI_MPLS_VPN
)
5089 vty_out (vty
, "vpnv4 unicast");
5091 else if (afi
== AFI_IP6
)
5093 vty_out (vty
, "ipv6");
5095 if (safi
== SAFI_MULTICAST
)
5096 vty_out (vty
, " multicast");
5099 vty_out (vty
, "%s", VTY_NEWLINE
);
5104 /* Address family based peer configuration display. */
5106 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
5111 struct peer_group
*group
;
5112 struct listnode
*node
, *nnode
;
5114 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
5116 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
5118 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5120 if (group
->conf
->afc
[afi
][safi
])
5122 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5123 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
5126 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5128 if (peer
->afc
[afi
][safi
])
5130 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5132 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5133 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
5138 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
5141 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
5147 bgp_config_write (struct vty
*vty
)
5151 struct peer_group
*group
;
5153 struct listnode
*node
, *nnode
;
5154 struct listnode
*mnode
, *mnnode
;
5156 /* BGP Multiple instance. */
5157 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5159 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
5163 /* BGP Config type. */
5164 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5166 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
5170 /* BGP configuration. */
5171 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5174 vty_out (vty
, "!%s", VTY_NEWLINE
);
5176 /* Router bgp ASN */
5177 vty_out (vty
, "router bgp %u", bgp
->as
);
5179 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5182 vty_out (vty
, " view %s", bgp
->name
);
5184 vty_out (vty
, "%s", VTY_NEWLINE
);
5186 /* No Synchronization */
5187 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5188 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
5190 /* BGP fast-external-failover. */
5191 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
5192 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
5194 /* BGP router ID. */
5195 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
5196 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
5199 /* BGP log-neighbor-changes. */
5200 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
5201 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
5203 /* BGP configuration. */
5204 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
5205 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
5207 /* BGP default ipv4-unicast. */
5208 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5209 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
5211 /* BGP default local-preference. */
5212 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
5213 vty_out (vty
, " bgp default local-preference %d%s",
5214 bgp
->default_local_pref
, VTY_NEWLINE
);
5216 /* BGP client-to-client reflection. */
5217 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
5218 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
5220 /* BGP cluster ID. */
5221 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
5222 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
5225 /* Confederation identifier*/
5226 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
5227 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
5230 /* Confederation peer */
5231 if (bgp
->confed_peers_cnt
> 0)
5235 vty_out (vty
, " bgp confederation peers");
5237 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
5238 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
5240 vty_out (vty
, "%s", VTY_NEWLINE
);
5243 /* BGP enforce-first-as. */
5244 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
5245 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
5247 /* BGP deterministic-med. */
5248 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
5249 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
5251 /* BGP graceful-restart. */
5252 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
5253 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
5254 bgp
->stalepath_time
, VTY_NEWLINE
);
5255 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
5256 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
5258 /* BGP bestpath method. */
5259 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
5260 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
5261 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
5262 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
5263 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
5264 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
5265 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
5266 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5268 vty_out (vty
, " bgp bestpath med");
5269 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
5270 vty_out (vty
, " confed");
5271 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5272 vty_out (vty
, " missing-as-worst");
5273 vty_out (vty
, "%s", VTY_NEWLINE
);
5276 /* BGP network import check. */
5277 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
5278 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
5280 /* BGP scan interval. */
5281 bgp_config_write_scan_time (vty
);
5283 /* BGP flag dampening. */
5284 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
5285 BGP_CONFIG_DAMPENING
))
5286 bgp_config_write_damp (vty
);
5288 /* BGP static route configuration. */
5289 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5291 /* BGP redistribute configuration. */
5292 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5294 /* BGP timers configuration. */
5295 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
5296 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
5297 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
5298 bgp
->default_holdtime
, VTY_NEWLINE
);
5301 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5303 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
5306 /* Normal neighbor configuration. */
5307 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5309 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
5310 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
5314 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5316 /* Distance configuration. */
5317 bgp_config_write_distance (vty
, bgp
);
5319 /* No auto-summary */
5320 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5321 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
5323 /* IPv4 multicast configuration. */
5324 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
5326 /* IPv4 VPN configuration. */
5327 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
5329 /* IPv6 unicast configuration. */
5330 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
5332 /* IPv6 multicast configuration. */
5333 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
5341 bgp_master_init (void)
5343 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
5346 bm
->bgp
= list_new ();
5347 bm
->listen_sockets
= list_new ();
5348 bm
->port
= BGP_PORT_DEFAULT
;
5349 bm
->master
= thread_master_create ();
5350 bm
->start_time
= bgp_clock ();
5357 /* BGP VTY commands installation. */
5368 bgp_route_map_init ();
5369 bgp_address_init ();
5371 bgp_mplsvpn_init ();
5373 /* Access list initialize. */
5374 access_list_init ();
5375 access_list_add_hook (peer_distribute_update
);
5376 access_list_delete_hook (peer_distribute_update
);
5378 /* Filter list initialize. */
5380 as_list_add_hook (peer_aslist_update
);
5381 as_list_delete_hook (peer_aslist_update
);
5383 /* Prefix list initialize.*/
5384 prefix_list_init ();
5385 prefix_list_add_hook (peer_prefix_list_update
);
5386 prefix_list_delete_hook (peer_prefix_list_update
);
5388 /* Community list initialize. */
5389 bgp_clist
= community_list_init ();
5393 #endif /* HAVE_SNMP */
5397 bgp_terminate (void)
5401 struct listnode
*node
, *nnode
;
5402 struct listnode
*mnode
, *mnnode
;
5404 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5405 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5406 if (peer
->status
== Established
)
5407 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5408 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
5410 bgp_cleanup_routes ();
5412 if (bm
->process_main_queue
)
5414 work_queue_free (bm
->process_main_queue
);
5415 bm
->process_main_queue
= NULL
;
5417 if (bm
->process_rsclient_queue
)
5419 work_queue_free (bm
->process_rsclient_queue
);
5420 bm
->process_rsclient_queue
= NULL
;