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"
61 #include "bgpd/bgp_nht.h"
63 #include "bgpd/bgp_snmp.h"
64 #endif /* HAVE_SNMP */
66 /* BGP process wide configuration. */
67 static struct bgp_master bgp_master
;
69 extern struct in_addr router_id_zebra
;
71 /* BGP process wide configuration pointer to export. */
72 struct bgp_master
*bm
;
74 /* BGP community-list. */
75 struct community_list_handler
*bgp_clist
;
79 bgp_session_reset(struct peer
*peer
)
81 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
82 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
83 peer_delete(peer
->doppelganger
);
85 BGP_EVENT_ADD (peer
, BGP_Stop
);
89 * During session reset, we may delete the doppelganger peer, which would
90 * be the next node to the current node. If the session reset was invoked
91 * during walk of peer list, we would end up accessing the freed next
92 * node. This function moves the next node along.
95 bgp_session_reset_safe(struct peer
*peer
, struct listnode
**nnode
)
100 n
= (nnode
) ? *nnode
: NULL
;
101 npeer
= (n
) ? listgetdata(n
) : NULL
;
103 if (peer
->doppelganger
&& (peer
->doppelganger
->status
!= Deleted
)
104 && !(CHECK_FLAG(peer
->doppelganger
->flags
, PEER_FLAG_CONFIG_NODE
)))
106 if (peer
->doppelganger
== npeer
)
107 /* nnode and *nnode are confirmed to be non-NULL here */
108 *nnode
= (*nnode
)->next
;
109 peer_delete(peer
->doppelganger
);
112 BGP_EVENT_ADD (peer
, BGP_Stop
);
115 /* BGP global flag manipulation. */
117 bgp_option_set (int flag
)
122 case BGP_OPT_MULTIPLE_INSTANCE
:
123 case BGP_OPT_CONFIG_CISCO
:
124 case BGP_OPT_NO_LISTEN
:
125 SET_FLAG (bm
->options
, flag
);
128 return BGP_ERR_INVALID_FLAG
;
134 bgp_option_unset (int flag
)
138 case BGP_OPT_MULTIPLE_INSTANCE
:
139 if (listcount (bm
->bgp
) > 1)
140 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
143 case BGP_OPT_CONFIG_CISCO
:
144 UNSET_FLAG (bm
->options
, flag
);
147 return BGP_ERR_INVALID_FLAG
;
153 bgp_option_check (int flag
)
155 return CHECK_FLAG (bm
->options
, flag
);
158 /* BGP flag manipulation. */
160 bgp_flag_set (struct bgp
*bgp
, int flag
)
162 SET_FLAG (bgp
->flags
, flag
);
167 bgp_flag_unset (struct bgp
*bgp
, int flag
)
169 UNSET_FLAG (bgp
->flags
, flag
);
174 bgp_flag_check (struct bgp
*bgp
, int flag
)
176 return CHECK_FLAG (bgp
->flags
, flag
);
179 /* Internal function to set BGP structure configureation flag. */
181 bgp_config_set (struct bgp
*bgp
, int config
)
183 SET_FLAG (bgp
->config
, config
);
187 bgp_config_unset (struct bgp
*bgp
, int config
)
189 UNSET_FLAG (bgp
->config
, config
);
193 bgp_config_check (struct bgp
*bgp
, int config
)
195 return CHECK_FLAG (bgp
->config
, config
);
198 /* Set BGP router identifier. */
200 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
203 struct listnode
*node
, *nnode
;
205 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
206 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
209 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
210 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
212 /* Set all peer's local identifier with this value. */
213 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
215 IPV4_ADDR_COPY (&peer
->local_id
, id
);
217 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
219 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
220 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
221 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
227 /* BGP's cluster-id control. */
229 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
232 struct listnode
*node
, *nnode
;
234 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
235 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
238 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
239 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
241 /* Clear all IBGP peer. */
242 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
244 if (peer
->sort
!= BGP_PEER_IBGP
)
247 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
249 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
250 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
251 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
258 bgp_cluster_id_unset (struct bgp
*bgp
)
261 struct listnode
*node
, *nnode
;
263 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
266 bgp
->cluster_id
.s_addr
= 0;
267 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
269 /* Clear all IBGP peer. */
270 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
272 if (peer
->sort
!= BGP_PEER_IBGP
)
275 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
277 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
278 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
279 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
285 /* time_t value that is monotonicly increasing
286 * and uneffected by adjustments to system clock
288 time_t bgp_clock (void)
292 quagga_gettime(QUAGGA_CLK_MONOTONIC
, &tv
);
296 /* BGP timer configuration. */
298 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
300 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
301 ? keepalive
: holdtime
/ 3);
302 bgp
->default_holdtime
= holdtime
;
308 bgp_timers_unset (struct bgp
*bgp
)
310 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
311 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
316 /* BGP confederation configuration. */
318 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
321 struct listnode
*node
, *nnode
;
325 return BGP_ERR_INVALID_AS
;
327 /* Remember - were we doing confederation before? */
328 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
330 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
332 /* If we were doing confederation already, this is just an external
333 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
334 were not doing confederation before, reset all EBGP sessions. */
335 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
337 /* We're looking for peers who's AS is not local or part of our
341 if (peer_sort (peer
) == BGP_PEER_EBGP
)
344 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
346 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
347 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
348 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
351 bgp_session_reset_safe(peer
, &nnode
);
356 /* Not doign confederation before, so reset every non-local
358 if (peer_sort (peer
) != BGP_PEER_IBGP
)
360 /* Reset the local_as to be our EBGP one */
361 if (peer_sort (peer
) == BGP_PEER_EBGP
)
363 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
365 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
366 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
367 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
370 bgp_session_reset_safe(peer
, &nnode
);
378 bgp_confederation_id_unset (struct bgp
*bgp
)
381 struct listnode
*node
, *nnode
;
384 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
386 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
388 /* We're looking for peers who's AS is not local */
389 if (peer_sort (peer
) != BGP_PEER_IBGP
)
391 peer
->local_as
= bgp
->as
;
392 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
394 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
395 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
396 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
400 bgp_session_reset_safe(peer
, &nnode
);
406 /* Is an AS part of the confed or not? */
408 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
415 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
416 if (bgp
->confed_peers
[i
] == as
)
422 /* Add an AS to the confederation set. */
424 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
427 struct listnode
*node
, *nnode
;
430 return BGP_ERR_INVALID_BGP
;
433 return BGP_ERR_INVALID_AS
;
435 if (bgp_confederation_peers_check (bgp
, as
))
438 if (bgp
->confed_peers
)
439 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
441 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
443 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
444 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
446 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
447 bgp
->confed_peers_cnt
++;
449 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
451 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
455 peer
->local_as
= bgp
->as
;
456 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
458 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
459 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
460 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
463 bgp_session_reset_safe(peer
, &nnode
);
470 /* Delete an AS from the confederation set. */
472 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
477 struct listnode
*node
, *nnode
;
482 if (! bgp_confederation_peers_check (bgp
, as
))
485 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
486 if (bgp
->confed_peers
[i
] == as
)
487 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
488 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
490 bgp
->confed_peers_cnt
--;
492 if (bgp
->confed_peers_cnt
== 0)
494 if (bgp
->confed_peers
)
495 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
496 bgp
->confed_peers
= NULL
;
499 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
501 bgp
->confed_peers_cnt
* sizeof (as_t
));
503 /* Now reset any peer who's remote AS has just been removed from the
505 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
507 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
511 peer
->local_as
= bgp
->confed_id
;
512 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
514 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
515 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
516 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
519 bgp_session_reset_safe(peer
, &nnode
);
527 /* Local preference configuration. */
529 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
534 bgp
->default_local_pref
= local_pref
;
540 bgp_default_local_preference_unset (struct bgp
*bgp
)
545 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
550 /* If peer is RSERVER_CLIENT in at least one address family and is not member
551 of a peer_group for that family, return 1.
552 Used to check wether the peer is included in list bgp->rsclient. */
554 peer_rsclient_active (struct peer
*peer
)
559 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
560 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
561 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
562 && ! peer
->af_group
[i
][j
])
567 /* Peer comparison function for sorting. */
569 peer_cmp (struct peer
*p1
, struct peer
*p2
)
571 return sockunion_cmp (&p1
->su
, &p2
->su
);
575 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
577 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
580 /* Reset all address family specific configuration. */
582 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
585 struct bgp_filter
*filter
;
586 char orf_name
[BUFSIZ
];
588 filter
= &peer
->filter
[afi
][safi
];
590 /* Clear neighbor filter and route-map */
591 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
593 if (filter
->dlist
[i
].name
)
595 free (filter
->dlist
[i
].name
);
596 filter
->dlist
[i
].name
= NULL
;
598 if (filter
->plist
[i
].name
)
600 free (filter
->plist
[i
].name
);
601 filter
->plist
[i
].name
= NULL
;
603 if (filter
->aslist
[i
].name
)
605 free (filter
->aslist
[i
].name
);
606 filter
->aslist
[i
].name
= NULL
;
609 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
611 if (filter
->map
[i
].name
)
613 free (filter
->map
[i
].name
);
614 filter
->map
[i
].name
= NULL
;
618 /* Clear unsuppress map. */
619 if (filter
->usmap
.name
)
620 free (filter
->usmap
.name
);
621 filter
->usmap
.name
= NULL
;
622 filter
->usmap
.map
= NULL
;
624 /* Clear neighbor's all address family flags. */
625 peer
->af_flags
[afi
][safi
] = 0;
627 /* Clear neighbor's all address family sflags. */
628 peer
->af_sflags
[afi
][safi
] = 0;
630 /* Clear neighbor's all address family capabilities. */
631 peer
->af_cap
[afi
][safi
] = 0;
634 peer
->orf_plist
[afi
][safi
] = NULL
;
635 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
636 prefix_bgp_orf_remove_all (orf_name
);
638 /* Set default neighbor send-community. */
639 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
641 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
642 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
645 /* Clear neighbor default_originate_rmap */
646 if (peer
->default_rmap
[afi
][safi
].name
)
647 free (peer
->default_rmap
[afi
][safi
].name
);
648 peer
->default_rmap
[afi
][safi
].name
= NULL
;
649 peer
->default_rmap
[afi
][safi
].map
= NULL
;
651 /* Clear neighbor maximum-prefix */
652 peer
->pmax
[afi
][safi
] = 0;
653 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
656 /* peer global config reset */
658 peer_global_config_reset (struct peer
*peer
)
661 peer
->change_local_as
= 0;
662 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
663 if (peer
->update_source
)
665 sockunion_free (peer
->update_source
);
666 peer
->update_source
= NULL
;
670 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
671 peer
->update_if
= NULL
;
674 if (peer_sort (peer
) == BGP_PEER_IBGP
)
675 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
677 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
684 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
687 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
688 static bgp_peer_sort_t
689 peer_calc_sort (struct peer
*peer
)
696 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
699 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
703 peer1
= listnode_head (peer
->group
->peer
);
705 return (peer1
->local_as
== peer1
->as
706 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
708 return BGP_PEER_INTERNAL
;
712 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
714 if (peer
->local_as
== 0)
715 return BGP_PEER_INTERNAL
;
717 if (peer
->local_as
== peer
->as
)
719 if (peer
->local_as
== bgp
->confed_id
)
720 return BGP_PEER_EBGP
;
722 return BGP_PEER_IBGP
;
725 if (bgp_confederation_peers_check (bgp
, peer
->as
))
726 return BGP_PEER_CONFED
;
728 return BGP_PEER_EBGP
;
732 return (peer
->local_as
== 0
733 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
734 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
738 /* Calculate and cache the peer "sort" */
740 peer_sort (struct peer
*peer
)
742 peer
->sort
= peer_calc_sort (peer
);
747 peer_free (struct peer
*peer
)
749 assert (peer
->status
== Deleted
);
751 bgp_unlock(peer
->bgp
);
753 /* this /ought/ to have been done already through bgp_stop earlier,
754 * but just to be sure..
756 bgp_timer_set (peer
);
757 BGP_READ_OFF (peer
->t_read
);
758 BGP_WRITE_OFF (peer
->t_write
);
759 BGP_EVENT_FLUSH (peer
);
762 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
764 /* Free allocated host character. */
766 XFREE (MTYPE_BGP_PEER_HOST
, peer
->host
);
768 /* Update source configuration. */
769 if (peer
->update_source
)
770 sockunion_free (peer
->update_source
);
773 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
775 if (peer
->clear_node_queue
)
776 work_queue_free (peer
->clear_node_queue
);
778 bgp_sync_delete (peer
);
781 XFREE (MTYPE_PEER_CONF_IF
, peer
->conf_if
);
783 memset (peer
, 0, sizeof (struct peer
));
785 XFREE (MTYPE_BGP_PEER
, peer
);
788 /* increase reference count on a struct peer */
790 peer_lock (struct peer
*peer
)
792 assert (peer
&& (peer
->lock
>= 0));
799 /* decrease reference count on a struct peer
800 * struct peer is freed and NULL returned if last reference
803 peer_unlock (struct peer
*peer
)
805 assert (peer
&& (peer
->lock
> 0));
812 zlog_debug ("unlocked and freeing");
813 zlog_backtrace (LOG_DEBUG
);
822 zlog_debug ("unlocked to 1");
823 zlog_backtrace (LOG_DEBUG
);
830 /* Allocate new peer object, implicitely locked. */
832 peer_new (struct bgp
*bgp
)
839 /* bgp argument is absolutely required */
844 /* Allocate new peer. */
845 peer
= XCALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
847 /* Set default value. */
849 peer
->v_start
= BGP_INIT_START_TIMER
;
850 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
851 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
853 peer
->ostatus
= Idle
;
855 peer
= peer_lock (peer
); /* initial reference */
858 peer
->password
= NULL
;
860 /* Set default flags. */
861 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
862 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
864 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
866 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
867 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
869 peer
->orf_plist
[afi
][safi
] = NULL
;
871 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
873 /* Create buffers. */
874 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
875 peer
->obuf
= stream_fifo_new ();
877 /* We use a larger buffer for peer->work in the event that:
878 * - We RX a BGP_UPDATE where the attributes alone are just
879 * under BGP_MAX_PACKET_SIZE
880 * - The user configures an outbound route-map that does many as-path
881 * prepends or adds many communities. At most they can have CMD_ARGC_MAX
882 * args in a route-map so there is a finite limit on how large they can
883 * make the attributes.
885 * Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
886 * checking for every single attribute as we construct an UPDATE.
888 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
+ BGP_MAX_PACKET_SIZE_OVERFLOW
);
889 peer
->scratch
= stream_new (BGP_MAX_PACKET_SIZE
);
892 bgp_sync_init (peer
);
894 /* Get service port number. */
895 sp
= getservbyname ("bgp", "tcp");
896 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
902 * This function is invoked when a duplicate peer structure associated with
903 * a neighbor is being deleted. If this about-to-be-deleted structure is
904 * the one with all the config, then we have to copy over the info.
907 peer_xfer_config (struct peer
*peer_dst
, struct peer
*peer_src
)
915 /* The following function is used by both peer group config copy to
916 * individual peer and when we transfer config
918 if (peer_src
->change_local_as
)
919 peer_dst
->change_local_as
= peer_src
->change_local_as
;
921 /* peer flags apply */
922 peer_dst
->flags
= peer_src
->flags
;
923 peer_dst
->cap
= peer_src
->cap
;
924 peer_dst
->config
= peer_src
->config
;
926 peer_dst
->local_as
= peer_src
->local_as
;
927 peer_dst
->ifindex
= peer_src
->ifindex
;
928 peer_dst
->port
= peer_src
->port
;
930 peer_dst
->rmap_type
= peer_src
->rmap_type
;
933 peer_dst
->holdtime
= peer_src
->holdtime
;
934 peer_dst
->keepalive
= peer_src
->keepalive
;
935 peer_dst
->connect
= peer_src
->connect
;
936 peer_dst
->v_holdtime
= peer_src
->v_holdtime
;
937 peer_dst
->v_keepalive
= peer_src
->v_keepalive
;
938 peer_dst
->v_asorig
= peer_src
->v_asorig
;
939 peer_dst
->routeadv
= peer_src
->routeadv
;
940 peer_dst
->v_routeadv
= peer_src
->v_routeadv
;
943 if (peer_src
->password
&& !peer_dst
->password
)
944 peer_dst
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, peer_src
->password
);
946 bgp_md5_set (peer_dst
);
948 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
949 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
951 peer_dst
->afc
[afi
][safi
] = peer_src
->afc
[afi
][safi
];
952 peer_dst
->af_flags
[afi
][safi
] = peer_src
->af_flags
[afi
][safi
];
953 peer_dst
->allowas_in
[afi
][safi
] = peer_src
->allowas_in
[afi
][safi
];
956 /* update-source apply */
957 if (peer_src
->update_source
)
959 if (peer_dst
->update_source
)
960 sockunion_free (peer_dst
->update_source
);
961 if (peer_dst
->update_if
)
963 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
964 peer_dst
->update_if
= NULL
;
966 peer_dst
->update_source
= sockunion_dup (peer_src
->update_source
);
968 else if (peer_src
->update_if
)
970 if (peer_dst
->update_if
)
971 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer_dst
->update_if
);
972 if (peer_dst
->update_source
)
974 sockunion_free (peer_dst
->update_source
);
975 peer_dst
->update_source
= NULL
;
977 peer_dst
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, peer_src
->update_if
);
980 if (peer_src
->ifname
)
982 if (peer_dst
->ifname
)
983 free(peer_dst
->ifname
);
985 peer_dst
->ifname
= strdup(peer_src
->ifname
);
990 * Set or reset the peer address socketunion structure based on the
991 * learnt peer address. Currently via the source address of the
992 * ipv6 ND router-advertisement.
995 bgp_peer_conf_if_to_su_update (struct peer
*peer
)
997 struct interface
*ifp
;
998 struct nbr_connected
*ifc
;
1003 if ((ifp
= if_lookup_by_name(peer
->conf_if
)) &&
1004 ifp
->nbr_connected
&&
1005 (ifc
= listnode_head(ifp
->nbr_connected
)))
1007 peer
->su
.sa
.sa_family
= AF_INET6
;
1008 memcpy(&peer
->su
.sin6
.sin6_addr
, &ifc
->address
->u
.prefix
,
1009 sizeof (struct in6_addr
));
1011 peer
->su
.sin6
.sin6_len
= sizeof (struct sockaddr_in6
);
1016 /* This works as an indication of unresolved peer address
1017 on a BGP interface*/
1018 peer
->su
.sa
.sa_family
= AF_UNSPEC
;
1019 memset(&peer
->su
.sin6
.sin6_addr
, 0, sizeof (struct in6_addr
));
1023 /* Create new BGP peer. */
1025 peer_create (union sockunion
*su
, const char *conf_if
, struct bgp
*bgp
,
1026 as_t local_as
, as_t remote_as
, afi_t afi
, safi_t safi
)
1030 char buf
[SU_ADDRSTRLEN
];
1032 peer
= peer_new (bgp
);
1035 peer
->conf_if
= XSTRDUP (MTYPE_PEER_CONF_IF
, conf_if
);
1036 bgp_peer_conf_if_to_su_update(peer
);
1037 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, conf_if
);
1042 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
1043 peer
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, buf
);
1045 peer
->local_as
= local_as
;
1046 peer
->as
= remote_as
;
1047 peer
->local_id
= bgp
->router_id
;
1048 peer
->v_holdtime
= bgp
->default_holdtime
;
1049 peer
->v_keepalive
= bgp
->default_keepalive
;
1050 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1051 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1053 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1055 peer
= peer_lock (peer
); /* bgp peer list reference */
1056 listnode_add_sort (bgp
->peer
, peer
);
1058 active
= peer_active (peer
);
1061 peer
->afc
[afi
][safi
] = 1;
1063 /* Last read and reset time set */
1064 peer
->readtime
= peer
->resettime
= bgp_clock ();
1066 /* Default TTL set. */
1067 peer
->ttl
= (peer
->sort
== BGP_PEER_IBGP
) ? 255 : 1;
1069 SET_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
);
1071 /* Set up peer's events and timers. */
1072 if (! active
&& peer_active (peer
))
1073 bgp_timer_set (peer
);
1079 peer_conf_interface_get(struct bgp
*bgp
, const char *conf_if
, afi_t afi
,
1084 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1087 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1088 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1089 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, 0, 0);
1091 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, 0, afi
, safi
);
1098 /* Make accept BGP peer. Called from bgp_accept (). */
1100 peer_create_accept (struct bgp
*bgp
)
1104 peer
= peer_new (bgp
);
1106 peer
= peer_lock (peer
); /* bgp peer list reference */
1107 listnode_add_sort (bgp
->peer
, peer
);
1112 /* Change peer's AS number. */
1114 peer_as_change (struct peer
*peer
, as_t as
)
1116 bgp_peer_sort_t type
;
1120 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1122 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
1124 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
1125 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1126 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1129 bgp_session_reset(peer
);
1131 type
= peer_sort (peer
);
1134 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
1135 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
1136 && peer
->bgp
->as
!= as
)
1137 peer
->local_as
= peer
->bgp
->confed_id
;
1139 peer
->local_as
= peer
->bgp
->as
;
1141 /* Advertisement-interval reset */
1144 conf
= peer
->group
->conf
;
1146 if (conf
&& CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1147 peer
->v_routeadv
= conf
->routeadv
;
1149 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1150 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1152 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1155 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1157 else if (type
== BGP_PEER_IBGP
)
1160 /* reflector-client reset */
1161 if (peer_sort (peer
) != BGP_PEER_IBGP
)
1163 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1164 PEER_FLAG_REFLECTOR_CLIENT
);
1165 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
1166 PEER_FLAG_REFLECTOR_CLIENT
);
1167 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
1168 PEER_FLAG_REFLECTOR_CLIENT
);
1169 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1170 PEER_FLAG_REFLECTOR_CLIENT
);
1171 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
1172 PEER_FLAG_REFLECTOR_CLIENT
);
1175 /* local-as reset */
1176 if (peer_sort (peer
) != BGP_PEER_EBGP
)
1178 peer
->change_local_as
= 0;
1179 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1180 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
1184 /* If peer does not exist, create new one. If peer already exists,
1185 set AS number to the peer. */
1187 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, const char *conf_if
, as_t
*as
,
1188 afi_t afi
, safi_t safi
)
1194 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
1196 peer
= peer_lookup (bgp
, su
);
1200 /* When this peer is a member of peer-group. */
1203 if (peer
->group
->conf
->as
)
1205 /* Return peer group's AS number. */
1206 *as
= peer
->group
->conf
->as
;
1207 return BGP_ERR_PEER_GROUP_MEMBER
;
1209 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
1214 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1222 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1227 /* Existing peer's AS number change. */
1228 if (peer
->as
!= *as
)
1229 peer_as_change (peer
, *as
);
1234 return BGP_ERR_NO_INTERFACE_CONFIG
;
1236 /* If the peer is not part of our confederation, and its not an
1237 iBGP peer then spoof the source AS */
1238 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
1239 && ! bgp_confederation_peers_check (bgp
, *as
)
1241 local_as
= bgp
->confed_id
;
1245 /* If this is IPv4 unicast configuration and "no bgp default
1246 ipv4-unicast" is specified. */
1248 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
1249 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
1250 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, 0, 0);
1252 peer
= peer_create (su
, conf_if
, bgp
, local_as
, *as
, afi
, safi
);
1258 /* Activate the peer or peer group for specified AFI and SAFI. */
1260 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1264 if (peer
->afc
[afi
][safi
])
1267 /* Activate the address family configuration. */
1268 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1269 peer
->afc
[afi
][safi
] = 1;
1272 active
= peer_active (peer
);
1274 peer
->afc
[afi
][safi
] = 1;
1276 if (! active
&& peer_active (peer
))
1277 bgp_timer_set (peer
);
1280 if (peer
->status
== Established
)
1282 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1284 peer
->afc_adv
[afi
][safi
] = 1;
1285 bgp_capability_send (peer
, afi
, safi
,
1287 CAPABILITY_ACTION_SET
);
1288 if (peer
->afc_recv
[afi
][safi
])
1290 peer
->afc_nego
[afi
][safi
] = 1;
1291 bgp_announce_route (peer
, afi
, safi
);
1296 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
1297 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1298 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1307 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
1309 struct peer_group
*group
;
1311 struct listnode
*node
, *nnode
;
1313 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1315 group
= peer
->group
;
1317 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
1319 if (peer1
->af_group
[afi
][safi
])
1320 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
1325 if (peer
->af_group
[afi
][safi
])
1326 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1329 if (! peer
->afc
[afi
][safi
])
1332 /* De-activate the address family configuration. */
1333 peer
->afc
[afi
][safi
] = 0;
1334 peer_af_flag_reset (peer
, afi
, safi
);
1336 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1338 if (peer
->status
== Established
)
1340 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1342 peer
->afc_adv
[afi
][safi
] = 0;
1343 peer
->afc_nego
[afi
][safi
] = 0;
1345 if (peer_active_nego (peer
))
1347 bgp_capability_send (peer
, afi
, safi
,
1349 CAPABILITY_ACTION_UNSET
);
1350 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_NORMAL
);
1351 peer
->pcount
[afi
][safi
] = 0;
1355 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1356 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1357 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1362 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1363 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1364 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1372 peer_nsf_stop (struct peer
*peer
)
1377 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
1378 UNSET_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
);
1380 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1381 for (safi
= SAFI_UNICAST
; safi
< SAFI_RESERVED_3
; safi
++)
1382 peer
->nsf
[afi
][safi
] = 0;
1384 if (peer
->t_gr_restart
)
1386 BGP_TIMER_OFF (peer
->t_gr_restart
);
1387 if (bgp_debug_neighbor_events(peer
))
1388 zlog_debug ("%s graceful restart timer stopped", peer
->host
);
1390 if (peer
->t_gr_stale
)
1392 BGP_TIMER_OFF (peer
->t_gr_stale
);
1393 if (bgp_debug_neighbor_events(peer
))
1394 zlog_debug ("%s graceful restart stalepath timer stopped", peer
->host
);
1396 bgp_clear_route_all (peer
);
1399 /* Delete peer from confguration.
1401 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1402 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1404 * This function /should/ take care to be idempotent, to guard against
1405 * it being called multiple times through stray events that come in
1406 * that happen to result in this function being called again. That
1407 * said, getting here for a "Deleted" peer is a bug in the neighbour
1411 peer_delete (struct peer
*peer
)
1417 struct bgp_filter
*filter
;
1418 struct listnode
*pn
;
1420 assert (peer
->status
!= Deleted
);
1424 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
1425 peer_nsf_stop (peer
);
1427 SET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1429 /* If this peer belongs to peer group, clear up the
1433 if ((pn
= listnode_lookup (peer
->group
->peer
, peer
)))
1435 peer
= peer_unlock (peer
); /* group->peer list reference */
1436 list_delete_node (peer
->group
->peer
, pn
);
1441 /* Withdraw all information from routing table. We can not use
1442 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1443 * executed after peer structure is deleted.
1445 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1447 UNSET_FLAG(peer
->flags
, PEER_FLAG_DELETE
);
1449 if (peer
->doppelganger
)
1450 peer
->doppelganger
->doppelganger
= NULL
;
1451 peer
->doppelganger
= NULL
;
1453 UNSET_FLAG(peer
->sflags
, PEER_STATUS_ACCEPT_PEER
);
1454 bgp_fsm_change_status (peer
, Deleted
);
1456 /* Password configuration */
1459 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
1460 peer
->password
= NULL
;
1462 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1466 bgp_timer_set (peer
); /* stops all timers for Deleted */
1468 /* Delete from all peer list. */
1469 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
1470 && (pn
= listnode_lookup (bgp
->peer
, peer
)))
1472 peer_unlock (peer
); /* bgp peer list reference */
1473 list_delete_node (bgp
->peer
, pn
);
1476 if (peer_rsclient_active (peer
)
1477 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
1479 peer_unlock (peer
); /* rsclient list reference */
1480 list_delete_node (bgp
->rsclient
, pn
);
1482 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
1484 /* Clear our own rsclient ribs. */
1485 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1486 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1487 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1488 PEER_FLAG_RSERVER_CLIENT
))
1489 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
1493 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1494 member of a peer_group. */
1495 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1496 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1497 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1498 bgp_table_finish (&peer
->rib
[afi
][safi
]);
1502 stream_free (peer
->ibuf
);
1504 stream_fifo_free (peer
->obuf
);
1506 stream_free (peer
->work
);
1508 stream_free(peer
->scratch
);
1510 peer
->work
= peer
->scratch
= peer
->ibuf
= NULL
;
1512 /* Local and remote addresses. */
1514 sockunion_free (peer
->su_local
);
1515 if (peer
->su_remote
)
1516 sockunion_free (peer
->su_remote
);
1517 peer
->su_local
= peer
->su_remote
= NULL
;
1519 /* Free filter related memory. */
1520 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1521 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1523 filter
= &peer
->filter
[afi
][safi
];
1525 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1527 if (filter
->dlist
[i
].name
)
1528 free (filter
->dlist
[i
].name
);
1529 if (filter
->plist
[i
].name
)
1530 free (filter
->plist
[i
].name
);
1531 if (filter
->aslist
[i
].name
)
1532 free (filter
->aslist
[i
].name
);
1534 filter
->dlist
[i
].name
= NULL
;
1535 filter
->plist
[i
].name
= NULL
;
1536 filter
->aslist
[i
].name
= NULL
;
1538 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1540 if (filter
->map
[i
].name
)
1541 free (filter
->map
[i
].name
);
1542 filter
->map
[i
].name
= NULL
;
1545 if (filter
->usmap
.name
)
1546 free (filter
->usmap
.name
);
1548 if (peer
->default_rmap
[afi
][safi
].name
)
1549 free (peer
->default_rmap
[afi
][safi
].name
);
1551 filter
->usmap
.name
= NULL
;
1552 peer
->default_rmap
[afi
][safi
].name
= NULL
;
1555 peer_unlock (peer
); /* initial reference */
1561 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1563 return strcmp (g1
->name
, g2
->name
);
1566 /* If peer is configured at least one address family return 1. */
1568 peer_group_active (struct peer
*peer
)
1570 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1571 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1572 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1573 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1574 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1579 /* Peer group cofiguration. */
1580 static struct peer_group
*
1581 peer_group_new (void)
1583 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1584 sizeof (struct peer_group
));
1588 peer_group_free (struct peer_group
*group
)
1590 XFREE (MTYPE_PEER_GROUP
, group
);
1594 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1596 struct peer_group
*group
;
1597 struct listnode
*node
, *nnode
;
1599 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
1601 if (strcmp (group
->name
, name
) == 0)
1608 peer_group_get (struct bgp
*bgp
, const char *name
)
1610 struct peer_group
*group
;
1612 group
= peer_group_lookup (bgp
, name
);
1616 group
= peer_group_new ();
1618 group
->name
= strdup (name
);
1619 group
->peer
= list_new ();
1620 group
->conf
= peer_new (bgp
);
1621 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1622 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1623 group
->conf
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, name
);
1624 group
->conf
->group
= group
;
1625 group
->conf
->as
= 0;
1626 group
->conf
->ttl
= 1;
1627 group
->conf
->gtsm_hops
= 0;
1628 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1629 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1630 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1631 group
->conf
->keepalive
= 0;
1632 group
->conf
->holdtime
= 0;
1633 group
->conf
->connect
= 0;
1634 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1635 listnode_add_sort (bgp
->group
, group
);
1641 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1642 afi_t afi
, safi_t safi
)
1645 int out
= FILTER_OUT
;
1647 struct bgp_filter
*pfilter
;
1648 struct bgp_filter
*gfilter
;
1651 pfilter
= &peer
->filter
[afi
][safi
];
1652 gfilter
= &conf
->filter
[afi
][safi
];
1656 peer
->as
= conf
->as
;
1659 if (conf
->change_local_as
)
1660 peer
->change_local_as
= conf
->change_local_as
;
1663 peer
->ttl
= conf
->ttl
;
1666 peer
->gtsm_hops
= conf
->gtsm_hops
;
1669 peer
->weight
= conf
->weight
;
1671 /* peer flags apply */
1672 peer
->flags
= conf
->flags
;
1673 /* peer af_flags apply */
1674 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1675 /* peer config apply */
1676 peer
->config
= conf
->config
;
1678 /* peer timers apply */
1679 peer
->holdtime
= conf
->holdtime
;
1680 peer
->keepalive
= conf
->keepalive
;
1681 peer
->connect
= conf
->connect
;
1682 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1683 peer
->v_connect
= conf
->connect
;
1685 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1687 /* advertisement-interval reset */
1688 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_ROUTEADV
))
1689 peer
->v_routeadv
= conf
->routeadv
;
1691 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1692 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1694 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1696 /* password apply */
1697 if (conf
->password
&& !peer
->password
)
1698 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, conf
->password
);
1702 /* maximum-prefix */
1703 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1704 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1705 peer
->pmax_restart
[afi
][safi
] = conf
->pmax_restart
[afi
][safi
];
1708 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1710 /* route-server-client */
1711 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1713 /* Make peer's RIB point to group's RIB. */
1714 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1716 /* Import policy. */
1717 if (pfilter
->map
[RMAP_IMPORT
].name
)
1718 free (pfilter
->map
[RMAP_IMPORT
].name
);
1719 if (gfilter
->map
[RMAP_IMPORT
].name
)
1721 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1722 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1726 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1727 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1730 /* Export policy. */
1731 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1733 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1734 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1738 /* default-originate route-map */
1739 if (conf
->default_rmap
[afi
][safi
].name
)
1741 if (peer
->default_rmap
[afi
][safi
].name
)
1742 free (peer
->default_rmap
[afi
][safi
].name
);
1743 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1744 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1747 /* update-source apply */
1748 if (conf
->update_source
)
1750 if (peer
->update_source
)
1751 sockunion_free (peer
->update_source
);
1752 if (peer
->update_if
)
1754 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1755 peer
->update_if
= NULL
;
1757 peer
->update_source
= sockunion_dup (conf
->update_source
);
1759 else if (conf
->update_if
)
1761 if (peer
->update_if
)
1762 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1763 if (peer
->update_source
)
1765 sockunion_free (peer
->update_source
);
1766 peer
->update_source
= NULL
;
1768 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1771 /* inbound filter apply */
1772 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1774 if (pfilter
->dlist
[in
].name
)
1775 free (pfilter
->dlist
[in
].name
);
1776 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1777 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1779 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1781 if (pfilter
->plist
[in
].name
)
1782 free (pfilter
->plist
[in
].name
);
1783 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1784 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1786 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1788 if (pfilter
->aslist
[in
].name
)
1789 free (pfilter
->aslist
[in
].name
);
1790 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1791 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1793 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1795 if (pfilter
->map
[RMAP_IN
].name
)
1796 free (pfilter
->map
[RMAP_IN
].name
);
1797 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
1798 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
1801 /* outbound filter apply */
1802 if (gfilter
->dlist
[out
].name
)
1804 if (pfilter
->dlist
[out
].name
)
1805 free (pfilter
->dlist
[out
].name
);
1806 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1807 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1811 if (pfilter
->dlist
[out
].name
)
1812 free (pfilter
->dlist
[out
].name
);
1813 pfilter
->dlist
[out
].name
= NULL
;
1814 pfilter
->dlist
[out
].alist
= NULL
;
1816 if (gfilter
->plist
[out
].name
)
1818 if (pfilter
->plist
[out
].name
)
1819 free (pfilter
->plist
[out
].name
);
1820 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1821 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1825 if (pfilter
->plist
[out
].name
)
1826 free (pfilter
->plist
[out
].name
);
1827 pfilter
->plist
[out
].name
= NULL
;
1828 pfilter
->plist
[out
].plist
= NULL
;
1830 if (gfilter
->aslist
[out
].name
)
1832 if (pfilter
->aslist
[out
].name
)
1833 free (pfilter
->aslist
[out
].name
);
1834 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1835 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1839 if (pfilter
->aslist
[out
].name
)
1840 free (pfilter
->aslist
[out
].name
);
1841 pfilter
->aslist
[out
].name
= NULL
;
1842 pfilter
->aslist
[out
].aslist
= NULL
;
1844 if (gfilter
->map
[RMAP_OUT
].name
)
1846 if (pfilter
->map
[RMAP_OUT
].name
)
1847 free (pfilter
->map
[RMAP_OUT
].name
);
1848 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
1849 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
1853 if (pfilter
->map
[RMAP_OUT
].name
)
1854 free (pfilter
->map
[RMAP_OUT
].name
);
1855 pfilter
->map
[RMAP_OUT
].name
= NULL
;
1856 pfilter
->map
[RMAP_OUT
].map
= NULL
;
1859 /* RS-client's import/export route-maps. */
1860 if (gfilter
->map
[RMAP_IMPORT
].name
)
1862 if (pfilter
->map
[RMAP_IMPORT
].name
)
1863 free (pfilter
->map
[RMAP_IMPORT
].name
);
1864 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1865 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1869 if (pfilter
->map
[RMAP_IMPORT
].name
)
1870 free (pfilter
->map
[RMAP_IMPORT
].name
);
1871 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1872 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1874 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1876 if (pfilter
->map
[RMAP_EXPORT
].name
)
1877 free (pfilter
->map
[RMAP_EXPORT
].name
);
1878 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1879 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1882 if (gfilter
->usmap
.name
)
1884 if (pfilter
->usmap
.name
)
1885 free (pfilter
->usmap
.name
);
1886 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1887 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1891 if (pfilter
->usmap
.name
)
1892 free (pfilter
->usmap
.name
);
1893 pfilter
->usmap
.name
= NULL
;
1894 pfilter
->usmap
.map
= NULL
;
1898 /* Peer group's remote AS configuration. */
1900 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
, as_t
*as
)
1902 struct peer_group
*group
;
1904 struct listnode
*node
, *nnode
;
1906 group
= peer_group_lookup (bgp
, group_name
);
1910 if (group
->conf
->as
== *as
)
1913 /* When we setup peer-group AS number all peer group member's AS
1914 number must be updated to same number. */
1915 peer_as_change (group
->conf
, *as
);
1917 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1919 if (peer
->as
!= *as
)
1920 peer_as_change (peer
, *as
);
1927 peer_group_delete (struct peer_group
*group
)
1932 struct listnode
*node
, *nnode
;
1936 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1938 other
= peer
->doppelganger
;
1941 if (other
&& other
->status
!= Deleted
)
1943 other
->group
= NULL
;
1947 list_delete (group
->peer
);
1952 group
->conf
->group
= NULL
;
1953 peer_delete (group
->conf
);
1955 /* Delete from all peer_group list. */
1956 listnode_delete (bgp
->group
, group
);
1958 peer_group_free (group
);
1964 peer_group_remote_as_delete (struct peer_group
*group
)
1966 struct peer
*peer
, *other
;
1967 struct listnode
*node
, *nnode
;
1969 if (! group
->conf
->as
)
1972 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
1974 other
= peer
->doppelganger
;
1979 if (other
&& other
->status
!= Deleted
)
1981 other
->group
= NULL
;
1985 list_delete_all_node (group
->peer
);
1987 group
->conf
->as
= 0;
1992 /* Bind specified peer to peer group. */
1994 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
, struct peer
*peer
,
1995 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1997 int first_member
= 0;
1999 /* Check peer group's address family. */
2000 if (! group
->conf
->afc
[afi
][safi
])
2001 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
2003 /* Lookup the peer. */
2005 peer
= peer_lookup (bgp
, su
);
2007 /* Create a new peer. */
2010 if (! group
->conf
->as
)
2011 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
2013 peer
= peer_create (su
, NULL
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
2014 peer
->group
= group
;
2015 peer
->af_group
[afi
][safi
] = 1;
2017 peer
= peer_lock (peer
); /* group->peer list reference */
2018 listnode_add (group
->peer
, peer
);
2019 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2020 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2025 /* When the peer already belongs to peer group, check the consistency. */
2026 if (peer
->af_group
[afi
][safi
])
2028 if (strcmp (peer
->group
->name
, group
->name
) != 0)
2029 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
2034 /* Check current peer group configuration. */
2035 if (peer_group_active (peer
)
2036 && strcmp (peer
->group
->name
, group
->name
) != 0)
2037 return BGP_ERR_PEER_GROUP_MISMATCH
;
2039 if (! group
->conf
->as
)
2041 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
2042 && peer_sort (group
->conf
) != peer_sort (peer
))
2046 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
2049 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
2053 peer
->af_group
[afi
][safi
] = 1;
2054 peer
->afc
[afi
][safi
] = 1;
2057 peer
->group
= group
;
2059 peer
= peer_lock (peer
); /* group->peer list reference */
2060 listnode_add (group
->peer
, peer
);
2063 assert (group
&& peer
->group
== group
);
2067 /* Advertisement-interval reset */
2068 if (! CHECK_FLAG (group
->conf
->config
, PEER_CONFIG_ROUTEADV
))
2069 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2070 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
2072 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
2074 /* ebgp-multihop reset */
2075 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
2076 group
->conf
->ttl
= 255;
2078 /* local-as reset */
2079 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
2081 group
->conf
->change_local_as
= 0;
2082 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
2083 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
2087 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
2089 struct listnode
*pn
;
2091 /* If it's not configured as RSERVER_CLIENT in any other address
2092 family, without being member of a peer_group, remove it from
2093 list bgp->rsclient.*/
2094 if (! peer_rsclient_active (peer
)
2095 && (pn
= listnode_lookup (bgp
->rsclient
, peer
)))
2097 peer_unlock (peer
); /* peer rsclient reference */
2098 list_delete_node (bgp
->rsclient
, pn
);
2100 /* Clear our own rsclient rib for this afi/safi. */
2101 bgp_clear_route (peer
, afi
, safi
, BGP_CLEAR_ROUTE_MY_RSCLIENT
);
2104 bgp_table_finish (&peer
->rib
[afi
][safi
]);
2106 /* Import policy. */
2107 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
2109 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
2110 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
2111 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
2114 /* Export policy. */
2115 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
2116 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
2118 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
2119 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
2120 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
2124 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
2125 SET_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
);
2127 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2129 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
2130 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2131 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2134 bgp_session_reset(peer
);
2140 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
2141 struct peer_group
*group
, afi_t afi
, safi_t safi
)
2145 if (! peer
->af_group
[afi
][safi
])
2148 if (group
!= peer
->group
)
2149 return BGP_ERR_PEER_GROUP_MISMATCH
;
2151 peer
->af_group
[afi
][safi
] = 0;
2152 peer
->afc
[afi
][safi
] = 0;
2153 peer_af_flag_reset (peer
, afi
, safi
);
2155 if (peer
->rib
[afi
][safi
])
2156 peer
->rib
[afi
][safi
] = NULL
;
2158 if (! peer_group_active (peer
))
2160 assert (listnode_lookup (group
->peer
, peer
));
2161 peer_unlock (peer
); /* peer group list reference */
2162 listnode_delete (group
->peer
, peer
);
2164 other
= peer
->doppelganger
;
2165 if (group
->conf
->as
)
2168 if (other
&& other
->status
!= Deleted
)
2173 listnode_delete(group
->peer
, other
);
2175 other
->group
= NULL
;
2180 peer_global_config_reset (peer
);
2183 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2185 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
2186 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2187 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2190 bgp_session_reset(peer
);
2196 bgp_startup_timer_expire (struct thread
*thread
)
2200 bgp
= THREAD_ARG (thread
);
2201 bgp
->t_startup
= NULL
;
2207 /* BGP instance creation by `router bgp' commands. */
2209 bgp_create (as_t
*as
, const char *name
)
2215 if ( (bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
))) == NULL
)
2219 bgp
->peer_self
= peer_new (bgp
);
2220 bgp
->peer_self
->host
= XSTRDUP (MTYPE_BGP_PEER_HOST
, "Static announcement");
2222 bgp
->peer
= list_new ();
2223 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
2225 bgp
->group
= list_new ();
2226 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
2228 bgp
->rsclient
= list_new ();
2229 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
2231 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2232 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2234 bgp
->route
[afi
][safi
] = bgp_table_init (afi
, safi
);
2235 bgp
->aggregate
[afi
][safi
] = bgp_table_init (afi
, safi
);
2236 bgp
->rib
[afi
][safi
] = bgp_table_init (afi
, safi
);
2237 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
= BGP_DEFAULT_MAXPATHS
;
2238 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
= BGP_DEFAULT_MAXPATHS
;
2241 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2242 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
2243 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
2244 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
2245 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2246 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2251 bgp
->name
= strdup (name
);
2253 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
2254 bgp
->adv_quanta
= BGP_ADV_FIFO_QUANTA
;
2255 bgp
->wd_quanta
= BGP_WD_FIFO_QUANTA
;
2257 THREAD_TIMER_ON (master
, bgp
->t_startup
, bgp_startup_timer_expire
,
2258 bgp
, bgp
->restart_time
);
2263 /* Return first entry of BGP. */
2265 bgp_get_default (void)
2268 return (listgetdata (listhead (bm
->bgp
)));
2272 /* Lookup BGP entry. */
2274 bgp_lookup (as_t as
, const char *name
)
2277 struct listnode
*node
, *nnode
;
2279 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2281 && ((bgp
->name
== NULL
&& name
== NULL
)
2282 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
2287 /* Lookup BGP structure by view name. */
2289 bgp_lookup_by_name (const char *name
)
2292 struct listnode
*node
, *nnode
;
2294 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
2295 if ((bgp
->name
== NULL
&& name
== NULL
)
2296 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
2301 /* Called from VTY commands. */
2303 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
2307 /* Multiple instance check. */
2308 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
2311 bgp
= bgp_lookup_by_name (name
);
2313 bgp
= bgp_get_default ();
2315 /* Already exists. */
2321 return BGP_ERR_INSTANCE_MISMATCH
;
2329 /* BGP instance name can not be specified for single instance. */
2331 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
2333 /* Get default BGP structure if exists. */
2334 bgp
= bgp_get_default ();
2341 return BGP_ERR_AS_MISMATCH
;
2348 bgp
= bgp_create (as
, name
);
2349 bgp_router_id_set(bgp
, &router_id_zebra
);
2352 bgp
->t_rmap_update
= NULL
;
2353 bgp
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
2355 /* Create BGP server socket, if first instance. */
2356 if (list_isempty(bm
->bgp
)
2357 && !bgp_option_check (BGP_OPT_NO_LISTEN
))
2359 if (bgp_socket (bm
->port
, bm
->address
) < 0)
2360 return BGP_ERR_INVALID_VALUE
;
2363 listnode_add (bm
->bgp
, bgp
);
2368 /* Delete BGP instance. */
2370 bgp_delete (struct bgp
*bgp
)
2373 struct peer_group
*group
;
2374 struct listnode
*node
;
2375 struct listnode
*next
;
2379 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2381 if (peer
->status
== Established
||
2382 peer
->status
== OpenSent
||
2383 peer
->status
== OpenConfirm
)
2385 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2386 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
2390 if (bgp
->t_rmap_update
)
2391 BGP_TIMER_OFF(bgp
->t_rmap_update
);
2393 /* Delete static route. */
2394 bgp_static_delete (bgp
);
2396 /* Unset redistribution. */
2397 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2398 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
2399 if (i
!= ZEBRA_ROUTE_BGP
)
2400 bgp_redistribute_unset (bgp
, afi
, i
, 0);
2402 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, next
, group
))
2404 for (ALL_LIST_ELEMENTS (group
->peer
, node
, next
, peer
))
2406 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2408 /* Send notify to remote peer. */
2409 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2412 peer_group_delete (group
);
2415 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, next
, peer
))
2417 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2419 /* Send notify to remote peer. */
2420 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2426 assert (listcount (bgp
->rsclient
) == 0);
2428 if (bgp
->peer_self
) {
2429 peer_delete(bgp
->peer_self
);
2430 bgp
->peer_self
= NULL
;
2433 /* Remove visibility via the master list - there may however still be
2434 * routes to be processed still referencing the struct bgp.
2436 listnode_delete (bm
->bgp
, bgp
);
2437 if (list_isempty(bm
->bgp
))
2440 bgp_unlock(bgp
); /* initial reference */
2445 static void bgp_free (struct bgp
*);
2448 bgp_lock (struct bgp
*bgp
)
2454 bgp_unlock(struct bgp
*bgp
)
2456 assert(bgp
->lock
> 0);
2457 if (--bgp
->lock
== 0)
2462 bgp_free (struct bgp
*bgp
)
2467 list_delete (bgp
->group
);
2468 list_delete (bgp
->peer
);
2469 list_delete (bgp
->rsclient
);
2474 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2475 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
2477 if (bgp
->route
[afi
][safi
])
2478 bgp_table_finish (&bgp
->route
[afi
][safi
]);
2479 if (bgp
->aggregate
[afi
][safi
])
2480 bgp_table_finish (&bgp
->aggregate
[afi
][safi
]) ;
2481 if (bgp
->rib
[afi
][safi
])
2482 bgp_table_finish (&bgp
->rib
[afi
][safi
]);
2484 XFREE (MTYPE_BGP
, bgp
);
2488 peer_lookup_by_conf_if (struct bgp
*bgp
, const char *conf_if
)
2491 struct listnode
*node
, *nnode
;
2498 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2499 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2500 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2503 else if (bm
->bgp
!= NULL
)
2505 struct listnode
*bgpnode
, *nbgpnode
;
2507 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2508 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2509 if (peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)
2510 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2517 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
2520 struct listnode
*node
, *nnode
;
2524 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2525 if (sockunion_same (&peer
->su
, su
)
2526 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2529 else if (bm
->bgp
!= NULL
)
2531 struct listnode
*bgpnode
, *nbgpnode
;
2533 for (ALL_LIST_ELEMENTS (bm
->bgp
, bgpnode
, nbgpnode
, bgp
))
2534 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
2535 if (sockunion_same (&peer
->su
, su
)
2536 && (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
)))
2542 /* If peer is configured at least one address family return 1. */
2544 peer_active (struct peer
*peer
)
2546 if (BGP_PEER_SU_UNSPEC(peer
))
2548 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
2549 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
2550 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
2551 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
2552 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
2557 /* If peer is negotiated at least one address family return 1. */
2559 peer_active_nego (struct peer
*peer
)
2561 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
2562 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
2563 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
2564 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
2565 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
2570 /* peer_flag_change_type. */
2571 enum peer_change_type
2575 peer_change_reset_in
,
2576 peer_change_reset_out
,
2580 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
2581 enum peer_change_type type
)
2583 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2586 if (peer
->status
!= Established
)
2589 if (type
== peer_change_reset
)
2591 /* If we're resetting session, we've to delete both peer struct */
2592 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
2593 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
2594 PEER_FLAG_CONFIG_NODE
)))
2595 peer_delete(peer
->doppelganger
);
2597 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2598 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2600 else if (type
== peer_change_reset_in
)
2602 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
2603 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
2604 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
2607 if ((peer
->doppelganger
) && (peer
->doppelganger
->status
!= Deleted
)
2608 && (!CHECK_FLAG(peer
->doppelganger
->flags
,
2609 PEER_FLAG_CONFIG_NODE
)))
2610 peer_delete(peer
->doppelganger
);
2612 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2613 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2616 else if (type
== peer_change_reset_out
)
2617 bgp_announce_route (peer
, afi
, safi
);
2620 struct peer_flag_action
2625 /* This flag can be set for peer-group member. */
2626 u_char not_for_member
;
2628 /* Action when the flag is changed. */
2629 enum peer_change_type type
;
2631 /* Peer down cause */
2635 static const struct peer_flag_action peer_flag_action_list
[] =
2637 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
2638 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
2639 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
2640 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
2641 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
2642 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
2643 { PEER_FLAG_DISABLE_CONNECTED_CHECK
, 0, peer_change_reset
},
2644 { PEER_FLAG_BFD
, 0, peer_change_none
},
2648 static const struct peer_flag_action peer_af_flag_action_list
[] =
2650 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
2651 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
2652 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
2653 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
2654 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
2655 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
2656 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
2657 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
2658 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
2659 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
2660 { PEER_FLAG_REMOVE_PRIVATE_AS_ALL
, 1, peer_change_reset_out
},
2661 { PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
,1, peer_change_reset_out
},
2662 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
2663 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
2664 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
2665 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
2666 { PEER_FLAG_NEXTHOP_SELF_ALL
, 1, peer_change_reset_out
},
2667 { PEER_FLAG_AS_OVERRIDE
, 1, peer_change_reset_out
},
2671 /* Proper action set. */
2673 peer_flag_action_set (const struct peer_flag_action
*action_list
, int size
,
2674 struct peer_flag_action
*action
, u_int32_t flag
)
2680 const struct peer_flag_action
*match
= NULL
;
2682 /* Check peer's frag action. */
2683 for (i
= 0; i
< size
; i
++)
2685 match
= &action_list
[i
];
2687 if (match
->flag
== 0)
2690 if (match
->flag
& flag
)
2694 if (match
->type
== peer_change_reset_in
)
2696 if (match
->type
== peer_change_reset_out
)
2698 if (match
->type
== peer_change_reset
)
2703 if (match
->not_for_member
)
2704 action
->not_for_member
= 1;
2708 /* Set peer clear type. */
2709 if (reset_in
&& reset_out
)
2710 action
->type
= peer_change_reset
;
2712 action
->type
= peer_change_reset_in
;
2714 action
->type
= peer_change_reset_out
;
2716 action
->type
= peer_change_none
;
2722 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2724 if (flag
== PEER_FLAG_SHUTDOWN
)
2726 if (CHECK_FLAG (peer
->flags
, flag
))
2728 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2729 peer_nsf_stop (peer
);
2731 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
2732 if (peer
->t_pmax_restart
)
2734 BGP_TIMER_OFF (peer
->t_pmax_restart
);
2735 if (bgp_debug_neighbor_events(peer
))
2736 zlog_debug ("%s Maximum-prefix restart timer canceled",
2740 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
))
2741 peer_nsf_stop (peer
);
2743 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2744 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2745 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2747 bgp_session_reset(peer
);
2751 peer
->v_start
= BGP_INIT_START_TIMER
;
2752 BGP_EVENT_ADD (peer
, BGP_Stop
);
2755 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2757 if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2758 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2759 else if (flag
== PEER_FLAG_PASSIVE
)
2760 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2761 else if (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)
2762 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2764 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2765 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2768 bgp_session_reset(peer
);
2771 /* Change specified peer flag. */
2773 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2777 struct peer_group
*group
;
2778 struct listnode
*node
, *nnode
;
2779 struct peer_flag_action action
;
2781 memset (&action
, 0, sizeof (struct peer_flag_action
));
2782 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2784 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2786 /* No flag action is found. */
2788 return BGP_ERR_INVALID_FLAG
;
2790 /* Not for peer-group member. */
2791 if (action
.not_for_member
&& peer_group_active (peer
))
2792 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2794 /* When unset the peer-group member's flag we have to check
2795 peer-group configuration. */
2796 if (! set
&& peer_group_active (peer
))
2797 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2799 if (flag
== PEER_FLAG_SHUTDOWN
)
2800 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2802 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2805 /* Flag conflict check. */
2807 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2808 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2809 return BGP_ERR_PEER_FLAG_CONFLICT
;
2811 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2813 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2815 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2820 SET_FLAG (peer
->flags
, flag
);
2822 UNSET_FLAG (peer
->flags
, flag
);
2824 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2826 if (action
.type
== peer_change_reset
)
2827 peer_flag_modify_action (peer
, flag
);
2832 /* peer-group member updates. */
2833 group
= peer
->group
;
2835 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2837 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2840 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2844 SET_FLAG (peer
->flags
, flag
);
2846 UNSET_FLAG (peer
->flags
, flag
);
2848 if (action
.type
== peer_change_reset
)
2849 peer_flag_modify_action (peer
, flag
);
2855 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2857 return peer_flag_modify (peer
, flag
, 1);
2861 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2863 return peer_flag_modify (peer
, flag
, 0);
2867 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2869 if (peer
->af_group
[afi
][safi
])
2875 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2880 struct listnode
*node
, *nnode
;
2881 struct peer_group
*group
;
2882 struct peer_flag_action action
;
2884 memset (&action
, 0, sizeof (struct peer_flag_action
));
2885 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2887 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2889 /* No flag action is found. */
2891 return BGP_ERR_INVALID_FLAG
;
2893 /* Adress family must be activated. */
2894 if (! peer
->afc
[afi
][safi
])
2895 return BGP_ERR_PEER_INACTIVE
;
2897 /* Not for peer-group member. */
2898 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2899 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2901 /* Spcecial check for reflector client. */
2902 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2903 && peer_sort (peer
) != BGP_PEER_IBGP
)
2904 return BGP_ERR_NOT_INTERNAL_PEER
;
2906 /* Spcecial check for remove-private-AS. */
2907 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2908 && peer_sort (peer
) == BGP_PEER_IBGP
)
2909 return BGP_ERR_REMOVE_PRIVATE_AS
;
2911 /* as-override is not allowed for IBGP peers */
2912 if (flag
& PEER_FLAG_AS_OVERRIDE
2913 && peer_sort (peer
) == BGP_PEER_IBGP
)
2914 return BGP_ERR_AS_OVERRIDE
;
2916 /* When unset the peer-group member's flag we have to check
2917 peer-group configuration. */
2918 if (! set
&& peer
->af_group
[afi
][safi
])
2919 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2920 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2922 /* When current flag configuration is same as requested one. */
2923 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2925 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2927 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2932 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2934 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2936 /* Execute action when peer is established. */
2937 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2938 && 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
);
2958 /* Peer group member updates. */
2959 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2961 group
= peer
->group
;
2963 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
2965 if (! peer
->af_group
[afi
][safi
])
2968 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2971 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2975 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2977 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2979 if (peer
->status
== Established
)
2981 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2982 bgp_clear_adj_in (peer
, afi
, safi
);
2985 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2986 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2987 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2988 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2989 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2990 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2991 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2992 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2994 peer_change_action (peer
, afi
, safi
, action
.type
);
3003 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3005 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
3009 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
3011 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
3014 /* EBGP multihop configuration. */
3016 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
3018 struct peer_group
*group
;
3019 struct listnode
*node
, *nnode
;
3022 if (peer
->sort
== BGP_PEER_IBGP
|| peer
->conf_if
)
3025 /* see comment in peer_ttl_security_hops_set() */
3028 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3030 group
= peer
->group
;
3031 if (group
->conf
->gtsm_hops
!= 0)
3032 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3034 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
3036 if (peer1
->sort
== BGP_PEER_IBGP
)
3039 if (peer1
->gtsm_hops
!= 0)
3040 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3045 if (peer
->gtsm_hops
!= 0)
3046 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3052 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3054 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3055 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3059 group
= peer
->group
;
3060 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3062 if (peer
->sort
== BGP_PEER_IBGP
)
3065 peer
->ttl
= group
->conf
->ttl
;
3068 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3075 peer_ebgp_multihop_unset (struct peer
*peer
)
3077 struct peer_group
*group
;
3078 struct listnode
*node
, *nnode
;
3080 if (peer
->sort
== BGP_PEER_IBGP
)
3083 if (peer
->gtsm_hops
!= 0 && peer
->ttl
!= MAXTTL
)
3084 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
3086 if (peer_group_active (peer
))
3087 peer
->ttl
= peer
->group
->conf
->ttl
;
3091 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3093 if (peer
->fd
>= 0 && peer
->sort
!= BGP_PEER_IBGP
)
3094 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3098 group
= peer
->group
;
3099 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3101 if (peer
->sort
== BGP_PEER_IBGP
)
3107 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
3113 /* Neighbor description. */
3115 peer_description_set (struct peer
*peer
, char *desc
)
3118 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3120 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
3126 peer_description_unset (struct peer
*peer
)
3129 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
3136 /* Neighbor update-source. */
3138 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
3140 struct peer_group
*group
;
3141 struct listnode
*node
, *nnode
;
3143 if (peer
->update_if
)
3145 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3146 && strcmp (peer
->update_if
, ifname
) == 0)
3149 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3150 peer
->update_if
= NULL
;
3153 if (peer
->update_source
)
3155 sockunion_free (peer
->update_source
);
3156 peer
->update_source
= NULL
;
3159 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3161 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3163 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3165 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3166 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3167 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3170 bgp_session_reset(peer
);
3174 /* peer-group member updates. */
3175 group
= peer
->group
;
3176 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3178 if (peer
->update_if
)
3180 if (strcmp (peer
->update_if
, ifname
) == 0)
3183 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3184 peer
->update_if
= NULL
;
3187 if (peer
->update_source
)
3189 sockunion_free (peer
->update_source
);
3190 peer
->update_source
= NULL
;
3193 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
3195 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3197 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3198 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3199 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3202 bgp_session_reset(peer
);
3208 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
3210 struct peer_group
*group
;
3211 struct listnode
*node
, *nnode
;
3213 if (peer
->update_source
)
3215 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3216 && sockunion_cmp (peer
->update_source
, su
) == 0)
3218 sockunion_free (peer
->update_source
);
3219 peer
->update_source
= NULL
;
3222 if (peer
->update_if
)
3224 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3225 peer
->update_if
= NULL
;
3229 peer
->update_source
= sockunion_dup (su
);
3231 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3233 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3235 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3236 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3237 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3240 bgp_session_reset(peer
);
3244 /* peer-group member updates. */
3245 group
= peer
->group
;
3246 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3248 if (peer
->update_source
)
3250 if (sockunion_cmp (peer
->update_source
, su
) == 0)
3252 sockunion_free (peer
->update_source
);
3253 peer
->update_source
= NULL
;
3256 if (peer
->update_if
)
3258 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3259 peer
->update_if
= NULL
;
3262 peer
->update_source
= sockunion_dup (su
);
3264 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3266 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3267 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3268 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3271 bgp_session_reset(peer
);
3277 peer_update_source_unset (struct peer
*peer
)
3279 union sockunion
*su
;
3280 struct peer_group
*group
;
3281 struct listnode
*node
, *nnode
;
3283 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
3284 && ! peer
->update_source
3285 && ! peer
->update_if
)
3288 if (peer
->update_source
)
3290 sockunion_free (peer
->update_source
);
3291 peer
->update_source
= NULL
;
3293 if (peer
->update_if
)
3295 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3296 peer
->update_if
= NULL
;
3299 if (peer_group_active (peer
))
3301 group
= peer
->group
;
3303 if (group
->conf
->update_source
)
3305 su
= sockunion_dup (group
->conf
->update_source
);
3306 peer
->update_source
= su
;
3308 else if (group
->conf
->update_if
)
3310 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
3313 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3315 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3317 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3318 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3319 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3322 bgp_session_reset(peer
);
3326 /* peer-group member updates. */
3327 group
= peer
->group
;
3328 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3330 if (! peer
->update_source
&& ! peer
->update_if
)
3333 if (peer
->update_source
)
3335 sockunion_free (peer
->update_source
);
3336 peer
->update_source
= NULL
;
3339 if (peer
->update_if
)
3341 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
3342 peer
->update_if
= NULL
;
3345 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3347 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
3348 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3349 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3352 bgp_session_reset(peer
);
3358 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3361 struct peer_group
*group
;
3362 struct listnode
*node
, *nnode
;
3364 /* Adress family must be activated. */
3365 if (! peer
->afc
[afi
][safi
])
3366 return BGP_ERR_PEER_INACTIVE
;
3368 /* Default originate can't be used for peer group memeber. */
3369 if (peer_is_group_member (peer
, afi
, safi
))
3370 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3372 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
3373 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
3374 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
3376 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3380 if (peer
->default_rmap
[afi
][safi
].name
)
3381 free (peer
->default_rmap
[afi
][safi
].name
);
3382 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3383 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3387 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3389 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3390 bgp_default_originate (peer
, afi
, safi
, 0);
3394 /* peer-group member updates. */
3395 group
= peer
->group
;
3396 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3398 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3402 if (peer
->default_rmap
[afi
][safi
].name
)
3403 free (peer
->default_rmap
[afi
][safi
].name
);
3404 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
3405 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
3408 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3409 bgp_default_originate (peer
, afi
, safi
, 0);
3415 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3417 struct peer_group
*group
;
3418 struct listnode
*node
, *nnode
;
3420 /* Adress family must be activated. */
3421 if (! peer
->afc
[afi
][safi
])
3422 return BGP_ERR_PEER_INACTIVE
;
3424 /* Default originate can't be used for peer group memeber. */
3425 if (peer_is_group_member (peer
, afi
, safi
))
3426 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3428 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
3430 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3432 if (peer
->default_rmap
[afi
][safi
].name
)
3433 free (peer
->default_rmap
[afi
][safi
].name
);
3434 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3435 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3438 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3440 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3441 bgp_default_originate (peer
, afi
, safi
, 1);
3445 /* peer-group member updates. */
3446 group
= peer
->group
;
3447 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3449 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
3451 if (peer
->default_rmap
[afi
][safi
].name
)
3452 free (peer
->default_rmap
[afi
][safi
].name
);
3453 peer
->default_rmap
[afi
][safi
].name
= NULL
;
3454 peer
->default_rmap
[afi
][safi
].map
= NULL
;
3456 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
3457 bgp_default_originate (peer
, afi
, safi
, 1);
3463 peer_port_set (struct peer
*peer
, u_int16_t port
)
3470 peer_port_unset (struct peer
*peer
)
3472 peer
->port
= BGP_PORT_DEFAULT
;
3476 /* neighbor weight. */
3478 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
3480 struct peer_group
*group
;
3481 struct listnode
*node
, *nnode
;
3483 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3484 peer
->weight
= weight
;
3486 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3489 /* peer-group member updates. */
3490 group
= peer
->group
;
3491 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3493 peer
->weight
= group
->conf
->weight
;
3499 peer_weight_unset (struct peer
*peer
)
3501 struct peer_group
*group
;
3502 struct listnode
*node
, *nnode
;
3504 /* Set default weight. */
3505 if (peer_group_active (peer
))
3506 peer
->weight
= peer
->group
->conf
->weight
;
3510 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
3512 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3515 /* peer-group member updates. */
3516 group
= peer
->group
;
3517 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3525 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
3527 struct peer_group
*group
;
3528 struct listnode
*node
, *nnode
;
3530 /* Not for peer group memeber. */
3531 if (peer_group_active (peer
))
3532 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3534 /* keepalive value check. */
3535 if (keepalive
> 65535)
3536 return BGP_ERR_INVALID_VALUE
;
3538 /* Holdtime value check. */
3539 if (holdtime
> 65535)
3540 return BGP_ERR_INVALID_VALUE
;
3542 /* Holdtime value must be either 0 or greater than 3. */
3543 if (holdtime
< 3 && holdtime
!= 0)
3544 return BGP_ERR_INVALID_VALUE
;
3546 /* Set value to the configuration. */
3547 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3548 peer
->holdtime
= holdtime
;
3549 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
3551 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3554 /* peer-group member updates. */
3555 group
= peer
->group
;
3556 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3558 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3559 peer
->holdtime
= group
->conf
->holdtime
;
3560 peer
->keepalive
= group
->conf
->keepalive
;
3566 peer_timers_unset (struct peer
*peer
)
3568 struct peer_group
*group
;
3569 struct listnode
*node
, *nnode
;
3571 if (peer_group_active (peer
))
3572 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3574 /* Clear configuration. */
3575 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3576 peer
->keepalive
= 0;
3579 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3582 /* peer-group member updates. */
3583 group
= peer
->group
;
3584 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3586 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
3588 peer
->keepalive
= 0;
3595 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
3597 struct peer_group
*group
;
3598 struct listnode
*node
, *nnode
;
3600 if (peer_group_active (peer
))
3601 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3603 if (connect
> 65535)
3604 return BGP_ERR_INVALID_VALUE
;
3606 /* Set value to the configuration. */
3607 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3608 peer
->connect
= connect
;
3610 /* Set value to timer setting. */
3611 peer
->v_connect
= connect
;
3613 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3616 /* peer-group member updates. */
3617 group
= peer
->group
;
3618 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3620 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3621 peer
->connect
= connect
;
3622 peer
->v_connect
= connect
;
3628 peer_timers_connect_unset (struct peer
*peer
)
3630 struct peer_group
*group
;
3631 struct listnode
*node
, *nnode
;
3633 if (peer_group_active (peer
))
3634 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3636 /* Clear configuration. */
3637 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3640 /* Set timer setting to default value. */
3641 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3643 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3646 /* peer-group member updates. */
3647 group
= peer
->group
;
3648 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3650 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3652 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3658 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3660 struct peer_group
*group
;
3661 struct listnode
*node
, *nnode
;
3663 if (peer_group_active (peer
))
3664 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3667 return BGP_ERR_INVALID_VALUE
;
3669 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3670 peer
->routeadv
= routeadv
;
3671 peer
->v_routeadv
= routeadv
;
3673 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3676 /* peer-group member updates. */
3677 group
= peer
->group
;
3678 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3680 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3681 peer
->routeadv
= routeadv
;
3682 peer
->v_routeadv
= routeadv
;
3689 peer_advertise_interval_unset (struct peer
*peer
)
3691 struct peer_group
*group
;
3692 struct listnode
*node
, *nnode
;
3694 if (peer_group_active (peer
))
3695 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3697 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3700 if (peer
->sort
== BGP_PEER_IBGP
)
3701 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3703 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3705 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3708 /* peer-group member updates. */
3709 group
= peer
->group
;
3710 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3712 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3715 if (peer
->sort
== BGP_PEER_IBGP
)
3716 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3718 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3724 /* neighbor interface */
3726 peer_interface_set (struct peer
*peer
, const char *str
)
3729 free (peer
->ifname
);
3730 peer
->ifname
= strdup (str
);
3736 peer_interface_unset (struct peer
*peer
)
3739 free (peer
->ifname
);
3740 peer
->ifname
= NULL
;
3747 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3749 struct peer_group
*group
;
3750 struct listnode
*node
, *nnode
;
3752 if (allow_num
< 1 || allow_num
> 10)
3753 return BGP_ERR_INVALID_VALUE
;
3755 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3757 peer
->allowas_in
[afi
][safi
] = allow_num
;
3758 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3759 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3762 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3765 group
= peer
->group
;
3766 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3768 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3770 peer
->allowas_in
[afi
][safi
] = allow_num
;
3771 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3772 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3780 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3782 struct peer_group
*group
;
3783 struct listnode
*node
, *nnode
;
3785 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3787 peer
->allowas_in
[afi
][safi
] = 0;
3788 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3791 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3794 group
= peer
->group
;
3795 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3797 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3799 peer
->allowas_in
[afi
][safi
] = 0;
3800 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3807 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
, int replace_as
)
3809 struct bgp
*bgp
= peer
->bgp
;
3810 struct peer_group
*group
;
3811 struct listnode
*node
, *nnode
;
3813 if (peer_sort (peer
) != BGP_PEER_EBGP
3814 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3815 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3818 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3820 if (peer_group_active (peer
))
3821 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3824 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
;
3826 if (peer
->change_local_as
== as
&&
3827 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3828 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)) &&
3829 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && replace_as
)
3830 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) && ! replace_as
)))
3833 peer
->change_local_as
= as
;
3835 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3837 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3840 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3842 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3844 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3846 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3848 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3849 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3850 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3853 bgp_session_reset(peer
);
3857 group
= peer
->group
;
3858 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3860 peer
->change_local_as
= as
;
3862 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3864 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3867 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3869 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3871 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3873 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3874 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3875 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3878 BGP_EVENT_ADD (peer
, BGP_Stop
);
3885 peer_local_as_unset (struct peer
*peer
)
3887 struct peer_group
*group
;
3888 struct listnode
*node
, *nnode
;
3890 if (peer_group_active (peer
))
3891 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3893 if (! peer
->change_local_as
)
3896 peer
->change_local_as
= 0;
3897 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3898 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3900 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3902 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3904 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3905 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3906 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3909 BGP_EVENT_ADD (peer
, BGP_Stop
);
3914 group
= peer
->group
;
3915 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
3917 peer
->change_local_as
= 0;
3918 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3919 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
);
3921 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3923 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3924 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3925 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3928 bgp_session_reset(peer
);
3933 /* Set password for authenticating with the peer. */
3935 peer_password_set (struct peer
*peer
, const char *password
)
3937 struct listnode
*nn
, *nnode
;
3938 int len
= password
? strlen(password
) : 0;
3939 int ret
= BGP_SUCCESS
;
3941 if ((len
< PEER_PASSWORD_MINLEN
) || (len
> PEER_PASSWORD_MAXLEN
))
3942 return BGP_ERR_INVALID_VALUE
;
3944 if (peer
->password
&& strcmp (peer
->password
, password
) == 0
3945 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3949 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3951 peer
->password
= XSTRDUP (MTYPE_PEER_PASSWORD
, password
);
3953 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3955 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3956 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3958 bgp_session_reset(peer
);
3960 return (bgp_md5_set (peer
) >= 0) ? BGP_SUCCESS
: BGP_ERR_TCPSIG_FAILED
;
3963 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
3965 if (peer
->password
&& strcmp (peer
->password
, password
) == 0)
3969 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
3971 peer
->password
= XSTRDUP(MTYPE_PEER_PASSWORD
, password
);
3973 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
3974 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3976 bgp_session_reset(peer
);
3978 if (bgp_md5_set (peer
) < 0)
3979 ret
= BGP_ERR_TCPSIG_FAILED
;
3986 peer_password_unset (struct peer
*peer
)
3988 struct listnode
*nn
, *nnode
;
3991 && !CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3994 if (!CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3996 if (peer_group_active (peer
)
3997 && peer
->group
->conf
->password
3998 && strcmp (peer
->group
->conf
->password
, peer
->password
) == 0)
3999 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
4001 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4002 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4004 bgp_session_reset(peer
);
4007 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4009 peer
->password
= NULL
;
4016 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4017 peer
->password
= NULL
;
4019 for (ALL_LIST_ELEMENTS (peer
->group
->peer
, nn
, nnode
, peer
))
4021 if (!peer
->password
)
4024 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
4025 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4027 bgp_session_reset(peer
);
4029 XFREE (MTYPE_PEER_PASSWORD
, peer
->password
);
4030 peer
->password
= NULL
;
4038 /* Set distribute list to the peer. */
4040 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4043 struct bgp_filter
*filter
;
4044 struct peer_group
*group
;
4045 struct listnode
*node
, *nnode
;
4047 if (! peer
->afc
[afi
][safi
])
4048 return BGP_ERR_PEER_INACTIVE
;
4050 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4051 return BGP_ERR_INVALID_VALUE
;
4053 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4054 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4056 filter
= &peer
->filter
[afi
][safi
];
4058 if (filter
->plist
[direct
].name
)
4059 return BGP_ERR_PEER_FILTER_CONFLICT
;
4061 if (filter
->dlist
[direct
].name
)
4062 free (filter
->dlist
[direct
].name
);
4063 filter
->dlist
[direct
].name
= strdup (name
);
4064 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4066 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4069 group
= peer
->group
;
4070 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4072 filter
= &peer
->filter
[afi
][safi
];
4074 if (! peer
->af_group
[afi
][safi
])
4077 if (filter
->dlist
[direct
].name
)
4078 free (filter
->dlist
[direct
].name
);
4079 filter
->dlist
[direct
].name
= strdup (name
);
4080 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
4087 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4089 struct bgp_filter
*filter
;
4090 struct bgp_filter
*gfilter
;
4091 struct peer_group
*group
;
4092 struct listnode
*node
, *nnode
;
4094 if (! peer
->afc
[afi
][safi
])
4095 return BGP_ERR_PEER_INACTIVE
;
4097 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4098 return BGP_ERR_INVALID_VALUE
;
4100 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4101 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4103 filter
= &peer
->filter
[afi
][safi
];
4105 /* apply peer-group filter */
4106 if (peer
->af_group
[afi
][safi
])
4108 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4110 if (gfilter
->dlist
[direct
].name
)
4112 if (filter
->dlist
[direct
].name
)
4113 free (filter
->dlist
[direct
].name
);
4114 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
4115 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
4120 if (filter
->dlist
[direct
].name
)
4121 free (filter
->dlist
[direct
].name
);
4122 filter
->dlist
[direct
].name
= NULL
;
4123 filter
->dlist
[direct
].alist
= NULL
;
4125 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4128 group
= peer
->group
;
4129 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4131 filter
= &peer
->filter
[afi
][safi
];
4133 if (! peer
->af_group
[afi
][safi
])
4136 if (filter
->dlist
[direct
].name
)
4137 free (filter
->dlist
[direct
].name
);
4138 filter
->dlist
[direct
].name
= NULL
;
4139 filter
->dlist
[direct
].alist
= NULL
;
4145 /* Update distribute list. */
4147 peer_distribute_update (struct access_list
*access
)
4152 struct listnode
*mnode
, *mnnode
;
4153 struct listnode
*node
, *nnode
;
4156 struct peer_group
*group
;
4157 struct bgp_filter
*filter
;
4159 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4161 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4163 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4164 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4166 filter
= &peer
->filter
[afi
][safi
];
4168 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4170 if (filter
->dlist
[direct
].name
)
4171 filter
->dlist
[direct
].alist
=
4172 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4174 filter
->dlist
[direct
].alist
= NULL
;
4178 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4180 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4181 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4183 filter
= &group
->conf
->filter
[afi
][safi
];
4185 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4187 if (filter
->dlist
[direct
].name
)
4188 filter
->dlist
[direct
].alist
=
4189 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
4191 filter
->dlist
[direct
].alist
= NULL
;
4198 /* Set prefix list to the peer. */
4200 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4203 struct bgp_filter
*filter
;
4204 struct peer_group
*group
;
4205 struct listnode
*node
, *nnode
;
4207 if (! peer
->afc
[afi
][safi
])
4208 return BGP_ERR_PEER_INACTIVE
;
4210 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4211 return BGP_ERR_INVALID_VALUE
;
4213 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4214 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4216 filter
= &peer
->filter
[afi
][safi
];
4218 if (filter
->dlist
[direct
].name
)
4219 return BGP_ERR_PEER_FILTER_CONFLICT
;
4221 if (filter
->plist
[direct
].name
)
4222 free (filter
->plist
[direct
].name
);
4223 filter
->plist
[direct
].name
= strdup (name
);
4224 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4226 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4229 group
= peer
->group
;
4230 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4232 filter
= &peer
->filter
[afi
][safi
];
4234 if (! peer
->af_group
[afi
][safi
])
4237 if (filter
->plist
[direct
].name
)
4238 free (filter
->plist
[direct
].name
);
4239 filter
->plist
[direct
].name
= strdup (name
);
4240 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
4246 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4248 struct bgp_filter
*filter
;
4249 struct bgp_filter
*gfilter
;
4250 struct peer_group
*group
;
4251 struct listnode
*node
, *nnode
;
4253 if (! peer
->afc
[afi
][safi
])
4254 return BGP_ERR_PEER_INACTIVE
;
4256 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4257 return BGP_ERR_INVALID_VALUE
;
4259 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4260 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4262 filter
= &peer
->filter
[afi
][safi
];
4264 /* apply peer-group filter */
4265 if (peer
->af_group
[afi
][safi
])
4267 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4269 if (gfilter
->plist
[direct
].name
)
4271 if (filter
->plist
[direct
].name
)
4272 free (filter
->plist
[direct
].name
);
4273 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
4274 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
4279 if (filter
->plist
[direct
].name
)
4280 free (filter
->plist
[direct
].name
);
4281 filter
->plist
[direct
].name
= NULL
;
4282 filter
->plist
[direct
].plist
= NULL
;
4284 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4287 group
= peer
->group
;
4288 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4290 filter
= &peer
->filter
[afi
][safi
];
4292 if (! peer
->af_group
[afi
][safi
])
4295 if (filter
->plist
[direct
].name
)
4296 free (filter
->plist
[direct
].name
);
4297 filter
->plist
[direct
].name
= NULL
;
4298 filter
->plist
[direct
].plist
= NULL
;
4304 /* Update prefix-list list. */
4306 peer_prefix_list_update (struct prefix_list
*plist
)
4308 struct listnode
*mnode
, *mnnode
;
4309 struct listnode
*node
, *nnode
;
4312 struct peer_group
*group
;
4313 struct bgp_filter
*filter
;
4318 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4320 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4322 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4323 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4325 filter
= &peer
->filter
[afi
][safi
];
4327 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4329 if (filter
->plist
[direct
].name
)
4330 filter
->plist
[direct
].plist
=
4331 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4333 filter
->plist
[direct
].plist
= NULL
;
4337 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4339 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4340 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4342 filter
= &group
->conf
->filter
[afi
][safi
];
4344 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4346 if (filter
->plist
[direct
].name
)
4347 filter
->plist
[direct
].plist
=
4348 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
4350 filter
->plist
[direct
].plist
= NULL
;
4358 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4361 struct bgp_filter
*filter
;
4362 struct peer_group
*group
;
4363 struct listnode
*node
, *nnode
;
4365 if (! peer
->afc
[afi
][safi
])
4366 return BGP_ERR_PEER_INACTIVE
;
4368 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4369 return BGP_ERR_INVALID_VALUE
;
4371 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4372 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4374 filter
= &peer
->filter
[afi
][safi
];
4376 if (filter
->aslist
[direct
].name
)
4377 free (filter
->aslist
[direct
].name
);
4378 filter
->aslist
[direct
].name
= strdup (name
);
4379 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4381 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4384 group
= peer
->group
;
4385 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4387 filter
= &peer
->filter
[afi
][safi
];
4389 if (! peer
->af_group
[afi
][safi
])
4392 if (filter
->aslist
[direct
].name
)
4393 free (filter
->aslist
[direct
].name
);
4394 filter
->aslist
[direct
].name
= strdup (name
);
4395 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
4401 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
4403 struct bgp_filter
*filter
;
4404 struct bgp_filter
*gfilter
;
4405 struct peer_group
*group
;
4406 struct listnode
*node
, *nnode
;
4408 if (! peer
->afc
[afi
][safi
])
4409 return BGP_ERR_PEER_INACTIVE
;
4411 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
4412 return BGP_ERR_INVALID_VALUE
;
4414 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
4415 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4417 filter
= &peer
->filter
[afi
][safi
];
4419 /* apply peer-group filter */
4420 if (peer
->af_group
[afi
][safi
])
4422 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4424 if (gfilter
->aslist
[direct
].name
)
4426 if (filter
->aslist
[direct
].name
)
4427 free (filter
->aslist
[direct
].name
);
4428 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
4429 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
4434 if (filter
->aslist
[direct
].name
)
4435 free (filter
->aslist
[direct
].name
);
4436 filter
->aslist
[direct
].name
= NULL
;
4437 filter
->aslist
[direct
].aslist
= NULL
;
4439 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4442 group
= peer
->group
;
4443 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4445 filter
= &peer
->filter
[afi
][safi
];
4447 if (! peer
->af_group
[afi
][safi
])
4450 if (filter
->aslist
[direct
].name
)
4451 free (filter
->aslist
[direct
].name
);
4452 filter
->aslist
[direct
].name
= NULL
;
4453 filter
->aslist
[direct
].aslist
= NULL
;
4460 peer_aslist_update (char *aslist_name
)
4465 struct listnode
*mnode
, *mnnode
;
4466 struct listnode
*node
, *nnode
;
4469 struct peer_group
*group
;
4470 struct bgp_filter
*filter
;
4472 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
4474 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
4476 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4477 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4479 filter
= &peer
->filter
[afi
][safi
];
4481 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4483 if (filter
->aslist
[direct
].name
)
4484 filter
->aslist
[direct
].aslist
=
4485 as_list_lookup (filter
->aslist
[direct
].name
);
4487 filter
->aslist
[direct
].aslist
= NULL
;
4491 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
4493 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
4494 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
4496 filter
= &group
->conf
->filter
[afi
][safi
];
4498 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
4500 if (filter
->aslist
[direct
].name
)
4501 filter
->aslist
[direct
].aslist
=
4502 as_list_lookup (filter
->aslist
[direct
].name
);
4504 filter
->aslist
[direct
].aslist
= NULL
;
4511 peer_aslist_add (char *aslist_name
)
4513 peer_aslist_update (aslist_name
);
4514 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_ADDED
);
4518 peer_aslist_del (char *aslist_name
)
4520 peer_aslist_update (aslist_name
);
4521 route_map_notify_dependencies((char *)aslist_name
, RMAP_EVENT_ASLIST_DELETED
);
4525 /* Set route-map to the peer. */
4527 peer_reprocess_routes (struct peer
*peer
, int direct
,
4528 afi_t afi
, safi_t safi
)
4530 if (peer
->status
!= Established
)
4533 if (direct
!= RMAP_OUT
)
4535 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
],
4536 PEER_FLAG_SOFT_RECONFIG
))
4537 bgp_soft_reconfig_in (peer
, afi
, safi
);
4538 else if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4539 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4540 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4543 bgp_announce_route(peer
, afi
, safi
);
4547 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
4550 struct bgp_filter
*filter
;
4551 struct peer_group
*group
;
4552 struct listnode
*node
, *nnode
;
4554 if (! peer
->afc
[afi
][safi
])
4555 return BGP_ERR_PEER_INACTIVE
;
4557 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4558 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4559 return BGP_ERR_INVALID_VALUE
;
4561 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4562 && peer_is_group_member (peer
, afi
, safi
))
4563 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4565 filter
= &peer
->filter
[afi
][safi
];
4567 if (filter
->map
[direct
].name
)
4568 free (filter
->map
[direct
].name
);
4570 filter
->map
[direct
].name
= strdup (name
);
4571 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4573 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4575 peer_reprocess_routes(peer
, direct
, afi
, safi
);
4579 group
= peer
->group
;
4580 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4582 filter
= &peer
->filter
[afi
][safi
];
4584 if (! peer
->af_group
[afi
][safi
])
4587 if (filter
->map
[direct
].name
)
4588 free (filter
->map
[direct
].name
);
4589 filter
->map
[direct
].name
= strdup (name
);
4590 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
4591 peer_reprocess_routes (peer
, direct
, afi
, safi
);
4596 /* Unset route-map from the peer. */
4598 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
4600 struct bgp_filter
*filter
;
4601 struct bgp_filter
*gfilter
;
4602 struct peer_group
*group
;
4603 struct listnode
*node
, *nnode
;
4605 if (! peer
->afc
[afi
][safi
])
4606 return BGP_ERR_PEER_INACTIVE
;
4608 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
4609 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
4610 return BGP_ERR_INVALID_VALUE
;
4612 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
4613 && peer_is_group_member (peer
, afi
, safi
))
4614 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4616 filter
= &peer
->filter
[afi
][safi
];
4618 /* apply peer-group filter */
4619 if (peer
->af_group
[afi
][safi
])
4621 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4623 if (gfilter
->map
[direct
].name
)
4625 if (filter
->map
[direct
].name
)
4626 free (filter
->map
[direct
].name
);
4627 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
4628 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
4633 if (filter
->map
[direct
].name
)
4634 free (filter
->map
[direct
].name
);
4635 filter
->map
[direct
].name
= NULL
;
4636 filter
->map
[direct
].map
= NULL
;
4638 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4640 peer_reprocess_routes(peer
, direct
, afi
, safi
);
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
->map
[direct
].name
)
4653 free (filter
->map
[direct
].name
);
4654 filter
->map
[direct
].name
= NULL
;
4655 filter
->map
[direct
].map
= NULL
;
4656 peer_reprocess_routes(peer
, direct
, afi
, safi
);
4661 /* Set unsuppress-map to the peer. */
4663 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4666 struct bgp_filter
*filter
;
4667 struct peer_group
*group
;
4668 struct listnode
*node
, *nnode
;
4670 if (! peer
->afc
[afi
][safi
])
4671 return BGP_ERR_PEER_INACTIVE
;
4673 if (peer_is_group_member (peer
, afi
, safi
))
4674 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4676 filter
= &peer
->filter
[afi
][safi
];
4678 if (filter
->usmap
.name
)
4679 free (filter
->usmap
.name
);
4681 filter
->usmap
.name
= strdup (name
);
4682 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4684 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4686 bgp_announce_route (peer
, afi
, safi
);
4690 group
= peer
->group
;
4691 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4693 filter
= &peer
->filter
[afi
][safi
];
4695 if (! peer
->af_group
[afi
][safi
])
4698 if (filter
->usmap
.name
)
4699 free (filter
->usmap
.name
);
4700 filter
->usmap
.name
= strdup (name
);
4701 filter
->usmap
.map
= route_map_lookup_by_name (name
);
4702 bgp_announce_route (peer
, afi
, safi
);
4707 /* Unset route-map from the peer. */
4709 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4711 struct bgp_filter
*filter
;
4712 struct peer_group
*group
;
4713 struct listnode
*node
, *nnode
;
4715 if (! peer
->afc
[afi
][safi
])
4716 return BGP_ERR_PEER_INACTIVE
;
4718 if (peer_is_group_member (peer
, afi
, safi
))
4719 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
4721 filter
= &peer
->filter
[afi
][safi
];
4723 if (filter
->usmap
.name
)
4724 free (filter
->usmap
.name
);
4725 filter
->usmap
.name
= NULL
;
4726 filter
->usmap
.map
= NULL
;
4728 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4730 bgp_announce_route(peer
, afi
, safi
);
4734 group
= peer
->group
;
4735 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4737 filter
= &peer
->filter
[afi
][safi
];
4739 if (! peer
->af_group
[afi
][safi
])
4742 if (filter
->usmap
.name
)
4743 free (filter
->usmap
.name
);
4744 filter
->usmap
.name
= NULL
;
4745 filter
->usmap
.map
= NULL
;
4746 bgp_announce_route(peer
, afi
, safi
);
4752 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
4753 u_int32_t max
, u_char threshold
,
4754 int warning
, u_int16_t restart
)
4756 struct peer_group
*group
;
4757 struct listnode
*node
, *nnode
;
4759 if (! peer
->afc
[afi
][safi
])
4760 return BGP_ERR_PEER_INACTIVE
;
4762 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4763 peer
->pmax
[afi
][safi
] = max
;
4764 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4765 peer
->pmax_restart
[afi
][safi
] = restart
;
4767 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4769 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4771 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4773 group
= peer
->group
;
4774 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4776 if (! peer
->af_group
[afi
][safi
])
4779 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4780 peer
->pmax
[afi
][safi
] = max
;
4781 peer
->pmax_threshold
[afi
][safi
] = threshold
;
4782 peer
->pmax_restart
[afi
][safi
] = restart
;
4784 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4786 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4788 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
4789 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
4794 if ((peer
->status
== Established
) && (peer
->afc
[afi
][safi
]))
4795 bgp_maximum_prefix_overflow (peer
, afi
, safi
, 1);
4802 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
4804 struct peer_group
*group
;
4805 struct listnode
*node
, *nnode
;
4807 if (! peer
->afc
[afi
][safi
])
4808 return BGP_ERR_PEER_INACTIVE
;
4810 /* apply peer-group config */
4811 if (peer
->af_group
[afi
][safi
])
4813 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4814 PEER_FLAG_MAX_PREFIX
))
4815 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4817 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4819 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
4820 PEER_FLAG_MAX_PREFIX_WARNING
))
4821 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4823 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4825 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
4826 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4827 peer
->pmax_restart
[afi
][safi
] = peer
->group
->conf
->pmax_restart
[afi
][safi
];
4831 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4832 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4833 peer
->pmax
[afi
][safi
] = 0;
4834 peer
->pmax_threshold
[afi
][safi
] = 0;
4835 peer
->pmax_restart
[afi
][safi
] = 0;
4837 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4840 group
= peer
->group
;
4841 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4843 if (! peer
->af_group
[afi
][safi
])
4846 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4847 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4848 peer
->pmax
[afi
][safi
] = 0;
4849 peer
->pmax_threshold
[afi
][safi
] = 0;
4850 peer
->pmax_restart
[afi
][safi
] = 0;
4855 static int is_ebgp_multihop_configured (struct peer
*peer
)
4857 struct peer_group
*group
;
4858 struct listnode
*node
, *nnode
;
4861 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4863 group
= peer
->group
;
4864 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4865 (group
->conf
->ttl
!= 1))
4868 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer1
))
4870 if ((peer_sort (peer1
) != BGP_PEER_IBGP
) &&
4877 if ((peer_sort(peer
) != BGP_PEER_IBGP
) &&
4884 /* Set # of hops between us and BGP peer. */
4886 peer_ttl_security_hops_set (struct peer
*peer
, int gtsm_hops
)
4888 struct peer_group
*group
;
4889 struct listnode
*node
, *nnode
;
4892 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops
, peer
->host
);
4894 /* We cannot configure ttl-security hops when ebgp-multihop is already
4895 set. For non peer-groups, the check is simple. For peer-groups, it's
4896 slightly messy, because we need to check both the peer-group structure
4897 and all peer-group members for any trace of ebgp-multihop configuration
4898 before actually applying the ttl-security rules. Cisco really made a
4899 mess of this configuration parameter, and OpenBGPD got it right.
4902 if (peer
->gtsm_hops
== 0)
4904 if (is_ebgp_multihop_configured (peer
))
4905 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
;
4907 /* specify MAXTTL on outgoing packets */
4908 /* Routine handles iBGP peers correctly */
4909 ret
= peer_ebgp_multihop_set (peer
, MAXTTL
);
4914 peer
->gtsm_hops
= gtsm_hops
;
4916 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4919 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4920 MAXTTL
+ 1 - gtsm_hops
);
4921 if (peer
->status
!= Established
&& peer
->doppelganger
)
4922 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
,
4923 MAXTTL
+ 1 - gtsm_hops
);
4927 group
= peer
->group
;
4928 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4930 peer
->gtsm_hops
= group
->conf
->gtsm_hops
;
4932 /* Change setting of existing peer
4933 * established then change value (may break connectivity)
4934 * not established yet (teardown session and restart)
4935 * no session then do nothing (will get handled by next connection)
4937 if (peer
->status
== Established
)
4939 if (peer
->fd
>= 0 && peer
->gtsm_hops
!= 0)
4940 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
,
4941 MAXTTL
+ 1 - peer
->gtsm_hops
);
4943 else if (peer
->status
< Established
)
4945 if (bgp_debug_neighbor_events(peer
))
4946 zlog_debug ("%s Min-ttl changed", peer
->host
);
4947 bgp_session_reset(peer
);
4956 peer_ttl_security_hops_unset (struct peer
*peer
)
4958 struct peer_group
*group
;
4959 struct listnode
*node
, *nnode
;
4962 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer
->host
);
4964 /* if a peer-group member, then reset to peer-group default rather than 0 */
4965 if (peer_group_active (peer
))
4966 peer
->gtsm_hops
= peer
->group
->conf
->gtsm_hops
;
4968 peer
->gtsm_hops
= 0;
4971 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4974 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4976 if (peer
->status
!= Established
&& peer
->doppelganger
)
4977 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
, 0);
4981 group
= peer
->group
;
4982 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
4984 peer
->gtsm_hops
= 0;
4987 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->fd
, 0);
4989 if (peer
->status
!= Established
&& peer
->doppelganger
)
4990 sockopt_minttl (peer
->su
.sa
.sa_family
, peer
->doppelganger
->fd
, 0);
4994 return peer_ebgp_multihop_unset (opeer
);
4998 * If peer clear is invoked in a loop for all peers on the BGP instance,
4999 * it may end up freeing the doppelganger, and if this was the next node
5000 * to the current node, we would end up accessing the freed next node.
5001 * Pass along additional parameter which can be updated if next node
5002 * is freed; only required when walking the peer list on BGP instance.
5005 peer_clear (struct peer
*peer
, struct listnode
**nnode
)
5007 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5009 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
5011 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
5012 if (peer
->t_pmax_restart
)
5014 BGP_TIMER_OFF (peer
->t_pmax_restart
);
5015 if (bgp_debug_neighbor_events(peer
))
5016 zlog_debug ("%s Maximum-prefix restart timer canceled",
5019 BGP_EVENT_ADD (peer
, BGP_Start
);
5023 peer
->v_start
= BGP_INIT_START_TIMER
;
5024 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
5025 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5026 BGP_NOTIFY_CEASE_ADMIN_RESET
);
5028 bgp_session_reset_safe(peer
, nnode
);
5034 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
5035 enum bgp_clear_type stype
)
5037 if (peer
->status
!= Established
)
5040 if (! peer
->afc
[afi
][safi
])
5041 return BGP_ERR_AF_UNCONFIGURED
;
5043 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
5045 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
5047 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
5048 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
5051 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
5052 bgp_announce_route (peer
, afi
, safi
);
5054 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5056 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
5057 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
5058 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
5060 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
5063 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
5064 prefix_type
= ORF_TYPE_PREFIX
;
5066 prefix_type
= ORF_TYPE_PREFIX_OLD
;
5068 if (filter
->plist
[FILTER_IN
].plist
)
5070 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5071 bgp_route_refresh_send (peer
, afi
, safi
,
5072 prefix_type
, REFRESH_DEFER
, 1);
5073 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
5074 REFRESH_IMMEDIATE
, 0);
5078 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
5079 bgp_route_refresh_send (peer
, afi
, safi
,
5080 prefix_type
, REFRESH_IMMEDIATE
, 1);
5082 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5088 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
5089 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
5091 /* If neighbor has soft reconfiguration inbound flag.
5092 Use Adj-RIB-In database. */
5093 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5094 bgp_soft_reconfig_in (peer
, afi
, safi
);
5097 /* If neighbor has route refresh capability, send route refresh
5098 message to the peer. */
5099 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
5100 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
5101 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
5103 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
5109 /* Display peer uptime.*/
5110 /* XXX: why does this function return char * when it takes buffer? */
5112 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
5117 /* Check buffer length. */
5118 if (len
< BGP_UPTIME_LEN
)
5120 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long
)len
);
5121 /* XXX: should return status instead of buf... */
5122 snprintf (buf
, len
, "<error> ");
5126 /* If there is no connection has been done before print `never'. */
5129 snprintf (buf
, len
, "never ");
5133 /* Get current time. */
5134 uptime1
= bgp_clock ();
5136 tm
= gmtime (&uptime1
);
5138 /* Making formatted timer strings. */
5139 #define ONE_DAY_SECOND 60*60*24
5140 #define ONE_WEEK_SECOND 60*60*24*7
5142 if (uptime1
< ONE_DAY_SECOND
)
5143 snprintf (buf
, len
, "%02d:%02d:%02d",
5144 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
5145 else if (uptime1
< ONE_WEEK_SECOND
)
5146 snprintf (buf
, len
, "%dd%02dh%02dm",
5147 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
5149 snprintf (buf
, len
, "%02dw%dd%02dh",
5150 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
5155 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
5156 afi_t afi
, safi_t safi
)
5158 struct bgp_filter
*filter
;
5159 struct bgp_filter
*gfilter
= NULL
;
5162 int out
= FILTER_OUT
;
5165 filter
= &peer
->filter
[afi
][safi
];
5166 if (peer
->af_group
[afi
][safi
])
5167 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
5169 /* distribute-list. */
5170 if (filter
->dlist
[in
].name
)
5171 if (! gfilter
|| ! gfilter
->dlist
[in
].name
5172 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
5173 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
5174 filter
->dlist
[in
].name
, VTY_NEWLINE
);
5175 if (filter
->dlist
[out
].name
&& ! gfilter
)
5176 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
5177 filter
->dlist
[out
].name
, VTY_NEWLINE
);
5180 if (filter
->plist
[in
].name
)
5181 if (! gfilter
|| ! gfilter
->plist
[in
].name
5182 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
5183 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
5184 filter
->plist
[in
].name
, VTY_NEWLINE
);
5185 if (filter
->plist
[out
].name
&& ! gfilter
)
5186 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
5187 filter
->plist
[out
].name
, VTY_NEWLINE
);
5190 if (filter
->map
[RMAP_IN
].name
)
5191 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
5192 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
5193 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
5194 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
5195 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
5196 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
5197 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
5198 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
5199 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
5200 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
5201 if (filter
->map
[RMAP_EXPORT
].name
)
5202 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
5203 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
5204 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
5205 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
5206 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
5208 /* unsuppress-map */
5209 if (filter
->usmap
.name
&& ! gfilter
)
5210 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
5211 filter
->usmap
.name
, VTY_NEWLINE
);
5214 if (filter
->aslist
[in
].name
)
5215 if (! gfilter
|| ! gfilter
->aslist
[in
].name
5216 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
5217 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
5218 filter
->aslist
[in
].name
, VTY_NEWLINE
);
5219 if (filter
->aslist
[out
].name
&& ! gfilter
)
5220 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
5221 filter
->aslist
[out
].name
, VTY_NEWLINE
);
5224 /* BGP peer configuration display function. */
5226 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
5227 struct peer
*peer
, afi_t afi
, safi_t safi
)
5229 struct peer
*g_peer
= NULL
;
5230 char buf
[SU_ADDRSTRLEN
];
5234 addr
= peer
->conf_if
;
5238 if (peer_group_active (peer
))
5239 g_peer
= peer
->group
->conf
;
5241 /************************************
5242 ****** Global to the neighbor ******
5243 ************************************/
5244 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5247 vty_out (vty
, " neighbor %s interface%s", addr
, VTY_NEWLINE
);
5250 if (! peer_group_active (peer
))
5252 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
5253 vty_out (vty
, " neighbor %s peer-group%s", addr
,
5256 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
5262 vty_out (vty
, " neighbor %s remote-as %u%s", addr
, peer
->as
,
5264 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
5265 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
5266 peer
->group
->name
, VTY_NEWLINE
);
5270 if (peer
->change_local_as
)
5271 if (! peer_group_active (peer
))
5272 vty_out (vty
, " neighbor %s local-as %u%s%s%s", addr
,
5273 peer
->change_local_as
,
5274 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
5276 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
5277 " replace-as" : "", VTY_NEWLINE
);
5281 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
5285 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
5286 if (! peer_group_active (peer
) ||
5287 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
5288 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
5291 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_BFD
))
5292 if (! peer_group_active (peer
) ||
5293 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_BFD
))
5294 vty_out (vty
, " neighbor %s bfd%s", addr
, VTY_NEWLINE
);
5298 if (!peer_group_active (peer
)
5299 || ! g_peer
->password
5300 || strcmp (peer
->password
, g_peer
->password
) != 0)
5301 vty_out (vty
, " neighbor %s password %s%s", addr
, peer
->password
,
5305 if (peer
->port
!= BGP_PORT_DEFAULT
)
5306 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
5309 /* Local interface name. */
5311 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
5315 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
5316 if (! peer_group_active (peer
) ||
5317 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
5318 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
5320 /* EBGP multihop. */
5321 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= 1 &&
5322 !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
))
5323 if (! peer_group_active (peer
) ||
5324 g_peer
->ttl
!= peer
->ttl
)
5325 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
5328 /* ttl-security hops */
5329 if (peer
->gtsm_hops
!= 0)
5330 if (! peer_group_active (peer
) || g_peer
->gtsm_hops
!= peer
->gtsm_hops
)
5331 vty_out (vty
, " neighbor %s ttl-security hops %d%s", addr
,
5332 peer
->gtsm_hops
, VTY_NEWLINE
);
5334 /* disable-connected-check. */
5335 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
5336 if (! peer_group_active (peer
) ||
5337 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
5338 vty_out (vty
, " neighbor %s disable-connected-check%s", addr
, VTY_NEWLINE
);
5340 /* Update-source. */
5341 if (peer
->update_if
)
5342 if (! peer_group_active (peer
) || ! g_peer
->update_if
5343 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
5344 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
5345 peer
->update_if
, VTY_NEWLINE
);
5346 if (peer
->update_source
)
5347 if (! peer_group_active (peer
) || ! g_peer
->update_source
5348 || sockunion_cmp (g_peer
->update_source
,
5349 peer
->update_source
) != 0)
5350 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
5351 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
5354 /* advertisement-interval */
5355 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
) &&
5356 ! peer_group_active (peer
))
5357 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
5358 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
5361 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
5362 && ! peer_group_active (peer
))
5363 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
5364 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
5366 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
) &&
5367 ! peer_group_active (peer
))
5368 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
5369 peer
->connect
, VTY_NEWLINE
);
5371 /* Default weight. */
5372 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
5373 if (! peer_group_active (peer
) ||
5374 g_peer
->weight
!= peer
->weight
)
5375 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
5378 /* Dynamic capability. */
5379 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
5380 if (! peer_group_active (peer
) ||
5381 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
5382 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
5385 /* dont capability negotiation. */
5386 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
5387 if (! peer_group_active (peer
) ||
5388 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
5389 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
5392 /* override capability negotiation. */
5393 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
5394 if (! peer_group_active (peer
) ||
5395 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
5396 vty_out (vty
, " neighbor %s override-capability%s", addr
,
5399 /* strict capability negotiation. */
5400 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
5401 if (! peer_group_active (peer
) ||
5402 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
5403 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
5406 if (! peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
5408 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5410 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
5411 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
5415 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
5416 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
5422 /************************************
5423 ****** Per AF to the neighbor ******
5424 ************************************/
5426 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
5428 if (peer
->af_group
[afi
][safi
])
5429 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
5430 peer
->group
->name
, VTY_NEWLINE
);
5432 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
5435 /* ORF capability. */
5436 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
5437 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
5438 if (! peer
->af_group
[afi
][safi
])
5440 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
5442 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
5443 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
5444 vty_out (vty
, " both");
5445 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
5446 vty_out (vty
, " send");
5448 vty_out (vty
, " receive");
5449 vty_out (vty
, "%s", VTY_NEWLINE
);
5452 /* Route reflector client. */
5453 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
5454 && ! peer
->af_group
[afi
][safi
])
5455 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
5459 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
5460 && ! peer
->af_group
[afi
][safi
])
5461 vty_out (vty
, " neighbor %s next-hop-self%s%s", addr
,
5462 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF_ALL
) ?
5463 " all" : "", VTY_NEWLINE
);
5465 /* remove-private-AS */
5466 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
) && !peer
->af_group
[afi
][safi
])
5468 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
) &&
5469 peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
5470 vty_out (vty
, " neighbor %s remove-private-AS all replace-AS%s", addr
, VTY_NEWLINE
);
5472 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
5473 vty_out (vty
, " neighbor %s remove-private-AS replace-AS%s", addr
, VTY_NEWLINE
);
5475 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
5476 vty_out (vty
, " neighbor %s remove-private-AS all%s", addr
, VTY_NEWLINE
);
5479 vty_out (vty
, " neighbor %s remove-private-AS%s", addr
, VTY_NEWLINE
);
5483 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
) &&
5484 !peer
->af_group
[afi
][safi
])
5485 vty_out (vty
, " neighbor %s as-override%s", addr
, VTY_NEWLINE
);
5487 /* send-community print. */
5488 if (! peer
->af_group
[afi
][safi
])
5490 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5492 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5493 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5494 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
5495 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5496 vty_out (vty
, " neighbor %s send-community extended%s",
5498 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5499 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
5503 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
5504 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5505 vty_out (vty
, " no neighbor %s send-community both%s",
5507 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
5508 vty_out (vty
, " no neighbor %s send-community extended%s",
5510 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
5511 vty_out (vty
, " no neighbor %s send-community%s",
5516 /* Default information */
5517 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
5518 && ! peer
->af_group
[afi
][safi
])
5520 vty_out (vty
, " neighbor %s default-originate", addr
);
5521 if (peer
->default_rmap
[afi
][safi
].name
)
5522 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
5523 vty_out (vty
, "%s", VTY_NEWLINE
);
5526 /* Soft reconfiguration inbound. */
5527 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5528 if (! peer
->af_group
[afi
][safi
] ||
5529 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
5530 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
5533 /* maximum-prefix. */
5534 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
5535 if (! peer
->af_group
[afi
][safi
]
5536 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
5537 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
5538 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
5539 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5541 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
5542 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
5543 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
5544 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
5545 vty_out (vty
, " warning-only");
5546 if (peer
->pmax_restart
[afi
][safi
])
5547 vty_out (vty
, " restart %d", peer
->pmax_restart
[afi
][safi
]);
5548 vty_out (vty
, "%s", VTY_NEWLINE
);
5551 /* Route server client. */
5552 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
5553 && ! peer
->af_group
[afi
][safi
])
5554 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
5556 /* Nexthop-local unchanged. */
5557 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)
5558 && ! peer
->af_group
[afi
][safi
])
5559 vty_out (vty
, " neighbor %s nexthop-local unchanged%s", addr
, VTY_NEWLINE
);
5562 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
5563 if (! peer_group_active (peer
)
5564 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
5565 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
5567 if (peer
->allowas_in
[afi
][safi
] == 3)
5568 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
5570 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
5571 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
5575 bgp_config_write_filter (vty
, peer
, afi
, safi
);
5577 /* atribute-unchanged. */
5578 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5579 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5580 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5581 && ! peer
->af_group
[afi
][safi
])
5583 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
5584 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
5585 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
5586 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
5588 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
5589 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
5591 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
5593 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
5594 " med" : "", VTY_NEWLINE
);
5598 /* Display "address-family" configuration header. */
5600 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
5606 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
5609 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
5613 if (safi
== SAFI_MULTICAST
)
5614 vty_out (vty
, "ipv4 multicast");
5615 else if (safi
== SAFI_MPLS_VPN
)
5616 vty_out (vty
, "vpnv4 unicast");
5618 else if (afi
== AFI_IP6
)
5620 vty_out (vty
, "ipv6");
5622 if (safi
== SAFI_MULTICAST
)
5623 vty_out (vty
, " multicast");
5626 vty_out (vty
, "%s", VTY_NEWLINE
);
5631 /* Address family based peer configuration display. */
5633 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
5638 struct peer_group
*group
;
5639 struct listnode
*node
, *nnode
;
5641 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
5643 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
5645 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5647 if (group
->conf
->afc
[afi
][safi
])
5649 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5650 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
5653 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5655 if (peer
->afc
[afi
][safi
])
5657 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
5659 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
5660 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
5665 bgp_config_write_maxpaths (vty
, bgp
, afi
, safi
, &write
);
5666 bgp_config_write_table_map (vty
, bgp
, afi
, safi
, &write
);
5669 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
5675 bgp_config_write (struct vty
*vty
)
5679 struct peer_group
*group
;
5681 struct listnode
*node
, *nnode
;
5682 struct listnode
*mnode
, *mnnode
;
5684 /* BGP Multiple instance. */
5685 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5687 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
5691 /* BGP Config type. */
5692 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5694 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
5698 /* BGP configuration. */
5699 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5702 vty_out (vty
, "!%s", VTY_NEWLINE
);
5704 /* Router bgp ASN */
5705 vty_out (vty
, "router bgp %u", bgp
->as
);
5707 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
5710 vty_out (vty
, " view %s", bgp
->name
);
5712 vty_out (vty
, "%s", VTY_NEWLINE
);
5714 /* No Synchronization */
5715 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5716 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
5718 /* BGP fast-external-failover. */
5719 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
5720 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
5722 /* BGP router ID. */
5723 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
5724 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
5727 /* BGP log-neighbor-changes. */
5728 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
5729 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
5731 /* BGP configuration. */
5732 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
5733 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
5735 /* BGP default ipv4-unicast. */
5736 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
5737 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
5739 /* BGP default local-preference. */
5740 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
5741 vty_out (vty
, " bgp default local-preference %d%s",
5742 bgp
->default_local_pref
, VTY_NEWLINE
);
5744 /* BGP client-to-client reflection. */
5745 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
5746 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
5748 /* BGP cluster ID. */
5749 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
5750 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
5753 /* Confederation identifier*/
5754 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
5755 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
5758 /* Confederation peer */
5759 if (bgp
->confed_peers_cnt
> 0)
5763 vty_out (vty
, " bgp confederation peers");
5765 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
5766 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
5768 vty_out (vty
, "%s", VTY_NEWLINE
);
5771 /* BGP enforce-first-as. */
5772 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
5773 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
5775 /* BGP deterministic-med. */
5776 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
5777 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
5779 /* BGP update-delay. */
5780 bgp_config_write_update_delay (vty
, bgp
);
5782 if (bgp
->v_maxmed_onstartup
!= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
)
5784 vty_out (vty
, " bgp max-med on-startup %d", bgp
->v_maxmed_onstartup
);
5785 if (bgp
->maxmed_onstartup_value
!= BGP_MAXMED_VALUE_DEFAULT
)
5786 vty_out (vty
, " %d", bgp
->maxmed_onstartup_value
);
5787 vty_out (vty
, "%s", VTY_NEWLINE
);
5789 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
)
5791 vty_out (vty
, " bgp max-med administrative");
5792 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
5793 vty_out (vty
, " %d", bgp
->maxmed_admin_value
);
5794 vty_out (vty
, "%s", VTY_NEWLINE
);
5798 bgp_config_write_wpkt_quanta (vty
, bgp
);
5800 /* BGP graceful-restart. */
5801 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
5802 vty_out (vty
, " bgp graceful-restart stalepath-time %d%s",
5803 bgp
->stalepath_time
, VTY_NEWLINE
);
5804 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
5805 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
5807 /* BGP bestpath method. */
5808 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
5809 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
5810 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_CONFED
))
5811 vty_out (vty
, " bgp bestpath as-path confed%s", VTY_NEWLINE
);
5812 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
5813 vty_out (vty
, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE
);
5815 if (bgp_flag_check (bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
5816 vty_out (vty
, " bgp route-reflector allow-outbound-policy%s",
5819 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
5820 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
5821 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
5822 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5824 vty_out (vty
, " bgp bestpath med");
5825 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
5826 vty_out (vty
, " confed");
5827 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
5828 vty_out (vty
, " missing-as-worst");
5829 vty_out (vty
, "%s", VTY_NEWLINE
);
5832 /* BGP network import check. */
5833 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
5834 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
5836 /* BGP flag dampening. */
5837 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
5838 BGP_CONFIG_DAMPENING
))
5839 bgp_config_write_damp (vty
);
5841 /* BGP static route configuration. */
5842 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5844 /* BGP redistribute configuration. */
5845 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5847 /* BGP timers configuration. */
5848 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
5849 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
5850 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
5851 bgp
->default_holdtime
, VTY_NEWLINE
);
5853 if (bgp
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
5854 vty_out (vty
, " bgp route-map delay-timer %d%s", bgp
->rmap_update_timer
,
5858 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
5860 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
5863 /* Normal neighbor configuration. */
5864 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5866 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
5867 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
5871 bgp_config_write_maxpaths (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5872 bgp_config_write_table_map (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
5874 /* Distance configuration. */
5875 bgp_config_write_distance (vty
, bgp
);
5877 /* No auto-summary */
5878 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
5879 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
5881 /* IPv4 multicast configuration. */
5882 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
5884 /* IPv4 VPN configuration. */
5885 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
5887 /* IPv6 unicast configuration. */
5888 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
5890 /* IPv6 multicast configuration. */
5891 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
5899 bgp_master_init (void)
5901 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
5904 bm
->bgp
= list_new ();
5905 bm
->listen_sockets
= list_new ();
5906 bm
->port
= BGP_PORT_DEFAULT
;
5907 bm
->master
= thread_master_create ();
5908 bm
->start_time
= bgp_clock ();
5916 /* allocates some vital data structures used by peer commands in vty_init */
5922 /* BGP VTY commands installation. */
5930 bgp_route_map_init ();
5931 bgp_address_init ();
5932 bgp_scan_vty_init();
5933 bgp_mplsvpn_init ();
5935 /* Access list initialize. */
5936 access_list_init ();
5937 access_list_add_hook (peer_distribute_update
);
5938 access_list_delete_hook (peer_distribute_update
);
5940 /* Filter list initialize. */
5942 as_list_add_hook (peer_aslist_add
);
5943 as_list_delete_hook (peer_aslist_del
);
5945 /* Prefix list initialize.*/
5946 prefix_list_init ();
5947 prefix_list_add_hook (peer_prefix_list_update
);
5948 prefix_list_delete_hook (peer_prefix_list_update
);
5950 /* Community list initialize. */
5951 bgp_clist
= community_list_init ();
5955 #endif /* HAVE_SNMP */
5959 bgp_terminate (void)
5963 struct listnode
*node
, *nnode
;
5964 struct listnode
*mnode
, *mnnode
;
5966 /* Close the listener sockets first as this prevents peers from attempting
5967 * to reconnect on receiving the peer unconfig message. In the presence
5968 * of a large number of peers this will ensure that no peer is left with
5969 * a dangling connection
5971 /* reverse bgp_master_init */
5973 if (bm
->listen_sockets
)
5974 list_free(bm
->listen_sockets
);
5975 bm
->listen_sockets
= NULL
;
5977 for (ALL_LIST_ELEMENTS (bm
->bgp
, mnode
, mnnode
, bgp
))
5978 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
5979 if (peer
->status
== Established
||
5980 peer
->status
== OpenSent
||
5981 peer
->status
== OpenConfirm
)
5982 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
5983 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
5985 bgp_cleanup_routes ();
5987 if (bm
->process_main_queue
)
5989 work_queue_free (bm
->process_main_queue
);
5990 bm
->process_main_queue
= NULL
;
5992 if (bm
->process_rsclient_queue
)
5994 work_queue_free (bm
->process_rsclient_queue
);
5995 bm
->process_rsclient_queue
= NULL
;