]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_zebra.c
3d3bd90f5be4aaee97bdd9b0694e8c186eb54adf
[mirror_frr.git] / bgpd / bgp_zebra.c
1 /* zebra client
2 Copyright (C) 1997, 98, 99 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
18 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include <zebra.h>
22
23 #include "command.h"
24 #include "stream.h"
25 #include "network.h"
26 #include "prefix.h"
27 #include "log.h"
28 #include "sockunion.h"
29 #include "zclient.h"
30 #include "routemap.h"
31 #include "thread.h"
32 #include "queue.h"
33 #include "memory.h"
34 #include "lib/json.h"
35 #include "lib/bfd.h"
36 #include "filter.h"
37
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_route.h"
40 #include "bgpd/bgp_attr.h"
41 #include "bgpd/bgp_nexthop.h"
42 #include "bgpd/bgp_zebra.h"
43 #include "bgpd/bgp_fsm.h"
44 #include "bgpd/bgp_debug.h"
45 #include "bgpd/bgp_mpath.h"
46 #include "bgpd/bgp_nexthop.h"
47 #include "bgpd/bgp_nht.h"
48 #include "bgpd/bgp_bfd.h"
49 #if ENABLE_BGP_VNC
50 # include "bgpd/rfapi/rfapi_backend.h"
51 # include "bgpd/rfapi/vnc_export_bgp.h"
52 #endif
53
54 /* All information about zebra. */
55 struct zclient *zclient = NULL;
56
57 /* Growable buffer for nexthops sent to zebra */
58 struct stream *bgp_nexthop_buf = NULL;
59 struct stream *bgp_ifindices_buf = NULL;
60
61 /* These array buffers are used in making a copy of the attributes for
62 route-map apply. Arrays are being used here to minimize mallocs and
63 frees for the temporary copy of the attributes.
64 Given the zapi api expects the nexthop buffer to contain pointer to
65 pointers for nexthops, we couldnt have used a single nexthop variable
66 on the stack, hence we had two options:
67 1. maintain a linked-list and free it after zapi_*_route call
68 2. use an array to avoid number of mallocs.
69 Number of supported next-hops are finite, use of arrays should be ok. */
70 struct attr attr_cp[MULTIPATH_NUM];
71 struct attr_extra attr_extra_cp[MULTIPATH_NUM];
72 int attr_index = 0;
73
74 /* Once per address-family initialization of the attribute array */
75 #define BGP_INFO_ATTR_BUF_INIT()\
76 do {\
77 memset(attr_cp, 0, MULTIPATH_NUM * sizeof(struct attr));\
78 memset(attr_extra_cp, 0, MULTIPATH_NUM * sizeof(struct attr_extra));\
79 attr_index = 0;\
80 } while (0)
81
82 #define BGP_INFO_ATTR_BUF_COPY(info_src, info_dst)\
83 do { \
84 *info_dst = *info_src; \
85 assert(attr_index != MULTIPATH_NUM);\
86 attr_cp[attr_index].extra = &attr_extra_cp[attr_index]; \
87 bgp_attr_dup (&attr_cp[attr_index], info_src->attr); \
88 bgp_attr_deep_dup (&attr_cp[attr_index], info_src->attr); \
89 info_dst->attr = &attr_cp[attr_index]; \
90 attr_index++;\
91 } while (0)
92
93 #define BGP_INFO_ATTR_BUF_FREE(info) \
94 do { \
95 bgp_attr_deep_free(info->attr); \
96 } while (0)
97
98
99 /* Can we install into zebra? */
100 static inline int
101 bgp_install_info_to_zebra (struct bgp *bgp)
102 {
103 if (zclient->sock <= 0)
104 return 0;
105
106 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
107 return 0;
108
109 return 1;
110 }
111
112 int zclient_num_connects;
113
114 /* Router-id update message from zebra. */
115 static int
116 bgp_router_id_update (int command, struct zclient *zclient, zebra_size_t length,
117 vrf_id_t vrf_id)
118 {
119 struct prefix router_id;
120
121 zebra_router_id_update_read(zclient->ibuf,&router_id);
122
123 if (BGP_DEBUG (zebra, ZEBRA))
124 {
125 char buf[PREFIX2STR_BUFFER];
126 prefix2str(&router_id, buf, sizeof(buf));
127 zlog_debug("Rx Router Id update VRF %u Id %s", vrf_id, buf);
128 }
129
130 bgp_router_id_zebra_bump (vrf_id, &router_id);
131 return 0;
132 }
133
134 /* Nexthop update message from zebra. */
135 static int
136 bgp_read_nexthop_update (int command, struct zclient *zclient,
137 zebra_size_t length, vrf_id_t vrf_id)
138 {
139 bgp_parse_nexthop_update(command, vrf_id);
140 return 0;
141 }
142
143 static int
144 bgp_read_import_check_update(int command, struct zclient *zclient,
145 zebra_size_t length, vrf_id_t vrf_id)
146 {
147 bgp_parse_nexthop_update(command, vrf_id);
148 return 0;
149 }
150
151 /* Set or clear interface on which unnumbered neighbor is configured. This
152 * would in turn cause BGP to initiate or turn off IPv6 RAs on this
153 * interface.
154 */
155 static void
156 bgp_update_interface_nbrs (struct bgp *bgp, struct interface *ifp,
157 struct interface *upd_ifp)
158 {
159 struct listnode *node, *nnode;
160 struct peer *peer;
161
162 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
163 {
164 if (peer->conf_if &&
165 (strcmp (peer->conf_if, ifp->name) == 0))
166 {
167 if (upd_ifp)
168 {
169 peer->ifp = upd_ifp;
170 bgp_zebra_initiate_radv (bgp, peer);
171 }
172 else
173 {
174 bgp_zebra_terminate_radv (bgp, peer);
175 peer->ifp = upd_ifp;
176 }
177 }
178 }
179 }
180
181 static void
182 bgp_start_interface_nbrs (struct bgp *bgp, struct interface *ifp)
183 {
184 struct listnode *node, *nnode;
185 struct peer *peer;
186
187 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
188 {
189 if (peer->conf_if &&
190 (strcmp (peer->conf_if, ifp->name) == 0) &&
191 peer->status != Established)
192 {
193 if (peer_active(peer))
194 BGP_EVENT_ADD (peer, BGP_Stop);
195 BGP_EVENT_ADD (peer, BGP_Start);
196 }
197 }
198 }
199
200 static void
201 bgp_nbr_connected_add (struct bgp *bgp, struct nbr_connected *ifc)
202 {
203 struct listnode *node;
204 struct connected *connected;
205 struct interface *ifp;
206 struct prefix *p;
207
208 /* Kick-off the FSM for any relevant peers only if there is a
209 * valid local address on the interface.
210 */
211 ifp = ifc->ifp;
212 for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected))
213 {
214 p = connected->address;
215 if (p->family == AF_INET6 &&
216 IN6_IS_ADDR_LINKLOCAL (&p->u.prefix6))
217 break;
218 }
219 if (!connected)
220 return;
221
222 bgp_start_interface_nbrs (bgp, ifp);
223 }
224
225 static void
226 bgp_nbr_connected_delete (struct bgp *bgp, struct nbr_connected *ifc, int del)
227 {
228 struct listnode *node, *nnode;
229 struct peer *peer;
230 struct interface *ifp;
231
232 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
233 {
234 if (peer->conf_if && (strcmp (peer->conf_if, ifc->ifp->name) == 0))
235 {
236 peer->last_reset = PEER_DOWN_NBR_ADDR_DEL;
237 BGP_EVENT_ADD (peer, BGP_Stop);
238 }
239 }
240 /* Free neighbor also, if we're asked to. */
241 if (del)
242 {
243 ifp = ifc->ifp;
244 listnode_delete (ifp->nbr_connected, ifc);
245 nbr_connected_free (ifc);
246 }
247 }
248
249 /* Inteface addition message from zebra. */
250 static int
251 bgp_interface_add (int command, struct zclient *zclient, zebra_size_t length,
252 vrf_id_t vrf_id)
253 {
254 struct interface *ifp;
255 struct bgp *bgp;
256
257 ifp = zebra_interface_add_read (zclient->ibuf, vrf_id);
258 if (!ifp) // unexpected
259 return 0;
260
261 if (BGP_DEBUG (zebra, ZEBRA) && ifp)
262 zlog_debug("Rx Intf add VRF %u IF %s", vrf_id, ifp->name);
263
264 bgp = bgp_lookup_by_vrf_id (vrf_id);
265 if (!bgp)
266 return 0;
267
268 bgp_update_interface_nbrs (bgp, ifp, ifp);
269 return 0;
270 }
271
272 static int
273 bgp_interface_delete (int command, struct zclient *zclient,
274 zebra_size_t length, vrf_id_t vrf_id)
275 {
276 struct stream *s;
277 struct interface *ifp;
278 struct bgp *bgp;
279
280 s = zclient->ibuf;
281 ifp = zebra_interface_state_read (s, vrf_id);
282 if (!ifp) /* This may happen if we've just unregistered for a VRF. */
283 return 0;
284
285 ifp->ifindex = IFINDEX_DELETED;
286
287 if (BGP_DEBUG (zebra, ZEBRA))
288 zlog_debug("Rx Intf del VRF %u IF %s", vrf_id, ifp->name);
289
290 bgp = bgp_lookup_by_vrf_id (vrf_id);
291 if (!bgp)
292 return 0;
293
294 bgp_update_interface_nbrs (bgp, ifp, NULL);
295 return 0;
296 }
297
298 static int
299 bgp_interface_up (int command, struct zclient *zclient, zebra_size_t length,
300 vrf_id_t vrf_id)
301 {
302 struct stream *s;
303 struct interface *ifp;
304 struct connected *c;
305 struct nbr_connected *nc;
306 struct listnode *node, *nnode;
307 struct bgp *bgp;
308
309 s = zclient->ibuf;
310 ifp = zebra_interface_state_read (s, vrf_id);
311
312 if (! ifp)
313 return 0;
314
315 if (BGP_DEBUG (zebra, ZEBRA))
316 zlog_debug("Rx Intf up VRF %u IF %s", vrf_id, ifp->name);
317
318 bgp = bgp_lookup_by_vrf_id (vrf_id);
319 if (!bgp)
320 return 0;
321
322 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
323 bgp_connected_add (bgp, c);
324
325 for (ALL_LIST_ELEMENTS (ifp->nbr_connected, node, nnode, nc))
326 bgp_nbr_connected_add (bgp, nc);
327
328 return 0;
329 }
330
331 static int
332 bgp_interface_down (int command, struct zclient *zclient, zebra_size_t length,
333 vrf_id_t vrf_id)
334 {
335 struct stream *s;
336 struct interface *ifp;
337 struct connected *c;
338 struct nbr_connected *nc;
339 struct listnode *node, *nnode;
340 struct bgp *bgp;
341
342 s = zclient->ibuf;
343 ifp = zebra_interface_state_read (s, vrf_id);
344 if (! ifp)
345 return 0;
346
347 if (BGP_DEBUG (zebra, ZEBRA))
348 zlog_debug("Rx Intf down VRF %u IF %s", vrf_id, ifp->name);
349
350 bgp = bgp_lookup_by_vrf_id (vrf_id);
351 if (!bgp)
352 return 0;
353
354 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
355 bgp_connected_delete (bgp, c);
356
357 for (ALL_LIST_ELEMENTS (ifp->nbr_connected, node, nnode, nc))
358 bgp_nbr_connected_delete (bgp, nc, 1);
359
360 /* Fast external-failover */
361 {
362 struct peer *peer;
363
364 if (CHECK_FLAG (bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
365 return 0;
366
367 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
368 {
369 #if defined(HAVE_CUMULUS)
370 /* Take down directly connected EBGP peers as well as 1-hop BFD
371 * tracked (directly connected) IBGP peers.
372 */
373 if ((peer->ttl != 1) && (peer->gtsm_hops != 1) &&
374 (!peer->bfd_info || bgp_bfd_is_peer_multihop(peer)))
375 #else
376 /* Take down directly connected EBGP peers */
377 if ((peer->ttl != 1) && (peer->gtsm_hops != 1))
378 #endif
379 continue;
380
381 if (ifp == peer->nexthop.ifp)
382 {
383 BGP_EVENT_ADD (peer, BGP_Stop);
384 peer->last_reset = PEER_DOWN_IF_DOWN;
385 }
386 }
387 }
388
389 return 0;
390 }
391
392 static int
393 bgp_interface_address_add (int command, struct zclient *zclient,
394 zebra_size_t length, vrf_id_t vrf_id)
395 {
396 struct connected *ifc;
397
398 ifc = zebra_interface_address_read (command, zclient->ibuf, vrf_id);
399
400 if (ifc == NULL)
401 return 0;
402
403 if (bgp_debug_zebra(ifc->address))
404 {
405 char buf[PREFIX2STR_BUFFER];
406 prefix2str(ifc->address, buf, sizeof(buf));
407 zlog_debug("Rx Intf address add VRF %u IF %s addr %s",
408 vrf_id, ifc->ifp->name, buf);
409 }
410
411 if (if_is_operative (ifc->ifp))
412 {
413 struct bgp *bgp;
414
415 bgp = bgp_lookup_by_vrf_id (vrf_id);
416 if (!bgp)
417 return 0;
418
419 bgp_connected_add (bgp, ifc);
420 /* If we have learnt of any neighbors on this interface,
421 * check to kick off any BGP interface-based neighbors,
422 * but only if this is a link-local address.
423 */
424 if (IN6_IS_ADDR_LINKLOCAL(&ifc->address->u.prefix6) &&
425 !list_isempty(ifc->ifp->nbr_connected))
426 bgp_start_interface_nbrs (bgp, ifc->ifp);
427 }
428
429 return 0;
430 }
431
432 static int
433 bgp_interface_address_delete (int command, struct zclient *zclient,
434 zebra_size_t length, vrf_id_t vrf_id)
435 {
436 struct connected *ifc;
437 struct bgp *bgp;
438
439 ifc = zebra_interface_address_read (command, zclient->ibuf, vrf_id);
440
441 if (ifc == NULL)
442 return 0;
443
444 if (bgp_debug_zebra(ifc->address))
445 {
446 char buf[PREFIX2STR_BUFFER];
447 prefix2str(ifc->address, buf, sizeof(buf));
448 zlog_debug("Rx Intf address del VRF %u IF %s addr %s",
449 vrf_id, ifc->ifp->name, buf);
450 }
451
452 if (if_is_operative (ifc->ifp))
453 {
454 bgp = bgp_lookup_by_vrf_id (vrf_id);
455 if (bgp)
456 bgp_connected_delete (bgp, ifc);
457 }
458
459 connected_free (ifc);
460
461 return 0;
462 }
463
464 static int
465 bgp_interface_nbr_address_add (int command, struct zclient *zclient,
466 zebra_size_t length, vrf_id_t vrf_id)
467 {
468 struct nbr_connected *ifc = NULL;
469 struct bgp *bgp;
470
471 ifc = zebra_interface_nbr_address_read (command, zclient->ibuf, vrf_id);
472
473 if (ifc == NULL)
474 return 0;
475
476 if (bgp_debug_zebra(ifc->address))
477 {
478 char buf[PREFIX2STR_BUFFER];
479 prefix2str(ifc->address, buf, sizeof(buf));
480 zlog_debug("Rx Intf neighbor add VRF %u IF %s addr %s",
481 vrf_id, ifc->ifp->name, buf);
482 }
483
484 if (if_is_operative (ifc->ifp))
485 {
486 bgp = bgp_lookup_by_vrf_id (vrf_id);
487 if (bgp)
488 bgp_nbr_connected_add (bgp, ifc);
489 }
490
491 return 0;
492 }
493
494 static int
495 bgp_interface_nbr_address_delete (int command, struct zclient *zclient,
496 zebra_size_t length, vrf_id_t vrf_id)
497 {
498 struct nbr_connected *ifc = NULL;
499 struct bgp *bgp;
500
501 ifc = zebra_interface_nbr_address_read (command, zclient->ibuf, vrf_id);
502
503 if (ifc == NULL)
504 return 0;
505
506 if (bgp_debug_zebra(ifc->address))
507 {
508 char buf[PREFIX2STR_BUFFER];
509 prefix2str(ifc->address, buf, sizeof(buf));
510 zlog_debug("Rx Intf neighbor del VRF %u IF %s addr %s",
511 vrf_id, ifc->ifp->name, buf);
512 }
513
514 if (if_is_operative (ifc->ifp))
515 {
516 bgp = bgp_lookup_by_vrf_id (vrf_id);
517 if (bgp)
518 bgp_nbr_connected_delete (bgp, ifc, 0);
519 }
520
521 nbr_connected_free (ifc);
522
523 return 0;
524 }
525
526 /* VRF update for an interface. */
527 static int
528 bgp_interface_vrf_update (int command, struct zclient *zclient, zebra_size_t length,
529 vrf_id_t vrf_id)
530 {
531 struct interface *ifp;
532 vrf_id_t new_vrf_id;
533 struct connected *c;
534 struct nbr_connected *nc;
535 struct listnode *node, *nnode;
536 struct bgp *bgp;
537
538 ifp = zebra_interface_vrf_update_read (zclient->ibuf, vrf_id, &new_vrf_id);
539 if (! ifp)
540 return 0;
541
542 if (BGP_DEBUG (zebra, ZEBRA) && ifp)
543 zlog_debug("Rx Intf VRF change VRF %u IF %s NewVRF %u",
544 vrf_id, ifp->name, new_vrf_id);
545
546 bgp = bgp_lookup_by_vrf_id (vrf_id);
547 if (!bgp)
548 return 0;
549
550 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
551 bgp_connected_delete (bgp, c);
552
553 for (ALL_LIST_ELEMENTS (ifp->nbr_connected, node, nnode, nc))
554 bgp_nbr_connected_delete (bgp, nc, 1);
555
556 /* Fast external-failover */
557 {
558 struct peer *peer;
559
560 if (CHECK_FLAG (bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
561 return 0;
562
563 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
564 {
565 if ((peer->ttl != 1) && (peer->gtsm_hops != 1))
566 continue;
567
568 if (ifp == peer->nexthop.ifp)
569 BGP_EVENT_ADD (peer, BGP_Stop);
570 }
571 }
572
573 if_update_vrf (ifp, ifp->name, strlen (ifp->name), new_vrf_id);
574
575 bgp = bgp_lookup_by_vrf_id (new_vrf_id);
576 if (!bgp)
577 return 0;
578
579 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
580 bgp_connected_add (bgp, c);
581
582 for (ALL_LIST_ELEMENTS (ifp->nbr_connected, node, nnode, nc))
583 bgp_nbr_connected_add (bgp, nc);
584 return 0;
585 }
586
587 /* Zebra route add and delete treatment. */
588 static int
589 zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length,
590 vrf_id_t vrf_id)
591 {
592 struct stream *s;
593 struct zapi_ipv4 api;
594 struct in_addr nexthop;
595 struct prefix_ipv4 p;
596 unsigned int ifindex;
597 int i;
598 struct bgp *bgp;
599
600 bgp = bgp_lookup_by_vrf_id (vrf_id);
601 if (!bgp)
602 return 0;
603
604 s = zclient->ibuf;
605 nexthop.s_addr = 0;
606
607 /* Type, flags, message. */
608 api.type = stream_getc (s);
609 api.instance = stream_getw (s);
610 api.flags = stream_getl (s);
611 api.message = stream_getc (s);
612
613 /* IPv4 prefix. */
614 memset (&p, 0, sizeof (struct prefix_ipv4));
615 p.family = AF_INET;
616 p.prefixlen = MIN(IPV4_MAX_PREFIXLEN, stream_getc (s));
617 stream_get (&p.prefix, s, PSIZE (p.prefixlen));
618
619 /* Nexthop, ifindex, distance, metric. */
620 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
621 {
622 api.nexthop_num = stream_getc (s);
623 nexthop.s_addr = stream_get_ipv4 (s);
624 }
625
626 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
627 {
628 api.ifindex_num = stream_getc (s);
629 ifindex = stream_getl (s); /* ifindex, unused */
630 }
631 else
632 {
633 ifindex = 0;
634 }
635
636 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
637 api.distance = stream_getc (s);
638
639 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
640 api.metric = stream_getl (s);
641 else
642 api.metric = 0;
643
644 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_TAG))
645 api.tag = stream_getl (s);
646 else
647 api.tag = 0;
648
649 if (command == ZEBRA_REDISTRIBUTE_IPV4_ADD)
650 {
651 if (bgp_debug_zebra((struct prefix *)&p))
652 {
653 char buf[2][INET_ADDRSTRLEN];
654 zlog_debug("Rx IPv4 route add VRF %u %s[%d] %s/%d nexthop %s metric %u tag %"ROUTE_TAG_PRI,
655 vrf_id,
656 zebra_route_string(api.type), api.instance,
657 inet_ntop(AF_INET, &p.prefix, buf[0], sizeof(buf[0])),
658 p.prefixlen,
659 inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])),
660 api.metric,
661 api.tag);
662 }
663
664 /*
665 * The ADD message is actually an UPDATE and there is no explicit DEL
666 * for a prior redistributed route, if any. So, perform an implicit
667 * DEL processing for the same redistributed route from any other
668 * source type.
669 */
670 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
671 {
672 if (i != api.type)
673 bgp_redistribute_delete(bgp, (struct prefix *)&p, i, api.instance);
674 }
675
676 /* Now perform the add/update. */
677 bgp_redistribute_add(bgp, (struct prefix *)&p, &nexthop, NULL, ifindex,
678 api.metric, api.type, api.instance, api.tag);
679 }
680 else if (command == ZEBRA_REDISTRIBUTE_IPV4_DEL)
681 {
682 if (bgp_debug_zebra((struct prefix *)&p))
683 {
684 char buf[2][INET_ADDRSTRLEN];
685 zlog_debug("Rx IPv4 route delete VRF %u %s[%d] %s/%d "
686 "nexthop %s metric %u tag %"ROUTE_TAG_PRI,
687 vrf_id,
688 zebra_route_string(api.type), api.instance,
689 inet_ntop(AF_INET, &p.prefix, buf[0], sizeof(buf[0])),
690 p.prefixlen,
691 inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])),
692 api.metric,
693 api.tag);
694 }
695 bgp_redistribute_delete(bgp, (struct prefix *)&p, api.type, api.instance);
696 }
697
698 return 0;
699 }
700
701 #ifdef HAVE_IPV6
702 /* Zebra route add and delete treatment. */
703 static int
704 zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length,
705 vrf_id_t vrf_id)
706 {
707 struct stream *s;
708 struct zapi_ipv6 api;
709 struct in6_addr nexthop;
710 struct prefix_ipv6 p;
711 unsigned int ifindex;
712 int i;
713 struct bgp *bgp;
714
715 bgp = bgp_lookup_by_vrf_id (vrf_id);
716 if (!bgp)
717 return 0;
718
719 s = zclient->ibuf;
720 memset (&nexthop, 0, sizeof (struct in6_addr));
721
722 /* Type, flags, message. */
723 api.type = stream_getc (s);
724 api.instance = stream_getw (s);
725 api.flags = stream_getl (s);
726 api.message = stream_getc (s);
727
728 /* IPv6 prefix. */
729 memset (&p, 0, sizeof (struct prefix_ipv6));
730 p.family = AF_INET6;
731 p.prefixlen = MIN(IPV6_MAX_PREFIXLEN, stream_getc (s));
732 stream_get (&p.prefix, s, PSIZE (p.prefixlen));
733
734 /* Nexthop, ifindex, distance, metric. */
735 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
736 {
737 api.nexthop_num = stream_getc (s);
738 stream_get (&nexthop, s, 16);
739 }
740
741 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
742 {
743 api.ifindex_num = stream_getc (s);
744 ifindex = stream_getl (s); /* ifindex, unused */
745 }
746 else
747 {
748 ifindex = 0;
749 }
750
751 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
752 api.distance = stream_getc (s);
753 else
754 api.distance = 0;
755
756 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
757 api.metric = stream_getl (s);
758 else
759 api.metric = 0;
760
761 if (CHECK_FLAG (api.message, ZAPI_MESSAGE_TAG))
762 api.tag = stream_getl (s);
763 else
764 api.tag = 0;
765
766 /* Simply ignore link-local address. */
767 if (IN6_IS_ADDR_LINKLOCAL (&p.prefix))
768 return 0;
769
770 if (command == ZEBRA_REDISTRIBUTE_IPV6_ADD)
771 {
772 if (bgp_debug_zebra((struct prefix *)&p))
773 {
774 char buf[2][INET6_ADDRSTRLEN];
775 zlog_debug("Rx IPv6 route add VRF %u %s[%d] %s/%d nexthop %s metric %u tag %"ROUTE_TAG_PRI,
776 vrf_id,
777 zebra_route_string(api.type), api.instance,
778 inet_ntop(AF_INET6, &p.prefix, buf[0], sizeof(buf[0])),
779 p.prefixlen,
780 inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])),
781 api.metric,
782 api.tag);
783 }
784
785 /*
786 * The ADD message is actually an UPDATE and there is no explicit DEL
787 * for a prior redistributed route, if any. So, perform an implicit
788 * DEL processing for the same redistributed route from any other
789 * source type.
790 */
791 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
792 {
793 if (i != api.type)
794 bgp_redistribute_delete(bgp, (struct prefix *)&p, i, api.instance);
795 }
796
797 bgp_redistribute_add (bgp, (struct prefix *)&p, NULL, &nexthop, ifindex,
798 api.metric, api.type, api.instance, api.tag);
799 }
800 else if (command == ZEBRA_REDISTRIBUTE_IPV6_DEL)
801 {
802 if (bgp_debug_zebra((struct prefix *)&p))
803 {
804 char buf[2][INET6_ADDRSTRLEN];
805 zlog_debug("Rx IPv6 route delete VRF %u %s[%d] %s/%d "
806 "nexthop %s metric %u tag %"ROUTE_TAG_PRI,
807 vrf_id,
808 zebra_route_string(api.type), api.instance,
809 inet_ntop(AF_INET6, &p.prefix, buf[0], sizeof(buf[0])),
810 p.prefixlen,
811 inet_ntop(AF_INET6, &nexthop, buf[1], sizeof(buf[1])),
812 api.metric,
813 api.tag);
814 }
815 bgp_redistribute_delete (bgp, (struct prefix *) &p, api.type, api.instance);
816 }
817
818 return 0;
819 }
820 #endif /* HAVE_IPV6 */
821
822 struct interface *
823 if_lookup_by_ipv4 (struct in_addr *addr, vrf_id_t vrf_id)
824 {
825 struct listnode *ifnode;
826 struct listnode *cnode;
827 struct interface *ifp;
828 struct connected *connected;
829 struct prefix_ipv4 p;
830 struct prefix *cp;
831
832 p.family = AF_INET;
833 p.prefix = *addr;
834 p.prefixlen = IPV4_MAX_BITLEN;
835
836 for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
837 {
838 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
839 {
840 cp = connected->address;
841
842 if (cp->family == AF_INET)
843 if (prefix_match (cp, (struct prefix *)&p))
844 return ifp;
845 }
846 }
847 return NULL;
848 }
849
850 struct interface *
851 if_lookup_by_ipv4_exact (struct in_addr *addr, vrf_id_t vrf_id)
852 {
853 struct listnode *ifnode;
854 struct listnode *cnode;
855 struct interface *ifp;
856 struct connected *connected;
857 struct prefix *cp;
858
859 for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
860 {
861 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
862 {
863 cp = connected->address;
864
865 if (cp->family == AF_INET)
866 if (IPV4_ADDR_SAME (&cp->u.prefix4, addr))
867 return ifp;
868 }
869 }
870 return NULL;
871 }
872
873 #ifdef HAVE_IPV6
874 struct interface *
875 if_lookup_by_ipv6 (struct in6_addr *addr, ifindex_t ifindex, vrf_id_t vrf_id)
876 {
877 struct listnode *ifnode;
878 struct listnode *cnode;
879 struct interface *ifp;
880 struct connected *connected;
881 struct prefix_ipv6 p;
882 struct prefix *cp;
883
884 p.family = AF_INET6;
885 p.prefix = *addr;
886 p.prefixlen = IPV6_MAX_BITLEN;
887
888 for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
889 {
890 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
891 {
892 cp = connected->address;
893
894 if (cp->family == AF_INET6)
895 if (prefix_match (cp, (struct prefix *)&p))
896 {
897 if (IN6_IS_ADDR_LINKLOCAL(&cp->u.prefix6))
898 {
899 if (ifindex == ifp->ifindex)
900 return ifp;
901 }
902 else
903 return ifp;
904 }
905 }
906 }
907 return NULL;
908 }
909
910 struct interface *
911 if_lookup_by_ipv6_exact (struct in6_addr *addr, ifindex_t ifindex, vrf_id_t vrf_id)
912 {
913 struct listnode *ifnode;
914 struct listnode *cnode;
915 struct interface *ifp;
916 struct connected *connected;
917 struct prefix *cp;
918
919 for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
920 {
921 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
922 {
923 cp = connected->address;
924
925 if (cp->family == AF_INET6)
926 if (IPV6_ADDR_SAME (&cp->u.prefix6, addr))
927 {
928 if (IN6_IS_ADDR_LINKLOCAL(&cp->u.prefix6))
929 {
930 if (ifindex == ifp->ifindex)
931 return ifp;
932 }
933 else
934 return ifp;
935 }
936 }
937 }
938 return NULL;
939 }
940
941 static int
942 if_get_ipv6_global (struct interface *ifp, struct in6_addr *addr)
943 {
944 struct listnode *cnode;
945 struct connected *connected;
946 struct prefix *cp;
947
948 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
949 {
950 cp = connected->address;
951
952 if (cp->family == AF_INET6)
953 if (! IN6_IS_ADDR_LINKLOCAL (&cp->u.prefix6))
954 {
955 memcpy (addr, &cp->u.prefix6, IPV6_MAX_BYTELEN);
956 return 1;
957 }
958 }
959 return 0;
960 }
961
962 static int
963 if_get_ipv6_local (struct interface *ifp, struct in6_addr *addr)
964 {
965 struct listnode *cnode;
966 struct connected *connected;
967 struct prefix *cp;
968
969 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
970 {
971 cp = connected->address;
972
973 if (cp->family == AF_INET6)
974 if (IN6_IS_ADDR_LINKLOCAL (&cp->u.prefix6))
975 {
976 memcpy (addr, &cp->u.prefix6, IPV6_MAX_BYTELEN);
977 return 1;
978 }
979 }
980 return 0;
981 }
982 #endif /* HAVE_IPV6 */
983
984 static int
985 if_get_ipv4_address (struct interface *ifp, struct in_addr *addr)
986 {
987 struct listnode *cnode;
988 struct connected *connected;
989 struct prefix *cp;
990
991 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
992 {
993 cp = connected->address;
994 if ((cp->family == AF_INET) && !ipv4_martian(&(cp->u.prefix4)))
995 {
996 *addr = cp->u.prefix4;
997 return 1;
998 }
999 }
1000 return 0;
1001 }
1002
1003 int
1004 bgp_nexthop_set (union sockunion *local, union sockunion *remote,
1005 struct bgp_nexthop *nexthop, struct peer *peer)
1006 {
1007 int ret = 0;
1008 struct interface *ifp = NULL;
1009
1010 memset (nexthop, 0, sizeof (struct bgp_nexthop));
1011
1012 if (!local)
1013 return -1;
1014 if (!remote)
1015 return -1;
1016
1017 if (local->sa.sa_family == AF_INET)
1018 {
1019 nexthop->v4 = local->sin.sin_addr;
1020 if (peer->update_if)
1021 ifp = if_lookup_by_name_vrf (peer->update_if, peer->bgp->vrf_id);
1022 else
1023 ifp = if_lookup_by_ipv4_exact (&local->sin.sin_addr, peer->bgp->vrf_id);
1024 }
1025 #ifdef HAVE_IPV6
1026 if (local->sa.sa_family == AF_INET6)
1027 {
1028 if (IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr))
1029 {
1030 if (peer->conf_if || peer->ifname)
1031 ifp = if_lookup_by_name_vrf (peer->conf_if ? peer->conf_if : peer->ifname, peer->bgp->vrf_id);
1032 }
1033 else if (peer->update_if)
1034 ifp = if_lookup_by_name_vrf (peer->update_if, peer->bgp->vrf_id);
1035 else
1036 ifp = if_lookup_by_ipv6_exact (&local->sin6.sin6_addr,
1037 local->sin6.sin6_scope_id,
1038 peer->bgp->vrf_id);
1039 }
1040 #endif /* HAVE_IPV6 */
1041
1042 if (!ifp)
1043 return -1;
1044
1045 nexthop->ifp = ifp;
1046
1047 /* IPv4 connection, fetch and store IPv6 local address(es) if any. */
1048 if (local->sa.sa_family == AF_INET)
1049 {
1050 #ifdef HAVE_IPV6
1051 /* IPv6 nexthop*/
1052 ret = if_get_ipv6_global (ifp, &nexthop->v6_global);
1053
1054 if (!ret)
1055 {
1056 /* There is no global nexthop. Use link-local address as both the
1057 * global and link-local nexthop. In this scenario, the expectation
1058 * for interop is that the network admin would use a route-map to
1059 * specify the global IPv6 nexthop.
1060 */
1061 if_get_ipv6_local (ifp, &nexthop->v6_global);
1062 memcpy (&nexthop->v6_local, &nexthop->v6_global,
1063 IPV6_MAX_BYTELEN);
1064 }
1065 else
1066 if_get_ipv6_local (ifp, &nexthop->v6_local);
1067
1068 if (if_lookup_by_ipv4 (&remote->sin.sin_addr, peer->bgp->vrf_id))
1069 peer->shared_network = 1;
1070 else
1071 peer->shared_network = 0;
1072 #endif /* HAVE_IPV6 */
1073 }
1074
1075 #ifdef HAVE_IPV6
1076 /* IPv6 connection, fetch and store IPv4 local address if any. */
1077 if (local->sa.sa_family == AF_INET6)
1078 {
1079 struct interface *direct = NULL;
1080
1081 /* IPv4 nexthop. */
1082 ret = if_get_ipv4_address(ifp, &nexthop->v4);
1083 if (!ret && peer->local_id.s_addr)
1084 nexthop->v4 = peer->local_id;
1085
1086 /* Global address*/
1087 if (! IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr))
1088 {
1089 memcpy (&nexthop->v6_global, &local->sin6.sin6_addr,
1090 IPV6_MAX_BYTELEN);
1091
1092 /* If directory connected set link-local address. */
1093 direct = if_lookup_by_ipv6 (&remote->sin6.sin6_addr,
1094 remote->sin6.sin6_scope_id, peer->bgp->vrf_id);
1095 if (direct)
1096 if_get_ipv6_local (ifp, &nexthop->v6_local);
1097 }
1098 else
1099 /* Link-local address. */
1100 {
1101 ret = if_get_ipv6_global (ifp, &nexthop->v6_global);
1102
1103 /* If there is no global address. Set link-local address as
1104 global. I know this break RFC specification... */
1105 /* In this scenario, the expectation for interop is that the
1106 * network admin would use a route-map to specify the global
1107 * IPv6 nexthop.
1108 */
1109 if (!ret)
1110 memcpy (&nexthop->v6_global, &local->sin6.sin6_addr,
1111 IPV6_MAX_BYTELEN);
1112 /* Always set the link-local address */
1113 memcpy (&nexthop->v6_local, &local->sin6.sin6_addr,
1114 IPV6_MAX_BYTELEN);
1115 }
1116
1117 if (IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr) ||
1118 if_lookup_by_ipv6 (&remote->sin6.sin6_addr, remote->sin6.sin6_scope_id,
1119 peer->bgp->vrf_id))
1120 peer->shared_network = 1;
1121 else
1122 peer->shared_network = 0;
1123 }
1124
1125 /* KAME stack specific treatment. */
1126 #ifdef KAME
1127 if (IN6_IS_ADDR_LINKLOCAL (&nexthop->v6_global)
1128 && IN6_LINKLOCAL_IFINDEX (nexthop->v6_global))
1129 {
1130 SET_IN6_LINKLOCAL_IFINDEX (nexthop->v6_global, 0);
1131 }
1132 if (IN6_IS_ADDR_LINKLOCAL (&nexthop->v6_local)
1133 && IN6_LINKLOCAL_IFINDEX (nexthop->v6_local))
1134 {
1135 SET_IN6_LINKLOCAL_IFINDEX (nexthop->v6_local, 0);
1136 }
1137 #endif /* KAME */
1138 #endif /* HAVE_IPV6 */
1139
1140 /* If we have identified the local interface, there is no error for now. */
1141 return 0;
1142 }
1143
1144 static struct in6_addr *
1145 bgp_info_to_ipv6_nexthop (struct bgp_info *info)
1146 {
1147 struct in6_addr *nexthop = NULL;
1148
1149 /* Only global address nexthop exists. */
1150 if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
1151 nexthop = &info->attr->extra->mp_nexthop_global;
1152
1153 /* If both global and link-local address present. */
1154 if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
1155 {
1156 /* Check if route-map is set to prefer global over link-local */
1157 if (info->attr->extra->mp_nexthop_prefer_global)
1158 nexthop = &info->attr->extra->mp_nexthop_global;
1159 else
1160 {
1161 /* Workaround for Cisco's nexthop bug. */
1162 if (IN6_IS_ADDR_UNSPECIFIED (&info->attr->extra->mp_nexthop_global)
1163 && info->peer->su_remote->sa.sa_family == AF_INET6)
1164 nexthop = &info->peer->su_remote->sin6.sin6_addr;
1165 else
1166 nexthop = &info->attr->extra->mp_nexthop_local;
1167 }
1168 }
1169
1170 return nexthop;
1171 }
1172
1173 static int
1174 bgp_table_map_apply (struct route_map *map, struct prefix *p,
1175 struct bgp_info *info)
1176 {
1177 if (route_map_apply(map, p, RMAP_BGP, info) != RMAP_DENYMATCH)
1178 return 1;
1179
1180 if (bgp_debug_zebra(p))
1181 {
1182 if (p->family == AF_INET)
1183 {
1184 char buf[2][INET_ADDRSTRLEN];
1185 zlog_debug("Zebra rmap deny: IPv4 route %s/%d nexthop %s",
1186 inet_ntop(AF_INET, &p->u.prefix4, buf[0], sizeof(buf[0])),
1187 p->prefixlen,
1188 inet_ntop(AF_INET, &info->attr->nexthop, buf[1],
1189 sizeof(buf[1])));
1190 }
1191 if (p->family == AF_INET6)
1192 {
1193 char buf[2][INET6_ADDRSTRLEN];
1194 zlog_debug("Zebra rmap deny: IPv6 route %s/%d nexthop %s",
1195 inet_ntop(AF_INET6, &p->u.prefix6, buf[0], sizeof(buf[0])),
1196 p->prefixlen,
1197 inet_ntop(AF_INET6, bgp_info_to_ipv6_nexthop(info), buf[1],
1198 sizeof(buf[1])));
1199 }
1200 }
1201 return 0;
1202 }
1203
1204 void
1205 bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp,
1206 afi_t afi, safi_t safi)
1207 {
1208 u_int32_t flags;
1209 u_char distance;
1210 struct peer *peer;
1211 struct bgp_info *mpinfo;
1212 size_t oldsize, newsize;
1213 u_int32_t nhcount, metric;
1214 struct bgp_info local_info;
1215 struct bgp_info *info_cp = &local_info;
1216 route_tag_t tag;
1217
1218 /* Don't try to install if we're not connected to Zebra or Zebra doesn't
1219 * know of this instance.
1220 */
1221 if (!bgp_install_info_to_zebra (bgp))
1222 return;
1223
1224 if ((p->family == AF_INET &&
1225 !vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP], bgp->vrf_id))
1226 || (p->family == AF_INET6 &&
1227 !vrf_bitmap_check (zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP], bgp->vrf_id)))
1228 return;
1229
1230 if (bgp->main_zebra_update_hold)
1231 return;
1232
1233 flags = 0;
1234 peer = info->peer;
1235
1236 if ((info->attr->extra) && (info->attr->extra->tag != 0))
1237 tag = info->attr->extra->tag;
1238 else
1239 tag = 0;
1240
1241 /* When we create an aggregate route we must also install a Null0 route in
1242 * the RIB */
1243 if (info->sub_type == BGP_ROUTE_AGGREGATE)
1244 SET_FLAG (flags, ZEBRA_FLAG_BLACKHOLE);
1245
1246 if (peer->sort == BGP_PEER_IBGP || peer->sort == BGP_PEER_CONFED ||
1247 info->sub_type == BGP_ROUTE_AGGREGATE)
1248 {
1249 SET_FLAG (flags, ZEBRA_FLAG_IBGP);
1250 SET_FLAG (flags, ZEBRA_FLAG_INTERNAL);
1251 }
1252
1253 if ((peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
1254 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)
1255 || bgp_flag_check(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
1256
1257 SET_FLAG (flags, ZEBRA_FLAG_INTERNAL);
1258
1259 nhcount = 1 + bgp_info_mpath_count (info);
1260
1261 if (p->family == AF_INET && !BGP_ATTR_NEXTHOP_AFI_IP6(info->attr))
1262 {
1263 struct zapi_ipv4 api;
1264 struct in_addr *nexthop;
1265 char buf[2][INET_ADDRSTRLEN];
1266 int valid_nh_count = 0;
1267
1268 /* resize nexthop buffer size if necessary */
1269 if ((oldsize = stream_get_size (bgp_nexthop_buf)) <
1270 (sizeof (struct in_addr *) * nhcount))
1271 {
1272 newsize = (sizeof (struct in_addr *) * nhcount);
1273 newsize = stream_resize (bgp_nexthop_buf, newsize);
1274 if (newsize == oldsize)
1275 {
1276 zlog_err ("can't resize nexthop buffer");
1277 return;
1278 }
1279 }
1280 stream_reset (bgp_nexthop_buf);
1281 nexthop = NULL;
1282
1283 /* Metric is currently based on the best-path only. */
1284 metric = info->attr->med;
1285
1286 if (bgp->table_map[afi][safi].name)
1287 {
1288 BGP_INFO_ATTR_BUF_INIT();
1289
1290 /* Copy info and attributes, so the route-map apply doesn't modify the
1291 BGP route info. */
1292 BGP_INFO_ATTR_BUF_COPY(info, info_cp);
1293 if (bgp_table_map_apply(bgp->table_map[afi][safi].map, p, info_cp))
1294 {
1295 metric = info_cp->attr->med;
1296 nexthop = &info_cp->attr->nexthop;
1297
1298 if (info_cp->attr->extra)
1299 tag = info_cp->attr->extra->tag;
1300 }
1301 BGP_INFO_ATTR_BUF_FREE(info_cp);
1302 }
1303 else
1304 {
1305 nexthop = &info->attr->nexthop;
1306 }
1307
1308 if (nexthop)
1309 {
1310 stream_put (bgp_nexthop_buf, &nexthop, sizeof (struct in_addr *));
1311 valid_nh_count++;
1312 }
1313
1314 for (mpinfo = bgp_info_mpath_first (info); mpinfo;
1315 mpinfo = bgp_info_mpath_next (mpinfo))
1316 {
1317 nexthop = NULL;
1318
1319 if (bgp->table_map[afi][safi].name)
1320 {
1321 /* Copy info and attributes, so the route-map apply doesn't modify the
1322 BGP route info. */
1323 BGP_INFO_ATTR_BUF_COPY(mpinfo, info_cp);
1324 if (bgp_table_map_apply(bgp->table_map[afi][safi].map, p, info_cp))
1325 nexthop = &info_cp->attr->nexthop;
1326 BGP_INFO_ATTR_BUF_FREE(info_cp);
1327 }
1328 else
1329 {
1330 nexthop = &mpinfo->attr->nexthop;
1331 }
1332
1333 if (nexthop == NULL)
1334 continue;
1335
1336 stream_put (bgp_nexthop_buf, &nexthop, sizeof (struct in_addr *));
1337 valid_nh_count++;
1338 }
1339
1340 api.vrf_id = bgp->vrf_id;
1341 api.flags = flags;
1342 api.type = ZEBRA_ROUTE_BGP;
1343 api.instance = 0;
1344 api.message = 0;
1345 api.safi = safi;
1346 SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
1347
1348 /* Note that this currently only applies to Null0 routes for aggregates.
1349 * ZEBRA_FLAG_BLACKHOLE signals zapi_ipv4_route to encode a special
1350 * BLACKHOLE nexthop. We want to set api.nexthop_num to zero since we
1351 * do not want to also encode the 0.0.0.0 nexthop for the aggregate route.
1352 */
1353 if (CHECK_FLAG(flags, ZEBRA_FLAG_BLACKHOLE))
1354 api.nexthop_num = 0;
1355 else
1356 api.nexthop_num = valid_nh_count;
1357
1358 api.nexthop = (struct in_addr **)STREAM_DATA (bgp_nexthop_buf);
1359 api.ifindex_num = 0;
1360 SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
1361 api.metric = metric;
1362 api.tag = 0;
1363
1364 if (tag)
1365 {
1366 SET_FLAG (api.message, ZAPI_MESSAGE_TAG);
1367 api.tag = tag;
1368 }
1369
1370 distance = bgp_distance_apply (p, info, afi, safi, bgp);
1371 if (distance)
1372 {
1373 SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
1374 api.distance = distance;
1375 }
1376
1377 if (bgp_debug_zebra(p))
1378 {
1379 int i;
1380 zlog_debug("Tx IPv4 route %s VRF %u %s/%d metric %u tag %"ROUTE_TAG_PRI
1381 " count %d", (valid_nh_count ? "add":"delete"),
1382 bgp->vrf_id,
1383 inet_ntop(AF_INET, &p->u.prefix4, buf[0], sizeof(buf[0])),
1384 p->prefixlen, api.metric, api.tag, api.nexthop_num);
1385 for (i = 0; i < api.nexthop_num; i++)
1386 zlog_debug(" IPv4 [nexthop %d] %s", i+1,
1387 inet_ntop(AF_INET, api.nexthop[i], buf[1], sizeof(buf[1])));
1388 }
1389
1390 zapi_ipv4_route (valid_nh_count ? ZEBRA_IPV4_ROUTE_ADD: ZEBRA_IPV4_ROUTE_DELETE,
1391 zclient, (struct prefix_ipv4 *) p, &api);
1392 }
1393 #ifdef HAVE_IPV6
1394
1395 /* We have to think about a IPv6 link-local address curse. */
1396 if (p->family == AF_INET6 ||
1397 (p->family == AF_INET && BGP_ATTR_NEXTHOP_AFI_IP6(info->attr)))
1398 {
1399 ifindex_t ifindex;
1400 struct in6_addr *nexthop;
1401 struct zapi_ipv6 api;
1402 int valid_nh_count = 0;
1403 char buf[2][INET6_ADDRSTRLEN];
1404
1405 /* resize nexthop buffer size if necessary */
1406 if ((oldsize = stream_get_size (bgp_nexthop_buf)) <
1407 (sizeof (struct in6_addr *) * nhcount))
1408 {
1409 newsize = (sizeof (struct in6_addr *) * nhcount);
1410 newsize = stream_resize (bgp_nexthop_buf, newsize);
1411 if (newsize == oldsize)
1412 {
1413 zlog_err ("can't resize nexthop buffer");
1414 return;
1415 }
1416 }
1417 stream_reset (bgp_nexthop_buf);
1418
1419 /* resize ifindices buffer size if necessary */
1420 if ((oldsize = stream_get_size (bgp_ifindices_buf)) <
1421 (sizeof (unsigned int) * nhcount))
1422 {
1423 newsize = (sizeof (unsigned int) * nhcount);
1424 newsize = stream_resize (bgp_ifindices_buf, newsize);
1425 if (newsize == oldsize)
1426 {
1427 zlog_err ("can't resize nexthop buffer");
1428 return;
1429 }
1430 }
1431 stream_reset (bgp_ifindices_buf);
1432
1433 ifindex = 0;
1434 nexthop = NULL;
1435
1436 assert (info->attr->extra);
1437
1438 /* Metric is currently based on the best-path only. */
1439 metric = info->attr->med;
1440
1441 if (bgp->table_map[afi][safi].name)
1442 {
1443 BGP_INFO_ATTR_BUF_INIT();
1444
1445 /* Copy info and attributes, so the route-map apply doesn't modify the
1446 BGP route info. */
1447 BGP_INFO_ATTR_BUF_COPY(info, info_cp);
1448 if (bgp_table_map_apply(bgp->table_map[afi][safi].map, p, info_cp))
1449 {
1450 metric = info_cp->attr->med;
1451 nexthop = bgp_info_to_ipv6_nexthop(info_cp);
1452
1453 if (info_cp->attr->extra)
1454 tag = info_cp->attr->extra->tag;
1455 }
1456 BGP_INFO_ATTR_BUF_FREE(info_cp);
1457 }
1458 else
1459 {
1460 nexthop = bgp_info_to_ipv6_nexthop(info);
1461 }
1462
1463 if (nexthop)
1464 {
1465 if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
1466 if (info->peer->nexthop.ifp)
1467 ifindex = info->peer->nexthop.ifp->ifindex;
1468
1469 if (!ifindex)
1470 {
1471 if (info->peer->conf_if || info->peer->ifname)
1472 ifindex = if_nametoindex (info->peer->conf_if ? info->peer->conf_if : info->peer->ifname);
1473 else if (info->peer->nexthop.ifp)
1474 ifindex = info->peer->nexthop.ifp->ifindex;
1475 }
1476 stream_put (bgp_nexthop_buf, &nexthop, sizeof (struct in6_addr *));
1477 stream_put (bgp_ifindices_buf, &ifindex, sizeof (unsigned int));
1478 valid_nh_count++;
1479 }
1480
1481 for (mpinfo = bgp_info_mpath_first (info); mpinfo;
1482 mpinfo = bgp_info_mpath_next (mpinfo))
1483 {
1484 ifindex = 0;
1485 nexthop = NULL;
1486
1487 if (bgp->table_map[afi][safi].name)
1488 {
1489 /* Copy info and attributes, so the route-map apply doesn't modify the
1490 BGP route info. */
1491 BGP_INFO_ATTR_BUF_COPY(mpinfo, info_cp);
1492 if (bgp_table_map_apply(bgp->table_map[afi][safi].map, p, info_cp))
1493 nexthop = bgp_info_to_ipv6_nexthop(info_cp);
1494 BGP_INFO_ATTR_BUF_FREE(info_cp);
1495 }
1496 else
1497 {
1498 nexthop = bgp_info_to_ipv6_nexthop(mpinfo);
1499 }
1500
1501 if (nexthop == NULL)
1502 continue;
1503
1504 if (mpinfo->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
1505 if (mpinfo->peer->nexthop.ifp)
1506 ifindex = mpinfo->peer->nexthop.ifp->ifindex;
1507
1508 if (!ifindex)
1509 {
1510 if (mpinfo->peer->conf_if || mpinfo->peer->ifname)
1511 ifindex = ifname2ifindex (mpinfo->peer->conf_if ? mpinfo->peer->conf_if : mpinfo->peer->ifname);
1512 else if (mpinfo->peer->nexthop.ifp)
1513 ifindex = mpinfo->peer->nexthop.ifp->ifindex;
1514 }
1515 if (ifindex == 0)
1516 continue;
1517
1518 stream_put (bgp_nexthop_buf, &nexthop, sizeof (struct in6_addr *));
1519 stream_put (bgp_ifindices_buf, &ifindex, sizeof (unsigned int));
1520 valid_nh_count++;
1521 }
1522
1523 /* Make Zebra API structure. */
1524 api.vrf_id = bgp->vrf_id;
1525 api.flags = flags;
1526 api.type = ZEBRA_ROUTE_BGP;
1527 api.instance = 0;
1528 api.message = 0;
1529 api.safi = safi;
1530 SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
1531
1532 /* Note that this currently only applies to Null0 routes for aggregates.
1533 * ZEBRA_FLAG_BLACKHOLE signals zapi_ipv6_route to encode a special
1534 * BLACKHOLE nexthop. We want to set api.nexthop_num to zero since we
1535 * do not want to also encode the :: nexthop for the aggregate route.
1536 */
1537 if (CHECK_FLAG(flags, ZEBRA_FLAG_BLACKHOLE))
1538 api.nexthop_num = 0;
1539 else
1540 api.nexthop_num = valid_nh_count;
1541
1542 api.nexthop = (struct in6_addr **)STREAM_DATA (bgp_nexthop_buf);
1543 SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
1544 api.ifindex_num = valid_nh_count;
1545 api.ifindex = (ifindex_t *)STREAM_DATA (bgp_ifindices_buf);
1546 SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
1547 api.metric = metric;
1548 api.tag = 0;
1549
1550 if (tag)
1551 {
1552 SET_FLAG (api.message, ZAPI_MESSAGE_TAG);
1553 api.tag = tag;
1554 }
1555
1556 distance = bgp_distance_apply (p, info, afi, safi, bgp);
1557 if (distance)
1558 {
1559 SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
1560 api.distance = distance;
1561 }
1562
1563 if (p->family == AF_INET)
1564 {
1565 if (bgp_debug_zebra(p))
1566 {
1567 int i;
1568 zlog_debug("Tx IPv4 route %s VRF %u %s/%d metric %u tag %"ROUTE_TAG_PRI,
1569 valid_nh_count ? "add" : "delete", bgp->vrf_id,
1570 inet_ntop(AF_INET, &p->u.prefix4, buf[0], sizeof(buf[0])),
1571 p->prefixlen, api.metric, api.tag);
1572 for (i = 0; i < api.nexthop_num; i++)
1573 zlog_debug(" IPv6 [nexthop %d] %s", i+1,
1574 inet_ntop(AF_INET6, api.nexthop[i], buf[1], sizeof(buf[1])));
1575 }
1576
1577 if (valid_nh_count)
1578 zapi_ipv4_route_ipv6_nexthop (ZEBRA_IPV4_ROUTE_IPV6_NEXTHOP_ADD,
1579 zclient, (struct prefix_ipv4 *) p,
1580 (struct zapi_ipv6 *)&api);
1581 else
1582 zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE,
1583 zclient, (struct prefix_ipv4 *) p, (struct zapi_ipv4 *)&api);
1584 }
1585 else
1586 {
1587 if (bgp_debug_zebra(p))
1588 {
1589 int i;
1590 zlog_debug("Tx IPv6 route %s VRF %u %s/%d metric %u tag %"ROUTE_TAG_PRI,
1591 valid_nh_count ? "add" : "delete", bgp->vrf_id,
1592 inet_ntop(AF_INET6, &p->u.prefix6, buf[0], sizeof(buf[0])),
1593 p->prefixlen, api.metric, api.tag);
1594 for (i = 0; i < api.nexthop_num; i++)
1595 zlog_debug(" IPv6 [nexthop %d] %s", i+1,
1596 inet_ntop(AF_INET6, api.nexthop[i], buf[1], sizeof(buf[1])));
1597 }
1598
1599 zapi_ipv6_route (valid_nh_count ?
1600 ZEBRA_IPV6_ROUTE_ADD : ZEBRA_IPV6_ROUTE_DELETE,
1601 zclient, (struct prefix_ipv6 *) p, &api);
1602 }
1603 }
1604 #endif /* HAVE_IPV6 */
1605 }
1606
1607 /* Announce all routes of a table to zebra */
1608 void
1609 bgp_zebra_announce_table (struct bgp *bgp, afi_t afi, safi_t safi)
1610 {
1611 struct bgp_node *rn;
1612 struct bgp_table *table;
1613 struct bgp_info *ri;
1614
1615 /* Don't try to install if we're not connected to Zebra or Zebra doesn't
1616 * know of this instance.
1617 */
1618 if (!bgp_install_info_to_zebra (bgp))
1619 return;
1620
1621 table = bgp->rib[afi][safi];
1622 if (!table) return;
1623
1624 for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
1625 for (ri = rn->info; ri; ri = ri->next)
1626 if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
1627 && ri->type == ZEBRA_ROUTE_BGP
1628 && ri->sub_type == BGP_ROUTE_NORMAL)
1629 bgp_zebra_announce (&rn->p, ri, bgp, afi, safi);
1630 }
1631
1632 void
1633 bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
1634 {
1635 u_int32_t flags;
1636 struct peer *peer;
1637
1638 peer = info->peer;
1639 assert(peer);
1640
1641 /* Don't try to install if we're not connected to Zebra or Zebra doesn't
1642 * know of this instance.
1643 */
1644 if (!bgp_install_info_to_zebra (peer->bgp))
1645 return;
1646
1647 if ((p->family == AF_INET &&
1648 !vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP], peer->bgp->vrf_id))
1649 || (p->family == AF_INET6 &&
1650 !vrf_bitmap_check (zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP], peer->bgp->vrf_id)))
1651 return;
1652
1653 flags = 0;
1654
1655 if (peer->sort == BGP_PEER_IBGP)
1656 {
1657 SET_FLAG (flags, ZEBRA_FLAG_INTERNAL);
1658 SET_FLAG (flags, ZEBRA_FLAG_IBGP);
1659 }
1660
1661 if ((peer->sort == BGP_PEER_EBGP && peer->ttl != 1)
1662 || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)
1663 || bgp_flag_check(peer->bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
1664 SET_FLAG (flags, ZEBRA_FLAG_INTERNAL);
1665
1666 if (p->family == AF_INET)
1667 {
1668 struct zapi_ipv4 api;
1669
1670 api.vrf_id = peer->bgp->vrf_id;
1671 api.flags = flags;
1672
1673 api.type = ZEBRA_ROUTE_BGP;
1674 api.instance = 0;
1675 api.message = 0;
1676 api.safi = safi;
1677 SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
1678 api.nexthop_num = 0;
1679 api.nexthop = NULL;
1680 api.ifindex_num = 0;
1681 SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
1682 api.metric = info->attr->med;
1683 api.tag = 0;
1684
1685 if ((info->attr->extra) && (info->attr->extra->tag != 0))
1686 {
1687 SET_FLAG(api.message, ZAPI_MESSAGE_TAG);
1688 api.tag = info->attr->extra->tag;
1689 }
1690
1691 if (bgp_debug_zebra(p))
1692 {
1693 char buf[2][INET_ADDRSTRLEN];
1694 zlog_debug("Tx IPv4 route delete VRF %u %s/%d metric %u tag %"ROUTE_TAG_PRI,
1695 peer->bgp->vrf_id,
1696 inet_ntop(AF_INET, &p->u.prefix4, buf[0], sizeof(buf[0])),
1697 p->prefixlen, api.metric, api.tag);
1698 }
1699
1700 zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient,
1701 (struct prefix_ipv4 *) p, &api);
1702 }
1703 #ifdef HAVE_IPV6
1704 /* We have to think about a IPv6 link-local address curse. */
1705 if (p->family == AF_INET6)
1706 {
1707 struct zapi_ipv6 api;
1708
1709 assert (info->attr->extra);
1710
1711 api.vrf_id = peer->bgp->vrf_id;
1712 api.flags = flags;
1713 api.type = ZEBRA_ROUTE_BGP;
1714 api.instance = 0;
1715 api.message = 0;
1716 api.safi = safi;
1717 SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
1718 api.nexthop_num = 0;
1719 api.nexthop = NULL;
1720 api.ifindex_num = 0;
1721 SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
1722 api.metric = info->attr->med;
1723 api.tag = 0;
1724
1725 if ((info->attr->extra) && (info->attr->extra->tag != 0))
1726 {
1727 SET_FLAG(api.message, ZAPI_MESSAGE_TAG);
1728 api.tag = info->attr->extra->tag;
1729 }
1730
1731 if (bgp_debug_zebra(p))
1732 {
1733 char buf[2][INET6_ADDRSTRLEN];
1734 zlog_debug("Tx IPv6 route delete VRF %u %s/%d metric %u tag %"ROUTE_TAG_PRI,
1735 peer->bgp->vrf_id,
1736 inet_ntop(AF_INET6, &p->u.prefix6, buf[0], sizeof(buf[0])),
1737 p->prefixlen, api.metric, api.tag);
1738 }
1739
1740 zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient,
1741 (struct prefix_ipv6 *) p, &api);
1742 }
1743 #endif /* HAVE_IPV6 */
1744 }
1745 struct bgp_redist *
1746 bgp_redist_lookup (struct bgp *bgp, afi_t afi, u_char type, u_short instance)
1747 {
1748 struct list *red_list;
1749 struct listnode *node;
1750 struct bgp_redist *red;
1751
1752 red_list = bgp->redist[afi][type];
1753 if (!red_list)
1754 return(NULL);
1755
1756 for (ALL_LIST_ELEMENTS_RO(red_list, node, red))
1757 if (red->instance == instance)
1758 return red;
1759
1760 return NULL;
1761 }
1762
1763 struct bgp_redist *
1764 bgp_redist_add (struct bgp *bgp, afi_t afi, u_char type, u_short instance)
1765 {
1766 struct list *red_list;
1767 struct bgp_redist *red;
1768
1769 red = bgp_redist_lookup(bgp, afi, type, instance);
1770 if (red)
1771 return red;
1772
1773 if (!bgp->redist[afi][type])
1774 bgp->redist[afi][type] = list_new();
1775
1776 red_list = bgp->redist[afi][type];
1777 red = (struct bgp_redist *)XCALLOC(MTYPE_BGP_REDIST, sizeof(struct bgp_redist));
1778 red->instance = instance;
1779
1780 listnode_add(red_list, red);
1781
1782 return red;
1783 }
1784
1785 static void
1786 bgp_redist_del (struct bgp *bgp, afi_t afi, u_char type, u_short instance)
1787 {
1788 struct bgp_redist *red;
1789
1790 red = bgp_redist_lookup(bgp, afi, type, instance);
1791
1792 if (red)
1793 {
1794 listnode_delete(bgp->redist[afi][type], red);
1795 XFREE (MTYPE_BGP_REDIST, red);
1796 if (!bgp->redist[afi][type]->count)
1797 {
1798 list_free(bgp->redist[afi][type]);
1799 bgp->redist[afi][type] = NULL;
1800 }
1801 }
1802 }
1803
1804 /* Other routes redistribution into BGP. */
1805 int
1806 bgp_redistribute_set (struct bgp *bgp, afi_t afi, int type, u_short instance)
1807 {
1808
1809 /* Return if already redistribute flag is set. */
1810 if (instance)
1811 {
1812 if (redist_check_instance(&zclient->mi_redist[afi][type], instance))
1813 return CMD_WARNING;
1814
1815 redist_add_instance(&zclient->mi_redist[afi][type], instance);
1816 }
1817 else
1818 {
1819 if (vrf_bitmap_check (zclient->redist[afi][type], bgp->vrf_id))
1820 return CMD_WARNING;
1821
1822 #if ENABLE_BGP_VNC
1823 if (bgp->vrf_id == VRF_DEFAULT &&
1824 type == ZEBRA_ROUTE_VNC_DIRECT) {
1825 vnc_export_bgp_enable(bgp, afi); /* only enables if mode bits cfg'd */
1826 }
1827 #endif
1828
1829 vrf_bitmap_set (zclient->redist[afi][type], bgp->vrf_id);
1830 }
1831
1832 /* Don't try to register if we're not connected to Zebra or Zebra doesn't
1833 * know of this instance.
1834 */
1835 if (!bgp_install_info_to_zebra (bgp))
1836 return CMD_WARNING;
1837
1838 if (BGP_DEBUG (zebra, ZEBRA))
1839 zlog_debug("Tx redistribute add VRF %u afi %d %s %d",
1840 bgp->vrf_id, afi,
1841 zebra_route_string(type), instance);
1842
1843 /* Send distribute add message to zebra. */
1844 zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type,
1845 instance, bgp->vrf_id);
1846
1847 return CMD_SUCCESS;
1848 }
1849
1850 int
1851 bgp_redistribute_resend (struct bgp *bgp, afi_t afi, int type, u_short instance)
1852 {
1853 /* Don't try to send if we're not connected to Zebra or Zebra doesn't
1854 * know of this instance.
1855 */
1856 if (!bgp_install_info_to_zebra (bgp))
1857 return -1;
1858
1859 if (BGP_DEBUG (zebra, ZEBRA))
1860 zlog_debug("Tx redistribute del/add VRF %u afi %d %s %d",
1861 bgp->vrf_id, afi,
1862 zebra_route_string(type), instance);
1863
1864 /* Send distribute add message to zebra. */
1865 zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type,
1866 instance, bgp->vrf_id);
1867 zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type,
1868 instance, bgp->vrf_id);
1869
1870 return 0;
1871 }
1872
1873 /* Redistribute with route-map specification. */
1874 int
1875 bgp_redistribute_rmap_set (struct bgp_redist *red, const char *name)
1876 {
1877 if (red->rmap.name
1878 && (strcmp (red->rmap.name, name) == 0))
1879 return 0;
1880
1881 if (red->rmap.name)
1882 XFREE(MTYPE_ROUTE_MAP_NAME, red->rmap.name);
1883 red->rmap.name = XSTRDUP(MTYPE_ROUTE_MAP_NAME, name);
1884 red->rmap.map = route_map_lookup_by_name (name);
1885
1886 return 1;
1887 }
1888
1889 /* Redistribute with metric specification. */
1890 int
1891 bgp_redistribute_metric_set (struct bgp *bgp, struct bgp_redist *red, afi_t afi,
1892 int type, u_int32_t metric)
1893 {
1894 struct bgp_node *rn;
1895 struct bgp_info *ri;
1896
1897 if (red->redist_metric_flag
1898 && red->redist_metric == metric)
1899 return 0;
1900
1901 red->redist_metric_flag = 1;
1902 red->redist_metric = metric;
1903
1904 for (rn = bgp_table_top(bgp->rib[afi][SAFI_UNICAST]); rn; rn = bgp_route_next(rn))
1905 {
1906 for (ri = rn->info; ri; ri = ri->next)
1907 {
1908 if (ri->sub_type == BGP_ROUTE_REDISTRIBUTE &&
1909 ri->type == type &&
1910 ri->instance == red->instance)
1911 {
1912 struct attr *old_attr;
1913 struct attr new_attr;
1914 struct attr_extra new_extra;
1915
1916 new_attr.extra = &new_extra;
1917 bgp_attr_dup (&new_attr, ri->attr);
1918 new_attr.med = red->redist_metric;
1919 old_attr = ri->attr;
1920 ri->attr = bgp_attr_intern (&new_attr);
1921 bgp_attr_unintern (&old_attr);
1922
1923 bgp_info_set_flag(rn, ri, BGP_INFO_ATTR_CHANGED);
1924 bgp_process(bgp, rn, afi, SAFI_UNICAST);
1925 }
1926 }
1927 }
1928
1929 return 1;
1930 }
1931
1932 /* Unset redistribution. */
1933 int
1934 bgp_redistribute_unreg (struct bgp *bgp, afi_t afi, int type, u_short instance)
1935 {
1936 struct bgp_redist *red;
1937
1938 red = bgp_redist_lookup(bgp, afi, type, instance);
1939 if (!red)
1940 return CMD_SUCCESS;
1941
1942 /* Return if zebra connection is disabled. */
1943 if (instance)
1944 {
1945 if (!redist_check_instance(&zclient->mi_redist[afi][type], instance))
1946 return CMD_WARNING;
1947 redist_del_instance(&zclient->mi_redist[afi][type], instance);
1948 }
1949 else
1950 {
1951 if (! vrf_bitmap_check (zclient->redist[afi][type], bgp->vrf_id))
1952 return CMD_WARNING;
1953 vrf_bitmap_unset (zclient->redist[afi][type], bgp->vrf_id);
1954 }
1955
1956 #if ENABLE_BGP_VNC
1957 if (bgp->vrf_id == VRF_DEFAULT &&
1958 type == ZEBRA_ROUTE_VNC_DIRECT) {
1959 vnc_export_bgp_disable(bgp, afi);
1960 }
1961 #endif
1962
1963 if (bgp_install_info_to_zebra (bgp))
1964 {
1965 /* Send distribute delete message to zebra. */
1966 if (BGP_DEBUG (zebra, ZEBRA))
1967 zlog_debug("Tx redistribute del VRF %u afi %d %s %d",
1968 bgp->vrf_id, afi, zebra_route_string(type), instance);
1969 zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type, instance,
1970 bgp->vrf_id);
1971 }
1972
1973 /* Withdraw redistributed routes from current BGP's routing table. */
1974 bgp_redistribute_withdraw (bgp, afi, type, instance);
1975
1976 return CMD_SUCCESS;
1977 }
1978
1979 /* Unset redistribution. */
1980 int
1981 bgp_redistribute_unset (struct bgp *bgp, afi_t afi, int type, u_short instance)
1982 {
1983 struct bgp_redist *red;
1984
1985 red = bgp_redist_lookup(bgp, afi, type, instance);
1986 if (!red)
1987 return CMD_SUCCESS;
1988
1989 bgp_redistribute_unreg(bgp, afi, type, instance);
1990
1991 /* Unset route-map. */
1992 if (red->rmap.name)
1993 XFREE(MTYPE_ROUTE_MAP_NAME, red->rmap.name);
1994 red->rmap.name = NULL;
1995 red->rmap.map = NULL;
1996
1997 /* Unset metric. */
1998 red->redist_metric_flag = 0;
1999 red->redist_metric = 0;
2000
2001 bgp_redist_del(bgp, afi, type, instance);
2002
2003 return CMD_SUCCESS;
2004 }
2005
2006 /* Update redistribute vrf bitmap during triggers like
2007 restart networking or delete/add VRFs */
2008 void
2009 bgp_update_redist_vrf_bitmaps (struct bgp *bgp, vrf_id_t old_vrf_id)
2010 {
2011 int i;
2012 afi_t afi;
2013
2014 for (afi = AFI_IP; afi < AFI_MAX; afi++)
2015 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
2016 if (vrf_bitmap_check (zclient->redist[afi][i], old_vrf_id))
2017 {
2018 vrf_bitmap_unset (zclient->redist[afi][i], old_vrf_id);
2019 vrf_bitmap_set (zclient->redist[afi][i], bgp->vrf_id);
2020 }
2021 return;
2022 }
2023
2024 void
2025 bgp_zclient_reset (void)
2026 {
2027 zclient_reset (zclient);
2028 }
2029
2030 /* Register this instance with Zebra. Invoked upon connect (for
2031 * default instance) and when other VRFs are learnt (or created and
2032 * already learnt).
2033 */
2034 void
2035 bgp_zebra_instance_register (struct bgp *bgp)
2036 {
2037 /* Don't try to register if we're not connected to Zebra */
2038 if (!zclient || zclient->sock < 0)
2039 return;
2040
2041 if (BGP_DEBUG (zebra, ZEBRA))
2042 zlog_debug("Registering VRF %u", bgp->vrf_id);
2043
2044 /* Register for router-id, interfaces, redistributed routes. */
2045 zclient_send_reg_requests (zclient, bgp->vrf_id);
2046 }
2047
2048 /* Deregister this instance with Zebra. Invoked upon the instance
2049 * being deleted (default or VRF) and it is already registered.
2050 */
2051 void
2052 bgp_zebra_instance_deregister (struct bgp *bgp)
2053 {
2054 /* Don't try to deregister if we're not connected to Zebra */
2055 if (zclient->sock < 0)
2056 return;
2057
2058 if (BGP_DEBUG (zebra, ZEBRA))
2059 zlog_debug("Deregistering VRF %u", bgp->vrf_id);
2060
2061 /* Deregister for router-id, interfaces, redistributed routes. */
2062 zclient_send_dereg_requests (zclient, bgp->vrf_id);
2063 }
2064
2065 void
2066 bgp_zebra_initiate_radv (struct bgp *bgp, struct peer *peer)
2067 {
2068 int ra_interval = BGP_UNNUM_DEFAULT_RA_INTERVAL;
2069
2070 /* Don't try to initiate if we're not connected to Zebra */
2071 if (zclient->sock < 0)
2072 return;
2073
2074 if (BGP_DEBUG (zebra, ZEBRA))
2075 zlog_debug("%u: Initiating RA for peer %s", bgp->vrf_id, peer->host);
2076
2077 zclient_send_interface_radv_req (zclient, bgp->vrf_id, peer->ifp, 1, ra_interval);
2078 }
2079
2080 void
2081 bgp_zebra_terminate_radv (struct bgp *bgp, struct peer *peer)
2082 {
2083 /* Don't try to terminate if we're not connected to Zebra */
2084 if (zclient->sock < 0)
2085 return;
2086
2087 if (BGP_DEBUG (zebra, ZEBRA))
2088 zlog_debug("%u: Terminating RA for peer %s", bgp->vrf_id, peer->host);
2089
2090 zclient_send_interface_radv_req (zclient, bgp->vrf_id, peer->ifp, 0, 0);
2091 }
2092
2093 /* BGP has established connection with Zebra. */
2094 static void
2095 bgp_zebra_connected (struct zclient *zclient)
2096 {
2097 struct bgp *bgp;
2098
2099 zclient_num_connects++; /* increment even if not responding */
2100
2101 /* At this point, we may or may not have BGP instances configured, but
2102 * we're only interested in the default VRF (others wouldn't have learnt
2103 * the VRF from Zebra yet.)
2104 */
2105 bgp = bgp_get_default();
2106 if (!bgp)
2107 return;
2108
2109 bgp_zebra_instance_register (bgp);
2110
2111 /* Send the client registration */
2112 bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER);
2113
2114 /* TODO - What if we have peers and networks configured, do we have to
2115 * kick-start them?
2116 */
2117 }
2118
2119
2120 void
2121 bgp_zebra_init (struct thread_master *master)
2122 {
2123 zclient_num_connects = 0;
2124
2125 /* Set default values. */
2126 zclient = zclient_new (master);
2127 zclient_init (zclient, ZEBRA_ROUTE_BGP, 0);
2128 zclient->zebra_connected = bgp_zebra_connected;
2129 zclient->router_id_update = bgp_router_id_update;
2130 zclient->interface_add = bgp_interface_add;
2131 zclient->interface_delete = bgp_interface_delete;
2132 zclient->interface_address_add = bgp_interface_address_add;
2133 zclient->interface_address_delete = bgp_interface_address_delete;
2134 zclient->interface_nbr_address_add = bgp_interface_nbr_address_add;
2135 zclient->interface_nbr_address_delete = bgp_interface_nbr_address_delete;
2136 zclient->interface_vrf_update = bgp_interface_vrf_update;
2137 zclient->redistribute_route_ipv4_add = zebra_read_ipv4;
2138 zclient->redistribute_route_ipv4_del = zebra_read_ipv4;
2139 zclient->interface_up = bgp_interface_up;
2140 zclient->interface_down = bgp_interface_down;
2141 zclient->redistribute_route_ipv6_add = zebra_read_ipv6;
2142 zclient->redistribute_route_ipv6_del = zebra_read_ipv6;
2143 zclient->nexthop_update = bgp_read_nexthop_update;
2144 zclient->import_check_update = bgp_read_import_check_update;
2145
2146 bgp_nexthop_buf = stream_new(BGP_NEXTHOP_BUF_SIZE);
2147 bgp_ifindices_buf = stream_new(BGP_IFINDICES_BUF_SIZE);
2148 }
2149
2150 void
2151 bgp_zebra_destroy(void)
2152 {
2153 if (zclient == NULL)
2154 return;
2155 zclient_stop(zclient);
2156 zclient_free(zclient);
2157 zclient = NULL;
2158 }
2159
2160 int
2161 bgp_zebra_num_connects(void)
2162 {
2163 return zclient_num_connects;
2164 }