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
;
78 bgp_session_reset(struct peer
*peer
)
80 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
81 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
82 peer_delete(peer
->doppelganger
);
84 BGP_EVENT_ADD (peer
, BGP_Stop
);
88 * During session reset, we may delete the doppelganger peer, which would
89 * be the next node to the current node. If the session reset was invoked
90 * during walk of peer list, we would end up accessing the freed next
91 * node. This function moves the next node along.
94 bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
99 n
= (nnode
) ? *nnode
: NULL
;
100 npeer
= (n
) ? listgetdata(n
) : NULL
;
102 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
103 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
105 if (peer
->doppelganger
== npeer
)
106 /* nnode and *nnode are confirmed to be non-NULL here */
107 *nnode
= (*nnode
)->next
;
108 peer_delete(peer
->doppelganger
);
111 BGP_EVENT_ADD (peer
, BGP_Stop
);
114 /* BGP global flag manipulation. */
116 bgp_option_set (int flag
)
121 case BGP_OPT_MULTIPLE_INSTANCE
:
122 case BGP_OPT_CONFIG_CISCO
:
123 case BGP_OPT_NO_LISTEN
:
124 SET_FLAG (bm
->options
, flag
);
127 return BGP_ERR_INVALID_FLAG
;
133 bgp_option_unset (int flag
)
137 case BGP_OPT_MULTIPLE_INSTANCE
:
138 if (listcount (bm
->bgp
) > 1)
139 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
142 case BGP_OPT_CONFIG_CISCO
:
143 UNSET_FLAG (bm
->options
, flag
);
146 return BGP_ERR_INVALID_FLAG
;
152 bgp_option_check (int flag
)
154 return CHECK_FLAG (bm
->options
, flag
);
157 /* BGP flag manipulation. */
159 bgp_flag_set (struct bgp
*bgp
, int flag
)
161 SET_FLAG (bgp
->flags
, flag
);
166 bgp_flag_unset (struct bgp
*bgp
, int flag
)
168 UNSET_FLAG (bgp
->flags
, flag
);
173 bgp_flag_check (struct bgp
*bgp
, int flag
)
175 return CHECK_FLAG (bgp
->flags
, flag
);
178 /* Internal function to set BGP structure configureation flag. */
180 bgp_config_set (struct bgp
*bgp
, int config
)
182 SET_FLAG (bgp
->config
, config
);
186 bgp_config_unset (struct bgp
*bgp
, int config
)
188 UNSET_FLAG (bgp
->config
, config
);
192 bgp_config_check (struct bgp
*bgp
, int config
)
194 return CHECK_FLAG (bgp
->config
, config
);
197 /* Set BGP router identifier. */
199 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
202 struct listnode
*node
, *nnode
;
204 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
205 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
208 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
209 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
211 /* Set all peer's local identifier with this value. */
212 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
214 IPV4_ADDR_COPY (&peer
->local_id
, id
);
216 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
218 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
219 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
220 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
226 /* BGP's cluster-id control. */
228 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
231 struct listnode
*node
, *nnode
;
233 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
234 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
237 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
238 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
240 /* Clear all IBGP peer. */
241 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
243 if (peer
->sort
!= BGP_PEER_IBGP
)
246 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
248 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
249 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
250 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
257 bgp_cluster_id_unset (struct bgp
*bgp
)
260 struct listnode
*node
, *nnode
;
262 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
265 bgp
->cluster_id
.s_addr
= 0;
266 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
268 /* Clear all IBGP peer. */
269 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
271 if (peer
->sort
!= BGP_PEER_IBGP
)
274 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
276 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
277 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
278 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
284 /* time_t value that is monotonicly increasing
285 * and uneffected by adjustments to system clock
287 time_t bgp_clock (void)
291 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
295 /* BGP timer configuration. */
297 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
299 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
300 ? keepalive
: holdtime
/ 3);
301 bgp
->default_holdtime
= holdtime
;
307 bgp_timers_unset (struct bgp
*bgp
)
309 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
310 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
315 /* BGP confederation configuration. */
317 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
320 struct listnode
*node
, *nnode
;
324 return BGP_ERR_INVALID_AS
;
326 /* Remember - were we doing confederation before? */
327 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
329 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
331 /* If we were doing confederation already, this is just an external
332 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
333 were not doing confederation before, reset all EBGP sessions. */
334 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
336 /* We're looking for peers who's AS is not local or part of our
340 if (peer_sort (peer
) == BGP_PEER_EBGP
)
343 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
345 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
346 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
347 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
350 bgp_session_reset_safe(peer
, &nnode
);
355 /* Not doign confederation before, so reset every non-local
357 if (peer_sort (peer
) != BGP_PEER_IBGP
)
359 /* Reset the local_as to be our EBGP one */
360 if (peer_sort (peer
) == BGP_PEER_EBGP
)
362 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
364 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
365 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
366 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
369 bgp_session_reset_safe(peer
, &nnode
);
377 bgp_confederation_id_unset (struct bgp
*bgp
)
380 struct listnode
*node
, *nnode
;
383 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
385 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
387 /* We're looking for peers who's AS is not local */
388 if (peer_sort (peer
) != BGP_PEER_IBGP
)
390 peer
->local_as
= bgp
->as
;
391 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
393 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
394 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
395 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
399 bgp_session_reset_safe(peer
, &nnode
);
405 /* Is an AS part of the confed or not? */
407 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
414 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
415 if (bgp
->confed_peers
[i
] == as
)
421 /* Add an AS to the confederation set. */
423 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
426 struct listnode
*node
, *nnode
;
429 return BGP_ERR_INVALID_BGP
;
432 return BGP_ERR_INVALID_AS
;
434 if (bgp_confederation_peers_check (bgp
, as
))
437 if (bgp
->confed_peers
)
438 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
440 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
442 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
443 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
445 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
446 bgp
->confed_peers_cnt
++;
448 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
450 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
454 peer
->local_as
= bgp
->as
;
455 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
457 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
458 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
459 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
462 bgp_session_reset_safe(peer
, &nnode
);
469 /* Delete an AS from the confederation set. */
471 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
476 struct listnode
*node
, *nnode
;
481 if (! bgp_confederation_peers_check (bgp
, as
))
484 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
485 if (bgp
->confed_peers
[i
] == as
)
486 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
487 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
489 bgp
->confed_peers_cnt
--;
491 if (bgp
->confed_peers_cnt
== 0)
493 if (bgp
->confed_peers
)
494 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
495 bgp
->confed_peers
= NULL
;
498 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
500 bgp
->confed_peers_cnt
* sizeof (as_t
));
502 /* Now reset any peer who's remote AS has just been removed from the
504 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
506 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
510 peer
->local_as
= bgp
->confed_id
;
511 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
513 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
514 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
515 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
518 bgp_session_reset_safe(peer
, &nnode
);
526 /* Local preference configuration. */
528 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
533 bgp
->default_local_pref
= local_pref
;
539 bgp_default_local_preference_unset (struct bgp
*bgp
)
544 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
549 /* If peer is RSERVER_CLIENT in at least one address family and is not member
550 of a peer_group for that family, return 1.
551 Used to check wether the peer is included in list bgp->rsclient. */
553 peer_rsclient_active (struct peer
*peer
)
558 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
559 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
560 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
561 && ! peer
->af_group
[i
][j
])
566 /* Peer comparison function for sorting. */
568 peer_cmp (struct peer
*p1
, struct peer
*p2
)
570 return sockunion_cmp (&p1
->su
, &p2
->su
);
574 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
576 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
579 /* Reset all address family specific configuration. */
581 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
584 struct bgp_filter
*filter
;
585 char orf_name
[BUFSIZ
];
587 filter
= &peer
->filter
[afi
][safi
];
589 /* Clear neighbor filter and route-map */
590 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
592 if (filter
->dlist
[i
].name
)
594 free (filter
->dlist
[i
].name
);
595 filter
->dlist
[i
].name
= NULL
;
597 if (filter
->plist
[i
].name
)
599 free (filter
->plist
[i
].name
);
600 filter
->plist
[i
].name
= NULL
;
602 if (filter
->aslist
[i
].name
)
604 free (filter
->aslist
[i
].name
);
605 filter
->aslist
[i
].name
= NULL
;
608 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
610 if (filter
->map
[i
].name
)
612 free (filter
->map
[i
].name
);
613 filter
->map
[i
].name
= NULL
;
617 /* Clear unsuppress map. */
618 if (filter
->usmap
.name
)
619 free (filter
->usmap
.name
);
620 filter
->usmap
.name
= NULL
;
621 filter
->usmap
.map
= NULL
;
623 /* Clear neighbor's all address family flags. */
624 peer
->af_flags
[afi
][safi
] = 0;
626 /* Clear neighbor's all address family sflags. */
627 peer
->af_sflags
[afi
][safi
] = 0;
629 /* Clear neighbor's all address family capabilities. */
630 peer
->af_cap
[afi
][safi
] = 0;
633 peer
->orf_plist
[afi
][safi
] = NULL
;
634 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
635 prefix_bgp_orf_remove_all (orf_name
);
637 /* Set default neighbor send-community. */
638 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
640 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
641 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
644 /* Clear neighbor default_originate_rmap */
645 if (peer
->default_rmap
[afi
][safi
].name
)
646 free (peer
->default_rmap
[afi
][safi
].name
);
647 peer
->default_rmap
[afi
][safi
].name
= NULL
;
648 peer
->default_rmap
[afi
][safi
].map
= NULL
;
650 /* Clear neighbor maximum-prefix */
651 peer
->pmax
[afi
][safi
] = 0;
652 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
655 /* peer global config reset */
657 peer_global_config_reset (struct peer
*peer
)
660 peer
->change_local_as
= 0;
661 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
662 if (peer
->update_source
)
664 sockunion_free (peer
->update_source
);
665 peer
->update_source
= NULL
;
669 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
670 peer
->update_if
= NULL
;
673 if (peer_sort (peer
) == BGP_PEER_IBGP
)
674 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
676 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
683 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
686 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
687 static bgp_peer_sort_t
688 peer_calc_sort (struct peer
*peer
)
695 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
698 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
702 peer1
= listnode_head (peer
->group
->peer
);
704 return (peer1
->local_as
== peer1
->as
705 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
707 return BGP_PEER_INTERNAL
;
711 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
713 if (peer
->local_as
== 0)
714 return BGP_PEER_INTERNAL
;
716 if (peer
->local_as
== peer
->as
)
718 if (peer
->local_as
== bgp
->confed_id
)
719 return BGP_PEER_EBGP
;
721 return BGP_PEER_IBGP
;
724 if (bgp_confederation_peers_check (bgp
, peer
->as
))
725 return BGP_PEER_CONFED
;
727 return BGP_PEER_EBGP
;
731 return (peer
->local_as
== 0
732 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
733 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
737 /* Calculate and cache the peer "sort" */
739 peer_sort (struct peer
*peer
)
741 peer
->sort
= peer_calc_sort (peer
);
746 peer_free (struct peer
*peer
)
748 assert (peer
->status
== Deleted
);
750 bgp_unlock(peer
->bgp
);
752 /* this /ought/ to have been done already through bgp_stop earlier,
753 * but just to be sure..
755 bgp_timer_set (peer
);
756 BGP_READ_OFF (peer
->t_read
);
757 BGP_WRITE_OFF (peer
->t_write
);
758 BGP_EVENT_FLUSH (peer
);
761 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
763 /* Free allocated host character. */
765 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
767 /* Update source configuration. */
768 if (peer
->update_source
)
769 sockunion_free (peer
->update_source
);
772 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
774 if (peer
->clear_node_queue
)
775 work_queue_free (peer
->clear_node_queue
);
777 bgp_sync_delete (peer
);
780 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
782 memset (peer
, 0, sizeof (struct peer
));
784 XFREE (MTYPE_BGP_PEER
, peer
);
787 /* increase reference count on a struct peer */
789 peer_lock (struct peer
*peer
)
791 assert (peer
&& (peer
->lock
>= 0));
798 /* decrease reference count on a struct peer
799 * struct peer is freed and NULL returned if last reference
802 peer_unlock (struct peer
*peer
)
804 assert (peer
&& (peer
->lock
> 0));
811 zlog_debug ("unlocked and freeing");
812 zlog_backtrace (LOG_DEBUG
);
821 zlog_debug ("unlocked to 1");
822 zlog_backtrace (LOG_DEBUG
);
829 /* Allocate new peer object, implicitely locked. */
831 peer_new (struct bgp
*bgp
)
838 /* bgp argument is absolutely required */
843 /* Allocate new peer. */
844 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
846 /* Set default value. */
848 peer
->v_start
= BGP_INIT_START_TIMER
;
849 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
850 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
852 peer
->ostatus
= Idle
;
854 peer
= peer_lock (peer
); /* initial reference */
857 peer
->password
= NULL
;
859 /* Set default flags. */
860 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
861 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
863 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
865 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
866 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
868 peer
->orf_plist
[afi
][safi
] = NULL
;
870 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
872 /* Create buffers. */
873 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
874 peer
->obuf
= stream_fifo_new ();
875 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
);
876 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
879 bgp_sync_init (peer
);
881 /* Get service port number. */
882 sp
= getservbyname ("bgp", "tcp");
883 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
889 * This function is invoked when a duplicate peer structure associated with
890 * a neighbor is being deleted. If this about-to-be-deleted structure is
891 * the one with all the config, then we have to copy over the info.
894 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
902 /* The following function is used by both peer group config copy to
903 * individual peer and when we transfer config
905 if (peer_src
->change_local_as
)
906 peer_dst
->change_local_as
= peer_src
->change_local_as
;
908 /* peer flags apply */
909 peer_dst
->flags
= peer_src
->flags
;
910 peer_dst
->cap
= peer_src
->cap
;
911 peer_dst
->config
= peer_src
->config
;
913 peer_dst
->local_as
= peer_src
->local_as
;
914 peer_dst
->ifindex
= peer_src
->ifindex
;
915 peer_dst
->port
= peer_src
->port
;
917 peer_dst
->rmap_type
= peer_src
->rmap_type
;
920 peer_dst
->holdtime
= peer_src
->holdtime
;
921 peer_dst
->keepalive
= peer_src
->keepalive
;
922 peer_dst
->connect
= peer_src
->connect
;
923 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
924 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
925 peer_dst
->v_asorig
= peer_src
->v_asorig
;
926 peer_dst
->routeadv
= peer_src
->routeadv
;
927 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
930 if (peer_src
->password
&& !peer_dst
->password
)
931 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
933 bgp_md5_set (peer_dst
);
935 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
936 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
938 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
939 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
940 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
943 /* update-source apply */
944 if (peer_src
->update_source
)
946 if (peer_dst
->update_source
)
947 sockunion_free (peer_dst
->update_source
);
948 if (peer_dst
->update_if
)
950 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
951 peer_dst
->update_if
= NULL
;
953 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
955 else if (peer_src
->update_if
)
957 if (peer_dst
->update_if
)
958 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
959 if (peer_dst
->update_source
)
961 sockunion_free (peer_dst
->update_source
);
962 peer_dst
->update_source
= NULL
;
964 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
967 if (peer_src
->ifname
)
969 if (peer_dst
->ifname
)
970 free(peer_dst
->ifname
);
972 peer_dst
->ifname
= strdup(peer_src
->ifname
);
977 * Set or reset the peer address socketunion structure based on the
978 * learnt peer address. Currently via the source address of the
979 * ipv6 ND router-advertisement.
982 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
984 struct interface
*ifp
;
985 struct nbr_connected
*ifc
;
990 if ((ifp
= if_lookup_by_name(peer
->conf_if
)) &&
991 ifp
->nbr_connected
&&
992 (ifc
= listnode_head(ifp
->nbr_connected
)))
994 peer
->su
.sa
.sa_family
= AF_INET6
;
995 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc
->address
->u
.prefix
,
996 sizeof (struct in6_addr
));
998 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1003 /* This works as an indication of unresolved peer address
1004 on a BGP interface*/
1005 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1006 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1010 /* Create new BGP peer. */
1012 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1013 as_t local_as
, as_t remote_as
, afi_t afi
, safi_t safi
)
1017 char buf
[SU_ADDRSTRLEN
];
1019 peer
= peer_new (bgp
);
1022 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1023 bgp_peer_conf_if_to_su_update(peer
);
1024 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1029 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1030 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1032 peer
->local_as
= local_as
;
1033 peer
->as
= remote_as
;
1034 peer
->local_id
= bgp
->router_id
;
1035 peer
->v_holdtime
= bgp
->default_holdtime
;
1036 peer
->v_keepalive
= bgp
->default_keepalive
;
1037 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1038 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1040 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1042 peer
= peer_lock (peer
); /* bgp peer list reference */
1043 listnode_add_sort (bgp
->peer
, peer
);
1045 active
= peer_active (peer
);
1048 peer
->afc
[afi
][safi
] = 1;
1050 /* Last read and reset time set */
1051 peer
->readtime
= peer
->resettime
= bgp_clock ();
1053 /* Default TTL set. */
1054 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1056 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1058 /* Set up peer's events and timers. */
1059 if (! active
&& peer_active (peer
))
1060 bgp_timer_set (peer
);
1066 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1071 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1074 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1075 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1076 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, 0, 0);
1078 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, afi
, safi
);
1085 /* Make accept BGP peer. Called from bgp_accept (). */
1087 peer_create_accept (struct bgp
*bgp
)
1091 peer
= peer_new (bgp
);
1093 peer
= peer_lock (peer
); /* bgp peer list reference */
1094 listnode_add_sort (bgp
->peer
, peer
);
1099 /* Change peer's AS number. */
1101 peer_as_change (struct peer
*peer
, as_t as
)
1103 bgp_peer_sort_t type
;
1107 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1109 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1111 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1112 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1113 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1116 bgp_session_reset(peer
);
1118 type
= peer_sort (peer
);
1121 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1122 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1123 && peer
->bgp
->as
!= as
)
1124 peer
->local_as
= peer
->bgp
->confed_id
;
1126 peer
->local_as
= peer
->bgp
->as
;
1128 /* Advertisement-interval reset */
1131 conf
= peer
->group
->conf
;
1133 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1134 peer
->v_routeadv
= conf
->routeadv
;
1136 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1137 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1139 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1142 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1144 else if (type
== BGP_PEER_IBGP
)
1147 /* reflector-client reset */
1148 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1150 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1151 PEER_FLAG_REFLECTOR_CLIENT
);
1152 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1153 PEER_FLAG_REFLECTOR_CLIENT
);
1154 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1155 PEER_FLAG_REFLECTOR_CLIENT
);
1156 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1157 PEER_FLAG_REFLECTOR_CLIENT
);
1158 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1159 PEER_FLAG_REFLECTOR_CLIENT
);
1162 /* local-as reset */
1163 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1165 peer
->change_local_as
= 0;
1166 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1167 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1171 /* If peer does not exist, create new one. If peer already exists,
1172 set AS number to the peer. */
1174 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
, as_t
*as
,
1175 afi_t afi
, safi_t safi
)
1181 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1183 peer
= peer_lookup (bgp
, su
);
1187 /* When this peer is a member of peer-group. */
1190 if (peer
->group
->conf
->as
)
1192 /* Return peer group's AS number. */
1193 *as
= peer
->group
->conf
->as
;
1194 return BGP_ERR_PEER_GROUP_MEMBER
;
1196 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1201 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1209 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1214 /* Existing peer's AS number change. */
1215 if (peer
->as
!= *as
)
1216 peer_as_change (peer
, *as
);
1221 return BGP_ERR_NO_INTERFACE_CONFIG
;
1223 /* If the peer is not part of our confederation, and its not an
1224 iBGP peer then spoof the source AS */
1225 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1226 && ! bgp_confederation_peers_check (bgp
, *as
)
1228 local_as
= bgp
->confed_id
;
1232 /* If this is IPv4 unicast configuration and "no bgp default
1233 ipv4-unicast" is specified. */
1235 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1236 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1237 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, 0, 0);
1239 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, afi
, safi
);
1245 /* Activate the peer or peer group for specified AFI and SAFI. */
1247 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1251 if (peer
->afc
[afi
][safi
])
1254 /* Activate the address family configuration. */
1255 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1256 peer
->afc
[afi
][safi
] = 1;
1259 active
= peer_active (peer
);
1261 peer
->afc
[afi
][safi
] = 1;
1263 if (! active
&& peer_active (peer
))
1264 bgp_timer_set (peer
);
1267 if (peer
->status
== Established
)
1269 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1271 peer
->afc_adv
[afi
][safi
] = 1;
1272 bgp_capability_send (peer
, afi
, safi
,
1274 CAPABILITY_ACTION_SET
);
1275 if (peer
->afc_recv
[afi
][safi
])
1277 peer
->afc_nego
[afi
][safi
] = 1;
1278 bgp_announce_route (peer
, afi
, safi
);
1283 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1284 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1285 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1294 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1296 struct peer_group
*group
;
1298 struct listnode
*node
, *nnode
;
1300 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1302 group
= peer
->group
;
1304 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1306 if (peer1
->af_group
[afi
][safi
])
1307 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1312 if (peer
->af_group
[afi
][safi
])
1313 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1316 if (! peer
->afc
[afi
][safi
])
1319 /* De-activate the address family configuration. */
1320 peer
->afc
[afi
][safi
] = 0;
1321 peer_af_flag_reset (peer
, afi
, safi
);
1323 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1325 if (peer
->status
== Established
)
1327 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1329 peer
->afc_adv
[afi
][safi
] = 0;
1330 peer
->afc_nego
[afi
][safi
] = 0;
1332 if (peer_active_nego (peer
))
1334 bgp_capability_send (peer
, afi
, safi
,
1336 CAPABILITY_ACTION_UNSET
);
1337 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1338 peer
->pcount
[afi
][safi
] = 0;
1342 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1343 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1344 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1349 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1350 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1351 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1359 peer_nsf_stop (struct peer
*peer
)
1364 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1365 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1367 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1368 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1369 peer
->nsf
[afi
][safi
] = 0;
1371 if (peer
->t_gr_restart
)
1373 BGP_TIMER_OFF (peer
->t_gr_restart
);
1374 if (BGP_DEBUG (events
, EVENTS
))
1375 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1377 if (peer
->t_gr_stale
)
1379 BGP_TIMER_OFF (peer
->t_gr_stale
);
1380 if (BGP_DEBUG (events
, EVENTS
))
1381 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1383 bgp_clear_route_all (peer
);
1386 /* Delete peer from confguration.
1388 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1389 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1391 * This function /should/ take care to be idempotent, to guard against
1392 * it being called multiple times through stray events that come in
1393 * that happen to result in this function being called again. That
1394 * said, getting here for a "Deleted" peer is a bug in the neighbour
1398 peer_delete (struct peer
*peer
)
1404 struct bgp_filter
*filter
;
1405 struct listnode
*pn
;
1407 assert (peer
->status
!= Deleted
);
1411 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1412 peer_nsf_stop (peer
);
1414 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1416 /* If this peer belongs to peer group, clear up the
1420 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1422 peer
= peer_unlock (peer
); /* group->peer list reference */
1423 list_delete_node (peer
->group
->peer
, pn
);
1428 /* Withdraw all information from routing table. We can not use
1429 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1430 * executed after peer structure is deleted.
1432 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1434 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1436 if (peer
->doppelganger
)
1437 peer
->doppelganger
->doppelganger
= NULL
;
1438 peer
->doppelganger
= NULL
;
1440 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1441 bgp_fsm_change_status (peer
, Deleted
);
1443 /* Password configuration */
1446 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1447 peer
->password
= NULL
;
1449 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1453 bgp_timer_set (peer
); /* stops all timers for Deleted */
1455 /* Delete from all peer list. */
1456 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1457 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1459 peer_unlock (peer
); /* bgp peer list reference */
1460 list_delete_node (bgp
->peer
, pn
);
1463 if (peer_rsclient_active (peer
)
1464 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1466 peer_unlock (peer
); /* rsclient list reference */
1467 list_delete_node (bgp
->rsclient
, pn
);
1469 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1471 /* Clear our own rsclient ribs. */
1472 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1473 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1474 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1475 PEER_FLAG_RSERVER_CLIENT
))
1476 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1480 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1481 member of a peer_group. */
1482 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1483 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1484 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1485 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1489 stream_free (peer
->ibuf
);
1491 stream_fifo_free (peer
->obuf
);
1493 stream_free (peer
->work
);
1495 stream_free(peer
->scratch
);
1497 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1499 /* Local and remote addresses. */
1501 sockunion_free (peer
->su_local
);
1502 if (peer
->su_remote
)
1503 sockunion_free (peer
->su_remote
);
1504 peer
->su_local
= peer
->su_remote
= NULL
;
1506 /* Free filter related memory. */
1507 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1508 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1510 filter
= &peer
->filter
[afi
][safi
];
1512 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1514 if (filter
->dlist
[i
].name
)
1515 free (filter
->dlist
[i
].name
);
1516 if (filter
->plist
[i
].name
)
1517 free (filter
->plist
[i
].name
);
1518 if (filter
->aslist
[i
].name
)
1519 free (filter
->aslist
[i
].name
);
1521 filter
->dlist
[i
].name
= NULL
;
1522 filter
->plist
[i
].name
= NULL
;
1523 filter
->aslist
[i
].name
= NULL
;
1525 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1527 if (filter
->map
[i
].name
)
1528 free (filter
->map
[i
].name
);
1529 filter
->map
[i
].name
= NULL
;
1532 if (filter
->usmap
.name
)
1533 free (filter
->usmap
.name
);
1535 if (peer
->default_rmap
[afi
][safi
].name
)
1536 free (peer
->default_rmap
[afi
][safi
].name
);
1538 filter
->usmap
.name
= NULL
;
1539 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1542 peer_unlock (peer
); /* initial reference */
1548 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1550 return strcmp (g1
->name
, g2
->name
);
1553 /* If peer is configured at least one address family return 1. */
1555 peer_group_active (struct peer
*peer
)
1557 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1558 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1559 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1560 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1561 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1566 /* Peer group cofiguration. */
1567 static struct peer_group
*
1568 peer_group_new (void)
1570 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1571 sizeof (struct peer_group
));
1575 peer_group_free (struct peer_group
*group
)
1577 XFREE (MTYPE_PEER_GROUP
, group
);
1581 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1583 struct peer_group
*group
;
1584 struct listnode
*node
, *nnode
;
1586 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1588 if (strcmp (group
->name
, name
) == 0)
1595 peer_group_get (struct bgp
*bgp
, const char *name
)
1597 struct peer_group
*group
;
1599 group
= peer_group_lookup (bgp
, name
);
1603 group
= peer_group_new ();
1605 group
->name
= strdup (name
);
1606 group
->peer
= list_new ();
1607 group
->conf
= peer_new (bgp
);
1608 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1609 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1610 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1611 group
->conf
->group
= group
;
1612 group
->conf
->as
= 0;
1613 group
->conf
->ttl
= 1;
1614 group
->conf
->gtsm_hops
= 0;
1615 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1616 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1617 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1618 group
->conf
->keepalive
= 0;
1619 group
->conf
->holdtime
= 0;
1620 group
->conf
->connect
= 0;
1621 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1622 listnode_add_sort (bgp
->group
, group
);
1628 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1629 afi_t afi
, safi_t safi
)
1632 int out
= FILTER_OUT
;
1634 struct bgp_filter
*pfilter
;
1635 struct bgp_filter
*gfilter
;
1638 pfilter
= &peer
->filter
[afi
][safi
];
1639 gfilter
= &conf
->filter
[afi
][safi
];
1643 peer
->as
= conf
->as
;
1646 if (conf
->change_local_as
)
1647 peer
->change_local_as
= conf
->change_local_as
;
1650 peer
->ttl
= conf
->ttl
;
1653 peer
->gtsm_hops
= conf
->gtsm_hops
;
1656 peer
->weight
= conf
->weight
;
1658 /* peer flags apply */
1659 peer
->flags
= conf
->flags
;
1660 /* peer af_flags apply */
1661 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1662 /* peer config apply */
1663 peer
->config
= conf
->config
;
1665 /* peer timers apply */
1666 peer
->holdtime
= conf
->holdtime
;
1667 peer
->keepalive
= conf
->keepalive
;
1668 peer
->connect
= conf
->connect
;
1669 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1670 peer
->v_connect
= conf
->connect
;
1672 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1674 /* advertisement-interval reset */
1675 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1676 peer
->v_routeadv
= conf
->routeadv
;
1678 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1679 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1681 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1683 /* password apply */
1684 if (conf
->password
&& !peer
->password
)
1685 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1689 /* maximum-prefix */
1690 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1691 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1692 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1695 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1697 /* route-server-client */
1698 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1700 /* Make peer's RIB point to group's RIB. */
1701 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1703 /* Import policy. */
1704 if (pfilter
->map
[RMAP_IMPORT
].name
)
1705 free (pfilter
->map
[RMAP_IMPORT
].name
);
1706 if (gfilter
->map
[RMAP_IMPORT
].name
)
1708 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1709 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1713 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1714 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1717 /* Export policy. */
1718 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1720 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1721 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1725 /* default-originate route-map */
1726 if (conf
->default_rmap
[afi
][safi
].name
)
1728 if (peer
->default_rmap
[afi
][safi
].name
)
1729 free (peer
->default_rmap
[afi
][safi
].name
);
1730 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1731 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1734 /* update-source apply */
1735 if (conf
->update_source
)
1737 if (peer
->update_source
)
1738 sockunion_free (peer
->update_source
);
1739 if (peer
->update_if
)
1741 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1742 peer
->update_if
= NULL
;
1744 peer
->update_source
= sockunion_dup (conf
->update_source
);
1746 else if (conf
->update_if
)
1748 if (peer
->update_if
)
1749 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1750 if (peer
->update_source
)
1752 sockunion_free (peer
->update_source
);
1753 peer
->update_source
= NULL
;
1755 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1758 /* inbound filter apply */
1759 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1761 if (pfilter
->dlist
[in
].name
)
1762 free (pfilter
->dlist
[in
].name
);
1763 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1764 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1766 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1768 if (pfilter
->plist
[in
].name
)
1769 free (pfilter
->plist
[in
].name
);
1770 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1771 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1773 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1775 if (pfilter
->aslist
[in
].name
)
1776 free (pfilter
->aslist
[in
].name
);
1777 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1778 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1780 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1782 if (pfilter
->map
[RMAP_IN
].name
)
1783 free (pfilter
->map
[RMAP_IN
].name
);
1784 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
1785 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
1788 /* outbound filter apply */
1789 if (gfilter
->dlist
[out
].name
)
1791 if (pfilter
->dlist
[out
].name
)
1792 free (pfilter
->dlist
[out
].name
);
1793 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1794 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1798 if (pfilter
->dlist
[out
].name
)
1799 free (pfilter
->dlist
[out
].name
);
1800 pfilter
->dlist
[out
].name
= NULL
;
1801 pfilter
->dlist
[out
].alist
= NULL
;
1803 if (gfilter
->plist
[out
].name
)
1805 if (pfilter
->plist
[out
].name
)
1806 free (pfilter
->plist
[out
].name
);
1807 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1808 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1812 if (pfilter
->plist
[out
].name
)
1813 free (pfilter
->plist
[out
].name
);
1814 pfilter
->plist
[out
].name
= NULL
;
1815 pfilter
->plist
[out
].plist
= NULL
;
1817 if (gfilter
->aslist
[out
].name
)
1819 if (pfilter
->aslist
[out
].name
)
1820 free (pfilter
->aslist
[out
].name
);
1821 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1822 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1826 if (pfilter
->aslist
[out
].name
)
1827 free (pfilter
->aslist
[out
].name
);
1828 pfilter
->aslist
[out
].name
= NULL
;
1829 pfilter
->aslist
[out
].aslist
= NULL
;
1831 if (gfilter
->map
[RMAP_OUT
].name
)
1833 if (pfilter
->map
[RMAP_OUT
].name
)
1834 free (pfilter
->map
[RMAP_OUT
].name
);
1835 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
1836 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
1840 if (pfilter
->map
[RMAP_OUT
].name
)
1841 free (pfilter
->map
[RMAP_OUT
].name
);
1842 pfilter
->map
[RMAP_OUT
].name
= NULL
;
1843 pfilter
->map
[RMAP_OUT
].map
= NULL
;
1846 /* RS-client's import/export route-maps. */
1847 if (gfilter
->map
[RMAP_IMPORT
].name
)
1849 if (pfilter
->map
[RMAP_IMPORT
].name
)
1850 free (pfilter
->map
[RMAP_IMPORT
].name
);
1851 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1852 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1856 if (pfilter
->map
[RMAP_IMPORT
].name
)
1857 free (pfilter
->map
[RMAP_IMPORT
].name
);
1858 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1859 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1861 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1863 if (pfilter
->map
[RMAP_EXPORT
].name
)
1864 free (pfilter
->map
[RMAP_EXPORT
].name
);
1865 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1866 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1869 if (gfilter
->usmap
.name
)
1871 if (pfilter
->usmap
.name
)
1872 free (pfilter
->usmap
.name
);
1873 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1874 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1878 if (pfilter
->usmap
.name
)
1879 free (pfilter
->usmap
.name
);
1880 pfilter
->usmap
.name
= NULL
;
1881 pfilter
->usmap
.map
= NULL
;
1885 /* Peer group's remote AS configuration. */
1887 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
, as_t
*as
)
1889 struct peer_group
*group
;
1891 struct listnode
*node
, *nnode
;
1893 group
= peer_group_lookup (bgp
, group_name
);
1897 if (group
->conf
->as
== *as
)
1900 /* When we setup peer-group AS number all peer group member's AS
1901 number must be updated to same number. */
1902 peer_as_change (group
->conf
, *as
);
1904 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1906 if (peer
->as
!= *as
)
1907 peer_as_change (peer
, *as
);
1914 peer_group_delete (struct peer_group
*group
)
1919 struct listnode
*node
, *nnode
;
1923 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1925 other
= peer
->doppelganger
;
1928 if (other
&& other
->status
!= Deleted
)
1930 other
->group
= NULL
;
1934 list_delete (group
->peer
);
1939 group
->conf
->group
= NULL
;
1940 peer_delete (group
->conf
);
1942 /* Delete from all peer_group list. */
1943 listnode_delete (bgp
->group
, group
);
1945 peer_group_free (group
);
1951 peer_group_remote_as_delete (struct peer_group
*group
)
1953 struct peer
*peer
, *other
;
1954 struct listnode
*node
, *nnode
;
1956 if (! group
->conf
->as
)
1959 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1961 other
= peer
->doppelganger
;
1966 if (other
&& other
->status
!= Deleted
)
1968 other
->group
= NULL
;
1972 list_delete_all_node (group
->peer
);
1974 group
->conf
->as
= 0;
1979 /* Bind specified peer to peer group. */
1981 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
1982 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1984 int first_member
= 0;
1986 /* Check peer group's address family. */
1987 if (! group
->conf
->afc
[afi
][safi
])
1988 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
1990 /* Lookup the peer. */
1992 peer
= peer_lookup (bgp
, su
);
1994 /* Create a new peer. */
1997 if (! group
->conf
->as
)
1998 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2000 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
2001 peer
->group
= group
;
2002 peer
->af_group
[afi
][safi
] = 1;
2004 peer
= peer_lock (peer
); /* group->peer list reference */
2005 listnode_add (group
->peer
, peer
);
2006 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2007 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2012 /* When the peer already belongs to peer group, check the consistency. */
2013 if (peer
->af_group
[afi
][safi
])
2015 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2016 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2021 /* Check current peer group configuration. */
2022 if (peer_group_active (peer
)
2023 && strcmp (peer
->group
->name
, group
->name
) != 0)
2024 return BGP_ERR_PEER_GROUP_MISMATCH
;
2026 if (! group
->conf
->as
)
2028 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2029 && peer_sort (group
->conf
) != peer_sort (peer
))
2033 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2036 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2040 peer
->af_group
[afi
][safi
] = 1;
2041 peer
->afc
[afi
][safi
] = 1;
2044 peer
->group
= group
;
2046 peer
= peer_lock (peer
); /* group->peer list reference */
2047 listnode_add (group
->peer
, peer
);
2050 assert (group
&& peer
->group
== group
);
2054 /* Advertisement-interval reset */
2055 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2056 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2057 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2059 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2061 /* ebgp-multihop reset */
2062 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2063 group
->conf
->ttl
= 255;
2065 /* local-as reset */
2066 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2068 group
->conf
->change_local_as
= 0;
2069 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2070 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2074 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2076 struct listnode
*pn
;
2078 /* If it's not configured as RSERVER_CLIENT in any other address
2079 family, without being member of a peer_group, remove it from
2080 list bgp->rsclient.*/
2081 if (! peer_rsclient_active (peer
)
2082 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2084 peer_unlock (peer
); /* peer rsclient reference */
2085 list_delete_node (bgp
->rsclient
, pn
);
2087 /* Clear our own rsclient rib for this afi/safi. */
2088 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2091 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2093 /* Import policy. */
2094 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2096 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2097 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2098 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2101 /* Export policy. */
2102 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2103 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2105 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2106 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2107 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2111 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2112 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2114 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2116 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2117 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2118 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2121 bgp_session_reset(peer
);
2127 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2128 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2132 if (! peer
->af_group
[afi
][safi
])
2135 if (group
!= peer
->group
)
2136 return BGP_ERR_PEER_GROUP_MISMATCH
;
2138 peer
->af_group
[afi
][safi
] = 0;
2139 peer
->afc
[afi
][safi
] = 0;
2140 peer_af_flag_reset (peer
, afi
, safi
);
2142 if (peer
->rib
[afi
][safi
])
2143 peer
->rib
[afi
][safi
] = NULL
;
2145 if (! peer_group_active (peer
))
2147 assert (listnode_lookup (group
->peer
, peer
));
2148 peer_unlock (peer
); /* peer group list reference */
2149 listnode_delete (group
->peer
, peer
);
2151 other
= peer
->doppelganger
;
2152 if (group
->conf
->as
)
2155 if (other
&& other
->status
!= Deleted
)
2160 listnode_delete(group
->peer
, other
);
2162 other
->group
= NULL
;
2167 peer_global_config_reset (peer
);
2170 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2172 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2173 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2174 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2177 bgp_session_reset(peer
);
2183 bgp_startup_timer_expire (struct thread
*thread
)
2187 bgp
= THREAD_ARG (thread
);
2188 bgp
->t_startup
= NULL
;
2194 /* BGP instance creation by `router bgp' commands. */
2196 bgp_create (as_t
*as
, const char *name
)
2202 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2206 bgp
->peer_self
= peer_new (bgp
);
2207 bgp
->peer_self
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, "Static announcement");
2209 bgp
->peer
= list_new ();
2210 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2212 bgp
->group
= list_new ();
2213 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2215 bgp
->rsclient
= list_new ();
2216 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2218 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2219 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2221 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2222 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2223 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2224 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2225 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2228 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2229 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2230 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2231 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2232 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2233 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2238 bgp
->name
= strdup (name
);
2240 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2242 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2243 bgp
, bgp
->restart_time
);
2248 /* Return first entry of BGP. */
2250 bgp_get_default (void)
2253 return (listgetdata (listhead (bm
->bgp
)));
2257 /* Lookup BGP entry. */
2259 bgp_lookup (as_t as
, const char *name
)
2262 struct listnode
*node
, *nnode
;
2264 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2266 && ((bgp
->name
== NULL
&& name
== NULL
)
2267 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2272 /* Lookup BGP structure by view name. */
2274 bgp_lookup_by_name (const char *name
)
2277 struct listnode
*node
, *nnode
;
2279 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2280 if ((bgp
->name
== NULL
&& name
== NULL
)
2281 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2286 /* Called from VTY commands. */
2288 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2292 /* Multiple instance check. */
2293 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2296 bgp
= bgp_lookup_by_name (name
);
2298 bgp
= bgp_get_default ();
2300 /* Already exists. */
2306 return BGP_ERR_INSTANCE_MISMATCH
;
2314 /* BGP instance name can not be specified for single instance. */
2316 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2318 /* Get default BGP structure if exists. */
2319 bgp
= bgp_get_default ();
2326 return BGP_ERR_AS_MISMATCH
;
2333 bgp
= bgp_create (as
, name
);
2334 bgp_router_id_set(bgp
, &router_id_zebra
);
2337 /* Create BGP server socket, if first instance. */
2338 if (list_isempty(bm
->bgp
)
2339 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2341 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2342 return BGP_ERR_INVALID_VALUE
;
2345 listnode_add (bm
->bgp
, bgp
);
2350 /* Delete BGP instance. */
2352 bgp_delete (struct bgp
*bgp
)
2355 struct peer_group
*group
;
2356 struct listnode
*node
;
2357 struct listnode
*next
;
2361 /* Delete static route. */
2362 bgp_static_delete (bgp
);
2364 /* Unset redistribution. */
2365 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2366 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2367 if (i
!= ZEBRA_ROUTE_BGP
)
2368 bgp_redistribute_unset (bgp
, afi
, i
);
2370 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2372 for (ALL_LIST_ELEMENTS (group
->peer
, node
, next
, peer
))
2374 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2376 /* Send notify to remote peer. */
2377 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2380 peer_group_delete (group
);
2383 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2385 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2387 /* Send notify to remote peer. */
2388 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2394 assert (listcount (bgp
->rsclient
) == 0);
2396 if (bgp
->peer_self
) {
2397 peer_delete(bgp
->peer_self
);
2398 bgp
->peer_self
= NULL
;
2401 /* Remove visibility via the master list - there may however still be
2402 * routes to be processed still referencing the struct bgp.
2404 listnode_delete (bm
->bgp
, bgp
);
2405 if (list_isempty(bm
->bgp
))
2408 bgp_unlock(bgp
); /* initial reference */
2413 static void bgp_free (struct bgp
*);
2416 bgp_lock (struct bgp
*bgp
)
2422 bgp_unlock(struct bgp
*bgp
)
2424 assert(bgp
->lock
> 0);
2425 if (--bgp
->lock
== 0)
2430 bgp_free (struct bgp
*bgp
)
2435 list_delete (bgp
->group
);
2436 list_delete (bgp
->peer
);
2437 list_delete (bgp
->rsclient
);
2442 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2443 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2445 if (bgp
->route
[afi
][safi
])
2446 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2447 if (bgp
->aggregate
[afi
][safi
])
2448 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2449 if (bgp
->rib
[afi
][safi
])
2450 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2452 XFREE (MTYPE_BGP
, bgp
);
2456 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2459 struct listnode
*node
, *nnode
;
2466 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2467 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2468 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2471 else if (bm
->bgp
!= NULL
)
2473 struct listnode
*bgpnode
, *nbgpnode
;
2475 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2476 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2477 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2478 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2485 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2488 struct listnode
*node
, *nnode
;
2492 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2493 if (sockunion_same (&peer
->su
, su
)
2494 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2497 else if (bm
->bgp
!= NULL
)
2499 struct listnode
*bgpnode
, *nbgpnode
;
2501 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2502 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2503 if (sockunion_same (&peer
->su
, su
)
2504 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2510 /* If peer is configured at least one address family return 1. */
2512 peer_active (struct peer
*peer
)
2514 if (BGP_PEER_SU_UNSPEC(peer
))
2516 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
2517 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
2518 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
2519 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
2520 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
2525 /* If peer is negotiated at least one address family return 1. */
2527 peer_active_nego (struct peer
*peer
)
2529 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
2530 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
2531 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
2532 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
2533 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
2538 /* peer_flag_change_type. */
2539 enum peer_change_type
2543 peer_change_reset_in
,
2544 peer_change_reset_out
,
2548 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
2549 enum peer_change_type type
)
2551 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2554 if (peer
->status
!= Established
)
2557 if (type
== peer_change_reset
)
2559 /* If we're resetting session, we've to delete both peer struct */
2560 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
2561 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
2562 PEER_FLAG_CONFIG_NODE
)))
2563 peer_delete(peer
->doppelganger
);
2565 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2566 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2568 else if (type
== peer_change_reset_in
)
2570 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
2571 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
2572 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
2575 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
2576 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
2577 PEER_FLAG_CONFIG_NODE
)))
2578 peer_delete(peer
->doppelganger
);
2580 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2581 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2584 else if (type
== peer_change_reset_out
)
2585 bgp_announce_route (peer
, afi
, safi
);
2588 struct peer_flag_action
2593 /* This flag can be set for peer-group member. */
2594 u_char not_for_member
;
2596 /* Action when the flag is changed. */
2597 enum peer_change_type type
;
2599 /* Peer down cause */
2603 static const struct peer_flag_action peer_flag_action_list
[] =
2605 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
2606 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
2607 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
2608 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
2609 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
2610 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
2611 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
2615 static const struct peer_flag_action peer_af_flag_action_list
[] =
2617 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
2618 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
2619 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
2620 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
2621 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
2622 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
2623 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
2624 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
2625 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
2626 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
2627 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
2628 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
2629 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
2630 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
2631 { PEER_FLAG_NEXTHOP_SELF_ALL
, 1, peer_change_reset_out
},
2635 /* Proper action set. */
2637 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
2638 struct peer_flag_action
*action
, u_int32_t flag
)
2644 const struct peer_flag_action
*match
= NULL
;
2646 /* Check peer's frag action. */
2647 for (i
= 0; i
< size
; i
++)
2649 match
= &action_list
[i
];
2651 if (match
->flag
== 0)
2654 if (match
->flag
& flag
)
2658 if (match
->type
== peer_change_reset_in
)
2660 if (match
->type
== peer_change_reset_out
)
2662 if (match
->type
== peer_change_reset
)
2667 if (match
->not_for_member
)
2668 action
->not_for_member
= 1;
2672 /* Set peer clear type. */
2673 if (reset_in
&& reset_out
)
2674 action
->type
= peer_change_reset
;
2676 action
->type
= peer_change_reset_in
;
2678 action
->type
= peer_change_reset_out
;
2680 action
->type
= peer_change_none
;
2686 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2688 if (flag
== PEER_FLAG_SHUTDOWN
)
2690 if (CHECK_FLAG (peer
->flags
, flag
))
2692 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2693 peer_nsf_stop (peer
);
2695 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
2696 if (peer
->t_pmax_restart
)
2698 BGP_TIMER_OFF (peer
->t_pmax_restart
);
2699 if (BGP_DEBUG (events
, EVENTS
))
2700 zlog_debug ("%s Maximum-prefix restart timer canceled",
2704 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2705 peer_nsf_stop (peer
);
2707 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2708 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2709 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2711 bgp_session_reset(peer
);
2715 peer
->v_start
= BGP_INIT_START_TIMER
;
2716 BGP_EVENT_ADD (peer
, BGP_Stop
);
2719 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2721 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2722 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2723 else if (flag
== PEER_FLAG_PASSIVE
)
2724 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2725 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
2726 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2728 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2729 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2732 bgp_session_reset(peer
);
2735 /* Change specified peer flag. */
2737 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2741 struct peer_group
*group
;
2742 struct listnode
*node
, *nnode
;
2743 struct peer_flag_action action
;
2745 memset (&action
, 0, sizeof (struct peer_flag_action
));
2746 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2748 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2750 /* No flag action is found. */
2752 return BGP_ERR_INVALID_FLAG
;
2754 /* Not for peer-group member. */
2755 if (action
.not_for_member
&& peer_group_active (peer
))
2756 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2758 /* When unset the peer-group member's flag we have to check
2759 peer-group configuration. */
2760 if (! set
&& peer_group_active (peer
))
2761 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2763 if (flag
== PEER_FLAG_SHUTDOWN
)
2764 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2766 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2769 /* Flag conflict check. */
2771 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2772 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2773 return BGP_ERR_PEER_FLAG_CONFLICT
;
2775 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2777 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2779 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2784 SET_FLAG (peer
->flags
, flag
);
2786 UNSET_FLAG (peer
->flags
, flag
);
2788 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2790 if (action
.type
== peer_change_reset
)
2791 peer_flag_modify_action (peer
, flag
);
2796 /* peer-group member updates. */
2797 group
= peer
->group
;
2799 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2801 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2804 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2808 SET_FLAG (peer
->flags
, flag
);
2810 UNSET_FLAG (peer
->flags
, flag
);
2812 if (action
.type
== peer_change_reset
)
2813 peer_flag_modify_action (peer
, flag
);
2819 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2821 return peer_flag_modify (peer
, flag
, 1);
2825 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2827 return peer_flag_modify (peer
, flag
, 0);
2831 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2833 if (peer
->af_group
[afi
][safi
])
2839 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2844 struct listnode
*node
, *nnode
;
2845 struct peer_group
*group
;
2846 struct peer_flag_action action
;
2848 memset (&action
, 0, sizeof (struct peer_flag_action
));
2849 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2851 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2853 /* No flag action is found. */
2855 return BGP_ERR_INVALID_FLAG
;
2857 /* Adress family must be activated. */
2858 if (! peer
->afc
[afi
][safi
])
2859 return BGP_ERR_PEER_INACTIVE
;
2861 /* Not for peer-group member. */
2862 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2863 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2865 /* Spcecial check for reflector client. */
2866 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2867 && peer_sort (peer
) != BGP_PEER_IBGP
)
2868 return BGP_ERR_NOT_INTERNAL_PEER
;
2870 /* Spcecial check for remove-private-AS. */
2871 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2872 && peer_sort (peer
) == BGP_PEER_IBGP
)
2873 return BGP_ERR_REMOVE_PRIVATE_AS
;
2875 /* When unset the peer-group member's flag we have to check
2876 peer-group configuration. */
2877 if (! set
&& peer
->af_group
[afi
][safi
])
2878 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2879 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2881 /* When current flag configuration is same as requested one. */
2882 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2884 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2886 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2891 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2893 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2895 /* Execute action when peer is established. */
2896 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2897 && peer
->status
== Established
)
2899 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2900 bgp_clear_adj_in (peer
, afi
, safi
);
2903 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2904 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2905 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2906 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2907 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2908 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2909 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2910 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2912 peer_change_action (peer
, afi
, safi
, action
.type
);
2917 /* Peer group member updates. */
2918 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2920 group
= peer
->group
;
2922 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2924 if (! peer
->af_group
[afi
][safi
])
2927 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2930 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2934 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2936 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2938 if (peer
->status
== Established
)
2940 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2941 bgp_clear_adj_in (peer
, afi
, safi
);
2944 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2945 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2946 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2947 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2948 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2949 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2950 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2951 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2953 peer_change_action (peer
, afi
, safi
, action
.type
);
2962 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2964 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2968 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2970 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2973 /* EBGP multihop configuration. */
2975 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2977 struct peer_group
*group
;
2978 struct listnode
*node
, *nnode
;
2981 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
2984 /* see comment in peer_ttl_security_hops_set() */
2987 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2989 group
= peer
->group
;
2990 if (group
->conf
->gtsm_hops
!= 0)
2991 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
2993 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
2995 if (peer1
->sort
== BGP_PEER_IBGP
)
2998 if (peer1
->gtsm_hops
!= 0)
2999 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3004 if (peer
->gtsm_hops
!= 0)
3005 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3011 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3013 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3014 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3018 group
= peer
->group
;
3019 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3021 if (peer
->sort
== BGP_PEER_IBGP
)
3024 peer
->ttl
= group
->conf
->ttl
;
3027 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3034 peer_ebgp_multihop_unset (struct peer
*peer
)
3036 struct peer_group
*group
;
3037 struct listnode
*node
, *nnode
;
3039 if (peer
->sort
== BGP_PEER_IBGP
)
3042 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3043 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3045 if (peer_group_active (peer
))
3046 peer
->ttl
= peer
->group
->conf
->ttl
;
3050 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3052 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3053 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3057 group
= peer
->group
;
3058 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3060 if (peer
->sort
== BGP_PEER_IBGP
)
3066 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3072 /* Neighbor description. */
3074 peer_description_set (struct peer
*peer
, char *desc
)
3077 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3079 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3085 peer_description_unset (struct peer
*peer
)
3088 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3095 /* Neighbor update-source. */
3097 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3099 struct peer_group
*group
;
3100 struct listnode
*node
, *nnode
;
3102 if (peer
->update_if
)
3104 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3105 && strcmp (peer
->update_if
, ifname
) == 0)
3108 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3109 peer
->update_if
= NULL
;
3112 if (peer
->update_source
)
3114 sockunion_free (peer
->update_source
);
3115 peer
->update_source
= NULL
;
3118 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3120 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3122 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3124 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3125 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3126 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3129 bgp_session_reset(peer
);
3133 /* peer-group member updates. */
3134 group
= peer
->group
;
3135 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3137 if (peer
->update_if
)
3139 if (strcmp (peer
->update_if
, ifname
) == 0)
3142 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3143 peer
->update_if
= NULL
;
3146 if (peer
->update_source
)
3148 sockunion_free (peer
->update_source
);
3149 peer
->update_source
= NULL
;
3152 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3154 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3156 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3157 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3158 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3161 bgp_session_reset(peer
);
3167 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3169 struct peer_group
*group
;
3170 struct listnode
*node
, *nnode
;
3172 if (peer
->update_source
)
3174 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3175 && sockunion_cmp (peer
->update_source
, su
) == 0)
3177 sockunion_free (peer
->update_source
);
3178 peer
->update_source
= NULL
;
3181 if (peer
->update_if
)
3183 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3184 peer
->update_if
= NULL
;
3188 peer
->update_source
= sockunion_dup (su
);
3190 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3192 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3194 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3195 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3196 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3199 bgp_session_reset(peer
);
3203 /* peer-group member updates. */
3204 group
= peer
->group
;
3205 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3207 if (peer
->update_source
)
3209 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3211 sockunion_free (peer
->update_source
);
3212 peer
->update_source
= NULL
;
3215 if (peer
->update_if
)
3217 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3218 peer
->update_if
= NULL
;
3221 peer
->update_source
= sockunion_dup (su
);
3223 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3225 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3226 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3227 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3230 bgp_session_reset(peer
);
3236 peer_update_source_unset (struct peer
*peer
)
3238 union sockunion
*su
;
3239 struct peer_group
*group
;
3240 struct listnode
*node
, *nnode
;
3242 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3243 && ! peer
->update_source
3244 && ! peer
->update_if
)
3247 if (peer
->update_source
)
3249 sockunion_free (peer
->update_source
);
3250 peer
->update_source
= NULL
;
3252 if (peer
->update_if
)
3254 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3255 peer
->update_if
= NULL
;
3258 if (peer_group_active (peer
))
3260 group
= peer
->group
;
3262 if (group
->conf
->update_source
)
3264 su
= sockunion_dup (group
->conf
->update_source
);
3265 peer
->update_source
= su
;
3267 else if (group
->conf
->update_if
)
3269 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3272 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3274 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3276 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3277 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3278 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3281 bgp_session_reset(peer
);
3285 /* peer-group member updates. */
3286 group
= peer
->group
;
3287 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3289 if (! peer
->update_source
&& ! peer
->update_if
)
3292 if (peer
->update_source
)
3294 sockunion_free (peer
->update_source
);
3295 peer
->update_source
= NULL
;
3298 if (peer
->update_if
)
3300 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3301 peer
->update_if
= NULL
;
3304 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3306 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3307 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3308 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3311 bgp_session_reset(peer
);
3317 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3320 struct peer_group
*group
;
3321 struct listnode
*node
, *nnode
;
3323 /* Adress family must be activated. */
3324 if (! peer
->afc
[afi
][safi
])
3325 return BGP_ERR_PEER_INACTIVE
;
3327 /* Default originate can't be used for peer group memeber. */
3328 if (peer_is_group_member (peer
, afi
, safi
))
3329 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3331 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3332 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3333 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3335 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3339 if (peer
->default_rmap
[afi
][safi
].name
)
3340 free (peer
->default_rmap
[afi
][safi
].name
);
3341 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3342 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3346 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3348 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3349 bgp_default_originate (peer
, afi
, safi
, 0);
3353 /* peer-group member updates. */
3354 group
= peer
->group
;
3355 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3357 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3361 if (peer
->default_rmap
[afi
][safi
].name
)
3362 free (peer
->default_rmap
[afi
][safi
].name
);
3363 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3364 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3367 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3368 bgp_default_originate (peer
, afi
, safi
, 0);
3374 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3376 struct peer_group
*group
;
3377 struct listnode
*node
, *nnode
;
3379 /* Adress family must be activated. */
3380 if (! peer
->afc
[afi
][safi
])
3381 return BGP_ERR_PEER_INACTIVE
;
3383 /* Default originate can't be used for peer group memeber. */
3384 if (peer_is_group_member (peer
, afi
, safi
))
3385 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3387 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3389 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3391 if (peer
->default_rmap
[afi
][safi
].name
)
3392 free (peer
->default_rmap
[afi
][safi
].name
);
3393 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3394 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3397 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3399 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3400 bgp_default_originate (peer
, afi
, safi
, 1);
3404 /* peer-group member updates. */
3405 group
= peer
->group
;
3406 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3408 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3410 if (peer
->default_rmap
[afi
][safi
].name
)
3411 free (peer
->default_rmap
[afi
][safi
].name
);
3412 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3413 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3415 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3416 bgp_default_originate (peer
, afi
, safi
, 1);
3422 peer_port_set (struct peer
*peer
, u_int16_t port
)
3429 peer_port_unset (struct peer
*peer
)
3431 peer
->port
= BGP_PORT_DEFAULT
;
3435 /* neighbor weight. */
3437 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
3439 struct peer_group
*group
;
3440 struct listnode
*node
, *nnode
;
3442 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3443 peer
->weight
= weight
;
3445 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3448 /* peer-group member updates. */
3449 group
= peer
->group
;
3450 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3452 peer
->weight
= group
->conf
->weight
;
3458 peer_weight_unset (struct peer
*peer
)
3460 struct peer_group
*group
;
3461 struct listnode
*node
, *nnode
;
3463 /* Set default weight. */
3464 if (peer_group_active (peer
))
3465 peer
->weight
= peer
->group
->conf
->weight
;
3469 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3471 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3474 /* peer-group member updates. */
3475 group
= peer
->group
;
3476 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3484 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
3486 struct peer_group
*group
;
3487 struct listnode
*node
, *nnode
;
3489 /* Not for peer group memeber. */
3490 if (peer_group_active (peer
))
3491 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3493 /* keepalive value check. */
3494 if (keepalive
> 65535)
3495 return BGP_ERR_INVALID_VALUE
;
3497 /* Holdtime value check. */
3498 if (holdtime
> 65535)
3499 return BGP_ERR_INVALID_VALUE
;
3501 /* Holdtime value must be either 0 or greater than 3. */
3502 if (holdtime
< 3 && holdtime
!= 0)
3503 return BGP_ERR_INVALID_VALUE
;
3505 /* Set value to the configuration. */
3506 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3507 peer
->holdtime
= holdtime
;
3508 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
3510 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3513 /* peer-group member updates. */
3514 group
= peer
->group
;
3515 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3517 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3518 peer
->holdtime
= group
->conf
->holdtime
;
3519 peer
->keepalive
= group
->conf
->keepalive
;
3525 peer_timers_unset (struct peer
*peer
)
3527 struct peer_group
*group
;
3528 struct listnode
*node
, *nnode
;
3530 if (peer_group_active (peer
))
3531 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3533 /* Clear configuration. */
3534 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3535 peer
->keepalive
= 0;
3538 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3541 /* peer-group member updates. */
3542 group
= peer
->group
;
3543 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3545 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3547 peer
->keepalive
= 0;
3554 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
3556 struct peer_group
*group
;
3557 struct listnode
*node
, *nnode
;
3559 if (peer_group_active (peer
))
3560 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3562 if (connect
> 65535)
3563 return BGP_ERR_INVALID_VALUE
;
3565 /* Set value to the configuration. */
3566 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3567 peer
->connect
= connect
;
3569 /* Set value to timer setting. */
3570 peer
->v_connect
= connect
;
3572 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3575 /* peer-group member updates. */
3576 group
= peer
->group
;
3577 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3579 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3580 peer
->connect
= connect
;
3581 peer
->v_connect
= connect
;
3587 peer_timers_connect_unset (struct peer
*peer
)
3589 struct peer_group
*group
;
3590 struct listnode
*node
, *nnode
;
3592 if (peer_group_active (peer
))
3593 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3595 /* Clear configuration. */
3596 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3599 /* Set timer setting to default value. */
3600 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3602 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3605 /* peer-group member updates. */
3606 group
= peer
->group
;
3607 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3609 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3611 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3617 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3619 struct peer_group
*group
;
3620 struct listnode
*node
, *nnode
;
3622 if (peer_group_active (peer
))
3623 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3626 return BGP_ERR_INVALID_VALUE
;
3628 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3629 peer
->routeadv
= routeadv
;
3630 peer
->v_routeadv
= routeadv
;
3632 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3635 /* peer-group member updates. */
3636 group
= peer
->group
;
3637 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3639 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3640 peer
->routeadv
= routeadv
;
3641 peer
->v_routeadv
= routeadv
;
3648 peer_advertise_interval_unset (struct peer
*peer
)
3650 struct peer_group
*group
;
3651 struct listnode
*node
, *nnode
;
3653 if (peer_group_active (peer
))
3654 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3656 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3659 if (peer
->sort
== BGP_PEER_IBGP
)
3660 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3662 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3664 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3667 /* peer-group member updates. */
3668 group
= peer
->group
;
3669 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3671 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3674 if (peer
->sort
== BGP_PEER_IBGP
)
3675 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3677 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3683 /* neighbor interface */
3685 peer_interface_set (struct peer
*peer
, const char *str
)
3688 free (peer
->ifname
);
3689 peer
->ifname
= strdup (str
);
3695 peer_interface_unset (struct peer
*peer
)
3698 free (peer
->ifname
);
3699 peer
->ifname
= NULL
;
3706 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3708 struct peer_group
*group
;
3709 struct listnode
*node
, *nnode
;
3711 if (allow_num
< 1 || allow_num
> 10)
3712 return BGP_ERR_INVALID_VALUE
;
3714 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3716 peer
->allowas_in
[afi
][safi
] = allow_num
;
3717 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3718 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3721 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3724 group
= peer
->group
;
3725 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3727 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3729 peer
->allowas_in
[afi
][safi
] = allow_num
;
3730 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3731 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3739 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3741 struct peer_group
*group
;
3742 struct listnode
*node
, *nnode
;
3744 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3746 peer
->allowas_in
[afi
][safi
] = 0;
3747 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3750 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3753 group
= peer
->group
;
3754 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3756 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3758 peer
->allowas_in
[afi
][safi
] = 0;
3759 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3766 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
3768 struct bgp
*bgp
= peer
->bgp
;
3769 struct peer_group
*group
;
3770 struct listnode
*node
, *nnode
;
3772 if (peer_sort (peer
) != BGP_PEER_EBGP
3773 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3774 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3777 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3779 if (peer_group_active (peer
))
3780 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3783 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
3785 if (peer
->change_local_as
== as
&&
3786 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3787 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
3788 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
3789 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
3792 peer
->change_local_as
= as
;
3794 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3796 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3799 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3801 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3803 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3805 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3807 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3808 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3809 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3812 bgp_session_reset(peer
);
3816 group
= peer
->group
;
3817 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3819 peer
->change_local_as
= as
;
3821 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3823 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3826 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3828 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3830 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3832 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3833 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3834 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3837 BGP_EVENT_ADD (peer
, BGP_Stop
);
3844 peer_local_as_unset (struct peer
*peer
)
3846 struct peer_group
*group
;
3847 struct listnode
*node
, *nnode
;
3849 if (peer_group_active (peer
))
3850 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3852 if (! peer
->change_local_as
)
3855 peer
->change_local_as
= 0;
3856 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3857 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3859 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3861 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3863 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3864 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3865 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3868 BGP_EVENT_ADD (peer
, BGP_Stop
);
3873 group
= peer
->group
;
3874 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3876 peer
->change_local_as
= 0;
3877 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3878 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3880 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3882 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3883 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3884 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3887 bgp_session_reset(peer
);
3892 /* Set password for authenticating with the peer. */
3894 peer_password_set (struct peer
*peer
, const char *password
)
3896 struct listnode
*nn
, *nnode
;
3897 int len
= password
? strlen(password
) : 0;
3898 int ret
= BGP_SUCCESS
;
3900 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
3901 return BGP_ERR_INVALID_VALUE
;
3903 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
3904 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3908 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3910 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
3912 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3914 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3915 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3917 bgp_session_reset(peer
);
3919 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
3922 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3924 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
3928 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3930 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
3932 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3933 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3935 bgp_session_reset(peer
);
3937 if (bgp_md5_set (peer
) < 0)
3938 ret
= BGP_ERR_TCPSIG_FAILED
;
3945 peer_password_unset (struct peer
*peer
)
3947 struct listnode
*nn
, *nnode
;
3950 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3953 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3955 if (peer_group_active (peer
)
3956 && peer
->group
->conf
->password
3957 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
3958 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
3960 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3961 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3963 bgp_session_reset(peer
);
3966 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3968 peer
->password
= NULL
;
3975 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3976 peer
->password
= NULL
;
3978 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3980 if (!peer
->password
)
3983 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3984 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3986 bgp_session_reset(peer
);
3988 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3989 peer
->password
= NULL
;
3997 /* Set distribute list to the peer. */
3999 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4002 struct bgp_filter
*filter
;
4003 struct peer_group
*group
;
4004 struct listnode
*node
, *nnode
;
4006 if (! peer
->afc
[afi
][safi
])
4007 return BGP_ERR_PEER_INACTIVE
;
4009 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4010 return BGP_ERR_INVALID_VALUE
;
4012 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4013 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4015 filter
= &peer
->filter
[afi
][safi
];
4017 if (filter
->plist
[direct
].name
)
4018 return BGP_ERR_PEER_FILTER_CONFLICT
;
4020 if (filter
->dlist
[direct
].name
)
4021 free (filter
->dlist
[direct
].name
);
4022 filter
->dlist
[direct
].name
= strdup (name
);
4023 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4025 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4028 group
= peer
->group
;
4029 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4031 filter
= &peer
->filter
[afi
][safi
];
4033 if (! peer
->af_group
[afi
][safi
])
4036 if (filter
->dlist
[direct
].name
)
4037 free (filter
->dlist
[direct
].name
);
4038 filter
->dlist
[direct
].name
= strdup (name
);
4039 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4046 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4048 struct bgp_filter
*filter
;
4049 struct bgp_filter
*gfilter
;
4050 struct peer_group
*group
;
4051 struct listnode
*node
, *nnode
;
4053 if (! peer
->afc
[afi
][safi
])
4054 return BGP_ERR_PEER_INACTIVE
;
4056 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4057 return BGP_ERR_INVALID_VALUE
;
4059 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4060 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4062 filter
= &peer
->filter
[afi
][safi
];
4064 /* apply peer-group filter */
4065 if (peer
->af_group
[afi
][safi
])
4067 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4069 if (gfilter
->dlist
[direct
].name
)
4071 if (filter
->dlist
[direct
].name
)
4072 free (filter
->dlist
[direct
].name
);
4073 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
4074 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4079 if (filter
->dlist
[direct
].name
)
4080 free (filter
->dlist
[direct
].name
);
4081 filter
->dlist
[direct
].name
= NULL
;
4082 filter
->dlist
[direct
].alist
= NULL
;
4084 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4087 group
= peer
->group
;
4088 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4090 filter
= &peer
->filter
[afi
][safi
];
4092 if (! peer
->af_group
[afi
][safi
])
4095 if (filter
->dlist
[direct
].name
)
4096 free (filter
->dlist
[direct
].name
);
4097 filter
->dlist
[direct
].name
= NULL
;
4098 filter
->dlist
[direct
].alist
= NULL
;
4104 /* Update distribute list. */
4106 peer_distribute_update (struct access_list
*access
)
4111 struct listnode
*mnode
, *mnnode
;
4112 struct listnode
*node
, *nnode
;
4115 struct peer_group
*group
;
4116 struct bgp_filter
*filter
;
4118 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4120 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4122 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4123 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4125 filter
= &peer
->filter
[afi
][safi
];
4127 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4129 if (filter
->dlist
[direct
].name
)
4130 filter
->dlist
[direct
].alist
=
4131 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4133 filter
->dlist
[direct
].alist
= NULL
;
4137 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4139 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4140 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4142 filter
= &group
->conf
->filter
[afi
][safi
];
4144 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4146 if (filter
->dlist
[direct
].name
)
4147 filter
->dlist
[direct
].alist
=
4148 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4150 filter
->dlist
[direct
].alist
= NULL
;
4157 /* Set prefix list to the peer. */
4159 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4162 struct bgp_filter
*filter
;
4163 struct peer_group
*group
;
4164 struct listnode
*node
, *nnode
;
4166 if (! peer
->afc
[afi
][safi
])
4167 return BGP_ERR_PEER_INACTIVE
;
4169 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4170 return BGP_ERR_INVALID_VALUE
;
4172 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4173 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4175 filter
= &peer
->filter
[afi
][safi
];
4177 if (filter
->dlist
[direct
].name
)
4178 return BGP_ERR_PEER_FILTER_CONFLICT
;
4180 if (filter
->plist
[direct
].name
)
4181 free (filter
->plist
[direct
].name
);
4182 filter
->plist
[direct
].name
= strdup (name
);
4183 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
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
->plist
[direct
].name
)
4197 free (filter
->plist
[direct
].name
);
4198 filter
->plist
[direct
].name
= strdup (name
);
4199 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4205 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4207 struct bgp_filter
*filter
;
4208 struct bgp_filter
*gfilter
;
4209 struct peer_group
*group
;
4210 struct listnode
*node
, *nnode
;
4212 if (! peer
->afc
[afi
][safi
])
4213 return BGP_ERR_PEER_INACTIVE
;
4215 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4216 return BGP_ERR_INVALID_VALUE
;
4218 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4219 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4221 filter
= &peer
->filter
[afi
][safi
];
4223 /* apply peer-group filter */
4224 if (peer
->af_group
[afi
][safi
])
4226 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4228 if (gfilter
->plist
[direct
].name
)
4230 if (filter
->plist
[direct
].name
)
4231 free (filter
->plist
[direct
].name
);
4232 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
4233 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
4238 if (filter
->plist
[direct
].name
)
4239 free (filter
->plist
[direct
].name
);
4240 filter
->plist
[direct
].name
= NULL
;
4241 filter
->plist
[direct
].plist
= NULL
;
4243 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4246 group
= peer
->group
;
4247 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4249 filter
= &peer
->filter
[afi
][safi
];
4251 if (! peer
->af_group
[afi
][safi
])
4254 if (filter
->plist
[direct
].name
)
4255 free (filter
->plist
[direct
].name
);
4256 filter
->plist
[direct
].name
= NULL
;
4257 filter
->plist
[direct
].plist
= NULL
;
4263 /* Update prefix-list list. */
4265 peer_prefix_list_update (struct prefix_list
*plist
)
4267 struct listnode
*mnode
, *mnnode
;
4268 struct listnode
*node
, *nnode
;
4271 struct peer_group
*group
;
4272 struct bgp_filter
*filter
;
4277 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4279 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4281 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4282 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4284 filter
= &peer
->filter
[afi
][safi
];
4286 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4288 if (filter
->plist
[direct
].name
)
4289 filter
->plist
[direct
].plist
=
4290 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4292 filter
->plist
[direct
].plist
= NULL
;
4296 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4298 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4299 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4301 filter
= &group
->conf
->filter
[afi
][safi
];
4303 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4305 if (filter
->plist
[direct
].name
)
4306 filter
->plist
[direct
].plist
=
4307 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4309 filter
->plist
[direct
].plist
= NULL
;
4317 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4320 struct bgp_filter
*filter
;
4321 struct peer_group
*group
;
4322 struct listnode
*node
, *nnode
;
4324 if (! peer
->afc
[afi
][safi
])
4325 return BGP_ERR_PEER_INACTIVE
;
4327 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4328 return BGP_ERR_INVALID_VALUE
;
4330 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4331 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4333 filter
= &peer
->filter
[afi
][safi
];
4335 if (filter
->aslist
[direct
].name
)
4336 free (filter
->aslist
[direct
].name
);
4337 filter
->aslist
[direct
].name
= strdup (name
);
4338 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4340 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4343 group
= peer
->group
;
4344 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4346 filter
= &peer
->filter
[afi
][safi
];
4348 if (! peer
->af_group
[afi
][safi
])
4351 if (filter
->aslist
[direct
].name
)
4352 free (filter
->aslist
[direct
].name
);
4353 filter
->aslist
[direct
].name
= strdup (name
);
4354 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4360 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
4362 struct bgp_filter
*filter
;
4363 struct bgp_filter
*gfilter
;
4364 struct peer_group
*group
;
4365 struct listnode
*node
, *nnode
;
4367 if (! peer
->afc
[afi
][safi
])
4368 return BGP_ERR_PEER_INACTIVE
;
4370 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4371 return BGP_ERR_INVALID_VALUE
;
4373 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4374 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4376 filter
= &peer
->filter
[afi
][safi
];
4378 /* apply peer-group filter */
4379 if (peer
->af_group
[afi
][safi
])
4381 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4383 if (gfilter
->aslist
[direct
].name
)
4385 if (filter
->aslist
[direct
].name
)
4386 free (filter
->aslist
[direct
].name
);
4387 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
4388 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
4393 if (filter
->aslist
[direct
].name
)
4394 free (filter
->aslist
[direct
].name
);
4395 filter
->aslist
[direct
].name
= NULL
;
4396 filter
->aslist
[direct
].aslist
= NULL
;
4398 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4401 group
= peer
->group
;
4402 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4404 filter
= &peer
->filter
[afi
][safi
];
4406 if (! peer
->af_group
[afi
][safi
])
4409 if (filter
->aslist
[direct
].name
)
4410 free (filter
->aslist
[direct
].name
);
4411 filter
->aslist
[direct
].name
= NULL
;
4412 filter
->aslist
[direct
].aslist
= NULL
;
4419 peer_aslist_update (void)
4424 struct listnode
*mnode
, *mnnode
;
4425 struct listnode
*node
, *nnode
;
4428 struct peer_group
*group
;
4429 struct bgp_filter
*filter
;
4431 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4433 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4435 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4436 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4438 filter
= &peer
->filter
[afi
][safi
];
4440 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4442 if (filter
->aslist
[direct
].name
)
4443 filter
->aslist
[direct
].aslist
=
4444 as_list_lookup (filter
->aslist
[direct
].name
);
4446 filter
->aslist
[direct
].aslist
= NULL
;
4450 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4452 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4453 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4455 filter
= &group
->conf
->filter
[afi
][safi
];
4457 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4459 if (filter
->aslist
[direct
].name
)
4460 filter
->aslist
[direct
].aslist
=
4461 as_list_lookup (filter
->aslist
[direct
].name
);
4463 filter
->aslist
[direct
].aslist
= NULL
;
4470 /* Set route-map to the peer. */
4472 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4475 struct bgp_filter
*filter
;
4476 struct peer_group
*group
;
4477 struct listnode
*node
, *nnode
;
4479 if (! peer
->afc
[afi
][safi
])
4480 return BGP_ERR_PEER_INACTIVE
;
4482 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4483 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4484 return BGP_ERR_INVALID_VALUE
;
4486 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4487 && peer_is_group_member (peer
, afi
, safi
))
4488 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4490 filter
= &peer
->filter
[afi
][safi
];
4492 if (filter
->map
[direct
].name
)
4493 free (filter
->map
[direct
].name
);
4495 filter
->map
[direct
].name
= strdup (name
);
4496 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4498 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4501 group
= peer
->group
;
4502 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4504 filter
= &peer
->filter
[afi
][safi
];
4506 if (! peer
->af_group
[afi
][safi
])
4509 if (filter
->map
[direct
].name
)
4510 free (filter
->map
[direct
].name
);
4511 filter
->map
[direct
].name
= strdup (name
);
4512 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4517 /* Unset route-map from the peer. */
4519 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4521 struct bgp_filter
*filter
;
4522 struct bgp_filter
*gfilter
;
4523 struct peer_group
*group
;
4524 struct listnode
*node
, *nnode
;
4526 if (! peer
->afc
[afi
][safi
])
4527 return BGP_ERR_PEER_INACTIVE
;
4529 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4530 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4531 return BGP_ERR_INVALID_VALUE
;
4533 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4534 && peer_is_group_member (peer
, afi
, safi
))
4535 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4537 filter
= &peer
->filter
[afi
][safi
];
4539 /* apply peer-group filter */
4540 if (peer
->af_group
[afi
][safi
])
4542 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4544 if (gfilter
->map
[direct
].name
)
4546 if (filter
->map
[direct
].name
)
4547 free (filter
->map
[direct
].name
);
4548 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
4549 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
4554 if (filter
->map
[direct
].name
)
4555 free (filter
->map
[direct
].name
);
4556 filter
->map
[direct
].name
= NULL
;
4557 filter
->map
[direct
].map
= NULL
;
4559 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4562 group
= peer
->group
;
4563 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4565 filter
= &peer
->filter
[afi
][safi
];
4567 if (! peer
->af_group
[afi
][safi
])
4570 if (filter
->map
[direct
].name
)
4571 free (filter
->map
[direct
].name
);
4572 filter
->map
[direct
].name
= NULL
;
4573 filter
->map
[direct
].map
= NULL
;
4578 /* Set unsuppress-map to the peer. */
4580 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4583 struct bgp_filter
*filter
;
4584 struct peer_group
*group
;
4585 struct listnode
*node
, *nnode
;
4587 if (! peer
->afc
[afi
][safi
])
4588 return BGP_ERR_PEER_INACTIVE
;
4590 if (peer_is_group_member (peer
, afi
, safi
))
4591 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4593 filter
= &peer
->filter
[afi
][safi
];
4595 if (filter
->usmap
.name
)
4596 free (filter
->usmap
.name
);
4598 filter
->usmap
.name
= strdup (name
);
4599 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4601 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4604 group
= peer
->group
;
4605 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4607 filter
= &peer
->filter
[afi
][safi
];
4609 if (! peer
->af_group
[afi
][safi
])
4612 if (filter
->usmap
.name
)
4613 free (filter
->usmap
.name
);
4614 filter
->usmap
.name
= strdup (name
);
4615 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4620 /* Unset route-map from the peer. */
4622 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4624 struct bgp_filter
*filter
;
4625 struct peer_group
*group
;
4626 struct listnode
*node
, *nnode
;
4628 if (! peer
->afc
[afi
][safi
])
4629 return BGP_ERR_PEER_INACTIVE
;
4631 if (peer_is_group_member (peer
, afi
, safi
))
4632 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4634 filter
= &peer
->filter
[afi
][safi
];
4636 if (filter
->usmap
.name
)
4637 free (filter
->usmap
.name
);
4638 filter
->usmap
.name
= NULL
;
4639 filter
->usmap
.map
= NULL
;
4641 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4644 group
= peer
->group
;
4645 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4647 filter
= &peer
->filter
[afi
][safi
];
4649 if (! peer
->af_group
[afi
][safi
])
4652 if (filter
->usmap
.name
)
4653 free (filter
->usmap
.name
);
4654 filter
->usmap
.name
= NULL
;
4655 filter
->usmap
.map
= NULL
;
4661 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4662 u_int32_t max
, u_char threshold
,
4663 int warning
, u_int16_t restart
)
4665 struct peer_group
*group
;
4666 struct listnode
*node
, *nnode
;
4668 if (! peer
->afc
[afi
][safi
])
4669 return BGP_ERR_PEER_INACTIVE
;
4671 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4672 peer
->pmax
[afi
][safi
] = max
;
4673 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4674 peer
->pmax_restart
[afi
][safi
] = restart
;
4676 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4678 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4680 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4683 group
= peer
->group
;
4684 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4686 if (! peer
->af_group
[afi
][safi
])
4689 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4690 peer
->pmax
[afi
][safi
] = max
;
4691 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4692 peer
->pmax_restart
[afi
][safi
] = restart
;
4694 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4696 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4702 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4704 struct peer_group
*group
;
4705 struct listnode
*node
, *nnode
;
4707 if (! peer
->afc
[afi
][safi
])
4708 return BGP_ERR_PEER_INACTIVE
;
4710 /* apply peer-group config */
4711 if (peer
->af_group
[afi
][safi
])
4713 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4714 PEER_FLAG_MAX_PREFIX
))
4715 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4717 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4719 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4720 PEER_FLAG_MAX_PREFIX_WARNING
))
4721 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4723 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4725 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
4726 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4727 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
4731 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4732 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4733 peer
->pmax
[afi
][safi
] = 0;
4734 peer
->pmax_threshold
[afi
][safi
] = 0;
4735 peer
->pmax_restart
[afi
][safi
] = 0;
4737 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4740 group
= peer
->group
;
4741 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4743 if (! peer
->af_group
[afi
][safi
])
4746 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4747 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4748 peer
->pmax
[afi
][safi
] = 0;
4749 peer
->pmax_threshold
[afi
][safi
] = 0;
4750 peer
->pmax_restart
[afi
][safi
] = 0;
4755 static int is_ebgp_multihop_configured (struct peer
*peer
)
4757 struct peer_group
*group
;
4758 struct listnode
*node
, *nnode
;
4761 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4763 group
= peer
->group
;
4764 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4765 (group
->conf
->ttl
!= 1))
4768 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
4770 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
4777 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4784 /* Set # of hops between us and BGP peer. */
4786 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
4788 struct peer_group
*group
;
4789 struct listnode
*node
, *nnode
;
4792 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
4794 /* We cannot configure ttl-security hops when ebgp-multihop is already
4795 set. For non peer-groups, the check is simple. For peer-groups, it's
4796 slightly messy, because we need to check both the peer-group structure
4797 and all peer-group members for any trace of ebgp-multihop configuration
4798 before actually applying the ttl-security rules. Cisco really made a
4799 mess of this configuration parameter, and OpenBGPD got it right.
4802 if (peer
->gtsm_hops
== 0)
4804 if (is_ebgp_multihop_configured (peer
))
4805 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4807 /* specify MAXTTL on outgoing packets */
4808 /* Routine handles iBGP peers correctly */
4809 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
4814 peer
->gtsm_hops
= gtsm_hops
;
4816 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4819 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4820 MAXTTL
+ 1 - gtsm_hops
);
4821 if (peer
->status
!= Established
&& peer
->doppelganger
)
4822 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
4823 MAXTTL
+ 1 - gtsm_hops
);
4827 group
= peer
->group
;
4828 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4830 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
4832 /* Change setting of existing peer
4833 * established then change value (may break connectivity)
4834 * not established yet (teardown session and restart)
4835 * no session then do nothing (will get handled by next connection)
4837 if (peer
->status
== Established
)
4839 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
4840 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4841 MAXTTL
+ 1 - peer
->gtsm_hops
);
4843 else if (peer
->status
< Established
)
4845 if (BGP_DEBUG (events
, EVENTS
))
4846 zlog_debug ("%s Min-ttl changed", peer
->host
);
4847 bgp_session_reset(peer
);
4856 peer_ttl_security_hops_unset (struct peer
*peer
)
4858 struct peer_group
*group
;
4859 struct listnode
*node
, *nnode
;
4862 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
4864 /* if a peer-group member, then reset to peer-group default rather than 0 */
4865 if (peer_group_active (peer
))
4866 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
4868 peer
->gtsm_hops
= 0;
4871 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4874 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4876 if (peer
->status
!= Established
&& peer
->doppelganger
)
4877 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
, 0);
4881 group
= peer
->group
;
4882 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4884 peer
->gtsm_hops
= 0;
4887 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4889 if (peer
->status
!= Established
&& peer
->doppelganger
)
4890 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
, 0);
4894 return peer_ebgp_multihop_unset (opeer
);
4898 * If peer clear is invoked in a loop for all peers on the BGP instance,
4899 * it may end up freeing the doppelganger, and if this was the next node
4900 * to the current node, we would end up accessing the freed next node.
4901 * Pass along additional parameter which can be updated if next node
4902 * is freed; only required when walking the peer list on BGP instance.
4905 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
4907 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4909 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
4911 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4912 if (peer
->t_pmax_restart
)
4914 BGP_TIMER_OFF (peer
->t_pmax_restart
);
4915 if (BGP_DEBUG (events
, EVENTS
))
4916 zlog_debug ("%s Maximum-prefix restart timer canceled",
4919 BGP_EVENT_ADD (peer
, BGP_Start
);
4923 peer
->v_start
= BGP_INIT_START_TIMER
;
4924 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4925 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4926 BGP_NOTIFY_CEASE_ADMIN_RESET
);
4928 bgp_session_reset_safe(peer
, nnode
);
4934 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
4935 enum bgp_clear_type stype
)
4937 if (peer
->status
!= Established
)
4940 if (! peer
->afc
[afi
][safi
])
4941 return BGP_ERR_AF_UNCONFIGURED
;
4943 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
4945 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
4947 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
4948 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
4951 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
4952 bgp_announce_route (peer
, afi
, safi
);
4954 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4956 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
4957 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
4958 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
4960 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
4963 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
4964 prefix_type
= ORF_TYPE_PREFIX
;
4966 prefix_type
= ORF_TYPE_PREFIX_OLD
;
4968 if (filter
->plist
[FILTER_IN
].plist
)
4970 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4971 bgp_route_refresh_send (peer
, afi
, safi
,
4972 prefix_type
, REFRESH_DEFER
, 1);
4973 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
4974 REFRESH_IMMEDIATE
, 0);
4978 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4979 bgp_route_refresh_send (peer
, afi
, safi
,
4980 prefix_type
, REFRESH_IMMEDIATE
, 1);
4982 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4988 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
4989 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4991 /* If neighbor has soft reconfiguration inbound flag.
4992 Use Adj-RIB-In database. */
4993 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4994 bgp_soft_reconfig_in (peer
, afi
, safi
);
4997 /* If neighbor has route refresh capability, send route refresh
4998 message to the peer. */
4999 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5000 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5001 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5003 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5009 /* Display peer uptime.*/
5010 /* XXX: why does this function return char * when it takes buffer? */
5012 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
5017 /* Check buffer length. */
5018 if (len
< BGP_UPTIME_LEN
)
5020 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5021 /* XXX: should return status instead of buf... */
5022 snprintf (buf
, len
, "<error> ");
5026 /* If there is no connection has been done before print `never'. */
5029 snprintf (buf
, len
, "never ");
5033 /* Get current time. */
5034 uptime1
= bgp_clock ();
5036 tm
= gmtime (&uptime1
);
5038 /* Making formatted timer strings. */
5039 #define ONE_DAY_SECOND 60*60*24
5040 #define ONE_WEEK_SECOND 60*60*24*7
5042 if (uptime1
< ONE_DAY_SECOND
)
5043 snprintf (buf
, len
, "%02d:%02d:%02d",
5044 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5045 else if (uptime1
< ONE_WEEK_SECOND
)
5046 snprintf (buf
, len
, "%dd%02dh%02dm",
5047 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5049 snprintf (buf
, len
, "%02dw%dd%02dh",
5050 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5055 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
5056 afi_t afi
, safi_t safi
)
5058 struct bgp_filter
*filter
;
5059 struct bgp_filter
*gfilter
= NULL
;
5062 int out
= FILTER_OUT
;
5065 filter
= &peer
->filter
[afi
][safi
];
5066 if (peer
->af_group
[afi
][safi
])
5067 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5069 /* distribute-list. */
5070 if (filter
->dlist
[in
].name
)
5071 if (! gfilter
|| ! gfilter
->dlist
[in
].name
5072 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
5073 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
5074 filter
->dlist
[in
].name
, VTY_NEWLINE
);
5075 if (filter
->dlist
[out
].name
&& ! gfilter
)
5076 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
5077 filter
->dlist
[out
].name
, VTY_NEWLINE
);
5080 if (filter
->plist
[in
].name
)
5081 if (! gfilter
|| ! gfilter
->plist
[in
].name
5082 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
5083 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
5084 filter
->plist
[in
].name
, VTY_NEWLINE
);
5085 if (filter
->plist
[out
].name
&& ! gfilter
)
5086 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
5087 filter
->plist
[out
].name
, VTY_NEWLINE
);
5090 if (filter
->map
[RMAP_IN
].name
)
5091 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
5092 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
5093 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
5094 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
5095 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
5096 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
5097 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
5098 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
5099 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
5100 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
5101 if (filter
->map
[RMAP_EXPORT
].name
)
5102 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
5103 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
5104 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
5105 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
5106 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
5108 /* unsuppress-map */
5109 if (filter
->usmap
.name
&& ! gfilter
)
5110 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
5111 filter
->usmap
.name
, VTY_NEWLINE
);
5114 if (filter
->aslist
[in
].name
)
5115 if (! gfilter
|| ! gfilter
->aslist
[in
].name
5116 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
5117 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
5118 filter
->aslist
[in
].name
, VTY_NEWLINE
);
5119 if (filter
->aslist
[out
].name
&& ! gfilter
)
5120 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
5121 filter
->aslist
[out
].name
, VTY_NEWLINE
);
5124 /* BGP peer configuration display function. */
5126 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
5127 struct peer
*peer
, afi_t afi
, safi_t safi
)
5129 struct peer
*g_peer
= NULL
;
5130 char buf
[SU_ADDRSTRLEN
];
5134 addr
= peer
->conf_if
;
5138 if (peer_group_active (peer
))
5139 g_peer
= peer
->group
->conf
;
5141 /************************************
5142 ****** Global to the neighbor ******
5143 ************************************/
5144 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5147 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
5150 if (! peer_group_active (peer
))
5152 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5153 vty_out (vty
, " neighbor %s peer-group%s", addr
,
5156 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
5162 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
5164 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
5165 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
5166 peer
->group
->name
, VTY_NEWLINE
);
5170 if (peer
->change_local_as
)
5171 if (! peer_group_active (peer
))
5172 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
5173 peer
->change_local_as
,
5174 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
5176 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
5177 " replace-as" : "", VTY_NEWLINE
);
5181 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
5185 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5186 if (! peer_group_active (peer
) ||
5187 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
5188 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
5192 if (!peer_group_active (peer
)
5193 || ! g_peer
->password
5194 || strcmp (peer
->password
, g_peer
->password
) != 0)
5195 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
5199 if (peer
->port
!= BGP_PORT_DEFAULT
)
5200 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
5203 /* Local interface name. */
5205 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
5209 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
5210 if (! peer_group_active (peer
) ||
5211 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
5212 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
5214 /* EBGP multihop. */
5215 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
5216 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
5217 if (! peer_group_active (peer
) ||
5218 g_peer
->ttl
!= peer
->ttl
)
5219 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
5222 /* ttl-security hops */
5223 if (peer
->gtsm_hops
!= 0)
5224 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
5225 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
5226 peer
->gtsm_hops
, VTY_NEWLINE
);
5228 /* disable-connected-check. */
5229 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
5230 if (! peer_group_active (peer
) ||
5231 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
5232 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
5234 /* Update-source. */
5235 if (peer
->update_if
)
5236 if (! peer_group_active (peer
) || ! g_peer
->update_if
5237 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
5238 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
5239 peer
->update_if
, VTY_NEWLINE
);
5240 if (peer
->update_source
)
5241 if (! peer_group_active (peer
) || ! g_peer
->update_source
5242 || sockunion_cmp (g_peer
->update_source
,
5243 peer
->update_source
) != 0)
5244 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
5245 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
5248 /* advertisement-interval */
5249 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
5250 ! peer_group_active (peer
))
5251 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
5252 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
5255 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
5256 && ! peer_group_active (peer
))
5257 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
5258 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
5260 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
5261 ! peer_group_active (peer
))
5262 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
5263 peer
->connect
, VTY_NEWLINE
);
5265 /* Default weight. */
5266 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
5267 if (! peer_group_active (peer
) ||
5268 g_peer
->weight
!= peer
->weight
)
5269 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
5272 /* Dynamic capability. */
5273 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
5274 if (! peer_group_active (peer
) ||
5275 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
5276 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
5279 /* dont capability negotiation. */
5280 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
5281 if (! peer_group_active (peer
) ||
5282 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
5283 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
5286 /* override capability negotiation. */
5287 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
5288 if (! peer_group_active (peer
) ||
5289 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
5290 vty_out (vty
, " neighbor %s override-capability%s", addr
,
5293 /* strict capability negotiation. */
5294 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
5295 if (! peer_group_active (peer
) ||
5296 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
5297 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
5300 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
5302 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5304 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
5305 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
5309 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
5310 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
5316 /************************************
5317 ****** Per AF to the neighbor ******
5318 ************************************/
5320 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
5322 if (peer
->af_group
[afi
][safi
])
5323 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
5324 peer
->group
->name
, VTY_NEWLINE
);
5326 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
5329 /* ORF capability. */
5330 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
5331 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
5332 if (! peer
->af_group
[afi
][safi
])
5334 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
5336 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
5337 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
5338 vty_out (vty
, " both");
5339 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
5340 vty_out (vty
, " send");
5342 vty_out (vty
, " receive");
5343 vty_out (vty
, "%s", VTY_NEWLINE
);
5346 /* Route reflector client. */
5347 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
5348 && ! peer
->af_group
[afi
][safi
])
5349 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
5353 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
5354 && ! peer
->af_group
[afi
][safi
])
5355 vty_out (vty
, " neighbor %s next-hop-self%s%s", addr
,
5356 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF_ALL
) ?
5357 " all" : "", VTY_NEWLINE
);
5359 /* Remove private AS. */
5360 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
5361 && ! peer
->af_group
[afi
][safi
])
5362 vty_out (vty
, " neighbor %s remove-private-AS%s",
5365 /* send-community print. */
5366 if (! peer
->af_group
[afi
][safi
])
5368 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5370 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5371 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5372 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
5373 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5374 vty_out (vty
, " neighbor %s send-community extended%s",
5376 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5377 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
5381 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5382 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5383 vty_out (vty
, " no neighbor %s send-community both%s",
5385 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5386 vty_out (vty
, " no neighbor %s send-community extended%s",
5388 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5389 vty_out (vty
, " no neighbor %s send-community%s",
5394 /* Default information */
5395 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
5396 && ! peer
->af_group
[afi
][safi
])
5398 vty_out (vty
, " neighbor %s default-originate", addr
);
5399 if (peer
->default_rmap
[afi
][safi
].name
)
5400 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
5401 vty_out (vty
, "%s", VTY_NEWLINE
);
5404 /* Soft reconfiguration inbound. */
5405 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5406 if (! peer
->af_group
[afi
][safi
] ||
5407 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5408 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
5411 /* maximum-prefix. */
5412 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
5413 if (! peer
->af_group
[afi
][safi
]
5414 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
5415 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
5416 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
5417 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5419 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
5420 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
5421 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
5422 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5423 vty_out (vty
, " warning-only");
5424 if (peer
->pmax_restart
[afi
][safi
])
5425 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
5426 vty_out (vty
, "%s", VTY_NEWLINE
);
5429 /* Route server client. */
5430 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
5431 && ! peer
->af_group
[afi
][safi
])
5432 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
5434 /* Nexthop-local unchanged. */
5435 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
5436 && ! peer
->af_group
[afi
][safi
])
5437 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
5440 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
5441 if (! peer_group_active (peer
)
5442 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
5443 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
5445 if (peer
->allowas_in
[afi
][safi
] == 3)
5446 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
5448 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
5449 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
5453 bgp_config_write_filter (vty
, peer
, afi
, safi
);
5455 /* atribute-unchanged. */
5456 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5457 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5458 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5459 && ! peer
->af_group
[afi
][safi
])
5461 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5462 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5463 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5464 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
5466 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
5467 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
5469 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
5471 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
5472 " med" : "", VTY_NEWLINE
);
5476 /* Display "address-family" configuration header. */
5478 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
5484 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5487 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
5491 if (safi
== SAFI_MULTICAST
)
5492 vty_out (vty
, "ipv4 multicast");
5493 else if (safi
== SAFI_MPLS_VPN
)
5494 vty_out (vty
, "vpnv4 unicast");
5496 else if (afi
== AFI_IP6
)
5498 vty_out (vty
, "ipv6");
5500 if (safi
== SAFI_MULTICAST
)
5501 vty_out (vty
, " multicast");
5504 vty_out (vty
, "%s", VTY_NEWLINE
);
5509 /* Address family based peer configuration display. */
5511 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
5516 struct peer_group
*group
;
5517 struct listnode
*node
, *nnode
;
5519 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
5521 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
5523 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5525 if (group
->conf
->afc
[afi
][safi
])
5527 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5528 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
5531 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5533 if (peer
->afc
[afi
][safi
])
5535 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
5537 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5538 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
5543 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
5544 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
5547 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
5553 bgp_config_write (struct vty
*vty
)
5557 struct peer_group
*group
;
5559 struct listnode
*node
, *nnode
;
5560 struct listnode
*mnode
, *mnnode
;
5562 /* BGP Multiple instance. */
5563 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5565 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
5569 /* BGP Config type. */
5570 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5572 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
5576 /* BGP configuration. */
5577 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5580 vty_out (vty
, "!%s", VTY_NEWLINE
);
5582 /* Router bgp ASN */
5583 vty_out (vty
, "router bgp %u", bgp
->as
);
5585 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5588 vty_out (vty
, " view %s", bgp
->name
);
5590 vty_out (vty
, "%s", VTY_NEWLINE
);
5592 /* No Synchronization */
5593 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5594 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
5596 /* BGP fast-external-failover. */
5597 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
5598 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
5600 /* BGP router ID. */
5601 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
5602 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
5605 /* BGP log-neighbor-changes. */
5606 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
5607 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
5609 /* BGP configuration. */
5610 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
5611 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
5613 /* BGP default ipv4-unicast. */
5614 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5615 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
5617 /* BGP default local-preference. */
5618 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
5619 vty_out (vty
, " bgp default local-preference %d%s",
5620 bgp
->default_local_pref
, VTY_NEWLINE
);
5622 /* BGP client-to-client reflection. */
5623 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
5624 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
5626 /* BGP cluster ID. */
5627 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
5628 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
5631 /* Confederation identifier*/
5632 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
5633 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
5636 /* Confederation peer */
5637 if (bgp
->confed_peers_cnt
> 0)
5641 vty_out (vty
, " bgp confederation peers");
5643 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
5644 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
5646 vty_out (vty
, "%s", VTY_NEWLINE
);
5649 /* BGP enforce-first-as. */
5650 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
5651 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
5653 /* BGP deterministic-med. */
5654 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
5655 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
5657 /* BGP update-delay. */
5658 bgp_config_write_update_delay (vty
, bgp
);
5661 bgp_config_write_wpkt_quanta (vty
, bgp
);
5663 /* BGP graceful-restart. */
5664 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
5665 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
5666 bgp
->stalepath_time
, VTY_NEWLINE
);
5667 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
5668 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
5670 /* BGP bestpath method. */
5671 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
5672 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
5673 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
5674 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
5675 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
5676 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
5678 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
5679 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
5680 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
5681 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5683 vty_out (vty
, " bgp bestpath med");
5684 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
5685 vty_out (vty
, " confed");
5686 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5687 vty_out (vty
, " missing-as-worst");
5688 vty_out (vty
, "%s", VTY_NEWLINE
);
5691 /* BGP network import check. */
5692 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
5693 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
5695 /* BGP scan interval. */
5696 bgp_config_write_scan_time (vty
);
5698 /* BGP flag dampening. */
5699 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
5700 BGP_CONFIG_DAMPENING
))
5701 bgp_config_write_damp (vty
);
5703 /* BGP static route configuration. */
5704 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5706 /* BGP redistribute configuration. */
5707 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5709 /* BGP timers configuration. */
5710 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
5711 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
5712 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
5713 bgp
->default_holdtime
, VTY_NEWLINE
);
5716 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5718 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
5721 /* Normal neighbor configuration. */
5722 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5724 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
5725 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
5729 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5730 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5732 /* Distance configuration. */
5733 bgp_config_write_distance (vty
, bgp
);
5735 /* No auto-summary */
5736 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5737 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
5739 /* IPv4 multicast configuration. */
5740 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
5742 /* IPv4 VPN configuration. */
5743 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
5745 /* IPv6 unicast configuration. */
5746 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
5748 /* IPv6 multicast configuration. */
5749 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
5757 bgp_master_init (void)
5759 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
5762 bm
->bgp
= list_new ();
5763 bm
->listen_sockets
= list_new ();
5764 bm
->port
= BGP_PORT_DEFAULT
;
5765 bm
->master
= thread_master_create ();
5766 bm
->start_time
= bgp_clock ();
5773 /* BGP VTY commands installation. */
5784 bgp_route_map_init ();
5785 bgp_address_init ();
5787 bgp_mplsvpn_init ();
5789 /* Access list initialize. */
5790 access_list_init ();
5791 access_list_add_hook (peer_distribute_update
);
5792 access_list_delete_hook (peer_distribute_update
);
5794 /* Filter list initialize. */
5796 as_list_add_hook (peer_aslist_update
);
5797 as_list_delete_hook (peer_aslist_update
);
5799 /* Prefix list initialize.*/
5800 prefix_list_init ();
5801 prefix_list_add_hook (peer_prefix_list_update
);
5802 prefix_list_delete_hook (peer_prefix_list_update
);
5804 /* Community list initialize. */
5805 bgp_clist
= community_list_init ();
5809 #endif /* HAVE_SNMP */
5813 bgp_terminate (void)
5817 struct listnode
*node
, *nnode
;
5818 struct listnode
*mnode
, *mnnode
;
5820 /* Close the listener sockets first as this prevents peers from attempting
5821 * to reconnect on receiving the peer unconfig message. In the presence
5822 * of a large number of peers this will ensure that no peer is left with
5823 * a dangling connection
5825 /* reverse bgp_master_init */
5827 if (bm
->listen_sockets
)
5828 list_free(bm
->listen_sockets
);
5829 bm
->listen_sockets
= NULL
;
5831 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5832 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5833 if (peer
->status
== Established
||
5834 peer
->status
== OpenSent
||
5835 peer
->status
== OpenConfirm
)
5836 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5837 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
5839 bgp_cleanup_routes ();
5841 if (bm
->process_main_queue
)
5843 work_queue_free (bm
->process_main_queue
);
5844 bm
->process_main_queue
= NULL
;
5846 if (bm
->process_rsclient_queue
)
5848 work_queue_free (bm
->process_rsclient_queue
);
5849 bm
->process_rsclient_queue
= NULL
;