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