]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgpd.c
bgpd: bgpd-mrai.patch
[mirror_frr.git] / bgpd / bgpd.c
1 /* BGP-4, BGP-4+ daemon program
2 Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
3
4 This file is part of GNU Zebra.
5
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
9 later version.
10
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.
15
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
19 02111-1307, USA. */
20
21 #include <zebra.h>
22
23 #include "prefix.h"
24 #include "thread.h"
25 #include "buffer.h"
26 #include "stream.h"
27 #include "command.h"
28 #include "sockunion.h"
29 #include "network.h"
30 #include "memory.h"
31 #include "filter.h"
32 #include "routemap.h"
33 #include "str.h"
34 #include "log.h"
35 #include "plist.h"
36 #include "linklist.h"
37 #include "workqueue.h"
38
39 #include "bgpd/bgpd.h"
40 #include "bgpd/bgp_table.h"
41 #include "bgpd/bgp_aspath.h"
42 #include "bgpd/bgp_route.h"
43 #include "bgpd/bgp_dump.h"
44 #include "bgpd/bgp_debug.h"
45 #include "bgpd/bgp_community.h"
46 #include "bgpd/bgp_attr.h"
47 #include "bgpd/bgp_regex.h"
48 #include "bgpd/bgp_clist.h"
49 #include "bgpd/bgp_fsm.h"
50 #include "bgpd/bgp_packet.h"
51 #include "bgpd/bgp_zebra.h"
52 #include "bgpd/bgp_open.h"
53 #include "bgpd/bgp_filter.h"
54 #include "bgpd/bgp_nexthop.h"
55 #include "bgpd/bgp_damp.h"
56 #include "bgpd/bgp_mplsvpn.h"
57 #include "bgpd/bgp_advertise.h"
58 #include "bgpd/bgp_network.h"
59 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_mpath.h"
61 #ifdef HAVE_SNMP
62 #include "bgpd/bgp_snmp.h"
63 #endif /* HAVE_SNMP */
64
65 /* BGP process wide configuration. */
66 static struct bgp_master bgp_master;
67
68 extern struct in_addr router_id_zebra;
69
70 /* BGP process wide configuration pointer to export. */
71 struct bgp_master *bm;
72
73 /* BGP community-list. */
74 struct community_list_handler *bgp_clist;
75
76 /* BGP global flag manipulation. */
77 int
78 bgp_option_set (int flag)
79 {
80 switch (flag)
81 {
82 case BGP_OPT_NO_FIB:
83 case BGP_OPT_MULTIPLE_INSTANCE:
84 case BGP_OPT_CONFIG_CISCO:
85 case BGP_OPT_NO_LISTEN:
86 SET_FLAG (bm->options, flag);
87 break;
88 default:
89 return BGP_ERR_INVALID_FLAG;
90 }
91 return 0;
92 }
93
94 int
95 bgp_option_unset (int flag)
96 {
97 switch (flag)
98 {
99 case BGP_OPT_MULTIPLE_INSTANCE:
100 if (listcount (bm->bgp) > 1)
101 return BGP_ERR_MULTIPLE_INSTANCE_USED;
102 /* Fall through. */
103 case BGP_OPT_NO_FIB:
104 case BGP_OPT_CONFIG_CISCO:
105 UNSET_FLAG (bm->options, flag);
106 break;
107 default:
108 return BGP_ERR_INVALID_FLAG;
109 }
110 return 0;
111 }
112
113 int
114 bgp_option_check (int flag)
115 {
116 return CHECK_FLAG (bm->options, flag);
117 }
118
119 /* BGP flag manipulation. */
120 int
121 bgp_flag_set (struct bgp *bgp, int flag)
122 {
123 SET_FLAG (bgp->flags, flag);
124 return 0;
125 }
126
127 int
128 bgp_flag_unset (struct bgp *bgp, int flag)
129 {
130 UNSET_FLAG (bgp->flags, flag);
131 return 0;
132 }
133
134 int
135 bgp_flag_check (struct bgp *bgp, int flag)
136 {
137 return CHECK_FLAG (bgp->flags, flag);
138 }
139
140 /* Internal function to set BGP structure configureation flag. */
141 static void
142 bgp_config_set (struct bgp *bgp, int config)
143 {
144 SET_FLAG (bgp->config, config);
145 }
146
147 static void
148 bgp_config_unset (struct bgp *bgp, int config)
149 {
150 UNSET_FLAG (bgp->config, config);
151 }
152
153 static int
154 bgp_config_check (struct bgp *bgp, int config)
155 {
156 return CHECK_FLAG (bgp->config, config);
157 }
158
159 /* Set BGP router identifier. */
160 int
161 bgp_router_id_set (struct bgp *bgp, struct in_addr *id)
162 {
163 struct peer *peer;
164 struct listnode *node, *nnode;
165
166 if (bgp_config_check (bgp, BGP_CONFIG_ROUTER_ID)
167 && IPV4_ADDR_SAME (&bgp->router_id, id))
168 return 0;
169
170 IPV4_ADDR_COPY (&bgp->router_id, id);
171 bgp_config_set (bgp, BGP_CONFIG_ROUTER_ID);
172
173 /* Set all peer's local identifier with this value. */
174 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
175 {
176 IPV4_ADDR_COPY (&peer->local_id, id);
177
178 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
179 {
180 peer->last_reset = PEER_DOWN_RID_CHANGE;
181 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
182 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
183 }
184 }
185 return 0;
186 }
187
188 /* BGP's cluster-id control. */
189 int
190 bgp_cluster_id_set (struct bgp *bgp, struct in_addr *cluster_id)
191 {
192 struct peer *peer;
193 struct listnode *node, *nnode;
194
195 if (bgp_config_check (bgp, BGP_CONFIG_CLUSTER_ID)
196 && IPV4_ADDR_SAME (&bgp->cluster_id, cluster_id))
197 return 0;
198
199 IPV4_ADDR_COPY (&bgp->cluster_id, cluster_id);
200 bgp_config_set (bgp, BGP_CONFIG_CLUSTER_ID);
201
202 /* Clear all IBGP peer. */
203 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
204 {
205 if (peer->sort != BGP_PEER_IBGP)
206 continue;
207
208 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
209 {
210 peer->last_reset = PEER_DOWN_CLID_CHANGE;
211 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
212 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
213 }
214 }
215 return 0;
216 }
217
218 int
219 bgp_cluster_id_unset (struct bgp *bgp)
220 {
221 struct peer *peer;
222 struct listnode *node, *nnode;
223
224 if (! bgp_config_check (bgp, BGP_CONFIG_CLUSTER_ID))
225 return 0;
226
227 bgp->cluster_id.s_addr = 0;
228 bgp_config_unset (bgp, BGP_CONFIG_CLUSTER_ID);
229
230 /* Clear all IBGP peer. */
231 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
232 {
233 if (peer->sort != BGP_PEER_IBGP)
234 continue;
235
236 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
237 {
238 peer->last_reset = PEER_DOWN_CLID_CHANGE;
239 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
240 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
241 }
242 }
243 return 0;
244 }
245
246 /* time_t value that is monotonicly increasing
247 * and uneffected by adjustments to system clock
248 */
249 time_t bgp_clock (void)
250 {
251 struct timeval tv;
252
253 quagga_gettime(QUAGGA_CLK_MONOTONIC, &tv);
254 return tv.tv_sec;
255 }
256
257 /* BGP timer configuration. */
258 int
259 bgp_timers_set (struct bgp *bgp, u_int32_t keepalive, u_int32_t holdtime)
260 {
261 bgp->default_keepalive = (keepalive < holdtime / 3
262 ? keepalive : holdtime / 3);
263 bgp->default_holdtime = holdtime;
264
265 return 0;
266 }
267
268 int
269 bgp_timers_unset (struct bgp *bgp)
270 {
271 bgp->default_keepalive = BGP_DEFAULT_KEEPALIVE;
272 bgp->default_holdtime = BGP_DEFAULT_HOLDTIME;
273
274 return 0;
275 }
276
277 /* BGP confederation configuration. */
278 int
279 bgp_confederation_id_set (struct bgp *bgp, as_t as)
280 {
281 struct peer *peer;
282 struct listnode *node, *nnode;
283 int already_confed;
284
285 if (as == 0)
286 return BGP_ERR_INVALID_AS;
287
288 /* Remember - were we doing confederation before? */
289 already_confed = bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION);
290 bgp->confed_id = as;
291 bgp_config_set (bgp, BGP_CONFIG_CONFEDERATION);
292
293 /* If we were doing confederation already, this is just an external
294 AS change. Just Reset EBGP sessions, not CONFED sessions. If we
295 were not doing confederation before, reset all EBGP sessions. */
296 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
297 {
298 /* We're looking for peers who's AS is not local or part of our
299 confederation. */
300 if (already_confed)
301 {
302 if (peer_sort (peer) == BGP_PEER_EBGP)
303 {
304 peer->local_as = as;
305 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
306 {
307 peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
308 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
309 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
310 }
311
312 else
313 BGP_EVENT_ADD (peer, BGP_Stop);
314 }
315 }
316 else
317 {
318 /* Not doign confederation before, so reset every non-local
319 session */
320 if (peer_sort (peer) != BGP_PEER_IBGP)
321 {
322 /* Reset the local_as to be our EBGP one */
323 if (peer_sort (peer) == BGP_PEER_EBGP)
324 peer->local_as = as;
325 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
326 {
327 peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
328 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
329 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
330 }
331 else
332 BGP_EVENT_ADD (peer, BGP_Stop);
333 }
334 }
335 }
336 return 0;
337 }
338
339 int
340 bgp_confederation_id_unset (struct bgp *bgp)
341 {
342 struct peer *peer;
343 struct listnode *node, *nnode;
344
345 bgp->confed_id = 0;
346 bgp_config_unset (bgp, BGP_CONFIG_CONFEDERATION);
347
348 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
349 {
350 /* We're looking for peers who's AS is not local */
351 if (peer_sort (peer) != BGP_PEER_IBGP)
352 {
353 peer->local_as = bgp->as;
354 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
355 {
356 peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
357 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
358 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
359 }
360
361 else
362 BGP_EVENT_ADD (peer, BGP_Stop);
363 }
364 }
365 return 0;
366 }
367
368 /* Is an AS part of the confed or not? */
369 int
370 bgp_confederation_peers_check (struct bgp *bgp, as_t as)
371 {
372 int i;
373
374 if (! bgp)
375 return 0;
376
377 for (i = 0; i < bgp->confed_peers_cnt; i++)
378 if (bgp->confed_peers[i] == as)
379 return 1;
380
381 return 0;
382 }
383
384 /* Add an AS to the confederation set. */
385 int
386 bgp_confederation_peers_add (struct bgp *bgp, as_t as)
387 {
388 struct peer *peer;
389 struct listnode *node, *nnode;
390
391 if (! bgp)
392 return BGP_ERR_INVALID_BGP;
393
394 if (bgp->as == as)
395 return BGP_ERR_INVALID_AS;
396
397 if (bgp_confederation_peers_check (bgp, as))
398 return -1;
399
400 if (bgp->confed_peers)
401 bgp->confed_peers = XREALLOC (MTYPE_BGP_CONFED_LIST,
402 bgp->confed_peers,
403 (bgp->confed_peers_cnt + 1) * sizeof (as_t));
404 else
405 bgp->confed_peers = XMALLOC (MTYPE_BGP_CONFED_LIST,
406 (bgp->confed_peers_cnt + 1) * sizeof (as_t));
407
408 bgp->confed_peers[bgp->confed_peers_cnt] = as;
409 bgp->confed_peers_cnt++;
410
411 if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION))
412 {
413 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
414 {
415 if (peer->as == as)
416 {
417 peer->local_as = bgp->as;
418 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
419 {
420 peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
421 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
422 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
423 }
424 else
425 BGP_EVENT_ADD (peer, BGP_Stop);
426 }
427 }
428 }
429 return 0;
430 }
431
432 /* Delete an AS from the confederation set. */
433 int
434 bgp_confederation_peers_remove (struct bgp *bgp, as_t as)
435 {
436 int i;
437 int j;
438 struct peer *peer;
439 struct listnode *node, *nnode;
440
441 if (! bgp)
442 return -1;
443
444 if (! bgp_confederation_peers_check (bgp, as))
445 return -1;
446
447 for (i = 0; i < bgp->confed_peers_cnt; i++)
448 if (bgp->confed_peers[i] == as)
449 for(j = i + 1; j < bgp->confed_peers_cnt; j++)
450 bgp->confed_peers[j - 1] = bgp->confed_peers[j];
451
452 bgp->confed_peers_cnt--;
453
454 if (bgp->confed_peers_cnt == 0)
455 {
456 if (bgp->confed_peers)
457 XFREE (MTYPE_BGP_CONFED_LIST, bgp->confed_peers);
458 bgp->confed_peers = NULL;
459 }
460 else
461 bgp->confed_peers = XREALLOC (MTYPE_BGP_CONFED_LIST,
462 bgp->confed_peers,
463 bgp->confed_peers_cnt * sizeof (as_t));
464
465 /* Now reset any peer who's remote AS has just been removed from the
466 CONFED */
467 if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION))
468 {
469 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
470 {
471 if (peer->as == as)
472 {
473 peer->local_as = bgp->confed_id;
474 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
475 {
476 peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
477 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
478 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
479 }
480 else
481 BGP_EVENT_ADD (peer, BGP_Stop);
482 }
483 }
484 }
485
486 return 0;
487 }
488
489 /* Local preference configuration. */
490 int
491 bgp_default_local_preference_set (struct bgp *bgp, u_int32_t local_pref)
492 {
493 if (! bgp)
494 return -1;
495
496 bgp->default_local_pref = local_pref;
497
498 return 0;
499 }
500
501 int
502 bgp_default_local_preference_unset (struct bgp *bgp)
503 {
504 if (! bgp)
505 return -1;
506
507 bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
508
509 return 0;
510 }
511
512 /* If peer is RSERVER_CLIENT in at least one address family and is not member
513 of a peer_group for that family, return 1.
514 Used to check wether the peer is included in list bgp->rsclient. */
515 int
516 peer_rsclient_active (struct peer *peer)
517 {
518 int i;
519 int j;
520
521 for (i=AFI_IP; i < AFI_MAX; i++)
522 for (j=SAFI_UNICAST; j < SAFI_MAX; j++)
523 if (CHECK_FLAG(peer->af_flags[i][j], PEER_FLAG_RSERVER_CLIENT)
524 && ! peer->af_group[i][j])
525 return 1;
526 return 0;
527 }
528
529 /* Peer comparison function for sorting. */
530 static int
531 peer_cmp (struct peer *p1, struct peer *p2)
532 {
533 return sockunion_cmp (&p1->su, &p2->su);
534 }
535
536 int
537 peer_af_flag_check (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
538 {
539 return CHECK_FLAG (peer->af_flags[afi][safi], flag);
540 }
541
542 /* Reset all address family specific configuration. */
543 static void
544 peer_af_flag_reset (struct peer *peer, afi_t afi, safi_t safi)
545 {
546 int i;
547 struct bgp_filter *filter;
548 char orf_name[BUFSIZ];
549
550 filter = &peer->filter[afi][safi];
551
552 /* Clear neighbor filter and route-map */
553 for (i = FILTER_IN; i < FILTER_MAX; i++)
554 {
555 if (filter->dlist[i].name)
556 {
557 free (filter->dlist[i].name);
558 filter->dlist[i].name = NULL;
559 }
560 if (filter->plist[i].name)
561 {
562 free (filter->plist[i].name);
563 filter->plist[i].name = NULL;
564 }
565 if (filter->aslist[i].name)
566 {
567 free (filter->aslist[i].name);
568 filter->aslist[i].name = NULL;
569 }
570 }
571 for (i = RMAP_IN; i < RMAP_MAX; i++)
572 {
573 if (filter->map[i].name)
574 {
575 free (filter->map[i].name);
576 filter->map[i].name = NULL;
577 }
578 }
579
580 /* Clear unsuppress map. */
581 if (filter->usmap.name)
582 free (filter->usmap.name);
583 filter->usmap.name = NULL;
584 filter->usmap.map = NULL;
585
586 /* Clear neighbor's all address family flags. */
587 peer->af_flags[afi][safi] = 0;
588
589 /* Clear neighbor's all address family sflags. */
590 peer->af_sflags[afi][safi] = 0;
591
592 /* Clear neighbor's all address family capabilities. */
593 peer->af_cap[afi][safi] = 0;
594
595 /* Clear ORF info */
596 peer->orf_plist[afi][safi] = NULL;
597 sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
598 prefix_bgp_orf_remove_all (orf_name);
599
600 /* Set default neighbor send-community. */
601 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
602 {
603 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY);
604 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY);
605 }
606
607 /* Clear neighbor default_originate_rmap */
608 if (peer->default_rmap[afi][safi].name)
609 free (peer->default_rmap[afi][safi].name);
610 peer->default_rmap[afi][safi].name = NULL;
611 peer->default_rmap[afi][safi].map = NULL;
612
613 /* Clear neighbor maximum-prefix */
614 peer->pmax[afi][safi] = 0;
615 peer->pmax_threshold[afi][safi] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
616 }
617
618 /* peer global config reset */
619 static void
620 peer_global_config_reset (struct peer *peer)
621 {
622 peer->weight = 0;
623 peer->change_local_as = 0;
624 peer->ttl = (peer_sort (peer) == BGP_PEER_IBGP ? 255 : 1);
625 if (peer->update_source)
626 {
627 sockunion_free (peer->update_source);
628 peer->update_source = NULL;
629 }
630 if (peer->update_if)
631 {
632 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
633 peer->update_if = NULL;
634 }
635
636 if (peer_sort (peer) == BGP_PEER_IBGP)
637 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
638 else
639 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
640
641 peer->flags = 0;
642 peer->config = 0;
643 peer->holdtime = 0;
644 peer->keepalive = 0;
645 peer->connect = 0;
646 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
647 }
648
649 /* Check peer's AS number and determines if this peer is IBGP or EBGP */
650 static bgp_peer_sort_t
651 peer_calc_sort (struct peer *peer)
652 {
653 struct bgp *bgp;
654
655 bgp = peer->bgp;
656
657 /* Peer-group */
658 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
659 {
660 if (peer->as)
661 return (bgp->as == peer->as ? BGP_PEER_IBGP : BGP_PEER_EBGP);
662 else
663 {
664 struct peer *peer1;
665 peer1 = listnode_head (peer->group->peer);
666 if (peer1)
667 return (peer1->local_as == peer1->as
668 ? BGP_PEER_IBGP : BGP_PEER_EBGP);
669 }
670 return BGP_PEER_INTERNAL;
671 }
672
673 /* Normal peer */
674 if (bgp && CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION))
675 {
676 if (peer->local_as == 0)
677 return BGP_PEER_INTERNAL;
678
679 if (peer->local_as == peer->as)
680 {
681 if (peer->local_as == bgp->confed_id)
682 return BGP_PEER_EBGP;
683 else
684 return BGP_PEER_IBGP;
685 }
686
687 if (bgp_confederation_peers_check (bgp, peer->as))
688 return BGP_PEER_CONFED;
689
690 return BGP_PEER_EBGP;
691 }
692 else
693 {
694 return (peer->local_as == 0
695 ? BGP_PEER_INTERNAL : peer->local_as == peer->as
696 ? BGP_PEER_IBGP : BGP_PEER_EBGP);
697 }
698 }
699
700 /* Calculate and cache the peer "sort" */
701 bgp_peer_sort_t
702 peer_sort (struct peer *peer)
703 {
704 peer->sort = peer_calc_sort (peer);
705 return peer->sort;
706 }
707
708 static void
709 peer_free (struct peer *peer)
710 {
711 assert (peer->status == Deleted);
712
713 bgp_unlock(peer->bgp);
714
715 /* this /ought/ to have been done already through bgp_stop earlier,
716 * but just to be sure..
717 */
718 bgp_timer_set (peer);
719 BGP_READ_OFF (peer->t_read);
720 BGP_WRITE_OFF (peer->t_write);
721 BGP_EVENT_FLUSH (peer);
722
723 if (peer->desc)
724 XFREE (MTYPE_PEER_DESC, peer->desc);
725
726 /* Free allocated host character. */
727 if (peer->host)
728 XFREE (MTYPE_BGP_PEER_HOST, peer->host);
729
730 /* Update source configuration. */
731 if (peer->update_source)
732 sockunion_free (peer->update_source);
733
734 if (peer->update_if)
735 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
736
737 if (peer->clear_node_queue)
738 work_queue_free (peer->clear_node_queue);
739
740 bgp_sync_delete (peer);
741 memset (peer, 0, sizeof (struct peer));
742
743 XFREE (MTYPE_BGP_PEER, peer);
744 }
745
746 /* increase reference count on a struct peer */
747 struct peer *
748 peer_lock (struct peer *peer)
749 {
750 assert (peer && (peer->lock >= 0));
751
752 peer->lock++;
753
754 return peer;
755 }
756
757 /* decrease reference count on a struct peer
758 * struct peer is freed and NULL returned if last reference
759 */
760 struct peer *
761 peer_unlock (struct peer *peer)
762 {
763 assert (peer && (peer->lock > 0));
764
765 peer->lock--;
766
767 if (peer->lock == 0)
768 {
769 #if 0
770 zlog_debug ("unlocked and freeing");
771 zlog_backtrace (LOG_DEBUG);
772 #endif
773 peer_free (peer);
774 return NULL;
775 }
776
777 #if 0
778 if (peer->lock == 1)
779 {
780 zlog_debug ("unlocked to 1");
781 zlog_backtrace (LOG_DEBUG);
782 }
783 #endif
784
785 return peer;
786 }
787
788 /* Allocate new peer object, implicitely locked. */
789 static struct peer *
790 peer_new (struct bgp *bgp)
791 {
792 afi_t afi;
793 safi_t safi;
794 struct peer *peer;
795 struct servent *sp;
796
797 /* bgp argument is absolutely required */
798 assert (bgp);
799 if (!bgp)
800 return NULL;
801
802 /* Allocate new peer. */
803 peer = XCALLOC (MTYPE_BGP_PEER, sizeof (struct peer));
804
805 /* Set default value. */
806 peer->fd = -1;
807 peer->v_start = BGP_INIT_START_TIMER;
808 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
809 peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
810 peer->status = Idle;
811 peer->ostatus = Idle;
812 peer->weight = 0;
813 peer->password = NULL;
814 peer->bgp = bgp;
815 peer = peer_lock (peer); /* initial reference */
816 bgp_lock (bgp);
817
818 /* Set default flags. */
819 for (afi = AFI_IP; afi < AFI_MAX; afi++)
820 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
821 {
822 if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
823 {
824 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY);
825 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY);
826 }
827 peer->orf_plist[afi][safi] = NULL;
828 }
829 SET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
830
831 /* Create buffers. */
832 peer->ibuf = stream_new (BGP_MAX_PACKET_SIZE);
833 peer->obuf = stream_fifo_new ();
834 peer->work = stream_new (BGP_MAX_PACKET_SIZE);
835 peer->scratch = stream_new (BGP_MAX_PACKET_SIZE);
836
837 bgp_sync_init (peer);
838
839 /* Get service port number. */
840 sp = getservbyname ("bgp", "tcp");
841 peer->port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs (sp->s_port);
842
843 return peer;
844 }
845
846 /* Create new BGP peer. */
847 static struct peer *
848 peer_create (union sockunion *su, struct bgp *bgp, as_t local_as,
849 as_t remote_as, afi_t afi, safi_t safi)
850 {
851 int active;
852 struct peer *peer;
853 char buf[SU_ADDRSTRLEN];
854
855 peer = peer_new (bgp);
856 peer->su = *su;
857 peer->local_as = local_as;
858 peer->as = remote_as;
859 peer->local_id = bgp->router_id;
860 peer->v_holdtime = bgp->default_holdtime;
861 peer->v_keepalive = bgp->default_keepalive;
862 if (peer_sort (peer) == BGP_PEER_IBGP)
863 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
864 else
865 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
866
867 peer = peer_lock (peer); /* bgp peer list reference */
868 listnode_add_sort (bgp->peer, peer);
869
870 active = peer_active (peer);
871
872 if (afi && safi)
873 peer->afc[afi][safi] = 1;
874
875 /* Last read and reset time set */
876 peer->readtime = peer->resettime = bgp_clock ();
877
878 /* Default TTL set. */
879 peer->ttl = (peer->sort == BGP_PEER_IBGP) ? 255 : 1;
880
881 /* Make peer's address string. */
882 sockunion2str (su, buf, SU_ADDRSTRLEN);
883 peer->host = XSTRDUP (MTYPE_BGP_PEER_HOST, buf);
884
885 /* Set up peer's events and timers. */
886 if (! active && peer_active (peer))
887 bgp_timer_set (peer);
888
889 return peer;
890 }
891
892 /* Make accept BGP peer. Called from bgp_accept (). */
893 struct peer *
894 peer_create_accept (struct bgp *bgp)
895 {
896 struct peer *peer;
897
898 peer = peer_new (bgp);
899
900 peer = peer_lock (peer); /* bgp peer list reference */
901 listnode_add_sort (bgp->peer, peer);
902
903 return peer;
904 }
905
906 /* Change peer's AS number. */
907 static void
908 peer_as_change (struct peer *peer, as_t as)
909 {
910 bgp_peer_sort_t type;
911 struct peer *conf;
912
913 /* Stop peer. */
914 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
915 {
916 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
917 {
918 peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
919 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
920 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
921 }
922 else
923 BGP_EVENT_ADD (peer, BGP_Stop);
924 }
925 type = peer_sort (peer);
926 peer->as = as;
927
928 if (bgp_config_check (peer->bgp, BGP_CONFIG_CONFEDERATION)
929 && ! bgp_confederation_peers_check (peer->bgp, as)
930 && peer->bgp->as != as)
931 peer->local_as = peer->bgp->confed_id;
932 else
933 peer->local_as = peer->bgp->as;
934
935 /* Advertisement-interval reset */
936 conf = NULL;
937 if (peer->group)
938 conf = peer->group->conf;
939
940 if (conf && CHECK_FLAG (conf->config, PEER_CONFIG_ROUTEADV))
941 peer->v_routeadv = conf->routeadv;
942 else
943 if (peer_sort (peer) == BGP_PEER_IBGP)
944 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
945 else
946 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
947
948 /* TTL reset */
949 if (peer_sort (peer) == BGP_PEER_IBGP)
950 peer->ttl = 255;
951 else if (type == BGP_PEER_IBGP)
952 peer->ttl = 1;
953
954 /* reflector-client reset */
955 if (peer_sort (peer) != BGP_PEER_IBGP)
956 {
957 UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
958 PEER_FLAG_REFLECTOR_CLIENT);
959 UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MULTICAST],
960 PEER_FLAG_REFLECTOR_CLIENT);
961 UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MPLS_VPN],
962 PEER_FLAG_REFLECTOR_CLIENT);
963 UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
964 PEER_FLAG_REFLECTOR_CLIENT);
965 UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_MULTICAST],
966 PEER_FLAG_REFLECTOR_CLIENT);
967 }
968
969 /* local-as reset */
970 if (peer_sort (peer) != BGP_PEER_EBGP)
971 {
972 peer->change_local_as = 0;
973 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
974 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
975 }
976 }
977
978 /* If peer does not exist, create new one. If peer already exists,
979 set AS number to the peer. */
980 int
981 peer_remote_as (struct bgp *bgp, union sockunion *su, as_t *as,
982 afi_t afi, safi_t safi)
983 {
984 struct peer *peer;
985 as_t local_as;
986
987 peer = peer_lookup (bgp, su);
988
989 if (peer)
990 {
991 /* When this peer is a member of peer-group. */
992 if (peer->group)
993 {
994 if (peer->group->conf->as)
995 {
996 /* Return peer group's AS number. */
997 *as = peer->group->conf->as;
998 return BGP_ERR_PEER_GROUP_MEMBER;
999 }
1000 if (peer_sort (peer->group->conf) == BGP_PEER_IBGP)
1001 {
1002 if (bgp->as != *as)
1003 {
1004 *as = peer->as;
1005 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT;
1006 }
1007 }
1008 else
1009 {
1010 if (bgp->as == *as)
1011 {
1012 *as = peer->as;
1013 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT;
1014 }
1015 }
1016 }
1017
1018 /* Existing peer's AS number change. */
1019 if (peer->as != *as)
1020 peer_as_change (peer, *as);
1021 }
1022 else
1023 {
1024
1025 /* If the peer is not part of our confederation, and its not an
1026 iBGP peer then spoof the source AS */
1027 if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION)
1028 && ! bgp_confederation_peers_check (bgp, *as)
1029 && bgp->as != *as)
1030 local_as = bgp->confed_id;
1031 else
1032 local_as = bgp->as;
1033
1034 /* If this is IPv4 unicast configuration and "no bgp default
1035 ipv4-unicast" is specified. */
1036
1037 if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4)
1038 && afi == AFI_IP && safi == SAFI_UNICAST)
1039 peer = peer_create (su, bgp, local_as, *as, 0, 0);
1040 else
1041 peer = peer_create (su, bgp, local_as, *as, afi, safi);
1042 }
1043
1044 return 0;
1045 }
1046
1047 /* Activate the peer or peer group for specified AFI and SAFI. */
1048 int
1049 peer_activate (struct peer *peer, afi_t afi, safi_t safi)
1050 {
1051 int active;
1052
1053 if (peer->afc[afi][safi])
1054 return 0;
1055
1056 /* Activate the address family configuration. */
1057 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
1058 peer->afc[afi][safi] = 1;
1059 else
1060 {
1061 active = peer_active (peer);
1062
1063 peer->afc[afi][safi] = 1;
1064
1065 if (! active && peer_active (peer))
1066 bgp_timer_set (peer);
1067 else
1068 {
1069 if (peer->status == Established)
1070 {
1071 if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
1072 {
1073 peer->afc_adv[afi][safi] = 1;
1074 bgp_capability_send (peer, afi, safi,
1075 CAPABILITY_CODE_MP,
1076 CAPABILITY_ACTION_SET);
1077 if (peer->afc_recv[afi][safi])
1078 {
1079 peer->afc_nego[afi][safi] = 1;
1080 bgp_announce_route (peer, afi, safi);
1081 }
1082 }
1083 else
1084 {
1085 peer->last_reset = PEER_DOWN_AF_ACTIVATE;
1086 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1087 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
1088 }
1089 }
1090 }
1091 }
1092 return 0;
1093 }
1094
1095 int
1096 peer_deactivate (struct peer *peer, afi_t afi, safi_t safi)
1097 {
1098 struct peer_group *group;
1099 struct peer *peer1;
1100 struct listnode *node, *nnode;
1101
1102 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
1103 {
1104 group = peer->group;
1105
1106 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
1107 {
1108 if (peer1->af_group[afi][safi])
1109 return BGP_ERR_PEER_GROUP_MEMBER_EXISTS;
1110 }
1111 }
1112 else
1113 {
1114 if (peer->af_group[afi][safi])
1115 return BGP_ERR_PEER_BELONGS_TO_GROUP;
1116 }
1117
1118 if (! peer->afc[afi][safi])
1119 return 0;
1120
1121 /* De-activate the address family configuration. */
1122 peer->afc[afi][safi] = 0;
1123 peer_af_flag_reset (peer, afi, safi);
1124
1125 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
1126 {
1127 if (peer->status == Established)
1128 {
1129 if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
1130 {
1131 peer->afc_adv[afi][safi] = 0;
1132 peer->afc_nego[afi][safi] = 0;
1133
1134 if (peer_active_nego (peer))
1135 {
1136 bgp_capability_send (peer, afi, safi,
1137 CAPABILITY_CODE_MP,
1138 CAPABILITY_ACTION_UNSET);
1139 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
1140 peer->pcount[afi][safi] = 0;
1141 }
1142 else
1143 {
1144 peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
1145 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1146 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
1147 }
1148 }
1149 else
1150 {
1151 peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
1152 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1153 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
1154 }
1155 }
1156 }
1157 return 0;
1158 }
1159
1160 static void
1161 peer_nsf_stop (struct peer *peer)
1162 {
1163 afi_t afi;
1164 safi_t safi;
1165
1166 UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
1167 UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
1168
1169 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1170 for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
1171 peer->nsf[afi][safi] = 0;
1172
1173 if (peer->t_gr_restart)
1174 {
1175 BGP_TIMER_OFF (peer->t_gr_restart);
1176 if (BGP_DEBUG (events, EVENTS))
1177 zlog_debug ("%s graceful restart timer stopped", peer->host);
1178 }
1179 if (peer->t_gr_stale)
1180 {
1181 BGP_TIMER_OFF (peer->t_gr_stale);
1182 if (BGP_DEBUG (events, EVENTS))
1183 zlog_debug ("%s graceful restart stalepath timer stopped", peer->host);
1184 }
1185 bgp_clear_route_all (peer);
1186 }
1187
1188 /* Delete peer from confguration.
1189 *
1190 * The peer is moved to a dead-end "Deleted" neighbour-state, to allow
1191 * it to "cool off" and refcounts to hit 0, at which state it is freed.
1192 *
1193 * This function /should/ take care to be idempotent, to guard against
1194 * it being called multiple times through stray events that come in
1195 * that happen to result in this function being called again. That
1196 * said, getting here for a "Deleted" peer is a bug in the neighbour
1197 * FSM.
1198 */
1199 int
1200 peer_delete (struct peer *peer)
1201 {
1202 int i;
1203 afi_t afi;
1204 safi_t safi;
1205 struct bgp *bgp;
1206 struct bgp_filter *filter;
1207 struct listnode *pn;
1208
1209 assert (peer->status != Deleted);
1210
1211 bgp = peer->bgp;
1212
1213 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
1214 peer_nsf_stop (peer);
1215
1216 /* If this peer belongs to peer group, clear up the
1217 relationship. */
1218 if (peer->group)
1219 {
1220 if ((pn = listnode_lookup (peer->group->peer, peer)))
1221 {
1222 peer = peer_unlock (peer); /* group->peer list reference */
1223 list_delete_node (peer->group->peer, pn);
1224 }
1225 peer->group = NULL;
1226 }
1227
1228 /* Withdraw all information from routing table. We can not use
1229 * BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1230 * executed after peer structure is deleted.
1231 */
1232 peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
1233 bgp_stop (peer);
1234 bgp_fsm_change_status (peer, Deleted);
1235
1236 /* Password configuration */
1237 if (peer->password)
1238 {
1239 XFREE (MTYPE_PEER_PASSWORD, peer->password);
1240 peer->password = NULL;
1241
1242 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
1243 bgp_md5_set (peer);
1244 }
1245
1246 bgp_timer_set (peer); /* stops all timers for Deleted */
1247
1248 /* Delete from all peer list. */
1249 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
1250 && (pn = listnode_lookup (bgp->peer, peer)))
1251 {
1252 peer_unlock (peer); /* bgp peer list reference */
1253 list_delete_node (bgp->peer, pn);
1254 }
1255
1256 if (peer_rsclient_active (peer)
1257 && (pn = listnode_lookup (bgp->rsclient, peer)))
1258 {
1259 peer_unlock (peer); /* rsclient list reference */
1260 list_delete_node (bgp->rsclient, pn);
1261
1262 /* Clear our own rsclient ribs. */
1263 for (afi = AFI_IP; afi < AFI_MAX; afi++)
1264 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
1265 if (CHECK_FLAG(peer->af_flags[afi][safi],
1266 PEER_FLAG_RSERVER_CLIENT))
1267 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_MY_RSCLIENT);
1268 }
1269
1270 /* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
1271 member of a peer_group. */
1272 for (afi = AFI_IP; afi < AFI_MAX; afi++)
1273 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
1274 if (peer->rib[afi][safi] && ! peer->af_group[afi][safi])
1275 bgp_table_finish (&peer->rib[afi][safi]);
1276
1277 /* Buffers. */
1278 if (peer->ibuf)
1279 stream_free (peer->ibuf);
1280 if (peer->obuf)
1281 stream_fifo_free (peer->obuf);
1282 if (peer->work)
1283 stream_free (peer->work);
1284 if (peer->scratch)
1285 stream_free(peer->scratch);
1286 peer->obuf = NULL;
1287 peer->work = peer->scratch = peer->ibuf = NULL;
1288
1289 /* Local and remote addresses. */
1290 if (peer->su_local)
1291 sockunion_free (peer->su_local);
1292 if (peer->su_remote)
1293 sockunion_free (peer->su_remote);
1294 peer->su_local = peer->su_remote = NULL;
1295
1296 /* Free filter related memory. */
1297 for (afi = AFI_IP; afi < AFI_MAX; afi++)
1298 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
1299 {
1300 filter = &peer->filter[afi][safi];
1301
1302 for (i = FILTER_IN; i < FILTER_MAX; i++)
1303 {
1304 if (filter->dlist[i].name)
1305 free (filter->dlist[i].name);
1306 if (filter->plist[i].name)
1307 free (filter->plist[i].name);
1308 if (filter->aslist[i].name)
1309 free (filter->aslist[i].name);
1310
1311 filter->dlist[i].name = NULL;
1312 filter->plist[i].name = NULL;
1313 filter->aslist[i].name = NULL;
1314 }
1315 for (i = RMAP_IN; i < RMAP_MAX; i++)
1316 {
1317 if (filter->map[i].name)
1318 free (filter->map[i].name);
1319 filter->map[i].name = NULL;
1320 }
1321
1322 if (filter->usmap.name)
1323 free (filter->usmap.name);
1324
1325 if (peer->default_rmap[afi][safi].name)
1326 free (peer->default_rmap[afi][safi].name);
1327
1328 filter->usmap.name = NULL;
1329 peer->default_rmap[afi][safi].name = NULL;
1330 }
1331
1332 peer_unlock (peer); /* initial reference */
1333
1334 return 0;
1335 }
1336
1337 static int
1338 peer_group_cmp (struct peer_group *g1, struct peer_group *g2)
1339 {
1340 return strcmp (g1->name, g2->name);
1341 }
1342
1343 /* If peer is configured at least one address family return 1. */
1344 static int
1345 peer_group_active (struct peer *peer)
1346 {
1347 if (peer->af_group[AFI_IP][SAFI_UNICAST]
1348 || peer->af_group[AFI_IP][SAFI_MULTICAST]
1349 || peer->af_group[AFI_IP][SAFI_MPLS_VPN]
1350 || peer->af_group[AFI_IP6][SAFI_UNICAST]
1351 || peer->af_group[AFI_IP6][SAFI_MULTICAST])
1352 return 1;
1353 return 0;
1354 }
1355
1356 /* Peer group cofiguration. */
1357 static struct peer_group *
1358 peer_group_new (void)
1359 {
1360 return (struct peer_group *) XCALLOC (MTYPE_PEER_GROUP,
1361 sizeof (struct peer_group));
1362 }
1363
1364 static void
1365 peer_group_free (struct peer_group *group)
1366 {
1367 XFREE (MTYPE_PEER_GROUP, group);
1368 }
1369
1370 struct peer_group *
1371 peer_group_lookup (struct bgp *bgp, const char *name)
1372 {
1373 struct peer_group *group;
1374 struct listnode *node, *nnode;
1375
1376 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
1377 {
1378 if (strcmp (group->name, name) == 0)
1379 return group;
1380 }
1381 return NULL;
1382 }
1383
1384 struct peer_group *
1385 peer_group_get (struct bgp *bgp, const char *name)
1386 {
1387 struct peer_group *group;
1388
1389 group = peer_group_lookup (bgp, name);
1390 if (group)
1391 return group;
1392
1393 group = peer_group_new ();
1394 group->bgp = bgp;
1395 group->name = strdup (name);
1396 group->peer = list_new ();
1397 group->conf = peer_new (bgp);
1398 if (! bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
1399 group->conf->afc[AFI_IP][SAFI_UNICAST] = 1;
1400 group->conf->host = XSTRDUP (MTYPE_BGP_PEER_HOST, name);
1401 group->conf->group = group;
1402 group->conf->as = 0;
1403 group->conf->ttl = 1;
1404 group->conf->gtsm_hops = 0;
1405 group->conf->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
1406 UNSET_FLAG (group->conf->config, PEER_CONFIG_TIMER);
1407 UNSET_FLAG (group->conf->config, PEER_CONFIG_CONNECT);
1408 group->conf->keepalive = 0;
1409 group->conf->holdtime = 0;
1410 group->conf->connect = 0;
1411 SET_FLAG (group->conf->sflags, PEER_STATUS_GROUP);
1412 listnode_add_sort (bgp->group, group);
1413
1414 return 0;
1415 }
1416
1417 static void
1418 peer_group2peer_config_copy (struct peer_group *group, struct peer *peer,
1419 afi_t afi, safi_t safi)
1420 {
1421 int in = FILTER_IN;
1422 int out = FILTER_OUT;
1423 struct peer *conf;
1424 struct bgp_filter *pfilter;
1425 struct bgp_filter *gfilter;
1426
1427 conf = group->conf;
1428 pfilter = &peer->filter[afi][safi];
1429 gfilter = &conf->filter[afi][safi];
1430
1431 /* remote-as */
1432 if (conf->as)
1433 peer->as = conf->as;
1434
1435 /* remote-as */
1436 if (conf->change_local_as)
1437 peer->change_local_as = conf->change_local_as;
1438
1439 /* TTL */
1440 peer->ttl = conf->ttl;
1441
1442 /* GTSM hops */
1443 peer->gtsm_hops = conf->gtsm_hops;
1444
1445 /* Weight */
1446 peer->weight = conf->weight;
1447
1448 /* peer flags apply */
1449 peer->flags = conf->flags;
1450 /* peer af_flags apply */
1451 peer->af_flags[afi][safi] = conf->af_flags[afi][safi];
1452 /* peer config apply */
1453 peer->config = conf->config;
1454
1455 /* peer timers apply */
1456 peer->holdtime = conf->holdtime;
1457 peer->keepalive = conf->keepalive;
1458 peer->connect = conf->connect;
1459 if (CHECK_FLAG (conf->config, PEER_CONFIG_CONNECT))
1460 peer->v_connect = conf->connect;
1461 else
1462 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
1463
1464 /* advertisement-interval reset */
1465 if (CHECK_FLAG (conf->config, PEER_CONFIG_ROUTEADV))
1466 peer->v_routeadv = conf->routeadv;
1467 else
1468 if (peer_sort (peer) == BGP_PEER_IBGP)
1469 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
1470 else
1471 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
1472
1473 /* password apply */
1474 if (conf->password && !peer->password)
1475 peer->password = XSTRDUP (MTYPE_PEER_PASSWORD, conf->password);
1476
1477 bgp_md5_set (peer);
1478
1479 /* maximum-prefix */
1480 peer->pmax[afi][safi] = conf->pmax[afi][safi];
1481 peer->pmax_threshold[afi][safi] = conf->pmax_threshold[afi][safi];
1482 peer->pmax_restart[afi][safi] = conf->pmax_restart[afi][safi];
1483
1484 /* allowas-in */
1485 peer->allowas_in[afi][safi] = conf->allowas_in[afi][safi];
1486
1487 /* route-server-client */
1488 if (CHECK_FLAG(conf->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
1489 {
1490 /* Make peer's RIB point to group's RIB. */
1491 peer->rib[afi][safi] = group->conf->rib[afi][safi];
1492
1493 /* Import policy. */
1494 if (pfilter->map[RMAP_IMPORT].name)
1495 free (pfilter->map[RMAP_IMPORT].name);
1496 if (gfilter->map[RMAP_IMPORT].name)
1497 {
1498 pfilter->map[RMAP_IMPORT].name = strdup (gfilter->map[RMAP_IMPORT].name);
1499 pfilter->map[RMAP_IMPORT].map = gfilter->map[RMAP_IMPORT].map;
1500 }
1501 else
1502 {
1503 pfilter->map[RMAP_IMPORT].name = NULL;
1504 pfilter->map[RMAP_IMPORT].map = NULL;
1505 }
1506
1507 /* Export policy. */
1508 if (gfilter->map[RMAP_EXPORT].name && ! pfilter->map[RMAP_EXPORT].name)
1509 {
1510 pfilter->map[RMAP_EXPORT].name = strdup (gfilter->map[RMAP_EXPORT].name);
1511 pfilter->map[RMAP_EXPORT].map = gfilter->map[RMAP_EXPORT].map;
1512 }
1513 }
1514
1515 /* default-originate route-map */
1516 if (conf->default_rmap[afi][safi].name)
1517 {
1518 if (peer->default_rmap[afi][safi].name)
1519 free (peer->default_rmap[afi][safi].name);
1520 peer->default_rmap[afi][safi].name = strdup (conf->default_rmap[afi][safi].name);
1521 peer->default_rmap[afi][safi].map = conf->default_rmap[afi][safi].map;
1522 }
1523
1524 /* update-source apply */
1525 if (conf->update_source)
1526 {
1527 if (peer->update_source)
1528 sockunion_free (peer->update_source);
1529 if (peer->update_if)
1530 {
1531 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
1532 peer->update_if = NULL;
1533 }
1534 peer->update_source = sockunion_dup (conf->update_source);
1535 }
1536 else if (conf->update_if)
1537 {
1538 if (peer->update_if)
1539 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
1540 if (peer->update_source)
1541 {
1542 sockunion_free (peer->update_source);
1543 peer->update_source = NULL;
1544 }
1545 peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, conf->update_if);
1546 }
1547
1548 /* inbound filter apply */
1549 if (gfilter->dlist[in].name && ! pfilter->dlist[in].name)
1550 {
1551 if (pfilter->dlist[in].name)
1552 free (pfilter->dlist[in].name);
1553 pfilter->dlist[in].name = strdup (gfilter->dlist[in].name);
1554 pfilter->dlist[in].alist = gfilter->dlist[in].alist;
1555 }
1556 if (gfilter->plist[in].name && ! pfilter->plist[in].name)
1557 {
1558 if (pfilter->plist[in].name)
1559 free (pfilter->plist[in].name);
1560 pfilter->plist[in].name = strdup (gfilter->plist[in].name);
1561 pfilter->plist[in].plist = gfilter->plist[in].plist;
1562 }
1563 if (gfilter->aslist[in].name && ! pfilter->aslist[in].name)
1564 {
1565 if (pfilter->aslist[in].name)
1566 free (pfilter->aslist[in].name);
1567 pfilter->aslist[in].name = strdup (gfilter->aslist[in].name);
1568 pfilter->aslist[in].aslist = gfilter->aslist[in].aslist;
1569 }
1570 if (gfilter->map[RMAP_IN].name && ! pfilter->map[RMAP_IN].name)
1571 {
1572 if (pfilter->map[RMAP_IN].name)
1573 free (pfilter->map[RMAP_IN].name);
1574 pfilter->map[RMAP_IN].name = strdup (gfilter->map[RMAP_IN].name);
1575 pfilter->map[RMAP_IN].map = gfilter->map[RMAP_IN].map;
1576 }
1577
1578 /* outbound filter apply */
1579 if (gfilter->dlist[out].name)
1580 {
1581 if (pfilter->dlist[out].name)
1582 free (pfilter->dlist[out].name);
1583 pfilter->dlist[out].name = strdup (gfilter->dlist[out].name);
1584 pfilter->dlist[out].alist = gfilter->dlist[out].alist;
1585 }
1586 else
1587 {
1588 if (pfilter->dlist[out].name)
1589 free (pfilter->dlist[out].name);
1590 pfilter->dlist[out].name = NULL;
1591 pfilter->dlist[out].alist = NULL;
1592 }
1593 if (gfilter->plist[out].name)
1594 {
1595 if (pfilter->plist[out].name)
1596 free (pfilter->plist[out].name);
1597 pfilter->plist[out].name = strdup (gfilter->plist[out].name);
1598 pfilter->plist[out].plist = gfilter->plist[out].plist;
1599 }
1600 else
1601 {
1602 if (pfilter->plist[out].name)
1603 free (pfilter->plist[out].name);
1604 pfilter->plist[out].name = NULL;
1605 pfilter->plist[out].plist = NULL;
1606 }
1607 if (gfilter->aslist[out].name)
1608 {
1609 if (pfilter->aslist[out].name)
1610 free (pfilter->aslist[out].name);
1611 pfilter->aslist[out].name = strdup (gfilter->aslist[out].name);
1612 pfilter->aslist[out].aslist = gfilter->aslist[out].aslist;
1613 }
1614 else
1615 {
1616 if (pfilter->aslist[out].name)
1617 free (pfilter->aslist[out].name);
1618 pfilter->aslist[out].name = NULL;
1619 pfilter->aslist[out].aslist = NULL;
1620 }
1621 if (gfilter->map[RMAP_OUT].name)
1622 {
1623 if (pfilter->map[RMAP_OUT].name)
1624 free (pfilter->map[RMAP_OUT].name);
1625 pfilter->map[RMAP_OUT].name = strdup (gfilter->map[RMAP_OUT].name);
1626 pfilter->map[RMAP_OUT].map = gfilter->map[RMAP_OUT].map;
1627 }
1628 else
1629 {
1630 if (pfilter->map[RMAP_OUT].name)
1631 free (pfilter->map[RMAP_OUT].name);
1632 pfilter->map[RMAP_OUT].name = NULL;
1633 pfilter->map[RMAP_OUT].map = NULL;
1634 }
1635
1636 /* RS-client's import/export route-maps. */
1637 if (gfilter->map[RMAP_IMPORT].name)
1638 {
1639 if (pfilter->map[RMAP_IMPORT].name)
1640 free (pfilter->map[RMAP_IMPORT].name);
1641 pfilter->map[RMAP_IMPORT].name = strdup (gfilter->map[RMAP_IMPORT].name);
1642 pfilter->map[RMAP_IMPORT].map = gfilter->map[RMAP_IMPORT].map;
1643 }
1644 else
1645 {
1646 if (pfilter->map[RMAP_IMPORT].name)
1647 free (pfilter->map[RMAP_IMPORT].name);
1648 pfilter->map[RMAP_IMPORT].name = NULL;
1649 pfilter->map[RMAP_IMPORT].map = NULL;
1650 }
1651 if (gfilter->map[RMAP_EXPORT].name && ! pfilter->map[RMAP_EXPORT].name)
1652 {
1653 if (pfilter->map[RMAP_EXPORT].name)
1654 free (pfilter->map[RMAP_EXPORT].name);
1655 pfilter->map[RMAP_EXPORT].name = strdup (gfilter->map[RMAP_EXPORT].name);
1656 pfilter->map[RMAP_EXPORT].map = gfilter->map[RMAP_EXPORT].map;
1657 }
1658
1659 if (gfilter->usmap.name)
1660 {
1661 if (pfilter->usmap.name)
1662 free (pfilter->usmap.name);
1663 pfilter->usmap.name = strdup (gfilter->usmap.name);
1664 pfilter->usmap.map = gfilter->usmap.map;
1665 }
1666 else
1667 {
1668 if (pfilter->usmap.name)
1669 free (pfilter->usmap.name);
1670 pfilter->usmap.name = NULL;
1671 pfilter->usmap.map = NULL;
1672 }
1673 }
1674
1675 /* Peer group's remote AS configuration. */
1676 int
1677 peer_group_remote_as (struct bgp *bgp, const char *group_name, as_t *as)
1678 {
1679 struct peer_group *group;
1680 struct peer *peer;
1681 struct listnode *node, *nnode;
1682
1683 group = peer_group_lookup (bgp, group_name);
1684 if (! group)
1685 return -1;
1686
1687 if (group->conf->as == *as)
1688 return 0;
1689
1690 /* When we setup peer-group AS number all peer group member's AS
1691 number must be updated to same number. */
1692 peer_as_change (group->conf, *as);
1693
1694 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
1695 {
1696 if (peer->as != *as)
1697 peer_as_change (peer, *as);
1698 }
1699
1700 return 0;
1701 }
1702
1703 int
1704 peer_group_delete (struct peer_group *group)
1705 {
1706 struct bgp *bgp;
1707 struct peer *peer;
1708 struct listnode *node, *nnode;
1709
1710 bgp = group->bgp;
1711
1712 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
1713 {
1714 peer->group = NULL;
1715 peer_delete (peer);
1716 }
1717 list_delete (group->peer);
1718
1719 free (group->name);
1720 group->name = NULL;
1721
1722 group->conf->group = NULL;
1723 peer_delete (group->conf);
1724
1725 /* Delete from all peer_group list. */
1726 listnode_delete (bgp->group, group);
1727
1728 peer_group_free (group);
1729
1730 return 0;
1731 }
1732
1733 int
1734 peer_group_remote_as_delete (struct peer_group *group)
1735 {
1736 struct peer *peer;
1737 struct listnode *node, *nnode;
1738
1739 if (! group->conf->as)
1740 return 0;
1741
1742 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
1743 {
1744 peer->group = NULL;
1745 peer_delete (peer);
1746 }
1747 list_delete_all_node (group->peer);
1748
1749 group->conf->as = 0;
1750
1751 return 0;
1752 }
1753
1754 /* Bind specified peer to peer group. */
1755 int
1756 peer_group_bind (struct bgp *bgp, union sockunion *su,
1757 struct peer_group *group, afi_t afi, safi_t safi, as_t *as)
1758 {
1759 struct peer *peer;
1760 int first_member = 0;
1761
1762 /* Check peer group's address family. */
1763 if (! group->conf->afc[afi][safi])
1764 return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED;
1765
1766 /* Lookup the peer. */
1767 peer = peer_lookup (bgp, su);
1768
1769 /* Create a new peer. */
1770 if (! peer)
1771 {
1772 if (! group->conf->as)
1773 return BGP_ERR_PEER_GROUP_NO_REMOTE_AS;
1774
1775 peer = peer_create (su, bgp, bgp->as, group->conf->as, afi, safi);
1776 peer->group = group;
1777 peer->af_group[afi][safi] = 1;
1778
1779 peer = peer_lock (peer); /* group->peer list reference */
1780 listnode_add (group->peer, peer);
1781 peer_group2peer_config_copy (group, peer, afi, safi);
1782
1783 return 0;
1784 }
1785
1786 /* When the peer already belongs to peer group, check the consistency. */
1787 if (peer->af_group[afi][safi])
1788 {
1789 if (strcmp (peer->group->name, group->name) != 0)
1790 return BGP_ERR_PEER_GROUP_CANT_CHANGE;
1791
1792 return 0;
1793 }
1794
1795 /* Check current peer group configuration. */
1796 if (peer_group_active (peer)
1797 && strcmp (peer->group->name, group->name) != 0)
1798 return BGP_ERR_PEER_GROUP_MISMATCH;
1799
1800 if (! group->conf->as)
1801 {
1802 if (peer_sort (group->conf) != BGP_PEER_INTERNAL
1803 && peer_sort (group->conf) != peer_sort (peer))
1804 {
1805 if (as)
1806 *as = peer->as;
1807 return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT;
1808 }
1809
1810 if (peer_sort (group->conf) == BGP_PEER_INTERNAL)
1811 first_member = 1;
1812 }
1813
1814 peer->af_group[afi][safi] = 1;
1815 peer->afc[afi][safi] = 1;
1816 if (! peer->group)
1817 {
1818 peer->group = group;
1819
1820 peer = peer_lock (peer); /* group->peer list reference */
1821 listnode_add (group->peer, peer);
1822 }
1823 else
1824 assert (group && peer->group == group);
1825
1826 if (first_member)
1827 {
1828 /* Advertisement-interval reset */
1829 if (! CHECK_FLAG (group->conf->config, PEER_CONFIG_ROUTEADV))
1830 if (peer_sort (group->conf) == BGP_PEER_IBGP)
1831 group->conf->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
1832 else
1833 group->conf->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
1834
1835 /* ebgp-multihop reset */
1836 if (peer_sort (group->conf) == BGP_PEER_IBGP)
1837 group->conf->ttl = 255;
1838
1839 /* local-as reset */
1840 if (peer_sort (group->conf) != BGP_PEER_EBGP)
1841 {
1842 group->conf->change_local_as = 0;
1843 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
1844 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
1845 }
1846 }
1847
1848 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
1849 {
1850 struct listnode *pn;
1851
1852 /* If it's not configured as RSERVER_CLIENT in any other address
1853 family, without being member of a peer_group, remove it from
1854 list bgp->rsclient.*/
1855 if (! peer_rsclient_active (peer)
1856 && (pn = listnode_lookup (bgp->rsclient, peer)))
1857 {
1858 peer_unlock (peer); /* peer rsclient reference */
1859 list_delete_node (bgp->rsclient, pn);
1860
1861 /* Clear our own rsclient rib for this afi/safi. */
1862 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_MY_RSCLIENT);
1863 }
1864
1865 bgp_table_finish (&peer->rib[afi][safi]);
1866
1867 /* Import policy. */
1868 if (peer->filter[afi][safi].map[RMAP_IMPORT].name)
1869 {
1870 free (peer->filter[afi][safi].map[RMAP_IMPORT].name);
1871 peer->filter[afi][safi].map[RMAP_IMPORT].name = NULL;
1872 peer->filter[afi][safi].map[RMAP_IMPORT].map = NULL;
1873 }
1874
1875 /* Export policy. */
1876 if (! CHECK_FLAG(group->conf->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
1877 && peer->filter[afi][safi].map[RMAP_EXPORT].name)
1878 {
1879 free (peer->filter[afi][safi].map[RMAP_EXPORT].name);
1880 peer->filter[afi][safi].map[RMAP_EXPORT].name = NULL;
1881 peer->filter[afi][safi].map[RMAP_EXPORT].map = NULL;
1882 }
1883 }
1884
1885 peer_group2peer_config_copy (group, peer, afi, safi);
1886
1887 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
1888 {
1889 peer->last_reset = PEER_DOWN_RMAP_BIND;
1890 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1891 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
1892 }
1893 else
1894 BGP_EVENT_ADD (peer, BGP_Stop);
1895
1896 return 0;
1897 }
1898
1899 int
1900 peer_group_unbind (struct bgp *bgp, struct peer *peer,
1901 struct peer_group *group, afi_t afi, safi_t safi)
1902 {
1903 if (! peer->af_group[afi][safi])
1904 return 0;
1905
1906 if (group != peer->group)
1907 return BGP_ERR_PEER_GROUP_MISMATCH;
1908
1909 peer->af_group[afi][safi] = 0;
1910 peer->afc[afi][safi] = 0;
1911 peer_af_flag_reset (peer, afi, safi);
1912
1913 if (peer->rib[afi][safi])
1914 peer->rib[afi][safi] = NULL;
1915
1916 if (! peer_group_active (peer))
1917 {
1918 assert (listnode_lookup (group->peer, peer));
1919 peer_unlock (peer); /* peer group list reference */
1920 listnode_delete (group->peer, peer);
1921 peer->group = NULL;
1922 if (group->conf->as)
1923 {
1924 peer_delete (peer);
1925 return 0;
1926 }
1927 peer_global_config_reset (peer);
1928 }
1929
1930 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
1931 {
1932 peer->last_reset = PEER_DOWN_RMAP_UNBIND;
1933 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1934 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
1935 }
1936 else
1937 BGP_EVENT_ADD (peer, BGP_Stop);
1938
1939 return 0;
1940 }
1941
1942 static int
1943 bgp_startup_timer_expire (struct thread *thread)
1944 {
1945 struct bgp *bgp;
1946
1947 bgp = THREAD_ARG (thread);
1948 bgp->t_startup = NULL;
1949
1950 return 0;
1951 }
1952
1953
1954 /* BGP instance creation by `router bgp' commands. */
1955 static struct bgp *
1956 bgp_create (as_t *as, const char *name)
1957 {
1958 struct bgp *bgp;
1959 afi_t afi;
1960 safi_t safi;
1961
1962 if ( (bgp = XCALLOC (MTYPE_BGP, sizeof (struct bgp))) == NULL)
1963 return NULL;
1964
1965 bgp_lock (bgp);
1966 bgp->peer_self = peer_new (bgp);
1967 bgp->peer_self->host = XSTRDUP (MTYPE_BGP_PEER_HOST, "Static announcement");
1968
1969 bgp->peer = list_new ();
1970 bgp->peer->cmp = (int (*)(void *, void *)) peer_cmp;
1971
1972 bgp->group = list_new ();
1973 bgp->group->cmp = (int (*)(void *, void *)) peer_group_cmp;
1974
1975 bgp->rsclient = list_new ();
1976 bgp->rsclient->cmp = (int (*)(void*, void*)) peer_cmp;
1977
1978 for (afi = AFI_IP; afi < AFI_MAX; afi++)
1979 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
1980 {
1981 bgp->route[afi][safi] = bgp_table_init (afi, safi);
1982 bgp->aggregate[afi][safi] = bgp_table_init (afi, safi);
1983 bgp->rib[afi][safi] = bgp_table_init (afi, safi);
1984 bgp->maxpaths[afi][safi].maxpaths_ebgp = BGP_DEFAULT_MAXPATHS;
1985 bgp->maxpaths[afi][safi].maxpaths_ibgp = BGP_DEFAULT_MAXPATHS;
1986 }
1987
1988 bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
1989 bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
1990 bgp->default_holdtime = BGP_DEFAULT_HOLDTIME;
1991 bgp->default_keepalive = BGP_DEFAULT_KEEPALIVE;
1992 bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
1993 bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
1994
1995 bgp->as = *as;
1996
1997 if (name)
1998 bgp->name = strdup (name);
1999
2000 bgp->wpkt_quanta = BGP_WRITE_PACKET_MAX;
2001
2002 THREAD_TIMER_ON (master, bgp->t_startup, bgp_startup_timer_expire,
2003 bgp, bgp->restart_time);
2004
2005 return bgp;
2006 }
2007
2008 /* Return first entry of BGP. */
2009 struct bgp *
2010 bgp_get_default (void)
2011 {
2012 if (bm->bgp->head)
2013 return (listgetdata (listhead (bm->bgp)));
2014 return NULL;
2015 }
2016
2017 /* Lookup BGP entry. */
2018 struct bgp *
2019 bgp_lookup (as_t as, const char *name)
2020 {
2021 struct bgp *bgp;
2022 struct listnode *node, *nnode;
2023
2024 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
2025 if (bgp->as == as
2026 && ((bgp->name == NULL && name == NULL)
2027 || (bgp->name && name && strcmp (bgp->name, name) == 0)))
2028 return bgp;
2029 return NULL;
2030 }
2031
2032 /* Lookup BGP structure by view name. */
2033 struct bgp *
2034 bgp_lookup_by_name (const char *name)
2035 {
2036 struct bgp *bgp;
2037 struct listnode *node, *nnode;
2038
2039 for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
2040 if ((bgp->name == NULL && name == NULL)
2041 || (bgp->name && name && strcmp (bgp->name, name) == 0))
2042 return bgp;
2043 return NULL;
2044 }
2045
2046 /* Called from VTY commands. */
2047 int
2048 bgp_get (struct bgp **bgp_val, as_t *as, const char *name)
2049 {
2050 struct bgp *bgp;
2051
2052 /* Multiple instance check. */
2053 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
2054 {
2055 if (name)
2056 bgp = bgp_lookup_by_name (name);
2057 else
2058 bgp = bgp_get_default ();
2059
2060 /* Already exists. */
2061 if (bgp)
2062 {
2063 if (bgp->as != *as)
2064 {
2065 *as = bgp->as;
2066 return BGP_ERR_INSTANCE_MISMATCH;
2067 }
2068 *bgp_val = bgp;
2069 return 0;
2070 }
2071 }
2072 else
2073 {
2074 /* BGP instance name can not be specified for single instance. */
2075 if (name)
2076 return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET;
2077
2078 /* Get default BGP structure if exists. */
2079 bgp = bgp_get_default ();
2080
2081 if (bgp)
2082 {
2083 if (bgp->as != *as)
2084 {
2085 *as = bgp->as;
2086 return BGP_ERR_AS_MISMATCH;
2087 }
2088 *bgp_val = bgp;
2089 return 0;
2090 }
2091 }
2092
2093 bgp = bgp_create (as, name);
2094 bgp_router_id_set(bgp, &router_id_zebra);
2095 *bgp_val = bgp;
2096
2097 /* Create BGP server socket, if first instance. */
2098 if (list_isempty(bm->bgp)
2099 && !bgp_option_check (BGP_OPT_NO_LISTEN))
2100 {
2101 if (bgp_socket (bm->port, bm->address) < 0)
2102 return BGP_ERR_INVALID_VALUE;
2103 }
2104
2105 listnode_add (bm->bgp, bgp);
2106
2107 return 0;
2108 }
2109
2110 /* Delete BGP instance. */
2111 int
2112 bgp_delete (struct bgp *bgp)
2113 {
2114 struct peer *peer;
2115 struct peer_group *group;
2116 struct listnode *node;
2117 struct listnode *next;
2118 afi_t afi;
2119 int i;
2120
2121 /* Delete static route. */
2122 bgp_static_delete (bgp);
2123
2124 /* Unset redistribution. */
2125 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2126 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
2127 if (i != ZEBRA_ROUTE_BGP)
2128 bgp_redistribute_unset (bgp, afi, i);
2129
2130 for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
2131 {
2132 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2133 {
2134 /* Send notify to remote peer. */
2135 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
2136 }
2137
2138 peer_delete (peer);
2139 }
2140
2141 for (ALL_LIST_ELEMENTS (bgp->group, node, next, group))
2142 {
2143 for (ALL_LIST_ELEMENTS (group->peer, node, next, peer))
2144 {
2145 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2146 {
2147 /* Send notify to remote peer. */
2148 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
2149 }
2150 }
2151 peer_group_delete (group);
2152 }
2153
2154 assert (listcount (bgp->rsclient) == 0);
2155
2156 if (bgp->peer_self) {
2157 peer_delete(bgp->peer_self);
2158 bgp->peer_self = NULL;
2159 }
2160
2161 /* Remove visibility via the master list - there may however still be
2162 * routes to be processed still referencing the struct bgp.
2163 */
2164 listnode_delete (bm->bgp, bgp);
2165 if (list_isempty(bm->bgp))
2166 bgp_close ();
2167
2168 bgp_unlock(bgp); /* initial reference */
2169
2170 return 0;
2171 }
2172
2173 static void bgp_free (struct bgp *);
2174
2175 void
2176 bgp_lock (struct bgp *bgp)
2177 {
2178 ++bgp->lock;
2179 }
2180
2181 void
2182 bgp_unlock(struct bgp *bgp)
2183 {
2184 assert(bgp->lock > 0);
2185 if (--bgp->lock == 0)
2186 bgp_free (bgp);
2187 }
2188
2189 static void
2190 bgp_free (struct bgp *bgp)
2191 {
2192 afi_t afi;
2193 safi_t safi;
2194
2195 list_delete (bgp->group);
2196 list_delete (bgp->peer);
2197 list_delete (bgp->rsclient);
2198
2199 if (bgp->name)
2200 free (bgp->name);
2201
2202 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2203 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
2204 {
2205 if (bgp->route[afi][safi])
2206 bgp_table_finish (&bgp->route[afi][safi]);
2207 if (bgp->aggregate[afi][safi])
2208 bgp_table_finish (&bgp->aggregate[afi][safi]) ;
2209 if (bgp->rib[afi][safi])
2210 bgp_table_finish (&bgp->rib[afi][safi]);
2211 }
2212 XFREE (MTYPE_BGP, bgp);
2213 }
2214
2215 struct peer *
2216 peer_lookup (struct bgp *bgp, union sockunion *su)
2217 {
2218 struct peer *peer;
2219 struct listnode *node, *nnode;
2220
2221 if (bgp != NULL)
2222 {
2223 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
2224 if (sockunion_same (&peer->su, su)
2225 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
2226 return peer;
2227 }
2228 else if (bm->bgp != NULL)
2229 {
2230 struct listnode *bgpnode, *nbgpnode;
2231
2232 for (ALL_LIST_ELEMENTS (bm->bgp, bgpnode, nbgpnode, bgp))
2233 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
2234 if (sockunion_same (&peer->su, su)
2235 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
2236 return peer;
2237 }
2238 return NULL;
2239 }
2240
2241 struct peer *
2242 peer_lookup_with_open (union sockunion *su, as_t remote_as,
2243 struct in_addr *remote_id, int *as)
2244 {
2245 struct peer *peer;
2246 struct listnode *node;
2247 struct listnode *bgpnode;
2248 struct bgp *bgp;
2249
2250 if (! bm->bgp)
2251 return NULL;
2252
2253 for (ALL_LIST_ELEMENTS_RO (bm->bgp, bgpnode, bgp))
2254 {
2255 for (ALL_LIST_ELEMENTS_RO (bgp->peer, node, peer))
2256 {
2257 if (sockunion_same (&peer->su, su)
2258 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
2259 {
2260 if (peer->as == remote_as
2261 && peer->remote_id.s_addr == remote_id->s_addr)
2262 return peer;
2263 if (peer->as == remote_as)
2264 *as = 1;
2265 }
2266 }
2267
2268 for (ALL_LIST_ELEMENTS_RO (bgp->peer, node, peer))
2269 {
2270 if (sockunion_same (&peer->su, su)
2271 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
2272 {
2273 if (peer->as == remote_as
2274 && peer->remote_id.s_addr == 0)
2275 return peer;
2276 if (peer->as == remote_as)
2277 *as = 1;
2278 }
2279 }
2280 }
2281 return NULL;
2282 }
2283
2284 /* If peer is configured at least one address family return 1. */
2285 int
2286 peer_active (struct peer *peer)
2287 {
2288 if (peer->afc[AFI_IP][SAFI_UNICAST]
2289 || peer->afc[AFI_IP][SAFI_MULTICAST]
2290 || peer->afc[AFI_IP][SAFI_MPLS_VPN]
2291 || peer->afc[AFI_IP6][SAFI_UNICAST]
2292 || peer->afc[AFI_IP6][SAFI_MULTICAST])
2293 return 1;
2294 return 0;
2295 }
2296
2297 /* If peer is negotiated at least one address family return 1. */
2298 int
2299 peer_active_nego (struct peer *peer)
2300 {
2301 if (peer->afc_nego[AFI_IP][SAFI_UNICAST]
2302 || peer->afc_nego[AFI_IP][SAFI_MULTICAST]
2303 || peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
2304 || peer->afc_nego[AFI_IP6][SAFI_UNICAST]
2305 || peer->afc_nego[AFI_IP6][SAFI_MULTICAST])
2306 return 1;
2307 return 0;
2308 }
2309
2310 /* peer_flag_change_type. */
2311 enum peer_change_type
2312 {
2313 peer_change_none,
2314 peer_change_reset,
2315 peer_change_reset_in,
2316 peer_change_reset_out,
2317 };
2318
2319 static void
2320 peer_change_action (struct peer *peer, afi_t afi, safi_t safi,
2321 enum peer_change_type type)
2322 {
2323 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2324 return;
2325
2326 if (peer->status != Established)
2327 return;
2328
2329 if (type == peer_change_reset)
2330 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2331 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2332 else if (type == peer_change_reset_in)
2333 {
2334 if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
2335 || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
2336 bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
2337 else
2338 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2339 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2340 }
2341 else if (type == peer_change_reset_out)
2342 bgp_announce_route (peer, afi, safi);
2343 }
2344
2345 struct peer_flag_action
2346 {
2347 /* Peer's flag. */
2348 u_int32_t flag;
2349
2350 /* This flag can be set for peer-group member. */
2351 u_char not_for_member;
2352
2353 /* Action when the flag is changed. */
2354 enum peer_change_type type;
2355
2356 /* Peer down cause */
2357 u_char peer_down;
2358 };
2359
2360 static const struct peer_flag_action peer_flag_action_list[] =
2361 {
2362 { PEER_FLAG_PASSIVE, 0, peer_change_reset },
2363 { PEER_FLAG_SHUTDOWN, 0, peer_change_reset },
2364 { PEER_FLAG_DONT_CAPABILITY, 0, peer_change_none },
2365 { PEER_FLAG_OVERRIDE_CAPABILITY, 0, peer_change_none },
2366 { PEER_FLAG_STRICT_CAP_MATCH, 0, peer_change_none },
2367 { PEER_FLAG_DYNAMIC_CAPABILITY, 0, peer_change_reset },
2368 { PEER_FLAG_DISABLE_CONNECTED_CHECK, 0, peer_change_reset },
2369 { 0, 0, 0 }
2370 };
2371
2372 static const struct peer_flag_action peer_af_flag_action_list[] =
2373 {
2374 { PEER_FLAG_NEXTHOP_SELF, 1, peer_change_reset_out },
2375 { PEER_FLAG_SEND_COMMUNITY, 1, peer_change_reset_out },
2376 { PEER_FLAG_SEND_EXT_COMMUNITY, 1, peer_change_reset_out },
2377 { PEER_FLAG_SOFT_RECONFIG, 0, peer_change_reset_in },
2378 { PEER_FLAG_REFLECTOR_CLIENT, 1, peer_change_reset },
2379 { PEER_FLAG_RSERVER_CLIENT, 1, peer_change_reset },
2380 { PEER_FLAG_AS_PATH_UNCHANGED, 1, peer_change_reset_out },
2381 { PEER_FLAG_NEXTHOP_UNCHANGED, 1, peer_change_reset_out },
2382 { PEER_FLAG_MED_UNCHANGED, 1, peer_change_reset_out },
2383 { PEER_FLAG_REMOVE_PRIVATE_AS, 1, peer_change_reset_out },
2384 { PEER_FLAG_ALLOWAS_IN, 0, peer_change_reset_in },
2385 { PEER_FLAG_ORF_PREFIX_SM, 1, peer_change_reset },
2386 { PEER_FLAG_ORF_PREFIX_RM, 1, peer_change_reset },
2387 { PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED, 0, peer_change_reset_out },
2388 { PEER_FLAG_NEXTHOP_SELF_ALL, 1, peer_change_reset_out },
2389 { 0, 0, 0 }
2390 };
2391
2392 /* Proper action set. */
2393 static int
2394 peer_flag_action_set (const struct peer_flag_action *action_list, int size,
2395 struct peer_flag_action *action, u_int32_t flag)
2396 {
2397 int i;
2398 int found = 0;
2399 int reset_in = 0;
2400 int reset_out = 0;
2401 const struct peer_flag_action *match = NULL;
2402
2403 /* Check peer's frag action. */
2404 for (i = 0; i < size; i++)
2405 {
2406 match = &action_list[i];
2407
2408 if (match->flag == 0)
2409 break;
2410
2411 if (match->flag & flag)
2412 {
2413 found = 1;
2414
2415 if (match->type == peer_change_reset_in)
2416 reset_in = 1;
2417 if (match->type == peer_change_reset_out)
2418 reset_out = 1;
2419 if (match->type == peer_change_reset)
2420 {
2421 reset_in = 1;
2422 reset_out = 1;
2423 }
2424 if (match->not_for_member)
2425 action->not_for_member = 1;
2426 }
2427 }
2428
2429 /* Set peer clear type. */
2430 if (reset_in && reset_out)
2431 action->type = peer_change_reset;
2432 else if (reset_in)
2433 action->type = peer_change_reset_in;
2434 else if (reset_out)
2435 action->type = peer_change_reset_out;
2436 else
2437 action->type = peer_change_none;
2438
2439 return found;
2440 }
2441
2442 static void
2443 peer_flag_modify_action (struct peer *peer, u_int32_t flag)
2444 {
2445 if (flag == PEER_FLAG_SHUTDOWN)
2446 {
2447 if (CHECK_FLAG (peer->flags, flag))
2448 {
2449 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
2450 peer_nsf_stop (peer);
2451
2452 UNSET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
2453 if (peer->t_pmax_restart)
2454 {
2455 BGP_TIMER_OFF (peer->t_pmax_restart);
2456 if (BGP_DEBUG (events, EVENTS))
2457 zlog_debug ("%s Maximum-prefix restart timer canceled",
2458 peer->host);
2459 }
2460
2461 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
2462 peer_nsf_stop (peer);
2463
2464 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2465 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2466 BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
2467 else
2468 BGP_EVENT_ADD (peer, BGP_Stop);
2469 }
2470 else
2471 {
2472 peer->v_start = BGP_INIT_START_TIMER;
2473 BGP_EVENT_ADD (peer, BGP_Stop);
2474 }
2475 }
2476 else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2477 {
2478 if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
2479 peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
2480 else if (flag == PEER_FLAG_PASSIVE)
2481 peer->last_reset = PEER_DOWN_PASSIVE_CHANGE;
2482 else if (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)
2483 peer->last_reset = PEER_DOWN_MULTIHOP_CHANGE;
2484
2485 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2486 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2487 }
2488 else
2489 BGP_EVENT_ADD (peer, BGP_Stop);
2490 }
2491
2492 /* Change specified peer flag. */
2493 static int
2494 peer_flag_modify (struct peer *peer, u_int32_t flag, int set)
2495 {
2496 int found;
2497 int size;
2498 struct peer_group *group;
2499 struct listnode *node, *nnode;
2500 struct peer_flag_action action;
2501
2502 memset (&action, 0, sizeof (struct peer_flag_action));
2503 size = sizeof peer_flag_action_list / sizeof (struct peer_flag_action);
2504
2505 found = peer_flag_action_set (peer_flag_action_list, size, &action, flag);
2506
2507 /* No flag action is found. */
2508 if (! found)
2509 return BGP_ERR_INVALID_FLAG;
2510
2511 /* Not for peer-group member. */
2512 if (action.not_for_member && peer_group_active (peer))
2513 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
2514
2515 /* When unset the peer-group member's flag we have to check
2516 peer-group configuration. */
2517 if (! set && peer_group_active (peer))
2518 if (CHECK_FLAG (peer->group->conf->flags, flag))
2519 {
2520 if (flag == PEER_FLAG_SHUTDOWN)
2521 return BGP_ERR_PEER_GROUP_SHUTDOWN;
2522 else
2523 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
2524 }
2525
2526 /* Flag conflict check. */
2527 if (set
2528 && CHECK_FLAG (peer->flags | flag, PEER_FLAG_STRICT_CAP_MATCH)
2529 && CHECK_FLAG (peer->flags | flag, PEER_FLAG_OVERRIDE_CAPABILITY))
2530 return BGP_ERR_PEER_FLAG_CONFLICT;
2531
2532 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2533 {
2534 if (set && CHECK_FLAG (peer->flags, flag) == flag)
2535 return 0;
2536 if (! set && ! CHECK_FLAG (peer->flags, flag))
2537 return 0;
2538 }
2539
2540 if (set)
2541 SET_FLAG (peer->flags, flag);
2542 else
2543 UNSET_FLAG (peer->flags, flag);
2544
2545 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2546 {
2547 if (action.type == peer_change_reset)
2548 peer_flag_modify_action (peer, flag);
2549
2550 return 0;
2551 }
2552
2553 /* peer-group member updates. */
2554 group = peer->group;
2555
2556 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
2557 {
2558 if (set && CHECK_FLAG (peer->flags, flag) == flag)
2559 continue;
2560
2561 if (! set && ! CHECK_FLAG (peer->flags, flag))
2562 continue;
2563
2564 if (set)
2565 SET_FLAG (peer->flags, flag);
2566 else
2567 UNSET_FLAG (peer->flags, flag);
2568
2569 if (action.type == peer_change_reset)
2570 peer_flag_modify_action (peer, flag);
2571 }
2572 return 0;
2573 }
2574
2575 int
2576 peer_flag_set (struct peer *peer, u_int32_t flag)
2577 {
2578 return peer_flag_modify (peer, flag, 1);
2579 }
2580
2581 int
2582 peer_flag_unset (struct peer *peer, u_int32_t flag)
2583 {
2584 return peer_flag_modify (peer, flag, 0);
2585 }
2586
2587 static int
2588 peer_is_group_member (struct peer *peer, afi_t afi, safi_t safi)
2589 {
2590 if (peer->af_group[afi][safi])
2591 return 1;
2592 return 0;
2593 }
2594
2595 static int
2596 peer_af_flag_modify (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag,
2597 int set)
2598 {
2599 int found;
2600 int size;
2601 struct listnode *node, *nnode;
2602 struct peer_group *group;
2603 struct peer_flag_action action;
2604
2605 memset (&action, 0, sizeof (struct peer_flag_action));
2606 size = sizeof peer_af_flag_action_list / sizeof (struct peer_flag_action);
2607
2608 found = peer_flag_action_set (peer_af_flag_action_list, size, &action, flag);
2609
2610 /* No flag action is found. */
2611 if (! found)
2612 return BGP_ERR_INVALID_FLAG;
2613
2614 /* Adress family must be activated. */
2615 if (! peer->afc[afi][safi])
2616 return BGP_ERR_PEER_INACTIVE;
2617
2618 /* Not for peer-group member. */
2619 if (action.not_for_member && peer_is_group_member (peer, afi, safi))
2620 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
2621
2622 /* Spcecial check for reflector client. */
2623 if (flag & PEER_FLAG_REFLECTOR_CLIENT
2624 && peer_sort (peer) != BGP_PEER_IBGP)
2625 return BGP_ERR_NOT_INTERNAL_PEER;
2626
2627 /* Spcecial check for remove-private-AS. */
2628 if (flag & PEER_FLAG_REMOVE_PRIVATE_AS
2629 && peer_sort (peer) == BGP_PEER_IBGP)
2630 return BGP_ERR_REMOVE_PRIVATE_AS;
2631
2632 /* When unset the peer-group member's flag we have to check
2633 peer-group configuration. */
2634 if (! set && peer->af_group[afi][safi])
2635 if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi], flag))
2636 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
2637
2638 /* When current flag configuration is same as requested one. */
2639 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2640 {
2641 if (set && CHECK_FLAG (peer->af_flags[afi][safi], flag) == flag)
2642 return 0;
2643 if (! set && ! CHECK_FLAG (peer->af_flags[afi][safi], flag))
2644 return 0;
2645 }
2646
2647 if (set)
2648 SET_FLAG (peer->af_flags[afi][safi], flag);
2649 else
2650 UNSET_FLAG (peer->af_flags[afi][safi], flag);
2651
2652 /* Execute action when peer is established. */
2653 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2654 && peer->status == Established)
2655 {
2656 if (! set && flag == PEER_FLAG_SOFT_RECONFIG)
2657 bgp_clear_adj_in (peer, afi, safi);
2658 else
2659 {
2660 if (flag == PEER_FLAG_REFLECTOR_CLIENT)
2661 peer->last_reset = PEER_DOWN_RR_CLIENT_CHANGE;
2662 else if (flag == PEER_FLAG_RSERVER_CLIENT)
2663 peer->last_reset = PEER_DOWN_RS_CLIENT_CHANGE;
2664 else if (flag == PEER_FLAG_ORF_PREFIX_SM)
2665 peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
2666 else if (flag == PEER_FLAG_ORF_PREFIX_RM)
2667 peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
2668
2669 peer_change_action (peer, afi, safi, action.type);
2670 }
2671
2672 }
2673
2674 /* Peer group member updates. */
2675 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2676 {
2677 group = peer->group;
2678
2679 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
2680 {
2681 if (! peer->af_group[afi][safi])
2682 continue;
2683
2684 if (set && CHECK_FLAG (peer->af_flags[afi][safi], flag) == flag)
2685 continue;
2686
2687 if (! set && ! CHECK_FLAG (peer->af_flags[afi][safi], flag))
2688 continue;
2689
2690 if (set)
2691 SET_FLAG (peer->af_flags[afi][safi], flag);
2692 else
2693 UNSET_FLAG (peer->af_flags[afi][safi], flag);
2694
2695 if (peer->status == Established)
2696 {
2697 if (! set && flag == PEER_FLAG_SOFT_RECONFIG)
2698 bgp_clear_adj_in (peer, afi, safi);
2699 else
2700 {
2701 if (flag == PEER_FLAG_REFLECTOR_CLIENT)
2702 peer->last_reset = PEER_DOWN_RR_CLIENT_CHANGE;
2703 else if (flag == PEER_FLAG_RSERVER_CLIENT)
2704 peer->last_reset = PEER_DOWN_RS_CLIENT_CHANGE;
2705 else if (flag == PEER_FLAG_ORF_PREFIX_SM)
2706 peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
2707 else if (flag == PEER_FLAG_ORF_PREFIX_RM)
2708 peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
2709
2710 peer_change_action (peer, afi, safi, action.type);
2711 }
2712 }
2713 }
2714 }
2715 return 0;
2716 }
2717
2718 int
2719 peer_af_flag_set (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
2720 {
2721 return peer_af_flag_modify (peer, afi, safi, flag, 1);
2722 }
2723
2724 int
2725 peer_af_flag_unset (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
2726 {
2727 return peer_af_flag_modify (peer, afi, safi, flag, 0);
2728 }
2729
2730 /* EBGP multihop configuration. */
2731 int
2732 peer_ebgp_multihop_set (struct peer *peer, int ttl)
2733 {
2734 struct peer_group *group;
2735 struct listnode *node, *nnode;
2736 struct peer *peer1;
2737
2738 if (peer->sort == BGP_PEER_IBGP)
2739 return 0;
2740
2741 /* see comment in peer_ttl_security_hops_set() */
2742 if (ttl != MAXTTL)
2743 {
2744 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2745 {
2746 group = peer->group;
2747 if (group->conf->gtsm_hops != 0)
2748 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
2749
2750 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
2751 {
2752 if (peer1->sort == BGP_PEER_IBGP)
2753 continue;
2754
2755 if (peer1->gtsm_hops != 0)
2756 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
2757 }
2758 }
2759 else
2760 {
2761 if (peer->gtsm_hops != 0)
2762 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
2763 }
2764 }
2765
2766 peer->ttl = ttl;
2767
2768 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2769 {
2770 if (peer->fd >= 0 && peer->sort != BGP_PEER_IBGP)
2771 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2772 }
2773 else
2774 {
2775 group = peer->group;
2776 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
2777 {
2778 if (peer->sort == BGP_PEER_IBGP)
2779 continue;
2780
2781 peer->ttl = group->conf->ttl;
2782
2783 if (peer->fd >= 0)
2784 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2785 }
2786 }
2787 return 0;
2788 }
2789
2790 int
2791 peer_ebgp_multihop_unset (struct peer *peer)
2792 {
2793 struct peer_group *group;
2794 struct listnode *node, *nnode;
2795
2796 if (peer->sort == BGP_PEER_IBGP)
2797 return 0;
2798
2799 if (peer->gtsm_hops != 0 && peer->ttl != MAXTTL)
2800 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
2801
2802 if (peer_group_active (peer))
2803 peer->ttl = peer->group->conf->ttl;
2804 else
2805 peer->ttl = 1;
2806
2807 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2808 {
2809 if (peer->fd >= 0 && peer->sort != BGP_PEER_IBGP)
2810 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2811 }
2812 else
2813 {
2814 group = peer->group;
2815 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
2816 {
2817 if (peer->sort == BGP_PEER_IBGP)
2818 continue;
2819
2820 peer->ttl = 1;
2821
2822 if (peer->fd >= 0)
2823 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2824 }
2825 }
2826 return 0;
2827 }
2828
2829 /* Neighbor description. */
2830 int
2831 peer_description_set (struct peer *peer, char *desc)
2832 {
2833 if (peer->desc)
2834 XFREE (MTYPE_PEER_DESC, peer->desc);
2835
2836 peer->desc = XSTRDUP (MTYPE_PEER_DESC, desc);
2837
2838 return 0;
2839 }
2840
2841 int
2842 peer_description_unset (struct peer *peer)
2843 {
2844 if (peer->desc)
2845 XFREE (MTYPE_PEER_DESC, peer->desc);
2846
2847 peer->desc = NULL;
2848
2849 return 0;
2850 }
2851
2852 /* Neighbor update-source. */
2853 int
2854 peer_update_source_if_set (struct peer *peer, const char *ifname)
2855 {
2856 struct peer_group *group;
2857 struct listnode *node, *nnode;
2858
2859 if (peer->update_if)
2860 {
2861 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2862 && strcmp (peer->update_if, ifname) == 0)
2863 return 0;
2864
2865 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2866 peer->update_if = NULL;
2867 }
2868
2869 if (peer->update_source)
2870 {
2871 sockunion_free (peer->update_source);
2872 peer->update_source = NULL;
2873 }
2874
2875 peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
2876
2877 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2878 {
2879 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2880 {
2881 peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
2882 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2883 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2884 }
2885 else
2886 BGP_EVENT_ADD (peer, BGP_Stop);
2887 return 0;
2888 }
2889
2890 /* peer-group member updates. */
2891 group = peer->group;
2892 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
2893 {
2894 if (peer->update_if)
2895 {
2896 if (strcmp (peer->update_if, ifname) == 0)
2897 continue;
2898
2899 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2900 peer->update_if = NULL;
2901 }
2902
2903 if (peer->update_source)
2904 {
2905 sockunion_free (peer->update_source);
2906 peer->update_source = NULL;
2907 }
2908
2909 peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
2910
2911 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2912 {
2913 peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
2914 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2915 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2916 }
2917 else
2918 BGP_EVENT_ADD (peer, BGP_Stop);
2919 }
2920 return 0;
2921 }
2922
2923 int
2924 peer_update_source_addr_set (struct peer *peer, union sockunion *su)
2925 {
2926 struct peer_group *group;
2927 struct listnode *node, *nnode;
2928
2929 if (peer->update_source)
2930 {
2931 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2932 && sockunion_cmp (peer->update_source, su) == 0)
2933 return 0;
2934 sockunion_free (peer->update_source);
2935 peer->update_source = NULL;
2936 }
2937
2938 if (peer->update_if)
2939 {
2940 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2941 peer->update_if = NULL;
2942 }
2943
2944 peer->update_source = sockunion_dup (su);
2945
2946 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2947 {
2948 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2949 {
2950 peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
2951 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2952 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2953 }
2954 else
2955 BGP_EVENT_ADD (peer, BGP_Stop);
2956 return 0;
2957 }
2958
2959 /* peer-group member updates. */
2960 group = peer->group;
2961 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
2962 {
2963 if (peer->update_source)
2964 {
2965 if (sockunion_cmp (peer->update_source, su) == 0)
2966 continue;
2967 sockunion_free (peer->update_source);
2968 peer->update_source = NULL;
2969 }
2970
2971 if (peer->update_if)
2972 {
2973 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2974 peer->update_if = NULL;
2975 }
2976
2977 peer->update_source = sockunion_dup (su);
2978
2979 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
2980 {
2981 peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
2982 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2983 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2984 }
2985 else
2986 BGP_EVENT_ADD (peer, BGP_Stop);
2987 }
2988 return 0;
2989 }
2990
2991 int
2992 peer_update_source_unset (struct peer *peer)
2993 {
2994 union sockunion *su;
2995 struct peer_group *group;
2996 struct listnode *node, *nnode;
2997
2998 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2999 && ! peer->update_source
3000 && ! peer->update_if)
3001 return 0;
3002
3003 if (peer->update_source)
3004 {
3005 sockunion_free (peer->update_source);
3006 peer->update_source = NULL;
3007 }
3008 if (peer->update_if)
3009 {
3010 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
3011 peer->update_if = NULL;
3012 }
3013
3014 if (peer_group_active (peer))
3015 {
3016 group = peer->group;
3017
3018 if (group->conf->update_source)
3019 {
3020 su = sockunion_dup (group->conf->update_source);
3021 peer->update_source = su;
3022 }
3023 else if (group->conf->update_if)
3024 peer->update_if =
3025 XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, group->conf->update_if);
3026 }
3027
3028 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3029 {
3030 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3031 {
3032 peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
3033 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3034 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3035 }
3036 else
3037 BGP_EVENT_ADD (peer, BGP_Stop);
3038 return 0;
3039 }
3040
3041 /* peer-group member updates. */
3042 group = peer->group;
3043 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3044 {
3045 if (! peer->update_source && ! peer->update_if)
3046 continue;
3047
3048 if (peer->update_source)
3049 {
3050 sockunion_free (peer->update_source);
3051 peer->update_source = NULL;
3052 }
3053
3054 if (peer->update_if)
3055 {
3056 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
3057 peer->update_if = NULL;
3058 }
3059
3060 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3061 {
3062 peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
3063 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3064 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3065 }
3066 else
3067 BGP_EVENT_ADD (peer, BGP_Stop);
3068 }
3069 return 0;
3070 }
3071
3072 int
3073 peer_default_originate_set (struct peer *peer, afi_t afi, safi_t safi,
3074 const char *rmap)
3075 {
3076 struct peer_group *group;
3077 struct listnode *node, *nnode;
3078
3079 /* Adress family must be activated. */
3080 if (! peer->afc[afi][safi])
3081 return BGP_ERR_PEER_INACTIVE;
3082
3083 /* Default originate can't be used for peer group memeber. */
3084 if (peer_is_group_member (peer, afi, safi))
3085 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3086
3087 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE)
3088 || (rmap && ! peer->default_rmap[afi][safi].name)
3089 || (rmap && strcmp (rmap, peer->default_rmap[afi][safi].name) != 0))
3090 {
3091 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
3092
3093 if (rmap)
3094 {
3095 if (peer->default_rmap[afi][safi].name)
3096 free (peer->default_rmap[afi][safi].name);
3097 peer->default_rmap[afi][safi].name = strdup (rmap);
3098 peer->default_rmap[afi][safi].map = route_map_lookup_by_name (rmap);
3099 }
3100 }
3101
3102 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3103 {
3104 if (peer->status == Established && peer->afc_nego[afi][safi])
3105 bgp_default_originate (peer, afi, safi, 0);
3106 return 0;
3107 }
3108
3109 /* peer-group member updates. */
3110 group = peer->group;
3111 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3112 {
3113 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
3114
3115 if (rmap)
3116 {
3117 if (peer->default_rmap[afi][safi].name)
3118 free (peer->default_rmap[afi][safi].name);
3119 peer->default_rmap[afi][safi].name = strdup (rmap);
3120 peer->default_rmap[afi][safi].map = route_map_lookup_by_name (rmap);
3121 }
3122
3123 if (peer->status == Established && peer->afc_nego[afi][safi])
3124 bgp_default_originate (peer, afi, safi, 0);
3125 }
3126 return 0;
3127 }
3128
3129 int
3130 peer_default_originate_unset (struct peer *peer, afi_t afi, safi_t safi)
3131 {
3132 struct peer_group *group;
3133 struct listnode *node, *nnode;
3134
3135 /* Adress family must be activated. */
3136 if (! peer->afc[afi][safi])
3137 return BGP_ERR_PEER_INACTIVE;
3138
3139 /* Default originate can't be used for peer group memeber. */
3140 if (peer_is_group_member (peer, afi, safi))
3141 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3142
3143 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
3144 {
3145 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
3146
3147 if (peer->default_rmap[afi][safi].name)
3148 free (peer->default_rmap[afi][safi].name);
3149 peer->default_rmap[afi][safi].name = NULL;
3150 peer->default_rmap[afi][safi].map = NULL;
3151 }
3152
3153 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3154 {
3155 if (peer->status == Established && peer->afc_nego[afi][safi])
3156 bgp_default_originate (peer, afi, safi, 1);
3157 return 0;
3158 }
3159
3160 /* peer-group member updates. */
3161 group = peer->group;
3162 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3163 {
3164 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
3165
3166 if (peer->default_rmap[afi][safi].name)
3167 free (peer->default_rmap[afi][safi].name);
3168 peer->default_rmap[afi][safi].name = NULL;
3169 peer->default_rmap[afi][safi].map = NULL;
3170
3171 if (peer->status == Established && peer->afc_nego[afi][safi])
3172 bgp_default_originate (peer, afi, safi, 1);
3173 }
3174 return 0;
3175 }
3176
3177 int
3178 peer_port_set (struct peer *peer, u_int16_t port)
3179 {
3180 peer->port = port;
3181 return 0;
3182 }
3183
3184 int
3185 peer_port_unset (struct peer *peer)
3186 {
3187 peer->port = BGP_PORT_DEFAULT;
3188 return 0;
3189 }
3190
3191 /* neighbor weight. */
3192 int
3193 peer_weight_set (struct peer *peer, u_int16_t weight)
3194 {
3195 struct peer_group *group;
3196 struct listnode *node, *nnode;
3197
3198 SET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
3199 peer->weight = weight;
3200
3201 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3202 return 0;
3203
3204 /* peer-group member updates. */
3205 group = peer->group;
3206 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3207 {
3208 peer->weight = group->conf->weight;
3209 }
3210 return 0;
3211 }
3212
3213 int
3214 peer_weight_unset (struct peer *peer)
3215 {
3216 struct peer_group *group;
3217 struct listnode *node, *nnode;
3218
3219 /* Set default weight. */
3220 if (peer_group_active (peer))
3221 peer->weight = peer->group->conf->weight;
3222 else
3223 peer->weight = 0;
3224
3225 UNSET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
3226
3227 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3228 return 0;
3229
3230 /* peer-group member updates. */
3231 group = peer->group;
3232 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3233 {
3234 peer->weight = 0;
3235 }
3236 return 0;
3237 }
3238
3239 int
3240 peer_timers_set (struct peer *peer, u_int32_t keepalive, u_int32_t holdtime)
3241 {
3242 struct peer_group *group;
3243 struct listnode *node, *nnode;
3244
3245 /* Not for peer group memeber. */
3246 if (peer_group_active (peer))
3247 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3248
3249 /* keepalive value check. */
3250 if (keepalive > 65535)
3251 return BGP_ERR_INVALID_VALUE;
3252
3253 /* Holdtime value check. */
3254 if (holdtime > 65535)
3255 return BGP_ERR_INVALID_VALUE;
3256
3257 /* Holdtime value must be either 0 or greater than 3. */
3258 if (holdtime < 3 && holdtime != 0)
3259 return BGP_ERR_INVALID_VALUE;
3260
3261 /* Set value to the configuration. */
3262 SET_FLAG (peer->config, PEER_CONFIG_TIMER);
3263 peer->holdtime = holdtime;
3264 peer->keepalive = (keepalive < holdtime / 3 ? keepalive : holdtime / 3);
3265
3266 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3267 return 0;
3268
3269 /* peer-group member updates. */
3270 group = peer->group;
3271 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3272 {
3273 SET_FLAG (peer->config, PEER_CONFIG_TIMER);
3274 peer->holdtime = group->conf->holdtime;
3275 peer->keepalive = group->conf->keepalive;
3276 }
3277 return 0;
3278 }
3279
3280 int
3281 peer_timers_unset (struct peer *peer)
3282 {
3283 struct peer_group *group;
3284 struct listnode *node, *nnode;
3285
3286 if (peer_group_active (peer))
3287 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3288
3289 /* Clear configuration. */
3290 UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
3291 peer->keepalive = 0;
3292 peer->holdtime = 0;
3293
3294 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3295 return 0;
3296
3297 /* peer-group member updates. */
3298 group = peer->group;
3299 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3300 {
3301 UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
3302 peer->holdtime = 0;
3303 peer->keepalive = 0;
3304 }
3305
3306 return 0;
3307 }
3308
3309 int
3310 peer_timers_connect_set (struct peer *peer, u_int32_t connect)
3311 {
3312 struct peer_group *group;
3313 struct listnode *node, *nnode;
3314
3315 if (peer_group_active (peer))
3316 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3317
3318 if (connect > 65535)
3319 return BGP_ERR_INVALID_VALUE;
3320
3321 /* Set value to the configuration. */
3322 SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
3323 peer->connect = connect;
3324
3325 /* Set value to timer setting. */
3326 peer->v_connect = connect;
3327
3328 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3329 return 0;
3330
3331 /* peer-group member updates. */
3332 group = peer->group;
3333 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3334 {
3335 SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
3336 peer->connect = connect;
3337 peer->v_connect = connect;
3338 }
3339 return 0;
3340 }
3341
3342 int
3343 peer_timers_connect_unset (struct peer *peer)
3344 {
3345 struct peer_group *group;
3346 struct listnode *node, *nnode;
3347
3348 if (peer_group_active (peer))
3349 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3350
3351 /* Clear configuration. */
3352 UNSET_FLAG (peer->config, PEER_CONFIG_CONNECT);
3353 peer->connect = 0;
3354
3355 /* Set timer setting to default value. */
3356 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
3357
3358 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3359 return 0;
3360
3361 /* peer-group member updates. */
3362 group = peer->group;
3363 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3364 {
3365 UNSET_FLAG (peer->config, PEER_CONFIG_CONNECT);
3366 peer->connect = 0;
3367 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
3368 }
3369 return 0;
3370 }
3371
3372 int
3373 peer_advertise_interval_set (struct peer *peer, u_int32_t routeadv)
3374 {
3375 struct peer_group *group;
3376 struct listnode *node, *nnode;
3377
3378 if (peer_group_active (peer))
3379 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3380
3381 if (routeadv > 600)
3382 return BGP_ERR_INVALID_VALUE;
3383
3384 SET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
3385 peer->routeadv = routeadv;
3386 peer->v_routeadv = routeadv;
3387
3388 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3389 return 0;
3390
3391 /* peer-group member updates. */
3392 group = peer->group;
3393 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3394 {
3395 SET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
3396 peer->routeadv = routeadv;
3397 peer->v_routeadv = routeadv;
3398 }
3399
3400 return 0;
3401 }
3402
3403 int
3404 peer_advertise_interval_unset (struct peer *peer)
3405 {
3406 struct peer_group *group;
3407 struct listnode *node, *nnode;
3408
3409 if (peer_group_active (peer))
3410 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3411
3412 UNSET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
3413 peer->routeadv = 0;
3414
3415 if (peer->sort == BGP_PEER_IBGP)
3416 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
3417 else
3418 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
3419
3420 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3421 return 0;
3422
3423 /* peer-group member updates. */
3424 group = peer->group;
3425 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3426 {
3427 UNSET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
3428 peer->routeadv = 0;
3429
3430 if (peer->sort == BGP_PEER_IBGP)
3431 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
3432 else
3433 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
3434 }
3435
3436 return 0;
3437 }
3438
3439 /* neighbor interface */
3440 int
3441 peer_interface_set (struct peer *peer, const char *str)
3442 {
3443 if (peer->ifname)
3444 free (peer->ifname);
3445 peer->ifname = strdup (str);
3446
3447 return 0;
3448 }
3449
3450 int
3451 peer_interface_unset (struct peer *peer)
3452 {
3453 if (peer->ifname)
3454 free (peer->ifname);
3455 peer->ifname = NULL;
3456
3457 return 0;
3458 }
3459
3460 /* Allow-as in. */
3461 int
3462 peer_allowas_in_set (struct peer *peer, afi_t afi, safi_t safi, int allow_num)
3463 {
3464 struct peer_group *group;
3465 struct listnode *node, *nnode;
3466
3467 if (allow_num < 1 || allow_num > 10)
3468 return BGP_ERR_INVALID_VALUE;
3469
3470 if (peer->allowas_in[afi][safi] != allow_num)
3471 {
3472 peer->allowas_in[afi][safi] = allow_num;
3473 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
3474 peer_change_action (peer, afi, safi, peer_change_reset_in);
3475 }
3476
3477 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3478 return 0;
3479
3480 group = peer->group;
3481 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3482 {
3483 if (peer->allowas_in[afi][safi] != allow_num)
3484 {
3485 peer->allowas_in[afi][safi] = allow_num;
3486 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
3487 peer_change_action (peer, afi, safi, peer_change_reset_in);
3488 }
3489
3490 }
3491 return 0;
3492 }
3493
3494 int
3495 peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi)
3496 {
3497 struct peer_group *group;
3498 struct listnode *node, *nnode;
3499
3500 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
3501 {
3502 peer->allowas_in[afi][safi] = 0;
3503 peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
3504 }
3505
3506 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3507 return 0;
3508
3509 group = peer->group;
3510 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3511 {
3512 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
3513 {
3514 peer->allowas_in[afi][safi] = 0;
3515 peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
3516 }
3517 }
3518 return 0;
3519 }
3520
3521 int
3522 peer_local_as_set (struct peer *peer, as_t as, int no_prepend, int replace_as)
3523 {
3524 struct bgp *bgp = peer->bgp;
3525 struct peer_group *group;
3526 struct listnode *node, *nnode;
3527
3528 if (peer_sort (peer) != BGP_PEER_EBGP
3529 && peer_sort (peer) != BGP_PEER_INTERNAL)
3530 return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP;
3531
3532 if (bgp->as == as)
3533 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS;
3534
3535 if (peer_group_active (peer))
3536 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3537
3538 if (peer->as == as)
3539 return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS;
3540
3541 if (peer->change_local_as == as &&
3542 ((CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) && no_prepend)
3543 || (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) && ! no_prepend)) &&
3544 ((CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) && replace_as)
3545 || (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) && ! replace_as)))
3546 return 0;
3547
3548 peer->change_local_as = as;
3549 if (no_prepend)
3550 SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3551 else
3552 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3553
3554 if (replace_as)
3555 SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
3556 else
3557 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
3558
3559 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3560 {
3561 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3562 {
3563 peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
3564 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3565 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3566 }
3567 else
3568 BGP_EVENT_ADD (peer, BGP_Stop);
3569
3570 return 0;
3571 }
3572
3573 group = peer->group;
3574 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3575 {
3576 peer->change_local_as = as;
3577 if (no_prepend)
3578 SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3579 else
3580 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3581
3582 if (replace_as)
3583 SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
3584 else
3585 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
3586
3587 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3588 {
3589 peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
3590 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3591 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3592 }
3593 else
3594 BGP_EVENT_ADD (peer, BGP_Stop);
3595 }
3596
3597 return 0;
3598 }
3599
3600 int
3601 peer_local_as_unset (struct peer *peer)
3602 {
3603 struct peer_group *group;
3604 struct listnode *node, *nnode;
3605
3606 if (peer_group_active (peer))
3607 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3608
3609 if (! peer->change_local_as)
3610 return 0;
3611
3612 peer->change_local_as = 0;
3613 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3614 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
3615
3616 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3617 {
3618 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3619 {
3620 peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
3621 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3622 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3623 }
3624 else
3625 BGP_EVENT_ADD (peer, BGP_Stop);
3626
3627 return 0;
3628 }
3629
3630 group = peer->group;
3631 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3632 {
3633 peer->change_local_as = 0;
3634 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3635 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
3636
3637 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3638 {
3639 peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
3640 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3641 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3642 }
3643 else
3644 BGP_EVENT_ADD (peer, BGP_Stop);
3645 }
3646 return 0;
3647 }
3648
3649 /* Set password for authenticating with the peer. */
3650 int
3651 peer_password_set (struct peer *peer, const char *password)
3652 {
3653 struct listnode *nn, *nnode;
3654 int len = password ? strlen(password) : 0;
3655 int ret = BGP_SUCCESS;
3656
3657 if ((len < PEER_PASSWORD_MINLEN) || (len > PEER_PASSWORD_MAXLEN))
3658 return BGP_ERR_INVALID_VALUE;
3659
3660 if (peer->password && strcmp (peer->password, password) == 0
3661 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3662 return 0;
3663
3664 if (peer->password)
3665 XFREE (MTYPE_PEER_PASSWORD, peer->password);
3666
3667 peer->password = XSTRDUP (MTYPE_PEER_PASSWORD, password);
3668
3669 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3670 {
3671 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3672 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3673 else
3674 BGP_EVENT_ADD (peer, BGP_Stop);
3675
3676 return (bgp_md5_set (peer) >= 0) ? BGP_SUCCESS : BGP_ERR_TCPSIG_FAILED;
3677 }
3678
3679 for (ALL_LIST_ELEMENTS (peer->group->peer, nn, nnode, peer))
3680 {
3681 if (peer->password && strcmp (peer->password, password) == 0)
3682 continue;
3683
3684 if (peer->password)
3685 XFREE (MTYPE_PEER_PASSWORD, peer->password);
3686
3687 peer->password = XSTRDUP(MTYPE_PEER_PASSWORD, password);
3688
3689 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3690 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3691 else
3692 BGP_EVENT_ADD (peer, BGP_Stop);
3693
3694 if (bgp_md5_set (peer) < 0)
3695 ret = BGP_ERR_TCPSIG_FAILED;
3696 }
3697
3698 return ret;
3699 }
3700
3701 int
3702 peer_password_unset (struct peer *peer)
3703 {
3704 struct listnode *nn, *nnode;
3705
3706 if (!peer->password
3707 && !CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3708 return 0;
3709
3710 if (!CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3711 {
3712 if (peer_group_active (peer)
3713 && peer->group->conf->password
3714 && strcmp (peer->group->conf->password, peer->password) == 0)
3715 return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
3716
3717 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3718 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3719 else
3720 BGP_EVENT_ADD (peer, BGP_Stop);
3721
3722 if (peer->password)
3723 XFREE (MTYPE_PEER_PASSWORD, peer->password);
3724
3725 peer->password = NULL;
3726
3727 bgp_md5_set (peer);
3728
3729 return 0;
3730 }
3731
3732 XFREE (MTYPE_PEER_PASSWORD, peer->password);
3733 peer->password = NULL;
3734
3735 for (ALL_LIST_ELEMENTS (peer->group->peer, nn, nnode, peer))
3736 {
3737 if (!peer->password)
3738 continue;
3739
3740 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
3741 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3742 else
3743 BGP_EVENT_ADD (peer, BGP_Stop);
3744
3745 XFREE (MTYPE_PEER_PASSWORD, peer->password);
3746 peer->password = NULL;
3747
3748 bgp_md5_set (peer);
3749 }
3750
3751 return 0;
3752 }
3753
3754 /* Set distribute list to the peer. */
3755 int
3756 peer_distribute_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
3757 const char *name)
3758 {
3759 struct bgp_filter *filter;
3760 struct peer_group *group;
3761 struct listnode *node, *nnode;
3762
3763 if (! peer->afc[afi][safi])
3764 return BGP_ERR_PEER_INACTIVE;
3765
3766 if (direct != FILTER_IN && direct != FILTER_OUT)
3767 return BGP_ERR_INVALID_VALUE;
3768
3769 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3770 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3771
3772 filter = &peer->filter[afi][safi];
3773
3774 if (filter->plist[direct].name)
3775 return BGP_ERR_PEER_FILTER_CONFLICT;
3776
3777 if (filter->dlist[direct].name)
3778 free (filter->dlist[direct].name);
3779 filter->dlist[direct].name = strdup (name);
3780 filter->dlist[direct].alist = access_list_lookup (afi, name);
3781
3782 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3783 return 0;
3784
3785 group = peer->group;
3786 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3787 {
3788 filter = &peer->filter[afi][safi];
3789
3790 if (! peer->af_group[afi][safi])
3791 continue;
3792
3793 if (filter->dlist[direct].name)
3794 free (filter->dlist[direct].name);
3795 filter->dlist[direct].name = strdup (name);
3796 filter->dlist[direct].alist = access_list_lookup (afi, name);
3797 }
3798
3799 return 0;
3800 }
3801
3802 int
3803 peer_distribute_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
3804 {
3805 struct bgp_filter *filter;
3806 struct bgp_filter *gfilter;
3807 struct peer_group *group;
3808 struct listnode *node, *nnode;
3809
3810 if (! peer->afc[afi][safi])
3811 return BGP_ERR_PEER_INACTIVE;
3812
3813 if (direct != FILTER_IN && direct != FILTER_OUT)
3814 return BGP_ERR_INVALID_VALUE;
3815
3816 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3817 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3818
3819 filter = &peer->filter[afi][safi];
3820
3821 /* apply peer-group filter */
3822 if (peer->af_group[afi][safi])
3823 {
3824 gfilter = &peer->group->conf->filter[afi][safi];
3825
3826 if (gfilter->dlist[direct].name)
3827 {
3828 if (filter->dlist[direct].name)
3829 free (filter->dlist[direct].name);
3830 filter->dlist[direct].name = strdup (gfilter->dlist[direct].name);
3831 filter->dlist[direct].alist = gfilter->dlist[direct].alist;
3832 return 0;
3833 }
3834 }
3835
3836 if (filter->dlist[direct].name)
3837 free (filter->dlist[direct].name);
3838 filter->dlist[direct].name = NULL;
3839 filter->dlist[direct].alist = NULL;
3840
3841 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3842 return 0;
3843
3844 group = peer->group;
3845 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3846 {
3847 filter = &peer->filter[afi][safi];
3848
3849 if (! peer->af_group[afi][safi])
3850 continue;
3851
3852 if (filter->dlist[direct].name)
3853 free (filter->dlist[direct].name);
3854 filter->dlist[direct].name = NULL;
3855 filter->dlist[direct].alist = NULL;
3856 }
3857
3858 return 0;
3859 }
3860
3861 /* Update distribute list. */
3862 static void
3863 peer_distribute_update (struct access_list *access)
3864 {
3865 afi_t afi;
3866 safi_t safi;
3867 int direct;
3868 struct listnode *mnode, *mnnode;
3869 struct listnode *node, *nnode;
3870 struct bgp *bgp;
3871 struct peer *peer;
3872 struct peer_group *group;
3873 struct bgp_filter *filter;
3874
3875 for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
3876 {
3877 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
3878 {
3879 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3880 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3881 {
3882 filter = &peer->filter[afi][safi];
3883
3884 for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
3885 {
3886 if (filter->dlist[direct].name)
3887 filter->dlist[direct].alist =
3888 access_list_lookup (afi, filter->dlist[direct].name);
3889 else
3890 filter->dlist[direct].alist = NULL;
3891 }
3892 }
3893 }
3894 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
3895 {
3896 for (afi = AFI_IP; afi < AFI_MAX; afi++)
3897 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
3898 {
3899 filter = &group->conf->filter[afi][safi];
3900
3901 for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
3902 {
3903 if (filter->dlist[direct].name)
3904 filter->dlist[direct].alist =
3905 access_list_lookup (afi, filter->dlist[direct].name);
3906 else
3907 filter->dlist[direct].alist = NULL;
3908 }
3909 }
3910 }
3911 }
3912 }
3913
3914 /* Set prefix list to the peer. */
3915 int
3916 peer_prefix_list_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
3917 const char *name)
3918 {
3919 struct bgp_filter *filter;
3920 struct peer_group *group;
3921 struct listnode *node, *nnode;
3922
3923 if (! peer->afc[afi][safi])
3924 return BGP_ERR_PEER_INACTIVE;
3925
3926 if (direct != FILTER_IN && direct != FILTER_OUT)
3927 return BGP_ERR_INVALID_VALUE;
3928
3929 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3930 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3931
3932 filter = &peer->filter[afi][safi];
3933
3934 if (filter->dlist[direct].name)
3935 return BGP_ERR_PEER_FILTER_CONFLICT;
3936
3937 if (filter->plist[direct].name)
3938 free (filter->plist[direct].name);
3939 filter->plist[direct].name = strdup (name);
3940 filter->plist[direct].plist = prefix_list_lookup (afi, name);
3941
3942 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3943 return 0;
3944
3945 group = peer->group;
3946 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
3947 {
3948 filter = &peer->filter[afi][safi];
3949
3950 if (! peer->af_group[afi][safi])
3951 continue;
3952
3953 if (filter->plist[direct].name)
3954 free (filter->plist[direct].name);
3955 filter->plist[direct].name = strdup (name);
3956 filter->plist[direct].plist = prefix_list_lookup (afi, name);
3957 }
3958 return 0;
3959 }
3960
3961 int
3962 peer_prefix_list_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
3963 {
3964 struct bgp_filter *filter;
3965 struct bgp_filter *gfilter;
3966 struct peer_group *group;
3967 struct listnode *node, *nnode;
3968
3969 if (! peer->afc[afi][safi])
3970 return BGP_ERR_PEER_INACTIVE;
3971
3972 if (direct != FILTER_IN && direct != FILTER_OUT)
3973 return BGP_ERR_INVALID_VALUE;
3974
3975 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3976 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
3977
3978 filter = &peer->filter[afi][safi];
3979
3980 /* apply peer-group filter */
3981 if (peer->af_group[afi][safi])
3982 {
3983 gfilter = &peer->group->conf->filter[afi][safi];
3984
3985 if (gfilter->plist[direct].name)
3986 {
3987 if (filter->plist[direct].name)
3988 free (filter->plist[direct].name);
3989 filter->plist[direct].name = strdup (gfilter->plist[direct].name);
3990 filter->plist[direct].plist = gfilter->plist[direct].plist;
3991 return 0;
3992 }
3993 }
3994
3995 if (filter->plist[direct].name)
3996 free (filter->plist[direct].name);
3997 filter->plist[direct].name = NULL;
3998 filter->plist[direct].plist = NULL;
3999
4000 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4001 return 0;
4002
4003 group = peer->group;
4004 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4005 {
4006 filter = &peer->filter[afi][safi];
4007
4008 if (! peer->af_group[afi][safi])
4009 continue;
4010
4011 if (filter->plist[direct].name)
4012 free (filter->plist[direct].name);
4013 filter->plist[direct].name = NULL;
4014 filter->plist[direct].plist = NULL;
4015 }
4016
4017 return 0;
4018 }
4019
4020 /* Update prefix-list list. */
4021 static void
4022 peer_prefix_list_update (struct prefix_list *plist)
4023 {
4024 struct listnode *mnode, *mnnode;
4025 struct listnode *node, *nnode;
4026 struct bgp *bgp;
4027 struct peer *peer;
4028 struct peer_group *group;
4029 struct bgp_filter *filter;
4030 afi_t afi;
4031 safi_t safi;
4032 int direct;
4033
4034 for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
4035 {
4036 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
4037 {
4038 for (afi = AFI_IP; afi < AFI_MAX; afi++)
4039 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
4040 {
4041 filter = &peer->filter[afi][safi];
4042
4043 for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
4044 {
4045 if (filter->plist[direct].name)
4046 filter->plist[direct].plist =
4047 prefix_list_lookup (afi, filter->plist[direct].name);
4048 else
4049 filter->plist[direct].plist = NULL;
4050 }
4051 }
4052 }
4053 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
4054 {
4055 for (afi = AFI_IP; afi < AFI_MAX; afi++)
4056 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
4057 {
4058 filter = &group->conf->filter[afi][safi];
4059
4060 for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
4061 {
4062 if (filter->plist[direct].name)
4063 filter->plist[direct].plist =
4064 prefix_list_lookup (afi, filter->plist[direct].name);
4065 else
4066 filter->plist[direct].plist = NULL;
4067 }
4068 }
4069 }
4070 }
4071 }
4072
4073 int
4074 peer_aslist_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
4075 const char *name)
4076 {
4077 struct bgp_filter *filter;
4078 struct peer_group *group;
4079 struct listnode *node, *nnode;
4080
4081 if (! peer->afc[afi][safi])
4082 return BGP_ERR_PEER_INACTIVE;
4083
4084 if (direct != FILTER_IN && direct != FILTER_OUT)
4085 return BGP_ERR_INVALID_VALUE;
4086
4087 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
4088 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
4089
4090 filter = &peer->filter[afi][safi];
4091
4092 if (filter->aslist[direct].name)
4093 free (filter->aslist[direct].name);
4094 filter->aslist[direct].name = strdup (name);
4095 filter->aslist[direct].aslist = as_list_lookup (name);
4096
4097 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4098 return 0;
4099
4100 group = peer->group;
4101 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4102 {
4103 filter = &peer->filter[afi][safi];
4104
4105 if (! peer->af_group[afi][safi])
4106 continue;
4107
4108 if (filter->aslist[direct].name)
4109 free (filter->aslist[direct].name);
4110 filter->aslist[direct].name = strdup (name);
4111 filter->aslist[direct].aslist = as_list_lookup (name);
4112 }
4113 return 0;
4114 }
4115
4116 int
4117 peer_aslist_unset (struct peer *peer,afi_t afi, safi_t safi, int direct)
4118 {
4119 struct bgp_filter *filter;
4120 struct bgp_filter *gfilter;
4121 struct peer_group *group;
4122 struct listnode *node, *nnode;
4123
4124 if (! peer->afc[afi][safi])
4125 return BGP_ERR_PEER_INACTIVE;
4126
4127 if (direct != FILTER_IN && direct != FILTER_OUT)
4128 return BGP_ERR_INVALID_VALUE;
4129
4130 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
4131 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
4132
4133 filter = &peer->filter[afi][safi];
4134
4135 /* apply peer-group filter */
4136 if (peer->af_group[afi][safi])
4137 {
4138 gfilter = &peer->group->conf->filter[afi][safi];
4139
4140 if (gfilter->aslist[direct].name)
4141 {
4142 if (filter->aslist[direct].name)
4143 free (filter->aslist[direct].name);
4144 filter->aslist[direct].name = strdup (gfilter->aslist[direct].name);
4145 filter->aslist[direct].aslist = gfilter->aslist[direct].aslist;
4146 return 0;
4147 }
4148 }
4149
4150 if (filter->aslist[direct].name)
4151 free (filter->aslist[direct].name);
4152 filter->aslist[direct].name = NULL;
4153 filter->aslist[direct].aslist = NULL;
4154
4155 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4156 return 0;
4157
4158 group = peer->group;
4159 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4160 {
4161 filter = &peer->filter[afi][safi];
4162
4163 if (! peer->af_group[afi][safi])
4164 continue;
4165
4166 if (filter->aslist[direct].name)
4167 free (filter->aslist[direct].name);
4168 filter->aslist[direct].name = NULL;
4169 filter->aslist[direct].aslist = NULL;
4170 }
4171
4172 return 0;
4173 }
4174
4175 static void
4176 peer_aslist_update (void)
4177 {
4178 afi_t afi;
4179 safi_t safi;
4180 int direct;
4181 struct listnode *mnode, *mnnode;
4182 struct listnode *node, *nnode;
4183 struct bgp *bgp;
4184 struct peer *peer;
4185 struct peer_group *group;
4186 struct bgp_filter *filter;
4187
4188 for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
4189 {
4190 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
4191 {
4192 for (afi = AFI_IP; afi < AFI_MAX; afi++)
4193 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
4194 {
4195 filter = &peer->filter[afi][safi];
4196
4197 for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
4198 {
4199 if (filter->aslist[direct].name)
4200 filter->aslist[direct].aslist =
4201 as_list_lookup (filter->aslist[direct].name);
4202 else
4203 filter->aslist[direct].aslist = NULL;
4204 }
4205 }
4206 }
4207 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
4208 {
4209 for (afi = AFI_IP; afi < AFI_MAX; afi++)
4210 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
4211 {
4212 filter = &group->conf->filter[afi][safi];
4213
4214 for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
4215 {
4216 if (filter->aslist[direct].name)
4217 filter->aslist[direct].aslist =
4218 as_list_lookup (filter->aslist[direct].name);
4219 else
4220 filter->aslist[direct].aslist = NULL;
4221 }
4222 }
4223 }
4224 }
4225 }
4226
4227 /* Set route-map to the peer. */
4228 int
4229 peer_route_map_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
4230 const char *name)
4231 {
4232 struct bgp_filter *filter;
4233 struct peer_group *group;
4234 struct listnode *node, *nnode;
4235
4236 if (! peer->afc[afi][safi])
4237 return BGP_ERR_PEER_INACTIVE;
4238
4239 if (direct != RMAP_IN && direct != RMAP_OUT &&
4240 direct != RMAP_IMPORT && direct != RMAP_EXPORT)
4241 return BGP_ERR_INVALID_VALUE;
4242
4243 if ( (direct == RMAP_OUT || direct == RMAP_IMPORT)
4244 && peer_is_group_member (peer, afi, safi))
4245 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
4246
4247 filter = &peer->filter[afi][safi];
4248
4249 if (filter->map[direct].name)
4250 free (filter->map[direct].name);
4251
4252 filter->map[direct].name = strdup (name);
4253 filter->map[direct].map = route_map_lookup_by_name (name);
4254
4255 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4256 return 0;
4257
4258 group = peer->group;
4259 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4260 {
4261 filter = &peer->filter[afi][safi];
4262
4263 if (! peer->af_group[afi][safi])
4264 continue;
4265
4266 if (filter->map[direct].name)
4267 free (filter->map[direct].name);
4268 filter->map[direct].name = strdup (name);
4269 filter->map[direct].map = route_map_lookup_by_name (name);
4270 }
4271 return 0;
4272 }
4273
4274 /* Unset route-map from the peer. */
4275 int
4276 peer_route_map_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
4277 {
4278 struct bgp_filter *filter;
4279 struct bgp_filter *gfilter;
4280 struct peer_group *group;
4281 struct listnode *node, *nnode;
4282
4283 if (! peer->afc[afi][safi])
4284 return BGP_ERR_PEER_INACTIVE;
4285
4286 if (direct != RMAP_IN && direct != RMAP_OUT &&
4287 direct != RMAP_IMPORT && direct != RMAP_EXPORT)
4288 return BGP_ERR_INVALID_VALUE;
4289
4290 if ( (direct == RMAP_OUT || direct == RMAP_IMPORT)
4291 && peer_is_group_member (peer, afi, safi))
4292 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
4293
4294 filter = &peer->filter[afi][safi];
4295
4296 /* apply peer-group filter */
4297 if (peer->af_group[afi][safi])
4298 {
4299 gfilter = &peer->group->conf->filter[afi][safi];
4300
4301 if (gfilter->map[direct].name)
4302 {
4303 if (filter->map[direct].name)
4304 free (filter->map[direct].name);
4305 filter->map[direct].name = strdup (gfilter->map[direct].name);
4306 filter->map[direct].map = gfilter->map[direct].map;
4307 return 0;
4308 }
4309 }
4310
4311 if (filter->map[direct].name)
4312 free (filter->map[direct].name);
4313 filter->map[direct].name = NULL;
4314 filter->map[direct].map = NULL;
4315
4316 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4317 return 0;
4318
4319 group = peer->group;
4320 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4321 {
4322 filter = &peer->filter[afi][safi];
4323
4324 if (! peer->af_group[afi][safi])
4325 continue;
4326
4327 if (filter->map[direct].name)
4328 free (filter->map[direct].name);
4329 filter->map[direct].name = NULL;
4330 filter->map[direct].map = NULL;
4331 }
4332 return 0;
4333 }
4334
4335 /* Set unsuppress-map to the peer. */
4336 int
4337 peer_unsuppress_map_set (struct peer *peer, afi_t afi, safi_t safi,
4338 const char *name)
4339 {
4340 struct bgp_filter *filter;
4341 struct peer_group *group;
4342 struct listnode *node, *nnode;
4343
4344 if (! peer->afc[afi][safi])
4345 return BGP_ERR_PEER_INACTIVE;
4346
4347 if (peer_is_group_member (peer, afi, safi))
4348 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
4349
4350 filter = &peer->filter[afi][safi];
4351
4352 if (filter->usmap.name)
4353 free (filter->usmap.name);
4354
4355 filter->usmap.name = strdup (name);
4356 filter->usmap.map = route_map_lookup_by_name (name);
4357
4358 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4359 return 0;
4360
4361 group = peer->group;
4362 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4363 {
4364 filter = &peer->filter[afi][safi];
4365
4366 if (! peer->af_group[afi][safi])
4367 continue;
4368
4369 if (filter->usmap.name)
4370 free (filter->usmap.name);
4371 filter->usmap.name = strdup (name);
4372 filter->usmap.map = route_map_lookup_by_name (name);
4373 }
4374 return 0;
4375 }
4376
4377 /* Unset route-map from the peer. */
4378 int
4379 peer_unsuppress_map_unset (struct peer *peer, afi_t afi, safi_t safi)
4380 {
4381 struct bgp_filter *filter;
4382 struct peer_group *group;
4383 struct listnode *node, *nnode;
4384
4385 if (! peer->afc[afi][safi])
4386 return BGP_ERR_PEER_INACTIVE;
4387
4388 if (peer_is_group_member (peer, afi, safi))
4389 return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
4390
4391 filter = &peer->filter[afi][safi];
4392
4393 if (filter->usmap.name)
4394 free (filter->usmap.name);
4395 filter->usmap.name = NULL;
4396 filter->usmap.map = NULL;
4397
4398 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4399 return 0;
4400
4401 group = peer->group;
4402 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4403 {
4404 filter = &peer->filter[afi][safi];
4405
4406 if (! peer->af_group[afi][safi])
4407 continue;
4408
4409 if (filter->usmap.name)
4410 free (filter->usmap.name);
4411 filter->usmap.name = NULL;
4412 filter->usmap.map = NULL;
4413 }
4414 return 0;
4415 }
4416
4417 int
4418 peer_maximum_prefix_set (struct peer *peer, afi_t afi, safi_t safi,
4419 u_int32_t max, u_char threshold,
4420 int warning, u_int16_t restart)
4421 {
4422 struct peer_group *group;
4423 struct listnode *node, *nnode;
4424
4425 if (! peer->afc[afi][safi])
4426 return BGP_ERR_PEER_INACTIVE;
4427
4428 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
4429 peer->pmax[afi][safi] = max;
4430 peer->pmax_threshold[afi][safi] = threshold;
4431 peer->pmax_restart[afi][safi] = restart;
4432 if (warning)
4433 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4434 else
4435 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4436
4437 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4438 return 0;
4439
4440 group = peer->group;
4441 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4442 {
4443 if (! peer->af_group[afi][safi])
4444 continue;
4445
4446 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
4447 peer->pmax[afi][safi] = max;
4448 peer->pmax_threshold[afi][safi] = threshold;
4449 peer->pmax_restart[afi][safi] = restart;
4450 if (warning)
4451 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4452 else
4453 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4454 }
4455 return 0;
4456 }
4457
4458 int
4459 peer_maximum_prefix_unset (struct peer *peer, afi_t afi, safi_t safi)
4460 {
4461 struct peer_group *group;
4462 struct listnode *node, *nnode;
4463
4464 if (! peer->afc[afi][safi])
4465 return BGP_ERR_PEER_INACTIVE;
4466
4467 /* apply peer-group config */
4468 if (peer->af_group[afi][safi])
4469 {
4470 if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi],
4471 PEER_FLAG_MAX_PREFIX))
4472 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
4473 else
4474 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
4475
4476 if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi],
4477 PEER_FLAG_MAX_PREFIX_WARNING))
4478 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4479 else
4480 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4481
4482 peer->pmax[afi][safi] = peer->group->conf->pmax[afi][safi];
4483 peer->pmax_threshold[afi][safi] = peer->group->conf->pmax_threshold[afi][safi];
4484 peer->pmax_restart[afi][safi] = peer->group->conf->pmax_restart[afi][safi];
4485 return 0;
4486 }
4487
4488 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
4489 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4490 peer->pmax[afi][safi] = 0;
4491 peer->pmax_threshold[afi][safi] = 0;
4492 peer->pmax_restart[afi][safi] = 0;
4493
4494 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4495 return 0;
4496
4497 group = peer->group;
4498 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4499 {
4500 if (! peer->af_group[afi][safi])
4501 continue;
4502
4503 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
4504 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
4505 peer->pmax[afi][safi] = 0;
4506 peer->pmax_threshold[afi][safi] = 0;
4507 peer->pmax_restart[afi][safi] = 0;
4508 }
4509 return 0;
4510 }
4511
4512 static int is_ebgp_multihop_configured (struct peer *peer)
4513 {
4514 struct peer_group *group;
4515 struct listnode *node, *nnode;
4516 struct peer *peer1;
4517
4518 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4519 {
4520 group = peer->group;
4521 if ((peer_sort(peer) != BGP_PEER_IBGP) &&
4522 (group->conf->ttl != 1))
4523 return 1;
4524
4525 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
4526 {
4527 if ((peer_sort (peer1) != BGP_PEER_IBGP) &&
4528 (peer1->ttl != 1))
4529 return 1;
4530 }
4531 }
4532 else
4533 {
4534 if ((peer_sort(peer) != BGP_PEER_IBGP) &&
4535 (peer->ttl != 1))
4536 return 1;
4537 }
4538 return 0;
4539 }
4540
4541 /* Set # of hops between us and BGP peer. */
4542 int
4543 peer_ttl_security_hops_set (struct peer *peer, int gtsm_hops)
4544 {
4545 struct peer_group *group;
4546 struct listnode *node, *nnode;
4547 int ret;
4548
4549 zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops, peer->host);
4550
4551 /* We cannot configure ttl-security hops when ebgp-multihop is already
4552 set. For non peer-groups, the check is simple. For peer-groups, it's
4553 slightly messy, because we need to check both the peer-group structure
4554 and all peer-group members for any trace of ebgp-multihop configuration
4555 before actually applying the ttl-security rules. Cisco really made a
4556 mess of this configuration parameter, and OpenBGPD got it right.
4557 */
4558
4559 if (peer->gtsm_hops == 0)
4560 {
4561 if (is_ebgp_multihop_configured (peer))
4562 return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
4563
4564 /* specify MAXTTL on outgoing packets */
4565 /* Routine handles iBGP peers correctly */
4566 ret = peer_ebgp_multihop_set (peer, MAXTTL);
4567 if (ret != 0)
4568 return ret;
4569 }
4570
4571 peer->gtsm_hops = gtsm_hops;
4572
4573 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4574 {
4575 if (peer->fd >= 0)
4576 sockopt_minttl (peer->su.sa.sa_family, peer->fd, MAXTTL + 1 - gtsm_hops);
4577 }
4578 else
4579 {
4580 group = peer->group;
4581 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4582 {
4583 peer->gtsm_hops = group->conf->gtsm_hops;
4584
4585 /* Change setting of existing peer
4586 * established then change value (may break connectivity)
4587 * not established yet (teardown session and restart)
4588 * no session then do nothing (will get handled by next connection)
4589 */
4590 if (peer->status == Established)
4591 {
4592 if (peer->fd >= 0 && peer->gtsm_hops != 0)
4593 sockopt_minttl (peer->su.sa.sa_family, peer->fd,
4594 MAXTTL + 1 - peer->gtsm_hops);
4595 }
4596 else if (peer->status < Established)
4597 {
4598 if (BGP_DEBUG (events, EVENTS))
4599 zlog_debug ("%s Min-ttl changed", peer->host);
4600 BGP_EVENT_ADD (peer, BGP_Stop);
4601 }
4602 }
4603 }
4604
4605 return 0;
4606 }
4607
4608 int
4609 peer_ttl_security_hops_unset (struct peer *peer)
4610 {
4611 struct peer_group *group;
4612 struct listnode *node, *nnode;
4613 struct peer *opeer;
4614
4615 zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer->host);
4616
4617 /* if a peer-group member, then reset to peer-group default rather than 0 */
4618 if (peer_group_active (peer))
4619 peer->gtsm_hops = peer->group->conf->gtsm_hops;
4620 else
4621 peer->gtsm_hops = 0;
4622
4623 opeer = peer;
4624 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4625 {
4626 if (peer->fd >= 0)
4627 sockopt_minttl (peer->su.sa.sa_family, peer->fd, 0);
4628 }
4629 else
4630 {
4631 group = peer->group;
4632 for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
4633 {
4634 peer->gtsm_hops = 0;
4635
4636 if (peer->fd >= 0)
4637 sockopt_minttl (peer->su.sa.sa_family, peer->fd, 0);
4638 }
4639 }
4640
4641 return peer_ebgp_multihop_unset (opeer);
4642 }
4643
4644 int
4645 peer_clear (struct peer *peer)
4646 {
4647 if (! CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
4648 {
4649 if (CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
4650 {
4651 UNSET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
4652 if (peer->t_pmax_restart)
4653 {
4654 BGP_TIMER_OFF (peer->t_pmax_restart);
4655 if (BGP_DEBUG (events, EVENTS))
4656 zlog_debug ("%s Maximum-prefix restart timer canceled",
4657 peer->host);
4658 }
4659 BGP_EVENT_ADD (peer, BGP_Start);
4660 return 0;
4661 }
4662
4663 peer->v_start = BGP_INIT_START_TIMER;
4664 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
4665 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
4666 BGP_NOTIFY_CEASE_ADMIN_RESET);
4667 else
4668 BGP_EVENT_ADD (peer, BGP_Stop);
4669 }
4670 return 0;
4671 }
4672
4673 int
4674 peer_clear_soft (struct peer *peer, afi_t afi, safi_t safi,
4675 enum bgp_clear_type stype)
4676 {
4677 if (peer->status != Established)
4678 return 0;
4679
4680 if (! peer->afc[afi][safi])
4681 return BGP_ERR_AF_UNCONFIGURED;
4682
4683 if (stype == BGP_CLEAR_SOFT_RSCLIENT)
4684 {
4685 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
4686 return 0;
4687 bgp_check_local_routes_rsclient (peer, afi, safi);
4688 bgp_soft_reconfig_rsclient (peer, afi, safi);
4689 }
4690
4691 if (stype == BGP_CLEAR_SOFT_OUT || stype == BGP_CLEAR_SOFT_BOTH)
4692 bgp_announce_route (peer, afi, safi);
4693
4694 if (stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX)
4695 {
4696 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
4697 && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
4698 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV)))
4699 {
4700 struct bgp_filter *filter = &peer->filter[afi][safi];
4701 u_char prefix_type;
4702
4703 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
4704 prefix_type = ORF_TYPE_PREFIX;
4705 else
4706 prefix_type = ORF_TYPE_PREFIX_OLD;
4707
4708 if (filter->plist[FILTER_IN].plist)
4709 {
4710 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
4711 bgp_route_refresh_send (peer, afi, safi,
4712 prefix_type, REFRESH_DEFER, 1);
4713 bgp_route_refresh_send (peer, afi, safi, prefix_type,
4714 REFRESH_IMMEDIATE, 0);
4715 }
4716 else
4717 {
4718 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
4719 bgp_route_refresh_send (peer, afi, safi,
4720 prefix_type, REFRESH_IMMEDIATE, 1);
4721 else
4722 bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
4723 }
4724 return 0;
4725 }
4726 }
4727
4728 if (stype == BGP_CLEAR_SOFT_IN || stype == BGP_CLEAR_SOFT_BOTH
4729 || stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX)
4730 {
4731 /* If neighbor has soft reconfiguration inbound flag.
4732 Use Adj-RIB-In database. */
4733 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
4734 bgp_soft_reconfig_in (peer, afi, safi);
4735 else
4736 {
4737 /* If neighbor has route refresh capability, send route refresh
4738 message to the peer. */
4739 if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
4740 || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
4741 bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
4742 else
4743 return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED;
4744 }
4745 }
4746 return 0;
4747 }
4748
4749 /* Display peer uptime.*/
4750 /* XXX: why does this function return char * when it takes buffer? */
4751 char *
4752 peer_uptime (time_t uptime2, char *buf, size_t len)
4753 {
4754 time_t uptime1;
4755 struct tm *tm;
4756
4757 /* Check buffer length. */
4758 if (len < BGP_UPTIME_LEN)
4759 {
4760 zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long)len);
4761 /* XXX: should return status instead of buf... */
4762 snprintf (buf, len, "<error> ");
4763 return buf;
4764 }
4765
4766 /* If there is no connection has been done before print `never'. */
4767 if (uptime2 == 0)
4768 {
4769 snprintf (buf, len, "never ");
4770 return buf;
4771 }
4772
4773 /* Get current time. */
4774 uptime1 = bgp_clock ();
4775 uptime1 -= uptime2;
4776 tm = gmtime (&uptime1);
4777
4778 /* Making formatted timer strings. */
4779 #define ONE_DAY_SECOND 60*60*24
4780 #define ONE_WEEK_SECOND 60*60*24*7
4781
4782 if (uptime1 < ONE_DAY_SECOND)
4783 snprintf (buf, len, "%02d:%02d:%02d",
4784 tm->tm_hour, tm->tm_min, tm->tm_sec);
4785 else if (uptime1 < ONE_WEEK_SECOND)
4786 snprintf (buf, len, "%dd%02dh%02dm",
4787 tm->tm_yday, tm->tm_hour, tm->tm_min);
4788 else
4789 snprintf (buf, len, "%02dw%dd%02dh",
4790 tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
4791 return buf;
4792 }
4793
4794 static void
4795 bgp_config_write_filter (struct vty *vty, struct peer *peer,
4796 afi_t afi, safi_t safi)
4797 {
4798 struct bgp_filter *filter;
4799 struct bgp_filter *gfilter = NULL;
4800 char *addr;
4801 int in = FILTER_IN;
4802 int out = FILTER_OUT;
4803
4804 addr = peer->host;
4805 filter = &peer->filter[afi][safi];
4806 if (peer->af_group[afi][safi])
4807 gfilter = &peer->group->conf->filter[afi][safi];
4808
4809 /* distribute-list. */
4810 if (filter->dlist[in].name)
4811 if (! gfilter || ! gfilter->dlist[in].name
4812 || strcmp (filter->dlist[in].name, gfilter->dlist[in].name) != 0)
4813 vty_out (vty, " neighbor %s distribute-list %s in%s", addr,
4814 filter->dlist[in].name, VTY_NEWLINE);
4815 if (filter->dlist[out].name && ! gfilter)
4816 vty_out (vty, " neighbor %s distribute-list %s out%s", addr,
4817 filter->dlist[out].name, VTY_NEWLINE);
4818
4819 /* prefix-list. */
4820 if (filter->plist[in].name)
4821 if (! gfilter || ! gfilter->plist[in].name
4822 || strcmp (filter->plist[in].name, gfilter->plist[in].name) != 0)
4823 vty_out (vty, " neighbor %s prefix-list %s in%s", addr,
4824 filter->plist[in].name, VTY_NEWLINE);
4825 if (filter->plist[out].name && ! gfilter)
4826 vty_out (vty, " neighbor %s prefix-list %s out%s", addr,
4827 filter->plist[out].name, VTY_NEWLINE);
4828
4829 /* route-map. */
4830 if (filter->map[RMAP_IN].name)
4831 if (! gfilter || ! gfilter->map[RMAP_IN].name
4832 || strcmp (filter->map[RMAP_IN].name, gfilter->map[RMAP_IN].name) != 0)
4833 vty_out (vty, " neighbor %s route-map %s in%s", addr,
4834 filter->map[RMAP_IN].name, VTY_NEWLINE);
4835 if (filter->map[RMAP_OUT].name && ! gfilter)
4836 vty_out (vty, " neighbor %s route-map %s out%s", addr,
4837 filter->map[RMAP_OUT].name, VTY_NEWLINE);
4838 if (filter->map[RMAP_IMPORT].name && ! gfilter)
4839 vty_out (vty, " neighbor %s route-map %s import%s", addr,
4840 filter->map[RMAP_IMPORT].name, VTY_NEWLINE);
4841 if (filter->map[RMAP_EXPORT].name)
4842 if (! gfilter || ! gfilter->map[RMAP_EXPORT].name
4843 || strcmp (filter->map[RMAP_EXPORT].name,
4844 gfilter->map[RMAP_EXPORT].name) != 0)
4845 vty_out (vty, " neighbor %s route-map %s export%s", addr,
4846 filter->map[RMAP_EXPORT].name, VTY_NEWLINE);
4847
4848 /* unsuppress-map */
4849 if (filter->usmap.name && ! gfilter)
4850 vty_out (vty, " neighbor %s unsuppress-map %s%s", addr,
4851 filter->usmap.name, VTY_NEWLINE);
4852
4853 /* filter-list. */
4854 if (filter->aslist[in].name)
4855 if (! gfilter || ! gfilter->aslist[in].name
4856 || strcmp (filter->aslist[in].name, gfilter->aslist[in].name) != 0)
4857 vty_out (vty, " neighbor %s filter-list %s in%s", addr,
4858 filter->aslist[in].name, VTY_NEWLINE);
4859 if (filter->aslist[out].name && ! gfilter)
4860 vty_out (vty, " neighbor %s filter-list %s out%s", addr,
4861 filter->aslist[out].name, VTY_NEWLINE);
4862 }
4863
4864 /* BGP peer configuration display function. */
4865 static void
4866 bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
4867 struct peer *peer, afi_t afi, safi_t safi)
4868 {
4869 struct peer *g_peer = NULL;
4870 char buf[SU_ADDRSTRLEN];
4871 char *addr;
4872
4873 addr = peer->host;
4874 if (peer_group_active (peer))
4875 g_peer = peer->group->conf;
4876
4877 /************************************
4878 ****** Global to the neighbor ******
4879 ************************************/
4880 if (afi == AFI_IP && safi == SAFI_UNICAST)
4881 {
4882 /* remote-as. */
4883 if (! peer_group_active (peer))
4884 {
4885 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
4886 vty_out (vty, " neighbor %s peer-group%s", addr,
4887 VTY_NEWLINE);
4888 if (peer->as)
4889 vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
4890 VTY_NEWLINE);
4891 }
4892 else
4893 {
4894 if (! g_peer->as)
4895 vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
4896 VTY_NEWLINE);
4897 if (peer->af_group[AFI_IP][SAFI_UNICAST])
4898 vty_out (vty, " neighbor %s peer-group %s%s", addr,
4899 peer->group->name, VTY_NEWLINE);
4900 }
4901
4902 /* local-as. */
4903 if (peer->change_local_as)
4904 if (! peer_group_active (peer))
4905 vty_out (vty, " neighbor %s local-as %u%s%s%s", addr,
4906 peer->change_local_as,
4907 CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
4908 " no-prepend" : "",
4909 CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
4910 " replace-as" : "", VTY_NEWLINE);
4911
4912 /* Description. */
4913 if (peer->desc)
4914 vty_out (vty, " neighbor %s description %s%s", addr, peer->desc,
4915 VTY_NEWLINE);
4916
4917 /* Shutdown. */
4918 if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
4919 if (! peer_group_active (peer) ||
4920 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_SHUTDOWN))
4921 vty_out (vty, " neighbor %s shutdown%s", addr, VTY_NEWLINE);
4922
4923 /* Password. */
4924 if (peer->password)
4925 if (!peer_group_active (peer)
4926 || ! g_peer->password
4927 || strcmp (peer->password, g_peer->password) != 0)
4928 vty_out (vty, " neighbor %s password %s%s", addr, peer->password,
4929 VTY_NEWLINE);
4930
4931 /* BGP port. */
4932 if (peer->port != BGP_PORT_DEFAULT)
4933 vty_out (vty, " neighbor %s port %d%s", addr, peer->port,
4934 VTY_NEWLINE);
4935
4936 /* Local interface name. */
4937 if (peer->ifname)
4938 vty_out (vty, " neighbor %s interface %s%s", addr, peer->ifname,
4939 VTY_NEWLINE);
4940
4941 /* Passive. */
4942 if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE))
4943 if (! peer_group_active (peer) ||
4944 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_PASSIVE))
4945 vty_out (vty, " neighbor %s passive%s", addr, VTY_NEWLINE);
4946
4947 /* EBGP multihop. */
4948 if (peer->sort != BGP_PEER_IBGP && peer->ttl != 1 &&
4949 !(peer->gtsm_hops != 0 && peer->ttl == MAXTTL))
4950 if (! peer_group_active (peer) ||
4951 g_peer->ttl != peer->ttl)
4952 vty_out (vty, " neighbor %s ebgp-multihop %d%s", addr, peer->ttl,
4953 VTY_NEWLINE);
4954
4955 /* ttl-security hops */
4956 if (peer->gtsm_hops != 0)
4957 if (! peer_group_active (peer) || g_peer->gtsm_hops != peer->gtsm_hops)
4958 vty_out (vty, " neighbor %s ttl-security hops %d%s", addr,
4959 peer->gtsm_hops, VTY_NEWLINE);
4960
4961 /* disable-connected-check. */
4962 if (CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
4963 if (! peer_group_active (peer) ||
4964 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
4965 vty_out (vty, " neighbor %s disable-connected-check%s", addr, VTY_NEWLINE);
4966
4967 /* Update-source. */
4968 if (peer->update_if)
4969 if (! peer_group_active (peer) || ! g_peer->update_if
4970 || strcmp (g_peer->update_if, peer->update_if) != 0)
4971 vty_out (vty, " neighbor %s update-source %s%s", addr,
4972 peer->update_if, VTY_NEWLINE);
4973 if (peer->update_source)
4974 if (! peer_group_active (peer) || ! g_peer->update_source
4975 || sockunion_cmp (g_peer->update_source,
4976 peer->update_source) != 0)
4977 vty_out (vty, " neighbor %s update-source %s%s", addr,
4978 sockunion2str (peer->update_source, buf, SU_ADDRSTRLEN),
4979 VTY_NEWLINE);
4980
4981 /* advertisement-interval */
4982 if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV) &&
4983 ! peer_group_active (peer))
4984 vty_out (vty, " neighbor %s advertisement-interval %d%s",
4985 addr, peer->v_routeadv, VTY_NEWLINE);
4986
4987 /* timers. */
4988 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)
4989 && ! peer_group_active (peer))
4990 vty_out (vty, " neighbor %s timers %d %d%s", addr,
4991 peer->keepalive, peer->holdtime, VTY_NEWLINE);
4992
4993 if (CHECK_FLAG (peer->config, PEER_CONFIG_CONNECT) &&
4994 ! peer_group_active (peer))
4995 vty_out (vty, " neighbor %s timers connect %d%s", addr,
4996 peer->connect, VTY_NEWLINE);
4997
4998 /* Default weight. */
4999 if (CHECK_FLAG (peer->config, PEER_CONFIG_WEIGHT))
5000 if (! peer_group_active (peer) ||
5001 g_peer->weight != peer->weight)
5002 vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
5003 VTY_NEWLINE);
5004
5005 /* Dynamic capability. */
5006 if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
5007 if (! peer_group_active (peer) ||
5008 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
5009 vty_out (vty, " neighbor %s capability dynamic%s", addr,
5010 VTY_NEWLINE);
5011
5012 /* dont capability negotiation. */
5013 if (CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
5014 if (! peer_group_active (peer) ||
5015 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DONT_CAPABILITY))
5016 vty_out (vty, " neighbor %s dont-capability-negotiate%s", addr,
5017 VTY_NEWLINE);
5018
5019 /* override capability negotiation. */
5020 if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
5021 if (! peer_group_active (peer) ||
5022 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
5023 vty_out (vty, " neighbor %s override-capability%s", addr,
5024 VTY_NEWLINE);
5025
5026 /* strict capability negotiation. */
5027 if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
5028 if (! peer_group_active (peer) ||
5029 ! CHECK_FLAG (g_peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
5030 vty_out (vty, " neighbor %s strict-capability-match%s", addr,
5031 VTY_NEWLINE);
5032
5033 if (! peer->af_group[AFI_IP][SAFI_UNICAST])
5034 {
5035 if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
5036 {
5037 if (peer->afc[AFI_IP][SAFI_UNICAST])
5038 vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
5039 }
5040 else
5041 {
5042 if (! peer->afc[AFI_IP][SAFI_UNICAST])
5043 vty_out (vty, " no neighbor %s activate%s", addr, VTY_NEWLINE);
5044 }
5045 }
5046 }
5047
5048
5049 /************************************
5050 ****** Per AF to the neighbor ******
5051 ************************************/
5052
5053 if (! (afi == AFI_IP && safi == SAFI_UNICAST))
5054 {
5055 if (peer->af_group[afi][safi])
5056 vty_out (vty, " neighbor %s peer-group %s%s", addr,
5057 peer->group->name, VTY_NEWLINE);
5058 else
5059 vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
5060 }
5061
5062 /* ORF capability. */
5063 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
5064 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
5065 if (! peer->af_group[afi][safi])
5066 {
5067 vty_out (vty, " neighbor %s capability orf prefix-list", addr);
5068
5069 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
5070 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
5071 vty_out (vty, " both");
5072 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
5073 vty_out (vty, " send");
5074 else
5075 vty_out (vty, " receive");
5076 vty_out (vty, "%s", VTY_NEWLINE);
5077 }
5078
5079 /* Route reflector client. */
5080 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REFLECTOR_CLIENT)
5081 && ! peer->af_group[afi][safi])
5082 vty_out (vty, " neighbor %s route-reflector-client%s", addr,
5083 VTY_NEWLINE);
5084
5085 /* Nexthop self. */
5086 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_NEXTHOP_SELF)
5087 && ! peer->af_group[afi][safi])
5088 vty_out (vty, " neighbor %s next-hop-self%s%s", addr,
5089 peer_af_flag_check (peer, afi, safi, PEER_FLAG_NEXTHOP_SELF_ALL) ?
5090 " all" : "", VTY_NEWLINE);
5091
5092 /* Remove private AS. */
5093 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
5094 && ! peer->af_group[afi][safi])
5095 vty_out (vty, " neighbor %s remove-private-AS%s",
5096 addr, VTY_NEWLINE);
5097
5098 /* send-community print. */
5099 if (! peer->af_group[afi][safi])
5100 {
5101 if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
5102 {
5103 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
5104 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
5105 vty_out (vty, " neighbor %s send-community both%s", addr, VTY_NEWLINE);
5106 else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
5107 vty_out (vty, " neighbor %s send-community extended%s",
5108 addr, VTY_NEWLINE);
5109 else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
5110 vty_out (vty, " neighbor %s send-community%s", addr, VTY_NEWLINE);
5111 }
5112 else
5113 {
5114 if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
5115 && ! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
5116 vty_out (vty, " no neighbor %s send-community both%s",
5117 addr, VTY_NEWLINE);
5118 else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
5119 vty_out (vty, " no neighbor %s send-community extended%s",
5120 addr, VTY_NEWLINE);
5121 else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
5122 vty_out (vty, " no neighbor %s send-community%s",
5123 addr, VTY_NEWLINE);
5124 }
5125 }
5126
5127 /* Default information */
5128 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_DEFAULT_ORIGINATE)
5129 && ! peer->af_group[afi][safi])
5130 {
5131 vty_out (vty, " neighbor %s default-originate", addr);
5132 if (peer->default_rmap[afi][safi].name)
5133 vty_out (vty, " route-map %s", peer->default_rmap[afi][safi].name);
5134 vty_out (vty, "%s", VTY_NEWLINE);
5135 }
5136
5137 /* Soft reconfiguration inbound. */
5138 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
5139 if (! peer->af_group[afi][safi] ||
5140 ! CHECK_FLAG (g_peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
5141 vty_out (vty, " neighbor %s soft-reconfiguration inbound%s", addr,
5142 VTY_NEWLINE);
5143
5144 /* maximum-prefix. */
5145 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
5146 if (! peer->af_group[afi][safi]
5147 || g_peer->pmax[afi][safi] != peer->pmax[afi][safi]
5148 || g_peer->pmax_threshold[afi][safi] != peer->pmax_threshold[afi][safi]
5149 || CHECK_FLAG (g_peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
5150 != CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
5151 {
5152 vty_out (vty, " neighbor %s maximum-prefix %ld", addr, peer->pmax[afi][safi]);
5153 if (peer->pmax_threshold[afi][safi] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT)
5154 vty_out (vty, " %d", peer->pmax_threshold[afi][safi]);
5155 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
5156 vty_out (vty, " warning-only");
5157 if (peer->pmax_restart[afi][safi])
5158 vty_out (vty, " restart %d", peer->pmax_restart[afi][safi]);
5159 vty_out (vty, "%s", VTY_NEWLINE);
5160 }
5161
5162 /* Route server client. */
5163 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
5164 && ! peer->af_group[afi][safi])
5165 vty_out (vty, " neighbor %s route-server-client%s", addr, VTY_NEWLINE);
5166
5167 /* Nexthop-local unchanged. */
5168 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED)
5169 && ! peer->af_group[afi][safi])
5170 vty_out (vty, " neighbor %s nexthop-local unchanged%s", addr, VTY_NEWLINE);
5171
5172 /* Allow AS in. */
5173 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_ALLOWAS_IN))
5174 if (! peer_group_active (peer)
5175 || ! peer_af_flag_check (g_peer, afi, safi, PEER_FLAG_ALLOWAS_IN)
5176 || peer->allowas_in[afi][safi] != g_peer->allowas_in[afi][safi])
5177 {
5178 if (peer->allowas_in[afi][safi] == 3)
5179 vty_out (vty, " neighbor %s allowas-in%s", addr, VTY_NEWLINE);
5180 else
5181 vty_out (vty, " neighbor %s allowas-in %d%s", addr,
5182 peer->allowas_in[afi][safi], VTY_NEWLINE);
5183 }
5184
5185 /* Filter. */
5186 bgp_config_write_filter (vty, peer, afi, safi);
5187
5188 /* atribute-unchanged. */
5189 if ((CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
5190 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
5191 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
5192 && ! peer->af_group[afi][safi])
5193 {
5194 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
5195 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
5196 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
5197 vty_out (vty, " neighbor %s attribute-unchanged%s", addr, VTY_NEWLINE);
5198 else
5199 vty_out (vty, " neighbor %s attribute-unchanged%s%s%s%s", addr,
5200 (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)) ?
5201 " as-path" : "",
5202 (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)) ?
5203 " next-hop" : "",
5204 (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED)) ?
5205 " med" : "", VTY_NEWLINE);
5206 }
5207 }
5208
5209 /* Display "address-family" configuration header. */
5210 void
5211 bgp_config_write_family_header (struct vty *vty, afi_t afi, safi_t safi,
5212 int *write)
5213 {
5214 if (*write)
5215 return;
5216
5217 if (afi == AFI_IP && safi == SAFI_UNICAST)
5218 return;
5219
5220 vty_out (vty, "!%s address-family ", VTY_NEWLINE);
5221
5222 if (afi == AFI_IP)
5223 {
5224 if (safi == SAFI_MULTICAST)
5225 vty_out (vty, "ipv4 multicast");
5226 else if (safi == SAFI_MPLS_VPN)
5227 vty_out (vty, "vpnv4 unicast");
5228 }
5229 else if (afi == AFI_IP6)
5230 {
5231 vty_out (vty, "ipv6");
5232
5233 if (safi == SAFI_MULTICAST)
5234 vty_out (vty, " multicast");
5235 }
5236
5237 vty_out (vty, "%s", VTY_NEWLINE);
5238
5239 *write = 1;
5240 }
5241
5242 /* Address family based peer configuration display. */
5243 static int
5244 bgp_config_write_family (struct vty *vty, struct bgp *bgp, afi_t afi,
5245 safi_t safi)
5246 {
5247 int write = 0;
5248 struct peer *peer;
5249 struct peer_group *group;
5250 struct listnode *node, *nnode;
5251
5252 bgp_config_write_network (vty, bgp, afi, safi, &write);
5253
5254 bgp_config_write_redistribute (vty, bgp, afi, safi, &write);
5255
5256 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
5257 {
5258 if (group->conf->afc[afi][safi])
5259 {
5260 bgp_config_write_family_header (vty, afi, safi, &write);
5261 bgp_config_write_peer (vty, bgp, group->conf, afi, safi);
5262 }
5263 }
5264 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
5265 {
5266 if (peer->afc[afi][safi])
5267 {
5268 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
5269 {
5270 bgp_config_write_family_header (vty, afi, safi, &write);
5271 bgp_config_write_peer (vty, bgp, peer, afi, safi);
5272 }
5273 }
5274 }
5275
5276 bgp_config_write_maxpaths (vty, bgp, afi, safi, &write);
5277 bgp_config_write_table_map (vty, bgp, afi, safi, &write);
5278
5279 if (write)
5280 vty_out (vty, " exit-address-family%s", VTY_NEWLINE);
5281
5282 return write;
5283 }
5284
5285 int
5286 bgp_config_write (struct vty *vty)
5287 {
5288 int write = 0;
5289 struct bgp *bgp;
5290 struct peer_group *group;
5291 struct peer *peer;
5292 struct listnode *node, *nnode;
5293 struct listnode *mnode, *mnnode;
5294
5295 /* BGP Multiple instance. */
5296 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
5297 {
5298 vty_out (vty, "bgp multiple-instance%s", VTY_NEWLINE);
5299 write++;
5300 }
5301
5302 /* BGP Config type. */
5303 if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
5304 {
5305 vty_out (vty, "bgp config-type cisco%s", VTY_NEWLINE);
5306 write++;
5307 }
5308
5309 /* BGP configuration. */
5310 for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
5311 {
5312 if (write)
5313 vty_out (vty, "!%s", VTY_NEWLINE);
5314
5315 /* Router bgp ASN */
5316 vty_out (vty, "router bgp %u", bgp->as);
5317
5318 if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
5319 {
5320 if (bgp->name)
5321 vty_out (vty, " view %s", bgp->name);
5322 }
5323 vty_out (vty, "%s", VTY_NEWLINE);
5324
5325 /* No Synchronization */
5326 if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
5327 vty_out (vty, " no synchronization%s", VTY_NEWLINE);
5328
5329 /* BGP fast-external-failover. */
5330 if (CHECK_FLAG (bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
5331 vty_out (vty, " no bgp fast-external-failover%s", VTY_NEWLINE);
5332
5333 /* BGP router ID. */
5334 if (CHECK_FLAG (bgp->config, BGP_CONFIG_ROUTER_ID))
5335 vty_out (vty, " bgp router-id %s%s", inet_ntoa (bgp->router_id),
5336 VTY_NEWLINE);
5337
5338 /* BGP log-neighbor-changes. */
5339 if (bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
5340 vty_out (vty, " bgp log-neighbor-changes%s", VTY_NEWLINE);
5341
5342 /* BGP configuration. */
5343 if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED))
5344 vty_out (vty, " bgp always-compare-med%s", VTY_NEWLINE);
5345
5346 /* BGP default ipv4-unicast. */
5347 if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
5348 vty_out (vty, " no bgp default ipv4-unicast%s", VTY_NEWLINE);
5349
5350 /* BGP default local-preference. */
5351 if (bgp->default_local_pref != BGP_DEFAULT_LOCAL_PREF)
5352 vty_out (vty, " bgp default local-preference %d%s",
5353 bgp->default_local_pref, VTY_NEWLINE);
5354
5355 /* BGP client-to-client reflection. */
5356 if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
5357 vty_out (vty, " no bgp client-to-client reflection%s", VTY_NEWLINE);
5358
5359 /* BGP cluster ID. */
5360 if (CHECK_FLAG (bgp->config, BGP_CONFIG_CLUSTER_ID))
5361 vty_out (vty, " bgp cluster-id %s%s", inet_ntoa (bgp->cluster_id),
5362 VTY_NEWLINE);
5363
5364 /* Confederation identifier*/
5365 if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION))
5366 vty_out (vty, " bgp confederation identifier %i%s", bgp->confed_id,
5367 VTY_NEWLINE);
5368
5369 /* Confederation peer */
5370 if (bgp->confed_peers_cnt > 0)
5371 {
5372 int i;
5373
5374 vty_out (vty, " bgp confederation peers");
5375
5376 for (i = 0; i < bgp->confed_peers_cnt; i++)
5377 vty_out(vty, " %u", bgp->confed_peers[i]);
5378
5379 vty_out (vty, "%s", VTY_NEWLINE);
5380 }
5381
5382 /* BGP enforce-first-as. */
5383 if (bgp_flag_check (bgp, BGP_FLAG_ENFORCE_FIRST_AS))
5384 vty_out (vty, " bgp enforce-first-as%s", VTY_NEWLINE);
5385
5386 /* BGP deterministic-med. */
5387 if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
5388 vty_out (vty, " bgp deterministic-med%s", VTY_NEWLINE);
5389
5390 /* BGP update-delay. */
5391 bgp_config_write_update_delay (vty, bgp);
5392
5393 /* write quanta */
5394 bgp_config_write_wpkt_quanta (vty, bgp);
5395
5396 /* BGP graceful-restart. */
5397 if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
5398 vty_out (vty, " bgp graceful-restart stalepath-time %d%s",
5399 bgp->stalepath_time, VTY_NEWLINE);
5400 if (bgp_flag_check (bgp, BGP_FLAG_GRACEFUL_RESTART))
5401 vty_out (vty, " bgp graceful-restart%s", VTY_NEWLINE);
5402
5403 /* BGP bestpath method. */
5404 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
5405 vty_out (vty, " bgp bestpath as-path ignore%s", VTY_NEWLINE);
5406 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
5407 vty_out (vty, " bgp bestpath as-path confed%s", VTY_NEWLINE);
5408 if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
5409 vty_out (vty, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE);
5410 }
5411 if (bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID))
5412 vty_out (vty, " bgp bestpath compare-routerid%s", VTY_NEWLINE);
5413 if (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
5414 || bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
5415 {
5416 vty_out (vty, " bgp bestpath med");
5417 if (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED))
5418 vty_out (vty, " confed");
5419 if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
5420 vty_out (vty, " missing-as-worst");
5421 vty_out (vty, "%s", VTY_NEWLINE);
5422 }
5423
5424 /* BGP network import check. */
5425 if (bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
5426 vty_out (vty, " bgp network import-check%s", VTY_NEWLINE);
5427
5428 /* BGP scan interval. */
5429 bgp_config_write_scan_time (vty);
5430
5431 /* BGP flag dampening. */
5432 if (CHECK_FLAG (bgp->af_flags[AFI_IP][SAFI_UNICAST],
5433 BGP_CONFIG_DAMPENING))
5434 bgp_config_write_damp (vty);
5435
5436 /* BGP static route configuration. */
5437 bgp_config_write_network (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
5438
5439 /* BGP redistribute configuration. */
5440 bgp_config_write_redistribute (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
5441
5442 /* BGP timers configuration. */
5443 if (bgp->default_keepalive != BGP_DEFAULT_KEEPALIVE
5444 && bgp->default_holdtime != BGP_DEFAULT_HOLDTIME)
5445 vty_out (vty, " timers bgp %d %d%s", bgp->default_keepalive,
5446 bgp->default_holdtime, VTY_NEWLINE);
5447
5448 /* peer-group */
5449 for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
5450 {
5451 bgp_config_write_peer (vty, bgp, group->conf, AFI_IP, SAFI_UNICAST);
5452 }
5453
5454 /* Normal neighbor configuration. */
5455 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
5456 {
5457 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
5458 bgp_config_write_peer (vty, bgp, peer, AFI_IP, SAFI_UNICAST);
5459 }
5460
5461 /* maximum-paths */
5462 bgp_config_write_maxpaths (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
5463 bgp_config_write_table_map (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
5464
5465 /* Distance configuration. */
5466 bgp_config_write_distance (vty, bgp);
5467
5468 /* No auto-summary */
5469 if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
5470 vty_out (vty, " no auto-summary%s", VTY_NEWLINE);
5471
5472 /* IPv4 multicast configuration. */
5473 write += bgp_config_write_family (vty, bgp, AFI_IP, SAFI_MULTICAST);
5474
5475 /* IPv4 VPN configuration. */
5476 write += bgp_config_write_family (vty, bgp, AFI_IP, SAFI_MPLS_VPN);
5477
5478 /* IPv6 unicast configuration. */
5479 write += bgp_config_write_family (vty, bgp, AFI_IP6, SAFI_UNICAST);
5480
5481 /* IPv6 multicast configuration. */
5482 write += bgp_config_write_family (vty, bgp, AFI_IP6, SAFI_MULTICAST);
5483
5484 write++;
5485 }
5486 return write;
5487 }
5488
5489 void
5490 bgp_master_init (void)
5491 {
5492 memset (&bgp_master, 0, sizeof (struct bgp_master));
5493
5494 bm = &bgp_master;
5495 bm->bgp = list_new ();
5496 bm->listen_sockets = list_new ();
5497 bm->port = BGP_PORT_DEFAULT;
5498 bm->master = thread_master_create ();
5499 bm->start_time = bgp_clock ();
5500 }
5501
5502
5503 void
5504 bgp_init (void)
5505 {
5506 /* BGP VTY commands installation. */
5507 bgp_vty_init ();
5508
5509 /* Init zebra. */
5510 bgp_zebra_init ();
5511
5512 /* BGP inits. */
5513 bgp_attr_init ();
5514 bgp_debug_init ();
5515 bgp_dump_init ();
5516 bgp_route_init ();
5517 bgp_route_map_init ();
5518 bgp_address_init ();
5519 bgp_scan_init ();
5520 bgp_mplsvpn_init ();
5521
5522 /* Access list initialize. */
5523 access_list_init ();
5524 access_list_add_hook (peer_distribute_update);
5525 access_list_delete_hook (peer_distribute_update);
5526
5527 /* Filter list initialize. */
5528 bgp_filter_init ();
5529 as_list_add_hook (peer_aslist_update);
5530 as_list_delete_hook (peer_aslist_update);
5531
5532 /* Prefix list initialize.*/
5533 prefix_list_init ();
5534 prefix_list_add_hook (peer_prefix_list_update);
5535 prefix_list_delete_hook (peer_prefix_list_update);
5536
5537 /* Community list initialize. */
5538 bgp_clist = community_list_init ();
5539
5540 #ifdef HAVE_SNMP
5541 bgp_snmp_init ();
5542 #endif /* HAVE_SNMP */
5543 }
5544
5545 void
5546 bgp_terminate (void)
5547 {
5548 struct bgp *bgp;
5549 struct peer *peer;
5550 struct listnode *node, *nnode;
5551 struct listnode *mnode, *mnnode;
5552
5553 for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
5554 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
5555 if (peer->status == Established)
5556 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
5557 BGP_NOTIFY_CEASE_PEER_UNCONFIG);
5558
5559 bgp_cleanup_routes ();
5560
5561 if (bm->process_main_queue)
5562 {
5563 work_queue_free (bm->process_main_queue);
5564 bm->process_main_queue = NULL;
5565 }
5566 if (bm->process_rsclient_queue)
5567 {
5568 work_queue_free (bm->process_rsclient_queue);
5569 bm->process_rsclient_queue = NULL;
5570 }
5571 }