]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_zebra.c
lib: small BFD session notifier improvement
[mirror_frr.git] / bgpd / bgp_zebra.c
CommitLineData
718e3744 1/* zebra client
896014f4
DL
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 along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
718e3744 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"
3f9c7369 32#include "queue.h"
6e919709 33#include "memory.h"
856ca177 34#include "lib/json.h"
2376c3f2 35#include "lib/bfd.h"
039f3a34 36#include "filter.h"
cd1964ff 37#include "mpls.h"
128ea8ab 38#include "vxlan.h"
6cfe5d15 39#include "pbr.h"
718e3744 40
41#include "bgpd/bgpd.h"
42#include "bgpd/bgp_route.h"
43#include "bgpd/bgp_attr.h"
e46723a5 44#include "bgpd/bgp_aspath.h"
718e3744 45#include "bgpd/bgp_nexthop.h"
46#include "bgpd/bgp_zebra.h"
47#include "bgpd/bgp_fsm.h"
a39275d7 48#include "bgpd/bgp_debug.h"
14454c9f 49#include "bgpd/bgp_errors.h"
8196f13d 50#include "bgpd/bgp_mpath.h"
fb018d25 51#include "bgpd/bgp_nexthop.h"
ffd0c037 52#include "bgpd/bgp_nht.h"
8c4f6381 53#include "bgpd/bgp_bfd.h"
cd1964ff 54#include "bgpd/bgp_label.h"
49e5a4a0 55#ifdef ENABLE_BGP_VNC
d62a17ae 56#include "bgpd/rfapi/rfapi_backend.h"
57#include "bgpd/rfapi/vnc_export_bgp.h"
65efcfce 58#endif
128ea8ab 59#include "bgpd/bgp_evpn.h"
ddb5b488 60#include "bgpd/bgp_mplsvpn.h"
955bfd98 61#include "bgpd/bgp_labelpool.h"
30d50e6d 62#include "bgpd/bgp_pbr.h"
0b9d9cd0 63#include "bgpd/bgp_evpn_private.h"
c44ab6f1 64#include "bgpd/bgp_evpn_mh.h"
6a69ac51 65#include "bgpd/bgp_mac.h"
6b0655a2 66
718e3744 67/* All information about zebra. */
228da428 68struct zclient *zclient = NULL;
718e3744 69
0d020cd6
PR
70/* hook to indicate vrf status change for SNMP */
71DEFINE_HOOK(bgp_vrf_status_changed, (struct bgp *bgp, struct interface *ifp),
8451921b 72 (bgp, ifp));
0d020cd6 73
ad4cbda1 74/* Can we install into zebra? */
3dc339cd 75static inline bool bgp_install_info_to_zebra(struct bgp *bgp)
ad4cbda1 76{
d62a17ae 77 if (zclient->sock <= 0)
3dc339cd 78 return false;
ad4cbda1 79
bb4ef1ae 80 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp)) {
15569c58
DA
81 zlog_debug(
82 "%s: No zebra instance to talk to, not installing information",
83 __func__);
3dc339cd 84 return false;
bb4ef1ae 85 }
ad4cbda1 86
3dc339cd 87 return true;
ad4cbda1 88}
89
afbb1c59
LB
90int zclient_num_connects;
91
18a6dce6 92/* Router-id update message from zebra. */
121f9dee 93static int bgp_router_id_update(ZAPI_CALLBACK_ARGS)
718e3744 94{
d62a17ae 95 struct prefix router_id;
718e3744 96
d62a17ae 97 zebra_router_id_update_read(zclient->ibuf, &router_id);
a39275d7 98
2dbe669b
DA
99 if (BGP_DEBUG(zebra, ZEBRA))
100 zlog_debug("Rx Router Id update VRF %u Id %pFX", vrf_id,
101 &router_id);
a39275d7 102
d62a17ae 103 bgp_router_id_zebra_bump(vrf_id, &router_id);
104 return 0;
718e3744 105}
106
fb018d25 107/* Nexthop update message from zebra. */
121f9dee 108static int bgp_read_nexthop_update(ZAPI_CALLBACK_ARGS)
fb018d25 109{
121f9dee 110 bgp_parse_nexthop_update(cmd, vrf_id);
d62a17ae 111 return 0;
078430f6
DS
112}
113
121f9dee 114static int bgp_read_import_check_update(ZAPI_CALLBACK_ARGS)
078430f6 115{
121f9dee 116 bgp_parse_nexthop_update(cmd, vrf_id);
d62a17ae 117 return 0;
fb018d25
DS
118}
119
4a04e5f7 120/* Set or clear interface on which unnumbered neighbor is configured. This
121 * would in turn cause BGP to initiate or turn off IPv6 RAs on this
122 * interface.
123 */
d62a17ae 124static void bgp_update_interface_nbrs(struct bgp *bgp, struct interface *ifp,
125 struct interface *upd_ifp)
4a04e5f7 126{
d62a17ae 127 struct listnode *node, *nnode;
128 struct peer *peer;
129
130 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
131 if (peer->conf_if && (strcmp(peer->conf_if, ifp->name) == 0)) {
132 if (upd_ifp) {
133 peer->ifp = upd_ifp;
134 bgp_zebra_initiate_radv(bgp, peer);
135 } else {
136 bgp_zebra_terminate_radv(bgp, peer);
137 peer->ifp = upd_ifp;
138 }
139 }
140 }
4a04e5f7 141}
142
d62a17ae 143static int bgp_read_fec_update(int command, struct zclient *zclient,
144 zebra_size_t length)
cd1964ff 145{
d62a17ae 146 bgp_parse_fec_update();
147 return 0;
cd1964ff
DS
148}
149
d62a17ae 150static void bgp_start_interface_nbrs(struct bgp *bgp, struct interface *ifp)
a80beece 151{
d62a17ae 152 struct listnode *node, *nnode;
153 struct peer *peer;
154
155 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
156 if (peer->conf_if && (strcmp(peer->conf_if, ifp->name) == 0)
157 && peer->status != Established) {
158 if (peer_active(peer))
159 BGP_EVENT_ADD(peer, BGP_Stop);
160 BGP_EVENT_ADD(peer, BGP_Start);
161 }
162 }
a80beece
DS
163}
164
d62a17ae 165static void bgp_nbr_connected_add(struct bgp *bgp, struct nbr_connected *ifc)
a197c47c 166{
d62a17ae 167 struct listnode *node;
168 struct connected *connected;
169 struct interface *ifp;
170 struct prefix *p;
171
172 /* Kick-off the FSM for any relevant peers only if there is a
173 * valid local address on the interface.
174 */
175 ifp = ifc->ifp;
176 for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) {
177 p = connected->address;
178 if (p->family == AF_INET6
179 && IN6_IS_ADDR_LINKLOCAL(&p->u.prefix6))
180 break;
181 }
182 if (!connected)
183 return;
184
185 bgp_start_interface_nbrs(bgp, ifp);
a197c47c
DS
186}
187
d62a17ae 188static void bgp_nbr_connected_delete(struct bgp *bgp, struct nbr_connected *ifc,
189 int del)
a80beece 190{
d62a17ae 191 struct listnode *node, *nnode;
192 struct peer *peer;
193 struct interface *ifp;
194
195 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
196 if (peer->conf_if
197 && (strcmp(peer->conf_if, ifc->ifp->name) == 0)) {
198 peer->last_reset = PEER_DOWN_NBR_ADDR_DEL;
199 BGP_EVENT_ADD(peer, BGP_Stop);
200 }
201 }
202 /* Free neighbor also, if we're asked to. */
203 if (del) {
204 ifp = ifc->ifp;
205 listnode_delete(ifp->nbr_connected, ifc);
206 nbr_connected_free(ifc);
207 }
a80beece
DS
208}
209
3c3c3252 210static int bgp_ifp_destroy(struct interface *ifp)
718e3744 211{
d62a17ae 212 struct bgp *bgp;
718e3744 213
3c3c3252 214 bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
a4499b83 215
d62a17ae 216 if (BGP_DEBUG(zebra, ZEBRA))
3835984f 217 zlog_debug("Rx Intf del VRF %u IF %s", ifp->vrf_id, ifp->name);
a39275d7 218
0d020cd6 219 if (bgp) {
85751d1d 220 bgp_update_interface_nbrs(bgp, ifp, NULL);
0d020cd6
PR
221 hook_call(bgp_vrf_status_changed, bgp, ifp);
222 }
64745052 223
6a69ac51
DS
224 bgp_mac_del_mac_entry(ifp);
225
d62a17ae 226 return 0;
718e3744 227}
228
ddbf3e60 229static int bgp_ifp_up(struct interface *ifp)
718e3744 230{
d62a17ae 231 struct connected *c;
232 struct nbr_connected *nc;
233 struct listnode *node, *nnode;
234 struct bgp *bgp;
6aeb9e78 235
ddbf3e60 236 bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
718e3744 237
6a69ac51
DS
238 bgp_mac_add_mac_entry(ifp);
239
d62a17ae 240 if (BGP_DEBUG(zebra, ZEBRA))
ddbf3e60 241 zlog_debug("Rx Intf up VRF %u IF %s", ifp->vrf_id, ifp->name);
ad4cbda1 242
85751d1d
DS
243 if (!bgp)
244 return 0;
245
d62a17ae 246 for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, c))
247 bgp_connected_add(bgp, c);
718e3744 248
d62a17ae 249 for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc))
250 bgp_nbr_connected_add(bgp, nc);
a80beece 251
0d020cd6 252 hook_call(bgp_vrf_status_changed, bgp, ifp);
8761cd6d
DS
253 bgp_nht_ifp_up(ifp);
254
d62a17ae 255 return 0;
718e3744 256}
257
b0b69e59 258static int bgp_ifp_down(struct interface *ifp)
718e3744 259{
d62a17ae 260 struct connected *c;
261 struct nbr_connected *nc;
262 struct listnode *node, *nnode;
263 struct bgp *bgp;
c19fe3c7 264 struct peer *peer;
6aeb9e78 265
b0b69e59 266 bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
718e3744 267
6a69ac51
DS
268 bgp_mac_del_mac_entry(ifp);
269
d62a17ae 270 if (BGP_DEBUG(zebra, ZEBRA))
b0b69e59 271 zlog_debug("Rx Intf down VRF %u IF %s", ifp->vrf_id, ifp->name);
ad4cbda1 272
85751d1d
DS
273 if (!bgp)
274 return 0;
275
d62a17ae 276 for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, c))
277 bgp_connected_delete(bgp, c);
718e3744 278
d62a17ae 279 for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc))
280 bgp_nbr_connected_delete(bgp, nc, 1);
a80beece 281
d62a17ae 282 /* Fast external-failover */
c19fe3c7 283 if (!CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) {
718e3744 284
d62a17ae 285 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
8c4f6381 286#if defined(HAVE_CUMULUS)
d62a17ae 287 /* Take down directly connected EBGP peers as well as
288 * 1-hop BFD
289 * tracked (directly connected) IBGP peers.
290 */
c8d6f0d6 291 if ((peer->ttl != BGP_DEFAULT_TTL)
e2521429 292 && (peer->gtsm_hops != BGP_GTSM_HOPS_CONNECTED)
d62a17ae 293 && (!peer->bfd_info
294 || bgp_bfd_is_peer_multihop(peer)))
8c4f6381 295#else
d62a17ae 296 /* Take down directly connected EBGP peers */
c8d6f0d6 297 if ((peer->ttl != BGP_DEFAULT_TTL)
e2521429 298 && (peer->gtsm_hops != BGP_GTSM_HOPS_CONNECTED))
8c4f6381 299#endif
d62a17ae 300 continue;
718e3744 301
d62a17ae 302 if (ifp == peer->nexthop.ifp) {
303 BGP_EVENT_ADD(peer, BGP_Stop);
304 peer->last_reset = PEER_DOWN_IF_DOWN;
305 }
306 }
307 }
718e3744 308
0d020cd6 309 hook_call(bgp_vrf_status_changed, bgp, ifp);
8761cd6d
DS
310 bgp_nht_ifp_down(ifp);
311
d62a17ae 312 return 0;
718e3744 313}
314
121f9dee 315static int bgp_interface_address_add(ZAPI_CALLBACK_ARGS)
718e3744 316{
d62a17ae 317 struct connected *ifc;
2f9123e0
DS
318 struct bgp *bgp;
319
320 bgp = bgp_lookup_by_vrf_id(vrf_id);
d62a17ae 321
121f9dee 322 ifc = zebra_interface_address_read(cmd, zclient->ibuf, vrf_id);
d62a17ae 323
324 if (ifc == NULL)
325 return 0;
326
2dbe669b
DA
327 if (bgp_debug_zebra(ifc->address))
328 zlog_debug("Rx Intf address add VRF %u IF %s addr %pFX", vrf_id,
329 ifc->ifp->name, ifc->address);
d62a17ae 330
85751d1d
DS
331 if (!bgp)
332 return 0;
333
d62a17ae 334 if (if_is_operative(ifc->ifp)) {
d62a17ae 335 bgp_connected_add(bgp, ifc);
2f9123e0 336
d62a17ae 337 /* If we have learnt of any neighbors on this interface,
338 * check to kick off any BGP interface-based neighbors,
339 * but only if this is a link-local address.
340 */
341 if (IN6_IS_ADDR_LINKLOCAL(&ifc->address->u.prefix6)
342 && !list_isempty(ifc->ifp->nbr_connected))
343 bgp_start_interface_nbrs(bgp, ifc->ifp);
344 }
345
346 return 0;
718e3744 347}
348
121f9dee 349static int bgp_interface_address_delete(ZAPI_CALLBACK_ARGS)
718e3744 350{
d62a17ae 351 struct connected *ifc;
352 struct bgp *bgp;
6aeb9e78 353
2f9123e0 354 bgp = bgp_lookup_by_vrf_id(vrf_id);
2f9123e0 355
121f9dee 356 ifc = zebra_interface_address_read(cmd, zclient->ibuf, vrf_id);
718e3744 357
d62a17ae 358 if (ifc == NULL)
359 return 0;
718e3744 360
2dbe669b
DA
361 if (bgp_debug_zebra(ifc->address))
362 zlog_debug("Rx Intf address del VRF %u IF %s addr %pFX", vrf_id,
363 ifc->ifp->name, ifc->address);
a39275d7 364
85751d1d 365 if (bgp && if_is_operative(ifc->ifp)) {
2f9123e0 366 bgp_connected_delete(bgp, ifc);
d62a17ae 367 }
718e3744 368
721c0857 369 connected_free(&ifc);
718e3744 370
d62a17ae 371 return 0;
718e3744 372}
373
121f9dee 374static int bgp_interface_nbr_address_add(ZAPI_CALLBACK_ARGS)
a80beece 375{
d62a17ae 376 struct nbr_connected *ifc = NULL;
377 struct bgp *bgp;
378
121f9dee 379 ifc = zebra_interface_nbr_address_read(cmd, zclient->ibuf, vrf_id);
d62a17ae 380
381 if (ifc == NULL)
382 return 0;
383
2dbe669b
DA
384 if (bgp_debug_zebra(ifc->address))
385 zlog_debug("Rx Intf neighbor add VRF %u IF %s addr %pFX",
386 vrf_id, ifc->ifp->name, ifc->address);
d62a17ae 387
388 if (if_is_operative(ifc->ifp)) {
389 bgp = bgp_lookup_by_vrf_id(vrf_id);
390 if (bgp)
391 bgp_nbr_connected_add(bgp, ifc);
392 }
393
394 return 0;
a80beece
DS
395}
396
121f9dee 397static int bgp_interface_nbr_address_delete(ZAPI_CALLBACK_ARGS)
a80beece 398{
d62a17ae 399 struct nbr_connected *ifc = NULL;
400 struct bgp *bgp;
6aeb9e78 401
121f9dee 402 ifc = zebra_interface_nbr_address_read(cmd, zclient->ibuf, vrf_id);
a80beece 403
d62a17ae 404 if (ifc == NULL)
405 return 0;
a80beece 406
2dbe669b
DA
407 if (bgp_debug_zebra(ifc->address))
408 zlog_debug("Rx Intf neighbor del VRF %u IF %s addr %pFX",
409 vrf_id, ifc->ifp->name, ifc->address);
a80beece 410
d62a17ae 411 if (if_is_operative(ifc->ifp)) {
412 bgp = bgp_lookup_by_vrf_id(vrf_id);
413 if (bgp)
414 bgp_nbr_connected_delete(bgp, ifc, 0);
415 }
a80beece 416
d62a17ae 417 nbr_connected_free(ifc);
a80beece 418
d62a17ae 419 return 0;
a80beece
DS
420}
421
bfcd43b2 422/* VRF update for an interface. */
121f9dee 423static int bgp_interface_vrf_update(ZAPI_CALLBACK_ARGS)
bfcd43b2 424{
d62a17ae 425 struct interface *ifp;
426 vrf_id_t new_vrf_id;
427 struct connected *c;
428 struct nbr_connected *nc;
429 struct listnode *node, *nnode;
430 struct bgp *bgp;
c19fe3c7 431 struct peer *peer;
bfcd43b2 432
d62a17ae 433 ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id,
434 &new_vrf_id);
435 if (!ifp)
436 return 0;
bfcd43b2 437
d62a17ae 438 if (BGP_DEBUG(zebra, ZEBRA) && ifp)
439 zlog_debug("Rx Intf VRF change VRF %u IF %s NewVRF %u", vrf_id,
440 ifp->name, new_vrf_id);
bfcd43b2 441
d62a17ae 442 bgp = bgp_lookup_by_vrf_id(vrf_id);
bfcd43b2 443
85751d1d
DS
444 if (bgp) {
445 for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, c))
446 bgp_connected_delete(bgp, c);
bfcd43b2 447
85751d1d
DS
448 for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc))
449 bgp_nbr_connected_delete(bgp, nc, 1);
bfcd43b2 450
85751d1d
DS
451 /* Fast external-failover */
452 if (!CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) {
453 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
c8d6f0d6 454 if ((peer->ttl != BGP_DEFAULT_TTL)
e2521429
DA
455 && (peer->gtsm_hops
456 != BGP_GTSM_HOPS_CONNECTED))
85751d1d 457 continue;
bfcd43b2 458
85751d1d
DS
459 if (ifp == peer->nexthop.ifp)
460 BGP_EVENT_ADD(peer, BGP_Stop);
461 }
d62a17ae 462 }
463 }
bfcd43b2 464
a36898e7 465 if_update_to_new_vrf(ifp, new_vrf_id);
bfcd43b2 466
d62a17ae 467 bgp = bgp_lookup_by_vrf_id(new_vrf_id);
468 if (!bgp)
469 return 0;
bfcd43b2 470
d62a17ae 471 for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, c))
472 bgp_connected_add(bgp, c);
bfcd43b2 473
d62a17ae 474 for (ALL_LIST_ELEMENTS(ifp->nbr_connected, node, nnode, nc))
475 bgp_nbr_connected_add(bgp, nc);
0d020cd6
PR
476
477 hook_call(bgp_vrf_status_changed, bgp, ifp);
d62a17ae 478 return 0;
bfcd43b2 479}
480
718e3744 481/* Zebra route add and delete treatment. */
121f9dee 482static int zebra_read_route(ZAPI_CALLBACK_ARGS)
718e3744 483{
9de1f7ff 484 enum nexthop_types_t nhtype;
74489921
RW
485 struct zapi_route api;
486 union g_addr nexthop;
9de1f7ff 487 ifindex_t ifindex;
74489921 488 int add, i;
d62a17ae 489 struct bgp *bgp;
490
491 bgp = bgp_lookup_by_vrf_id(vrf_id);
492 if (!bgp)
493 return 0;
494
74489921
RW
495 if (zapi_route_decode(zclient->ibuf, &api) < 0)
496 return -1;
d62a17ae 497
74489921
RW
498 /* we completely ignore srcdest routes for now. */
499 if (CHECK_FLAG(api.message, ZAPI_MESSAGE_SRCPFX))
500 return 0;
d62a17ae 501
74489921
RW
502 /* ignore link-local address. */
503 if (api.prefix.family == AF_INET6
504 && IN6_IS_ADDR_LINKLOCAL(&api.prefix.u.prefix6))
505 return 0;
d62a17ae 506
74489921
RW
507 nexthop = api.nexthops[0].gate;
508 ifindex = api.nexthops[0].ifindex;
9de1f7ff 509 nhtype = api.nexthops[0].type;
d62a17ae 510
121f9dee 511 add = (cmd == ZEBRA_REDISTRIBUTE_ROUTE_ADD);
74489921 512 if (add) {
d62a17ae 513 /*
514 * The ADD message is actually an UPDATE and there is no
515 * explicit DEL
516 * for a prior redistributed route, if any. So, perform an
517 * implicit
518 * DEL processing for the same redistributed route from any
519 * other
520 * source type.
521 */
522 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
523 if (i != api.type)
74489921 524 bgp_redistribute_delete(bgp, &api.prefix, i,
d62a17ae 525 api.instance);
526 }
527
528 /* Now perform the add/update. */
74489921 529 bgp_redistribute_add(bgp, &api.prefix, &nexthop, ifindex,
a4d82a8a
PZ
530 nhtype, api.metric, api.type, api.instance,
531 api.tag);
d62a17ae 532 } else {
74489921
RW
533 bgp_redistribute_delete(bgp, &api.prefix, api.type,
534 api.instance);
a39275d7 535 }
d62a17ae 536
74489921 537 if (bgp_debug_zebra(&api.prefix)) {
2dbe669b 538 char buf[PREFIX_STRLEN];
74489921 539
77e62f2b 540 if (add) {
2dbe669b
DA
541 inet_ntop(api.prefix.family, &nexthop, buf,
542 sizeof(buf));
77e62f2b 543 zlog_debug(
801bb996 544 "Rx route ADD VRF %u %s[%d] %pFX nexthop %s (type %d if %u) metric %u distance %u tag %" ROUTE_TAG_PRI,
77e62f2b 545 vrf_id, zebra_route_string(api.type),
2dbe669b 546 api.instance, &api.prefix, buf, nhtype, ifindex,
801bb996 547 api.metric, api.distance, api.tag);
77e62f2b 548 } else {
6bdbcbf1 549 zlog_debug("Rx route DEL VRF %u %s[%d] %pFX", vrf_id,
2dbe669b 550 zebra_route_string(api.type), api.instance,
6bdbcbf1 551 &api.prefix);
77e62f2b 552 }
d62a17ae 553 }
554
555 return 0;
718e3744 556}
6b0655a2 557
d62a17ae 558struct interface *if_lookup_by_ipv4(struct in_addr *addr, vrf_id_t vrf_id)
718e3744 559{
f4e14fdb 560 struct vrf *vrf;
d62a17ae 561 struct listnode *cnode;
562 struct interface *ifp;
563 struct connected *connected;
564 struct prefix_ipv4 p;
565 struct prefix *cp;
566
f4e14fdb
RW
567 vrf = vrf_lookup_by_id(vrf_id);
568 if (!vrf)
569 return NULL;
570
d62a17ae 571 p.family = AF_INET;
572 p.prefix = *addr;
573 p.prefixlen = IPV4_MAX_BITLEN;
574
451fda4f 575 FOR_ALL_INTERFACES (vrf, ifp) {
d62a17ae 576 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
577 cp = connected->address;
578
579 if (cp->family == AF_INET)
580 if (prefix_match(cp, (struct prefix *)&p))
581 return ifp;
582 }
718e3744 583 }
d62a17ae 584 return NULL;
718e3744 585}
586
d62a17ae 587struct interface *if_lookup_by_ipv4_exact(struct in_addr *addr, vrf_id_t vrf_id)
718e3744 588{
f4e14fdb 589 struct vrf *vrf;
d62a17ae 590 struct listnode *cnode;
591 struct interface *ifp;
592 struct connected *connected;
593 struct prefix *cp;
594
f4e14fdb
RW
595 vrf = vrf_lookup_by_id(vrf_id);
596 if (!vrf)
597 return NULL;
598
451fda4f 599 FOR_ALL_INTERFACES (vrf, ifp) {
d62a17ae 600 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
601 cp = connected->address;
602
603 if (cp->family == AF_INET)
604 if (IPV4_ADDR_SAME(&cp->u.prefix4, addr))
605 return ifp;
606 }
718e3744 607 }
d62a17ae 608 return NULL;
718e3744 609}
610
d62a17ae 611struct interface *if_lookup_by_ipv6(struct in6_addr *addr, ifindex_t ifindex,
612 vrf_id_t vrf_id)
718e3744 613{
f4e14fdb 614 struct vrf *vrf;
d62a17ae 615 struct listnode *cnode;
616 struct interface *ifp;
617 struct connected *connected;
618 struct prefix_ipv6 p;
619 struct prefix *cp;
620
f4e14fdb
RW
621 vrf = vrf_lookup_by_id(vrf_id);
622 if (!vrf)
623 return NULL;
624
d62a17ae 625 p.family = AF_INET6;
626 p.prefix = *addr;
627 p.prefixlen = IPV6_MAX_BITLEN;
628
451fda4f 629 FOR_ALL_INTERFACES (vrf, ifp) {
d62a17ae 630 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
631 cp = connected->address;
632
633 if (cp->family == AF_INET6)
634 if (prefix_match(cp, (struct prefix *)&p)) {
635 if (IN6_IS_ADDR_LINKLOCAL(
636 &cp->u.prefix6)) {
637 if (ifindex == ifp->ifindex)
638 return ifp;
639 } else
640 return ifp;
641 }
642 }
718e3744 643 }
d62a17ae 644 return NULL;
718e3744 645}
646
d62a17ae 647struct interface *if_lookup_by_ipv6_exact(struct in6_addr *addr,
648 ifindex_t ifindex, vrf_id_t vrf_id)
718e3744 649{
f4e14fdb 650 struct vrf *vrf;
d62a17ae 651 struct listnode *cnode;
652 struct interface *ifp;
653 struct connected *connected;
654 struct prefix *cp;
655
f4e14fdb
RW
656 vrf = vrf_lookup_by_id(vrf_id);
657 if (!vrf)
658 return NULL;
659
451fda4f 660 FOR_ALL_INTERFACES (vrf, ifp) {
d62a17ae 661 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
662 cp = connected->address;
663
664 if (cp->family == AF_INET6)
665 if (IPV6_ADDR_SAME(&cp->u.prefix6, addr)) {
666 if (IN6_IS_ADDR_LINKLOCAL(
667 &cp->u.prefix6)) {
668 if (ifindex == ifp->ifindex)
669 return ifp;
670 } else
671 return ifp;
672 }
673 }
718e3744 674 }
d62a17ae 675 return NULL;
718e3744 676}
677
d62a17ae 678static int if_get_ipv6_global(struct interface *ifp, struct in6_addr *addr)
718e3744 679{
d62a17ae 680 struct listnode *cnode;
681 struct connected *connected;
682 struct prefix *cp;
683
684 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
685 cp = connected->address;
686
687 if (cp->family == AF_INET6)
688 if (!IN6_IS_ADDR_LINKLOCAL(&cp->u.prefix6)) {
689 memcpy(addr, &cp->u.prefix6, IPV6_MAX_BYTELEN);
690 return 1;
691 }
692 }
693 return 0;
718e3744 694}
695
d62a17ae 696static int if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr)
718e3744 697{
d62a17ae 698 struct listnode *cnode;
699 struct connected *connected;
700 struct prefix *cp;
701
702 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
703 cp = connected->address;
704
705 if (cp->family == AF_INET6)
706 if (IN6_IS_ADDR_LINKLOCAL(&cp->u.prefix6)) {
707 memcpy(addr, &cp->u.prefix6, IPV6_MAX_BYTELEN);
708 return 1;
709 }
710 }
711 return 0;
718e3744 712}
718e3744 713
d62a17ae 714static int if_get_ipv4_address(struct interface *ifp, struct in_addr *addr)
6ee06fa9 715{
d62a17ae 716 struct listnode *cnode;
717 struct connected *connected;
718 struct prefix *cp;
719
720 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) {
721 cp = connected->address;
722 if ((cp->family == AF_INET)
723 && !ipv4_martian(&(cp->u.prefix4))) {
724 *addr = cp->u.prefix4;
725 return 1;
726 }
727 }
728 return 0;
6ee06fa9
PM
729}
730
17cdd31e
DS
731
732bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
733 struct bgp_nexthop *nexthop, struct peer *peer)
718e3744 734{
d62a17ae 735 int ret = 0;
736 struct interface *ifp = NULL;
737
738 memset(nexthop, 0, sizeof(struct bgp_nexthop));
739
740 if (!local)
17cdd31e 741 return false;
d62a17ae 742 if (!remote)
17cdd31e 743 return false;
d62a17ae 744
745 if (local->sa.sa_family == AF_INET) {
746 nexthop->v4 = local->sin.sin_addr;
747 if (peer->update_if)
748 ifp = if_lookup_by_name(peer->update_if,
a36898e7 749 peer->bgp->vrf_id);
d62a17ae 750 else
751 ifp = if_lookup_by_ipv4_exact(&local->sin.sin_addr,
752 peer->bgp->vrf_id);
718e3744 753 }
d62a17ae 754 if (local->sa.sa_family == AF_INET6) {
8f2b2139 755 memcpy(&nexthop->v6_global, &local->sin6.sin6_addr, IPV6_MAX_BYTELEN);
d62a17ae 756 if (IN6_IS_ADDR_LINKLOCAL(&local->sin6.sin6_addr)) {
757 if (peer->conf_if || peer->ifname)
758 ifp = if_lookup_by_name(peer->conf_if
759 ? peer->conf_if
760 : peer->ifname,
a36898e7 761 peer->bgp->vrf_id);
d62a17ae 762 } else if (peer->update_if)
763 ifp = if_lookup_by_name(peer->update_if,
a36898e7 764 peer->bgp->vrf_id);
d62a17ae 765 else
766 ifp = if_lookup_by_ipv6_exact(&local->sin6.sin6_addr,
767 local->sin6.sin6_scope_id,
768 peer->bgp->vrf_id);
718e3744 769 }
d62a17ae 770
17cdd31e
DS
771 if (!ifp) {
772 /*
773 * BGP views do not currently get proper data
774 * from zebra( when attached ) to be able to
775 * properly resolve nexthops, so give this
776 * instance type a pass.
777 */
778 if (peer->bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
779 return true;
780 /*
781 * If we have no interface data but we have established
782 * some connection w/ zebra than something has gone
783 * terribly terribly wrong here, so say this failed
784 * If we do not any zebra connection then not
785 * having a ifp pointer is ok.
786 */
787 return zclient_num_connects ? false : true;
788 }
d62a17ae 789
790 nexthop->ifp = ifp;
791
792 /* IPv4 connection, fetch and store IPv6 local address(es) if any. */
793 if (local->sa.sa_family == AF_INET) {
794 /* IPv6 nexthop*/
795 ret = if_get_ipv6_global(ifp, &nexthop->v6_global);
796
797 if (!ret) {
798 /* There is no global nexthop. Use link-local address as
799 * both the
800 * global and link-local nexthop. In this scenario, the
801 * expectation
802 * for interop is that the network admin would use a
803 * route-map to
804 * specify the global IPv6 nexthop.
805 */
806 if_get_ipv6_local(ifp, &nexthop->v6_global);
807 memcpy(&nexthop->v6_local, &nexthop->v6_global,
808 IPV6_MAX_BYTELEN);
809 } else
810 if_get_ipv6_local(ifp, &nexthop->v6_local);
811
812 if (if_lookup_by_ipv4(&remote->sin.sin_addr, peer->bgp->vrf_id))
813 peer->shared_network = 1;
814 else
815 peer->shared_network = 0;
718e3744 816 }
718e3744 817
d62a17ae 818 /* IPv6 connection, fetch and store IPv4 local address if any. */
819 if (local->sa.sa_family == AF_INET6) {
820 struct interface *direct = NULL;
821
822 /* IPv4 nexthop. */
823 ret = if_get_ipv4_address(ifp, &nexthop->v4);
975a328e 824 if (!ret && peer->local_id.s_addr != INADDR_ANY)
d62a17ae 825 nexthop->v4 = peer->local_id;
826
827 /* Global address*/
828 if (!IN6_IS_ADDR_LINKLOCAL(&local->sin6.sin6_addr)) {
829 memcpy(&nexthop->v6_global, &local->sin6.sin6_addr,
830 IPV6_MAX_BYTELEN);
831
832 /* If directory connected set link-local address. */
833 direct = if_lookup_by_ipv6(&remote->sin6.sin6_addr,
834 remote->sin6.sin6_scope_id,
835 peer->bgp->vrf_id);
836 if (direct)
837 if_get_ipv6_local(ifp, &nexthop->v6_local);
838 } else
839 /* Link-local address. */
840 {
841 ret = if_get_ipv6_global(ifp, &nexthop->v6_global);
842
843 /* If there is no global address. Set link-local
844 address as
845 global. I know this break RFC specification... */
846 /* In this scenario, the expectation for interop is that
847 * the
848 * network admin would use a route-map to specify the
849 * global
850 * IPv6 nexthop.
851 */
852 if (!ret)
853 memcpy(&nexthop->v6_global,
854 &local->sin6.sin6_addr,
855 IPV6_MAX_BYTELEN);
856 /* Always set the link-local address */
857 memcpy(&nexthop->v6_local, &local->sin6.sin6_addr,
858 IPV6_MAX_BYTELEN);
859 }
860
861 if (IN6_IS_ADDR_LINKLOCAL(&local->sin6.sin6_addr)
862 || if_lookup_by_ipv6(&remote->sin6.sin6_addr,
863 remote->sin6.sin6_scope_id,
864 peer->bgp->vrf_id))
865 peer->shared_network = 1;
866 else
867 peer->shared_network = 0;
868 }
718e3744 869
d62a17ae 870/* KAME stack specific treatment. */
718e3744 871#ifdef KAME
d62a17ae 872 if (IN6_IS_ADDR_LINKLOCAL(&nexthop->v6_global)
873 && IN6_LINKLOCAL_IFINDEX(nexthop->v6_global)) {
874 SET_IN6_LINKLOCAL_IFINDEX(nexthop->v6_global, 0);
875 }
876 if (IN6_IS_ADDR_LINKLOCAL(&nexthop->v6_local)
877 && IN6_LINKLOCAL_IFINDEX(nexthop->v6_local)) {
878 SET_IN6_LINKLOCAL_IFINDEX(nexthop->v6_local, 0);
879 }
718e3744 880#endif /* KAME */
e33a4880 881
d62a17ae 882 /* If we have identified the local interface, there is no error for now.
883 */
17cdd31e 884 return true;
718e3744 885}
886
18ee8310 887static struct in6_addr *
40381db7 888bgp_path_info_to_ipv6_nexthop(struct bgp_path_info *path, ifindex_t *ifindex)
73ac8160 889{
d62a17ae 890 struct in6_addr *nexthop = NULL;
891
892 /* Only global address nexthop exists. */
dc94fe42
RW
893 if (path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL
894 || path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL) {
40381db7 895 nexthop = &path->attr->mp_nexthop_global;
77e62f2b 896 if (IN6_IS_ADDR_LINKLOCAL(nexthop))
40381db7 897 *ifindex = path->attr->nh_ifindex;
77e62f2b 898 }
d62a17ae 899
900 /* If both global and link-local address present. */
dc94fe42
RW
901 if (path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
902 || path->attr->mp_nexthop_len
903 == BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL) {
d62a17ae 904 /* Check if route-map is set to prefer global over link-local */
40381db7
DS
905 if (path->attr->mp_nexthop_prefer_global) {
906 nexthop = &path->attr->mp_nexthop_global;
77e62f2b 907 if (IN6_IS_ADDR_LINKLOCAL(nexthop))
40381db7 908 *ifindex = path->attr->nh_ifindex;
77e62f2b 909 } else {
d62a17ae 910 /* Workaround for Cisco's nexthop bug. */
911 if (IN6_IS_ADDR_UNSPECIFIED(
40381db7 912 &path->attr->mp_nexthop_global)
ab0e0f73 913 && path->peer->su_remote
40381db7 914 && path->peer->su_remote->sa.sa_family
59a0f1cb 915 == AF_INET6) {
d62a17ae 916 nexthop =
40381db7 917 &path->peer->su_remote->sin6.sin6_addr;
77e62f2b 918 if (IN6_IS_ADDR_LINKLOCAL(nexthop))
40381db7 919 *ifindex = path->peer->nexthop.ifp
59a0f1cb 920 ->ifindex;
77e62f2b 921 } else {
40381db7 922 nexthop = &path->attr->mp_nexthop_local;
77e62f2b 923 if (IN6_IS_ADDR_LINKLOCAL(nexthop))
40381db7 924 *ifindex = path->attr->nh_lla_ifindex;
77e62f2b 925 }
d62a17ae 926 }
927 }
928
929 return nexthop;
73ac8160
DS
930}
931
b8685f9b 932static bool bgp_table_map_apply(struct route_map *map, const struct prefix *p,
3dc339cd 933 struct bgp_path_info *path)
73ac8160 934{
b4cb15c6
DL
935 route_map_result_t ret;
936
1782514f 937 ret = route_map_apply(map, p, path);
40381db7 938 bgp_attr_flush(path->attr);
b4cb15c6
DL
939
940 if (ret != RMAP_DENYMATCH)
3dc339cd 941 return true;
d62a17ae 942
943 if (bgp_debug_zebra(p)) {
944 if (p->family == AF_INET) {
d62a17ae 945 zlog_debug(
c0d72166
DS
946 "Zebra rmap deny: IPv4 route %pFX nexthop %pI4",
947 p, &path->attr->nexthop);
d62a17ae 948 }
949 if (p->family == AF_INET6) {
950 char buf[2][INET6_ADDRSTRLEN];
77e62f2b 951 ifindex_t ifindex;
952 struct in6_addr *nexthop;
953
40381db7 954 nexthop = bgp_path_info_to_ipv6_nexthop(path, &ifindex);
d62a17ae 955 zlog_debug(
8228a9a7
DS
956 "Zebra rmap deny: IPv6 route %pFX nexthop %s",
957 p,
6b9265a3
DA
958 nexthop ? inet_ntop(AF_INET6, nexthop, buf[1],
959 sizeof(buf[1]))
960 : inet_ntop(AF_INET,
961 &path->attr->nexthop,
962 buf[1], sizeof(buf[1])));
d62a17ae 963 }
964 }
3dc339cd 965 return false;
73ac8160
DS
966}
967
b98f7728
PG
968static struct thread *bgp_tm_thread_connect;
969static bool bgp_tm_status_connected;
31c28cd7
PG
970static bool bgp_tm_chunk_obtained;
971#define BGP_FLOWSPEC_TABLE_CHUNK 100000
972static uint32_t bgp_tm_min, bgp_tm_max, bgp_tm_chunk_size;
6818e7e5 973struct bgp *bgp_tm_bgp;
b98f7728
PG
974
975static int bgp_zebra_tm_connect(struct thread *t)
976{
977 struct zclient *zclient;
978 int delay = 10, ret = 0;
979
980 zclient = THREAD_ARG(t);
981 if (bgp_tm_status_connected && zclient->sock > 0)
982 delay = 60;
983 else {
984 bgp_tm_status_connected = false;
985 ret = tm_table_manager_connect(zclient);
986 }
987 if (ret < 0) {
b7cd3069 988 zlog_info("Error connecting to table manager!");
b98f7728
PG
989 bgp_tm_status_connected = false;
990 } else {
991 if (!bgp_tm_status_connected)
992 zlog_debug("Connecting to table manager. Success");
993 bgp_tm_status_connected = true;
31c28cd7
PG
994 if (!bgp_tm_chunk_obtained) {
995 if (bgp_zebra_get_table_range(bgp_tm_chunk_size,
996 &bgp_tm_min,
6818e7e5 997 &bgp_tm_max) >= 0) {
31c28cd7 998 bgp_tm_chunk_obtained = true;
6818e7e5
PG
999 /* parse non installed entries */
1000 bgp_zebra_announce_table(bgp_tm_bgp, AFI_IP, SAFI_FLOWSPEC);
1001 }
31c28cd7 1002 }
b98f7728
PG
1003 }
1004 thread_add_timer(bm->master, bgp_zebra_tm_connect, zclient, delay,
1005 &bgp_tm_thread_connect);
1006 return 0;
1007}
1008
6818e7e5
PG
1009bool bgp_zebra_tm_chunk_obtained(void)
1010{
1011 return bgp_tm_chunk_obtained;
1012}
1013
31c28cd7
PG
1014uint32_t bgp_zebra_tm_get_id(void)
1015{
1016 static int table_id;
1017
1018 if (!bgp_tm_chunk_obtained)
1019 return ++table_id;
1020 return bgp_tm_min++;
1021}
1022
6818e7e5 1023void bgp_zebra_init_tm_connect(struct bgp *bgp)
b98f7728
PG
1024{
1025 int delay = 1;
1026
1027 /* if already set, do nothing
1028 */
1029 if (bgp_tm_thread_connect != NULL)
1030 return;
1031 bgp_tm_status_connected = false;
31c28cd7
PG
1032 bgp_tm_chunk_obtained = false;
1033 bgp_tm_min = bgp_tm_max = 0;
1034 bgp_tm_chunk_size = BGP_FLOWSPEC_TABLE_CHUNK;
6818e7e5 1035 bgp_tm_bgp = bgp;
b98f7728
PG
1036 thread_add_timer(bm->master, bgp_zebra_tm_connect, zclient, delay,
1037 &bgp_tm_thread_connect);
1038}
1039
1040int bgp_zebra_get_table_range(uint32_t chunk_size,
1041 uint32_t *start, uint32_t *end)
1042{
1043 int ret;
1044
1045 if (!bgp_tm_status_connected)
1046 return -1;
1047 ret = tm_get_table_chunk(zclient, chunk_size, start, end);
1048 if (ret < 0) {
e50f7cfd 1049 flog_err(EC_BGP_TABLE_CHUNK,
1c50c1c0 1050 "BGP: Error getting table chunk %u", chunk_size);
b98f7728
PG
1051 return -1;
1052 }
1053 zlog_info("BGP: Table Manager returns range from chunk %u is [%u %u]",
1054 chunk_size, *start, *end);
1055 return 0;
1056}
1057
3dc339cd
DA
1058static bool update_ipv4nh_for_route_install(int nh_othervrf, struct bgp *nh_bgp,
1059 struct in_addr *nexthop,
1060 struct attr *attr, bool is_evpn,
1061 struct zapi_nexthop *api_nh)
77e62f2b 1062{
1063 api_nh->gate.ipv4 = *nexthop;
e1e71450 1064 api_nh->vrf_id = nh_bgp->vrf_id;
77e62f2b 1065
1066 /* Need to set fields appropriately for EVPN routes imported into
1067 * a VRF (which are programmed as onlink on l3-vni SVI) as well as
1068 * connected routes leaked into a VRF.
1069 */
e1e71450 1070 if (is_evpn) {
77e62f2b 1071 api_nh->type = NEXTHOP_TYPE_IPV4_IFINDEX;
68a02e06 1072 SET_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_ONLINK);
e1e71450 1073 api_nh->ifindex = nh_bgp->l3vni_svi_ifindex;
1074 } else if (nh_othervrf &&
77e62f2b 1075 api_nh->gate.ipv4.s_addr == INADDR_ANY) {
1076 api_nh->type = NEXTHOP_TYPE_IFINDEX;
1077 api_nh->ifindex = attr->nh_ifindex;
1078 } else
1079 api_nh->type = NEXTHOP_TYPE_IPV4;
1080
3dc339cd 1081 return true;
77e62f2b 1082}
1083
3dc339cd
DA
1084static bool update_ipv6nh_for_route_install(int nh_othervrf, struct bgp *nh_bgp,
1085 struct in6_addr *nexthop,
1086 ifindex_t ifindex,
1087 struct bgp_path_info *pi,
1088 struct bgp_path_info *best_pi,
1089 bool is_evpn,
1090 struct zapi_nexthop *api_nh)
77e62f2b 1091{
1092 struct attr *attr;
1093
40381db7 1094 attr = pi->attr;
e1e71450 1095 api_nh->vrf_id = nh_bgp->vrf_id;
77e62f2b 1096
e1e71450 1097 if (is_evpn) {
77e62f2b 1098 api_nh->type = NEXTHOP_TYPE_IPV6_IFINDEX;
68a02e06 1099 SET_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_ONLINK);
e1e71450 1100 api_nh->ifindex = nh_bgp->l3vni_svi_ifindex;
1101 } else if (nh_othervrf) {
77e62f2b 1102 if (IN6_IS_ADDR_UNSPECIFIED(nexthop)) {
1103 api_nh->type = NEXTHOP_TYPE_IFINDEX;
1104 api_nh->ifindex = attr->nh_ifindex;
1105 } else if (IN6_IS_ADDR_LINKLOCAL(nexthop)) {
1106 if (ifindex == 0)
3dc339cd 1107 return false;
77e62f2b 1108 api_nh->type = NEXTHOP_TYPE_IPV6_IFINDEX;
1109 api_nh->ifindex = ifindex;
1110 } else {
1111 api_nh->type = NEXTHOP_TYPE_IPV6;
1112 api_nh->ifindex = 0;
1113 }
1114 } else {
1115 if (IN6_IS_ADDR_LINKLOCAL(nexthop)) {
40381db7
DS
1116 if (pi == best_pi
1117 && attr->mp_nexthop_len
1118 == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
1119 if (pi->peer->nexthop.ifp)
1120 ifindex =
1121 pi->peer->nexthop.ifp->ifindex;
77e62f2b 1122 if (!ifindex) {
40381db7
DS
1123 if (pi->peer->conf_if)
1124 ifindex = pi->peer->ifp->ifindex;
1125 else if (pi->peer->ifname)
77e62f2b 1126 ifindex = ifname2ifindex(
40381db7
DS
1127 pi->peer->ifname,
1128 pi->peer->bgp->vrf_id);
1129 else if (pi->peer->nexthop.ifp)
1130 ifindex =
1131 pi->peer->nexthop.ifp->ifindex;
77e62f2b 1132 }
1133
1134 if (ifindex == 0)
3dc339cd 1135 return false;
77e62f2b 1136 api_nh->type = NEXTHOP_TYPE_IPV6_IFINDEX;
1137 api_nh->ifindex = ifindex;
1138 } else {
1139 api_nh->type = NEXTHOP_TYPE_IPV6;
1140 api_nh->ifindex = 0;
1141 }
1142 }
c2ca3e25
PG
1143 if (nexthop)
1144 api_nh->gate.ipv6 = *nexthop;
77e62f2b 1145
3dc339cd 1146 return true;
77e62f2b 1147}
1148
f7e1c681 1149static bool bgp_zebra_use_nhop_weighted(struct bgp *bgp, struct attr *attr,
1150 uint64_t tot_bw, uint32_t *nh_weight)
4e30bc2b 1151{
f7e1c681 1152 uint32_t bw;
1153 uint64_t tmp;
1154
1155 bw = attr->link_bw;
1156 /* zero link-bandwidth and link-bandwidth not present are treated
1157 * as the same situation.
1158 */
1159 if (!bw) {
1160 /* the only situations should be if we're either told
1161 * to skip or use default weight.
1162 */
1163 if (bgp->lb_handling == BGP_LINK_BW_SKIP_MISSING)
1164 return false;
1165 *nh_weight = BGP_ZEBRA_DEFAULT_NHOP_WEIGHT;
1166 } else {
1167 tmp = (uint64_t)bw * 100;
1168 *nh_weight = ((uint32_t)(tmp / tot_bw));
1169 }
1170
1171 return true;
4e30bc2b 1172}
1173
9bcb3eef 1174void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
4b7e6066 1175 struct bgp_path_info *info, struct bgp *bgp, afi_t afi,
d62a17ae 1176 safi_t safi)
718e3744 1177{
7cc27d41 1178 struct zapi_route api = { 0 };
9913029c 1179 struct zapi_nexthop *api_nh;
2ad4f093 1180 int nh_family;
a74e593b 1181 unsigned int valid_nh_count = 0;
2ad4f093 1182 int has_valid_label = 0;
d7c0a89a 1183 uint8_t distance;
d62a17ae 1184 struct peer *peer;
4b7e6066 1185 struct bgp_path_info *mpinfo;
d7c0a89a 1186 uint32_t metric;
b4cb15c6 1187 struct attr local_attr;
4b7e6066
DS
1188 struct bgp_path_info local_info;
1189 struct bgp_path_info *mpinfo_cp = &local_info;
d62a17ae 1190 route_tag_t tag;
1191 mpls_label_t label;
ddb5b488 1192 int nh_othervrf = 0;
960035b2 1193 char buf_prefix[PREFIX_STRLEN]; /* filled in if we are debugging */
3f54c705 1194 bool is_evpn;
06f16b2c 1195 bool nh_updated = false;
4e30bc2b 1196 bool do_wt_ecmp;
1197 uint64_t cum_bw = 0;
6348981a
AK
1198 uint32_t nhg_id = 0;
1199 bool is_add;
d62a17ae 1200
1201 /* Don't try to install if we're not connected to Zebra or Zebra doesn't
1202 * know of this instance.
1203 */
1204 if (!bgp_install_info_to_zebra(bgp))
1205 return;
1206
d62a17ae 1207 if (bgp->main_zebra_update_hold)
1208 return;
1209
960035b2 1210 if (bgp_debug_zebra(p))
ba1976db 1211 prefix2str(p, buf_prefix, sizeof(buf_prefix));
960035b2 1212
d90b788e 1213 if (safi == SAFI_FLOWSPEC) {
9bcb3eef
DS
1214 bgp_pbr_update_entry(bgp, bgp_dest_get_prefix(dest), info, afi,
1215 safi, true);
d90b788e
A
1216 return;
1217 }
529efa23 1218
ddb5b488
PZ
1219 /*
1220 * vrf leaking support (will have only one nexthop)
1221 */
1222 if (info->extra && info->extra->bgp_orig)
1223 nh_othervrf = 1;
1224
9913029c 1225 /* Make Zebra API structure. */
9913029c
RW
1226 api.vrf_id = bgp->vrf_id;
1227 api.type = ZEBRA_ROUTE_BGP;
1228 api.safi = safi;
1229 api.prefix = *p;
1230 SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
1231
d62a17ae 1232 peer = info->peer;
1233
ddb5b488
PZ
1234 if (info->type == ZEBRA_ROUTE_BGP
1235 && info->sub_type == BGP_ROUTE_IMPORTED) {
1236
1ec90b5e 1237 /* Obtain peer from parent */
1238 if (info->extra && info->extra->parent)
4b7e6066
DS
1239 peer = ((struct bgp_path_info *)(info->extra->parent))
1240 ->peer;
ddb5b488
PZ
1241 }
1242
d62a17ae 1243 tag = info->attr->tag;
1244
88493076 1245 /* If the route's source is EVPN, flag as such. */
77e62f2b 1246 is_evpn = is_route_parent_evpn(info);
1247 if (is_evpn)
90264d64 1248 SET_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE);
d3135ba3 1249
d62a17ae 1250 if (peer->sort == BGP_PEER_IBGP || peer->sort == BGP_PEER_CONFED
1251 || info->sub_type == BGP_ROUTE_AGGREGATE) {
9913029c 1252 SET_FLAG(api.flags, ZEBRA_FLAG_IBGP);
4e8b02f4 1253 SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
718e3744 1254 }
a39275d7 1255
c8d6f0d6 1256 if ((peer->sort == BGP_PEER_EBGP && peer->ttl != BGP_DEFAULT_TTL)
d62a17ae 1257 || CHECK_FLAG(peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)
892fedb6 1258 || CHECK_FLAG(bgp->flags, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
d62a17ae 1259
4e8b02f4 1260 SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
d62a17ae 1261
951745bd
PG
1262 if (info->attr->rmap_table_id) {
1263 SET_FLAG(api.message, ZAPI_MESSAGE_TABLEID);
1264 api.tableid = info->attr->rmap_table_id;
1265 }
1266
ef3e0d04
SM
1267 if (CHECK_FLAG(info->attr->flag, ATTR_FLAG_BIT(BGP_ATTR_SRTE_COLOR)))
1268 SET_FLAG(api.message, ZAPI_MESSAGE_SRTE);
1269
2ad4f093
RW
1270 /* Metric is currently based on the best-path only */
1271 metric = info->attr->med;
4e30bc2b 1272
1273 /* Determine if we're doing weighted ECMP or not */
f7e1c681 1274 do_wt_ecmp = bgp_path_info_mpath_chkwtd(bgp, info);
4e30bc2b 1275 if (do_wt_ecmp)
1276 cum_bw = bgp_path_info_mpath_cumbw(info);
1277
6348981a 1278 /* EVPN MAC-IP routes are installed with a L3 NHG id */
8bcb09a1 1279 if (bgp_evpn_path_es_use_nhg(bgp, info, &nhg_id)) {
6348981a 1280 mpinfo = NULL;
8bcb09a1
AK
1281 api.nhgid = nhg_id;
1282 if (nhg_id)
1283 SET_FLAG(api.message, ZAPI_MESSAGE_NHG);
1284 } else {
6348981a 1285 mpinfo = info;
8bcb09a1 1286 }
6348981a
AK
1287
1288 for (; mpinfo; mpinfo = bgp_path_info_mpath_next(mpinfo)) {
f7e1c681 1289 uint32_t nh_weight;
1290
a74e593b
RW
1291 if (valid_nh_count >= multipath_num)
1292 break;
1293
b4cb15c6 1294 *mpinfo_cp = *mpinfo;
f7e1c681 1295 nh_weight = 0;
b4cb15c6 1296
d0d695f4
RW
1297 /* Get nexthop address-family */
1298 if (p->family == AF_INET
1299 && !BGP_ATTR_NEXTHOP_AFI_IP6(mpinfo_cp->attr))
1300 nh_family = AF_INET;
1301 else if (p->family == AF_INET6
1302 || (p->family == AF_INET
1303 && BGP_ATTR_NEXTHOP_AFI_IP6(mpinfo_cp->attr)))
1304 nh_family = AF_INET6;
1305 else
1306 continue;
1307
f7e1c681 1308 /* If processing for weighted ECMP, determine the next hop's
1309 * weight. Based on user setting, we may skip the next hop
1310 * in some situations.
1311 */
1312 if (do_wt_ecmp) {
1313 if (!bgp_zebra_use_nhop_weighted(bgp, mpinfo->attr,
1314 cum_bw, &nh_weight))
1315 continue;
1316 }
1374aec9 1317 api_nh = &api.nexthops[valid_nh_count];
ef3e0d04
SM
1318
1319 if (CHECK_FLAG(info->attr->flag,
1320 ATTR_FLAG_BIT(BGP_ATTR_SRTE_COLOR)))
1321 api_nh->srte_color = info->attr->srte_color;
1322
257b7b6e
DS
1323 if (bgp_debug_zebra(&api.prefix)) {
1324 if (mpinfo->extra) {
1325 zlog_debug("%s: p=%s, bgp_is_valid_label: %d",
1326 __func__, buf_prefix,
1327 bgp_is_valid_label(
1328 &mpinfo->extra->label[0]));
1329 } else {
1330 zlog_debug("%s: p=%s, extra is NULL, no label",
1331 __func__, buf_prefix);
ddb5b488 1332 }
257b7b6e 1333 }
ddb5b488 1334
257b7b6e
DS
1335 if (bgp->table_map[afi][safi].name) {
1336 /* Copy info and attributes, so the route-map
1337 apply doesn't modify the BGP route info. */
1338 local_attr = *mpinfo->attr;
1339 mpinfo_cp->attr = &local_attr;
1340 if (!bgp_table_map_apply(bgp->table_map[afi][safi].map,
1341 p, mpinfo_cp))
1342 continue;
b4cb15c6 1343
257b7b6e
DS
1344 /* metric/tag is only allowed to be
1345 * overridden on 1st nexthop */
1346 if (mpinfo == info) {
1347 metric = mpinfo_cp->attr->med;
1348 tag = mpinfo_cp->attr->tag;
b4cb15c6 1349 }
257b7b6e 1350 }
d62a17ae 1351
257b7b6e 1352 if (nh_family == AF_INET) {
77e62f2b 1353 nh_updated = update_ipv4nh_for_route_install(
1354 nh_othervrf,
e1e71450 1355 nh_othervrf ?
1356 info->extra->bgp_orig : bgp,
77e62f2b 1357 &mpinfo_cp->attr->nexthop,
1358 mpinfo_cp->attr, is_evpn, api_nh);
2ad4f093 1359 } else {
f220da99 1360 ifindex_t ifindex = IFINDEX_INTERNAL;
2ad4f093 1361 struct in6_addr *nexthop;
9913029c 1362
18ee8310
DS
1363 nexthop = bgp_path_info_to_ipv6_nexthop(mpinfo_cp,
1364 &ifindex);
00c10664
DA
1365
1366 if (!nexthop)
1367 nh_updated = update_ipv4nh_for_route_install(
1368 nh_othervrf,
1369 nh_othervrf ? info->extra->bgp_orig
1370 : bgp,
1371 &mpinfo_cp->attr->nexthop,
1372 mpinfo_cp->attr, is_evpn, api_nh);
1373 else
1374 nh_updated = update_ipv6nh_for_route_install(
1375 nh_othervrf,
1376 nh_othervrf ? info->extra->bgp_orig
1377 : bgp,
1378 nexthop, ifindex, mpinfo, info, is_evpn,
1379 api_nh);
2ad4f093 1380 }
d62a17ae 1381
77e62f2b 1382 /* Did we get proper nexthop info to update zebra? */
1383 if (!nh_updated)
1384 continue;
1385
a4d82a8a
PZ
1386 if (mpinfo->extra
1387 && bgp_is_valid_label(&mpinfo->extra->label[0])
90264d64 1388 && !CHECK_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE)) {
2ad4f093 1389 has_valid_label = 1;
b57ba6d2 1390 label = label_pton(&mpinfo->extra->label[0]);
9913029c 1391
68a02e06
MS
1392 SET_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_LABEL);
1393
2ad4f093
RW
1394 api_nh->label_num = 1;
1395 api_nh->labels[0] = label;
d62a17ae 1396 }
22e63104 1397 memcpy(&api_nh->rmac, &(mpinfo->attr->rmac),
1398 sizeof(struct ethaddr));
f7e1c681 1399 api_nh->weight = nh_weight;
4e30bc2b 1400
2ad4f093
RW
1401 valid_nh_count++;
1402 }
d62a17ae 1403
6348981a
AK
1404 is_add = (valid_nh_count || nhg_id) ? true : false;
1405
ec0acb80 1406 if (is_add && CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA)) {
e46723a5
DS
1407 struct aspath *aspath = info->attr->aspath;
1408
1409 SET_FLAG(api.message, ZAPI_MESSAGE_OPAQUE);
1410 api.opaque.length = strlen(aspath->str) + 1;
1411 memcpy(api.opaque.data, aspath->str, api.opaque.length);
1412 }
1413
5cc347c4
DS
1414 /*
1415 * When we create an aggregate route we must also
1416 * install a Null0 route in the RIB, so overwrite
1417 * what was written into api with a blackhole route
1418 */
1419 if (info->sub_type == BGP_ROUTE_AGGREGATE)
1420 zapi_route_set_blackhole(&api, BLACKHOLE_NULL);
1421 else
2ad4f093 1422 api.nexthop_num = valid_nh_count;
d62a17ae 1423
2ad4f093
RW
1424 SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
1425 api.metric = metric;
d62a17ae 1426
2ad4f093
RW
1427 if (tag) {
1428 SET_FLAG(api.message, ZAPI_MESSAGE_TAG);
1429 api.tag = tag;
1430 }
d62a17ae 1431
2ad4f093
RW
1432 distance = bgp_distance_apply(p, info, afi, safi, bgp);
1433 if (distance) {
1434 SET_FLAG(api.message, ZAPI_MESSAGE_DISTANCE);
1435 api.distance = distance;
1436 }
d62a17ae 1437
2ad4f093 1438 if (bgp_debug_zebra(p)) {
2ad4f093 1439 char nh_buf[INET6_ADDRSTRLEN];
d8744f72
CS
1440 char eth_buf[ETHER_ADDR_STRLEN + 7] = {'\0'};
1441 char buf1[ETHER_ADDR_STRLEN];
2ad4f093
RW
1442 char label_buf[20];
1443 int i;
1444
2dbe669b
DA
1445 zlog_debug(
1446 "Tx route %s VRF %u %pFX metric %u tag %" ROUTE_TAG_PRI
6348981a 1447 " count %d nhg %d",
2dbe669b 1448 valid_nh_count ? "add" : "delete", bgp->vrf_id,
6348981a
AK
1449 &api.prefix, api.metric, api.tag, api.nexthop_num,
1450 nhg_id);
2ad4f093
RW
1451 for (i = 0; i < api.nexthop_num; i++) {
1452 api_nh = &api.nexthops[i];
1453
1ee069db
CS
1454 switch (api_nh->type) {
1455 case NEXTHOP_TYPE_IFINDEX:
77e62f2b 1456 nh_buf[0] = '\0';
1ee069db
CS
1457 break;
1458 case NEXTHOP_TYPE_IPV4:
1459 case NEXTHOP_TYPE_IPV4_IFINDEX:
1460 nh_family = AF_INET;
77e62f2b 1461 inet_ntop(nh_family, &api_nh->gate, nh_buf,
1462 sizeof(nh_buf));
1ee069db
CS
1463 break;
1464 case NEXTHOP_TYPE_IPV6:
1465 case NEXTHOP_TYPE_IPV6_IFINDEX:
1466 nh_family = AF_INET6;
1467 inet_ntop(nh_family, &api_nh->gate, nh_buf,
1468 sizeof(nh_buf));
1469 break;
1470 case NEXTHOP_TYPE_BLACKHOLE:
1471 strlcpy(nh_buf, "blackhole", sizeof(nh_buf));
1472 break;
1473 default:
1474 /* Note: add new nexthop case */
1475 assert(0);
1476 break;
77e62f2b 1477 }
2ad4f093
RW
1478
1479 label_buf[0] = '\0';
d8744f72 1480 eth_buf[0] = '\0';
a4d82a8a
PZ
1481 if (has_valid_label
1482 && !CHECK_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE))
a7799788
CS
1483 snprintf(label_buf, sizeof(label_buf),
1484 "label %u", api_nh->labels[0]);
d8744f72
CS
1485 if (CHECK_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE)
1486 && !is_zero_mac(&api_nh->rmac))
a7799788
CS
1487 snprintf(eth_buf, sizeof(eth_buf), " RMAC %s",
1488 prefix_mac2str(&api_nh->rmac,
1489 buf1, sizeof(buf1)));
4e30bc2b 1490 zlog_debug(" nhop [%d]: %s if %u VRF %u wt %u %s %s",
77e62f2b 1491 i + 1, nh_buf, api_nh->ifindex,
4e30bc2b 1492 api_nh->vrf_id, api_nh->weight,
1493 label_buf, eth_buf);
d62a17ae 1494 }
2ad4f093 1495
960035b2
PZ
1496 int recursion_flag = 0;
1497
1498 if (CHECK_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION))
1499 recursion_flag = 1;
1500
1501 zlog_debug("%s: %s: announcing to zebra (recursion %sset)",
1502 __func__, buf_prefix,
1503 (recursion_flag ? "" : "NOT "));
1504 }
6348981a 1505 zclient_route_send(is_add ? ZEBRA_ROUTE_ADD : ZEBRA_ROUTE_DELETE,
2ad4f093 1506 zclient, &api);
718e3744 1507}
1508
73ac8160 1509/* Announce all routes of a table to zebra */
d62a17ae 1510void bgp_zebra_announce_table(struct bgp *bgp, afi_t afi, safi_t safi)
73ac8160 1511{
9bcb3eef 1512 struct bgp_dest *dest;
d62a17ae 1513 struct bgp_table *table;
40381db7 1514 struct bgp_path_info *pi;
d62a17ae 1515
1516 /* Don't try to install if we're not connected to Zebra or Zebra doesn't
1517 * know of this instance.
1518 */
1519 if (!bgp_install_info_to_zebra(bgp))
1520 return;
1521
1522 table = bgp->rib[afi][safi];
1523 if (!table)
1524 return;
1525
9bcb3eef
DS
1526 for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest))
1527 for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
40381db7 1528 if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED) &&
ddb5b488 1529
40381db7
DS
1530 (pi->type == ZEBRA_ROUTE_BGP
1531 && (pi->sub_type == BGP_ROUTE_NORMAL
1532 || pi->sub_type == BGP_ROUTE_IMPORTED)))
ddb5b488 1533
9bcb3eef
DS
1534 bgp_zebra_announce(dest,
1535 bgp_dest_get_prefix(dest),
b54892e0 1536 pi, bgp, afi, safi);
73ac8160
DS
1537}
1538
c163f297
DS
1539/* Announce routes of any bgp subtype of a table to zebra */
1540void bgp_zebra_announce_table_all_subtypes(struct bgp *bgp, afi_t afi,
1541 safi_t safi)
1542{
1543 struct bgp_dest *dest;
1544 struct bgp_table *table;
1545 struct bgp_path_info *pi;
1546
1547 if (!bgp_install_info_to_zebra(bgp))
1548 return;
1549
1550 table = bgp->rib[afi][safi];
1551 if (!table)
1552 return;
1553
1554 for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest))
1555 for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
1556 if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED) &&
1557 pi->type == ZEBRA_ROUTE_BGP)
1558 bgp_zebra_announce(dest,
1559 bgp_dest_get_prefix(dest),
1560 pi, bgp, afi, safi);
1561}
1562
5a1ae2c2 1563void bgp_zebra_withdraw(const struct prefix *p, struct bgp_path_info *info,
568e10ca 1564 struct bgp *bgp, safi_t safi)
718e3744 1565{
2ad4f093 1566 struct zapi_route api;
f7df1907 1567 struct peer *peer;
ddb5b488 1568
d62a17ae 1569 /* Don't try to install if we're not connected to Zebra or Zebra doesn't
1570 * know of this instance.
1571 */
568e10ca 1572 if (!bgp_install_info_to_zebra(bgp))
d62a17ae 1573 return;
1574
f7df1907
PG
1575 if (safi == SAFI_FLOWSPEC) {
1576 peer = info->peer;
d90b788e
A
1577 bgp_pbr_update_entry(peer->bgp, p, info, AFI_IP, safi, false);
1578 return;
f7df1907 1579 }
529efa23 1580
2ad4f093 1581 memset(&api, 0, sizeof(api));
568e10ca 1582 api.vrf_id = bgp->vrf_id;
2ad4f093
RW
1583 api.type = ZEBRA_ROUTE_BGP;
1584 api.safi = safi;
1585 api.prefix = *p;
d62a17ae 1586
1276ce38
PG
1587 if (info->attr->rmap_table_id) {
1588 SET_FLAG(api.message, ZAPI_MESSAGE_TABLEID);
1589 api.tableid = info->attr->rmap_table_id;
1590 }
1591
88493076 1592 /* If the route's source is EVPN, flag as such. */
1593 if (is_route_parent_evpn(info))
90264d64 1594 SET_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE);
01740ff4 1595
2dbe669b
DA
1596 if (bgp_debug_zebra(p))
1597 zlog_debug("Tx route delete VRF %u %pFX", bgp->vrf_id,
1598 &api.prefix);
d62a17ae 1599
2ad4f093 1600 zclient_route_send(ZEBRA_ROUTE_DELETE, zclient, &api);
718e3744 1601}
56c1f7d8 1602
c163f297
DS
1603/* Withdraw all entries in a BGP instances RIB table from Zebra */
1604void bgp_zebra_withdraw_table_all_subtypes(struct bgp *bgp, afi_t afi, safi_t safi)
1605{
1606 struct bgp_dest *dest;
1607 struct bgp_table *table;
1608 struct bgp_path_info *pi;
1609
1610 if (!bgp_install_info_to_zebra(bgp))
1611 return;
1612
1613 table = bgp->rib[afi][safi];
1614 if (!table)
1615 return;
1616
1617 for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest)) {
1618 for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) {
1619 if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)
1620 && (pi->type == ZEBRA_ROUTE_BGP))
1621 bgp_zebra_withdraw(bgp_dest_get_prefix(dest),
1622 pi, bgp, safi);
1623 }
1624 }
1625}
1626
d7c0a89a
QY
1627struct bgp_redist *bgp_redist_lookup(struct bgp *bgp, afi_t afi, uint8_t type,
1628 unsigned short instance)
7c8ff89e 1629{
d62a17ae 1630 struct list *red_list;
1631 struct listnode *node;
1632 struct bgp_redist *red;
7c8ff89e 1633
d62a17ae 1634 red_list = bgp->redist[afi][type];
1635 if (!red_list)
1636 return (NULL);
7c8ff89e 1637
d62a17ae 1638 for (ALL_LIST_ELEMENTS_RO(red_list, node, red))
1639 if (red->instance == instance)
1640 return red;
7c8ff89e 1641
d62a17ae 1642 return NULL;
7c8ff89e
DS
1643}
1644
d7c0a89a
QY
1645struct bgp_redist *bgp_redist_add(struct bgp *bgp, afi_t afi, uint8_t type,
1646 unsigned short instance)
7c8ff89e 1647{
d62a17ae 1648 struct list *red_list;
1649 struct bgp_redist *red;
7c8ff89e 1650
d62a17ae 1651 red = bgp_redist_lookup(bgp, afi, type, instance);
1652 if (red)
1653 return red;
7c8ff89e 1654
d62a17ae 1655 if (!bgp->redist[afi][type])
1656 bgp->redist[afi][type] = list_new();
7c8ff89e 1657
d62a17ae 1658 red_list = bgp->redist[afi][type];
9f5dc319 1659 red = XCALLOC(MTYPE_BGP_REDIST, sizeof(struct bgp_redist));
d62a17ae 1660 red->instance = instance;
7c8ff89e 1661
d62a17ae 1662 listnode_add(red_list, red);
7c8ff89e 1663
d62a17ae 1664 return red;
7c8ff89e
DS
1665}
1666
d7c0a89a
QY
1667static void bgp_redist_del(struct bgp *bgp, afi_t afi, uint8_t type,
1668 unsigned short instance)
7c8ff89e 1669{
d62a17ae 1670 struct bgp_redist *red;
1671
1672 red = bgp_redist_lookup(bgp, afi, type, instance);
1673
1674 if (red) {
1675 listnode_delete(bgp->redist[afi][type], red);
1676 XFREE(MTYPE_BGP_REDIST, red);
acdf5e25 1677 if (!bgp->redist[afi][type]->count)
6a154c88 1678 list_delete(&bgp->redist[afi][type]);
d62a17ae 1679 }
7c8ff89e 1680}
6b0655a2 1681
718e3744 1682/* Other routes redistribution into BGP. */
d7c0a89a 1683int bgp_redistribute_set(struct bgp *bgp, afi_t afi, int type,
e923dd62 1684 unsigned short instance, bool changed)
718e3744 1685{
e923dd62 1686 /* If redistribute options are changed call
1687 * bgp_redistribute_unreg() to reset the option and withdraw
1688 * the routes
1689 */
1690 if (changed)
1691 bgp_redistribute_unreg(bgp, afi, type, instance);
718e3744 1692
d62a17ae 1693 /* Return if already redistribute flag is set. */
1694 if (instance) {
1695 if (redist_check_instance(&zclient->mi_redist[afi][type],
1696 instance))
1697 return CMD_WARNING;
718e3744 1698
d62a17ae 1699 redist_add_instance(&zclient->mi_redist[afi][type], instance);
1700 } else {
1701 if (vrf_bitmap_check(zclient->redist[afi][type], bgp->vrf_id))
1702 return CMD_WARNING;
7076bb2f 1703
49e5a4a0 1704#ifdef ENABLE_BGP_VNC
f920dd6d 1705 if (EVPN_ENABLED(bgp) && type == ZEBRA_ROUTE_VNC_DIRECT) {
d62a17ae 1706 vnc_export_bgp_enable(
1707 bgp, afi); /* only enables if mode bits cfg'd */
1708 }
65efcfce
LB
1709#endif
1710
d62a17ae 1711 vrf_bitmap_set(zclient->redist[afi][type], bgp->vrf_id);
1712 }
718e3744 1713
ea12cf11
DS
1714 /*
1715 * Don't try to register if we're not connected to Zebra or Zebra
1716 * doesn't know of this instance.
1717 *
1718 * When we come up later well resend if needed.
d62a17ae 1719 */
1720 if (!bgp_install_info_to_zebra(bgp))
ea12cf11 1721 return CMD_SUCCESS;
a39275d7 1722
d62a17ae 1723 if (BGP_DEBUG(zebra, ZEBRA))
1724 zlog_debug("Tx redistribute add VRF %u afi %d %s %d",
1725 bgp->vrf_id, afi, zebra_route_string(type),
1726 instance);
518f0eb1 1727
d62a17ae 1728 /* Send distribute add message to zebra. */
1729 zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type,
1730 instance, bgp->vrf_id);
718e3744 1731
d62a17ae 1732 return CMD_SUCCESS;
718e3744 1733}
1734
d62a17ae 1735int bgp_redistribute_resend(struct bgp *bgp, afi_t afi, int type,
d7c0a89a 1736 unsigned short instance)
518f0eb1 1737{
d62a17ae 1738 /* Don't try to send if we're not connected to Zebra or Zebra doesn't
1739 * know of this instance.
1740 */
1741 if (!bgp_install_info_to_zebra(bgp))
1742 return -1;
1743
1744 if (BGP_DEBUG(zebra, ZEBRA))
1745 zlog_debug("Tx redistribute del/add VRF %u afi %d %s %d",
1746 bgp->vrf_id, afi, zebra_route_string(type),
1747 instance);
1748
1749 /* Send distribute add message to zebra. */
1750 zebra_redistribute_send(ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type,
1751 instance, bgp->vrf_id);
1752 zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type,
1753 instance, bgp->vrf_id);
1754
1755 return 0;
518f0eb1
DS
1756}
1757
718e3744 1758/* Redistribute with route-map specification. */
3dc339cd
DA
1759bool bgp_redistribute_rmap_set(struct bgp_redist *red, const char *name,
1760 struct route_map *route_map)
718e3744 1761{
d62a17ae 1762 if (red->rmap.name && (strcmp(red->rmap.name, name) == 0))
3dc339cd 1763 return false;
718e3744 1764
0a22ddfb 1765 XFREE(MTYPE_ROUTE_MAP_NAME, red->rmap.name);
b4897fa5 1766 /* Decrement the count for existing routemap and
1767 * increment the count for new route map.
1768 */
1769 route_map_counter_decrement(red->rmap.map);
d62a17ae 1770 red->rmap.name = XSTRDUP(MTYPE_ROUTE_MAP_NAME, name);
1de27621 1771 red->rmap.map = route_map;
b4897fa5 1772 route_map_counter_increment(red->rmap.map);
718e3744 1773
3dc339cd 1774 return true;
718e3744 1775}
1776
1777/* Redistribute with metric specification. */
3dc339cd
DA
1778bool bgp_redistribute_metric_set(struct bgp *bgp, struct bgp_redist *red,
1779 afi_t afi, int type, uint32_t metric)
718e3744 1780{
9bcb3eef 1781 struct bgp_dest *dest;
40381db7 1782 struct bgp_path_info *pi;
d62a17ae 1783
1784 if (red->redist_metric_flag && red->redist_metric == metric)
3dc339cd 1785 return false;
d62a17ae 1786
1787 red->redist_metric_flag = 1;
1788 red->redist_metric = metric;
1789
9bcb3eef
DS
1790 for (dest = bgp_table_top(bgp->rib[afi][SAFI_UNICAST]); dest;
1791 dest = bgp_route_next(dest)) {
1792 for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) {
40381db7
DS
1793 if (pi->sub_type == BGP_ROUTE_REDISTRIBUTE
1794 && pi->type == type
1795 && pi->instance == red->instance) {
d62a17ae 1796 struct attr *old_attr;
1797 struct attr new_attr;
1798
6f4f49b2 1799 new_attr = *pi->attr;
d62a17ae 1800 new_attr.med = red->redist_metric;
40381db7
DS
1801 old_attr = pi->attr;
1802 pi->attr = bgp_attr_intern(&new_attr);
d62a17ae 1803 bgp_attr_unintern(&old_attr);
1804
9bcb3eef 1805 bgp_path_info_set_flag(dest, pi,
18ee8310 1806 BGP_PATH_ATTR_CHANGED);
9bcb3eef 1807 bgp_process(bgp, dest, afi, SAFI_UNICAST);
d62a17ae 1808 }
1809 }
1810 }
1811
3dc339cd 1812 return true;
718e3744 1813}
1814
1815/* Unset redistribution. */
d62a17ae 1816int bgp_redistribute_unreg(struct bgp *bgp, afi_t afi, int type,
d7c0a89a 1817 unsigned short instance)
718e3744 1818{
d62a17ae 1819 struct bgp_redist *red;
1820
1821 red = bgp_redist_lookup(bgp, afi, type, instance);
1822 if (!red)
1823 return CMD_SUCCESS;
1824
1825 /* Return if zebra connection is disabled. */
1826 if (instance) {
1827 if (!redist_check_instance(&zclient->mi_redist[afi][type],
1828 instance))
1829 return CMD_WARNING;
1830 redist_del_instance(&zclient->mi_redist[afi][type], instance);
1831 } else {
1832 if (!vrf_bitmap_check(zclient->redist[afi][type], bgp->vrf_id))
1833 return CMD_WARNING;
1834 vrf_bitmap_unset(zclient->redist[afi][type], bgp->vrf_id);
1835 }
718e3744 1836
d62a17ae 1837 if (bgp_install_info_to_zebra(bgp)) {
1838 /* Send distribute delete message to zebra. */
1839 if (BGP_DEBUG(zebra, ZEBRA))
1840 zlog_debug("Tx redistribute del VRF %u afi %d %s %d",
1841 bgp->vrf_id, afi, zebra_route_string(type),
1842 instance);
1843 zebra_redistribute_send(ZEBRA_REDISTRIBUTE_DELETE, zclient, afi,
1844 type, instance, bgp->vrf_id);
1845 }
1846
1847 /* Withdraw redistributed routes from current BGP's routing table. */
1848 bgp_redistribute_withdraw(bgp, afi, type, instance);
1849
1850 return CMD_SUCCESS;
718e3744 1851}
1852
6aeb9e78 1853/* Unset redistribution. */
d62a17ae 1854int bgp_redistribute_unset(struct bgp *bgp, afi_t afi, int type,
d7c0a89a 1855 unsigned short instance)
6aeb9e78 1856{
d62a17ae 1857 struct bgp_redist *red;
6aeb9e78 1858
ddb5b488
PZ
1859/*
1860 * vnc and vpn->vrf checks must be before red check because
1861 * they operate within bgpd irrespective of zebra connection
1862 * status. red lookup fails if there is no zebra connection.
1863 */
49e5a4a0 1864#ifdef ENABLE_BGP_VNC
f920dd6d 1865 if (EVPN_ENABLED(bgp) && type == ZEBRA_ROUTE_VNC_DIRECT) {
ddb5b488
PZ
1866 vnc_export_bgp_disable(bgp, afi);
1867 }
1868#endif
ddb5b488 1869
d62a17ae 1870 red = bgp_redist_lookup(bgp, afi, type, instance);
1871 if (!red)
1872 return CMD_SUCCESS;
6aeb9e78 1873
d62a17ae 1874 bgp_redistribute_unreg(bgp, afi, type, instance);
6aeb9e78 1875
d62a17ae 1876 /* Unset route-map. */
0a22ddfb 1877 XFREE(MTYPE_ROUTE_MAP_NAME, red->rmap.name);
b4897fa5 1878 route_map_counter_decrement(red->rmap.map);
d62a17ae 1879 red->rmap.map = NULL;
6aeb9e78 1880
d62a17ae 1881 /* Unset metric. */
1882 red->redist_metric_flag = 0;
1883 red->redist_metric = 0;
6aeb9e78 1884
d62a17ae 1885 bgp_redist_del(bgp, afi, type, instance);
6aeb9e78 1886
d62a17ae 1887 return CMD_SUCCESS;
6aeb9e78
DS
1888}
1889
fc2408ec
DS
1890void bgp_redistribute_redo(struct bgp *bgp)
1891{
1892 afi_t afi;
1893 int i;
1894 struct list *red_list;
1895 struct listnode *node;
1896 struct bgp_redist *red;
1897
1898 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
1899 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
1900
1901 red_list = bgp->redist[afi][i];
1902 if (!red_list)
1903 continue;
1904
1905 for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) {
1906 bgp_redistribute_resend(bgp, afi, i,
1907 red->instance);
1908 }
1909 }
1910 }
1911}
1912
401d56cc
DS
1913/* Unset redistribute vrf bitmap during triggers like
1914 restart networking or delete VRFs */
1915void bgp_unset_redist_vrf_bitmaps(struct bgp *bgp, vrf_id_t old_vrf_id)
eb117f29 1916{
d62a17ae 1917 int i;
1918 afi_t afi;
1919
1920 for (afi = AFI_IP; afi < AFI_MAX; afi++)
1921 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
7e20406f 1922 if (vrf_bitmap_check(zclient->redist[afi][i],
401d56cc 1923 old_vrf_id))
d62a17ae 1924 vrf_bitmap_unset(zclient->redist[afi][i],
1925 old_vrf_id);
d62a17ae 1926 return;
eb117f29
SK
1927}
1928
d62a17ae 1929void bgp_zclient_reset(void)
718e3744 1930{
d62a17ae 1931 zclient_reset(zclient);
718e3744 1932}
1933
ad4cbda1 1934/* Register this instance with Zebra. Invoked upon connect (for
1935 * default instance) and when other VRFs are learnt (or created and
1936 * already learnt).
1937 */
d62a17ae 1938void bgp_zebra_instance_register(struct bgp *bgp)
ad4cbda1 1939{
d62a17ae 1940 /* Don't try to register if we're not connected to Zebra */
1941 if (!zclient || zclient->sock < 0)
1942 return;
ad4cbda1 1943
d62a17ae 1944 if (BGP_DEBUG(zebra, ZEBRA))
1945 zlog_debug("Registering VRF %u", bgp->vrf_id);
ad4cbda1 1946
d62a17ae 1947 /* Register for router-id, interfaces, redistributed routes. */
1948 zclient_send_reg_requests(zclient, bgp->vrf_id);
7724c0a1 1949
e2f3a930
T
1950 /* For EVPN instance, register to learn about VNIs, if appropriate. */
1951 if (bgp->advertise_all_vni)
d62a17ae 1952 bgp_zebra_advertise_all_vni(bgp, 1);
1ee0a2df
DS
1953
1954 bgp_nht_register_nexthops(bgp);
ad4cbda1 1955}
1956
1957/* Deregister this instance with Zebra. Invoked upon the instance
1958 * being deleted (default or VRF) and it is already registered.
1959 */
d62a17ae 1960void bgp_zebra_instance_deregister(struct bgp *bgp)
ad4cbda1 1961{
d62a17ae 1962 /* Don't try to deregister if we're not connected to Zebra */
1963 if (zclient->sock < 0)
1964 return;
ad4cbda1 1965
d62a17ae 1966 if (BGP_DEBUG(zebra, ZEBRA))
1967 zlog_debug("Deregistering VRF %u", bgp->vrf_id);
ad4cbda1 1968
e2f3a930
T
1969 /* For EVPN instance, unregister learning about VNIs, if appropriate. */
1970 if (bgp->advertise_all_vni)
d62a17ae 1971 bgp_zebra_advertise_all_vni(bgp, 0);
7724c0a1 1972
d62a17ae 1973 /* Deregister for router-id, interfaces, redistributed routes. */
1974 zclient_send_dereg_requests(zclient, bgp->vrf_id);
ad4cbda1 1975}
1976
d62a17ae 1977void bgp_zebra_initiate_radv(struct bgp *bgp, struct peer *peer)
4a04e5f7 1978{
d62a17ae 1979 int ra_interval = BGP_UNNUM_DEFAULT_RA_INTERVAL;
5c81b96a 1980
d62a17ae 1981 /* Don't try to initiate if we're not connected to Zebra */
1982 if (zclient->sock < 0)
1983 return;
4a04e5f7 1984
d62a17ae 1985 if (BGP_DEBUG(zebra, ZEBRA))
1986 zlog_debug("%u: Initiating RA for peer %s", bgp->vrf_id,
1987 peer->host);
4a04e5f7 1988
b3a3290e
DS
1989 /*
1990 * If unnumbered peer (peer->ifp) call thru zapi to start RAs.
1991 * If we don't have an ifp pointer, call function to find the
1992 * ifps for a numbered enhe peer to turn RAs on.
1993 */
1994 peer->ifp ? zclient_send_interface_radv_req(zclient, bgp->vrf_id,
1995 peer->ifp, 1, ra_interval)
1996 : bgp_nht_reg_enhe_cap_intfs(peer);
4a04e5f7 1997}
1998
d62a17ae 1999void bgp_zebra_terminate_radv(struct bgp *bgp, struct peer *peer)
4a04e5f7 2000{
d62a17ae 2001 /* Don't try to terminate if we're not connected to Zebra */
2002 if (zclient->sock < 0)
2003 return;
4a04e5f7 2004
d62a17ae 2005 if (BGP_DEBUG(zebra, ZEBRA))
2006 zlog_debug("%u: Terminating RA for peer %s", bgp->vrf_id,
2007 peer->host);
4a04e5f7 2008
b3a3290e
DS
2009 /*
2010 * If unnumbered peer (peer->ifp) call thru zapi to stop RAs.
2011 * If we don't have an ifp pointer, call function to find the
2012 * ifps for a numbered enhe peer to turn RAs off.
2013 */
2014 peer->ifp ? zclient_send_interface_radv_req(zclient, bgp->vrf_id,
2015 peer->ifp, 0, 0)
2016 : bgp_nht_dereg_enhe_cap_intfs(peer);
4a04e5f7 2017}
2018
31310b25
MK
2019int bgp_zebra_advertise_subnet(struct bgp *bgp, int advertise, vni_t vni)
2020{
2021 struct stream *s = NULL;
2022
2023 /* Check socket. */
2024 if (!zclient || zclient->sock < 0)
2025 return 0;
2026
2027 /* Don't try to register if Zebra doesn't know of this instance. */
bb4ef1ae
DS
2028 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp)) {
2029 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
2030 zlog_debug(
2031 "%s: No zebra instance to talk to, cannot advertise subnet",
2032 __func__);
31310b25 2033 return 0;
bb4ef1ae 2034 }
31310b25
MK
2035
2036 s = zclient->obuf;
2037 stream_reset(s);
2038
2039 zclient_create_header(s, ZEBRA_ADVERTISE_SUBNET, bgp->vrf_id);
2040 stream_putc(s, advertise);
2041 stream_put3(s, vni);
2042 stream_putw_at(s, 0, stream_get_endp(s));
2043
2044 return zclient_send_message(zclient);
2045}
2046
a8016157
CS
2047int bgp_zebra_advertise_svi_macip(struct bgp *bgp, int advertise, vni_t vni)
2048{
2049 struct stream *s = NULL;
2050
2051 /* Check socket. */
2052 if (!zclient || zclient->sock < 0)
2053 return 0;
2054
2055 /* Don't try to register if Zebra doesn't know of this instance. */
2056 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
2057 return 0;
2058
2059 s = zclient->obuf;
2060 stream_reset(s);
2061
2062 zclient_create_header(s, ZEBRA_ADVERTISE_SVI_MACIP, bgp->vrf_id);
2063 stream_putc(s, advertise);
2064 stream_putl(s, vni);
2065 stream_putw_at(s, 0, stream_get_endp(s));
2066
2067 return zclient_send_message(zclient);
2068}
2069
1a98c087
MK
2070int bgp_zebra_advertise_gw_macip(struct bgp *bgp, int advertise, vni_t vni)
2071{
2072 struct stream *s = NULL;
2073
2074 /* Check socket. */
2075 if (!zclient || zclient->sock < 0)
2076 return 0;
2077
2078 /* Don't try to register if Zebra doesn't know of this instance. */
bb4ef1ae
DS
2079 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp)) {
2080 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
2081 zlog_debug(
2082 "%s: No zebra instance to talk to, not installing gw_macip",
2083 __func__);
1a98c087 2084 return 0;
bb4ef1ae 2085 }
1a98c087
MK
2086
2087 s = zclient->obuf;
2088 stream_reset(s);
2089
2090 zclient_create_header(s, ZEBRA_ADVERTISE_DEFAULT_GW, bgp->vrf_id);
2091 stream_putc(s, advertise);
cc6d5476 2092 stream_putl(s, vni);
1a98c087
MK
2093 stream_putw_at(s, 0, stream_get_endp(s));
2094
2095 return zclient_send_message(zclient);
2096}
2097
fd069644
DS
2098int bgp_zebra_vxlan_flood_control(struct bgp *bgp,
2099 enum vxlan_flood_control flood_ctrl)
2100{
2101 struct stream *s;
2102
2103 /* Check socket. */
2104 if (!zclient || zclient->sock < 0)
2105 return 0;
2106
2107 /* Don't try to register if Zebra doesn't know of this instance. */
bb4ef1ae
DS
2108 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp)) {
2109 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
2110 zlog_debug(
2111 "%s: No zebra instance to talk to, not installing all vni",
2112 __func__);
fd069644 2113 return 0;
bb4ef1ae 2114 }
fd069644
DS
2115
2116 s = zclient->obuf;
2117 stream_reset(s);
2118
2119 zclient_create_header(s, ZEBRA_VXLAN_FLOOD_CONTROL, bgp->vrf_id);
2120 stream_putc(s, flood_ctrl);
2121 stream_putw_at(s, 0, stream_get_endp(s));
2122
2123 return zclient_send_message(zclient);
2124}
2125
d62a17ae 2126int bgp_zebra_advertise_all_vni(struct bgp *bgp, int advertise)
7724c0a1 2127{
d62a17ae 2128 struct stream *s;
7724c0a1 2129
d62a17ae 2130 /* Check socket. */
2131 if (!zclient || zclient->sock < 0)
2132 return 0;
7724c0a1 2133
d62a17ae 2134 /* Don't try to register if Zebra doesn't know of this instance. */
2135 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
2136 return 0;
7724c0a1 2137
d62a17ae 2138 s = zclient->obuf;
2139 stream_reset(s);
7724c0a1 2140
d62a17ae 2141 zclient_create_header(s, ZEBRA_ADVERTISE_ALL_VNI, bgp->vrf_id);
2142 stream_putc(s, advertise);
fbac9605
DS
2143 /* Also inform current BUM handling setting. This is really
2144 * relevant only when 'advertise' is set.
2145 */
fd069644 2146 stream_putc(s, bgp->vxlan_flood_ctrl);
d62a17ae 2147 stream_putw_at(s, 0, stream_get_endp(s));
7724c0a1 2148
d62a17ae 2149 return zclient_send_message(zclient);
7724c0a1 2150}
2151
0b9d9cd0
CS
2152int bgp_zebra_dup_addr_detection(struct bgp *bgp)
2153{
2154 struct stream *s;
2155
2156 /* Check socket. */
2157 if (!zclient || zclient->sock < 0)
2158 return 0;
2159
2160 /* Don't try to register if Zebra doesn't know of this instance. */
2161 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
2162 return 0;
2163
2164 if (BGP_DEBUG(zebra, ZEBRA))
2165 zlog_debug("dup addr detect %s max_moves %u time %u freeze %s freeze_time %u",
2166 bgp->evpn_info->dup_addr_detect ?
2167 "enable" : "disable",
2168 bgp->evpn_info->dad_max_moves,
2169 bgp->evpn_info->dad_time,
2170 bgp->evpn_info->dad_freeze ?
2171 "enable" : "disable",
2172 bgp->evpn_info->dad_freeze_time);
2173
2174 s = zclient->obuf;
2175 stream_reset(s);
2176 zclient_create_header(s, ZEBRA_DUPLICATE_ADDR_DETECTION,
2177 bgp->vrf_id);
2178 stream_putl(s, bgp->evpn_info->dup_addr_detect);
2179 stream_putl(s, bgp->evpn_info->dad_time);
2180 stream_putl(s, bgp->evpn_info->dad_max_moves);
2181 stream_putl(s, bgp->evpn_info->dad_freeze);
2182 stream_putl(s, bgp->evpn_info->dad_freeze_time);
2183 stream_putw_at(s, 0, stream_get_endp(s));
2184
2185 return zclient_send_message(zclient);
2186}
2187
121f9dee 2188static int rule_notify_owner(ZAPI_CALLBACK_ARGS)
30d50e6d
PG
2189{
2190 uint32_t seqno, priority, unique;
2191 enum zapi_rule_notify_owner note;
2192 struct bgp_pbr_action *bgp_pbra;
ffee150e 2193 struct bgp_pbr_rule *bgp_pbr = NULL;
58a1d249 2194 char ifname[INTERFACE_NAMSIZ + 1];
30d50e6d
PG
2195
2196 if (!zapi_rule_notify_decode(zclient->ibuf, &seqno, &priority, &unique,
58a1d249 2197 ifname, &note))
30d50e6d
PG
2198 return -1;
2199
70eabd12 2200 bgp_pbra = bgp_pbr_action_rule_lookup(vrf_id, unique);
30d50e6d 2201 if (!bgp_pbra) {
ffee150e
PG
2202 /* look in bgp pbr rule */
2203 bgp_pbr = bgp_pbr_rule_lookup(vrf_id, unique);
2204 if (!bgp_pbr && note != ZAPI_RULE_REMOVED) {
2205 if (BGP_DEBUG(zebra, ZEBRA))
2206 zlog_debug("%s: Fail to look BGP rule (%u)",
15569c58 2207 __func__, unique);
ffee150e
PG
2208 return 0;
2209 }
30d50e6d
PG
2210 }
2211
2212 switch (note) {
2213 case ZAPI_RULE_FAIL_INSTALL:
2214 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2215 zlog_debug("%s: Received RULE_FAIL_INSTALL", __func__);
ffee150e
PG
2216 if (bgp_pbra) {
2217 bgp_pbra->installed = false;
2218 bgp_pbra->install_in_progress = false;
2219 } else {
2220 bgp_pbr->installed = false;
2221 bgp_pbr->install_in_progress = false;
2222 }
30d50e6d
PG
2223 break;
2224 case ZAPI_RULE_INSTALLED:
ffee150e
PG
2225 if (bgp_pbra) {
2226 bgp_pbra->installed = true;
2227 bgp_pbra->install_in_progress = false;
2228 } else {
ce3c0614
PG
2229 struct bgp_path_info *path;
2230 struct bgp_path_info_extra *extra;
2231
ffee150e
PG
2232 bgp_pbr->installed = true;
2233 bgp_pbr->install_in_progress = false;
2234 bgp_pbr->action->refcnt++;
ce3c0614
PG
2235 /* link bgp_info to bgp_pbr */
2236 path = (struct bgp_path_info *)bgp_pbr->path;
2237 extra = bgp_path_info_extra_get(path);
f5925234
PG
2238 listnode_add_force(&extra->bgp_fs_iprule,
2239 bgp_pbr);
ffee150e 2240 }
30d50e6d 2241 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2242 zlog_debug("%s: Received RULE_INSTALLED", __func__);
30d50e6d 2243 break;
f18a08f5 2244 case ZAPI_RULE_FAIL_REMOVE:
30d50e6d
PG
2245 case ZAPI_RULE_REMOVED:
2246 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2247 zlog_debug("%s: Received RULE REMOVED", __func__);
30d50e6d
PG
2248 break;
2249 }
2250
2251 return 0;
2252}
2253
121f9dee 2254static int ipset_notify_owner(ZAPI_CALLBACK_ARGS)
30d50e6d
PG
2255{
2256 uint32_t unique;
2257 enum zapi_ipset_notify_owner note;
2258 struct bgp_pbr_match *bgp_pbim;
2259
2260 if (!zapi_ipset_notify_decode(zclient->ibuf,
2261 &unique,
2262 &note))
2263 return -1;
2264
2265 bgp_pbim = bgp_pbr_match_ipset_lookup(vrf_id, unique);
2266 if (!bgp_pbim) {
2267 if (BGP_DEBUG(zebra, ZEBRA))
88055124 2268 zlog_debug("%s: Fail to look BGP match ( %u, ID %u)",
15569c58 2269 __func__, note, unique);
30d50e6d
PG
2270 return 0;
2271 }
2272
2273 switch (note) {
2274 case ZAPI_IPSET_FAIL_INSTALL:
2275 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2276 zlog_debug("%s: Received IPSET_FAIL_INSTALL", __func__);
30d50e6d
PG
2277 bgp_pbim->installed = false;
2278 bgp_pbim->install_in_progress = false;
2279 break;
2280 case ZAPI_IPSET_INSTALLED:
2281 bgp_pbim->installed = true;
2282 bgp_pbim->install_in_progress = false;
2283 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2284 zlog_debug("%s: Received IPSET_INSTALLED", __func__);
30d50e6d 2285 break;
f18a08f5 2286 case ZAPI_IPSET_FAIL_REMOVE:
30d50e6d
PG
2287 case ZAPI_IPSET_REMOVED:
2288 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2289 zlog_debug("%s: Received IPSET REMOVED", __func__);
30d50e6d
PG
2290 break;
2291 }
2292
2293 return 0;
2294}
2295
121f9dee 2296static int ipset_entry_notify_owner(ZAPI_CALLBACK_ARGS)
30d50e6d
PG
2297{
2298 uint32_t unique;
2299 char ipset_name[ZEBRA_IPSET_NAME_SIZE];
2300 enum zapi_ipset_entry_notify_owner note;
2301 struct bgp_pbr_match_entry *bgp_pbime;
2302
2303 if (!zapi_ipset_entry_notify_decode(
2304 zclient->ibuf,
2305 &unique,
2306 ipset_name,
2307 &note))
2308 return -1;
2309 bgp_pbime = bgp_pbr_match_ipset_entry_lookup(vrf_id,
2310 ipset_name,
2311 unique);
2312 if (!bgp_pbime) {
2313 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
2314 zlog_debug(
2315 "%s: Fail to look BGP match entry (%u, ID %u)",
2316 __func__, note, unique);
30d50e6d
PG
2317 return 0;
2318 }
2319
2320 switch (note) {
2321 case ZAPI_IPSET_ENTRY_FAIL_INSTALL:
2322 if (BGP_DEBUG(zebra, ZEBRA))
2323 zlog_debug("%s: Received IPSET_ENTRY_FAIL_INSTALL",
15569c58 2324 __func__);
30d50e6d
PG
2325 bgp_pbime->installed = false;
2326 bgp_pbime->install_in_progress = false;
2327 break;
2328 case ZAPI_IPSET_ENTRY_INSTALLED:
b588b642 2329 {
9b6d8fcf 2330 struct bgp_path_info *path;
4b7e6066
DS
2331 struct bgp_path_info_extra *extra;
2332
2333 bgp_pbime->installed = true;
2334 bgp_pbime->install_in_progress = false;
2335 if (BGP_DEBUG(zebra, ZEBRA))
2336 zlog_debug("%s: Received IPSET_ENTRY_INSTALLED",
15569c58 2337 __func__);
9b6d8fcf
DS
2338 /* link bgp_path_info to bpme */
2339 path = (struct bgp_path_info *)bgp_pbime->path;
2340 extra = bgp_path_info_extra_get(path);
f5925234 2341 listnode_add_force(&extra->bgp_fs_pbr, bgp_pbime);
b588b642 2342 }
30d50e6d 2343 break;
f18a08f5 2344 case ZAPI_IPSET_ENTRY_FAIL_REMOVE:
30d50e6d
PG
2345 case ZAPI_IPSET_ENTRY_REMOVED:
2346 if (BGP_DEBUG(zebra, ZEBRA))
2347 zlog_debug("%s: Received IPSET_ENTRY_REMOVED",
15569c58 2348 __func__);
30d50e6d
PG
2349 break;
2350 }
2351 return 0;
2352}
2353
121f9dee 2354static int iptable_notify_owner(ZAPI_CALLBACK_ARGS)
c16a0a62
PG
2355{
2356 uint32_t unique;
2357 enum zapi_iptable_notify_owner note;
2358 struct bgp_pbr_match *bgpm;
2359
2360 if (!zapi_iptable_notify_decode(
2361 zclient->ibuf,
2362 &unique,
2363 &note))
2364 return -1;
2365 bgpm = bgp_pbr_match_iptable_lookup(vrf_id, unique);
2366 if (!bgpm) {
2367 if (BGP_DEBUG(zebra, ZEBRA))
82e194ed 2368 zlog_debug("%s: Fail to look BGP iptable (%u %u)",
15569c58 2369 __func__, note, unique);
c16a0a62
PG
2370 return 0;
2371 }
2372 switch (note) {
2373 case ZAPI_IPTABLE_FAIL_INSTALL:
2374 if (BGP_DEBUG(zebra, ZEBRA))
2375 zlog_debug("%s: Received IPTABLE_FAIL_INSTALL",
15569c58 2376 __func__);
c16a0a62
PG
2377 bgpm->installed_in_iptable = false;
2378 bgpm->install_iptable_in_progress = false;
2379 break;
2380 case ZAPI_IPTABLE_INSTALLED:
2381 bgpm->installed_in_iptable = true;
2382 bgpm->install_iptable_in_progress = false;
2383 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2384 zlog_debug("%s: Received IPTABLE_INSTALLED", __func__);
a6b07429 2385 bgpm->action->refcnt++;
c16a0a62 2386 break;
f18a08f5 2387 case ZAPI_IPTABLE_FAIL_REMOVE:
c16a0a62
PG
2388 case ZAPI_IPTABLE_REMOVED:
2389 if (BGP_DEBUG(zebra, ZEBRA))
15569c58 2390 zlog_debug("%s: Received IPTABLE REMOVED", __func__);
c16a0a62
PG
2391 break;
2392 }
2393 return 0;
2394}
2395
a77e2f4b
S
2396/* Process route notification messages from RIB */
2397static int bgp_zebra_route_notify_owner(int command, struct zclient *zclient,
2398 zebra_size_t length, vrf_id_t vrf_id)
2399{
2400 struct prefix p;
2401 enum zapi_route_notify_owner note;
2402 uint32_t table_id;
a77e2f4b
S
2403 afi_t afi;
2404 safi_t safi;
2405 struct bgp_dest *dest;
2406 struct bgp *bgp;
2407 struct bgp_path_info *pi, *new_select;
2408
2409 if (!zapi_route_notify_decode(zclient->ibuf, &p, &table_id, &note,
2410 &afi, &safi)) {
2411 zlog_err("%s : error in msg decode", __PRETTY_FUNCTION__);
2412 return -1;
2413 }
2414
2415 /* Get the bgp instance */
2416 bgp = bgp_lookup_by_vrf_id(vrf_id);
2417 if (!bgp) {
2418 flog_err(EC_BGP_INVALID_BGP_INSTANCE,
2419 "%s : bgp instance not found vrf %d",
2420 __PRETTY_FUNCTION__, vrf_id);
2421 return -1;
2422 }
2423
a77e2f4b
S
2424 /* Find the bgp route node */
2425 dest = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi, &p,
2426 &bgp->vrf_prd);
2427 if (!dest)
2428 return -1;
2429
2430 bgp_dest_unlock_node(dest);
2431
2432 switch (note) {
2433 case ZAPI_ROUTE_INSTALLED:
2434 new_select = NULL;
2435 /* Clear the flags so that route can be processed */
2436 if (CHECK_FLAG(dest->flags,
2437 BGP_NODE_FIB_INSTALL_PENDING)) {
2438 UNSET_FLAG(dest->flags,
2439 BGP_NODE_FIB_INSTALL_PENDING);
2440 SET_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED);
2441 if (BGP_DEBUG(zebra, ZEBRA))
1a3519b6 2442 zlog_debug("route %pRN : INSTALLED", dest);
a77e2f4b
S
2443 /* Find the best route */
2444 for (pi = dest->info; pi; pi = pi->next) {
2445 /* Process aggregate route */
2446 bgp_aggregate_increment(bgp, &p, pi,
2447 afi, safi);
2448 if (CHECK_FLAG(pi->flags,
2449 BGP_PATH_SELECTED))
2450 new_select = pi;
2451 }
2452 /* Advertise the route */
2453 if (new_select)
2454 group_announce_route(bgp, afi, safi,
2455 dest, new_select);
2456 else {
2457 flog_err(EC_BGP_INVALID_ROUTE,
1a3519b6
DS
2458 "selected route %pRN not found",
2459 dest);
a77e2f4b
S
2460 return -1;
2461 }
2462 }
2463 break;
2464 case ZAPI_ROUTE_REMOVED:
2465 /* Route deleted from dataplane, reset the installed flag
2466 * so that route can be reinstalled when client sends
2467 * route add later
2468 */
2469 UNSET_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED);
1a3519b6
DS
2470 if (BGP_DEBUG(zebra, ZEBRA))
2471 zlog_debug("route %pRN: Removed from Fib", dest);
a77e2f4b
S
2472 break;
2473 case ZAPI_ROUTE_FAIL_INSTALL:
1a3519b6
DS
2474 if (BGP_DEBUG(zebra, ZEBRA))
2475 zlog_debug("route: %pRN Failed to Install into Fib",
2476 dest);
a77e2f4b
S
2477 /* Error will be logged by zebra module */
2478 break;
2479 case ZAPI_ROUTE_BETTER_ADMIN_WON:
1a3519b6
DS
2480 if (BGP_DEBUG(zebra, ZEBRA))
2481 zlog_debug("route: %pRN removed due to better admin won",
2482 dest);
a77e2f4b
S
2483 /* No action required */
2484 break;
2485 case ZAPI_ROUTE_REMOVE_FAIL:
1a3519b6
DS
2486 zlog_warn("%s: Route %pRN failure to remove",
2487 __func__, dest);
a77e2f4b
S
2488 break;
2489 }
2490 return 0;
2491}
2492
6cfe5d15
PG
2493/* this function is used to forge ip rule,
2494 * - either for iptable/ipset using fwmark id
121f9dee 2495 * - or for sample ip rule cmd
6cfe5d15 2496 */
30d50e6d 2497static void bgp_encode_pbr_rule_action(struct stream *s,
6cfe5d15
PG
2498 struct bgp_pbr_action *pbra,
2499 struct bgp_pbr_rule *pbr)
30d50e6d 2500{
6cfe5d15 2501 struct prefix pfx;
f01e580f 2502 uint8_t fam = AF_INET;
e95666cb 2503 char ifname[INTERFACE_NAMSIZ];
30d50e6d 2504
9f1f03ec 2505 if (pbra->nh.type == NEXTHOP_TYPE_IPV6)
f01e580f 2506 fam = AF_INET6;
30d50e6d 2507 stream_putl(s, 0); /* seqno unused */
8112a7a0
PG
2508 if (pbr)
2509 stream_putl(s, pbr->priority);
2510 else
2511 stream_putl(s, 0);
2512 /* ruleno unused - priority change
2513 * ruleno permits distinguishing various FS PBR entries
2514 * - FS PBR entries based on ipset/iptables
2515 * - FS PBR entries based on iprule
2516 * the latter may contain default routing information injected by FS
2517 */
6cfe5d15
PG
2518 if (pbr)
2519 stream_putl(s, pbr->unique);
2520 else
2521 stream_putl(s, pbra->unique);
2522 if (pbr && pbr->flags & MATCH_IP_SRC_SET)
2523 memcpy(&pfx, &(pbr->src), sizeof(struct prefix));
2524 else {
2525 memset(&pfx, 0, sizeof(pfx));
f01e580f 2526 pfx.family = fam;
6cfe5d15
PG
2527 }
2528 stream_putc(s, pfx.family);
2529 stream_putc(s, pfx.prefixlen);
2530 stream_put(s, &pfx.u.prefix, prefix_blen(&pfx));
30d50e6d
PG
2531
2532 stream_putw(s, 0); /* src port */
2533
6cfe5d15
PG
2534 if (pbr && pbr->flags & MATCH_IP_DST_SET)
2535 memcpy(&pfx, &(pbr->dst), sizeof(struct prefix));
2536 else {
2537 memset(&pfx, 0, sizeof(pfx));
f01e580f 2538 pfx.family = fam;
6cfe5d15
PG
2539 }
2540 stream_putc(s, pfx.family);
2541 stream_putc(s, pfx.prefixlen);
2542 stream_put(s, &pfx.u.prefix, prefix_blen(&pfx));
30d50e6d
PG
2543
2544 stream_putw(s, 0); /* dst port */
e95666cb 2545 stream_putc(s, 0); /* dsfield */
6cfe5d15
PG
2546 /* if pbr present, fwmark is not used */
2547 if (pbr)
2548 stream_putl(s, 0);
2549 else
2550 stream_putl(s, pbra->fwmark); /* fwmark */
30d50e6d
PG
2551
2552 stream_putl(s, pbra->table_id);
2553
e95666cb
DS
2554 memset(ifname, 0, sizeof(ifname));
2555 stream_put(s, ifname, INTERFACE_NAMSIZ); /* ifname unused */
30d50e6d
PG
2556}
2557
2558static void bgp_encode_pbr_ipset_match(struct stream *s,
2559 struct bgp_pbr_match *pbim)
2560{
2561 stream_putl(s, pbim->unique);
2562 stream_putl(s, pbim->type);
a60b7031 2563 stream_putc(s, pbim->family);
30d50e6d
PG
2564 stream_put(s, pbim->ipset_name,
2565 ZEBRA_IPSET_NAME_SIZE);
30d50e6d
PG
2566}
2567
2568static void bgp_encode_pbr_ipset_entry_match(struct stream *s,
2569 struct bgp_pbr_match_entry *pbime)
2570{
2571 stream_putl(s, pbime->unique);
2572 /* check that back pointer is not null */
2573 stream_put(s, pbime->backpointer->ipset_name,
2574 ZEBRA_IPSET_NAME_SIZE);
2575
2576 stream_putc(s, pbime->src.family);
2577 stream_putc(s, pbime->src.prefixlen);
2578 stream_put(s, &pbime->src.u.prefix, prefix_blen(&pbime->src));
2579
2580 stream_putc(s, pbime->dst.family);
2581 stream_putc(s, pbime->dst.prefixlen);
2582 stream_put(s, &pbime->dst.u.prefix, prefix_blen(&pbime->dst));
f730e566
PG
2583
2584 stream_putw(s, pbime->src_port_min);
2585 stream_putw(s, pbime->src_port_max);
2586 stream_putw(s, pbime->dst_port_min);
2587 stream_putw(s, pbime->dst_port_max);
2588 stream_putc(s, pbime->proto);
30d50e6d
PG
2589}
2590
c16a0a62
PG
2591static void bgp_encode_pbr_iptable_match(struct stream *s,
2592 struct bgp_pbr_action *bpa,
2593 struct bgp_pbr_match *pbm)
2594{
2595 stream_putl(s, pbm->unique2);
2596
2597 stream_putl(s, pbm->type);
2598
2599 stream_putl(s, pbm->flags);
2600
2601 /* TODO: correlate with what is contained
2602 * into bgp_pbr_action.
2603 * currently only forward supported
2604 */
2605 if (bpa->nh.type == NEXTHOP_TYPE_BLACKHOLE)
2606 stream_putl(s, ZEBRA_IPTABLES_DROP);
2607 else
2608 stream_putl(s, ZEBRA_IPTABLES_FORWARD);
2609 stream_putl(s, bpa->fwmark);
2610 stream_put(s, pbm->ipset_name,
2611 ZEBRA_IPSET_NAME_SIZE);
a60b7031 2612 stream_putc(s, pbm->family);
83360720
PG
2613 stream_putw(s, pbm->pkt_len_min);
2614 stream_putw(s, pbm->pkt_len_max);
2da7d62e
PG
2615 stream_putw(s, pbm->tcp_flags);
2616 stream_putw(s, pbm->tcp_mask_flags);
4977bd6c 2617 stream_putc(s, pbm->dscp_value);
6f5617d8 2618 stream_putc(s, pbm->fragment);
f449d223 2619 stream_putc(s, pbm->protocol);
a60b7031 2620 stream_putw(s, pbm->flow_label);
c16a0a62
PG
2621}
2622
ad4cbda1 2623/* BGP has established connection with Zebra. */
d62a17ae 2624static void bgp_zebra_connected(struct zclient *zclient)
7076bb2f 2625{
d62a17ae 2626 struct bgp *bgp;
7076bb2f 2627
d62a17ae 2628 zclient_num_connects++; /* increment even if not responding */
afbb1c59 2629
d62a17ae 2630 /* At this point, we may or may not have BGP instances configured, but
2631 * we're only interested in the default VRF (others wouldn't have learnt
2632 * the VRF from Zebra yet.)
2633 */
2634 bgp = bgp_get_default();
2635 if (!bgp)
2636 return;
ad4cbda1 2637
d62a17ae 2638 bgp_zebra_instance_register(bgp);
ad4cbda1 2639
d62a17ae 2640 /* Send the client registration */
0945d5ed 2641 bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, bgp->vrf_id);
2376c3f2 2642
955bfd98 2643 /* tell label pool that zebra is connected */
e70e9f8e 2644 bgp_lp_event_zebra_up();
955bfd98 2645
d62a17ae 2646 /* TODO - What if we have peers and networks configured, do we have to
2647 * kick-start them?
2648 */
85ef4179 2649 BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer);
7076bb2f
FL
2650}
2651
c44ab6f1
AK
2652static int bgp_zebra_process_local_es_add(ZAPI_CALLBACK_ARGS)
2653{
2654 esi_t esi;
2655 struct bgp *bgp = NULL;
2656 struct stream *s = NULL;
2657 char buf[ESI_STR_LEN];
2658 struct in_addr originator_ip;
2659 uint8_t active;
74be8313 2660 uint8_t bypass;
74e2bd89 2661 uint16_t df_pref;
c44ab6f1
AK
2662
2663 bgp = bgp_lookup_by_vrf_id(vrf_id);
2664 if (!bgp)
2665 return 0;
2666
2667 s = zclient->ibuf;
2668 stream_get(&esi, s, sizeof(esi_t));
2669 originator_ip.s_addr = stream_get_ipv4(s);
2670 active = stream_getc(s);
74e2bd89 2671 df_pref = stream_getw(s);
74be8313 2672 bypass = stream_getc(s);
c44ab6f1
AK
2673
2674 if (BGP_DEBUG(zebra, ZEBRA))
74e2bd89 2675 zlog_debug(
74be8313
AK
2676 "Rx add ESI %s originator-ip %pI4 active %u df_pref %u %s",
2677 esi_to_str(&esi, buf, sizeof(buf)), &originator_ip,
2678 active, df_pref, bypass ? "bypass" : "");
c44ab6f1 2679
74be8313
AK
2680 bgp_evpn_local_es_add(bgp, &esi, originator_ip, active, df_pref,
2681 !!bypass);
c44ab6f1
AK
2682
2683 return 0;
2684}
2685
2686static int bgp_zebra_process_local_es_del(ZAPI_CALLBACK_ARGS)
50f74cf1 2687{
2688 esi_t esi;
2689 struct bgp *bgp = NULL;
2690 struct stream *s = NULL;
2691 char buf[ESI_STR_LEN];
50f74cf1 2692
2693 memset(&esi, 0, sizeof(esi_t));
c44ab6f1
AK
2694 bgp = bgp_lookup_by_vrf_id(vrf_id);
2695 if (!bgp)
2696 return 0;
2697
2698 s = zclient->ibuf;
2699 stream_get(&esi, s, sizeof(esi_t));
2700
2701 if (BGP_DEBUG(zebra, ZEBRA))
2702 zlog_debug("Rx del ESI %s",
2703 esi_to_str(&esi, buf, sizeof(buf)));
2704
2705 bgp_evpn_local_es_del(bgp, &esi);
2706
2707 return 0;
2708}
2709
2710static int bgp_zebra_process_local_es_evi(ZAPI_CALLBACK_ARGS)
2711{
2712 esi_t esi;
2713 vni_t vni;
2714 struct bgp *bgp;
2715 struct stream *s;
2716 char buf[ESI_STR_LEN];
50f74cf1 2717
2718 bgp = bgp_lookup_by_vrf_id(vrf_id);
2719 if (!bgp)
2720 return 0;
2721
2722 s = zclient->ibuf;
2723 stream_get(&esi, s, sizeof(esi_t));
c44ab6f1 2724 vni = stream_getl(s);
50f74cf1 2725
2726 if (BGP_DEBUG(zebra, ZEBRA))
c44ab6f1
AK
2727 zlog_debug("Rx %s ESI %s VNI %u",
2728 ZEBRA_VNI_ADD ? "add" : "del",
2729 esi_to_str(&esi, buf, sizeof(buf)), vni);
50f74cf1 2730
c44ab6f1
AK
2731 if (cmd == ZEBRA_LOCAL_ES_EVI_ADD)
2732 bgp_evpn_local_es_evi_add(bgp, &esi, vni);
50f74cf1 2733 else
c44ab6f1
AK
2734 bgp_evpn_local_es_evi_del(bgp, &esi, vni);
2735
50f74cf1 2736 return 0;
2737}
2738
121f9dee 2739static int bgp_zebra_process_local_l3vni(ZAPI_CALLBACK_ARGS)
fe1dc5a3 2740{
c48d9f5f 2741 int filter = 0;
b67a60d2 2742 vni_t l3vni = 0;
14e814ea 2743 struct ethaddr svi_rmac, vrr_rmac = {.octet = {0} };
b67a60d2 2744 struct in_addr originator_ip;
fe1dc5a3 2745 struct stream *s;
0483af6e 2746 ifindex_t svi_ifindex;
14e814ea 2747 bool is_anycast_mac = false;
fe1dc5a3 2748
14e814ea 2749 memset(&svi_rmac, 0, sizeof(struct ethaddr));
b67a60d2 2750 memset(&originator_ip, 0, sizeof(struct in_addr));
fe1dc5a3
MK
2751 s = zclient->ibuf;
2752 l3vni = stream_getl(s);
b67a60d2 2753 if (cmd == ZEBRA_L3VNI_ADD) {
14e814ea 2754 stream_get(&svi_rmac, s, sizeof(struct ethaddr));
b67a60d2 2755 originator_ip.s_addr = stream_get_ipv4(s);
c48d9f5f 2756 stream_get(&filter, s, sizeof(int));
0483af6e 2757 svi_ifindex = stream_getl(s);
14e814ea
CS
2758 stream_get(&vrr_rmac, s, sizeof(struct ethaddr));
2759 is_anycast_mac = stream_getl(s);
fe1dc5a3 2760
0483af6e 2761 if (BGP_DEBUG(zebra, ZEBRA))
c0d72166
DS
2762 zlog_debug(
2763 "Rx L3-VNI ADD VRF %s VNI %u RMAC svi-mac %pEA vrr-mac %pEA filter %s svi-if %u",
2764 vrf_id_to_name(vrf_id), l3vni, &svi_rmac,
2765 &vrr_rmac,
2766 filter ? "prefix-routes-only" : "none",
2767 svi_ifindex);
fe1dc5a3 2768
14e814ea
CS
2769 bgp_evpn_local_l3vni_add(l3vni, vrf_id, &svi_rmac, &vrr_rmac,
2770 originator_ip, filter, svi_ifindex,
2771 is_anycast_mac);
0483af6e 2772 } else {
2773 if (BGP_DEBUG(zebra, ZEBRA))
2774 zlog_debug("Rx L3-VNI DEL VRF %s VNI %u",
2775 vrf_id_to_name(vrf_id), l3vni);
2776
fe1dc5a3 2777 bgp_evpn_local_l3vni_del(l3vni, vrf_id);
0483af6e 2778 }
fe1dc5a3
MK
2779
2780 return 0;
2781}
2782
121f9dee 2783static int bgp_zebra_process_local_vni(ZAPI_CALLBACK_ARGS)
128ea8ab 2784{
d62a17ae 2785 struct stream *s;
2786 vni_t vni;
2787 struct bgp *bgp;
a4d82a8a 2788 struct in_addr vtep_ip = {INADDR_ANY};
29c53922 2789 vrf_id_t tenant_vrf_id = VRF_DEFAULT;
76d07c7a 2790 struct in_addr mcast_grp = {INADDR_ANY};
d62a17ae 2791
2792 s = zclient->ibuf;
2793 vni = stream_getl(s);
121f9dee 2794 if (cmd == ZEBRA_VNI_ADD) {
d62a17ae 2795 vtep_ip.s_addr = stream_get_ipv4(s);
29c53922 2796 stream_get(&tenant_vrf_id, s, sizeof(vrf_id_t));
76d07c7a 2797 mcast_grp.s_addr = stream_get_ipv4(s);
29c53922
MK
2798 }
2799
d62a17ae 2800 bgp = bgp_lookup_by_vrf_id(vrf_id);
2801 if (!bgp)
2802 return 0;
2803
2804 if (BGP_DEBUG(zebra, ZEBRA))
29c53922 2805 zlog_debug("Rx VNI %s VRF %s VNI %u tenant-vrf %s",
121f9dee 2806 (cmd == ZEBRA_VNI_ADD) ? "add" : "del",
a4d82a8a
PZ
2807 vrf_id_to_name(vrf_id), vni,
2808 vrf_id_to_name(tenant_vrf_id));
d62a17ae 2809
121f9dee 2810 if (cmd == ZEBRA_VNI_ADD)
d62a17ae 2811 return bgp_evpn_local_vni_add(
975a328e
DA
2812 bgp, vni,
2813 vtep_ip.s_addr != INADDR_ANY ? vtep_ip : bgp->router_id,
76d07c7a 2814 tenant_vrf_id, mcast_grp);
d62a17ae 2815 else
2816 return bgp_evpn_local_vni_del(bgp, vni);
128ea8ab 2817}
2818
121f9dee 2819static int bgp_zebra_process_local_macip(ZAPI_CALLBACK_ARGS)
128ea8ab 2820{
d62a17ae 2821 struct stream *s;
2822 vni_t vni;
2823 struct bgp *bgp;
2824 struct ethaddr mac;
2825 struct ipaddr ip;
2826 int ipa_len;
f07e1c99 2827 uint8_t flags = 0;
2828 uint32_t seqnum = 0;
ec0ab544 2829 int state = 0;
c44ab6f1
AK
2830 char buf2[ESI_STR_LEN];
2831 esi_t esi;
d62a17ae 2832
2833 memset(&ip, 0, sizeof(ip));
2834 s = zclient->ibuf;
2835 vni = stream_getl(s);
28328ea9 2836 stream_get(&mac.octet, s, ETH_ALEN);
d62a17ae 2837 ipa_len = stream_getl(s);
2838 if (ipa_len != 0 && ipa_len != IPV4_MAX_BYTELEN
2839 && ipa_len != IPV6_MAX_BYTELEN) {
e50f7cfd 2840 flog_err(EC_BGP_MACIP_LEN,
1c50c1c0 2841 "%u:Recv MACIP %s with invalid IP addr length %d",
121f9dee 2842 vrf_id, (cmd == ZEBRA_MACIP_ADD) ? "Add" : "Del",
1c50c1c0 2843 ipa_len);
d62a17ae 2844 return -1;
2845 }
2846
2847 if (ipa_len) {
2848 ip.ipa_type =
2849 (ipa_len == IPV4_MAX_BYTELEN) ? IPADDR_V4 : IPADDR_V6;
2850 stream_get(&ip.ip.addr, s, ipa_len);
2851 }
121f9dee 2852 if (cmd == ZEBRA_MACIP_ADD) {
f07e1c99 2853 flags = stream_getc(s);
2854 seqnum = stream_getl(s);
c44ab6f1 2855 stream_get(&esi, s, sizeof(esi_t));
ec0ab544
AK
2856 } else {
2857 state = stream_getl(s);
35fb444b 2858 memset(&esi, 0, sizeof(esi_t));
f07e1c99 2859 }
d62a17ae 2860
2861 bgp = bgp_lookup_by_vrf_id(vrf_id);
2862 if (!bgp)
2863 return 0;
2864
2865 if (BGP_DEBUG(zebra, ZEBRA))
c0d72166 2866 zlog_debug(
2dd0dde7 2867 "%u:Recv MACIP %s f 0x%x MAC %pEA IP %pIA VNI %u seq %u state %d ESI %s",
c0d72166
DS
2868 vrf_id, (cmd == ZEBRA_MACIP_ADD) ? "Add" : "Del", flags,
2869 &mac, &ip, vni, seqnum, state,
2870 esi_to_str(&esi, buf2, sizeof(buf2)));
d62a17ae 2871
121f9dee 2872 if (cmd == ZEBRA_MACIP_ADD)
f07e1c99 2873 return bgp_evpn_local_macip_add(bgp, vni, &mac, &ip,
c44ab6f1 2874 flags, seqnum, &esi);
d62a17ae 2875 else
ec0ab544 2876 return bgp_evpn_local_macip_del(bgp, vni, &mac, &ip, state);
128ea8ab 2877}
6aeb9e78 2878
121f9dee 2879static void bgp_zebra_process_local_ip_prefix(ZAPI_CALLBACK_ARGS)
31310b25
MK
2880{
2881 struct stream *s = NULL;
2882 struct bgp *bgp_vrf = NULL;
2883 struct prefix p;
31310b25
MK
2884
2885 memset(&p, 0, sizeof(struct prefix));
2886 s = zclient->ibuf;
2887 stream_get(&p, s, sizeof(struct prefix));
2888
2889 bgp_vrf = bgp_lookup_by_vrf_id(vrf_id);
2890 if (!bgp_vrf)
2891 return;
2892
2893 if (BGP_DEBUG(zebra, ZEBRA))
2dbe669b 2894 zlog_debug("Recv prefix %pFX %s on vrf %s", &p,
31310b25
MK
2895 (cmd == ZEBRA_IP_PREFIX_ROUTE_ADD) ? "ADD" : "DEL",
2896 vrf_id_to_name(vrf_id));
2897
2898 if (cmd == ZEBRA_IP_PREFIX_ROUTE_ADD) {
2899
2900 if (p.family == AF_INET)
d90b788e
A
2901 bgp_evpn_advertise_type5_route(bgp_vrf, &p, NULL,
2902 AFI_IP, SAFI_UNICAST);
31310b25 2903 else
d90b788e
A
2904 bgp_evpn_advertise_type5_route(bgp_vrf, &p, NULL,
2905 AFI_IP6, SAFI_UNICAST);
31310b25
MK
2906
2907 } else {
2908 if (p.family == AF_INET)
d90b788e
A
2909 bgp_evpn_withdraw_type5_route(bgp_vrf, &p, AFI_IP,
2910 SAFI_UNICAST);
31310b25 2911 else
d90b788e
A
2912 bgp_evpn_withdraw_type5_route(bgp_vrf, &p, AFI_IP6,
2913 SAFI_UNICAST);
31310b25
MK
2914 }
2915}
2916
121f9dee 2917static void bgp_zebra_process_label_chunk(ZAPI_CALLBACK_ARGS)
955bfd98
PZ
2918{
2919 struct stream *s = NULL;
2920 uint8_t response_keep;
2921 uint32_t first;
2922 uint32_t last;
aec865e4
FR
2923 uint8_t proto;
2924 unsigned short instance;
955bfd98
PZ
2925
2926 s = zclient->ibuf;
aec865e4
FR
2927 STREAM_GETC(s, proto);
2928 STREAM_GETW(s, instance);
955bfd98
PZ
2929 STREAM_GETC(s, response_keep);
2930 STREAM_GETL(s, first);
2931 STREAM_GETL(s, last);
2932
aec865e4 2933 if (zclient->redist_default != proto) {
e50f7cfd 2934 flog_err(EC_BGP_LM_ERROR, "Got LM msg with wrong proto %u",
1c50c1c0 2935 proto);
aec865e4
FR
2936 return;
2937 }
2938 if (zclient->instance != instance) {
e50f7cfd 2939 flog_err(EC_BGP_LM_ERROR, "Got LM msg with wrong instance %u",
1c50c1c0 2940 proto);
aec865e4
FR
2941 return;
2942 }
2943
955bfd98
PZ
2944 if (first > last ||
2945 first < MPLS_LABEL_UNRESERVED_MIN ||
2946 last > MPLS_LABEL_UNRESERVED_MAX) {
2947
e50f7cfd 2948 flog_err(EC_BGP_LM_ERROR, "%s: Invalid Label chunk: %u - %u",
1c50c1c0 2949 __func__, first, last);
955bfd98
PZ
2950 return;
2951 }
2952 if (BGP_DEBUG(zebra, ZEBRA)) {
2953 zlog_debug("Label Chunk assign: %u - %u (%u) ",
2954 first, last, response_keep);
2955 }
2956
e70e9f8e 2957 bgp_lp_event_chunk(response_keep, first, last);
955bfd98
PZ
2958
2959stream_failure: /* for STREAM_GETX */
2960 return;
2961}
2962
342213ea
DS
2963extern struct zebra_privs_t bgpd_privs;
2964
138c5a74
DS
2965static int bgp_ifp_create(struct interface *ifp)
2966{
ef7bd2a3
DS
2967 struct bgp *bgp;
2968
2969 if (BGP_DEBUG(zebra, ZEBRA))
2970 zlog_debug("Rx Intf add VRF %u IF %s", ifp->vrf_id, ifp->name);
2971
2972 bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
2973 if (!bgp)
2974 return 0;
2975
2976 bgp_mac_add_mac_entry(ifp);
2977
2978 bgp_update_interface_nbrs(bgp, ifp, ifp);
0d020cd6 2979 hook_call(bgp_vrf_status_changed, bgp, ifp);
138c5a74
DS
2980 return 0;
2981}
2982
f533be73 2983void bgp_zebra_init(struct thread_master *master, unsigned short instance)
718e3744 2984{
d62a17ae 2985 zclient_num_connects = 0;
2986
138c5a74
DS
2987 if_zapi_callbacks(bgp_ifp_create, bgp_ifp_up,
2988 bgp_ifp_down, bgp_ifp_destroy);
2989
d62a17ae 2990 /* Set default values. */
26f63a1e 2991 zclient = zclient_new(master, &zclient_options_default);
342213ea 2992 zclient_init(zclient, ZEBRA_ROUTE_BGP, 0, &bgpd_privs);
d62a17ae 2993 zclient->zebra_connected = bgp_zebra_connected;
2994 zclient->router_id_update = bgp_router_id_update;
d62a17ae 2995 zclient->interface_address_add = bgp_interface_address_add;
2996 zclient->interface_address_delete = bgp_interface_address_delete;
2997 zclient->interface_nbr_address_add = bgp_interface_nbr_address_add;
2998 zclient->interface_nbr_address_delete =
2999 bgp_interface_nbr_address_delete;
3000 zclient->interface_vrf_update = bgp_interface_vrf_update;
74489921
RW
3001 zclient->redistribute_route_add = zebra_read_route;
3002 zclient->redistribute_route_del = zebra_read_route;
d62a17ae 3003 zclient->nexthop_update = bgp_read_nexthop_update;
3004 zclient->import_check_update = bgp_read_import_check_update;
3005 zclient->fec_update = bgp_read_fec_update;
c44ab6f1
AK
3006 zclient->local_es_add = bgp_zebra_process_local_es_add;
3007 zclient->local_es_del = bgp_zebra_process_local_es_del;
d62a17ae 3008 zclient->local_vni_add = bgp_zebra_process_local_vni;
c44ab6f1
AK
3009 zclient->local_es_evi_add = bgp_zebra_process_local_es_evi;
3010 zclient->local_es_evi_del = bgp_zebra_process_local_es_evi;
d62a17ae 3011 zclient->local_vni_del = bgp_zebra_process_local_vni;
3012 zclient->local_macip_add = bgp_zebra_process_local_macip;
3013 zclient->local_macip_del = bgp_zebra_process_local_macip;
fe1dc5a3
MK
3014 zclient->local_l3vni_add = bgp_zebra_process_local_l3vni;
3015 zclient->local_l3vni_del = bgp_zebra_process_local_l3vni;
31310b25
MK
3016 zclient->local_ip_prefix_add = bgp_zebra_process_local_ip_prefix;
3017 zclient->local_ip_prefix_del = bgp_zebra_process_local_ip_prefix;
955bfd98 3018 zclient->label_chunk = bgp_zebra_process_label_chunk;
30d50e6d
PG
3019 zclient->rule_notify_owner = rule_notify_owner;
3020 zclient->ipset_notify_owner = ipset_notify_owner;
3021 zclient->ipset_entry_notify_owner = ipset_entry_notify_owner;
c16a0a62 3022 zclient->iptable_notify_owner = iptable_notify_owner;
a77e2f4b 3023 zclient->route_notify_owner = bgp_zebra_route_notify_owner;
f533be73 3024 zclient->instance = instance;
718e3744 3025}
bb86c601 3026
d62a17ae 3027void bgp_zebra_destroy(void)
bb86c601 3028{
d62a17ae 3029 if (zclient == NULL)
3030 return;
3031 zclient_stop(zclient);
3032 zclient_free(zclient);
3033 zclient = NULL;
bb86c601 3034}
afbb1c59 3035
d62a17ae 3036int bgp_zebra_num_connects(void)
afbb1c59 3037{
d62a17ae 3038 return zclient_num_connects;
afbb1c59 3039}
30d50e6d 3040
6cfe5d15
PG
3041void bgp_send_pbr_rule_action(struct bgp_pbr_action *pbra,
3042 struct bgp_pbr_rule *pbr,
3043 bool install)
30d50e6d
PG
3044{
3045 struct stream *s;
3046
6cfe5d15 3047 if (pbra->install_in_progress && !pbr)
30d50e6d 3048 return;
6cfe5d15
PG
3049 if (pbr && pbr->install_in_progress)
3050 return;
3051 if (BGP_DEBUG(zebra, ZEBRA)) {
3052 if (pbr)
15569c58 3053 zlog_debug("%s: table %d (ip rule) %d", __func__,
6cfe5d15
PG
3054 pbra->table_id, install);
3055 else
15569c58 3056 zlog_debug("%s: table %d fwmark %d %d", __func__,
6cfe5d15
PG
3057 pbra->table_id, pbra->fwmark, install);
3058 }
30d50e6d
PG
3059 s = zclient->obuf;
3060 stream_reset(s);
3061
3062 zclient_create_header(s,
3063 install ? ZEBRA_RULE_ADD : ZEBRA_RULE_DELETE,
3064 VRF_DEFAULT);
3065 stream_putl(s, 1); /* send one pbr action */
3066
6cfe5d15 3067 bgp_encode_pbr_rule_action(s, pbra, pbr);
30d50e6d
PG
3068
3069 stream_putw_at(s, 0, stream_get_endp(s));
8a3f8f2e
DS
3070 if ((zclient_send_message(zclient) != ZCLIENT_SEND_FAILURE)
3071 && install) {
6cfe5d15
PG
3072 if (!pbr)
3073 pbra->install_in_progress = true;
3074 else
3075 pbr->install_in_progress = true;
3076 }
30d50e6d
PG
3077}
3078
3079void bgp_send_pbr_ipset_match(struct bgp_pbr_match *pbrim, bool install)
3080{
3081 struct stream *s;
3082
3083 if (pbrim->install_in_progress)
3084 return;
f0936054 3085 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
3086 zlog_debug("%s: name %s type %d %d, ID %u", __func__,
3087 pbrim->ipset_name, pbrim->type, install,
3088 pbrim->unique);
30d50e6d
PG
3089 s = zclient->obuf;
3090 stream_reset(s);
3091
3092 zclient_create_header(s,
3093 install ? ZEBRA_IPSET_CREATE :
3094 ZEBRA_IPSET_DESTROY,
3095 VRF_DEFAULT);
3096
3097 stream_putl(s, 1); /* send one pbr action */
3098
3099 bgp_encode_pbr_ipset_match(s, pbrim);
3100
3101 stream_putw_at(s, 0, stream_get_endp(s));
8a3f8f2e 3102 if ((zclient_send_message(zclient) != ZCLIENT_SEND_FAILURE) && install)
30d50e6d
PG
3103 pbrim->install_in_progress = true;
3104}
3105
3106void bgp_send_pbr_ipset_entry_match(struct bgp_pbr_match_entry *pbrime,
3107 bool install)
3108{
3109 struct stream *s;
3110
3111 if (pbrime->install_in_progress)
3112 return;
f0936054 3113 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
3114 zlog_debug("%s: name %s %d %d, ID %u", __func__,
3115 pbrime->backpointer->ipset_name, pbrime->unique,
3116 install, pbrime->unique);
30d50e6d
PG
3117 s = zclient->obuf;
3118 stream_reset(s);
3119
3120 zclient_create_header(s,
3121 install ? ZEBRA_IPSET_ENTRY_ADD :
3122 ZEBRA_IPSET_ENTRY_DELETE,
3123 VRF_DEFAULT);
3124
3125 stream_putl(s, 1); /* send one pbr action */
3126
3127 bgp_encode_pbr_ipset_entry_match(s, pbrime);
3128
3129 stream_putw_at(s, 0, stream_get_endp(s));
8a3f8f2e 3130 if ((zclient_send_message(zclient) != ZCLIENT_SEND_FAILURE) && install)
30d50e6d
PG
3131 pbrime->install_in_progress = true;
3132}
c16a0a62 3133
8f242187
PG
3134static void bgp_encode_pbr_interface_list(struct bgp *bgp, struct stream *s,
3135 uint8_t family)
4762c213
PG
3136{
3137 struct bgp_pbr_config *bgp_pbr_cfg = bgp->bgp_pbr_cfg;
3138 struct bgp_pbr_interface_head *head;
3139 struct bgp_pbr_interface *pbr_if;
3140 struct interface *ifp;
3141
3142 if (!bgp_pbr_cfg)
3143 return;
8f242187
PG
3144 if (family == AF_INET)
3145 head = &(bgp_pbr_cfg->ifaces_by_name_ipv4);
3146 else
3147 head = &(bgp_pbr_cfg->ifaces_by_name_ipv6);
4762c213 3148 RB_FOREACH (pbr_if, bgp_pbr_interface_head, head) {
a36898e7 3149 ifp = if_lookup_by_name(pbr_if->name, bgp->vrf_id);
4762c213
PG
3150 if (ifp)
3151 stream_putl(s, ifp->ifindex);
3152 }
3153}
3154
8f242187 3155static int bgp_pbr_get_ifnumber(struct bgp *bgp, uint8_t family)
4762c213
PG
3156{
3157 struct bgp_pbr_config *bgp_pbr_cfg = bgp->bgp_pbr_cfg;
3158 struct bgp_pbr_interface_head *head;
3159 struct bgp_pbr_interface *pbr_if;
3160 int cnt = 0;
3161
3162 if (!bgp_pbr_cfg)
3163 return 0;
8f242187
PG
3164 if (family == AF_INET)
3165 head = &(bgp_pbr_cfg->ifaces_by_name_ipv4);
3166 else
3167 head = &(bgp_pbr_cfg->ifaces_by_name_ipv6);
4762c213 3168 RB_FOREACH (pbr_if, bgp_pbr_interface_head, head) {
a36898e7 3169 if (if_lookup_by_name(pbr_if->name, bgp->vrf_id))
4762c213
PG
3170 cnt++;
3171 }
3172 return cnt;
3173}
3174
c16a0a62
PG
3175void bgp_send_pbr_iptable(struct bgp_pbr_action *pba,
3176 struct bgp_pbr_match *pbm,
3177 bool install)
3178{
3179 struct stream *s;
b5c40105 3180 int ret = 0;
4762c213 3181 int nb_interface;
c16a0a62
PG
3182
3183 if (pbm->install_iptable_in_progress)
3184 return;
f0936054 3185 if (BGP_DEBUG(zebra, ZEBRA))
15569c58
DA
3186 zlog_debug("%s: name %s type %d mark %d %d, ID %u", __func__,
3187 pbm->ipset_name, pbm->type, pba->fwmark, install,
88055124 3188 pbm->unique2);
c16a0a62
PG
3189 s = zclient->obuf;
3190 stream_reset(s);
3191
3192 zclient_create_header(s,
3193 install ? ZEBRA_IPTABLE_ADD :
3194 ZEBRA_IPTABLE_DELETE,
3195 VRF_DEFAULT);
3196
3197 bgp_encode_pbr_iptable_match(s, pba, pbm);
8f242187 3198 nb_interface = bgp_pbr_get_ifnumber(pba->bgp, pbm->family);
4762c213
PG
3199 stream_putl(s, nb_interface);
3200 if (nb_interface)
8f242187 3201 bgp_encode_pbr_interface_list(pba->bgp, s, pbm->family);
c16a0a62 3202 stream_putw_at(s, 0, stream_get_endp(s));
b5c40105
PG
3203 ret = zclient_send_message(zclient);
3204 if (install) {
8a3f8f2e 3205 if (ret != ZCLIENT_SEND_FAILURE)
b5c40105
PG
3206 pba->refcnt++;
3207 else
3208 pbm->install_iptable_in_progress = true;
a6b07429 3209 }
c16a0a62 3210}
f7df1907
PG
3211
3212/* inject in table <table_id> a default route to:
3213 * - if nexthop IP is present : to this nexthop
3214 * - if vrf is different from local : to the matching VRF
3215 */
3216void bgp_zebra_announce_default(struct bgp *bgp, struct nexthop *nh,
3217 afi_t afi, uint32_t table_id, bool announce)
3218{
3219 struct zapi_nexthop *api_nh;
3220 struct zapi_route api;
3221 struct prefix p;
3222
f01e580f
PG
3223 if (!nh || (nh->type != NEXTHOP_TYPE_IPV4
3224 && nh->type != NEXTHOP_TYPE_IPV6)
f7df1907
PG
3225 || nh->vrf_id == VRF_UNKNOWN)
3226 return;
3227 memset(&p, 0, sizeof(struct prefix));
f01e580f 3228 if (afi != AFI_IP && afi != AFI_IP6)
f7df1907 3229 return;
f01e580f 3230 p.family = afi2family(afi);
f7df1907
PG
3231 memset(&api, 0, sizeof(api));
3232 api.vrf_id = bgp->vrf_id;
3233 api.type = ZEBRA_ROUTE_BGP;
3234 api.safi = SAFI_UNICAST;
3235 api.prefix = p;
3236 api.tableid = table_id;
3237 api.nexthop_num = 1;
3238 SET_FLAG(api.message, ZAPI_MESSAGE_TABLEID);
3239 SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
3240 api_nh = &api.nexthops[0];
3241
38a8c751
DS
3242 api.distance = ZEBRA_EBGP_DISTANCE_DEFAULT;
3243 SET_FLAG(api.message, ZAPI_MESSAGE_DISTANCE);
3244
f7df1907 3245 /* redirect IP */
f01e580f 3246 if (afi == AFI_IP && nh->gate.ipv4.s_addr != INADDR_ANY) {
f7df1907
PG
3247 char buff[PREFIX_STRLEN];
3248
3249 api_nh->vrf_id = nh->vrf_id;
3250 api_nh->gate.ipv4 = nh->gate.ipv4;
3251 api_nh->type = NEXTHOP_TYPE_IPV4;
3252
3253 inet_ntop(AF_INET, &(nh->gate.ipv4), buff, INET_ADDRSTRLEN);
3254 if (BGP_DEBUG(zebra, ZEBRA))
f01e580f
PG
3255 zlog_debug("BGP: %s default route to %s table %d (redirect IP)",
3256 announce ? "adding" : "withdrawing",
3257 buff, table_id);
3258 zclient_route_send(announce ? ZEBRA_ROUTE_ADD
3259 : ZEBRA_ROUTE_DELETE,
3260 zclient, &api);
3261 } else if (afi == AFI_IP6 &&
3262 memcmp(&nh->gate.ipv6,
3263 &in6addr_any, sizeof(struct in6_addr))) {
3264 char buff[PREFIX_STRLEN];
3265
3266 api_nh->vrf_id = nh->vrf_id;
3267 memcpy(&api_nh->gate.ipv6, &nh->gate.ipv6,
3268 sizeof(struct in6_addr));
3269 api_nh->type = NEXTHOP_TYPE_IPV6;
3270
3271 inet_ntop(AF_INET6, &(nh->gate.ipv6), buff, INET_ADDRSTRLEN);
3272 if (BGP_DEBUG(zebra, ZEBRA))
3273 zlog_debug("BGP: %s default route to %s table %d (redirect IP)",
d887503c 3274 announce ? "adding" : "withdrawing",
f7df1907
PG
3275 buff, table_id);
3276 zclient_route_send(announce ? ZEBRA_ROUTE_ADD
3277 : ZEBRA_ROUTE_DELETE,
3278 zclient, &api);
3279 } else if (nh->vrf_id != bgp->vrf_id) {
3280 struct vrf *vrf;
eb4244f8 3281 struct interface *ifp;
f7df1907 3282
eb4244f8 3283 vrf = vrf_lookup_by_id(nh->vrf_id);
f7df1907
PG
3284 if (!vrf)
3285 return;
eb4244f8
PG
3286 /* create default route with interface <VRF>
3287 * with nexthop-vrf <VRF>
f7df1907 3288 */
eb4244f8
PG
3289 ifp = if_lookup_by_name_all_vrf(vrf->name);
3290 if (!ifp)
3291 return;
3292 api_nh->vrf_id = nh->vrf_id;
3293 api_nh->type = NEXTHOP_TYPE_IFINDEX;
3294 api_nh->ifindex = ifp->ifindex;
3295 if (BGP_DEBUG(zebra, ZEBRA))
d887503c
PG
3296 zlog_info("BGP: %s default route to %s table %d (redirect VRF)",
3297 announce ? "adding" : "withdrawing",
eb4244f8
PG
3298 vrf->name, table_id);
3299 zclient_route_send(announce ? ZEBRA_ROUTE_ADD
3300 : ZEBRA_ROUTE_DELETE,
3301 zclient, &api);
f7df1907
PG
3302 return;
3303 }
3304}
85ef4179 3305
3306/* Send capabilities to RIB */
3307int bgp_zebra_send_capabilities(struct bgp *bgp, bool disable)
3308{
3309 struct zapi_cap api;
3310 int ret = BGP_GR_SUCCESS;
3311
3312 if (zclient == NULL) {
3313 if (BGP_DEBUG(zebra, ZEBRA))
3314 zlog_debug("zclient invalid");
3315 return BGP_GR_FAILURE;
3316 }
3317
3318 /* Check if the client is connected */
3319 if ((zclient->sock < 0) || (zclient->t_connect)) {
3320 if (BGP_DEBUG(zebra, ZEBRA))
3321 zlog_debug("client not connected");
3322 return BGP_GR_FAILURE;
3323 }
3324
3325 /* Check if capability is already sent. If the flag force is set
3326 * send the capability since this can be initial bgp configuration
3327 */
3328 memset(&api, 0, sizeof(struct zapi_cap));
3329 if (disable) {
3330 api.cap = ZEBRA_CLIENT_GR_DISABLE;
3331 api.vrf_id = bgp->vrf_id;
3332 } else {
3333 api.cap = ZEBRA_CLIENT_GR_CAPABILITIES;
3334 api.stale_removal_time = bgp->rib_stale_time;
3335 api.vrf_id = bgp->vrf_id;
3336 }
3337
36235319 3338 if (zclient_capabilities_send(ZEBRA_CLIENT_CAPABILITIES, zclient, &api)
7cfdb485 3339 == ZCLIENT_SEND_FAILURE) {
2ba1fe69 3340 zlog_err("error sending capability");
85ef4179 3341 ret = BGP_GR_FAILURE;
3342 } else {
3343 if (disable)
3344 bgp->present_zebra_gr_state = ZEBRA_GR_DISABLE;
3345 else
3346 bgp->present_zebra_gr_state = ZEBRA_GR_ENABLE;
3347
3348 if (BGP_DEBUG(zebra, ZEBRA))
3349 zlog_debug("send capabilty success");
3350 ret = BGP_GR_SUCCESS;
3351 }
3352 return ret;
3353}
3354
3355/* Send route update pesding or completed status to RIB for the
3356 * specific AFI, SAFI
3357 */
3358int bgp_zebra_update(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type)
3359{
2ba1fe69 3360 struct zapi_cap api = {0};
85ef4179 3361
3362 if (zclient == NULL) {
3363 if (BGP_DEBUG(zebra, ZEBRA))
2ba1fe69 3364 zlog_debug("zclient == NULL, invalid");
85ef4179 3365 return BGP_GR_FAILURE;
3366 }
3367
3368 /* Check if the client is connected */
3369 if ((zclient->sock < 0) || (zclient->t_connect)) {
3370 if (BGP_DEBUG(zebra, ZEBRA))
3371 zlog_debug("client not connected");
3372 return BGP_GR_FAILURE;
3373 }
3374
85ef4179 3375 api.afi = afi;
3376 api.safi = safi;
3377 api.vrf_id = vrf_id;
3378 api.cap = type;
3379
36235319 3380 if (zclient_capabilities_send(ZEBRA_CLIENT_CAPABILITIES, zclient, &api)
7cfdb485 3381 == ZCLIENT_SEND_FAILURE) {
85ef4179 3382 if (BGP_DEBUG(zebra, ZEBRA))
3383 zlog_debug("error sending capability");
3384 return BGP_GR_FAILURE;
3385 }
3386 return BGP_GR_SUCCESS;
3387}
3388
3389
85ef4179 3390/* Send RIB stale timer update */
3391int bgp_zebra_stale_timer_update(struct bgp *bgp)
3392{
3393 struct zapi_cap api;
3394
3395 if (zclient == NULL) {
3396 if (BGP_DEBUG(zebra, ZEBRA))
3397 zlog_debug("zclient invalid");
3398 return BGP_GR_FAILURE;
3399 }
3400
3401 /* Check if the client is connected */
3402 if ((zclient->sock < 0) || (zclient->t_connect)) {
3403 if (BGP_DEBUG(zebra, ZEBRA))
3404 zlog_debug("client not connected");
3405 return BGP_GR_FAILURE;
3406 }
3407
3408 memset(&api, 0, sizeof(struct zapi_cap));
3409 api.cap = ZEBRA_CLIENT_RIB_STALE_TIME;
3410 api.stale_removal_time = bgp->rib_stale_time;
3411 api.vrf_id = bgp->vrf_id;
36235319 3412 if (zclient_capabilities_send(ZEBRA_CLIENT_CAPABILITIES, zclient, &api)
7cfdb485 3413 == ZCLIENT_SEND_FAILURE) {
85ef4179 3414 if (BGP_DEBUG(zebra, ZEBRA))
3415 zlog_debug("error sending capability");
3416 return BGP_GR_FAILURE;
3417 }
3418 if (BGP_DEBUG(zebra, ZEBRA))
3419 zlog_debug("send capabilty success");
3420 return BGP_GR_SUCCESS;
3421}