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"
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_table.h"
40 #include "bgpd/bgp_aspath.h"
41 #include "bgpd/bgp_route.h"
42 #include "bgpd/bgp_dump.h"
43 #include "bgpd/bgp_debug.h"
44 #include "bgpd/bgp_community.h"
45 #include "bgpd/bgp_attr.h"
46 #include "bgpd/bgp_regex.h"
47 #include "bgpd/bgp_clist.h"
48 #include "bgpd/bgp_fsm.h"
49 #include "bgpd/bgp_packet.h"
50 #include "bgpd/bgp_zebra.h"
51 #include "bgpd/bgp_open.h"
52 #include "bgpd/bgp_filter.h"
53 #include "bgpd/bgp_nexthop.h"
54 #include "bgpd/bgp_damp.h"
55 #include "bgpd/bgp_mplsvpn.h"
56 #include "bgpd/bgp_advertise.h"
57 #include "bgpd/bgp_network.h"
58 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_snmp.h"
61 #endif /* HAVE_SNMP */
63 /* BGP process wide configuration. */
64 static struct bgp_master bgp_master
;
66 extern struct in_addr router_id_zebra
;
68 /* BGP process wide configuration pointer to export. */
69 struct bgp_master
*bm
;
71 /* BGP community-list. */
72 struct community_list_handler
*bgp_clist
;
74 /* BGP global flag manipulation. */
76 bgp_option_set (int flag
)
81 case BGP_OPT_MULTIPLE_INSTANCE
:
82 case BGP_OPT_CONFIG_CISCO
:
83 SET_FLAG (bm
->options
, flag
);
86 return BGP_ERR_INVALID_FLAG
;
93 bgp_option_unset (int flag
)
97 case BGP_OPT_MULTIPLE_INSTANCE
:
98 if (listcount (bm
->bgp
) > 1)
99 return BGP_ERR_MULTIPLE_INSTANCE_USED
;
102 case BGP_OPT_CONFIG_CISCO
:
103 UNSET_FLAG (bm
->options
, flag
);
106 return BGP_ERR_INVALID_FLAG
;
113 bgp_option_check (int flag
)
115 return CHECK_FLAG (bm
->options
, flag
);
118 /* BGP flag manipulation. */
120 bgp_flag_set (struct bgp
*bgp
, int flag
)
122 SET_FLAG (bgp
->flags
, flag
);
127 bgp_flag_unset (struct bgp
*bgp
, int flag
)
129 UNSET_FLAG (bgp
->flags
, flag
);
134 bgp_flag_check (struct bgp
*bgp
, int flag
)
136 return CHECK_FLAG (bgp
->flags
, flag
);
139 /* Internal function to set BGP structure configureation flag. */
141 bgp_config_set (struct bgp
*bgp
, int config
)
143 SET_FLAG (bgp
->config
, config
);
147 bgp_config_unset (struct bgp
*bgp
, int config
)
149 UNSET_FLAG (bgp
->config
, config
);
153 bgp_config_check (struct bgp
*bgp
, int config
)
155 return CHECK_FLAG (bgp
->config
, config
);
158 /* Set BGP router identifier. */
160 bgp_router_id_set (struct bgp
*bgp
, struct in_addr
*id
)
165 if (bgp_config_check (bgp
, BGP_CONFIG_ROUTER_ID
)
166 && IPV4_ADDR_SAME (&bgp
->router_id
, id
))
169 IPV4_ADDR_COPY (&bgp
->router_id
, id
);
170 bgp_config_set (bgp
, BGP_CONFIG_ROUTER_ID
);
172 /* Set all peer's local identifier with this value. */
173 LIST_LOOP (bgp
->peer
, peer
, nn
)
175 IPV4_ADDR_COPY (&peer
->local_id
, id
);
177 if (peer
->status
== Established
)
179 peer
->last_reset
= PEER_DOWN_RID_CHANGE
;
180 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
181 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
187 /* BGP's cluster-id control. */
189 bgp_cluster_id_set (struct bgp
*bgp
, struct in_addr
*cluster_id
)
194 if (bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
)
195 && IPV4_ADDR_SAME (&bgp
->cluster_id
, cluster_id
))
198 IPV4_ADDR_COPY (&bgp
->cluster_id
, cluster_id
);
199 bgp_config_set (bgp
, BGP_CONFIG_CLUSTER_ID
);
201 /* Clear all IBGP peer. */
202 LIST_LOOP (bgp
->peer
, peer
, nn
)
204 if (peer_sort (peer
) != BGP_PEER_IBGP
)
207 if (peer
->status
== Established
)
209 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
210 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
211 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
218 bgp_cluster_id_unset (struct bgp
*bgp
)
223 if (! bgp_config_check (bgp
, BGP_CONFIG_CLUSTER_ID
))
226 bgp
->cluster_id
.s_addr
= 0;
227 bgp_config_unset (bgp
, BGP_CONFIG_CLUSTER_ID
);
229 /* Clear all IBGP peer. */
230 LIST_LOOP (bgp
->peer
, peer
, nn
)
232 if (peer_sort (peer
) != BGP_PEER_IBGP
)
235 if (peer
->status
== Established
)
237 peer
->last_reset
= PEER_DOWN_CLID_CHANGE
;
238 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
239 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
245 /* BGP timer configuration. */
247 bgp_timers_set (struct bgp
*bgp
, u_int32_t keepalive
, u_int32_t holdtime
)
249 bgp
->default_keepalive
= (keepalive
< holdtime
/ 3
250 ? keepalive
: holdtime
/ 3);
251 bgp
->default_holdtime
= holdtime
;
257 bgp_timers_unset (struct bgp
*bgp
)
259 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
260 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
265 /* BGP confederation configuration. */
267 bgp_confederation_id_set (struct bgp
*bgp
, as_t as
)
274 return BGP_ERR_INVALID_AS
;
276 /* Remember - were we doing confederation before? */
277 already_confed
= bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
);
279 bgp_config_set (bgp
, BGP_CONFIG_CONFEDERATION
);
281 /* If we were doing confederation already, this is just an external
282 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
283 were not doing confederation before, reset all EBGP sessions. */
284 LIST_LOOP (bgp
->peer
, peer
, nn
)
286 /* We're looking for peers who's AS is not local or part of our
290 if (peer_sort (peer
) == BGP_PEER_EBGP
)
293 if (peer
->status
== Established
)
295 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
296 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
297 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
301 BGP_EVENT_ADD (peer
, BGP_Stop
);
306 /* Not doign confederation before, so reset every non-local
308 if (peer_sort (peer
) != BGP_PEER_IBGP
)
310 /* Reset the local_as to be our EBGP one */
311 if (peer_sort (peer
) == BGP_PEER_EBGP
)
313 if (peer
->status
== Established
)
315 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
316 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
317 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
320 BGP_EVENT_ADD (peer
, BGP_Stop
);
328 bgp_confederation_id_unset (struct bgp
*bgp
)
334 bgp_config_unset (bgp
, BGP_CONFIG_CONFEDERATION
);
336 LIST_LOOP (bgp
->peer
, peer
, nn
)
338 /* We're looking for peers who's AS is not local */
339 if (peer_sort (peer
) != BGP_PEER_IBGP
)
341 peer
->local_as
= bgp
->as
;
342 if (peer
->status
== Established
)
344 peer
->last_reset
= PEER_DOWN_CONFED_ID_CHANGE
;
345 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
346 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
350 BGP_EVENT_ADD (peer
, BGP_Stop
);
356 /* Is an AS part of the confed or not? */
358 bgp_confederation_peers_check (struct bgp
*bgp
, as_t as
)
365 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
366 if (bgp
->confed_peers
[i
] == as
)
372 /* Add an AS to the confederation set. */
374 bgp_confederation_peers_add (struct bgp
*bgp
, as_t as
)
380 return BGP_ERR_INVALID_BGP
;
383 return BGP_ERR_INVALID_AS
;
385 if (bgp_confederation_peers_check (bgp
, as
))
388 if (bgp
->confed_peers
)
389 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
391 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
393 bgp
->confed_peers
= XMALLOC (MTYPE_BGP_CONFED_LIST
,
394 (bgp
->confed_peers_cnt
+ 1) * sizeof (as_t
));
396 bgp
->confed_peers
[bgp
->confed_peers_cnt
] = as
;
397 bgp
->confed_peers_cnt
++;
399 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
401 LIST_LOOP (bgp
->peer
, peer
, nn
)
405 peer
->local_as
= bgp
->as
;
406 if (peer
->status
== Established
)
408 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
409 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
410 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
413 BGP_EVENT_ADD (peer
, BGP_Stop
);
420 /* Delete an AS from the confederation set. */
422 bgp_confederation_peers_remove (struct bgp
*bgp
, as_t as
)
432 if (! bgp_confederation_peers_check (bgp
, as
))
435 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
436 if (bgp
->confed_peers
[i
] == as
)
437 for(j
= i
+ 1; j
< bgp
->confed_peers_cnt
; j
++)
438 bgp
->confed_peers
[j
- 1] = bgp
->confed_peers
[j
];
440 bgp
->confed_peers_cnt
--;
442 if (bgp
->confed_peers_cnt
== 0)
444 if (bgp
->confed_peers
)
445 XFREE (MTYPE_BGP_CONFED_LIST
, bgp
->confed_peers
);
446 bgp
->confed_peers
= NULL
;
449 bgp
->confed_peers
= XREALLOC (MTYPE_BGP_CONFED_LIST
,
451 bgp
->confed_peers_cnt
* sizeof (as_t
));
453 /* Now reset any peer who's remote AS has just been removed from the
455 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
))
457 LIST_LOOP (bgp
->peer
, peer
, nn
)
461 peer
->local_as
= bgp
->confed_id
;
462 if (peer
->status
== Established
)
464 peer
->last_reset
= PEER_DOWN_CONFED_PEER_CHANGE
;
465 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
466 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
469 BGP_EVENT_ADD (peer
, BGP_Stop
);
477 /* Local preference configuration. */
479 bgp_default_local_preference_set (struct bgp
*bgp
, u_int32_t local_pref
)
484 bgp
->default_local_pref
= local_pref
;
490 bgp_default_local_preference_unset (struct bgp
*bgp
)
495 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
500 /* If peer is RSERVER_CLIENT in at least one address family and is not member
501 of a peer_group for that family, return 1.
502 Used to check wether the peer is included in list bgp->rsclient. */
504 peer_rsclient_active (struct peer
*peer
)
509 for (i
=AFI_IP
; i
< AFI_MAX
; i
++)
510 for (j
=SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
511 if (CHECK_FLAG(peer
->af_flags
[i
][j
], PEER_FLAG_RSERVER_CLIENT
)
512 && ! peer
->af_group
[i
][j
])
517 /* Peer comparison function for sorting. */
519 peer_cmp (struct peer
*p1
, struct peer
*p2
)
521 return sockunion_cmp (&p1
->su
, &p2
->su
);
525 peer_af_flag_check (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
527 return CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
);
530 /* Reset all address family specific configuration. */
532 peer_af_flag_reset (struct peer
*peer
, afi_t afi
, safi_t safi
)
535 struct bgp_filter
*filter
;
536 char orf_name
[BUFSIZ
];
538 filter
= &peer
->filter
[afi
][safi
];
540 /* Clear neighbor filter and route-map */
541 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
543 if (filter
->dlist
[i
].name
)
545 free (filter
->dlist
[i
].name
);
546 filter
->dlist
[i
].name
= NULL
;
548 if (filter
->plist
[i
].name
)
550 free (filter
->plist
[i
].name
);
551 filter
->plist
[i
].name
= NULL
;
553 if (filter
->aslist
[i
].name
)
555 free (filter
->aslist
[i
].name
);
556 filter
->aslist
[i
].name
= NULL
;
559 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
561 if (filter
->map
[i
].name
)
563 free (filter
->map
[i
].name
);
564 filter
->map
[i
].name
= NULL
;
568 /* Clear unsuppress map. */
569 if (filter
->usmap
.name
)
570 free (filter
->usmap
.name
);
571 filter
->usmap
.name
= NULL
;
572 filter
->usmap
.map
= NULL
;
574 /* Clear neighbor's all address family flags. */
575 peer
->af_flags
[afi
][safi
] = 0;
577 /* Clear neighbor's all address family sflags. */
578 peer
->af_sflags
[afi
][safi
] = 0;
580 /* Clear neighbor's all address family capabilities. */
581 peer
->af_cap
[afi
][safi
] = 0;
584 peer
->orf_plist
[afi
][safi
] = NULL
;
585 sprintf (orf_name
, "%s.%d.%d", peer
->host
, afi
, safi
);
586 prefix_bgp_orf_remove_all (orf_name
);
588 /* Set default neighbor send-community. */
589 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
591 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
592 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
595 /* Clear neighbor default_originate_rmap */
596 if (peer
->default_rmap
[afi
][safi
].name
)
597 free (peer
->default_rmap
[afi
][safi
].name
);
598 peer
->default_rmap
[afi
][safi
].name
= NULL
;
599 peer
->default_rmap
[afi
][safi
].map
= NULL
;
601 /* Clear neighbor maximum-prefix */
602 peer
->pmax
[afi
][safi
] = 0;
603 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
606 /* peer global config reset */
608 peer_global_config_reset (struct peer
*peer
)
611 peer
->change_local_as
= 0;
612 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
613 if (peer
->update_source
)
615 sockunion_free (peer
->update_source
);
616 peer
->update_source
= NULL
;
620 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
621 peer
->update_if
= NULL
;
624 if (peer_sort (peer
) == BGP_PEER_IBGP
)
625 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
627 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
634 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
637 /* Check peer's AS number and determin is this peer IBGP or EBGP */
639 peer_sort (struct peer
*peer
)
646 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
649 return (bgp
->as
== peer
->as
? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
653 peer1
= listnode_head (peer
->group
->peer
);
655 return (peer1
->local_as
== peer1
->as
656 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
658 return BGP_PEER_INTERNAL
;
662 if (bgp
&& CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
664 if (peer
->local_as
== 0)
665 return BGP_PEER_INTERNAL
;
667 if (peer
->local_as
== peer
->as
)
669 if (peer
->local_as
== bgp
->confed_id
)
670 return BGP_PEER_EBGP
;
672 return BGP_PEER_IBGP
;
675 if (bgp_confederation_peers_check (bgp
, peer
->as
))
676 return BGP_PEER_CONFED
;
678 return BGP_PEER_EBGP
;
682 return (peer
->local_as
== 0
683 ? BGP_PEER_INTERNAL
: peer
->local_as
== peer
->as
684 ? BGP_PEER_IBGP
: BGP_PEER_EBGP
);
688 /* Allocate new peer object. */
697 /* Allocate new peer. */
698 peer
= XMALLOC (MTYPE_BGP_PEER
, sizeof (struct peer
));
699 memset (peer
, 0, sizeof (struct peer
));
701 /* Set default value. */
703 peer
->v_start
= BGP_INIT_START_TIMER
;
704 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
705 peer
->v_asorig
= BGP_DEFAULT_ASORIGINATE
;
707 peer
->ostatus
= Idle
;
708 peer
->version
= BGP_VERSION_4
;
711 /* Set default flags. */
712 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
713 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
715 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO
))
717 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
);
718 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
);
720 peer
->orf_plist
[afi
][safi
] = NULL
;
722 SET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
724 /* Create buffers. */
725 peer
->ibuf
= stream_new (BGP_MAX_PACKET_SIZE
);
726 peer
->obuf
= stream_fifo_new ();
727 peer
->work
= stream_new (BGP_MAX_PACKET_SIZE
);
729 bgp_sync_init (peer
);
731 /* Get service port number. */
732 sp
= getservbyname ("bgp", "tcp");
733 peer
->port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
738 /* Create new BGP peer. */
740 peer_create (union sockunion
*su
, struct bgp
*bgp
, as_t local_as
,
741 as_t remote_as
, afi_t afi
, safi_t safi
)
745 char buf
[SU_ADDRSTRLEN
];
750 peer
->local_as
= local_as
;
751 peer
->as
= remote_as
;
752 peer
->local_id
= bgp
->router_id
;
753 peer
->v_holdtime
= bgp
->default_holdtime
;
754 peer
->v_keepalive
= bgp
->default_keepalive
;
755 if (peer_sort (peer
) == BGP_PEER_IBGP
)
756 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
758 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
759 listnode_add_sort (bgp
->peer
, peer
);
761 active
= peer_active (peer
);
764 peer
->afc
[afi
][safi
] = 1;
766 /* Last read time set */
767 peer
->readtime
= time (NULL
);
769 /* Last reset time set */
770 peer
->resettime
= time (NULL
);
772 /* Default TTL set. */
773 peer
->ttl
= (peer_sort (peer
) == BGP_PEER_IBGP
? 255 : 1);
775 /* Make peer's address string. */
776 sockunion2str (su
, buf
, SU_ADDRSTRLEN
);
777 peer
->host
= strdup (buf
);
779 /* Set up peer's events and timers. */
780 if (! active
&& peer_active (peer
))
781 bgp_timer_set (peer
);
786 /* Make accept BGP peer. Called from bgp_accept (). */
788 peer_create_accept (struct bgp
*bgp
)
794 listnode_add_sort (bgp
->peer
, peer
);
799 /* Change peer's AS number. */
801 peer_as_change (struct peer
*peer
, as_t as
)
806 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
808 if (peer
->status
== Established
)
810 peer
->last_reset
= PEER_DOWN_REMOTE_AS_CHANGE
;
811 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
812 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
815 BGP_EVENT_ADD (peer
, BGP_Stop
);
817 type
= peer_sort (peer
);
820 if (bgp_config_check (peer
->bgp
, BGP_CONFIG_CONFEDERATION
)
821 && ! bgp_confederation_peers_check (peer
->bgp
, as
)
822 && peer
->bgp
->as
!= as
)
823 peer
->local_as
= peer
->bgp
->confed_id
;
825 peer
->local_as
= peer
->bgp
->as
;
827 /* Advertisement-interval reset */
828 if (peer_sort (peer
) == BGP_PEER_IBGP
)
829 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
831 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
834 if (peer_sort (peer
) == BGP_PEER_IBGP
)
836 else if (type
== BGP_PEER_IBGP
)
839 /* reflector-client reset */
840 if (peer_sort (peer
) != BGP_PEER_IBGP
)
842 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_UNICAST
],
843 PEER_FLAG_REFLECTOR_CLIENT
);
844 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MULTICAST
],
845 PEER_FLAG_REFLECTOR_CLIENT
);
846 UNSET_FLAG (peer
->af_flags
[AFI_IP
][SAFI_MPLS_VPN
],
847 PEER_FLAG_REFLECTOR_CLIENT
);
848 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
849 PEER_FLAG_REFLECTOR_CLIENT
);
850 UNSET_FLAG (peer
->af_flags
[AFI_IP6
][SAFI_MULTICAST
],
851 PEER_FLAG_REFLECTOR_CLIENT
);
855 if (peer_sort (peer
) != BGP_PEER_EBGP
)
857 peer
->change_local_as
= 0;
858 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
862 /* If peer does not exist, create new one. If peer already exists,
863 set AS number to the peer. */
865 peer_remote_as (struct bgp
*bgp
, union sockunion
*su
, as_t
*as
,
866 afi_t afi
, safi_t safi
)
871 peer
= peer_lookup (bgp
, su
);
875 /* When this peer is a member of peer-group. */
878 if (peer
->group
->conf
->as
)
880 /* Return peer group's AS number. */
881 *as
= peer
->group
->conf
->as
;
882 return BGP_ERR_PEER_GROUP_MEMBER
;
884 if (peer_sort (peer
->group
->conf
) == BGP_PEER_IBGP
)
889 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
897 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
902 /* Existing peer's AS number change. */
904 peer_as_change (peer
, *as
);
909 /* If the peer is not part of our confederation, and its not an
910 iBGP peer then spoof the source AS */
911 if (bgp_config_check (bgp
, BGP_CONFIG_CONFEDERATION
)
912 && ! bgp_confederation_peers_check (bgp
, *as
)
914 local_as
= bgp
->confed_id
;
918 /* If this is IPv4 unicast configuration and "no bgp default
919 ipv4-unicast" is specified. */
921 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
922 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
923 peer
= peer_create (su
, bgp
, local_as
, *as
, 0, 0);
925 peer
= peer_create (su
, bgp
, local_as
, *as
, afi
, safi
);
931 /* Activate the peer or peer group for specified AFI and SAFI. */
933 peer_activate (struct peer
*peer
, afi_t afi
, safi_t safi
)
937 if (peer
->afc
[afi
][safi
])
940 /* Activate the address family configuration. */
941 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
942 peer
->afc
[afi
][safi
] = 1;
945 active
= peer_active (peer
);
947 peer
->afc
[afi
][safi
] = 1;
949 if (! active
&& peer_active (peer
))
950 bgp_timer_set (peer
);
953 if (peer
->status
== Established
)
955 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
957 peer
->afc_adv
[afi
][safi
] = 1;
958 bgp_capability_send (peer
, afi
, safi
,
960 CAPABILITY_ACTION_SET
);
961 if (peer
->afc_recv
[afi
][safi
])
963 peer
->afc_nego
[afi
][safi
] = 1;
964 bgp_announce_route (peer
, afi
, safi
);
969 peer
->last_reset
= PEER_DOWN_AF_ACTIVATE
;
970 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
971 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
980 peer_deactivate (struct peer
*peer
, afi_t afi
, safi_t safi
)
982 struct peer_group
*group
;
986 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
990 LIST_LOOP (group
->peer
, peer1
, nn
)
992 if (peer1
->af_group
[afi
][safi
])
993 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS
;
998 if (peer
->af_group
[afi
][safi
])
999 return BGP_ERR_PEER_BELONGS_TO_GROUP
;
1002 if (! peer
->afc
[afi
][safi
])
1005 /* De-activate the address family configuration. */
1006 peer
->afc
[afi
][safi
] = 0;
1007 peer_af_flag_reset (peer
, afi
, safi
);
1009 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1011 if (peer
->status
== Established
)
1013 if (CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
1015 peer
->afc_adv
[afi
][safi
] = 0;
1016 peer
->afc_nego
[afi
][safi
] = 0;
1018 if (peer_active_nego (peer
))
1020 bgp_capability_send (peer
, afi
, safi
,
1022 CAPABILITY_ACTION_UNSET
);
1023 bgp_clear_route (peer
, afi
, safi
);
1024 peer
->pcount
[afi
][safi
] = 0;
1028 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1029 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1030 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1035 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1036 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1037 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1044 /* Delete peer from confguration. */
1046 peer_delete (struct peer
*peer
)
1052 struct bgp_filter
*filter
;
1056 /* If this peer belongs to peer group. Clearn up the
1060 listnode_delete (peer
->group
->peer
, peer
);
1064 /* Withdraw all information from routing table. We can not use
1065 BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1066 executed after peer structure is deleted. */
1067 peer
->last_reset
= PEER_DOWN_NEIGHBOR_DELETE
;
1069 bgp_fsm_change_status (peer
, Idle
);
1071 /* Stop all timers. */
1072 BGP_TIMER_OFF (peer
->t_start
);
1073 BGP_TIMER_OFF (peer
->t_connect
);
1074 BGP_TIMER_OFF (peer
->t_holdtime
);
1075 BGP_TIMER_OFF (peer
->t_keepalive
);
1076 BGP_TIMER_OFF (peer
->t_asorig
);
1077 BGP_TIMER_OFF (peer
->t_routeadv
);
1079 /* Delete from all peer list. */
1080 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
1082 listnode_delete (bgp
->peer
, peer
);
1083 if (peer_rsclient_active (peer
))
1084 listnode_delete (bgp
->rsclient
, peer
);
1087 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1088 member of a peer_group. */
1089 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1090 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1091 if (peer
->rib
[afi
][safi
] && ! peer
->af_group
[afi
][safi
])
1092 bgp_table_finish (peer
->rib
[afi
][safi
]);
1096 stream_free (peer
->ibuf
);
1099 stream_fifo_free (peer
->obuf
);
1102 stream_free (peer
->work
);
1104 /* Free allocated host character. */
1108 /* Local and remote addresses. */
1110 XFREE (MTYPE_TMP
, peer
->su_local
);
1111 if (peer
->su_remote
)
1112 XFREE (MTYPE_TMP
, peer
->su_remote
);
1114 /* Peer description string. */
1116 XFREE (MTYPE_TMP
, peer
->desc
);
1118 bgp_sync_delete (peer
);
1120 /* Free filter related memory. */
1121 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1122 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1124 filter
= &peer
->filter
[afi
][safi
];
1126 for (i
= FILTER_IN
; i
< FILTER_MAX
; i
++)
1128 if (filter
->dlist
[i
].name
)
1129 free (filter
->dlist
[i
].name
);
1130 if (filter
->plist
[i
].name
)
1131 free (filter
->plist
[i
].name
);
1132 if (filter
->aslist
[i
].name
)
1133 free (filter
->aslist
[i
].name
);
1135 for (i
= RMAP_IN
; i
< RMAP_MAX
; i
++)
1137 if (filter
->map
[i
].name
)
1138 free (filter
->map
[i
].name
);
1141 if (filter
->usmap
.name
)
1142 free (filter
->usmap
.name
);
1144 if (peer
->default_rmap
[afi
][safi
].name
)
1145 free (peer
->default_rmap
[afi
][safi
].name
);
1148 /* Update source configuration. */
1149 if (peer
->update_source
)
1151 sockunion_free (peer
->update_source
);
1152 peer
->update_source
= NULL
;
1154 if (peer
->update_if
)
1156 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1157 peer
->update_if
= NULL
;
1160 /* Free peer structure. */
1161 XFREE (MTYPE_BGP_PEER
, peer
);
1167 peer_group_cmp (struct peer_group
*g1
, struct peer_group
*g2
)
1169 return strcmp (g1
->name
, g2
->name
);
1172 /* If peer is configured at least one address family return 1. */
1174 peer_group_active (struct peer
*peer
)
1176 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
]
1177 || peer
->af_group
[AFI_IP
][SAFI_MULTICAST
]
1178 || peer
->af_group
[AFI_IP
][SAFI_MPLS_VPN
]
1179 || peer
->af_group
[AFI_IP6
][SAFI_UNICAST
]
1180 || peer
->af_group
[AFI_IP6
][SAFI_MULTICAST
])
1185 /* Peer group cofiguration. */
1186 static struct peer_group
*
1189 return (struct peer_group
*) XCALLOC (MTYPE_PEER_GROUP
,
1190 sizeof (struct peer_group
));
1194 peer_group_free (struct peer_group
*group
)
1196 XFREE (MTYPE_PEER_GROUP
, group
);
1200 peer_group_lookup (struct bgp
*bgp
, const char *name
)
1202 struct peer_group
*group
;
1203 struct listnode
*nn
;
1205 LIST_LOOP (bgp
->group
, group
, nn
)
1207 if (strcmp (group
->name
, name
) == 0)
1214 peer_group_get (struct bgp
*bgp
, const char *name
)
1216 struct peer_group
*group
;
1218 group
= peer_group_lookup (bgp
, name
);
1222 group
= peer_group_new ();
1224 group
->name
= strdup (name
);
1225 group
->peer
= list_new ();
1226 group
->conf
= peer_new ();
1227 if (! bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
1228 group
->conf
->afc
[AFI_IP
][SAFI_UNICAST
] = 1;
1229 group
->conf
->host
= strdup (name
);
1230 group
->conf
->bgp
= bgp
;
1231 group
->conf
->group
= group
;
1232 group
->conf
->as
= 0;
1233 group
->conf
->ttl
= 1;
1234 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1235 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_TIMER
);
1236 UNSET_FLAG (group
->conf
->config
, PEER_CONFIG_CONNECT
);
1237 group
->conf
->keepalive
= 0;
1238 group
->conf
->holdtime
= 0;
1239 group
->conf
->connect
= 0;
1240 SET_FLAG (group
->conf
->sflags
, PEER_STATUS_GROUP
);
1241 listnode_add_sort (bgp
->group
, group
);
1247 peer_group2peer_config_copy (struct peer_group
*group
, struct peer
*peer
,
1248 afi_t afi
, safi_t safi
)
1251 int out
= FILTER_OUT
;
1253 struct bgp_filter
*pfilter
;
1254 struct bgp_filter
*gfilter
;
1257 pfilter
= &peer
->filter
[afi
][safi
];
1258 gfilter
= &conf
->filter
[afi
][safi
];
1262 peer
->as
= conf
->as
;
1265 if (conf
->change_local_as
)
1266 peer
->change_local_as
= conf
->change_local_as
;
1269 peer
->ttl
= conf
->ttl
;
1272 peer
->weight
= conf
->weight
;
1274 /* peer flags apply */
1275 peer
->flags
= conf
->flags
;
1276 /* peer af_flags apply */
1277 peer
->af_flags
[afi
][safi
] = conf
->af_flags
[afi
][safi
];
1278 /* peer config apply */
1279 peer
->config
= conf
->config
;
1281 /* peer timers apply */
1282 peer
->holdtime
= conf
->holdtime
;
1283 peer
->keepalive
= conf
->keepalive
;
1284 peer
->connect
= conf
->connect
;
1285 if (CHECK_FLAG (conf
->config
, PEER_CONFIG_CONNECT
))
1286 peer
->v_connect
= conf
->connect
;
1288 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
1290 /* advertisement-interval reset */
1291 if (peer_sort (peer
) == BGP_PEER_IBGP
)
1292 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1294 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1296 /* maximum-prefix */
1297 peer
->pmax
[afi
][safi
] = conf
->pmax
[afi
][safi
];
1298 peer
->pmax_threshold
[afi
][safi
] = conf
->pmax_threshold
[afi
][safi
];
1301 peer
->allowas_in
[afi
][safi
] = conf
->allowas_in
[afi
][safi
];
1303 /* route-server-client */
1304 if (CHECK_FLAG(conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1306 /* Make peer's RIB point to group's RIB. */
1307 peer
->rib
[afi
][safi
] = group
->conf
->rib
[afi
][safi
];
1309 /* Import policy. */
1310 if (pfilter
->map
[RMAP_IMPORT
].name
)
1311 free (pfilter
->map
[RMAP_IMPORT
].name
);
1312 if (gfilter
->map
[RMAP_IMPORT
].name
)
1314 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1315 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1319 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1320 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1323 /* Export policy. */
1324 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1326 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1327 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1331 /* default-originate route-map */
1332 if (conf
->default_rmap
[afi
][safi
].name
)
1334 if (peer
->default_rmap
[afi
][safi
].name
)
1335 free (peer
->default_rmap
[afi
][safi
].name
);
1336 peer
->default_rmap
[afi
][safi
].name
= strdup (conf
->default_rmap
[afi
][safi
].name
);
1337 peer
->default_rmap
[afi
][safi
].map
= conf
->default_rmap
[afi
][safi
].map
;
1340 /* update-source apply */
1341 if (conf
->update_source
)
1343 if (peer
->update_source
)
1344 sockunion_free (peer
->update_source
);
1345 if (peer
->update_if
)
1347 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1348 peer
->update_if
= NULL
;
1350 peer
->update_source
= sockunion_dup (conf
->update_source
);
1352 else if (conf
->update_if
)
1354 if (peer
->update_if
)
1355 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
1356 if (peer
->update_source
)
1358 sockunion_free (peer
->update_source
);
1359 peer
->update_source
= NULL
;
1361 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, conf
->update_if
);
1364 /* inbound filter apply */
1365 if (gfilter
->dlist
[in
].name
&& ! pfilter
->dlist
[in
].name
)
1367 if (pfilter
->dlist
[in
].name
)
1368 free (pfilter
->dlist
[in
].name
);
1369 pfilter
->dlist
[in
].name
= strdup (gfilter
->dlist
[in
].name
);
1370 pfilter
->dlist
[in
].alist
= gfilter
->dlist
[in
].alist
;
1372 if (gfilter
->plist
[in
].name
&& ! pfilter
->plist
[in
].name
)
1374 if (pfilter
->plist
[in
].name
)
1375 free (pfilter
->plist
[in
].name
);
1376 pfilter
->plist
[in
].name
= strdup (gfilter
->plist
[in
].name
);
1377 pfilter
->plist
[in
].plist
= gfilter
->plist
[in
].plist
;
1379 if (gfilter
->aslist
[in
].name
&& ! pfilter
->aslist
[in
].name
)
1381 if (pfilter
->aslist
[in
].name
)
1382 free (pfilter
->aslist
[in
].name
);
1383 pfilter
->aslist
[in
].name
= strdup (gfilter
->aslist
[in
].name
);
1384 pfilter
->aslist
[in
].aslist
= gfilter
->aslist
[in
].aslist
;
1386 if (gfilter
->map
[RMAP_IN
].name
&& ! pfilter
->map
[RMAP_IN
].name
)
1388 if (pfilter
->map
[RMAP_IN
].name
)
1389 free (pfilter
->map
[RMAP_IN
].name
);
1390 pfilter
->map
[RMAP_IN
].name
= strdup (gfilter
->map
[RMAP_IN
].name
);
1391 pfilter
->map
[RMAP_IN
].map
= gfilter
->map
[RMAP_IN
].map
;
1394 /* outbound filter apply */
1395 if (gfilter
->dlist
[out
].name
)
1397 if (pfilter
->dlist
[out
].name
)
1398 free (pfilter
->dlist
[out
].name
);
1399 pfilter
->dlist
[out
].name
= strdup (gfilter
->dlist
[out
].name
);
1400 pfilter
->dlist
[out
].alist
= gfilter
->dlist
[out
].alist
;
1404 if (pfilter
->dlist
[out
].name
)
1405 free (pfilter
->dlist
[out
].name
);
1406 pfilter
->dlist
[out
].name
= NULL
;
1407 pfilter
->dlist
[out
].alist
= NULL
;
1409 if (gfilter
->plist
[out
].name
)
1411 if (pfilter
->plist
[out
].name
)
1412 free (pfilter
->plist
[out
].name
);
1413 pfilter
->plist
[out
].name
= strdup (gfilter
->plist
[out
].name
);
1414 pfilter
->plist
[out
].plist
= gfilter
->plist
[out
].plist
;
1418 if (pfilter
->plist
[out
].name
)
1419 free (pfilter
->plist
[out
].name
);
1420 pfilter
->plist
[out
].name
= NULL
;
1421 pfilter
->plist
[out
].plist
= NULL
;
1423 if (gfilter
->aslist
[out
].name
)
1425 if (pfilter
->aslist
[out
].name
)
1426 free (pfilter
->aslist
[out
].name
);
1427 pfilter
->aslist
[out
].name
= strdup (gfilter
->aslist
[out
].name
);
1428 pfilter
->aslist
[out
].aslist
= gfilter
->aslist
[out
].aslist
;
1432 if (pfilter
->aslist
[out
].name
)
1433 free (pfilter
->aslist
[out
].name
);
1434 pfilter
->aslist
[out
].name
= NULL
;
1435 pfilter
->aslist
[out
].aslist
= NULL
;
1437 if (gfilter
->map
[RMAP_OUT
].name
)
1439 if (pfilter
->map
[RMAP_OUT
].name
)
1440 free (pfilter
->map
[RMAP_OUT
].name
);
1441 pfilter
->map
[RMAP_OUT
].name
= strdup (gfilter
->map
[RMAP_OUT
].name
);
1442 pfilter
->map
[RMAP_OUT
].map
= gfilter
->map
[RMAP_OUT
].map
;
1446 if (pfilter
->map
[RMAP_OUT
].name
)
1447 free (pfilter
->map
[RMAP_OUT
].name
);
1448 pfilter
->map
[RMAP_OUT
].name
= NULL
;
1449 pfilter
->map
[RMAP_OUT
].map
= NULL
;
1452 /* RS-client's import/export route-maps. */
1453 if (gfilter
->map
[RMAP_IMPORT
].name
)
1455 if (pfilter
->map
[RMAP_IMPORT
].name
)
1456 free (pfilter
->map
[RMAP_IMPORT
].name
);
1457 pfilter
->map
[RMAP_IMPORT
].name
= strdup (gfilter
->map
[RMAP_IMPORT
].name
);
1458 pfilter
->map
[RMAP_IMPORT
].map
= gfilter
->map
[RMAP_IMPORT
].map
;
1462 if (pfilter
->map
[RMAP_IMPORT
].name
)
1463 free (pfilter
->map
[RMAP_IMPORT
].name
);
1464 pfilter
->map
[RMAP_IMPORT
].name
= NULL
;
1465 pfilter
->map
[RMAP_IMPORT
].map
= NULL
;
1467 if (gfilter
->map
[RMAP_EXPORT
].name
&& ! pfilter
->map
[RMAP_EXPORT
].name
)
1469 if (pfilter
->map
[RMAP_EXPORT
].name
)
1470 free (pfilter
->map
[RMAP_EXPORT
].name
);
1471 pfilter
->map
[RMAP_EXPORT
].name
= strdup (gfilter
->map
[RMAP_EXPORT
].name
);
1472 pfilter
->map
[RMAP_EXPORT
].map
= gfilter
->map
[RMAP_EXPORT
].map
;
1475 if (gfilter
->usmap
.name
)
1477 if (pfilter
->usmap
.name
)
1478 free (pfilter
->usmap
.name
);
1479 pfilter
->usmap
.name
= strdup (gfilter
->usmap
.name
);
1480 pfilter
->usmap
.map
= gfilter
->usmap
.map
;
1484 if (pfilter
->usmap
.name
)
1485 free (pfilter
->usmap
.name
);
1486 pfilter
->usmap
.name
= NULL
;
1487 pfilter
->usmap
.map
= NULL
;
1491 /* Peer group's remote AS configuration. */
1493 peer_group_remote_as (struct bgp
*bgp
, const char *group_name
, as_t
*as
)
1495 struct peer_group
*group
;
1497 struct listnode
*nn
;
1499 group
= peer_group_lookup (bgp
, group_name
);
1503 if (group
->conf
->as
== *as
)
1506 /* When we setup peer-group AS number all peer group member's AS
1507 number must be updated to same number. */
1508 peer_as_change (group
->conf
, *as
);
1510 LIST_LOOP (group
->peer
, peer
, nn
)
1512 if (peer
->as
!= *as
)
1513 peer_as_change (peer
, *as
);
1520 peer_group_delete (struct peer_group
*group
)
1524 struct listnode
*nn
;
1528 LIST_LOOP (group
->peer
, peer
, nn
)
1533 list_delete (group
->peer
);
1538 group
->conf
->group
= NULL
;
1539 peer_delete (group
->conf
);
1541 /* Delete from all peer_group list. */
1542 listnode_delete (bgp
->group
, group
);
1544 peer_group_free (group
);
1550 peer_group_remote_as_delete (struct peer_group
*group
)
1553 struct listnode
*nn
;
1555 if (! group
->conf
->as
)
1558 LIST_LOOP (group
->peer
, peer
, nn
)
1563 list_delete_all_node (group
->peer
);
1565 group
->conf
->as
= 0;
1570 /* Bind specified peer to peer group. */
1572 peer_group_bind (struct bgp
*bgp
, union sockunion
*su
,
1573 struct peer_group
*group
, afi_t afi
, safi_t safi
, as_t
*as
)
1576 int first_member
= 0;
1578 /* Check peer group's address family. */
1579 if (! group
->conf
->afc
[afi
][safi
])
1580 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED
;
1582 /* Lookup the peer. */
1583 peer
= peer_lookup (bgp
, su
);
1585 /* Create a new peer. */
1588 if (! group
->conf
->as
)
1589 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS
;
1591 peer
= peer_create (su
, bgp
, bgp
->as
, group
->conf
->as
, afi
, safi
);
1592 peer
->group
= group
;
1593 peer
->af_group
[afi
][safi
] = 1;
1594 listnode_add (group
->peer
, peer
);
1595 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1600 /* When the peer already belongs to peer group, check the consistency. */
1601 if (peer
->af_group
[afi
][safi
])
1603 if (strcmp (peer
->group
->name
, group
->name
) != 0)
1604 return BGP_ERR_PEER_GROUP_CANT_CHANGE
;
1609 /* Check current peer group configuration. */
1610 if (peer_group_active (peer
)
1611 && strcmp (peer
->group
->name
, group
->name
) != 0)
1612 return BGP_ERR_PEER_GROUP_MISMATCH
;
1614 if (! group
->conf
->as
)
1616 if (peer_sort (group
->conf
) != BGP_PEER_INTERNAL
1617 && peer_sort (group
->conf
) != peer_sort (peer
))
1621 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
;
1624 if (peer_sort (group
->conf
) == BGP_PEER_INTERNAL
)
1628 peer
->af_group
[afi
][safi
] = 1;
1629 peer
->afc
[afi
][safi
] = 1;
1632 peer
->group
= group
;
1633 listnode_add (group
->peer
, peer
);
1638 /* Advertisement-interval reset */
1639 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1640 group
->conf
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
1642 group
->conf
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
1644 /* ebgp-multihop reset */
1645 if (peer_sort (group
->conf
) == BGP_PEER_IBGP
)
1646 group
->conf
->ttl
= 255;
1648 /* local-as reset */
1649 if (peer_sort (group
->conf
) != BGP_PEER_EBGP
)
1651 group
->conf
->change_local_as
= 0;
1652 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
1656 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
1658 /* If it's not configured as RSERVER_CLIENT in any other address
1659 family, without being member of a peer_group, remove it from
1660 list bgp->rsclient.*/
1661 if (! peer_rsclient_active (peer
))
1662 listnode_delete (bgp
->rsclient
, peer
);
1664 bgp_table_finish (peer
->rib
[afi
][safi
]);
1666 /* Import policy. */
1667 if (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
)
1669 free (peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
);
1670 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].name
= NULL
;
1671 peer
->filter
[afi
][safi
].map
[RMAP_IMPORT
].map
= NULL
;
1674 /* Export policy. */
1675 if (! CHECK_FLAG(group
->conf
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
1676 && peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
)
1678 free (peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
);
1679 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].name
= NULL
;
1680 peer
->filter
[afi
][safi
].map
[RMAP_EXPORT
].map
= NULL
;
1684 peer_group2peer_config_copy (group
, peer
, afi
, safi
);
1686 if (peer
->status
== Established
)
1688 peer
->last_reset
= PEER_DOWN_RMAP_BIND
;
1689 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1690 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1693 BGP_EVENT_ADD (peer
, BGP_Stop
);
1699 peer_group_unbind (struct bgp
*bgp
, struct peer
*peer
,
1700 struct peer_group
*group
, afi_t afi
, safi_t safi
)
1702 if (! peer
->af_group
[afi
][safi
])
1705 if (group
!= peer
->group
)
1706 return BGP_ERR_PEER_GROUP_MISMATCH
;
1708 peer
->af_group
[afi
][safi
] = 0;
1709 peer
->afc
[afi
][safi
] = 0;
1710 peer_af_flag_reset (peer
, afi
, safi
);
1712 if (peer
->rib
[afi
][safi
])
1713 peer
->rib
[afi
][safi
] = NULL
;
1715 if (! peer_group_active (peer
))
1717 listnode_delete (group
->peer
, peer
);
1719 if (group
->conf
->as
)
1724 peer_global_config_reset (peer
);
1727 if (peer
->status
== Established
)
1729 peer
->last_reset
= PEER_DOWN_RMAP_UNBIND
;
1730 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1731 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
1734 BGP_EVENT_ADD (peer
, BGP_Stop
);
1739 /* BGP instance creation by `router bgp' commands. */
1741 bgp_create (as_t
*as
, const char *name
)
1747 bgp
= XCALLOC (MTYPE_BGP
, sizeof (struct bgp
));
1749 bgp
->peer_self
= peer_new ();
1750 bgp
->peer_self
->host
= strdup ("Static announcement");
1752 bgp
->peer
= list_new ();
1753 bgp
->peer
->cmp
= (int (*)(void *, void *)) peer_cmp
;
1755 bgp
->group
= list_new ();
1756 bgp
->group
->cmp
= (int (*)(void *, void *)) peer_group_cmp
;
1758 bgp
->rsclient
= list_new ();
1759 bgp
->rsclient
->cmp
= (int (*)(void*, void*)) peer_cmp
;
1761 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1762 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1764 bgp
->route
[afi
][safi
] = bgp_table_init ();
1765 bgp
->aggregate
[afi
][safi
] = bgp_table_init ();
1766 bgp
->rib
[afi
][safi
] = bgp_table_init ();
1769 bgp
->default_local_pref
= BGP_DEFAULT_LOCAL_PREF
;
1770 bgp
->default_holdtime
= BGP_DEFAULT_HOLDTIME
;
1771 bgp
->default_keepalive
= BGP_DEFAULT_KEEPALIVE
;
1772 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
1773 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1778 bgp
->name
= strdup (name
);
1783 /* Return master of BGP. */
1792 /* Return first entry of BGP. */
1797 return bm
->bgp
->head
->data
;
1801 /* Lookup BGP entry. */
1803 bgp_lookup (as_t as
, const char *name
)
1806 struct listnode
*nn
;
1808 LIST_LOOP (bm
->bgp
, bgp
, nn
)
1810 && ((bgp
->name
== NULL
&& name
== NULL
)
1811 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0)))
1816 /* Lookup BGP structure by view name. */
1818 bgp_lookup_by_name (const char *name
)
1821 struct listnode
*nn
;
1823 LIST_LOOP (bm
->bgp
, bgp
, nn
)
1824 if ((bgp
->name
== NULL
&& name
== NULL
)
1825 || (bgp
->name
&& name
&& strcmp (bgp
->name
, name
) == 0))
1830 /* Called from VTY commands. */
1832 bgp_get (struct bgp
**bgp_val
, as_t
*as
, const char *name
)
1836 /* Multiple instance check. */
1837 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
1840 bgp
= bgp_lookup_by_name (name
);
1842 bgp
= bgp_get_default ();
1844 /* Already exists. */
1850 return BGP_ERR_INSTANCE_MISMATCH
;
1858 /* BGP instance name can not be specified for single instance. */
1860 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
;
1862 /* Get default BGP structure if exists. */
1863 bgp
= bgp_get_default ();
1870 return BGP_ERR_AS_MISMATCH
;
1877 bgp
= bgp_create (as
, name
);
1878 listnode_add (bm
->bgp
, bgp
);
1879 bgp_router_id_set(bgp
, &router_id_zebra
);
1885 /* Delete BGP instance. */
1887 bgp_delete (struct bgp
*bgp
)
1890 struct listnode
*nn
;
1891 struct listnode
*next
;
1896 /* Delete static route. */
1897 bgp_static_delete (bgp
);
1899 /* Unset redistribution. */
1900 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1901 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
1902 if (i
!= ZEBRA_ROUTE_BGP
)
1903 bgp_redistribute_unset (bgp
, afi
, i
);
1905 bgp
->group
->del
= (void (*)(void *)) peer_group_delete
;
1906 list_delete (bgp
->group
);
1908 for (nn
= bgp
->peer
->head
; nn
; nn
= next
)
1915 bgp
->rsclient
->del
= (void (*)(void *)) peer_delete
;
1916 list_delete (bgp
->rsclient
);
1918 listnode_delete (bm
->bgp
, bgp
);
1923 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1924 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1926 if (bgp
->route
[afi
][safi
])
1927 XFREE (MTYPE_ROUTE_TABLE
, bgp
->route
[afi
][safi
]);
1928 if (bgp
->aggregate
[afi
][safi
])
1929 XFREE (MTYPE_ROUTE_TABLE
,bgp
->aggregate
[afi
][safi
]) ;
1930 if (bgp
->rib
[afi
][safi
])
1931 XFREE (MTYPE_ROUTE_TABLE
,bgp
->rib
[afi
][safi
]);
1933 XFREE (MTYPE_BGP
, bgp
);
1939 peer_lookup (struct bgp
*bgp
, union sockunion
*su
)
1942 struct listnode
*nn
;
1945 bgp
= bgp_get_default ();
1950 LIST_LOOP (bgp
->peer
, peer
, nn
)
1952 if (sockunion_same (&peer
->su
, su
)
1953 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1960 peer_lookup_with_open (union sockunion
*su
, as_t remote_as
,
1961 struct in_addr
*remote_id
, int *as
)
1964 struct listnode
*nn
;
1967 bgp
= bgp_get_default ();
1971 LIST_LOOP (bgp
->peer
, peer
, nn
)
1973 if (sockunion_same (&peer
->su
, su
)
1974 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1976 if (peer
->as
== remote_as
1977 && peer
->remote_id
.s_addr
== remote_id
->s_addr
)
1979 if (peer
->as
== remote_as
)
1983 LIST_LOOP (bgp
->peer
, peer
, nn
)
1985 if (sockunion_same (&peer
->su
, su
)
1986 && ! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1988 if (peer
->as
== remote_as
1989 && peer
->remote_id
.s_addr
== 0)
1991 if (peer
->as
== remote_as
)
1998 /* If peer is configured at least one address family return 1. */
2000 peer_active (struct peer
*peer
)
2002 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
]
2003 || peer
->afc
[AFI_IP
][SAFI_MULTICAST
]
2004 || peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
]
2005 || peer
->afc
[AFI_IP6
][SAFI_UNICAST
]
2006 || peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
2011 /* If peer is negotiated at least one address family return 1. */
2013 peer_active_nego (struct peer
*peer
)
2015 if (peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
2016 || peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
2017 || peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
2018 || peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
2019 || peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
2024 /* peer_flag_change_type. */
2025 enum peer_change_type
2029 peer_change_reset_in
,
2030 peer_change_reset_out
,
2034 peer_change_action (struct peer
*peer
, afi_t afi
, safi_t safi
,
2035 enum peer_change_type type
)
2037 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2040 if (type
== peer_change_reset
)
2041 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2042 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2043 else if (type
== peer_change_reset_in
)
2045 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
2046 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
2047 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
2049 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2050 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2052 else if (type
== peer_change_reset_out
)
2053 bgp_announce_route (peer
, afi
, safi
);
2056 struct peer_flag_action
2061 /* This flag can be set for peer-group member. */
2062 u_char not_for_member
;
2064 /* Action when the flag is changed. */
2065 enum peer_change_type type
;
2067 /* Peer down cause */
2071 struct peer_flag_action peer_flag_action_list
[] =
2073 { PEER_FLAG_PASSIVE
, 0, peer_change_reset
},
2074 { PEER_FLAG_SHUTDOWN
, 0, peer_change_reset
},
2075 { PEER_FLAG_DONT_CAPABILITY
, 0, peer_change_none
},
2076 { PEER_FLAG_OVERRIDE_CAPABILITY
, 0, peer_change_none
},
2077 { PEER_FLAG_STRICT_CAP_MATCH
, 0, peer_change_none
},
2078 { PEER_FLAG_NO_ROUTE_REFRESH_CAP
, 0, peer_change_reset
},
2079 { PEER_FLAG_DYNAMIC_CAPABILITY
, 0, peer_change_reset
},
2080 { PEER_FLAG_ENFORCE_MULTIHOP
, 0, peer_change_reset
},
2084 struct peer_flag_action peer_af_flag_action_list
[] =
2086 { PEER_FLAG_NEXTHOP_SELF
, 1, peer_change_reset_out
},
2087 { PEER_FLAG_SEND_COMMUNITY
, 1, peer_change_reset_out
},
2088 { PEER_FLAG_SEND_EXT_COMMUNITY
, 1, peer_change_reset_out
},
2089 { PEER_FLAG_SOFT_RECONFIG
, 0, peer_change_reset_in
},
2090 { PEER_FLAG_REFLECTOR_CLIENT
, 1, peer_change_reset
},
2091 { PEER_FLAG_RSERVER_CLIENT
, 1, peer_change_reset
},
2092 { PEER_FLAG_AS_PATH_UNCHANGED
, 1, peer_change_reset_out
},
2093 { PEER_FLAG_NEXTHOP_UNCHANGED
, 1, peer_change_reset_out
},
2094 { PEER_FLAG_MED_UNCHANGED
, 1, peer_change_reset_out
},
2095 { PEER_FLAG_REMOVE_PRIVATE_AS
, 1, peer_change_reset_out
},
2096 { PEER_FLAG_ALLOWAS_IN
, 0, peer_change_reset_in
},
2097 { PEER_FLAG_ORF_PREFIX_SM
, 1, peer_change_reset
},
2098 { PEER_FLAG_ORF_PREFIX_RM
, 1, peer_change_reset
},
2099 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
, 0, peer_change_reset_out
},
2103 /* Proper action set. */
2105 peer_flag_action_set (struct peer_flag_action
*action_list
, int size
,
2106 struct peer_flag_action
*action
, u_int32_t flag
)
2112 struct peer_flag_action
*match
= NULL
;
2114 /* Check peer's frag action. */
2115 for (i
= 0; i
< size
; i
++)
2117 match
= &action_list
[i
];
2119 if (match
->flag
== 0)
2122 if (match
->flag
& flag
)
2126 if (match
->type
== peer_change_reset_in
)
2128 if (match
->type
== peer_change_reset_out
)
2130 if (match
->type
== peer_change_reset
)
2135 if (match
->not_for_member
)
2136 action
->not_for_member
= 1;
2140 /* Set peer clear type. */
2141 if (reset_in
&& reset_out
)
2142 action
->type
= peer_change_reset
;
2144 action
->type
= peer_change_reset_in
;
2146 action
->type
= peer_change_reset_out
;
2148 action
->type
= peer_change_none
;
2154 peer_flag_modify_action (struct peer
*peer
, u_int32_t flag
)
2156 if (flag
== PEER_FLAG_SHUTDOWN
)
2158 if (CHECK_FLAG (peer
->flags
, flag
))
2160 if (peer
->status
== Established
)
2161 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2162 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
);
2164 BGP_EVENT_ADD (peer
, BGP_Stop
);
2168 peer
->v_start
= BGP_INIT_START_TIMER
;
2169 BGP_EVENT_ADD (peer
, BGP_Stop
);
2172 else if (peer
->status
== Established
)
2174 if (flag
== PEER_FLAG_NO_ROUTE_REFRESH_CAP
2175 && CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
))
2177 if (CHECK_FLAG (peer
->flags
, flag
))
2178 UNSET_FLAG (peer
->cap
, PEER_CAP_REFRESH_ADV
);
2180 SET_FLAG (peer
->cap
, PEER_CAP_REFRESH_ADV
);
2182 bgp_capability_send (peer
, AFI_IP
, SAFI_UNICAST
,
2183 CAPABILITY_CODE_REFRESH
,
2184 CHECK_FLAG (peer
->flags
, flag
) ?
2185 CAPABILITY_ACTION_UNSET
: CAPABILITY_ACTION_SET
);
2189 if (flag
== PEER_FLAG_NO_ROUTE_REFRESH_CAP
)
2190 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2191 else if (flag
== PEER_FLAG_DYNAMIC_CAPABILITY
)
2192 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2193 else if (flag
== PEER_FLAG_PASSIVE
)
2194 peer
->last_reset
= PEER_DOWN_PASSIVE_CHANGE
;
2195 else if (flag
== PEER_FLAG_ENFORCE_MULTIHOP
)
2196 peer
->last_reset
= PEER_DOWN_MULTIHOP_CHANGE
;
2198 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2199 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2203 BGP_EVENT_ADD (peer
, BGP_Stop
);
2206 /* Change specified peer flag. */
2208 peer_flag_modify (struct peer
*peer
, u_int32_t flag
, int set
)
2212 struct peer_group
*group
;
2213 struct listnode
*nn
;
2214 struct peer_flag_action action
;
2216 memset (&action
, 0, sizeof (struct peer_flag_action
));
2217 size
= sizeof peer_flag_action_list
/ sizeof (struct peer_flag_action
);
2219 found
= peer_flag_action_set (peer_flag_action_list
, size
, &action
, flag
);
2221 /* No flag action is found. */
2223 return BGP_ERR_INVALID_FLAG
;
2225 /* Not for peer-group member. */
2226 if (action
.not_for_member
&& peer_group_active (peer
))
2227 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2229 /* When unset the peer-group member's flag we have to check
2230 peer-group configuration. */
2231 if (! set
&& peer_group_active (peer
))
2232 if (CHECK_FLAG (peer
->group
->conf
->flags
, flag
))
2234 if (flag
== PEER_FLAG_SHUTDOWN
)
2235 return BGP_ERR_PEER_GROUP_SHUTDOWN
;
2237 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2240 /* Flag conflict check. */
2242 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_STRICT_CAP_MATCH
)
2243 && CHECK_FLAG (peer
->flags
| flag
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2244 return BGP_ERR_PEER_FLAG_CONFLICT
;
2246 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2248 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2250 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2255 SET_FLAG (peer
->flags
, flag
);
2257 UNSET_FLAG (peer
->flags
, flag
);
2259 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2261 if (action
.type
== peer_change_reset
)
2262 peer_flag_modify_action (peer
, flag
);
2267 /* peer-group member updates. */
2268 group
= peer
->group
;
2270 LIST_LOOP (group
->peer
, peer
, nn
)
2272 if (set
&& CHECK_FLAG (peer
->flags
, flag
) == flag
)
2275 if (! set
&& ! CHECK_FLAG (peer
->flags
, flag
))
2279 SET_FLAG (peer
->flags
, flag
);
2281 UNSET_FLAG (peer
->flags
, flag
);
2283 if (action
.type
== peer_change_reset
)
2284 peer_flag_modify_action (peer
, flag
);
2290 peer_flag_set (struct peer
*peer
, u_int32_t flag
)
2292 return peer_flag_modify (peer
, flag
, 1);
2296 peer_flag_unset (struct peer
*peer
, u_int32_t flag
)
2298 return peer_flag_modify (peer
, flag
, 0);
2302 peer_is_group_member (struct peer
*peer
, afi_t afi
, safi_t safi
)
2304 if (peer
->af_group
[afi
][safi
])
2310 peer_af_flag_modify (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
,
2315 struct listnode
*nn
;
2316 struct peer_group
*group
;
2317 struct peer_flag_action action
;
2319 memset (&action
, 0, sizeof (struct peer_flag_action
));
2320 size
= sizeof peer_af_flag_action_list
/ sizeof (struct peer_flag_action
);
2322 found
= peer_flag_action_set (peer_af_flag_action_list
, size
, &action
, flag
);
2324 /* No flag action is found. */
2326 return BGP_ERR_INVALID_FLAG
;
2328 /* Adress family must be activated. */
2329 if (! peer
->afc
[afi
][safi
])
2330 return BGP_ERR_PEER_INACTIVE
;
2332 /* Not for peer-group member. */
2333 if (action
.not_for_member
&& peer_is_group_member (peer
, afi
, safi
))
2334 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2336 /* Spcecial check for reflector client. */
2337 if (flag
& PEER_FLAG_REFLECTOR_CLIENT
2338 && peer_sort (peer
) != BGP_PEER_IBGP
)
2339 return BGP_ERR_NOT_INTERNAL_PEER
;
2341 /* Spcecial check for remove-private-AS. */
2342 if (flag
& PEER_FLAG_REMOVE_PRIVATE_AS
2343 && peer_sort (peer
) == BGP_PEER_IBGP
)
2344 return BGP_ERR_REMOVE_PRIVATE_AS
;
2346 /* When unset the peer-group member's flag we have to check
2347 peer-group configuration. */
2348 if (! set
&& peer
->af_group
[afi
][safi
])
2349 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
], flag
))
2350 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG
;
2352 /* When current flag configuration is same as requested one. */
2353 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2355 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2357 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2362 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2364 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2366 /* Execute action when peer is established. */
2367 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2368 && peer
->status
== Established
)
2370 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2371 bgp_clear_adj_in (peer
, afi
, safi
);
2374 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2375 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2376 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2377 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2378 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2379 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2380 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2381 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2383 peer_change_action (peer
, afi
, safi
, action
.type
);
2388 /* Peer group member updates. */
2389 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2391 group
= peer
->group
;
2393 LIST_LOOP (group
->peer
, peer
, nn
)
2395 if (! peer
->af_group
[afi
][safi
])
2398 if (set
&& CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
) == flag
)
2401 if (! set
&& ! CHECK_FLAG (peer
->af_flags
[afi
][safi
], flag
))
2405 SET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2407 UNSET_FLAG (peer
->af_flags
[afi
][safi
], flag
);
2409 if (peer
->status
== Established
)
2411 if (! set
&& flag
== PEER_FLAG_SOFT_RECONFIG
)
2412 bgp_clear_adj_in (peer
, afi
, safi
);
2415 if (flag
== PEER_FLAG_REFLECTOR_CLIENT
)
2416 peer
->last_reset
= PEER_DOWN_RR_CLIENT_CHANGE
;
2417 else if (flag
== PEER_FLAG_RSERVER_CLIENT
)
2418 peer
->last_reset
= PEER_DOWN_RS_CLIENT_CHANGE
;
2419 else if (flag
== PEER_FLAG_ORF_PREFIX_SM
)
2420 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2421 else if (flag
== PEER_FLAG_ORF_PREFIX_RM
)
2422 peer
->last_reset
= PEER_DOWN_CAPABILITY_CHANGE
;
2424 peer_change_action (peer
, afi
, safi
, action
.type
);
2433 peer_af_flag_set (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2435 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 1);
2439 peer_af_flag_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, u_int32_t flag
)
2441 return peer_af_flag_modify (peer
, afi
, safi
, flag
, 0);
2444 /* EBGP multihop configuration. */
2446 peer_ebgp_multihop_set (struct peer
*peer
, int ttl
)
2448 struct peer_group
*group
;
2449 struct listnode
*nn
;
2451 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2456 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2458 if (peer
->fd
>= 0 && peer_sort (peer
) != BGP_PEER_IBGP
)
2459 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2463 group
= peer
->group
;
2464 LIST_LOOP (group
->peer
, peer
, nn
)
2466 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2469 peer
->ttl
= group
->conf
->ttl
;
2472 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2479 peer_ebgp_multihop_unset (struct peer
*peer
)
2481 struct peer_group
*group
;
2482 struct listnode
*nn
;
2484 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2487 if (peer_group_active (peer
))
2488 peer
->ttl
= peer
->group
->conf
->ttl
;
2492 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2494 if (peer
->fd
>= 0 && peer_sort (peer
) != BGP_PEER_IBGP
)
2495 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2499 group
= peer
->group
;
2500 LIST_LOOP (group
->peer
, peer
, nn
)
2502 if (peer_sort (peer
) == BGP_PEER_IBGP
)
2508 sockopt_ttl (peer
->su
.sa
.sa_family
, peer
->fd
, peer
->ttl
);
2514 /* Neighbor description. */
2516 peer_description_set (struct peer
*peer
, char *desc
)
2519 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2521 peer
->desc
= XSTRDUP (MTYPE_PEER_DESC
, desc
);
2527 peer_description_unset (struct peer
*peer
)
2530 XFREE (MTYPE_PEER_DESC
, peer
->desc
);
2537 /* Neighbor update-source. */
2539 peer_update_source_if_set (struct peer
*peer
, const char *ifname
)
2541 struct peer_group
*group
;
2542 struct listnode
*nn
;
2544 if (peer
->update_if
)
2546 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2547 && strcmp (peer
->update_if
, ifname
) == 0)
2550 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2551 peer
->update_if
= NULL
;
2554 if (peer
->update_source
)
2556 sockunion_free (peer
->update_source
);
2557 peer
->update_source
= NULL
;
2560 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2562 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2564 if (peer
->status
== Established
)
2566 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2567 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2568 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2571 BGP_EVENT_ADD (peer
, BGP_Stop
);
2575 /* peer-group member updates. */
2576 group
= peer
->group
;
2577 LIST_LOOP (group
->peer
, peer
, nn
)
2579 if (peer
->update_if
)
2581 if (strcmp (peer
->update_if
, ifname
) == 0)
2584 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2585 peer
->update_if
= NULL
;
2588 if (peer
->update_source
)
2590 sockunion_free (peer
->update_source
);
2591 peer
->update_source
= NULL
;
2594 peer
->update_if
= XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, ifname
);
2596 if (peer
->status
== Established
)
2598 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2599 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2600 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2603 BGP_EVENT_ADD (peer
, BGP_Stop
);
2609 peer_update_source_addr_set (struct peer
*peer
, union sockunion
*su
)
2611 struct peer_group
*group
;
2612 struct listnode
*nn
;
2614 if (peer
->update_source
)
2616 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2617 && sockunion_cmp (peer
->update_source
, su
) == 0)
2619 sockunion_free (peer
->update_source
);
2620 peer
->update_source
= NULL
;
2623 if (peer
->update_if
)
2625 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2626 peer
->update_if
= NULL
;
2629 peer
->update_source
= sockunion_dup (su
);
2631 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2633 if (peer
->status
== Established
)
2635 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2636 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2637 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2640 BGP_EVENT_ADD (peer
, BGP_Stop
);
2644 /* peer-group member updates. */
2645 group
= peer
->group
;
2646 LIST_LOOP (group
->peer
, peer
, nn
)
2648 if (peer
->update_source
)
2650 if (sockunion_cmp (peer
->update_source
, su
) == 0)
2652 sockunion_free (peer
->update_source
);
2653 peer
->update_source
= NULL
;
2656 if (peer
->update_if
)
2658 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2659 peer
->update_if
= NULL
;
2662 peer
->update_source
= sockunion_dup (su
);
2664 if (peer
->status
== Established
)
2666 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2667 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2668 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2671 BGP_EVENT_ADD (peer
, BGP_Stop
);
2677 peer_update_source_unset (struct peer
*peer
)
2679 union sockunion
*su
;
2680 struct peer_group
*group
;
2681 struct listnode
*nn
;
2683 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
)
2684 && ! peer
->update_source
2685 && ! peer
->update_if
)
2688 if (peer
->update_source
)
2690 sockunion_free (peer
->update_source
);
2691 peer
->update_source
= NULL
;
2693 if (peer
->update_if
)
2695 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2696 peer
->update_if
= NULL
;
2699 if (peer_group_active (peer
))
2701 group
= peer
->group
;
2703 if (group
->conf
->update_source
)
2705 su
= sockunion_dup (group
->conf
->update_source
);
2706 peer
->update_source
= su
;
2708 else if (group
->conf
->update_if
)
2710 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE
, group
->conf
->update_if
);
2713 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2715 if (peer
->status
== Established
)
2717 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2718 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2719 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2722 BGP_EVENT_ADD (peer
, BGP_Stop
);
2726 /* peer-group member updates. */
2727 group
= peer
->group
;
2728 LIST_LOOP (group
->peer
, peer
, nn
)
2730 if (! peer
->update_source
&& ! peer
->update_if
)
2733 if (peer
->update_source
)
2735 sockunion_free (peer
->update_source
);
2736 peer
->update_source
= NULL
;
2739 if (peer
->update_if
)
2741 XFREE (MTYPE_PEER_UPDATE_SOURCE
, peer
->update_if
);
2742 peer
->update_if
= NULL
;
2745 if (peer
->status
== Established
)
2747 peer
->last_reset
= PEER_DOWN_UPDATE_SOURCE_CHANGE
;
2748 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2749 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2752 BGP_EVENT_ADD (peer
, BGP_Stop
);
2758 peer_default_originate_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
2761 struct peer_group
*group
;
2762 struct listnode
*nn
;
2764 /* Adress family must be activated. */
2765 if (! peer
->afc
[afi
][safi
])
2766 return BGP_ERR_PEER_INACTIVE
;
2768 /* Default originate can't be used for peer group memeber. */
2769 if (peer_is_group_member (peer
, afi
, safi
))
2770 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2772 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
)
2773 || (rmap
&& ! peer
->default_rmap
[afi
][safi
].name
)
2774 || (rmap
&& strcmp (rmap
, peer
->default_rmap
[afi
][safi
].name
) != 0))
2776 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2780 if (peer
->default_rmap
[afi
][safi
].name
)
2781 free (peer
->default_rmap
[afi
][safi
].name
);
2782 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
2783 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
2787 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2789 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2790 bgp_default_originate (peer
, afi
, safi
, 0);
2794 /* peer-group member updates. */
2795 group
= peer
->group
;
2796 LIST_LOOP (group
->peer
, peer
, nn
)
2798 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2802 if (peer
->default_rmap
[afi
][safi
].name
)
2803 free (peer
->default_rmap
[afi
][safi
].name
);
2804 peer
->default_rmap
[afi
][safi
].name
= strdup (rmap
);
2805 peer
->default_rmap
[afi
][safi
].map
= route_map_lookup_by_name (rmap
);
2808 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2809 bgp_default_originate (peer
, afi
, safi
, 0);
2815 peer_default_originate_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
2817 struct peer_group
*group
;
2818 struct listnode
*nn
;
2820 /* Adress family must be activated. */
2821 if (! peer
->afc
[afi
][safi
])
2822 return BGP_ERR_PEER_INACTIVE
;
2824 /* Default originate can't be used for peer group memeber. */
2825 if (peer_is_group_member (peer
, afi
, safi
))
2826 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2828 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
2830 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2832 if (peer
->default_rmap
[afi
][safi
].name
)
2833 free (peer
->default_rmap
[afi
][safi
].name
);
2834 peer
->default_rmap
[afi
][safi
].name
= NULL
;
2835 peer
->default_rmap
[afi
][safi
].map
= NULL
;
2838 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2840 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2841 bgp_default_originate (peer
, afi
, safi
, 1);
2845 /* peer-group member updates. */
2846 group
= peer
->group
;
2847 LIST_LOOP (group
->peer
, peer
, nn
)
2849 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
);
2851 if (peer
->default_rmap
[afi
][safi
].name
)
2852 free (peer
->default_rmap
[afi
][safi
].name
);
2853 peer
->default_rmap
[afi
][safi
].name
= NULL
;
2854 peer
->default_rmap
[afi
][safi
].map
= NULL
;
2856 if (peer
->status
== Established
&& peer
->afc_nego
[afi
][safi
])
2857 bgp_default_originate (peer
, afi
, safi
, 1);
2863 peer_port_set (struct peer
*peer
, u_int16_t port
)
2870 peer_port_unset (struct peer
*peer
)
2872 peer
->port
= BGP_PORT_DEFAULT
;
2876 /* neighbor weight. */
2878 peer_weight_set (struct peer
*peer
, u_int16_t weight
)
2880 struct peer_group
*group
;
2881 struct listnode
*nn
;
2883 SET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
2884 peer
->weight
= weight
;
2886 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2889 /* peer-group member updates. */
2890 group
= peer
->group
;
2891 LIST_LOOP (group
->peer
, peer
, nn
)
2893 peer
->weight
= group
->conf
->weight
;
2899 peer_weight_unset (struct peer
*peer
)
2901 struct peer_group
*group
;
2902 struct listnode
*nn
;
2904 /* Set default weight. */
2905 if (peer_group_active (peer
))
2906 peer
->weight
= peer
->group
->conf
->weight
;
2910 UNSET_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
);
2912 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2915 /* peer-group member updates. */
2916 group
= peer
->group
;
2917 LIST_LOOP (group
->peer
, peer
, nn
)
2925 peer_timers_set (struct peer
*peer
, u_int32_t keepalive
, u_int32_t holdtime
)
2927 struct peer_group
*group
;
2928 struct listnode
*nn
;
2930 /* Not for peer group memeber. */
2931 if (peer_group_active (peer
))
2932 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2934 /* keepalive value check. */
2935 if (keepalive
> 65535)
2936 return BGP_ERR_INVALID_VALUE
;
2938 /* Holdtime value check. */
2939 if (holdtime
> 65535)
2940 return BGP_ERR_INVALID_VALUE
;
2942 /* Holdtime value must be either 0 or greater than 3. */
2943 if (holdtime
< 3 && holdtime
!= 0)
2944 return BGP_ERR_INVALID_VALUE
;
2946 /* Set value to the configuration. */
2947 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2948 peer
->holdtime
= holdtime
;
2949 peer
->keepalive
= (keepalive
< holdtime
/ 3 ? keepalive
: holdtime
/ 3);
2951 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2954 /* peer-group member updates. */
2955 group
= peer
->group
;
2956 LIST_LOOP (group
->peer
, peer
, nn
)
2958 SET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2959 peer
->holdtime
= group
->conf
->holdtime
;
2960 peer
->keepalive
= group
->conf
->keepalive
;
2966 peer_timers_unset (struct peer
*peer
)
2968 struct peer_group
*group
;
2969 struct listnode
*nn
;
2971 if (peer_group_active (peer
))
2972 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
2974 /* Clear configuration. */
2975 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2976 peer
->keepalive
= 0;
2979 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
2982 /* peer-group member updates. */
2983 group
= peer
->group
;
2984 LIST_LOOP (group
->peer
, peer
, nn
)
2986 UNSET_FLAG (peer
->config
, PEER_CONFIG_TIMER
);
2988 peer
->keepalive
= 0;
2995 peer_timers_connect_set (struct peer
*peer
, u_int32_t connect
)
2997 if (peer_group_active (peer
))
2998 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3000 if (connect
> 65535)
3001 return BGP_ERR_INVALID_VALUE
;
3003 /* Set value to the configuration. */
3004 SET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3005 peer
->connect
= connect
;
3007 /* Set value to timer setting. */
3008 peer
->v_connect
= connect
;
3014 peer_timers_connect_unset (struct peer
*peer
)
3016 if (peer_group_active (peer
))
3017 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3019 /* Clear configuration. */
3020 UNSET_FLAG (peer
->config
, PEER_CONFIG_CONNECT
);
3023 /* Set timer setting to default value. */
3024 peer
->v_connect
= BGP_DEFAULT_CONNECT_RETRY
;
3030 peer_advertise_interval_set (struct peer
*peer
, u_int32_t routeadv
)
3032 if (peer_group_active (peer
))
3033 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3036 return BGP_ERR_INVALID_VALUE
;
3038 SET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3039 peer
->routeadv
= routeadv
;
3040 peer
->v_routeadv
= routeadv
;
3046 peer_advertise_interval_unset (struct peer
*peer
)
3048 if (peer_group_active (peer
))
3049 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3051 UNSET_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
);
3054 if (peer_sort (peer
) == BGP_PEER_IBGP
)
3055 peer
->v_routeadv
= BGP_DEFAULT_IBGP_ROUTEADV
;
3057 peer
->v_routeadv
= BGP_DEFAULT_EBGP_ROUTEADV
;
3063 peer_version_set (struct peer
*peer
, int version
)
3065 if (version
!= BGP_VERSION_4
&& version
!= BGP_VERSION_MP_4_DRAFT_00
)
3066 return BGP_ERR_INVALID_VALUE
;
3068 peer
->version
= version
;
3074 peer_version_unset (struct peer
*peer
)
3076 peer
->version
= BGP_VERSION_4
;
3080 /* neighbor interface */
3082 peer_interface_set (struct peer
*peer
, const char *str
)
3085 free (peer
->ifname
);
3086 peer
->ifname
= strdup (str
);
3092 peer_interface_unset (struct peer
*peer
)
3095 free (peer
->ifname
);
3096 peer
->ifname
= NULL
;
3103 peer_allowas_in_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int allow_num
)
3105 struct peer_group
*group
;
3106 struct listnode
*nn
;
3108 if (allow_num
< 1 || allow_num
> 10)
3109 return BGP_ERR_INVALID_VALUE
;
3111 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3113 peer
->allowas_in
[afi
][safi
] = allow_num
;
3114 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3115 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3118 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3121 group
= peer
->group
;
3122 LIST_LOOP (group
->peer
, peer
, nn
)
3124 if (peer
->allowas_in
[afi
][safi
] != allow_num
)
3126 peer
->allowas_in
[afi
][safi
] = allow_num
;
3127 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
);
3128 peer_change_action (peer
, afi
, safi
, peer_change_reset_in
);
3136 peer_allowas_in_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3138 struct peer_group
*group
;
3139 struct listnode
*nn
;
3141 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3143 peer
->allowas_in
[afi
][safi
] = 0;
3144 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3147 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3150 group
= peer
->group
;
3151 LIST_LOOP (group
->peer
, peer
, nn
)
3153 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ALLOWAS_IN
))
3155 peer
->allowas_in
[afi
][safi
] = 0;
3156 peer_af_flag_unset (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
);
3163 peer_local_as_set (struct peer
*peer
, as_t as
, int no_prepend
)
3165 struct bgp
*bgp
= peer
->bgp
;
3166 struct peer_group
*group
;
3167 struct listnode
*nn
;
3169 if (peer_sort (peer
) != BGP_PEER_EBGP
3170 && peer_sort (peer
) != BGP_PEER_INTERNAL
)
3171 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
;
3174 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
;
3176 if (peer_group_active (peer
))
3177 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3179 if (peer
->change_local_as
== as
&&
3180 ((CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && no_prepend
)
3181 || (! CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) && ! no_prepend
)))
3184 peer
->change_local_as
= as
;
3186 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3188 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3190 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3192 if (peer
->status
== Established
)
3194 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3195 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3196 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3199 BGP_EVENT_ADD (peer
, BGP_Stop
);
3204 group
= peer
->group
;
3205 LIST_LOOP (group
->peer
, peer
, nn
)
3207 peer
->change_local_as
= as
;
3209 SET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3211 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3213 if (peer
->status
== Established
)
3215 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3216 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3217 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3220 BGP_EVENT_ADD (peer
, BGP_Stop
);
3227 peer_local_as_unset (struct peer
*peer
)
3229 struct peer_group
*group
;
3230 struct listnode
*nn
;
3232 if (peer_group_active (peer
))
3233 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3235 if (! peer
->change_local_as
)
3238 peer
->change_local_as
= 0;
3239 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3241 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3243 if (peer
->status
== Established
)
3245 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3246 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3247 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3250 BGP_EVENT_ADD (peer
, BGP_Stop
);
3255 group
= peer
->group
;
3256 LIST_LOOP (group
->peer
, peer
, nn
)
3258 peer
->change_local_as
= 0;
3259 UNSET_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
);
3261 if (peer
->status
== Established
)
3263 peer
->last_reset
= PEER_DOWN_LOCAL_AS_CHANGE
;
3264 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
3265 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3268 BGP_EVENT_ADD (peer
, BGP_Stop
);
3273 /* Set distribute list to the peer. */
3275 peer_distribute_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3278 struct bgp_filter
*filter
;
3279 struct peer_group
*group
;
3280 struct listnode
*nn
;
3282 if (! peer
->afc
[afi
][safi
])
3283 return BGP_ERR_PEER_INACTIVE
;
3285 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3286 return BGP_ERR_INVALID_VALUE
;
3288 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3289 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3291 filter
= &peer
->filter
[afi
][safi
];
3293 if (filter
->plist
[direct
].name
)
3294 return BGP_ERR_PEER_FILTER_CONFLICT
;
3296 if (filter
->dlist
[direct
].name
)
3297 free (filter
->dlist
[direct
].name
);
3298 filter
->dlist
[direct
].name
= strdup (name
);
3299 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3301 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3304 group
= peer
->group
;
3305 LIST_LOOP (group
->peer
, peer
, nn
)
3307 filter
= &peer
->filter
[afi
][safi
];
3309 if (! peer
->af_group
[afi
][safi
])
3312 if (filter
->dlist
[direct
].name
)
3313 free (filter
->dlist
[direct
].name
);
3314 filter
->dlist
[direct
].name
= strdup (name
);
3315 filter
->dlist
[direct
].alist
= access_list_lookup (afi
, name
);
3322 peer_distribute_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3324 struct bgp_filter
*filter
;
3325 struct bgp_filter
*gfilter
;
3326 struct peer_group
*group
;
3327 struct listnode
*nn
;
3329 if (! peer
->afc
[afi
][safi
])
3330 return BGP_ERR_PEER_INACTIVE
;
3332 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3333 return BGP_ERR_INVALID_VALUE
;
3335 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3336 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3338 filter
= &peer
->filter
[afi
][safi
];
3340 /* apply peer-group filter */
3341 if (peer
->af_group
[afi
][safi
])
3343 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3345 if (gfilter
->dlist
[direct
].name
)
3347 if (filter
->dlist
[direct
].name
)
3348 free (filter
->dlist
[direct
].name
);
3349 filter
->dlist
[direct
].name
= strdup (gfilter
->dlist
[direct
].name
);
3350 filter
->dlist
[direct
].alist
= gfilter
->dlist
[direct
].alist
;
3355 if (filter
->dlist
[direct
].name
)
3356 free (filter
->dlist
[direct
].name
);
3357 filter
->dlist
[direct
].name
= NULL
;
3358 filter
->dlist
[direct
].alist
= NULL
;
3360 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3363 group
= peer
->group
;
3364 LIST_LOOP (group
->peer
, peer
, nn
)
3366 filter
= &peer
->filter
[afi
][safi
];
3368 if (! peer
->af_group
[afi
][safi
])
3371 if (filter
->dlist
[direct
].name
)
3372 free (filter
->dlist
[direct
].name
);
3373 filter
->dlist
[direct
].name
= NULL
;
3374 filter
->dlist
[direct
].alist
= NULL
;
3380 /* Update distribute list. */
3382 peer_distribute_update (struct access_list
*access
)
3387 struct listnode
*nn
, *nm
;
3390 struct peer_group
*group
;
3391 struct bgp_filter
*filter
;
3393 LIST_LOOP (bm
->bgp
, bgp
, nn
)
3395 LIST_LOOP (bgp
->peer
, peer
, nm
)
3397 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3398 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3400 filter
= &peer
->filter
[afi
][safi
];
3402 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3404 if (filter
->dlist
[direct
].name
)
3405 filter
->dlist
[direct
].alist
=
3406 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3408 filter
->dlist
[direct
].alist
= NULL
;
3412 LIST_LOOP (bgp
->group
, group
, nm
)
3414 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3415 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3417 filter
= &group
->conf
->filter
[afi
][safi
];
3419 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3421 if (filter
->dlist
[direct
].name
)
3422 filter
->dlist
[direct
].alist
=
3423 access_list_lookup (afi
, filter
->dlist
[direct
].name
);
3425 filter
->dlist
[direct
].alist
= NULL
;
3432 /* Set prefix list to the peer. */
3434 peer_prefix_list_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3437 struct bgp_filter
*filter
;
3438 struct peer_group
*group
;
3439 struct listnode
*nn
;
3441 if (! peer
->afc
[afi
][safi
])
3442 return BGP_ERR_PEER_INACTIVE
;
3444 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3445 return BGP_ERR_INVALID_VALUE
;
3447 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3448 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3450 filter
= &peer
->filter
[afi
][safi
];
3452 if (filter
->dlist
[direct
].name
)
3453 return BGP_ERR_PEER_FILTER_CONFLICT
;
3455 if (filter
->plist
[direct
].name
)
3456 free (filter
->plist
[direct
].name
);
3457 filter
->plist
[direct
].name
= strdup (name
);
3458 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3460 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3463 group
= peer
->group
;
3464 LIST_LOOP (group
->peer
, peer
, nn
)
3466 filter
= &peer
->filter
[afi
][safi
];
3468 if (! peer
->af_group
[afi
][safi
])
3471 if (filter
->plist
[direct
].name
)
3472 free (filter
->plist
[direct
].name
);
3473 filter
->plist
[direct
].name
= strdup (name
);
3474 filter
->plist
[direct
].plist
= prefix_list_lookup (afi
, name
);
3480 peer_prefix_list_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3482 struct bgp_filter
*filter
;
3483 struct bgp_filter
*gfilter
;
3484 struct peer_group
*group
;
3485 struct listnode
*nn
;
3487 if (! peer
->afc
[afi
][safi
])
3488 return BGP_ERR_PEER_INACTIVE
;
3490 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3491 return BGP_ERR_INVALID_VALUE
;
3493 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3494 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3496 filter
= &peer
->filter
[afi
][safi
];
3498 /* apply peer-group filter */
3499 if (peer
->af_group
[afi
][safi
])
3501 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3503 if (gfilter
->plist
[direct
].name
)
3505 if (filter
->plist
[direct
].name
)
3506 free (filter
->plist
[direct
].name
);
3507 filter
->plist
[direct
].name
= strdup (gfilter
->plist
[direct
].name
);
3508 filter
->plist
[direct
].plist
= gfilter
->plist
[direct
].plist
;
3513 if (filter
->plist
[direct
].name
)
3514 free (filter
->plist
[direct
].name
);
3515 filter
->plist
[direct
].name
= NULL
;
3516 filter
->plist
[direct
].plist
= NULL
;
3518 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3521 group
= peer
->group
;
3522 LIST_LOOP (group
->peer
, peer
, nn
)
3524 filter
= &peer
->filter
[afi
][safi
];
3526 if (! peer
->af_group
[afi
][safi
])
3529 if (filter
->plist
[direct
].name
)
3530 free (filter
->plist
[direct
].name
);
3531 filter
->plist
[direct
].name
= NULL
;
3532 filter
->plist
[direct
].plist
= NULL
;
3538 /* Update prefix-list list. */
3540 peer_prefix_list_update (struct prefix_list
*plist
)
3542 struct listnode
*nn
, *nm
;
3545 struct peer_group
*group
;
3546 struct bgp_filter
*filter
;
3551 LIST_LOOP (bm
->bgp
, bgp
, nn
)
3553 LIST_LOOP (bgp
->peer
, peer
, nm
)
3555 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3556 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3558 filter
= &peer
->filter
[afi
][safi
];
3560 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3562 if (filter
->plist
[direct
].name
)
3563 filter
->plist
[direct
].plist
=
3564 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3566 filter
->plist
[direct
].plist
= NULL
;
3570 LIST_LOOP (bgp
->group
, group
, nm
)
3572 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3573 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3575 filter
= &group
->conf
->filter
[afi
][safi
];
3577 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3579 if (filter
->plist
[direct
].name
)
3580 filter
->plist
[direct
].plist
=
3581 prefix_list_lookup (afi
, filter
->plist
[direct
].name
);
3583 filter
->plist
[direct
].plist
= NULL
;
3591 peer_aslist_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3594 struct bgp_filter
*filter
;
3595 struct peer_group
*group
;
3596 struct listnode
*nn
;
3598 if (! peer
->afc
[afi
][safi
])
3599 return BGP_ERR_PEER_INACTIVE
;
3601 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3602 return BGP_ERR_INVALID_VALUE
;
3604 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3605 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3607 filter
= &peer
->filter
[afi
][safi
];
3609 if (filter
->aslist
[direct
].name
)
3610 free (filter
->aslist
[direct
].name
);
3611 filter
->aslist
[direct
].name
= strdup (name
);
3612 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
3614 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3617 group
= peer
->group
;
3618 LIST_LOOP (group
->peer
, peer
, nn
)
3620 filter
= &peer
->filter
[afi
][safi
];
3622 if (! peer
->af_group
[afi
][safi
])
3625 if (filter
->aslist
[direct
].name
)
3626 free (filter
->aslist
[direct
].name
);
3627 filter
->aslist
[direct
].name
= strdup (name
);
3628 filter
->aslist
[direct
].aslist
= as_list_lookup (name
);
3634 peer_aslist_unset (struct peer
*peer
,afi_t afi
, safi_t safi
, int direct
)
3636 struct bgp_filter
*filter
;
3637 struct bgp_filter
*gfilter
;
3638 struct peer_group
*group
;
3639 struct listnode
*nn
;
3641 if (! peer
->afc
[afi
][safi
])
3642 return BGP_ERR_PEER_INACTIVE
;
3644 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
3645 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
3646 return BGP_ERR_INVALID_VALUE
;
3648 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
3649 && peer_is_group_member (peer
, afi
, safi
))
3650 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3652 filter
= &peer
->filter
[afi
][safi
];
3654 /* apply peer-group filter */
3655 if (peer
->af_group
[afi
][safi
])
3657 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3659 if (gfilter
->aslist
[direct
].name
)
3661 if (filter
->aslist
[direct
].name
)
3662 free (filter
->aslist
[direct
].name
);
3663 filter
->aslist
[direct
].name
= strdup (gfilter
->aslist
[direct
].name
);
3664 filter
->aslist
[direct
].aslist
= gfilter
->aslist
[direct
].aslist
;
3669 if (filter
->aslist
[direct
].name
)
3670 free (filter
->aslist
[direct
].name
);
3671 filter
->aslist
[direct
].name
= NULL
;
3672 filter
->aslist
[direct
].aslist
= NULL
;
3674 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3677 group
= peer
->group
;
3678 LIST_LOOP (group
->peer
, peer
, nn
)
3680 filter
= &peer
->filter
[afi
][safi
];
3682 if (! peer
->af_group
[afi
][safi
])
3685 if (filter
->aslist
[direct
].name
)
3686 free (filter
->aslist
[direct
].name
);
3687 filter
->aslist
[direct
].name
= NULL
;
3688 filter
->aslist
[direct
].aslist
= NULL
;
3695 peer_aslist_update ()
3700 struct listnode
*nn
, *nm
;
3703 struct peer_group
*group
;
3704 struct bgp_filter
*filter
;
3706 LIST_LOOP (bm
->bgp
, bgp
, nn
)
3708 LIST_LOOP (bgp
->peer
, peer
, nm
)
3710 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3711 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3713 filter
= &peer
->filter
[afi
][safi
];
3715 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3717 if (filter
->aslist
[direct
].name
)
3718 filter
->aslist
[direct
].aslist
=
3719 as_list_lookup (filter
->aslist
[direct
].name
);
3721 filter
->aslist
[direct
].aslist
= NULL
;
3725 LIST_LOOP (bgp
->group
, group
, nm
)
3727 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
3728 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
3730 filter
= &group
->conf
->filter
[afi
][safi
];
3732 for (direct
= FILTER_IN
; direct
< FILTER_MAX
; direct
++)
3734 if (filter
->aslist
[direct
].name
)
3735 filter
->aslist
[direct
].aslist
=
3736 as_list_lookup (filter
->aslist
[direct
].name
);
3738 filter
->aslist
[direct
].aslist
= NULL
;
3745 /* Set route-map to the peer. */
3747 peer_route_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
,
3750 struct bgp_filter
*filter
;
3751 struct peer_group
*group
;
3752 struct listnode
*nn
;
3754 if (! peer
->afc
[afi
][safi
])
3755 return BGP_ERR_PEER_INACTIVE
;
3757 if (direct
!= RMAP_IN
&& direct
!= RMAP_OUT
&&
3758 direct
!= RMAP_IMPORT
&& direct
!= RMAP_EXPORT
)
3759 return BGP_ERR_INVALID_VALUE
;
3761 if ( (direct
== RMAP_OUT
|| direct
== RMAP_IMPORT
)
3762 && peer_is_group_member (peer
, afi
, safi
))
3763 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3765 filter
= &peer
->filter
[afi
][safi
];
3767 if (filter
->map
[direct
].name
)
3768 free (filter
->map
[direct
].name
);
3770 filter
->map
[direct
].name
= strdup (name
);
3771 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
3773 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3776 group
= peer
->group
;
3777 LIST_LOOP (group
->peer
, peer
, nn
)
3779 filter
= &peer
->filter
[afi
][safi
];
3781 if (! peer
->af_group
[afi
][safi
])
3784 if (filter
->map
[direct
].name
)
3785 free (filter
->map
[direct
].name
);
3786 filter
->map
[direct
].name
= strdup (name
);
3787 filter
->map
[direct
].map
= route_map_lookup_by_name (name
);
3792 /* Unset route-map from the peer. */
3794 peer_route_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
, int direct
)
3796 struct bgp_filter
*filter
;
3797 struct bgp_filter
*gfilter
;
3798 struct peer_group
*group
;
3799 struct listnode
*nn
;
3801 if (! peer
->afc
[afi
][safi
])
3802 return BGP_ERR_PEER_INACTIVE
;
3804 if (direct
!= FILTER_IN
&& direct
!= FILTER_OUT
)
3805 return BGP_ERR_INVALID_VALUE
;
3807 if (direct
== FILTER_OUT
&& peer_is_group_member (peer
, afi
, safi
))
3808 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3810 filter
= &peer
->filter
[afi
][safi
];
3812 /* apply peer-group filter */
3813 if (peer
->af_group
[afi
][safi
])
3815 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
3817 if (gfilter
->map
[direct
].name
)
3819 if (filter
->map
[direct
].name
)
3820 free (filter
->map
[direct
].name
);
3821 filter
->map
[direct
].name
= strdup (gfilter
->map
[direct
].name
);
3822 filter
->map
[direct
].map
= gfilter
->map
[direct
].map
;
3827 if (filter
->map
[direct
].name
)
3828 free (filter
->map
[direct
].name
);
3829 filter
->map
[direct
].name
= NULL
;
3830 filter
->map
[direct
].map
= NULL
;
3832 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3835 group
= peer
->group
;
3836 LIST_LOOP (group
->peer
, peer
, nn
)
3838 filter
= &peer
->filter
[afi
][safi
];
3840 if (! peer
->af_group
[afi
][safi
])
3843 if (filter
->map
[direct
].name
)
3844 free (filter
->map
[direct
].name
);
3845 filter
->map
[direct
].name
= NULL
;
3846 filter
->map
[direct
].map
= NULL
;
3851 /* Set unsuppress-map to the peer. */
3853 peer_unsuppress_map_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3856 struct bgp_filter
*filter
;
3857 struct peer_group
*group
;
3858 struct listnode
*nn
;
3860 if (! peer
->afc
[afi
][safi
])
3861 return BGP_ERR_PEER_INACTIVE
;
3863 if (peer_is_group_member (peer
, afi
, safi
))
3864 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3866 filter
= &peer
->filter
[afi
][safi
];
3868 if (filter
->usmap
.name
)
3869 free (filter
->usmap
.name
);
3871 filter
->usmap
.name
= strdup (name
);
3872 filter
->usmap
.map
= route_map_lookup_by_name (name
);
3874 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3877 group
= peer
->group
;
3878 LIST_LOOP (group
->peer
, peer
, nn
)
3880 filter
= &peer
->filter
[afi
][safi
];
3882 if (! peer
->af_group
[afi
][safi
])
3885 if (filter
->usmap
.name
)
3886 free (filter
->usmap
.name
);
3887 filter
->usmap
.name
= strdup (name
);
3888 filter
->usmap
.map
= route_map_lookup_by_name (name
);
3893 /* Unset route-map from the peer. */
3895 peer_unsuppress_map_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3897 struct bgp_filter
*filter
;
3898 struct peer_group
*group
;
3899 struct listnode
*nn
;
3901 if (! peer
->afc
[afi
][safi
])
3902 return BGP_ERR_PEER_INACTIVE
;
3904 if (peer_is_group_member (peer
, afi
, safi
))
3905 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER
;
3907 filter
= &peer
->filter
[afi
][safi
];
3909 if (filter
->usmap
.name
)
3910 free (filter
->usmap
.name
);
3911 filter
->usmap
.name
= NULL
;
3912 filter
->usmap
.map
= NULL
;
3914 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3917 group
= peer
->group
;
3918 LIST_LOOP (group
->peer
, peer
, nn
)
3920 filter
= &peer
->filter
[afi
][safi
];
3922 if (! peer
->af_group
[afi
][safi
])
3925 if (filter
->usmap
.name
)
3926 free (filter
->usmap
.name
);
3927 filter
->usmap
.name
= NULL
;
3928 filter
->usmap
.map
= NULL
;
3934 peer_maximum_prefix_set (struct peer
*peer
, afi_t afi
, safi_t safi
,
3935 u_int32_t max
, u_char threshold
, int warning
)
3937 struct peer_group
*group
;
3938 struct listnode
*nn
;
3940 if (! peer
->afc
[afi
][safi
])
3941 return BGP_ERR_PEER_INACTIVE
;
3943 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3944 peer
->pmax
[afi
][safi
] = max
;
3945 peer
->pmax_threshold
[afi
][safi
] = threshold
;
3947 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3949 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3951 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
3954 group
= peer
->group
;
3955 LIST_LOOP (group
->peer
, peer
, nn
)
3957 if (! peer
->af_group
[afi
][safi
])
3960 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3961 peer
->pmax
[afi
][safi
] = max
;
3962 peer
->pmax_threshold
[afi
][safi
] = threshold
;
3964 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3966 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3972 peer_maximum_prefix_unset (struct peer
*peer
, afi_t afi
, safi_t safi
)
3974 struct peer_group
*group
;
3975 struct listnode
*nn
;
3977 if (! peer
->afc
[afi
][safi
])
3978 return BGP_ERR_PEER_INACTIVE
;
3980 /* apply peer-group config */
3981 if (peer
->af_group
[afi
][safi
])
3983 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
3984 PEER_FLAG_MAX_PREFIX
))
3985 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3987 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
3989 if (CHECK_FLAG (peer
->group
->conf
->af_flags
[afi
][safi
],
3990 PEER_FLAG_MAX_PREFIX_WARNING
))
3991 SET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3993 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
3995 peer
->pmax
[afi
][safi
] = peer
->group
->conf
->pmax
[afi
][safi
];
3996 peer
->pmax_threshold
[afi
][safi
] = peer
->group
->conf
->pmax_threshold
[afi
][safi
];
4000 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4001 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4002 peer
->pmax
[afi
][safi
] = 0;
4003 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
4005 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4008 group
= peer
->group
;
4009 LIST_LOOP (group
->peer
, peer
, nn
)
4011 if (! peer
->af_group
[afi
][safi
])
4014 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
);
4015 UNSET_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
);
4016 peer
->pmax
[afi
][safi
] = 0;
4017 peer
->pmax_threshold
[afi
][safi
] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
4023 peer_clear (struct peer
*peer
)
4025 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4027 UNSET_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
);
4028 peer
->v_start
= BGP_INIT_START_TIMER
;
4029 if (peer
->status
== Established
)
4030 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4031 BGP_NOTIFY_CEASE_ADMIN_RESET
);
4033 BGP_EVENT_ADD (peer
, BGP_Stop
);
4039 peer_clear_soft (struct peer
*peer
, afi_t afi
, safi_t safi
,
4040 enum bgp_clear_type stype
)
4042 if (peer
->status
!= Established
)
4045 if (! peer
->afc
[afi
][safi
])
4046 return BGP_ERR_AF_UNCONFIGURED
;
4048 if (stype
== BGP_CLEAR_SOFT_RSCLIENT
)
4050 if (! CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
4052 bgp_check_local_routes_rsclient (peer
, afi
, safi
);
4053 bgp_soft_reconfig_rsclient (peer
, afi
, safi
);
4056 if (stype
== BGP_CLEAR_SOFT_OUT
|| stype
== BGP_CLEAR_SOFT_BOTH
)
4057 bgp_announce_route (peer
, afi
, safi
);
4059 if (stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4061 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
4062 && (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
4063 || CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)))
4065 struct bgp_filter
*filter
= &peer
->filter
[afi
][safi
];
4068 if (CHECK_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
4069 prefix_type
= ORF_TYPE_PREFIX
;
4071 prefix_type
= ORF_TYPE_PREFIX_OLD
;
4073 if (filter
->plist
[FILTER_IN
].plist
)
4075 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4076 bgp_route_refresh_send (peer
, afi
, safi
,
4077 prefix_type
, REFRESH_DEFER
, 1);
4078 bgp_route_refresh_send (peer
, afi
, safi
, prefix_type
,
4079 REFRESH_IMMEDIATE
, 0);
4083 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
4084 bgp_route_refresh_send (peer
, afi
, safi
,
4085 prefix_type
, REFRESH_IMMEDIATE
, 1);
4087 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4093 if (stype
== BGP_CLEAR_SOFT_IN
|| stype
== BGP_CLEAR_SOFT_BOTH
4094 || stype
== BGP_CLEAR_SOFT_IN_ORF_PREFIX
)
4096 /* If neighbor has soft reconfiguration inbound flag.
4097 Use Adj-RIB-In database. */
4098 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4099 bgp_soft_reconfig_in (peer
, afi
, safi
);
4102 /* If neighbor has route refresh capability, send route refresh
4103 message to the peer. */
4104 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
4105 || CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
4106 bgp_route_refresh_send (peer
, afi
, safi
, 0, 0, 0);
4108 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
;
4114 /* Display peer uptime.*/
4115 /* XXX: why does this function return char * when it takes buffer? */
4117 peer_uptime (time_t uptime2
, char *buf
, size_t len
)
4122 /* Check buffer length. */
4123 if (len
< BGP_UPTIME_LEN
)
4125 zlog_warn ("peer_uptime (): buffer shortage %d", len
);
4126 /* XXX: should return status instead of buf... */
4127 snprintf (buf
, len
, "<error> ");
4131 /* If there is no connection has been done before print `never'. */
4134 snprintf (buf
, len
, "never ");
4138 /* Get current time. */
4139 uptime1
= time (NULL
);
4141 tm
= gmtime (&uptime1
);
4143 /* Making formatted timer strings. */
4144 #define ONE_DAY_SECOND 60*60*24
4145 #define ONE_WEEK_SECOND 60*60*24*7
4147 if (uptime1
< ONE_DAY_SECOND
)
4148 snprintf (buf
, len
, "%02d:%02d:%02d",
4149 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
4150 else if (uptime1
< ONE_WEEK_SECOND
)
4151 snprintf (buf
, len
, "%dd%02dh%02dm",
4152 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
4154 snprintf (buf
, len
, "%02dw%dd%02dh",
4155 tm
->tm_yday
/7, tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
4160 bgp_config_write_filter (struct vty
*vty
, struct peer
*peer
,
4161 afi_t afi
, safi_t safi
)
4163 struct bgp_filter
*filter
;
4164 struct bgp_filter
*gfilter
= NULL
;
4167 int out
= FILTER_OUT
;
4170 filter
= &peer
->filter
[afi
][safi
];
4171 if (peer
->af_group
[afi
][safi
])
4172 gfilter
= &peer
->group
->conf
->filter
[afi
][safi
];
4174 /* distribute-list. */
4175 if (filter
->dlist
[in
].name
)
4176 if (! gfilter
|| ! gfilter
->dlist
[in
].name
4177 || strcmp (filter
->dlist
[in
].name
, gfilter
->dlist
[in
].name
) != 0)
4178 vty_out (vty
, " neighbor %s distribute-list %s in%s", addr
,
4179 filter
->dlist
[in
].name
, VTY_NEWLINE
);
4180 if (filter
->dlist
[out
].name
&& ! gfilter
)
4181 vty_out (vty
, " neighbor %s distribute-list %s out%s", addr
,
4182 filter
->dlist
[out
].name
, VTY_NEWLINE
);
4185 if (filter
->plist
[in
].name
)
4186 if (! gfilter
|| ! gfilter
->plist
[in
].name
4187 || strcmp (filter
->plist
[in
].name
, gfilter
->plist
[in
].name
) != 0)
4188 vty_out (vty
, " neighbor %s prefix-list %s in%s", addr
,
4189 filter
->plist
[in
].name
, VTY_NEWLINE
);
4190 if (filter
->plist
[out
].name
&& ! gfilter
)
4191 vty_out (vty
, " neighbor %s prefix-list %s out%s", addr
,
4192 filter
->plist
[out
].name
, VTY_NEWLINE
);
4195 if (filter
->map
[RMAP_IN
].name
)
4196 if (! gfilter
|| ! gfilter
->map
[RMAP_IN
].name
4197 || strcmp (filter
->map
[RMAP_IN
].name
, gfilter
->map
[RMAP_IN
].name
) != 0)
4198 vty_out (vty
, " neighbor %s route-map %s in%s", addr
,
4199 filter
->map
[RMAP_IN
].name
, VTY_NEWLINE
);
4200 if (filter
->map
[RMAP_OUT
].name
&& ! gfilter
)
4201 vty_out (vty
, " neighbor %s route-map %s out%s", addr
,
4202 filter
->map
[RMAP_OUT
].name
, VTY_NEWLINE
);
4203 if (filter
->map
[RMAP_IMPORT
].name
&& ! gfilter
)
4204 vty_out (vty
, " neighbor %s route-map %s import%s", addr
,
4205 filter
->map
[RMAP_IMPORT
].name
, VTY_NEWLINE
);
4206 if (filter
->map
[RMAP_EXPORT
].name
)
4207 if (! gfilter
|| ! gfilter
->map
[RMAP_EXPORT
].name
4208 || strcmp (filter
->map
[RMAP_EXPORT
].name
,
4209 gfilter
->map
[RMAP_EXPORT
].name
) != 0)
4210 vty_out (vty
, " neighbor %s route-map %s export%s", addr
,
4211 filter
->map
[RMAP_EXPORT
].name
, VTY_NEWLINE
);
4213 /* unsuppress-map */
4214 if (filter
->usmap
.name
&& ! gfilter
)
4215 vty_out (vty
, " neighbor %s unsuppress-map %s%s", addr
,
4216 filter
->usmap
.name
, VTY_NEWLINE
);
4219 if (filter
->aslist
[in
].name
)
4220 if (! gfilter
|| ! gfilter
->aslist
[in
].name
4221 || strcmp (filter
->aslist
[in
].name
, gfilter
->aslist
[in
].name
) != 0)
4222 vty_out (vty
, " neighbor %s filter-list %s in%s", addr
,
4223 filter
->aslist
[in
].name
, VTY_NEWLINE
);
4224 if (filter
->aslist
[out
].name
&& ! gfilter
)
4225 vty_out (vty
, " neighbor %s filter-list %s out%s", addr
,
4226 filter
->aslist
[out
].name
, VTY_NEWLINE
);
4229 /* BGP peer configuration display function. */
4231 bgp_config_write_peer (struct vty
*vty
, struct bgp
*bgp
,
4232 struct peer
*peer
, afi_t afi
, safi_t safi
)
4234 struct bgp_filter
*filter
;
4235 struct peer
*g_peer
= NULL
;
4236 char buf
[SU_ADDRSTRLEN
];
4239 filter
= &peer
->filter
[afi
][safi
];
4241 if (peer_group_active (peer
))
4242 g_peer
= peer
->group
->conf
;
4244 /************************************
4245 ****** Global to the neighbor ******
4246 ************************************/
4247 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4250 if (! peer_group_active (peer
))
4252 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_GROUP
))
4253 vty_out (vty
, " neighbor %s peer-group%s", addr
,
4256 vty_out (vty
, " neighbor %s remote-as %d%s", addr
, peer
->as
,
4262 vty_out (vty
, " neighbor %s remote-as %d%s", addr
, peer
->as
,
4264 if (peer
->af_group
[AFI_IP
][SAFI_UNICAST
])
4265 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4266 peer
->group
->name
, VTY_NEWLINE
);
4270 if (peer
->change_local_as
)
4271 if (! peer_group_active (peer
))
4272 vty_out (vty
, " neighbor %s local-as %d%s%s", addr
,
4273 peer
->change_local_as
,
4274 CHECK_FLAG (peer
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
4275 " no-prepend" : "", VTY_NEWLINE
);
4279 vty_out (vty
, " neighbor %s description %s%s", addr
, peer
->desc
,
4283 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
4284 if (! peer_group_active (peer
) ||
4285 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_SHUTDOWN
))
4286 vty_out (vty
, " neighbor %s shutdown%s", addr
, VTY_NEWLINE
);
4289 if (peer
->port
!= BGP_PORT_DEFAULT
)
4290 vty_out (vty
, " neighbor %s port %d%s", addr
, peer
->port
,
4293 /* Local interface name. */
4295 vty_out (vty
, " neighbor %s interface %s%s", addr
, peer
->ifname
,
4299 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_PASSIVE
))
4300 if (! peer_group_active (peer
) ||
4301 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_PASSIVE
))
4302 vty_out (vty
, " neighbor %s passive%s", addr
, VTY_NEWLINE
);
4304 /* EBGP multihop. */
4305 if (peer_sort (peer
) != BGP_PEER_IBGP
&& peer
->ttl
!= 1)
4306 if (! peer_group_active (peer
) ||
4307 g_peer
->ttl
!= peer
->ttl
)
4308 vty_out (vty
, " neighbor %s ebgp-multihop %d%s", addr
, peer
->ttl
,
4311 /* Enforce multihop. */
4312 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_ENFORCE_MULTIHOP
))
4313 if (! peer_group_active (peer
) ||
4314 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_ENFORCE_MULTIHOP
))
4315 vty_out (vty
, " neighbor %s enforce-multihop%s", addr
, VTY_NEWLINE
);
4317 /* Update-source. */
4318 if (peer
->update_if
)
4319 if (! peer_group_active (peer
) || ! g_peer
->update_if
4320 || strcmp (g_peer
->update_if
, peer
->update_if
) != 0)
4321 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4322 peer
->update_if
, VTY_NEWLINE
);
4323 if (peer
->update_source
)
4324 if (! peer_group_active (peer
) || ! g_peer
->update_source
4325 || sockunion_cmp (g_peer
->update_source
,
4326 peer
->update_source
) != 0)
4327 vty_out (vty
, " neighbor %s update-source %s%s", addr
,
4328 sockunion2str (peer
->update_source
, buf
, SU_ADDRSTRLEN
),
4331 /* BGP version print. */
4332 if (peer
->version
== BGP_VERSION_MP_4_DRAFT_00
)
4333 vty_out (vty
, " neighbor %s version %s%s",
4334 addr
,"4-", VTY_NEWLINE
);
4336 /* advertisement-interval */
4337 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_ROUTEADV
))
4338 vty_out (vty
, " neighbor %s advertisement-interval %d%s",
4339 addr
, peer
->v_routeadv
, VTY_NEWLINE
);
4342 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
)
4343 && ! peer_group_active (peer
))
4344 vty_out (vty
, " neighbor %s timers %d %d%s", addr
,
4345 peer
->keepalive
, peer
->holdtime
, VTY_NEWLINE
);
4347 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_CONNECT
))
4348 vty_out (vty
, " neighbor %s timers connect %d%s", addr
,
4349 peer
->connect
, VTY_NEWLINE
);
4351 /* Default weight. */
4352 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_WEIGHT
))
4353 if (! peer_group_active (peer
) ||
4354 g_peer
->weight
!= peer
->weight
)
4355 vty_out (vty
, " neighbor %s weight %d%s", addr
, peer
->weight
,
4358 /* Route refresh. */
4359 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_NO_ROUTE_REFRESH_CAP
))
4360 if (! peer_group_active (peer
) ||
4361 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_NO_ROUTE_REFRESH_CAP
))
4362 vty_out (vty
, " no neighbor %s capability route-refresh%s", addr
,
4365 /* Dynamic capability. */
4366 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4367 if (! peer_group_active (peer
) ||
4368 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
4369 vty_out (vty
, " neighbor %s capability dynamic%s", addr
,
4372 /* dont capability negotiation. */
4373 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4374 if (! peer_group_active (peer
) ||
4375 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
4376 vty_out (vty
, " neighbor %s dont-capability-negotiate%s", addr
,
4379 /* override capability negotiation. */
4380 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4381 if (! peer_group_active (peer
) ||
4382 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
4383 vty_out (vty
, " neighbor %s override-capability%s", addr
,
4386 /* strict capability negotiation. */
4387 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4388 if (! peer_group_active (peer
) ||
4389 ! CHECK_FLAG (g_peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
4390 vty_out (vty
, " neighbor %s strict-capability-match%s", addr
,
4393 if (! peer_group_active (peer
))
4395 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4397 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4398 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4402 if (! peer
->afc
[AFI_IP
][SAFI_UNICAST
])
4403 vty_out (vty
, " no neighbor %s activate%s", addr
, VTY_NEWLINE
);
4409 /************************************
4410 ****** Per AF to the neighbor ******
4411 ************************************/
4413 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
4415 if (peer
->af_group
[afi
][safi
])
4416 vty_out (vty
, " neighbor %s peer-group %s%s", addr
,
4417 peer
->group
->name
, VTY_NEWLINE
);
4419 vty_out (vty
, " neighbor %s activate%s", addr
, VTY_NEWLINE
);
4422 /* ORF capability. */
4423 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4424 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4425 if (! peer
->af_group
[afi
][safi
])
4427 vty_out (vty
, " neighbor %s capability orf prefix-list", addr
);
4429 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
4430 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
4431 vty_out (vty
, " both");
4432 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
4433 vty_out (vty
, " send");
4435 vty_out (vty
, " receive");
4436 vty_out (vty
, "%s", VTY_NEWLINE
);
4439 /* Route reflector client. */
4440 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REFLECTOR_CLIENT
)
4441 && ! peer
->af_group
[afi
][safi
])
4442 vty_out (vty
, " neighbor %s route-reflector-client%s", addr
,
4446 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)
4447 && ! peer
->af_group
[afi
][safi
])
4448 vty_out (vty
, " neighbor %s next-hop-self%s", addr
, VTY_NEWLINE
);
4450 /* Remove private AS. */
4451 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_REMOVE_PRIVATE_AS
)
4452 && ! peer
->af_group
[afi
][safi
])
4453 vty_out (vty
, " neighbor %s remove-private-AS%s",
4456 /* send-community print. */
4457 if (! peer
->af_group
[afi
][safi
])
4459 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4461 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
4462 && peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4463 vty_out (vty
, " neighbor %s send-community both%s", addr
, VTY_NEWLINE
);
4464 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4465 vty_out (vty
, " neighbor %s send-community extended%s",
4467 else if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
4468 vty_out (vty
, " neighbor %s send-community%s", addr
, VTY_NEWLINE
);
4472 if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
)
4473 && ! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4474 vty_out (vty
, " no neighbor %s send-community both%s",
4476 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_EXT_COMMUNITY
))
4477 vty_out (vty
, " no neighbor %s send-community extended%s",
4479 else if (! peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_SEND_COMMUNITY
))
4480 vty_out (vty
, " no neighbor %s send-community%s",
4485 /* Default information */
4486 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_DEFAULT_ORIGINATE
)
4487 && ! peer
->af_group
[afi
][safi
])
4489 vty_out (vty
, " neighbor %s default-originate", addr
);
4490 if (peer
->default_rmap
[afi
][safi
].name
)
4491 vty_out (vty
, " route-map %s", peer
->default_rmap
[afi
][safi
].name
);
4492 vty_out (vty
, "%s", VTY_NEWLINE
);
4495 /* Soft reconfiguration inbound. */
4496 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4497 if (! peer
->af_group
[afi
][safi
] ||
4498 ! CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
4499 vty_out (vty
, " neighbor %s soft-reconfiguration inbound%s", addr
,
4502 /* maximum-prefix. */
4503 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
4504 if (! peer
->af_group
[afi
][safi
]
4505 || g_peer
->pmax
[afi
][safi
] != peer
->pmax
[afi
][safi
]
4506 || g_peer
->pmax_threshold
[afi
][safi
] != peer
->pmax_threshold
[afi
][safi
]
4507 || CHECK_FLAG (g_peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
4508 != CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
4510 vty_out (vty
, " neighbor %s maximum-prefix %ld", addr
, peer
->pmax
[afi
][safi
]);
4511 if (peer
->pmax_threshold
[afi
][safi
] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
4512 vty_out (vty
, " %d", peer
->pmax_threshold
[afi
][safi
]);
4513 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
4514 vty_out (vty
, " warning-only");
4515 vty_out (vty
, "%s", VTY_NEWLINE
);
4518 /* Route server client. */
4519 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
)
4520 && ! peer
->af_group
[afi
][safi
])
4521 vty_out (vty
, " neighbor %s route-server-client%s", addr
, VTY_NEWLINE
);
4524 if (peer_af_flag_check (peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
))
4525 if (! peer_group_active (peer
)
4526 || ! peer_af_flag_check (g_peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)
4527 || peer
->allowas_in
[afi
][safi
] != g_peer
->allowas_in
[afi
][safi
])
4529 if (peer
->allowas_in
[afi
][safi
] == 3)
4530 vty_out (vty
, " neighbor %s allowas-in%s", addr
, VTY_NEWLINE
);
4532 vty_out (vty
, " neighbor %s allowas-in %d%s", addr
,
4533 peer
->allowas_in
[afi
][safi
], VTY_NEWLINE
);
4537 bgp_config_write_filter (vty
, peer
, afi
, safi
);
4539 /* atribute-unchanged. */
4540 if ((CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
4541 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
4542 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
4543 && ! peer
->af_group
[afi
][safi
])
4545 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)
4546 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)
4547 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
4548 vty_out (vty
, " neighbor %s attribute-unchanged%s", addr
, VTY_NEWLINE
);
4550 vty_out (vty
, " neighbor %s attribute-unchanged%s%s%s%s", addr
,
4551 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
)) ?
4553 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
)) ?
4555 (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
)) ?
4556 " med" : "", VTY_NEWLINE
);
4560 /* Display "address-family" configuration header. */
4562 bgp_config_write_family_header (struct vty
*vty
, afi_t afi
, safi_t safi
,
4568 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
4571 vty_out (vty
, "!%s address-family ", VTY_NEWLINE
);
4575 if (safi
== SAFI_MULTICAST
)
4576 vty_out (vty
, "ipv4 multicast");
4577 else if (safi
== SAFI_MPLS_VPN
)
4578 vty_out (vty
, "vpnv4 unicast");
4580 else if (afi
== AFI_IP6
)
4581 vty_out (vty
, "ipv6");
4583 vty_out (vty
, "%s", VTY_NEWLINE
);
4588 /* Address family based peer configuration display. */
4590 bgp_config_write_family (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
4595 struct peer_group
*group
;
4596 struct listnode
*nn
;
4598 bgp_config_write_network (vty
, bgp
, afi
, safi
, &write
);
4600 bgp_config_write_redistribute (vty
, bgp
, afi
, safi
, &write
);
4602 LIST_LOOP (bgp
->group
, group
, nn
)
4604 if (group
->conf
->afc
[afi
][safi
])
4606 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
4607 bgp_config_write_peer (vty
, bgp
, group
->conf
, afi
, safi
);
4610 LIST_LOOP (bgp
->peer
, peer
, nn
)
4612 if (peer
->afc
[afi
][safi
])
4614 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
4616 bgp_config_write_family_header (vty
, afi
, safi
, &write
);
4617 bgp_config_write_peer (vty
, bgp
, peer
, afi
, safi
);
4622 vty_out (vty
, " exit-address-family%s", VTY_NEWLINE
);
4628 bgp_config_write (struct vty
*vty
)
4632 struct peer_group
*group
;
4634 struct listnode
*nn
, *nm
, *no
;
4636 /* BGP Multiple instance. */
4637 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
4639 vty_out (vty
, "bgp multiple-instance%s", VTY_NEWLINE
);
4643 /* BGP Config type. */
4644 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4646 vty_out (vty
, "bgp config-type cisco%s", VTY_NEWLINE
);
4650 /* BGP configuration. */
4651 LIST_LOOP (bm
->bgp
, bgp
, nn
)
4654 vty_out (vty
, "!%s", VTY_NEWLINE
);
4656 /* Router bgp ASN */
4657 vty_out (vty
, "router bgp %d", bgp
->as
);
4659 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
4662 vty_out (vty
, " view %s", bgp
->name
);
4664 vty_out (vty
, "%s", VTY_NEWLINE
);
4666 /* No Synchronization */
4667 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4668 vty_out (vty
, " no synchronization%s", VTY_NEWLINE
);
4670 /* BGP fast-external-failover. */
4671 if (CHECK_FLAG (bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
4672 vty_out (vty
, " no bgp fast-external-failover%s", VTY_NEWLINE
);
4674 /* BGP router ID. */
4675 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_ROUTER_ID
))
4676 vty_out (vty
, " bgp router-id %s%s", inet_ntoa (bgp
->router_id
),
4679 /* BGP log-neighbor-changes. */
4680 if (bgp_flag_check (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
))
4681 vty_out (vty
, " bgp log-neighbor-changes%s", VTY_NEWLINE
);
4683 /* BGP configuration. */
4684 if (bgp_flag_check (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
4685 vty_out (vty
, " bgp always-compare-med%s", VTY_NEWLINE
);
4687 /* BGP default ipv4-unicast. */
4688 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
4689 vty_out (vty
, " no bgp default ipv4-unicast%s", VTY_NEWLINE
);
4691 /* BGP default local-preference. */
4692 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
4693 vty_out (vty
, " bgp default local-preference %d%s",
4694 bgp
->default_local_pref
, VTY_NEWLINE
);
4696 /* BGP client-to-client reflection. */
4697 if (bgp_flag_check (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
4698 vty_out (vty
, " no bgp client-to-client reflection%s", VTY_NEWLINE
);
4700 /* BGP cluster ID. */
4701 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
4702 vty_out (vty
, " bgp cluster-id %s%s", inet_ntoa (bgp
->cluster_id
),
4705 /* Confederation identifier*/
4706 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
))
4707 vty_out (vty
, " bgp confederation identifier %i%s", bgp
->confed_id
,
4710 /* Confederation peer */
4711 if (bgp
->confed_peers_cnt
> 0)
4715 vty_out (vty
, " bgp confederation peers");
4717 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
4718 vty_out(vty
, " %d", bgp
->confed_peers
[i
]);
4720 vty_out (vty
, "%s", VTY_NEWLINE
);
4723 /* BGP enforce-first-as. */
4724 if (bgp_flag_check (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
))
4725 vty_out (vty
, " bgp enforce-first-as%s", VTY_NEWLINE
);
4727 /* BGP deterministic-med. */
4728 if (bgp_flag_check (bgp
, BGP_FLAG_DETERMINISTIC_MED
))
4729 vty_out (vty
, " bgp deterministic-med%s", VTY_NEWLINE
);
4731 /* BGP graceful-restart. */
4732 if (bgp_flag_check (bgp
, BGP_FLAG_GRACEFUL_RESTART
))
4733 vty_out (vty
, " bgp graceful-restart%s", VTY_NEWLINE
);
4735 /* BGP bestpath method. */
4736 if (bgp_flag_check (bgp
, BGP_FLAG_ASPATH_IGNORE
))
4737 vty_out (vty
, " bgp bestpath as-path ignore%s", VTY_NEWLINE
);
4738 if (bgp_flag_check (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
4739 vty_out (vty
, " bgp bestpath compare-routerid%s", VTY_NEWLINE
);
4740 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
)
4741 || bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
4743 vty_out (vty
, " bgp bestpath med");
4744 if (bgp_flag_check (bgp
, BGP_FLAG_MED_CONFED
))
4745 vty_out (vty
, " confed");
4746 if (bgp_flag_check (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
4747 vty_out (vty
, " missing-as-worst");
4748 vty_out (vty
, "%s", VTY_NEWLINE
);
4751 /* BGP network import check. */
4752 if (bgp_flag_check (bgp
, BGP_FLAG_IMPORT_CHECK
))
4753 vty_out (vty
, " bgp network import-check%s", VTY_NEWLINE
);
4755 /* BGP scan interval. */
4756 bgp_config_write_scan_time (vty
);
4758 /* BGP flag dampening. */
4759 if (CHECK_FLAG (bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
4760 BGP_CONFIG_DAMPENING
))
4761 bgp_config_write_damp (vty
);
4763 /* BGP static route configuration. */
4764 bgp_config_write_network (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
4766 /* BGP redistribute configuration. */
4767 bgp_config_write_redistribute (vty
, bgp
, AFI_IP
, SAFI_UNICAST
, &write
);
4769 /* BGP timers configuration. */
4770 if (bgp
->default_keepalive
!= BGP_DEFAULT_KEEPALIVE
4771 && bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
4772 vty_out (vty
, " timers bgp %d %d%s", bgp
->default_keepalive
,
4773 bgp
->default_holdtime
, VTY_NEWLINE
);
4776 LIST_LOOP (bgp
->group
, group
, nm
)
4778 bgp_config_write_peer (vty
, bgp
, group
->conf
, AFI_IP
, SAFI_UNICAST
);
4781 /* Normal neighbor configuration. */
4782 LIST_LOOP (bgp
->peer
, peer
, no
)
4784 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
4785 bgp_config_write_peer (vty
, bgp
, peer
, AFI_IP
, SAFI_UNICAST
);
4788 /* Distance configuration. */
4789 bgp_config_write_distance (vty
, bgp
);
4791 /* No auto-summary */
4792 if (bgp_option_check (BGP_OPT_CONFIG_CISCO
))
4793 vty_out (vty
, " no auto-summary%s", VTY_NEWLINE
);
4795 /* IPv4 multicast configuration. */
4796 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
4798 /* IPv4 VPN configuration. */
4799 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
4801 /* IPv6 unicast configuration. */
4802 write
+= bgp_config_write_family (vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
4812 memset (&bgp_master
, 0, sizeof (struct bgp_master
));
4815 bm
->bgp
= list_new ();
4816 bm
->port
= BGP_PORT_DEFAULT
;
4817 bm
->master
= thread_master_create ();
4818 bm
->start_time
= time (NULL
);
4824 void bgp_zebra_init ();
4825 void bgp_route_map_init ();
4826 void bgp_filter_init ();
4828 /* BGP VTY commands installation. */
4831 /* Create BGP server socket. */
4832 bgp_socket (NULL
, bm
->port
);
4842 bgp_route_map_init ();
4844 bgp_mplsvpn_init ();
4846 /* Access list initialize. */
4847 access_list_init ();
4848 access_list_add_hook (peer_distribute_update
);
4849 access_list_delete_hook (peer_distribute_update
);
4851 /* Filter list initialize. */
4853 as_list_add_hook (peer_aslist_update
);
4854 as_list_delete_hook (peer_aslist_update
);
4856 /* Prefix list initialize.*/
4857 prefix_list_init ();
4858 prefix_list_add_hook (peer_prefix_list_update
);
4859 prefix_list_delete_hook (peer_prefix_list_update
);
4861 /* Community list initialize. */
4862 bgp_clist
= community_list_init ();
4866 #endif /* HAVE_SNMP */
4872 struct bgp_master
*bm
;
4875 struct listnode
*nn
;
4876 struct listnode
*mm
;
4878 bm
= bgp_get_master ();
4880 LIST_LOOP (bm
->bgp
, bgp
, nn
)
4881 LIST_LOOP (bgp
->peer
, peer
, mm
)
4882 if (peer
->status
== Established
)
4883 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
4884 BGP_NOTIFY_CEASE_PEER_UNCONFIG
);
4886 bgp_cleanup_routes ();