]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_evpn.c
bgpd: distinguish between frr prefixlen and packet prefixlen for EVPN type-5 routes
[mirror_frr.git] / bgpd / bgp_evpn.c
1 /* Ethernet-VPN Packet and vty Processing File
2 * Copyright (C) 2016 6WIND
3 * Copyright (C) 2017 Cumulus Networks, Inc.
4 *
5 * This file is part of FRR.
6 *
7 * FRRouting is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * FRRouting is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <zebra.h>
23
24 #include "command.h"
25 #include "filter.h"
26 #include "prefix.h"
27 #include "log.h"
28 #include "memory.h"
29 #include "stream.h"
30 #include "hash.h"
31 #include "jhash.h"
32 #include "bitfield.h"
33 #include "zclient.h"
34
35 #include "bgpd/bgp_attr_evpn.h"
36 #include "bgpd/bgpd.h"
37 #include "bgpd/bgp_table.h"
38 #include "bgpd/bgp_route.h"
39 #include "bgpd/bgp_attr.h"
40 #include "bgpd/bgp_mplsvpn.h"
41 #include "bgpd/bgp_label.h"
42 #include "bgpd/bgp_evpn.h"
43 #include "bgpd/bgp_evpn_private.h"
44 #include "bgpd/bgp_ecommunity.h"
45 #include "bgpd/bgp_encap_types.h"
46 #include "bgpd/bgp_debug.h"
47 #include "bgpd/bgp_aspath.h"
48 #include "bgpd/bgp_zebra.h"
49 #include "bgpd/bgp_nexthop.h"
50
51 /*
52 * Definitions and external declarations.
53 */
54 extern struct zclient *zclient;
55
56 DEFINE_QOBJ_TYPE(bgpevpn)
57
58
59 /*
60 * Static function declarations
61 */
62 static void delete_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
63 afi_t afi, safi_t safi, struct bgp_node *rn,
64 struct bgp_info **ri);
65 static int delete_all_vni_routes(struct bgp *bgp, struct bgpevpn *vpn);
66
67 /*
68 * Private functions.
69 */
70
71 /*
72 * Make vni hash key.
73 */
74 static unsigned int vni_hash_key_make(void *p)
75 {
76 struct bgpevpn *vpn = p;
77 return (jhash_1word(vpn->vni, 0));
78 }
79
80 /*
81 * Comparison function for vni hash
82 */
83 static int vni_hash_cmp(const void *p1, const void *p2)
84 {
85 const struct bgpevpn *vpn1 = p1;
86 const struct bgpevpn *vpn2 = p2;
87
88 if (!vpn1 && !vpn2)
89 return 1;
90 if (!vpn1 || !vpn2)
91 return 0;
92 return (vpn1->vni == vpn2->vni);
93 }
94
95 /*
96 * Make vrf import route target hash key.
97 */
98 static unsigned int vrf_import_rt_hash_key_make(void *p)
99 {
100 struct vrf_irt_node *irt = p;
101 char *pnt = irt->rt.val;
102 unsigned int key = 0;
103 int c = 0;
104
105 key += pnt[c];
106 key += pnt[c + 1];
107 key += pnt[c + 2];
108 key += pnt[c + 3];
109 key += pnt[c + 4];
110 key += pnt[c + 5];
111 key += pnt[c + 6];
112 key += pnt[c + 7];
113
114 return key;
115 }
116
117 /*
118 * Comparison function for vrf import rt hash
119 */
120 static int vrf_import_rt_hash_cmp(const void *p1, const void *p2)
121 {
122 const struct vrf_irt_node *irt1 = p1;
123 const struct vrf_irt_node *irt2 = p2;
124
125 if (irt1 == NULL && irt2 == NULL)
126 return 1;
127
128 if (irt1 == NULL || irt2 == NULL)
129 return 0;
130
131 return (memcmp(irt1->rt.val, irt2->rt.val, ECOMMUNITY_SIZE) == 0);
132 }
133
134 /*
135 * Create a new vrf import_rt in default instance
136 */
137 static struct vrf_irt_node *vrf_import_rt_new(struct ecommunity_val *rt)
138 {
139 struct bgp *bgp_def = NULL;
140 struct vrf_irt_node *irt;
141
142 bgp_def = bgp_get_default();
143 if (!bgp_def) {
144 zlog_err("vrf import rt new - def instance not created yet");
145 return NULL;
146 }
147
148 irt = XCALLOC(MTYPE_BGP_EVPN_VRF_IMPORT_RT,
149 sizeof(struct vrf_irt_node));
150 if (!irt)
151 return NULL;
152
153 irt->rt = *rt;
154 irt->vrfs = list_new();
155
156 /* Add to hash */
157 if (!hash_get(bgp_def->vrf_import_rt_hash, irt, hash_alloc_intern)) {
158 XFREE(MTYPE_BGP_EVPN_VRF_IMPORT_RT, irt);
159 return NULL;
160 }
161
162 return irt;
163 }
164
165 /*
166 * Free the vrf import rt node
167 */
168 static void vrf_import_rt_free(struct vrf_irt_node *irt)
169 {
170 struct bgp *bgp_def = NULL;
171
172 bgp_def = bgp_get_default();
173 if (!bgp_def) {
174 zlog_err("vrf import rt free - def instance not created yet");
175 return;
176 }
177
178 hash_release(bgp_def->vrf_import_rt_hash, irt);
179 XFREE(MTYPE_BGP_EVPN_VRF_IMPORT_RT, irt);
180 }
181
182 /*
183 * Function to lookup Import RT node - used to map a RT to set of
184 * VNIs importing routes with that RT.
185 */
186 static struct vrf_irt_node *lookup_vrf_import_rt(struct ecommunity_val *rt)
187 {
188 struct bgp *bgp_def = NULL;
189 struct vrf_irt_node *irt;
190 struct vrf_irt_node tmp;
191
192 bgp_def = bgp_get_default();
193 if (!bgp_def) {
194 zlog_err("vrf import rt lookup - def instance not created yet");
195 return NULL;
196 }
197
198 memset(&tmp, 0, sizeof(struct vrf_irt_node));
199 memcpy(&tmp.rt, rt, ECOMMUNITY_SIZE);
200 irt = hash_lookup(bgp_def->vrf_import_rt_hash, &tmp);
201 return irt;
202 }
203
204 /*
205 * Is specified VRF present on the RT's list of "importing" VRFs?
206 */
207 static int is_vrf_present_in_irt_vrfs(struct list *vrfs,
208 struct bgp *bgp_vrf)
209 {
210 struct listnode *node = NULL, *nnode = NULL;
211 struct bgp *tmp_bgp_vrf = NULL;
212
213 for (ALL_LIST_ELEMENTS(vrfs, node, nnode, tmp_bgp_vrf)) {
214 if (tmp_bgp_vrf == bgp_vrf)
215 return 1;
216 }
217 return 0;
218 }
219
220 /*
221 * Make import route target hash key.
222 */
223 static unsigned int import_rt_hash_key_make(void *p)
224 {
225 struct irt_node *irt = p;
226 char *pnt = irt->rt.val;
227 unsigned int key = 0;
228 int c = 0;
229
230 key += pnt[c];
231 key += pnt[c + 1];
232 key += pnt[c + 2];
233 key += pnt[c + 3];
234 key += pnt[c + 4];
235 key += pnt[c + 5];
236 key += pnt[c + 6];
237 key += pnt[c + 7];
238
239 return (key);
240 }
241
242 /*
243 * Comparison function for import rt hash
244 */
245 static int import_rt_hash_cmp(const void *p1, const void *p2)
246 {
247 const struct irt_node *irt1 = p1;
248 const struct irt_node *irt2 = p2;
249
250 if (irt1 == NULL && irt2 == NULL)
251 return 1;
252
253 if (irt1 == NULL || irt2 == NULL)
254 return 0;
255
256 return (memcmp(irt1->rt.val, irt2->rt.val, ECOMMUNITY_SIZE) == 0);
257 }
258
259 /*
260 * Create a new import_rt
261 */
262 static struct irt_node *import_rt_new(struct bgp *bgp,
263 struct ecommunity_val *rt)
264 {
265 struct irt_node *irt;
266
267 if (!bgp)
268 return NULL;
269
270 irt = XCALLOC(MTYPE_BGP_EVPN_IMPORT_RT, sizeof(struct irt_node));
271 if (!irt)
272 return NULL;
273
274 irt->rt = *rt;
275 irt->vnis = list_new();
276
277 /* Add to hash */
278 if (!hash_get(bgp->import_rt_hash, irt, hash_alloc_intern)) {
279 XFREE(MTYPE_BGP_EVPN_IMPORT_RT, irt);
280 return NULL;
281 }
282
283 return irt;
284 }
285
286 /*
287 * Free the import rt node
288 */
289 static void import_rt_free(struct bgp *bgp, struct irt_node *irt)
290 {
291 hash_release(bgp->import_rt_hash, irt);
292 XFREE(MTYPE_BGP_EVPN_IMPORT_RT, irt);
293 }
294
295 /*
296 * Function to lookup Import RT node - used to map a RT to set of
297 * VNIs importing routes with that RT.
298 */
299 static struct irt_node *lookup_import_rt(struct bgp *bgp,
300 struct ecommunity_val *rt)
301 {
302 struct irt_node *irt;
303 struct irt_node tmp;
304
305 memset(&tmp, 0, sizeof(struct irt_node));
306 memcpy(&tmp.rt, rt, ECOMMUNITY_SIZE);
307 irt = hash_lookup(bgp->import_rt_hash, &tmp);
308 return irt;
309 }
310
311 /*
312 * Is specified VNI present on the RT's list of "importing" VNIs?
313 */
314 static int is_vni_present_in_irt_vnis(struct list *vnis, struct bgpevpn *vpn)
315 {
316 struct listnode *node, *nnode;
317 struct bgpevpn *tmp_vpn;
318
319 for (ALL_LIST_ELEMENTS(vnis, node, nnode, tmp_vpn)) {
320 if (tmp_vpn == vpn)
321 return 1;
322 }
323
324 return 0;
325 }
326
327 /*
328 * Compare Route Targets.
329 */
330 static int evpn_route_target_cmp(struct ecommunity *ecom1,
331 struct ecommunity *ecom2)
332 {
333 if (ecom1 && !ecom2)
334 return -1;
335
336 if (!ecom1 && ecom2)
337 return 1;
338
339 if (!ecom1 && !ecom2)
340 return 0;
341
342 if (ecom1->str && !ecom2->str)
343 return -1;
344
345 if (!ecom1->str && ecom2->str)
346 return 1;
347
348 if (!ecom1->str && !ecom2->str)
349 return 0;
350
351 return strcmp(ecom1->str, ecom2->str);
352 }
353
354 /*
355 * Mask off global-admin field of specified extended community (RT),
356 * just retain the local-admin field.
357 */
358 static inline void mask_ecom_global_admin(struct ecommunity_val *dst,
359 struct ecommunity_val *src)
360 {
361 u_char type;
362
363 type = src->val[0];
364 dst->val[0] = 0;
365 if (type == ECOMMUNITY_ENCODE_AS) {
366 dst->val[2] = dst->val[3] = 0;
367 } else if (type == ECOMMUNITY_ENCODE_AS4
368 || type == ECOMMUNITY_ENCODE_IP) {
369 dst->val[2] = dst->val[3] = 0;
370 dst->val[4] = dst->val[5] = 0;
371 }
372 }
373
374 /*
375 * Map one RT to specified VRF.
376 * bgp_vrf = BGP vrf instance
377 */
378 static void map_vrf_to_rt(struct bgp *bgp_vrf,
379 struct ecommunity_val *eval)
380 {
381 struct vrf_irt_node *irt = NULL;
382 struct ecommunity_val eval_tmp;
383
384 /* If using "automatic" RT,
385 * we only care about the local-admin sub-field.
386 * This is to facilitate using L3VNI(VRF-VNI)
387 * as the RT for EBGP peering too.
388 */
389 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
390 if (!CHECK_FLAG(bgp_vrf->vrf_flags,
391 BGP_VRF_IMPORT_RT_CFGD))
392 mask_ecom_global_admin(&eval_tmp, eval);
393
394 irt = lookup_vrf_import_rt(&eval_tmp);
395 if (irt && irt->vrfs)
396 if (is_vrf_present_in_irt_vrfs(irt->vrfs, bgp_vrf))
397 /* Already mapped. */
398 return;
399
400 if (!irt) {
401 irt = vrf_import_rt_new(&eval_tmp);
402 assert(irt);
403 }
404
405 /* Add VRF to the list for this RT. */
406 listnode_add(irt->vrfs, bgp_vrf);
407 }
408
409 /*
410 * Unmap specified VRF from specified RT. If there are no other
411 * VRFs for this RT, then the RT hash is deleted.
412 * bgp_vrf: BGP VRF specific instance
413 */
414 static void unmap_vrf_from_rt(struct bgp *bgp_vrf,
415 struct vrf_irt_node *irt)
416 {
417 /* Delete VRF from list for this RT. */
418 listnode_delete(irt->vrfs, bgp_vrf);
419 if (!listnode_head(irt->vrfs)) {
420 list_delete_and_null(&irt->vrfs);
421 vrf_import_rt_free(irt);
422 }
423 }
424
425 /*
426 * Map one RT to specified VNI.
427 */
428 static void map_vni_to_rt(struct bgp *bgp, struct bgpevpn *vpn,
429 struct ecommunity_val *eval)
430 {
431 struct irt_node *irt;
432 struct ecommunity_val eval_tmp;
433
434 /* If using "automatic" RT, we only care about the local-admin
435 * sub-field.
436 * This is to facilitate using VNI as the RT for EBGP peering too.
437 */
438 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
439 if (!is_import_rt_configured(vpn))
440 mask_ecom_global_admin(&eval_tmp, eval);
441
442 irt = lookup_import_rt(bgp, &eval_tmp);
443 if (irt && irt->vnis)
444 if (is_vni_present_in_irt_vnis(irt->vnis, vpn))
445 /* Already mapped. */
446 return;
447
448 if (!irt) {
449 irt = import_rt_new(bgp, &eval_tmp);
450 assert(irt);
451 }
452
453 /* Add VNI to the hash list for this RT. */
454 listnode_add(irt->vnis, vpn);
455 }
456
457 /*
458 * Unmap specified VNI from specified RT. If there are no other
459 * VNIs for this RT, then the RT hash is deleted.
460 */
461 static void unmap_vni_from_rt(struct bgp *bgp, struct bgpevpn *vpn,
462 struct irt_node *irt)
463 {
464 /* Delete VNI from hash list for this RT. */
465 listnode_delete(irt->vnis, vpn);
466 if (!listnode_head(irt->vnis)) {
467 list_delete_and_null(&irt->vnis);
468 import_rt_free(bgp, irt);
469 }
470 }
471
472 /*
473 * Create RT extended community automatically from passed information:
474 * of the form AS:VNI.
475 * NOTE: We use only the lower 16 bits of the AS. This is sufficient as
476 * the need is to get a RT value that will be unique across different
477 * VNIs but the same across routers (in the same AS) for a particular
478 * VNI.
479 */
480 static void form_auto_rt(struct bgp *bgp, vni_t vni, struct list *rtl)
481 {
482 struct ecommunity_val eval;
483 struct ecommunity *ecomadd;
484
485 encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
486
487 ecomadd = ecommunity_new();
488 ecommunity_add_val(ecomadd, &eval);
489 listnode_add_sort(rtl, ecomadd);
490 }
491
492 /*
493 * Derive RD and RT for a VNI automatically. Invoked at the time of
494 * creation of a VNI.
495 */
496 static void derive_rd_rt_for_vni(struct bgp *bgp, struct bgpevpn *vpn)
497 {
498 bgp_evpn_derive_auto_rd(bgp, vpn);
499 bgp_evpn_derive_auto_rt_import(bgp, vpn);
500 bgp_evpn_derive_auto_rt_export(bgp, vpn);
501 }
502
503 /*
504 * Add (update) or delete MACIP from zebra.
505 */
506 static int bgp_zebra_send_remote_macip(struct bgp *bgp, struct bgpevpn *vpn,
507 struct prefix_evpn *p,
508 struct in_addr remote_vtep_ip, int add,
509 u_char sticky)
510 {
511 struct stream *s;
512 int ipa_len;
513 char buf1[ETHER_ADDR_STRLEN];
514 char buf2[INET6_ADDRSTRLEN];
515 char buf3[INET6_ADDRSTRLEN];
516
517 /* Check socket. */
518 if (!zclient || zclient->sock < 0)
519 return 0;
520
521 /* Don't try to register if Zebra doesn't know of this instance. */
522 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
523 return 0;
524
525 s = zclient->obuf;
526 stream_reset(s);
527
528 zclient_create_header(s, add ? ZEBRA_REMOTE_MACIP_ADD
529 : ZEBRA_REMOTE_MACIP_DEL,
530 bgp->vrf_id);
531 stream_putl(s, vpn->vni);
532 stream_put(s, &p->prefix.mac.octet, ETH_ALEN); /* Mac Addr */
533 /* IP address length and IP address, if any. */
534 if (IS_EVPN_PREFIX_IPADDR_NONE(p))
535 stream_putl(s, 0);
536 else {
537 ipa_len = IS_EVPN_PREFIX_IPADDR_V4(p) ? IPV4_MAX_BYTELEN
538 : IPV6_MAX_BYTELEN;
539 stream_putl(s, ipa_len);
540 stream_put(s, &p->prefix.ip.ip.addr, ipa_len);
541 }
542 stream_put_in_addr(s, &remote_vtep_ip);
543
544 /* TX MAC sticky status */
545 if (add)
546 stream_putc(s, sticky);
547
548 stream_putw_at(s, 0, stream_get_endp(s));
549
550 if (bgp_debug_zebra(NULL))
551 zlog_debug("Tx %s MACIP, VNI %u %sMAC %s IP %s remote VTEP %s",
552 add ? "ADD" : "DEL", vpn->vni,
553 sticky ? "sticky " : "",
554 prefix_mac2str(&p->prefix.mac, buf1, sizeof(buf1)),
555 ipaddr2str(&p->prefix.ip, buf3, sizeof(buf3)),
556 inet_ntop(AF_INET, &remote_vtep_ip, buf2,
557 sizeof(buf2)));
558
559 return zclient_send_message(zclient);
560 }
561
562 /*
563 * Add (update) or delete remote VTEP from zebra.
564 */
565 static int bgp_zebra_send_remote_vtep(struct bgp *bgp, struct bgpevpn *vpn,
566 struct prefix_evpn *p, int add)
567 {
568 struct stream *s;
569
570 /* Check socket. */
571 if (!zclient || zclient->sock < 0)
572 return 0;
573
574 /* Don't try to register if Zebra doesn't know of this instance. */
575 if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
576 return 0;
577
578 s = zclient->obuf;
579 stream_reset(s);
580
581 zclient_create_header(s, add ? ZEBRA_REMOTE_VTEP_ADD
582 : ZEBRA_REMOTE_VTEP_DEL,
583 bgp->vrf_id);
584 stream_putl(s, vpn->vni);
585 if (IS_EVPN_PREFIX_IPADDR_V4(p))
586 stream_put_in_addr(s, &p->prefix.ip.ipaddr_v4);
587 else if (IS_EVPN_PREFIX_IPADDR_V6(p)) {
588 zlog_err(
589 "Bad remote IP when trying to %s remote VTEP for VNI %u",
590 add ? "ADD" : "DEL", vpn->vni);
591 return -1;
592 }
593
594 stream_putw_at(s, 0, stream_get_endp(s));
595
596 if (bgp_debug_zebra(NULL))
597 zlog_debug("Tx %s Remote VTEP, VNI %u remote VTEP %s",
598 add ? "ADD" : "DEL", vpn->vni,
599 inet_ntoa(p->prefix.ip.ipaddr_v4));
600
601 return zclient_send_message(zclient);
602 }
603
604 /*
605 * Build extended communities for EVPN prefix route.
606 */
607 static void build_evpn_type5_route_extcomm(struct bgp *bgp_vrf,
608 struct attr *attr)
609 {
610 struct ecommunity ecom_encap;
611 struct ecommunity ecom_rmac;
612 struct ecommunity_val eval;
613 struct ecommunity_val eval_rmac;
614 bgp_encap_types tnl_type;
615 struct listnode *node, *nnode;
616 struct ecommunity *ecom;
617 struct list *vrf_export_rtl = NULL;
618
619 /* Encap */
620 tnl_type = BGP_ENCAP_TYPE_VXLAN;
621 memset(&ecom_encap, 0, sizeof(ecom_encap));
622 encode_encap_extcomm(tnl_type, &eval);
623 ecom_encap.size = 1;
624 ecom_encap.val = (u_int8_t *)eval.val;
625
626 /* Add Encap */
627 attr->ecommunity = ecommunity_dup(&ecom_encap);
628
629 /* Add the export RTs for L3VNI/VRF */
630 vrf_export_rtl = bgp_vrf->vrf_export_rtl;
631 if (vrf_export_rtl && !list_isempty(vrf_export_rtl)) {
632 for (ALL_LIST_ELEMENTS(vrf_export_rtl, node, nnode, ecom))
633 attr->ecommunity = ecommunity_merge(attr->ecommunity,
634 ecom);
635 }
636
637 /* add the router mac extended community */
638 if (!is_zero_mac(&attr->rmac)) {
639 memset(&ecom_rmac, 0, sizeof(ecom_rmac));
640 encode_rmac_extcomm(&eval_rmac, &attr->rmac);
641 ecom_rmac.size = 1;
642 ecom_rmac.val = (uint8_t *)eval_rmac.val;
643 attr->ecommunity = ecommunity_merge(attr->ecommunity,
644 &ecom_rmac);
645 }
646
647 attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES);
648 }
649
650 /*
651 * Build extended communities for EVPN route. RT and ENCAP are
652 * applicable to all routes.
653 * TODO: currently kernel doesnt support ipv6 routes with ipv4 nexthops.
654 * This means that we can't do symmetric routing for ipv6 hosts routes
655 * in the same way as ipv4 host routes.
656 * We wont attach l3-vni related RTs for ipv6 routes.
657 * For now, We will only adevrtise ipv4 host routes
658 * with L3-VNI related ext-comm.
659 */
660 static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,
661 afi_t afi)
662 {
663 struct ecommunity ecom_encap;
664 struct ecommunity ecom_sticky;
665 struct ecommunity ecom_rmac;
666 struct ecommunity_val eval;
667 struct ecommunity_val eval_sticky;
668 struct ecommunity_val eval_rmac;
669 bgp_encap_types tnl_type;
670 struct listnode *node, *nnode;
671 struct ecommunity *ecom;
672 u_int32_t seqnum;
673 struct list *vrf_export_rtl = NULL;
674
675 /* Encap */
676 tnl_type = BGP_ENCAP_TYPE_VXLAN;
677 memset(&ecom_encap, 0, sizeof(ecom_encap));
678 encode_encap_extcomm(tnl_type, &eval);
679 ecom_encap.size = 1;
680 ecom_encap.val = (u_int8_t *)eval.val;
681
682 /* Add Encap */
683 attr->ecommunity = ecommunity_dup(&ecom_encap);
684
685 /* Add the export RTs for L2VNI */
686 for (ALL_LIST_ELEMENTS(vpn->export_rtl, node, nnode, ecom))
687 attr->ecommunity = ecommunity_merge(attr->ecommunity, ecom);
688
689 /* Add the export RTs for L3VNI - currently only supported for IPV4 host
690 * routes */
691 if (afi == AFI_IP) {
692 vrf_export_rtl = bgpevpn_get_vrf_export_rtl(vpn);
693 if (vrf_export_rtl && !list_isempty(vrf_export_rtl)) {
694 for (ALL_LIST_ELEMENTS(vrf_export_rtl, node, nnode,
695 ecom))
696 attr->ecommunity =
697 ecommunity_merge(attr->ecommunity,
698 ecom);
699 }
700 }
701
702 if (attr->sticky) {
703 seqnum = 0;
704 memset(&ecom_sticky, 0, sizeof(ecom_sticky));
705 encode_mac_mobility_extcomm(1, seqnum, &eval_sticky);
706 ecom_sticky.size = 1;
707 ecom_sticky.val = (u_int8_t *)eval_sticky.val;
708 attr->ecommunity =
709 ecommunity_merge(attr->ecommunity, &ecom_sticky);
710 }
711
712 if (afi == AFI_IP && !is_zero_mac(&attr->rmac)) {
713 memset(&ecom_rmac, 0, sizeof(ecom_rmac));
714 encode_rmac_extcomm(&eval_rmac, &attr->rmac);
715 ecom_rmac.size = 1;
716 ecom_rmac.val = (uint8_t *)eval_rmac.val;
717 attr->ecommunity = ecommunity_merge(attr->ecommunity,
718 &ecom_rmac);
719 }
720
721 attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES);
722 }
723
724 /*
725 * Add MAC mobility extended community to attribute.
726 */
727 static void add_mac_mobility_to_attr(u_int32_t seq_num, struct attr *attr)
728 {
729 struct ecommunity ecom_tmp;
730 struct ecommunity_val eval;
731 u_int8_t *ecom_val_ptr;
732 int i;
733 u_int8_t *pnt;
734 int type = 0;
735 int sub_type = 0;
736
737 /* Build MM */
738 encode_mac_mobility_extcomm(0, seq_num, &eval);
739
740 /* Find current MM ecommunity */
741 ecom_val_ptr = NULL;
742
743 if (attr->ecommunity) {
744 for (i = 0; i < attr->ecommunity->size; i++) {
745 pnt = attr->ecommunity->val + (i * 8);
746 type = *pnt++;
747 sub_type = *pnt++;
748
749 if (type == ECOMMUNITY_ENCODE_EVPN
750 && sub_type
751 == ECOMMUNITY_EVPN_SUBTYPE_MACMOBILITY) {
752 ecom_val_ptr =
753 (u_int8_t *)(attr->ecommunity->val
754 + (i * 8));
755 break;
756 }
757 }
758 }
759
760 /* Update the existing MM ecommunity */
761 if (ecom_val_ptr) {
762 memcpy(ecom_val_ptr, eval.val, sizeof(char) * ECOMMUNITY_SIZE);
763 }
764 /* Add MM to existing */
765 else {
766 memset(&ecom_tmp, 0, sizeof(ecom_tmp));
767 ecom_tmp.size = 1;
768 ecom_tmp.val = (u_int8_t *)eval.val;
769
770 attr->ecommunity =
771 ecommunity_merge(attr->ecommunity, &ecom_tmp);
772 }
773 }
774
775 /* Install EVPN route into zebra. */
776 static int evpn_zebra_install(struct bgp *bgp, struct bgpevpn *vpn,
777 struct prefix_evpn *p,
778 struct in_addr remote_vtep_ip, u_char sticky)
779 {
780 int ret;
781
782 if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE)
783 ret = bgp_zebra_send_remote_macip(bgp, vpn, p, remote_vtep_ip,
784 1, sticky);
785 else
786 ret = bgp_zebra_send_remote_vtep(bgp, vpn, p, 1);
787
788 return ret;
789 }
790
791 /* Uninstall EVPN route from zebra. */
792 static int evpn_zebra_uninstall(struct bgp *bgp, struct bgpevpn *vpn,
793 struct prefix_evpn *p,
794 struct in_addr remote_vtep_ip)
795 {
796 int ret;
797
798 if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE)
799 ret = bgp_zebra_send_remote_macip(bgp, vpn, p, remote_vtep_ip,
800 0, 0);
801 else
802 ret = bgp_zebra_send_remote_vtep(bgp, vpn, p, 0);
803
804 return ret;
805 }
806
807 /*
808 * Due to MAC mobility, the prior "local" best route has been supplanted
809 * by a "remote" best route. The prior route has to be deleted and withdrawn
810 * from peers.
811 */
812 static void evpn_delete_old_local_route(struct bgp *bgp, struct bgpevpn *vpn,
813 struct bgp_node *rn,
814 struct bgp_info *old_local)
815 {
816 struct bgp_node *global_rn;
817 struct bgp_info *ri;
818 afi_t afi = AFI_L2VPN;
819 safi_t safi = SAFI_EVPN;
820
821 /* Locate route node in the global EVPN routing table. Note that
822 * this table is a 2-level tree (RD-level + Prefix-level) similar to
823 * L3VPN routes.
824 */
825 global_rn = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi,
826 (struct prefix *)&rn->p, &vpn->prd);
827 if (global_rn) {
828 /* Delete route entry in the global EVPN table. */
829 delete_evpn_route_entry(bgp, vpn, afi, safi, global_rn, &ri);
830
831 /* Schedule for processing - withdraws to peers happen from
832 * this table.
833 */
834 if (ri)
835 bgp_process(bgp, global_rn, afi, safi);
836 bgp_unlock_node(global_rn);
837 }
838
839 /* Delete route entry in the VNI route table, caller to remove. */
840 bgp_info_delete(rn, old_local);
841 }
842
843 /*
844 * Calculate the best path for an EVPN route. Install/update best path in zebra,
845 * if appropriate.
846 */
847 static int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
848 struct bgp_node *rn)
849 {
850 struct bgp_info *old_select, *new_select;
851 struct bgp_info_pair old_and_new;
852 afi_t afi = AFI_L2VPN;
853 safi_t safi = SAFI_EVPN;
854 int ret = 0;
855
856 /* Compute the best path. */
857 bgp_best_selection(bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new,
858 afi, safi);
859 old_select = old_and_new.old;
860 new_select = old_and_new.new;
861
862 /* If the best path hasn't changed - see if there is still something to
863 * update
864 * to zebra RIB.
865 */
866 if (old_select && old_select == new_select
867 && old_select->type == ZEBRA_ROUTE_BGP
868 && old_select->sub_type == BGP_ROUTE_NORMAL
869 && !CHECK_FLAG(rn->flags, BGP_NODE_USER_CLEAR)
870 && !CHECK_FLAG(old_select->flags, BGP_INFO_ATTR_CHANGED)
871 && !bgp->addpath_tx_used[afi][safi]) {
872 if (bgp_zebra_has_route_changed(rn, old_select))
873 ret = evpn_zebra_install(bgp, vpn,
874 (struct prefix_evpn *)&rn->p,
875 old_select->attr->nexthop,
876 old_select->attr->sticky);
877 UNSET_FLAG(old_select->flags, BGP_INFO_MULTIPATH_CHG);
878 bgp_zebra_clear_route_change_flags(rn);
879 return ret;
880 }
881
882 /* If the user did a "clear" this flag will be set */
883 UNSET_FLAG(rn->flags, BGP_NODE_USER_CLEAR);
884
885 /* bestpath has changed; update relevant fields and install or uninstall
886 * into the zebra RIB.
887 */
888 if (old_select || new_select)
889 bgp_bump_version(rn);
890
891 if (old_select)
892 bgp_info_unset_flag(rn, old_select, BGP_INFO_SELECTED);
893 if (new_select) {
894 bgp_info_set_flag(rn, new_select, BGP_INFO_SELECTED);
895 bgp_info_unset_flag(rn, new_select, BGP_INFO_ATTR_CHANGED);
896 UNSET_FLAG(new_select->flags, BGP_INFO_MULTIPATH_CHG);
897 }
898
899 if (new_select && new_select->type == ZEBRA_ROUTE_BGP
900 && new_select->sub_type == BGP_ROUTE_NORMAL) {
901 ret = evpn_zebra_install(bgp, vpn, (struct prefix_evpn *)&rn->p,
902 new_select->attr->nexthop,
903 new_select->attr->sticky);
904 /* If an old best existed and it was a "local" route, the only
905 * reason
906 * it would be supplanted is due to MAC mobility procedures. So,
907 * we
908 * need to do an implicit delete and withdraw that route from
909 * peers.
910 */
911 if (old_select && old_select->peer == bgp->peer_self
912 && old_select->type == ZEBRA_ROUTE_BGP
913 && old_select->sub_type == BGP_ROUTE_STATIC)
914 evpn_delete_old_local_route(bgp, vpn, rn, old_select);
915 } else {
916 if (old_select && old_select->type == ZEBRA_ROUTE_BGP
917 && old_select->sub_type == BGP_ROUTE_NORMAL)
918 ret = evpn_zebra_uninstall(bgp, vpn,
919 (struct prefix_evpn *)&rn->p,
920 old_select->attr->nexthop);
921 }
922
923 /* Clear any route change flags. */
924 bgp_zebra_clear_route_change_flags(rn);
925
926 /* Reap old select bgp_info, if it has been removed */
927 if (old_select && CHECK_FLAG(old_select->flags, BGP_INFO_REMOVED))
928 bgp_info_reap(rn, old_select);
929
930 return ret;
931 }
932
933
934 /*
935 * Return true if the local ri for this rn has sticky set
936 */
937 static int evpn_route_is_sticky(struct bgp *bgp, struct bgp_node *rn)
938 {
939 struct bgp_info *tmp_ri;
940 struct bgp_info *local_ri;
941
942 local_ri = NULL;
943 for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next) {
944 if (tmp_ri->peer == bgp->peer_self
945 && tmp_ri->type == ZEBRA_ROUTE_BGP
946 && tmp_ri->sub_type == BGP_ROUTE_STATIC)
947 local_ri = tmp_ri;
948 }
949
950 if (!local_ri)
951 return 0;
952
953 return local_ri->attr->sticky;
954 }
955
956 static int update_evpn_type5_route_entry(struct bgp *bgp_def,
957 struct bgp *bgp_vrf, afi_t afi,
958 safi_t safi, struct bgp_node *rn,
959 struct attr *attr)
960 {
961 struct attr *attr_new = NULL;
962 struct bgp_info *ri = NULL;
963 mpls_label_t label = MPLS_INVALID_LABEL;
964 struct bgp_info *local_ri = NULL;
965 struct bgp_info *tmp_ri = NULL;
966
967
968 /* locate the local route entry if any */
969 for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next) {
970 if (tmp_ri->peer == bgp_def->peer_self
971 && tmp_ri->type == ZEBRA_ROUTE_BGP
972 && tmp_ri->sub_type == BGP_ROUTE_STATIC)
973 local_ri = tmp_ri;
974 }
975
976 /* create a new route entry if one doesnt exist.
977 Otherwise see if route attr has changed */
978 if (!local_ri) {
979
980 /* Add (or update) attribute to hash. */
981 attr_new = bgp_attr_intern(attr);
982
983 /* create the route info from attribute */
984 ri = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_STATIC, 0,
985 bgp_def->peer_self, attr_new, rn);
986 SET_FLAG(ri->flags, BGP_INFO_VALID);
987
988 /* L3-VNI goes in the label2 field */
989 bgp_info_extra_get(ri);
990 vni2label(bgp_vrf->l3vni, &label);
991 memcpy(&ri->extra->label2, &label, BGP_LABEL_BYTES);
992
993 /* add the route entry to route node*/
994 bgp_info_add(rn, ri);
995 } else {
996
997 tmp_ri = local_ri;
998 if (!attrhash_cmp(tmp_ri->attr, attr)) {
999 /* The attribute has changed. */
1000 /* Add (or update) attribute to hash. */
1001 attr_new = bgp_attr_intern(attr);
1002 bgp_info_set_flag(rn, tmp_ri, BGP_INFO_ATTR_CHANGED);
1003
1004 /* Restore route, if needed. */
1005 if (CHECK_FLAG(tmp_ri->flags, BGP_INFO_REMOVED))
1006 bgp_info_restore(rn, tmp_ri);
1007
1008 /* Unintern existing, set to new. */
1009 bgp_attr_unintern(&tmp_ri->attr);
1010 tmp_ri->attr = attr_new;
1011 tmp_ri->uptime = bgp_clock();
1012 }
1013 }
1014 return 0;
1015 }
1016
1017 /* update evpn type-5 route entry */
1018 static int update_evpn_type5_route(struct bgp *bgp_vrf,
1019 struct prefix_evpn *evp)
1020 {
1021 afi_t afi = AFI_L2VPN;
1022 safi_t safi = SAFI_EVPN;
1023 struct attr attr;
1024 struct bgp_node *rn = NULL;
1025 struct bgp *bgp_def = NULL;
1026
1027 bgp_def = bgp_get_default();
1028 if (!bgp_def)
1029 return -1;
1030
1031 /* build path attribute for this route */
1032 memset(&attr, 0, sizeof(struct attr));
1033 bgp_attr_default_set(&attr, BGP_ORIGIN_IGP);
1034 attr.nexthop = bgp_vrf->originator_ip;
1035 attr.mp_nexthop_global_in = bgp_vrf->originator_ip;
1036 attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
1037 memcpy(&attr.rmac, &bgp_vrf->rmac, sizeof(struct ethaddr));
1038
1039 /* Setup RT and encap extended community */
1040 build_evpn_type5_route_extcomm(bgp_vrf, &attr);
1041
1042 /* get the route node in global table */
1043 rn = bgp_afi_node_get(bgp_def->rib[afi][safi], afi, safi,
1044 (struct prefix *)evp,
1045 &bgp_vrf->vrf_prd);
1046 assert(rn);
1047
1048 /* create or update the route entry within the route node */
1049 update_evpn_type5_route_entry(bgp_def, bgp_vrf,
1050 afi, safi,
1051 rn, &attr);
1052
1053 /* schedule for processing and unlock node */
1054 bgp_process(bgp_def, rn, afi, safi);
1055 bgp_unlock_node(rn);
1056
1057 /* uninten temporary */
1058 aspath_unintern(&attr.aspath);
1059 return 0;
1060 }
1061
1062 /*
1063 * Create or update EVPN route entry. This could be in the VNI route table
1064 * or the global route table.
1065 */
1066 static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
1067 afi_t afi, safi_t safi, struct bgp_node *rn,
1068 struct attr *attr, int add, int vni_table,
1069 struct bgp_info **ri, u_char flags)
1070 {
1071 struct bgp_info *tmp_ri;
1072 struct bgp_info *local_ri, *remote_ri;
1073 struct attr *attr_new;
1074 mpls_label_t label = MPLS_INVALID_LABEL;
1075 int route_change = 1;
1076 u_char sticky = 0;
1077
1078 *ri = NULL;
1079
1080 /* See if this is an update of an existing route, or a new add. Also,
1081 * identify if already known from remote, and if so, the one with the
1082 * highest sequence number; this is only when adding to the VNI routing
1083 * table.
1084 */
1085 local_ri = remote_ri = NULL;
1086 for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next) {
1087 if (tmp_ri->peer == bgp->peer_self
1088 && tmp_ri->type == ZEBRA_ROUTE_BGP
1089 && tmp_ri->sub_type == BGP_ROUTE_STATIC)
1090 local_ri = tmp_ri;
1091 if (vni_table) {
1092 if (tmp_ri->type == ZEBRA_ROUTE_BGP
1093 && tmp_ri->sub_type == BGP_ROUTE_NORMAL
1094 && CHECK_FLAG(tmp_ri->flags, BGP_INFO_VALID)) {
1095 if (!remote_ri)
1096 remote_ri = tmp_ri;
1097 else if (mac_mobility_seqnum(tmp_ri->attr)
1098 > mac_mobility_seqnum(remote_ri->attr))
1099 remote_ri = tmp_ri;
1100 }
1101 }
1102 }
1103
1104 /* If route doesn't exist already, create a new one, if told to.
1105 * Otherwise act based on whether the attributes of the route have
1106 * changed or not.
1107 */
1108 if (!local_ri && !add)
1109 return 0;
1110
1111 if (!local_ri) {
1112 /* When learnt locally for the first time but already known from
1113 * remote, we have to initiate appropriate MAC mobility steps.
1114 * This
1115 * is applicable when updating the VNI routing table.
1116 * We need to skip mobility steps for g/w macs (local mac on g/w
1117 * SVI) advertised in EVPN.
1118 * This will ensure that local routes are preferred for g/w macs
1119 */
1120 if (remote_ri && !CHECK_FLAG(flags, ZEBRA_MAC_TYPE_GW)) {
1121 u_int32_t cur_seqnum;
1122
1123 /* Add MM extended community to route. */
1124 cur_seqnum = mac_mobility_seqnum(remote_ri->attr);
1125 add_mac_mobility_to_attr(cur_seqnum + 1, attr);
1126 }
1127
1128 /* Add (or update) attribute to hash. */
1129 attr_new = bgp_attr_intern(attr);
1130
1131 /* Extract MAC mobility sequence number, if any. */
1132 attr_new->mm_seqnum =
1133 bgp_attr_mac_mobility_seqnum(attr_new, &sticky);
1134 attr_new->sticky = sticky;
1135
1136 /* Create new route with its attribute. */
1137 tmp_ri = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_STATIC, 0,
1138 bgp->peer_self, attr_new, rn);
1139 SET_FLAG(tmp_ri->flags, BGP_INFO_VALID);
1140 bgp_info_extra_get(tmp_ri);
1141
1142 /* The VNI goes into the 'label' field of the route */
1143 vni2label(vpn->vni, &label);
1144
1145 memcpy(&tmp_ri->extra->label, &label, BGP_LABEL_BYTES);
1146 bgp_info_add(rn, tmp_ri);
1147 } else {
1148 tmp_ri = local_ri;
1149 if (attrhash_cmp(tmp_ri->attr, attr)
1150 && !CHECK_FLAG(tmp_ri->flags, BGP_INFO_REMOVED))
1151 route_change = 0;
1152 else {
1153 /* The attribute has changed. */
1154 /* Add (or update) attribute to hash. */
1155 attr_new = bgp_attr_intern(attr);
1156 bgp_info_set_flag(rn, tmp_ri, BGP_INFO_ATTR_CHANGED);
1157
1158 /* Restore route, if needed. */
1159 if (CHECK_FLAG(tmp_ri->flags, BGP_INFO_REMOVED))
1160 bgp_info_restore(rn, tmp_ri);
1161
1162 /* Unintern existing, set to new. */
1163 bgp_attr_unintern(&tmp_ri->attr);
1164 tmp_ri->attr = attr_new;
1165 tmp_ri->uptime = bgp_clock();
1166 }
1167 }
1168
1169 /* Return back the route entry. */
1170 *ri = tmp_ri;
1171 return route_change;
1172 }
1173
1174 /*
1175 * Create or update EVPN route (of type based on prefix) for specified VNI
1176 * and schedule for processing.
1177 */
1178 static int update_evpn_route(struct bgp *bgp, struct bgpevpn *vpn,
1179 struct prefix_evpn *p, u_char flags)
1180 {
1181 struct bgp_node *rn;
1182 struct attr attr;
1183 struct attr *attr_new;
1184 struct bgp_info *ri;
1185 afi_t afi = AFI_L2VPN;
1186 safi_t safi = SAFI_EVPN;
1187 int route_change;
1188
1189 memset(&attr, 0, sizeof(struct attr));
1190
1191 /* Build path-attribute for this route. */
1192 bgp_attr_default_set(&attr, BGP_ORIGIN_IGP);
1193 attr.nexthop = vpn->originator_ip;
1194 attr.mp_nexthop_global_in = vpn->originator_ip;
1195 attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
1196 attr.sticky = CHECK_FLAG(flags, ZEBRA_MAC_TYPE_STICKY) ? 1 : 0;
1197 bgpevpn_get_rmac(vpn, &attr.rmac);
1198
1199 /* Set up RT and ENCAP extended community. */
1200 build_evpn_route_extcomm(vpn, &attr,
1201 IS_EVPN_PREFIX_IPADDR_V4(p) ?
1202 AFI_IP : AFI_IP6);
1203
1204 /* First, create (or fetch) route node within the VNI. */
1205 /* NOTE: There is no RD here. */
1206 rn = bgp_node_get(vpn->route_table, (struct prefix *)p);
1207
1208 /* Create or update route entry. */
1209 route_change = update_evpn_route_entry(bgp, vpn, afi, safi, rn, &attr,
1210 1, 1, &ri, flags);
1211 assert(ri);
1212 attr_new = ri->attr;
1213
1214 /* Perform route selection; this is just to set the flags correctly
1215 * as local route in the VNI always wins.
1216 */
1217 evpn_route_select_install(bgp, vpn, rn);
1218 bgp_unlock_node(rn);
1219
1220 /* If this is a new route or some attribute has changed, export the
1221 * route to the global table. The route will be advertised to peers
1222 * from there. Note that this table is a 2-level tree (RD-level +
1223 * Prefix-level) similar to L3VPN routes.
1224 */
1225 if (route_change) {
1226 struct bgp_info *global_ri;
1227
1228 rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi,
1229 (struct prefix *)p, &vpn->prd);
1230 update_evpn_route_entry(bgp, vpn, afi, safi, rn, attr_new, 1, 0,
1231 &global_ri, flags);
1232
1233 /* Schedule for processing and unlock node. */
1234 bgp_process(bgp, rn, afi, safi);
1235 bgp_unlock_node(rn);
1236 }
1237
1238 /* Unintern temporary. */
1239 aspath_unintern(&attr.aspath);
1240
1241 return 0;
1242 }
1243
1244 /* Delete EVPN type5 route entry from global table */
1245 static void delete_evpn_type5_route_entry(struct bgp *bgp_def,
1246 struct bgp *bgp_vrf,
1247 afi_t afi, safi_t safi,
1248 struct bgp_node *rn,
1249 struct bgp_info **ri)
1250 {
1251 struct bgp_info *tmp_ri = NULL;
1252
1253 *ri = NULL;
1254
1255 /* find the matching route entry */
1256 for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next)
1257 if (tmp_ri->peer == bgp_def->peer_self
1258 && tmp_ri->type == ZEBRA_ROUTE_BGP
1259 && tmp_ri->sub_type == BGP_ROUTE_STATIC)
1260 break;
1261
1262 *ri = tmp_ri;
1263
1264 /* Mark route for delete. */
1265 if (tmp_ri)
1266 bgp_info_delete(rn, tmp_ri);
1267 }
1268
1269 /* Delete EVPN type5 route */
1270 static int delete_evpn_type5_route(struct bgp *bgp_vrf,
1271 struct prefix_evpn *evp)
1272 {
1273 afi_t afi = AFI_L2VPN;
1274 safi_t safi = SAFI_EVPN;
1275 struct bgp_node *rn = NULL;
1276 struct bgp_info *ri = NULL;
1277 struct bgp *bgp_def = NULL; /* default bgp instance */
1278
1279 bgp_def = bgp_get_default();
1280 if (!bgp_def)
1281 return -1;
1282
1283 /* locate the global route entry for this type-5 prefix */
1284 rn = bgp_afi_node_lookup(bgp_def->rib[afi][safi], afi, safi,
1285 (struct prefix *)evp, &bgp_vrf->vrf_prd);
1286 if (!rn)
1287 return 0;
1288
1289 delete_evpn_type5_route_entry(bgp_def, bgp_vrf, afi, safi, rn, &ri);
1290 if (ri)
1291 bgp_process(bgp_def, rn, afi, safi);
1292 bgp_unlock_node(rn);
1293 return 0;
1294 }
1295
1296 /*
1297 * Delete EVPN route entry. This could be in the VNI route table
1298 * or the global route table.
1299 */
1300 static void delete_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
1301 afi_t afi, safi_t safi, struct bgp_node *rn,
1302 struct bgp_info **ri)
1303 {
1304 struct bgp_info *tmp_ri;
1305
1306 *ri = NULL;
1307
1308 /* Now, find matching route. */
1309 for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next)
1310 if (tmp_ri->peer == bgp->peer_self
1311 && tmp_ri->type == ZEBRA_ROUTE_BGP
1312 && tmp_ri->sub_type == BGP_ROUTE_STATIC)
1313 break;
1314
1315 *ri = tmp_ri;
1316
1317 /* Mark route for delete. */
1318 if (tmp_ri)
1319 bgp_info_delete(rn, tmp_ri);
1320 }
1321
1322 /*
1323 * Delete EVPN route (of type based on prefix) for specified VNI and
1324 * schedule for processing.
1325 */
1326 static int delete_evpn_route(struct bgp *bgp, struct bgpevpn *vpn,
1327 struct prefix_evpn *p)
1328 {
1329 struct bgp_node *rn, *global_rn;
1330 struct bgp_info *ri;
1331 afi_t afi = AFI_L2VPN;
1332 safi_t safi = SAFI_EVPN;
1333
1334 /* First, locate the route node within the VNI. If it doesn't exist,
1335 * there
1336 * is nothing further to do.
1337 */
1338 /* NOTE: There is no RD here. */
1339 rn = bgp_node_lookup(vpn->route_table, (struct prefix *)p);
1340 if (!rn)
1341 return 0;
1342
1343 /* Next, locate route node in the global EVPN routing table. Note that
1344 * this table is a 2-level tree (RD-level + Prefix-level) similar to
1345 * L3VPN routes.
1346 */
1347 global_rn = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi,
1348 (struct prefix *)p, &vpn->prd);
1349 if (global_rn) {
1350 /* Delete route entry in the global EVPN table. */
1351 delete_evpn_route_entry(bgp, vpn, afi, safi, global_rn, &ri);
1352
1353 /* Schedule for processing - withdraws to peers happen from
1354 * this table.
1355 */
1356 if (ri)
1357 bgp_process(bgp, global_rn, afi, safi);
1358 bgp_unlock_node(global_rn);
1359 }
1360
1361 /* Delete route entry in the VNI route table. This can just be removed.
1362 */
1363 delete_evpn_route_entry(bgp, vpn, afi, safi, rn, &ri);
1364 if (ri)
1365 bgp_info_reap(rn, ri);
1366 bgp_unlock_node(rn);
1367
1368 return 0;
1369 }
1370
1371 /*
1372 * Update all type-2 (MACIP) local routes for this VNI - these should also
1373 * be scheduled for advertise to peers.
1374 */
1375 static int update_all_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
1376 {
1377 afi_t afi;
1378 safi_t safi;
1379 struct bgp_node *rn;
1380 struct bgp_info *ri;
1381 struct attr attr;
1382 struct attr attr_sticky;
1383 struct attr attr_ip6;
1384 struct attr attr_sticky_ip6;
1385 struct attr *attr_new;
1386
1387 afi = AFI_L2VPN;
1388 safi = SAFI_EVPN;
1389 memset(&attr, 0, sizeof(struct attr));
1390 memset(&attr_sticky, 0, sizeof(struct attr));
1391 memset(&attr_ip6, 0, sizeof(struct attr));
1392 memset(&attr_sticky_ip6, 0, sizeof(struct attr));
1393
1394 /* Build path-attribute - all type-2 routes for this VNI will share the
1395 * same path attribute.
1396 */
1397 bgp_attr_default_set(&attr, BGP_ORIGIN_IGP);
1398 bgp_attr_default_set(&attr_sticky, BGP_ORIGIN_IGP);
1399 attr.nexthop = vpn->originator_ip;
1400 attr.mp_nexthop_global_in = vpn->originator_ip;
1401 attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
1402 bgpevpn_get_rmac(vpn, &attr.rmac);
1403 attr_sticky.nexthop = vpn->originator_ip;
1404 attr_sticky.mp_nexthop_global_in = vpn->originator_ip;
1405 attr_sticky.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
1406 attr_sticky.sticky = 1;
1407 bgpevpn_get_rmac(vpn, &attr_sticky.rmac);
1408 bgp_attr_default_set(&attr_ip6, BGP_ORIGIN_IGP);
1409 bgp_attr_default_set(&attr_sticky_ip6, BGP_ORIGIN_IGP);
1410 attr_ip6.nexthop = vpn->originator_ip;
1411 attr_ip6.mp_nexthop_global_in = vpn->originator_ip;
1412 attr_ip6.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
1413 bgpevpn_get_rmac(vpn, &attr_ip6.rmac);
1414 attr_sticky_ip6.nexthop = vpn->originator_ip;
1415 attr_sticky_ip6.mp_nexthop_global_in = vpn->originator_ip;
1416 attr_sticky_ip6.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
1417 attr_sticky_ip6.sticky = 1;
1418 bgpevpn_get_rmac(vpn, &attr_sticky_ip6.rmac);
1419
1420 /* Set up RT, ENCAP and sticky MAC extended community. */
1421 build_evpn_route_extcomm(vpn, &attr, AFI_IP);
1422 build_evpn_route_extcomm(vpn, &attr_sticky, AFI_IP);
1423 build_evpn_route_extcomm(vpn, &attr_ip6, AFI_IP6);
1424 build_evpn_route_extcomm(vpn, &attr_sticky_ip6, AFI_IP6);
1425
1426 /* Walk this VNI's route table and update local type-2 routes. For any
1427 * routes updated, update corresponding entry in the global table too.
1428 */
1429 for (rn = bgp_table_top(vpn->route_table); rn;
1430 rn = bgp_route_next(rn)) {
1431 struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
1432 struct bgp_node *rd_rn;
1433 struct bgp_info *global_ri;
1434
1435 if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
1436 continue;
1437
1438 if (IS_EVPN_PREFIX_IPADDR_V4(evp)) {
1439 if (evpn_route_is_sticky(bgp, rn))
1440 update_evpn_route_entry(bgp, vpn, afi, safi, rn,
1441 &attr_sticky, 0, 1,
1442 &ri, 0);
1443 else
1444 update_evpn_route_entry(bgp, vpn, afi, safi, rn,
1445 &attr, 0, 1, &ri, 0);
1446 } else {
1447 if (evpn_route_is_sticky(bgp, rn))
1448 update_evpn_route_entry(bgp, vpn, afi, safi, rn,
1449 &attr_sticky_ip6, 0, 1,
1450 &ri, 0);
1451 else
1452 update_evpn_route_entry(bgp, vpn, afi, safi, rn,
1453 &attr_ip6, 0, 1,
1454 &ri, 0);
1455 }
1456
1457 /* If a local route exists for this prefix, we need to update
1458 * the global routing table too.
1459 */
1460 if (!ri)
1461 continue;
1462
1463 /* Perform route selection; this is just to set the flags
1464 * correctly
1465 * as local route in the VNI always wins.
1466 */
1467 evpn_route_select_install(bgp, vpn, rn);
1468
1469 attr_new = ri->attr;
1470
1471 /* Update route in global routing table. */
1472 rd_rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi,
1473 (struct prefix *)evp, &vpn->prd);
1474 assert(rd_rn);
1475 update_evpn_route_entry(bgp, vpn, afi, safi, rd_rn, attr_new, 0,
1476 0, &global_ri, 0);
1477
1478 /* Schedule for processing and unlock node. */
1479 bgp_process(bgp, rd_rn, afi, safi);
1480 bgp_unlock_node(rd_rn);
1481 }
1482
1483 /* Unintern temporary. */
1484 aspath_unintern(&attr.aspath);
1485 aspath_unintern(&attr_sticky.aspath);
1486
1487 return 0;
1488 }
1489
1490 /*
1491 * Delete all type-2 (MACIP) local routes for this VNI - only from the
1492 * global routing table. These are also scheduled for withdraw from peers.
1493 */
1494 static int delete_global_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
1495 {
1496 afi_t afi;
1497 safi_t safi;
1498 struct bgp_node *rdrn, *rn;
1499 struct bgp_table *table;
1500 struct bgp_info *ri;
1501
1502 afi = AFI_L2VPN;
1503 safi = SAFI_EVPN;
1504
1505 rdrn = bgp_node_lookup(bgp->rib[afi][safi], (struct prefix *)&vpn->prd);
1506 if (rdrn && rdrn->info) {
1507 table = (struct bgp_table *)rdrn->info;
1508 for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
1509 struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
1510
1511 if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
1512 continue;
1513
1514 delete_evpn_route_entry(bgp, vpn, afi, safi, rn, &ri);
1515 if (ri)
1516 bgp_process(bgp, rn, afi, safi);
1517 }
1518 }
1519
1520 /* Unlock RD node. */
1521 if (rdrn)
1522 bgp_unlock_node(rdrn);
1523
1524 return 0;
1525 }
1526
1527 /*
1528 * Delete all type-2 (MACIP) local routes for this VNI - from the global
1529 * table as well as the per-VNI route table.
1530 */
1531 static int delete_all_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
1532 {
1533 afi_t afi;
1534 safi_t safi;
1535 struct bgp_node *rn;
1536 struct bgp_info *ri;
1537
1538 afi = AFI_L2VPN;
1539 safi = SAFI_EVPN;
1540
1541 /* First, walk the global route table for this VNI's type-2 local
1542 * routes.
1543 * EVPN routes are a 2-level table, first get the RD table.
1544 */
1545 delete_global_type2_routes(bgp, vpn);
1546
1547 /* Next, walk this VNI's route table and delete local type-2 routes. */
1548 for (rn = bgp_table_top(vpn->route_table); rn;
1549 rn = bgp_route_next(rn)) {
1550 struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
1551
1552 if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
1553 continue;
1554
1555 delete_evpn_route_entry(bgp, vpn, afi, safi, rn, &ri);
1556
1557 /* Route entry in local table gets deleted immediately. */
1558 if (ri)
1559 bgp_info_reap(rn, ri);
1560 }
1561
1562 return 0;
1563 }
1564
1565 /*
1566 * Delete all routes in the per-VNI route table.
1567 */
1568 static int delete_all_vni_routes(struct bgp *bgp, struct bgpevpn *vpn)
1569 {
1570 struct bgp_node *rn;
1571 struct bgp_info *ri, *nextri;
1572
1573 /* Walk this VNI's route table and delete all routes. */
1574 for (rn = bgp_table_top(vpn->route_table); rn;
1575 rn = bgp_route_next(rn)) {
1576 for (ri = rn->info; (ri != NULL) && (nextri = ri->next, 1);
1577 ri = nextri) {
1578 bgp_info_delete(rn, ri);
1579 bgp_info_reap(rn, ri);
1580 }
1581 }
1582
1583 return 0;
1584 }
1585
1586 /*
1587 * Update (and advertise) local routes for a VNI. Invoked upon the VNI
1588 * export RT getting modified or change to tunnel IP. Note that these
1589 * situations need the route in the per-VNI table as well as the global
1590 * table to be updated (as attributes change).
1591 */
1592 static int update_routes_for_vni(struct bgp *bgp, struct bgpevpn *vpn)
1593 {
1594 int ret;
1595 struct prefix_evpn p;
1596
1597 /* Update and advertise the type-3 route (only one) followed by the
1598 * locally learnt type-2 routes (MACIP) - for this VNI.
1599 */
1600 build_evpn_type3_prefix(&p, vpn->originator_ip);
1601 ret = update_evpn_route(bgp, vpn, &p, 0);
1602 if (ret)
1603 return ret;
1604
1605 return update_all_type2_routes(bgp, vpn);
1606 }
1607
1608 /*
1609 * Delete (and withdraw) local routes for specified VNI from the global
1610 * table and per-VNI table. After this, remove all other routes from
1611 * the per-VNI table. Invoked upon the VNI being deleted or EVPN
1612 * (advertise-all-vni) being disabled.
1613 */
1614 static int delete_routes_for_vni(struct bgp *bgp, struct bgpevpn *vpn)
1615 {
1616 int ret;
1617 struct prefix_evpn p;
1618
1619 /* Delete and withdraw locally learnt type-2 routes (MACIP)
1620 * followed by type-3 routes (only one) - for this VNI.
1621 */
1622 ret = delete_all_type2_routes(bgp, vpn);
1623 if (ret)
1624 return ret;
1625
1626 build_evpn_type3_prefix(&p, vpn->originator_ip);
1627 ret = delete_evpn_route(bgp, vpn, &p);
1628 if (ret)
1629 return ret;
1630
1631 /* Delete all routes from the per-VNI table. */
1632 return delete_all_vni_routes(bgp, vpn);
1633 }
1634
1635 /*
1636 * There is a tunnel endpoint IP address change for this VNI,
1637 * need to re-advertise routes with the new nexthop.
1638 */
1639 static int handle_tunnel_ip_change(struct bgp *bgp, struct bgpevpn *vpn,
1640 struct in_addr originator_ip)
1641 {
1642 struct prefix_evpn p;
1643
1644 /* If VNI is not live, we only need to update the originator ip */
1645 if (!is_vni_live(vpn)) {
1646 vpn->originator_ip = originator_ip;
1647 return 0;
1648 }
1649
1650 /* Update the tunnel-ip hash */
1651 bgp_tip_del(bgp, &vpn->originator_ip);
1652 bgp_tip_add(bgp, &originator_ip);
1653
1654 /* filter routes as martian nexthop db has changed */
1655 bgp_filter_evpn_routes_upon_martian_nh_change(bgp);
1656
1657 /* Need to withdraw type-3 route as the originator IP is part
1658 * of the key.
1659 */
1660 build_evpn_type3_prefix(&p, vpn->originator_ip);
1661 delete_evpn_route(bgp, vpn, &p);
1662
1663 /* Update the tunnel IP and re-advertise all routes for this VNI. */
1664 vpn->originator_ip = originator_ip;
1665 return update_routes_for_vni(bgp, vpn);
1666 }
1667
1668 /*
1669 * Install route entry into the VRF routing table and invoke route selection.
1670 */
1671 static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
1672 struct prefix_evpn *evp,
1673 struct bgp_info *parent_ri)
1674 {
1675 struct bgp_node *rn;
1676 struct bgp_info *ri;
1677 struct attr *attr_new;
1678 int ret = 0;
1679 struct prefix p;
1680 struct prefix *pp = &p;
1681 afi_t afi = 0;
1682 safi_t safi = 0;
1683 char buf[PREFIX_STRLEN];
1684 char buf1[PREFIX_STRLEN];
1685
1686 memset(pp, 0, sizeof(struct prefix));
1687 ip_prefix_from_type2_prefix(evp, pp);
1688
1689 if (bgp_debug_zebra(NULL)) {
1690 zlog_debug("installing evpn prefix %s as ip prefix %s in vrf %s",
1691 prefix2str(evp, buf, sizeof(buf)),
1692 prefix2str(pp, buf1, sizeof(buf)),
1693 vrf_id_to_name(bgp_vrf->vrf_id));
1694 }
1695
1696 /* Create (or fetch) route within the VRF. */
1697 /* NOTE: There is no RD here. */
1698 if (IS_EVPN_PREFIX_IPADDR_V4(evp)) {
1699 afi = AFI_IP;
1700 safi = SAFI_UNICAST;
1701 rn = bgp_node_get(bgp_vrf->rib[afi][safi], pp);
1702 } else if (IS_EVPN_PREFIX_IPADDR_V6(evp)) {
1703 afi = AFI_IP6;
1704 safi = SAFI_UNICAST;
1705 rn = bgp_node_get(bgp_vrf->rib[afi][safi], pp);
1706 } else
1707 return 0;
1708
1709 /* Check if route entry is already present. */
1710 for (ri = rn->info; ri; ri = ri->next)
1711 if (ri->extra
1712 && (struct bgp_info *)ri->extra->parent == parent_ri)
1713 break;
1714
1715 if (!ri) {
1716 /* Add (or update) attribute to hash. */
1717 attr_new = bgp_attr_intern(parent_ri->attr);
1718
1719 /* Create new route with its attribute. */
1720 ri = info_make(parent_ri->type, parent_ri->sub_type, 0,
1721 parent_ri->peer, attr_new, rn);
1722 SET_FLAG(ri->flags, BGP_INFO_VALID);
1723 bgp_info_extra_get(ri);
1724 ri->extra->parent = parent_ri;
1725 if (parent_ri->extra)
1726 memcpy(&ri->extra->label, &parent_ri->extra->label,
1727 BGP_LABEL_BYTES);
1728 bgp_info_add(rn, ri);
1729 } else {
1730 if (attrhash_cmp(ri->attr, parent_ri->attr)
1731 && !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) {
1732 bgp_unlock_node(rn);
1733 return 0;
1734 }
1735 /* The attribute has changed. */
1736 /* Add (or update) attribute to hash. */
1737 attr_new = bgp_attr_intern(parent_ri->attr);
1738
1739 /* Restore route, if needed. */
1740 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1741 bgp_info_restore(rn, ri);
1742
1743 /* Mark if nexthop has changed. */
1744 if (!IPV4_ADDR_SAME(&ri->attr->nexthop, &attr_new->nexthop))
1745 SET_FLAG(ri->flags, BGP_INFO_IGP_CHANGED);
1746
1747 /* Unintern existing, set to new. */
1748 bgp_attr_unintern(&ri->attr);
1749 ri->attr = attr_new;
1750 ri->uptime = bgp_clock();
1751 }
1752
1753 /* Perform route selection and update zebra, if required. */
1754 bgp_process(bgp_vrf, rn, afi, safi);
1755
1756 return ret;
1757 }
1758
1759 /*
1760 * Install route entry into the VNI routing table and invoke route selection.
1761 */
1762 static int install_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
1763 struct prefix_evpn *p,
1764 struct bgp_info *parent_ri)
1765 {
1766 struct bgp_node *rn;
1767 struct bgp_info *ri;
1768 struct attr *attr_new;
1769 int ret;
1770
1771 /* Create (or fetch) route within the VNI. */
1772 /* NOTE: There is no RD here. */
1773 rn = bgp_node_get(vpn->route_table, (struct prefix *)p);
1774
1775 /* Check if route entry is already present. */
1776 for (ri = rn->info; ri; ri = ri->next)
1777 if (ri->extra
1778 && (struct bgp_info *)ri->extra->parent == parent_ri)
1779 break;
1780
1781 if (!ri) {
1782 /* Add (or update) attribute to hash. */
1783 attr_new = bgp_attr_intern(parent_ri->attr);
1784
1785 /* Create new route with its attribute. */
1786 ri = info_make(parent_ri->type, parent_ri->sub_type, 0,
1787 parent_ri->peer, attr_new, rn);
1788 SET_FLAG(ri->flags, BGP_INFO_VALID);
1789 bgp_info_extra_get(ri);
1790 ri->extra->parent = parent_ri;
1791 if (parent_ri->extra)
1792 memcpy(&ri->extra->label, &parent_ri->extra->label,
1793 BGP_LABEL_BYTES);
1794 bgp_info_add(rn, ri);
1795 } else {
1796 if (attrhash_cmp(ri->attr, parent_ri->attr)
1797 && !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) {
1798 bgp_unlock_node(rn);
1799 return 0;
1800 }
1801 /* The attribute has changed. */
1802 /* Add (or update) attribute to hash. */
1803 attr_new = bgp_attr_intern(parent_ri->attr);
1804
1805 /* Restore route, if needed. */
1806 if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED))
1807 bgp_info_restore(rn, ri);
1808
1809 /* Mark if nexthop has changed. */
1810 if (!IPV4_ADDR_SAME(&ri->attr->nexthop, &attr_new->nexthop))
1811 SET_FLAG(ri->flags, BGP_INFO_IGP_CHANGED);
1812
1813 /* Unintern existing, set to new. */
1814 bgp_attr_unintern(&ri->attr);
1815 ri->attr = attr_new;
1816 ri->uptime = bgp_clock();
1817 }
1818
1819 /* Perform route selection and update zebra, if required. */
1820 ret = evpn_route_select_install(bgp, vpn, rn);
1821
1822 return ret;
1823 }
1824
1825 /*
1826 * Uninstall route entry from the VRF routing table and send message
1827 * to zebra, if appropriate.
1828 */
1829 static int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
1830 struct prefix_evpn *evp,
1831 struct bgp_info *parent_ri)
1832 {
1833 struct bgp_node *rn;
1834 struct bgp_info *ri;
1835 int ret = 0;
1836 struct prefix p;
1837 struct prefix *pp = &p;
1838 afi_t afi = 0;
1839 safi_t safi = 0;
1840 char buf[PREFIX_STRLEN];
1841 char buf1[PREFIX_STRLEN];
1842
1843 memset(pp, 0, sizeof(struct prefix));
1844 ip_prefix_from_type2_prefix(evp, pp);
1845
1846 if (bgp_debug_zebra(NULL)) {
1847 zlog_debug("uninstalling evpn prefix %s as ip prefix %s in vrf %s",
1848 prefix2str(evp, buf, sizeof(buf)),
1849 prefix2str(pp, buf1, sizeof(buf)),
1850 vrf_id_to_name(bgp_vrf->vrf_id));
1851 }
1852
1853 /* Locate route within the VRF. */
1854 /* NOTE: There is no RD here. */
1855 if (IS_EVPN_PREFIX_IPADDR_V4(evp)) {
1856 afi = AFI_IP;
1857 safi = SAFI_UNICAST;
1858 rn = bgp_node_lookup(bgp_vrf->rib[afi][safi], pp);
1859 } else {
1860 afi = AFI_IP6;
1861 safi = SAFI_UNICAST;
1862 rn = bgp_node_lookup(bgp_vrf->rib[afi][safi], pp);
1863 }
1864
1865 if (!rn)
1866 return 0;
1867
1868 /* Find matching route entry. */
1869 for (ri = rn->info; ri; ri = ri->next)
1870 if (ri->extra
1871 && (struct bgp_info *)ri->extra->parent == parent_ri)
1872 break;
1873
1874 if (!ri)
1875 return 0;
1876
1877 /* Mark entry for deletion */
1878 bgp_info_delete(rn, ri);
1879
1880 /* Perform route selection and update zebra, if required. */
1881 bgp_process(bgp_vrf, rn, afi, safi);
1882
1883 /* Unlock route node. */
1884 bgp_unlock_node(rn);
1885
1886 return ret;
1887 }
1888
1889 /*
1890 * Uninstall route entry from the VNI routing table and send message
1891 * to zebra, if appropriate.
1892 */
1893 static int uninstall_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
1894 struct prefix_evpn *p,
1895 struct bgp_info *parent_ri)
1896 {
1897 struct bgp_node *rn;
1898 struct bgp_info *ri;
1899 int ret;
1900
1901 /* Locate route within the VNI. */
1902 /* NOTE: There is no RD here. */
1903 rn = bgp_node_lookup(vpn->route_table, (struct prefix *)p);
1904 if (!rn)
1905 return 0;
1906
1907 /* Find matching route entry. */
1908 for (ri = rn->info; ri; ri = ri->next)
1909 if (ri->extra
1910 && (struct bgp_info *)ri->extra->parent == parent_ri)
1911 break;
1912
1913 if (!ri)
1914 return 0;
1915
1916 /* Mark entry for deletion */
1917 bgp_info_delete(rn, ri);
1918
1919 /* Perform route selection and update zebra, if required. */
1920 ret = evpn_route_select_install(bgp, vpn, rn);
1921
1922 /* Unlock route node. */
1923 bgp_unlock_node(rn);
1924
1925 return ret;
1926 }
1927
1928 /*
1929 * Given a route entry and a VRF, see if this route entry should be
1930 * imported into the VRF i.e., RTs match.
1931 */
1932 static int is_route_matching_for_vrf(struct bgp *bgp_vrf,
1933 struct bgp_info *ri)
1934 {
1935 struct attr *attr = ri->attr;
1936 struct ecommunity *ecom;
1937 int i;
1938
1939 assert(attr);
1940 /* Route should have valid RT to be even considered. */
1941 if (!(attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES)))
1942 return 0;
1943
1944 ecom = attr->ecommunity;
1945 if (!ecom || !ecom->size)
1946 return 0;
1947
1948 /* For each extended community RT, see if it matches this VNI. If any RT
1949 * matches, we're done.
1950 */
1951 for (i = 0; i < ecom->size; i++) {
1952 u_char *pnt;
1953 u_char type, sub_type;
1954 struct ecommunity_val *eval;
1955 struct ecommunity_val eval_tmp;
1956 struct vrf_irt_node *irt;
1957
1958 /* Only deal with RTs */
1959 pnt = (ecom->val + (i * ECOMMUNITY_SIZE));
1960 eval = (struct ecommunity_val *)(ecom->val
1961 + (i * ECOMMUNITY_SIZE));
1962 type = *pnt++;
1963 sub_type = *pnt++;
1964 if (sub_type != ECOMMUNITY_ROUTE_TARGET)
1965 continue;
1966
1967 /* See if this RT matches specified VNIs import RTs */
1968 irt = lookup_vrf_import_rt(eval);
1969 if (irt && irt->vrfs)
1970 if (is_vrf_present_in_irt_vrfs(irt->vrfs, bgp_vrf))
1971 return 1;
1972
1973 /* Also check for non-exact match. In this, we mask out the AS
1974 * and
1975 * only check on the local-admin sub-field. This is to
1976 * facilitate using
1977 * VNI as the RT for EBGP peering too.
1978 */
1979 irt = NULL;
1980 if (type == ECOMMUNITY_ENCODE_AS
1981 || type == ECOMMUNITY_ENCODE_AS4
1982 || type == ECOMMUNITY_ENCODE_IP) {
1983 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
1984 mask_ecom_global_admin(&eval_tmp, eval);
1985 irt = lookup_vrf_import_rt(&eval_tmp);
1986 }
1987 if (irt && irt->vrfs)
1988 if (is_vrf_present_in_irt_vrfs(irt->vrfs, bgp_vrf))
1989 return 1;
1990 }
1991
1992 return 0;
1993 }
1994
1995 /*
1996 * Given a route entry and a VNI, see if this route entry should be
1997 * imported into the VNI i.e., RTs match.
1998 */
1999 static int is_route_matching_for_vni(struct bgp *bgp, struct bgpevpn *vpn,
2000 struct bgp_info *ri)
2001 {
2002 struct attr *attr = ri->attr;
2003 struct ecommunity *ecom;
2004 int i;
2005
2006 assert(attr);
2007 /* Route should have valid RT to be even considered. */
2008 if (!(attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES)))
2009 return 0;
2010
2011 ecom = attr->ecommunity;
2012 if (!ecom || !ecom->size)
2013 return 0;
2014
2015 /* For each extended community RT, see if it matches this VNI. If any RT
2016 * matches, we're done.
2017 */
2018 for (i = 0; i < ecom->size; i++) {
2019 u_char *pnt;
2020 u_char type, sub_type;
2021 struct ecommunity_val *eval;
2022 struct ecommunity_val eval_tmp;
2023 struct irt_node *irt;
2024
2025 /* Only deal with RTs */
2026 pnt = (ecom->val + (i * ECOMMUNITY_SIZE));
2027 eval = (struct ecommunity_val *)(ecom->val
2028 + (i * ECOMMUNITY_SIZE));
2029 type = *pnt++;
2030 sub_type = *pnt++;
2031 if (sub_type != ECOMMUNITY_ROUTE_TARGET)
2032 continue;
2033
2034 /* See if this RT matches specified VNIs import RTs */
2035 irt = lookup_import_rt(bgp, eval);
2036 if (irt && irt->vnis)
2037 if (is_vni_present_in_irt_vnis(irt->vnis, vpn))
2038 return 1;
2039
2040 /* Also check for non-exact match. In this, we mask out the AS
2041 * and
2042 * only check on the local-admin sub-field. This is to
2043 * facilitate using
2044 * VNI as the RT for EBGP peering too.
2045 */
2046 irt = NULL;
2047 if (type == ECOMMUNITY_ENCODE_AS
2048 || type == ECOMMUNITY_ENCODE_AS4
2049 || type == ECOMMUNITY_ENCODE_IP) {
2050 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
2051 mask_ecom_global_admin(&eval_tmp, eval);
2052 irt = lookup_import_rt(bgp, &eval_tmp);
2053 }
2054 if (irt && irt->vnis)
2055 if (is_vni_present_in_irt_vnis(irt->vnis, vpn))
2056 return 1;
2057 }
2058
2059 return 0;
2060 }
2061
2062 /*
2063 * Install or uninstall mac-ip routes are appropriate for this
2064 * particular VRF.
2065 */
2066 static int install_uninstall_routes_for_vrf(struct bgp *bgp_vrf,
2067 int install)
2068 {
2069 afi_t afi;
2070 safi_t safi;
2071 struct bgp_node *rd_rn, *rn;
2072 struct bgp_table *table;
2073 struct bgp_info *ri;
2074 int ret;
2075 char buf[PREFIX_STRLEN];
2076 struct bgp *bgp_def = NULL;
2077
2078 afi = AFI_L2VPN;
2079 safi = SAFI_EVPN;
2080 bgp_def = bgp_get_default();
2081 if (!bgp_def)
2082 return -1;
2083
2084 /* Walk entire global routing table and evaluate routes which could be
2085 * imported into this VRF. Note that we need to loop through all global
2086 * routes to determine which route matches the import rt on vrf
2087 */
2088 for (rd_rn = bgp_table_top(bgp_def->rib[afi][safi]); rd_rn;
2089 rd_rn = bgp_route_next(rd_rn)) {
2090 table = (struct bgp_table *)(rd_rn->info);
2091 if (!table)
2092 continue;
2093
2094 for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
2095 struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
2096
2097 /* if not mac-ip route skip this route */
2098 if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
2099 continue;
2100
2101 /* if not a mac+ip route skip this route */
2102 if (!(IS_EVPN_PREFIX_IPADDR_V4(evp) ||
2103 IS_EVPN_PREFIX_IPADDR_V6(evp)))
2104 continue;
2105
2106 for (ri = rn->info; ri; ri = ri->next) {
2107 /* Consider "valid" remote routes applicable for
2108 * this VRF. */
2109 if (!(CHECK_FLAG(ri->flags, BGP_INFO_VALID)
2110 && ri->type == ZEBRA_ROUTE_BGP
2111 && ri->sub_type == BGP_ROUTE_NORMAL))
2112 continue;
2113
2114 if (is_route_matching_for_vrf(bgp_vrf, ri)) {
2115 if (install)
2116 ret =
2117 install_evpn_route_entry_in_vrf(
2118 bgp_vrf, evp, ri);
2119 else
2120 ret =
2121 uninstall_evpn_route_entry_in_vrf(
2122 bgp_vrf, evp, ri);
2123
2124 if (ret) {
2125 zlog_err(
2126 "Failed to %s EVPN %s route in VRF %s",
2127 install ? "install"
2128 : "uninstall",
2129 prefix2str(evp, buf,
2130 sizeof(buf)),
2131 vrf_id_to_name(bgp_vrf->vrf_id));
2132 return ret;
2133 }
2134 }
2135 }
2136 }
2137 }
2138
2139 return 0;
2140 }
2141
2142 /*
2143 * Install or uninstall routes of specified type that are appropriate for this
2144 * particular VNI.
2145 */
2146 static int install_uninstall_routes_for_vni(struct bgp *bgp,
2147 struct bgpevpn *vpn,
2148 bgp_evpn_route_type rtype,
2149 int install)
2150 {
2151 afi_t afi;
2152 safi_t safi;
2153 struct bgp_node *rd_rn, *rn;
2154 struct bgp_table *table;
2155 struct bgp_info *ri;
2156 int ret;
2157
2158 afi = AFI_L2VPN;
2159 safi = SAFI_EVPN;
2160
2161 /* Walk entire global routing table and evaluate routes which could be
2162 * imported into this VPN. Note that we cannot just look at the routes
2163 * for
2164 * the VNI's RD - remote routes applicable for this VNI could have any
2165 * RD.
2166 */
2167 /* EVPN routes are a 2-level table. */
2168 for (rd_rn = bgp_table_top(bgp->rib[afi][safi]); rd_rn;
2169 rd_rn = bgp_route_next(rd_rn)) {
2170 table = (struct bgp_table *)(rd_rn->info);
2171 if (!table)
2172 continue;
2173
2174 for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
2175 struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
2176
2177 if (evp->prefix.route_type != rtype)
2178 continue;
2179
2180 for (ri = rn->info; ri; ri = ri->next) {
2181 /* Consider "valid" remote routes applicable for
2182 * this VNI. */
2183 if (!(CHECK_FLAG(ri->flags, BGP_INFO_VALID)
2184 && ri->type == ZEBRA_ROUTE_BGP
2185 && ri->sub_type == BGP_ROUTE_NORMAL))
2186 continue;
2187
2188 if (is_route_matching_for_vni(bgp, vpn, ri)) {
2189 if (install)
2190 ret = install_evpn_route_entry(
2191 bgp, vpn, evp, ri);
2192 else
2193 ret = uninstall_evpn_route_entry(
2194 bgp, vpn, evp, ri);
2195
2196 if (ret) {
2197 zlog_err(
2198 "%u: Failed to %s EVPN %s route in VNI %u",
2199 bgp->vrf_id,
2200 install ? "install"
2201 : "uninstall",
2202 rtype == BGP_EVPN_MAC_IP_ROUTE
2203 ? "MACIP"
2204 : "IMET",
2205 vpn->vni);
2206 return ret;
2207 }
2208 }
2209 }
2210 }
2211 }
2212
2213 return 0;
2214 }
2215
2216 /* Install any existing remote routes applicable for this VRF into VRF RIB. This
2217 * is invoked upon l3vni-add or l3vni import rt change */
2218 static int install_routes_for_vrf(struct bgp *bgp_vrf)
2219 {
2220 install_uninstall_routes_for_vrf(bgp_vrf, 1);
2221 return 0;
2222 }
2223
2224 /*
2225 * Install any existing remote routes applicable for this VNI into its
2226 * routing table. This is invoked when a VNI becomes "live" or its Import
2227 * RT is changed.
2228 */
2229 static int install_routes_for_vni(struct bgp *bgp, struct bgpevpn *vpn)
2230 {
2231 int ret;
2232
2233 /* Install type-3 routes followed by type-2 routes - the ones applicable
2234 * for this VNI.
2235 */
2236 ret = install_uninstall_routes_for_vni(bgp, vpn, BGP_EVPN_IMET_ROUTE,
2237 1);
2238 if (ret)
2239 return ret;
2240
2241 return install_uninstall_routes_for_vni(bgp, vpn, BGP_EVPN_MAC_IP_ROUTE,
2242 1);
2243 }
2244
2245 /* uninstall routes from l3vni vrf. */
2246 static int uninstall_routes_for_vrf(struct bgp *bgp_vrf)
2247 {
2248 install_uninstall_routes_for_vrf(bgp_vrf, 0);
2249 return 0;
2250 }
2251
2252 /*
2253 * Uninstall any existing remote routes for this VNI. One scenario in which
2254 * this is invoked is upon an import RT change.
2255 */
2256 static int uninstall_routes_for_vni(struct bgp *bgp, struct bgpevpn *vpn)
2257 {
2258 int ret;
2259
2260 /* Uninstall type-2 routes followed by type-3 routes - the ones
2261 * applicable
2262 * for this VNI.
2263 */
2264 ret = install_uninstall_routes_for_vni(bgp, vpn, BGP_EVPN_MAC_IP_ROUTE,
2265 0);
2266 if (ret)
2267 return ret;
2268
2269 return install_uninstall_routes_for_vni(bgp, vpn, BGP_EVPN_IMET_ROUTE,
2270 0);
2271 }
2272
2273 /*
2274 * Install or uninstall route in matching VRFs (list).
2275 */
2276 static int install_uninstall_route_in_vrfs(struct bgp *bgp_def, afi_t afi,
2277 safi_t safi, struct prefix_evpn *evp,
2278 struct bgp_info *ri,
2279 struct list *vrfs, int install)
2280 {
2281 char buf[PREFIX2STR_BUFFER];
2282 struct bgp *bgp_vrf;
2283 struct listnode *node, *nnode;
2284
2285 /* Only type-2 routes go into a VRF */
2286 if (!(evp->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE))
2287 return 0;
2288
2289 /* if not a mac+ip route skip this route */
2290 if (!(IS_EVPN_PREFIX_IPADDR_V4(evp) ||
2291 IS_EVPN_PREFIX_IPADDR_V6(evp)))
2292 return 0;
2293
2294 for (ALL_LIST_ELEMENTS(vrfs, node, nnode, bgp_vrf)) {
2295 int ret;
2296
2297 if (install)
2298 ret = install_evpn_route_entry_in_vrf(bgp_vrf,
2299 evp, ri);
2300 else
2301 ret = uninstall_evpn_route_entry_in_vrf(bgp_vrf,
2302 evp, ri);
2303
2304 if (ret) {
2305 zlog_err("%u: Failed to %s prefix %s in VRF %s",
2306 bgp_def->vrf_id,
2307 install ? "install" : "uninstall",
2308 prefix2str(evp, buf, sizeof(buf)),
2309 vrf_id_to_name(bgp_vrf->vrf_id));
2310 return ret;
2311 }
2312 }
2313
2314 return 0;
2315 }
2316
2317 /*
2318 * Install or uninstall route in matching VNIs (list).
2319 */
2320 static int install_uninstall_route_in_vnis(struct bgp *bgp, afi_t afi,
2321 safi_t safi, struct prefix_evpn *evp,
2322 struct bgp_info *ri,
2323 struct list *vnis, int install)
2324 {
2325 struct bgpevpn *vpn;
2326 struct listnode *node, *nnode;
2327
2328 for (ALL_LIST_ELEMENTS(vnis, node, nnode, vpn)) {
2329 int ret;
2330
2331 if (!is_vni_live(vpn))
2332 continue;
2333
2334 if (install)
2335 ret = install_evpn_route_entry(bgp, vpn, evp, ri);
2336 else
2337 ret = uninstall_evpn_route_entry(bgp, vpn, evp, ri);
2338
2339 if (ret) {
2340 zlog_err("%u: Failed to %s EVPN %s route in VNI %u",
2341 bgp->vrf_id, install ? "install" : "uninstall",
2342 evp->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE
2343 ? "MACIP"
2344 : "IMET",
2345 vpn->vni);
2346 return ret;
2347 }
2348 }
2349
2350 return 0;
2351 }
2352
2353 /*
2354 * Install or uninstall route for appropriate VNIs.
2355 */
2356 static int install_uninstall_evpn_route(struct bgp *bgp, afi_t afi, safi_t safi,
2357 struct prefix *p, struct bgp_info *ri,
2358 int import)
2359 {
2360 struct prefix_evpn *evp = (struct prefix_evpn *)p;
2361 struct attr *attr = ri->attr;
2362 struct ecommunity *ecom;
2363 int i;
2364
2365 assert(attr);
2366
2367 /* Only type-2 and type-3 routes go into a L2 VNI. */
2368 if (!(evp->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE
2369 || evp->prefix.route_type == BGP_EVPN_IMET_ROUTE))
2370 return 0;
2371
2372 /* If we don't have Route Target, nothing much to do. */
2373 if (!(attr->flag & ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES)))
2374 return 0;
2375
2376 ecom = attr->ecommunity;
2377 if (!ecom || !ecom->size)
2378 return -1;
2379
2380 /* For each extended community RT, see which VNIs match and import
2381 * the route into matching VNIs.
2382 */
2383 for (i = 0; i < ecom->size; i++) {
2384 u_char *pnt;
2385 u_char type, sub_type;
2386 struct ecommunity_val *eval;
2387 struct ecommunity_val eval_tmp;
2388 struct irt_node *irt; /* import rt for l2vni */
2389 struct vrf_irt_node *vrf_irt; /* import rt for l3vni */
2390
2391 /* Only deal with RTs */
2392 pnt = (ecom->val + (i * ECOMMUNITY_SIZE));
2393 eval = (struct ecommunity_val *)(ecom->val
2394 + (i * ECOMMUNITY_SIZE));
2395 type = *pnt++;
2396 sub_type = *pnt++;
2397 if (sub_type != ECOMMUNITY_ROUTE_TARGET)
2398 continue;
2399
2400 /* Import route into matching l2-vnis */
2401 irt = lookup_import_rt(bgp, eval);
2402 if (irt && irt->vnis)
2403 install_uninstall_route_in_vnis(bgp, afi, safi, evp, ri,
2404 irt->vnis, import);
2405
2406 /* Import route into matching l3-vnis (vrfs) */
2407 vrf_irt = lookup_vrf_import_rt(eval);
2408 if (vrf_irt && vrf_irt->vrfs)
2409 install_uninstall_route_in_vrfs(bgp, afi, safi, evp, ri,
2410 vrf_irt->vrfs, import);
2411
2412 /* Also check for non-exact match. In this, we mask out the AS
2413 * and
2414 * only check on the local-admin sub-field. This is to
2415 * facilitate using
2416 * VNI as the RT for EBGP peering too.
2417 */
2418 irt = NULL;
2419 vrf_irt = NULL;
2420 if (type == ECOMMUNITY_ENCODE_AS
2421 || type == ECOMMUNITY_ENCODE_AS4
2422 || type == ECOMMUNITY_ENCODE_IP) {
2423 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
2424 mask_ecom_global_admin(&eval_tmp, eval);
2425 irt = lookup_import_rt(bgp, &eval_tmp);
2426 vrf_irt = lookup_vrf_import_rt(&eval_tmp);
2427 }
2428 if (irt && irt->vnis)
2429 install_uninstall_route_in_vnis(bgp, afi, safi, evp, ri,
2430 irt->vnis, import);
2431 if (vrf_irt && vrf_irt->vrfs)
2432 install_uninstall_route_in_vrfs(bgp, afi, safi, evp,
2433 ri, vrf_irt->vrfs,
2434 import);
2435 }
2436
2437 return 0;
2438 }
2439
2440 /* delete and withdraw all ipv4 and ipv6 routes in the vrf table as type-5
2441 * routes */
2442 static void delete_withdraw_vrf_routes(struct bgp *bgp_vrf)
2443 {
2444 /* delete all ipv4 routes and withdraw from peers */
2445 bgp_evpn_withdraw_type5_routes(bgp_vrf, AFI_IP, SAFI_UNICAST);
2446
2447 /* delete all ipv6 routes and withdraw from peers */
2448 bgp_evpn_withdraw_type5_routes(bgp_vrf, AFI_IP6, SAFI_UNICAST);
2449 }
2450
2451 /* update and advertise all ipv4 and ipv6 routes in thr vrf table as type-5
2452 * routes */
2453 static void update_advertise_vrf_routes(struct bgp *bgp_vrf)
2454 {
2455 /* update all ipv4 routes */
2456 bgp_evpn_advertise_type5_routes(bgp_vrf, AFI_IP, SAFI_UNICAST);
2457
2458 /* update all ipv6 routes */
2459 bgp_evpn_advertise_type5_routes(bgp_vrf, AFI_IP6, SAFI_UNICAST);
2460 }
2461
2462 /*
2463 * update and advertise local routes for a VRF as type-5 routes.
2464 * This is invoked upon RD change for a VRF. Note taht the processing is only
2465 * done in the global route table using the routes which already exist in the
2466 * VRF routing table
2467 */
2468 static void update_router_id_vrf(struct bgp *bgp_vrf)
2469 {
2470 /* skip if the RD is configured */
2471 if (is_vrf_rd_configured(bgp_vrf))
2472 return;
2473
2474 /* derive the RD for the VRF based on new router-id */
2475 bgp_evpn_derive_auto_rd_for_vrf(bgp_vrf);
2476
2477 /* update advertise ipv4|ipv6 routes as type-5 routes */
2478 update_advertise_vrf_routes(bgp_vrf);
2479 }
2480
2481 /*
2482 * Delete and withdraw all type-5 routes for the RD corresponding to VRF.
2483 * This is invoked upon VRF RD change. The processing is done only from global
2484 * table.
2485 */
2486 static void withdraw_router_id_vrf(struct bgp *bgp_vrf)
2487 {
2488 /* skip if the RD is configured */
2489 if (is_vrf_rd_configured(bgp_vrf))
2490 return;
2491
2492 /* delete/withdraw ipv4|ipv6 routes as type-5 routes */
2493 delete_withdraw_vrf_routes(bgp_vrf);
2494 }
2495
2496 /*
2497 * Update and advertise local routes for a VNI. Invoked upon router-id
2498 * change. Note that the processing is done only on the global route table
2499 * using routes that already exist in the per-VNI table.
2500 */
2501 static int update_advertise_vni_routes(struct bgp *bgp, struct bgpevpn *vpn)
2502 {
2503 struct prefix_evpn p;
2504 struct bgp_node *rn, *global_rn;
2505 struct bgp_info *ri, *global_ri;
2506 struct attr *attr;
2507 afi_t afi = AFI_L2VPN;
2508 safi_t safi = SAFI_EVPN;
2509
2510 /* Locate type-3 route for VNI in the per-VNI table and use its
2511 * attributes to create and advertise the type-3 route for this VNI
2512 * in the global table.
2513 */
2514 build_evpn_type3_prefix(&p, vpn->originator_ip);
2515 rn = bgp_node_lookup(vpn->route_table, (struct prefix *)&p);
2516 if (!rn) /* unexpected */
2517 return 0;
2518 for (ri = rn->info; ri; ri = ri->next)
2519 if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
2520 && ri->sub_type == BGP_ROUTE_STATIC)
2521 break;
2522 if (!ri) /* unexpected */
2523 return 0;
2524 attr = ri->attr;
2525
2526 global_rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi,
2527 (struct prefix *)&p, &vpn->prd);
2528 update_evpn_route_entry(bgp, vpn, afi, safi, global_rn, attr, 1, 0, &ri,
2529 0);
2530
2531 /* Schedule for processing and unlock node. */
2532 bgp_process(bgp, global_rn, afi, safi);
2533 bgp_unlock_node(global_rn);
2534
2535 /* Now, walk this VNI's route table and use the route and its attribute
2536 * to create and schedule route in global table.
2537 */
2538 for (rn = bgp_table_top(vpn->route_table); rn;
2539 rn = bgp_route_next(rn)) {
2540 struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
2541
2542 /* Identify MAC-IP local routes. */
2543 if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
2544 continue;
2545
2546 for (ri = rn->info; ri; ri = ri->next)
2547 if (ri->peer == bgp->peer_self
2548 && ri->type == ZEBRA_ROUTE_BGP
2549 && ri->sub_type == BGP_ROUTE_STATIC)
2550 break;
2551 if (!ri)
2552 continue;
2553
2554 /* Create route in global routing table using this route entry's
2555 * attribute.
2556 */
2557 attr = ri->attr;
2558 global_rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi,
2559 (struct prefix *)evp, &vpn->prd);
2560 assert(global_rn);
2561 update_evpn_route_entry(bgp, vpn, afi, safi, global_rn, attr, 1,
2562 0, &global_ri, 0);
2563
2564 /* Schedule for processing and unlock node. */
2565 bgp_process(bgp, global_rn, afi, safi);
2566 bgp_unlock_node(global_rn);
2567 }
2568
2569 return 0;
2570 }
2571
2572 /*
2573 * Delete (and withdraw) local routes for a VNI - only from the global
2574 * table. Invoked upon router-id change.
2575 */
2576 static int delete_withdraw_vni_routes(struct bgp *bgp, struct bgpevpn *vpn)
2577 {
2578 int ret;
2579 struct prefix_evpn p;
2580 struct bgp_node *global_rn;
2581 struct bgp_info *ri;
2582 afi_t afi = AFI_L2VPN;
2583 safi_t safi = SAFI_EVPN;
2584
2585 /* Delete and withdraw locally learnt type-2 routes (MACIP)
2586 * for this VNI - from the global table.
2587 */
2588 ret = delete_global_type2_routes(bgp, vpn);
2589 if (ret)
2590 return ret;
2591
2592 /* Remove type-3 route for this VNI from global table. */
2593 build_evpn_type3_prefix(&p, vpn->originator_ip);
2594 global_rn = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi,
2595 (struct prefix *)&p, &vpn->prd);
2596 if (global_rn) {
2597 /* Delete route entry in the global EVPN table. */
2598 delete_evpn_route_entry(bgp, vpn, afi, safi, global_rn, &ri);
2599
2600 /* Schedule for processing - withdraws to peers happen from
2601 * this table.
2602 */
2603 if (ri)
2604 bgp_process(bgp, global_rn, afi, safi);
2605 bgp_unlock_node(global_rn);
2606 }
2607
2608 return 0;
2609 }
2610
2611 /*
2612 * Handle router-id change. Update and advertise local routes corresponding
2613 * to this VNI from peers. Note that this is invoked after updating the
2614 * router-id. The routes in the per-VNI table are used to create routes in
2615 * the global table and schedule them.
2616 */
2617 static void update_router_id_vni(struct hash_backet *backet, struct bgp *bgp)
2618 {
2619 struct bgpevpn *vpn;
2620
2621 vpn = (struct bgpevpn *)backet->data;
2622
2623 if (!vpn) {
2624 zlog_warn("%s: VNI hash entry for VNI not found", __FUNCTION__);
2625 return;
2626 }
2627
2628 /* Skip VNIs with configured RD. */
2629 if (is_rd_configured(vpn))
2630 return;
2631
2632 bgp_evpn_derive_auto_rd(bgp, vpn);
2633 update_advertise_vni_routes(bgp, vpn);
2634 }
2635
2636 /*
2637 * Handle router-id change. Delete and withdraw local routes corresponding
2638 * to this VNI from peers. Note that this is invoked prior to updating
2639 * the router-id and is done only on the global route table, the routes
2640 * are needed in the per-VNI table to re-advertise with new router id.
2641 */
2642 static void withdraw_router_id_vni(struct hash_backet *backet, struct bgp *bgp)
2643 {
2644 struct bgpevpn *vpn;
2645
2646 vpn = (struct bgpevpn *)backet->data;
2647
2648 if (!vpn) {
2649 zlog_warn("%s: VNI hash entry for VNI not found", __FUNCTION__);
2650 return;
2651 }
2652
2653 /* Skip VNIs with configured RD. */
2654 if (is_rd_configured(vpn))
2655 return;
2656
2657 delete_withdraw_vni_routes(bgp, vpn);
2658 }
2659
2660 /*
2661 * Process received EVPN type-2 route (advertise or withdraw).
2662 */
2663 static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
2664 struct attr *attr, u_char *pfx, int psize,
2665 u_int32_t addpath_id)
2666 {
2667 struct prefix_rd prd;
2668 struct prefix_evpn p;
2669 u_char ipaddr_len;
2670 u_char macaddr_len;
2671 mpls_label_t *label_pnt;
2672 int ret;
2673
2674 /* Type-2 route should be either 33, 37 or 49 bytes or an
2675 * additional 3 bytes if there is a second label (VNI):
2676 * RD (8), ESI (10), Eth Tag (4), MAC Addr Len (1),
2677 * MAC Addr (6), IP len (1), IP (0, 4 or 16),
2678 * MPLS Lbl1 (3), MPLS Lbl2 (0 or 3)
2679 */
2680 if (psize != 33 && psize != 37 && psize != 49 && psize != 36
2681 && psize != 40 && psize != 52) {
2682 zlog_err("%u:%s - Rx EVPN Type-2 NLRI with invalid length %d",
2683 peer->bgp->vrf_id, peer->host, psize);
2684 return -1;
2685 }
2686
2687 /* Make prefix_rd */
2688 prd.family = AF_UNSPEC;
2689 prd.prefixlen = 64;
2690 memcpy(&prd.val, pfx, 8);
2691 pfx += 8;
2692
2693 /* Make EVPN prefix. */
2694 memset(&p, 0, sizeof(struct prefix_evpn));
2695 p.family = AF_EVPN;
2696 p.prefixlen = EVPN_TYPE_2_ROUTE_PREFIXLEN;
2697 p.prefix.route_type = BGP_EVPN_MAC_IP_ROUTE;
2698
2699 /* Skip over Ethernet Seg Identifier for now. */
2700 pfx += 10;
2701
2702 /* Skip over Ethernet Tag for now. */
2703 pfx += 4;
2704
2705 /* Get the MAC Addr len */
2706 macaddr_len = *pfx++;
2707
2708 /* Get the MAC Addr */
2709 if (macaddr_len == (ETH_ALEN * 8)) {
2710 memcpy(&p.prefix.mac.octet, pfx, ETH_ALEN);
2711 pfx += ETH_ALEN;
2712 } else {
2713 zlog_err(
2714 "%u:%s - Rx EVPN Type-2 NLRI with unsupported MAC address length %d",
2715 peer->bgp->vrf_id, peer->host, macaddr_len);
2716 return -1;
2717 }
2718
2719
2720 /* Get the IP. */
2721 ipaddr_len = *pfx++;
2722 if (ipaddr_len != 0 && ipaddr_len != IPV4_MAX_BITLEN
2723 && ipaddr_len != IPV6_MAX_BITLEN) {
2724 zlog_err(
2725 "%u:%s - Rx EVPN Type-2 NLRI with unsupported IP address length %d",
2726 peer->bgp->vrf_id, peer->host, ipaddr_len);
2727 return -1;
2728 }
2729
2730 if (ipaddr_len) {
2731 ipaddr_len /= 8; /* Convert to bytes. */
2732 p.prefix.ip.ipa_type = (ipaddr_len == IPV4_MAX_BYTELEN)
2733 ? IPADDR_V4
2734 : IPADDR_V6;
2735 memcpy(&p.prefix.ip.ip.addr, pfx, ipaddr_len);
2736 }
2737 pfx += ipaddr_len;
2738
2739 /* Get the VNI (in MPLS label field). */
2740 /* Note: We ignore the second VNI, if any. */
2741 label_pnt = (mpls_label_t *)pfx;
2742
2743 /* Process the route. */
2744 if (attr)
2745 ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
2746 afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2747 &prd, label_pnt, 0, NULL);
2748 else
2749 ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
2750 afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2751 &prd, label_pnt, NULL);
2752 return ret;
2753 }
2754
2755 /*
2756 * Process received EVPN type-3 route (advertise or withdraw).
2757 */
2758 static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
2759 struct attr *attr, u_char *pfx, int psize,
2760 u_int32_t addpath_id)
2761 {
2762 struct prefix_rd prd;
2763 struct prefix_evpn p;
2764 u_char ipaddr_len;
2765 int ret;
2766
2767 /* Type-3 route should be either 17 or 29 bytes: RD (8), Eth Tag (4),
2768 * IP len (1) and IP (4 or 16).
2769 */
2770 if (psize != 17 && psize != 29) {
2771 zlog_err("%u:%s - Rx EVPN Type-3 NLRI with invalid length %d",
2772 peer->bgp->vrf_id, peer->host, psize);
2773 return -1;
2774 }
2775
2776 /* Make prefix_rd */
2777 prd.family = AF_UNSPEC;
2778 prd.prefixlen = 64;
2779 memcpy(&prd.val, pfx, 8);
2780 pfx += 8;
2781
2782 /* Make EVPN prefix. */
2783 memset(&p, 0, sizeof(struct prefix_evpn));
2784 p.family = AF_EVPN;
2785 p.prefixlen = EVPN_TYPE_3_ROUTE_PREFIXLEN;
2786 p.prefix.route_type = BGP_EVPN_IMET_ROUTE;
2787
2788 /* Skip over Ethernet Tag for now. */
2789 pfx += 4;
2790
2791 /* Get the IP. */
2792 ipaddr_len = *pfx++;
2793 if (ipaddr_len == IPV4_MAX_BITLEN) {
2794 p.prefix.ip.ipa_type = IPADDR_V4;
2795 memcpy(&p.prefix.ip.ip.addr, pfx, IPV4_MAX_BYTELEN);
2796 } else {
2797 zlog_err(
2798 "%u:%s - Rx EVPN Type-3 NLRI with unsupported IP address length %d",
2799 peer->bgp->vrf_id, peer->host, ipaddr_len);
2800 return -1;
2801 }
2802
2803 /* Process the route. */
2804 if (attr)
2805 ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
2806 afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2807 &prd, NULL, 0, NULL);
2808 else
2809 ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
2810 afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2811 &prd, NULL, NULL);
2812 return ret;
2813 }
2814
2815 /*
2816 * Process received EVPN type-5 route (advertise or withdraw).
2817 */
2818 static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
2819 struct attr *attr, u_char *pfx, int psize,
2820 u_int32_t addpath_id, int withdraw)
2821 {
2822 struct prefix_rd prd;
2823 struct prefix_evpn p;
2824 struct bgp_route_evpn evpn;
2825 u_char ippfx_len;
2826 u_int32_t eth_tag;
2827 mpls_label_t *label_pnt;
2828 int ret;
2829
2830 /* Type-5 route should be 34 or 58 bytes:
2831 * RD (8), ESI (10), Eth Tag (4), IP len (1), IP (4 or 16),
2832 * GW (4 or 16) and VNI (3).
2833 * Note that the IP and GW should both be IPv4 or both IPv6.
2834 */
2835 if (psize != 34 && psize != 58) {
2836 zlog_err("%u:%s - Rx EVPN Type-5 NLRI with invalid length %d",
2837 peer->bgp->vrf_id, peer->host, psize);
2838 return -1;
2839 }
2840
2841 /* Make prefix_rd */
2842 prd.family = AF_UNSPEC;
2843 prd.prefixlen = 64;
2844 memcpy(&prd.val, pfx, 8);
2845 pfx += 8;
2846
2847 /* Make EVPN prefix. */
2848 memset(&p, 0, sizeof(struct prefix_evpn));
2849 p.family = AF_EVPN;
2850 p.prefixlen = EVPN_TYPE_5_ROUTE_PREFIXLEN;
2851 p.prefix.route_type = BGP_EVPN_IP_PREFIX_ROUTE;
2852
2853 /* Additional information outside of prefix - ESI and GW IP */
2854 memset(&evpn, 0, sizeof(evpn));
2855
2856 /* Fetch ESI */
2857 memcpy(&evpn.eth_s_id.val, pfx, 10);
2858 pfx += 10;
2859
2860 /* Fetch Ethernet Tag. */
2861 memcpy(&eth_tag, pfx, 4);
2862 p.prefix.eth_tag = ntohl(eth_tag);
2863 pfx += 4;
2864
2865 /* Fetch IP prefix length. */
2866 ippfx_len = *pfx++;
2867 if (ippfx_len > IPV6_MAX_BITLEN) {
2868 zlog_err(
2869 "%u:%s - Rx EVPN Type-5 NLRI with invalid IP Prefix length %d",
2870 peer->bgp->vrf_id, peer->host, ippfx_len);
2871 return -1;
2872 }
2873 p.prefix.ip_prefix_length = ippfx_len;
2874
2875 /* Determine IPv4 or IPv6 prefix */
2876 /* Since the address and GW are from the same family, this just becomes
2877 * a simple check on the total size.
2878 */
2879 if (psize == 34) {
2880 SET_IPADDR_V4(&p.prefix.ip);
2881 memcpy(&p.prefix.ip.ipaddr_v4, pfx, 4);
2882 pfx += 4;
2883 memcpy(&evpn.gw_ip.ipv4, pfx, 4);
2884 pfx += 4;
2885 } else {
2886 SET_IPADDR_V6(&p.prefix.ip);
2887 memcpy(&p.prefix.ip.ipaddr_v6, pfx, 16);
2888 pfx += 16;
2889 memcpy(&evpn.gw_ip.ipv6, pfx, 16);
2890 pfx += 16;
2891 }
2892
2893 label_pnt = (mpls_label_t *)pfx;
2894
2895 /* Process the route. */
2896 if (!withdraw)
2897 ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
2898 afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2899 &prd, label_pnt, 0, &evpn);
2900 else
2901 ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
2902 afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
2903 &prd, label_pnt, &evpn);
2904
2905 return ret;
2906 }
2907
2908 static void evpn_mpattr_encode_type5(struct stream *s, struct prefix *p,
2909 struct prefix_rd *prd, mpls_label_t *label,
2910 struct attr *attr)
2911 {
2912 int len;
2913 char temp[16];
2914 struct evpn_addr *p_evpn_p;
2915
2916 memset(&temp, 0, 16);
2917 if (p->family != AF_EVPN)
2918 return;
2919 p_evpn_p = &(p->u.prefix_evpn);
2920
2921 /* len denites the total len of IP and GW-IP in the route
2922 IP and GW-IP have to be both ipv4 or ipv6 */
2923 if (IS_IPADDR_V4(&p_evpn_p->ip))
2924 len = 8; /* IP and GWIP are both ipv4 */
2925 else
2926 len = 32; /* IP and GWIP are both ipv6 */
2927 /* Prefix contains RD, ESI, EthTag, IP length, IP, GWIP and VNI */
2928 stream_putc(s, 8 + 10 + 4 + 1 + len + 3);
2929 stream_put(s, prd->val, 8);
2930 if (attr)
2931 stream_put(s, &(attr->evpn_overlay.eth_s_id), 10);
2932 else
2933 stream_put(s, &temp, 10);
2934 stream_putl(s, p_evpn_p->eth_tag);
2935 stream_putc(s, p_evpn_p->ip_prefix_length);
2936 if (IS_IPADDR_V4(&p_evpn_p->ip))
2937 stream_put_ipv4(s, p_evpn_p->ip.ipaddr_v4.s_addr);
2938 else
2939 stream_put(s, &p_evpn_p->ip.ipaddr_v6, 16);
2940 if (attr) {
2941 if (IS_IPADDR_V4(&p_evpn_p->ip))
2942 stream_put_ipv4(s,
2943 attr->evpn_overlay.gw_ip.ipv4.s_addr);
2944 else
2945 stream_put(s, &(attr->evpn_overlay.gw_ip.ipv6), 16);
2946 } else {
2947 if (IS_IPADDR_V4(&p_evpn_p->ip))
2948 stream_put_ipv4(s, 0);
2949 else
2950 stream_put(s, &temp, 16);
2951 }
2952
2953 if (label)
2954 stream_put(s, label, 3);
2955 else
2956 stream_put3(s, 0);
2957 }
2958
2959 /*
2960 * Cleanup specific VNI upon EVPN (advertise-all-vni) being disabled.
2961 */
2962 static void cleanup_vni_on_disable(struct hash_backet *backet, struct bgp *bgp)
2963 {
2964 struct bgpevpn *vpn = (struct bgpevpn *)backet->data;
2965
2966 /* Remove EVPN routes and schedule for processing. */
2967 delete_routes_for_vni(bgp, vpn);
2968
2969 /* Clear "live" flag and see if hash needs to be freed. */
2970 UNSET_FLAG(vpn->flags, VNI_FLAG_LIVE);
2971 if (!is_vni_configured(vpn))
2972 bgp_evpn_free(bgp, vpn);
2973 }
2974
2975 /*
2976 * Free a VNI entry; iterator function called during cleanup.
2977 */
2978 static void free_vni_entry(struct hash_backet *backet, struct bgp *bgp)
2979 {
2980 struct bgpevpn *vpn;
2981
2982 vpn = (struct bgpevpn *)backet->data;
2983 delete_all_vni_routes(bgp, vpn);
2984 bgp_evpn_free(bgp, vpn);
2985 }
2986
2987 /*
2988 * Derive AUTO import RT for BGP VRF - L3VNI
2989 */
2990 static void evpn_auto_rt_import_add_for_vrf(struct bgp *bgp_vrf)
2991 {
2992 struct bgp *bgp_def = NULL;
2993
2994 form_auto_rt(bgp_vrf, bgp_vrf->l3vni, bgp_vrf->vrf_import_rtl);
2995 UNSET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_IMPORT_RT_CFGD);
2996
2997 /* Map RT to VRF */
2998 bgp_def = bgp_get_default();
2999 if (!bgp_def)
3000 return;
3001 bgp_evpn_map_vrf_to_its_rts(bgp_vrf);
3002 }
3003
3004 /*
3005 * Delete AUTO import RT from BGP VRF - L3VNI
3006 */
3007 static void evpn_auto_rt_import_delete_for_vrf(struct bgp *bgp_vrf)
3008 {
3009 evpn_rt_delete_auto(bgp_vrf, bgp_vrf->l3vni, bgp_vrf->vrf_import_rtl);
3010 }
3011
3012 /*
3013 * Derive AUTO export RT for BGP VRF - L3VNI
3014 */
3015 static void evpn_auto_rt_export_add_for_vrf(struct bgp *bgp_vrf)
3016 {
3017 UNSET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_EXPORT_RT_CFGD);
3018 form_auto_rt(bgp_vrf, bgp_vrf->l3vni, bgp_vrf->vrf_export_rtl);
3019 }
3020
3021 /*
3022 * Delete AUTO export RT from BGP VRF - L3VNI
3023 */
3024 static void evpn_auto_rt_export_delete_for_vrf(struct bgp *bgp_vrf)
3025 {
3026 evpn_rt_delete_auto(bgp_vrf, bgp_vrf->l3vni, bgp_vrf->vrf_export_rtl);
3027 }
3028
3029 static void bgp_evpn_handle_export_rt_change_for_vrf(struct bgp *bgp_vrf)
3030 {
3031 struct bgp *bgp_def = NULL;
3032 struct listnode *node = NULL;
3033 struct bgpevpn *vpn = NULL;
3034
3035 bgp_def = bgp_get_default();
3036 if (!bgp_def)
3037 return;
3038
3039 /* update all type-5 routes */
3040 update_advertise_vrf_routes(bgp_vrf);
3041
3042 /* update all type-2 routes */
3043 for (ALL_LIST_ELEMENTS_RO(bgp_vrf->l2vnis, node, vpn))
3044 update_routes_for_vni(bgp_def, vpn);
3045 }
3046
3047 /*
3048 * Public functions.
3049 */
3050
3051 /* withdraw all type-5 routes for an address family */
3052 void bgp_evpn_withdraw_type5_routes(struct bgp *bgp_vrf,
3053 afi_t afi, safi_t safi)
3054 {
3055 struct bgp_table *table = NULL;
3056 struct bgp_node *rn = NULL;
3057
3058 if (!advertise_type5_routes(bgp_vrf, afi))
3059 return;
3060
3061 table = bgp_vrf->rib[afi][safi];
3062 for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
3063
3064 int ret = 0;
3065 struct prefix_evpn evp;
3066 char buf[PREFIX_STRLEN];
3067
3068 build_type5_prefix_from_ip_prefix(&evp, &rn->p);
3069 ret = delete_evpn_type5_route(bgp_vrf, &evp);
3070 if (ret) {
3071 zlog_err(
3072 "%u failed to delete type-5 route for prefix %s in vrf %s",
3073 bgp_vrf->vrf_id,
3074 prefix2str(&rn->p, buf, sizeof(buf)),
3075 vrf_id_to_name(bgp_vrf->vrf_id));
3076 }
3077 }
3078 }
3079
3080 /* advertise all type-5 routes for an address family */
3081 void bgp_evpn_advertise_type5_routes(struct bgp *bgp_vrf,
3082 afi_t afi, safi_t safi)
3083 {
3084 struct bgp_table *table = NULL;
3085 struct bgp_node *rn = NULL;
3086
3087 if (!advertise_type5_routes(bgp_vrf, afi))
3088 return;
3089
3090 table = bgp_vrf->rib[afi][safi];
3091 for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
3092
3093 int ret = 0;
3094 struct prefix_evpn evp;
3095 char buf[PREFIX_STRLEN];
3096
3097 if (!rn->info)
3098 continue;
3099
3100 /* only advertise subnet routes as type-5 */
3101 if (is_host_route(&rn->p))
3102 continue;
3103
3104 build_type5_prefix_from_ip_prefix(&evp, &rn->p);
3105 ret = update_evpn_type5_route(bgp_vrf, &evp);
3106 if (ret) {
3107 zlog_err(
3108 "%u failed to create type-5 route for prefix %s in vrf %s",
3109 bgp_vrf->vrf_id,
3110 prefix2str(&rn->p, buf, sizeof(buf)),
3111 vrf_id_to_name(bgp_vrf->vrf_id));
3112 }
3113 }
3114 }
3115
3116 void evpn_rt_delete_auto(struct bgp *bgp, vni_t vni,
3117 struct list *rtl)
3118 {
3119 struct listnode *node, *nnode, *node_to_del;
3120 struct ecommunity *ecom, *ecom_auto;
3121 struct ecommunity_val eval;
3122
3123 encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
3124
3125 ecom_auto = ecommunity_new();
3126 ecommunity_add_val(ecom_auto, &eval);
3127 node_to_del = NULL;
3128
3129 for (ALL_LIST_ELEMENTS(rtl, node, nnode, ecom)) {
3130 if (ecommunity_match(ecom, ecom_auto)) {
3131 ecommunity_free(&ecom);
3132 node_to_del = node;
3133 }
3134 }
3135
3136 if (node_to_del)
3137 list_delete_node(rtl, node_to_del);
3138
3139 ecommunity_free(&ecom_auto);
3140 }
3141
3142 void bgp_evpn_configure_import_rt_for_vrf(struct bgp *bgp_vrf,
3143 struct ecommunity *ecomadd)
3144 {
3145 /* uninstall routes from vrf */
3146 uninstall_routes_for_vrf(bgp_vrf);
3147
3148 /* Cleanup the RT to VRF mapping */
3149 bgp_evpn_unmap_vrf_from_its_rts(bgp_vrf);
3150
3151 /* Remove auto generated RT */
3152 evpn_auto_rt_import_delete_for_vrf(bgp_vrf);
3153
3154 /* Add the newly configured RT to RT list */
3155 listnode_add_sort(bgp_vrf->vrf_import_rtl, ecomadd);
3156 SET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_IMPORT_RT_CFGD);
3157
3158 /* map VRF to its RTs */
3159 bgp_evpn_map_vrf_to_its_rts(bgp_vrf);
3160
3161 /* install routes matching the new VRF */
3162 install_routes_for_vrf(bgp_vrf);
3163 }
3164
3165 void bgp_evpn_unconfigure_import_rt_for_vrf(struct bgp *bgp_vrf,
3166 struct ecommunity *ecomdel)
3167 {
3168 struct listnode *node = NULL, *nnode = NULL, *node_to_del = NULL;
3169 struct ecommunity *ecom = NULL;
3170
3171 /* uninstall routes from vrf */
3172 uninstall_routes_for_vrf(bgp_vrf);
3173
3174 /* Cleanup the RT to VRF mapping */
3175 bgp_evpn_unmap_vrf_from_its_rts(bgp_vrf);
3176
3177 /* remove the RT from the RT list */
3178 for (ALL_LIST_ELEMENTS(bgp_vrf->vrf_import_rtl, node, nnode, ecom)) {
3179 if (ecommunity_match(ecom, ecomdel)) {
3180 ecommunity_free(&ecom);
3181 node_to_del = node;
3182 break;
3183 }
3184 }
3185
3186 if (node_to_del)
3187 list_delete_node(bgp_vrf->vrf_import_rtl, node_to_del);
3188
3189 /* fallback to auto import rt, if this was the last RT */
3190 if (list_isempty(bgp_vrf->vrf_import_rtl)) {
3191 UNSET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_IMPORT_RT_CFGD);
3192 evpn_auto_rt_import_add_for_vrf(bgp_vrf);
3193 }
3194
3195 /* map VRFs to its RTs */
3196 bgp_evpn_map_vrf_to_its_rts(bgp_vrf);
3197
3198 /* install routes matching this new RT */
3199 install_routes_for_vrf(bgp_vrf);
3200 }
3201
3202 void bgp_evpn_configure_export_rt_for_vrf(struct bgp *bgp_vrf,
3203 struct ecommunity *ecomadd)
3204 {
3205 /* remove auto-generated RT */
3206 evpn_auto_rt_export_delete_for_vrf(bgp_vrf);
3207
3208 /* Add the new RT to the RT list */
3209 listnode_add_sort(bgp_vrf->vrf_export_rtl, ecomadd);
3210 SET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_EXPORT_RT_CFGD);
3211
3212 bgp_evpn_handle_export_rt_change_for_vrf(bgp_vrf);
3213
3214 }
3215
3216 void bgp_evpn_unconfigure_export_rt_for_vrf(struct bgp *bgp_vrf,
3217 struct ecommunity *ecomdel)
3218 {
3219 struct listnode *node = NULL, *nnode = NULL, *node_to_del = NULL;
3220 struct ecommunity *ecom = NULL;
3221
3222 /* Remove the RT from the RT list */
3223 for (ALL_LIST_ELEMENTS(bgp_vrf->vrf_export_rtl, node, nnode, ecom)) {
3224 if (ecommunity_match(ecom, ecomdel)) {
3225 ecommunity_free(&ecom);
3226 node_to_del = node;
3227 break;
3228 }
3229 }
3230
3231 if (node_to_del)
3232 list_delete_node(bgp_vrf->vrf_export_rtl, node_to_del);
3233
3234 /* fall back to auto-generated RT if this was the last RT */
3235 if (list_isempty(bgp_vrf->vrf_export_rtl)) {
3236 UNSET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_EXPORT_RT_CFGD);
3237 evpn_auto_rt_export_add_for_vrf(bgp_vrf);
3238 }
3239
3240 bgp_evpn_handle_export_rt_change_for_vrf(bgp_vrf);
3241 }
3242
3243 /*
3244 * Handle change to BGP router id. This is invoked twice by the change
3245 * handler, first before the router id has been changed and then after
3246 * the router id has been changed. The first invocation will result in
3247 * local routes for all VNIs/VRF being deleted and withdrawn and the next
3248 * will result in the routes being re-advertised.
3249 */
3250 void bgp_evpn_handle_router_id_update(struct bgp *bgp, int withdraw)
3251 {
3252 if (withdraw) {
3253
3254 /* delete and withdraw all the type-5 routes
3255 stored in the global table for this vrf */
3256 withdraw_router_id_vrf(bgp);
3257
3258 /* delete all the VNI routes (type-2/type-3) routes for all the
3259 * L2-VNIs */
3260 hash_iterate(bgp->vnihash,
3261 (void (*)(struct hash_backet *,
3262 void *))withdraw_router_id_vni,
3263 bgp);
3264 } else {
3265
3266 /* advertise all routes in the vrf as type-5 routes with the new
3267 * RD */
3268 update_router_id_vrf(bgp);
3269
3270 /* advertise all the VNI routes (type-2/type-3) routes with the
3271 * new RD*/
3272 hash_iterate(bgp->vnihash,
3273 (void (*)(struct hash_backet *,
3274 void *))update_router_id_vni,
3275 bgp);
3276 }
3277 }
3278
3279 /*
3280 * Handle change to export RT - update and advertise local routes.
3281 */
3282 int bgp_evpn_handle_export_rt_change(struct bgp *bgp, struct bgpevpn *vpn)
3283 {
3284 return update_routes_for_vni(bgp, vpn);
3285 }
3286
3287 void bgp_evpn_handle_vrf_rd_change(struct bgp *bgp_vrf,
3288 int withdraw)
3289 {
3290 if (withdraw)
3291 delete_withdraw_vrf_routes(bgp_vrf);
3292 else
3293 update_advertise_vrf_routes(bgp_vrf);
3294 }
3295
3296 /*
3297 * Handle change to RD. This is invoked twice by the change handler,
3298 * first before the RD has been changed and then after the RD has
3299 * been changed. The first invocation will result in local routes
3300 * of this VNI being deleted and withdrawn and the next will result
3301 * in the routes being re-advertised.
3302 */
3303 void bgp_evpn_handle_rd_change(struct bgp *bgp, struct bgpevpn *vpn,
3304 int withdraw)
3305 {
3306 if (withdraw)
3307 delete_withdraw_vni_routes(bgp, vpn);
3308 else
3309 update_advertise_vni_routes(bgp, vpn);
3310 }
3311
3312 /*
3313 * Install routes for this VNI. Invoked upon change to Import RT.
3314 */
3315 int bgp_evpn_install_routes(struct bgp *bgp, struct bgpevpn *vpn)
3316 {
3317 return install_routes_for_vni(bgp, vpn);
3318 }
3319
3320 /*
3321 * Uninstall all routes installed for this VNI. Invoked upon change
3322 * to Import RT.
3323 */
3324 int bgp_evpn_uninstall_routes(struct bgp *bgp, struct bgpevpn *vpn)
3325 {
3326 return uninstall_routes_for_vni(bgp, vpn);
3327 }
3328
3329 /*
3330 * Function to display "tag" in route as a VNI.
3331 */
3332 char *bgp_evpn_label2str(mpls_label_t *label, char *buf, int len)
3333 {
3334 vni_t vni;
3335
3336 vni = label2vni(label);
3337 snprintf(buf, len, "%u", vni);
3338 return buf;
3339 }
3340
3341 /*
3342 * Function to convert evpn route to json format.
3343 * NOTE: We don't use prefix2str as the output here is a bit different.
3344 */
3345 void bgp_evpn_route2json(struct prefix_evpn *p, json_object *json)
3346 {
3347 char buf1[ETHER_ADDR_STRLEN];
3348 char buf2[PREFIX2STR_BUFFER];
3349
3350 if (!json)
3351 return;
3352
3353 if (p->prefix.route_type == BGP_EVPN_IMET_ROUTE) {
3354 json_object_int_add(json, "routeType", p->prefix.route_type);
3355 json_object_int_add(json, "ethTag", 0);
3356 json_object_int_add(json, "ipLen",
3357 IS_EVPN_PREFIX_IPADDR_V4(p)
3358 ? IPV4_MAX_BITLEN
3359 : IPV6_MAX_BITLEN);
3360 json_object_string_add(json, "ip",
3361 inet_ntoa(p->prefix.ip.ipaddr_v4));
3362 } else if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE) {
3363 if (IS_EVPN_PREFIX_IPADDR_NONE(p)) {
3364 json_object_int_add(json, "routeType",
3365 p->prefix.route_type);
3366 json_object_int_add(
3367 json, "esi",
3368 0); /* TODO: we don't support esi yet */
3369 json_object_int_add(json, "ethTag", 0);
3370 json_object_int_add(json, "macLen", 8 * ETH_ALEN);
3371 json_object_string_add(json, "mac",
3372 prefix_mac2str(&p->prefix.mac,
3373 buf1,
3374 sizeof(buf1)));
3375 } else {
3376 u_char family;
3377
3378 family = IS_EVPN_PREFIX_IPADDR_V4(p) ? AF_INET
3379 : AF_INET6;
3380
3381 json_object_int_add(json, "routeType",
3382 p->prefix.route_type);
3383 json_object_int_add(
3384 json, "esi",
3385 0); /* TODO: we don't support esi yet */
3386 json_object_int_add(json, "ethTag", 0);
3387 json_object_int_add(json, "macLen", 8 * ETH_ALEN);
3388 json_object_string_add(json, "mac",
3389 prefix_mac2str(&p->prefix.mac,
3390 buf1,
3391 sizeof(buf1)));
3392 json_object_int_add(json, "ipLen",
3393 IS_EVPN_PREFIX_IPADDR_V4(p)
3394 ? IPV4_MAX_BITLEN
3395 : IPV6_MAX_BITLEN);
3396 json_object_string_add(
3397 json, "ip",
3398 inet_ntop(family, &p->prefix.ip.ip.addr, buf2,
3399 PREFIX2STR_BUFFER));
3400 }
3401 } else {
3402 /* Currently, this is to cater to other AF_ETHERNET code. */
3403 }
3404 }
3405
3406 /*
3407 * Function to convert evpn route to string.
3408 * NOTE: We don't use prefix2str as the output here is a bit different.
3409 */
3410 char *bgp_evpn_route2str(struct prefix_evpn *p, char *buf, int len)
3411 {
3412 char buf1[ETHER_ADDR_STRLEN];
3413 char buf2[PREFIX2STR_BUFFER];
3414
3415 if (p->prefix.route_type == BGP_EVPN_IMET_ROUTE) {
3416 snprintf(buf, len, "[%d]:[0]:[%d]:[%s]", p->prefix.route_type,
3417 IS_EVPN_PREFIX_IPADDR_V4(p) ? IPV4_MAX_BITLEN
3418 : IPV6_MAX_BITLEN,
3419 inet_ntoa(p->prefix.ip.ipaddr_v4));
3420 } else if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE) {
3421 if (IS_EVPN_PREFIX_IPADDR_NONE(p))
3422 snprintf(buf, len, "[%d]:[0]:[0]:[%d]:[%s]",
3423 p->prefix.route_type, 8 * ETH_ALEN,
3424 prefix_mac2str(&p->prefix.mac, buf1,
3425 sizeof(buf1)));
3426 else {
3427 u_char family;
3428
3429 family = IS_EVPN_PREFIX_IPADDR_V4(p) ? AF_INET
3430 : AF_INET6;
3431 snprintf(buf, len, "[%d]:[0]:[0]:[%d]:[%s]:[%d]:[%s]",
3432 p->prefix.route_type, 8 * ETH_ALEN,
3433 prefix_mac2str(&p->prefix.mac, buf1,
3434 sizeof(buf1)),
3435 family == AF_INET ? IPV4_MAX_BITLEN
3436 : IPV6_MAX_BITLEN,
3437 inet_ntop(family, &p->prefix.ip.ip.addr, buf2,
3438 PREFIX2STR_BUFFER));
3439 }
3440 } else if (p->prefix.route_type == BGP_EVPN_IP_PREFIX_ROUTE) {
3441 snprintf(buf, len, "[%d]:[0]:[%d]:[%s]",
3442 p->prefix.route_type,
3443 p->prefix.ip_prefix_length,
3444 IS_EVPN_PREFIX_IPADDR_V4(p) ?
3445 inet_ntoa(p->prefix.ip.ipaddr_v4) :
3446 inet6_ntoa(p->prefix.ip.ipaddr_v6));
3447 } else {
3448 /* For EVPN route types not supported yet. */
3449 snprintf(buf, len, "(unsupported route type %d)",
3450 p->prefix.route_type);
3451 }
3452
3453 return (buf);
3454 }
3455
3456 /*
3457 * Encode EVPN prefix in Update (MP_REACH)
3458 */
3459 void bgp_evpn_encode_prefix(struct stream *s, struct prefix *p,
3460 struct prefix_rd *prd, mpls_label_t *label,
3461 struct attr *attr, int addpath_encode,
3462 u_int32_t addpath_tx_id)
3463 {
3464 struct prefix_evpn *evp = (struct prefix_evpn *)p;
3465 int ipa_len = 0;
3466
3467 if (addpath_encode)
3468 stream_putl(s, addpath_tx_id);
3469
3470 /* Route type */
3471 stream_putc(s, evp->prefix.route_type);
3472
3473 switch (evp->prefix.route_type) {
3474 case BGP_EVPN_MAC_IP_ROUTE:
3475 if (IS_EVPN_PREFIX_IPADDR_V4(evp))
3476 ipa_len = IPV4_MAX_BYTELEN;
3477 else if (IS_EVPN_PREFIX_IPADDR_V6(evp))
3478 ipa_len = IPV6_MAX_BYTELEN;
3479 stream_putc(s, 33 + ipa_len); // 1 VNI
3480 stream_put(s, prd->val, 8); /* RD */
3481 stream_put(s, 0, 10); /* ESI */
3482 stream_putl(s, 0); /* Ethernet Tag ID */
3483 stream_putc(s, 8 * ETH_ALEN); /* Mac Addr Len - bits */
3484 stream_put(s, evp->prefix.mac.octet, 6); /* Mac Addr */
3485 stream_putc(s, 8 * ipa_len); /* IP address Length */
3486 if (ipa_len)
3487 stream_put(s, &evp->prefix.ip.ip.addr,
3488 ipa_len); /* IP */
3489 stream_put(s, label,
3490 BGP_LABEL_BYTES); /* VNI is contained in 'tag' */
3491 break;
3492
3493 case BGP_EVPN_IMET_ROUTE:
3494 stream_putc(s, 17); // TODO: length - assumes IPv4 address
3495 stream_put(s, prd->val, 8); /* RD */
3496 stream_putl(s, 0); /* Ethernet Tag ID */
3497 stream_putc(s, IPV4_MAX_BITLEN); /* IP address Length - bits */
3498 /* Originating Router's IP Addr */
3499 stream_put_in_addr(s, &evp->prefix.ip.ipaddr_v4);
3500 break;
3501
3502 case BGP_EVPN_IP_PREFIX_ROUTE:
3503 /* TODO: AddPath support. */
3504 evpn_mpattr_encode_type5(s, p, prd, label, attr);
3505 break;
3506
3507 default:
3508 break;
3509 }
3510 }
3511
3512 int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr,
3513 struct bgp_nlri *packet, int withdraw)
3514 {
3515 u_char *pnt;
3516 u_char *lim;
3517 afi_t afi;
3518 safi_t safi;
3519 u_int32_t addpath_id;
3520 int addpath_encoded;
3521 int psize = 0;
3522 u_char rtype;
3523 u_char rlen;
3524 struct prefix p;
3525
3526 /* Check peer status. */
3527 if (peer->status != Established) {
3528 zlog_err("%u:%s - EVPN update received in state %d",
3529 peer->bgp->vrf_id, peer->host, peer->status);
3530 return -1;
3531 }
3532
3533 /* Start processing the NLRI - there may be multiple in the MP_REACH */
3534 pnt = packet->nlri;
3535 lim = pnt + packet->length;
3536 afi = packet->afi;
3537 safi = packet->safi;
3538 addpath_id = 0;
3539
3540 addpath_encoded =
3541 (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV)
3542 && CHECK_FLAG(peer->af_cap[afi][safi],
3543 PEER_CAP_ADDPATH_AF_TX_RCV));
3544
3545 for (; pnt < lim; pnt += psize) {
3546 /* Clear prefix structure. */
3547 memset(&p, 0, sizeof(struct prefix));
3548
3549 /* Deal with path-id if AddPath is supported. */
3550 if (addpath_encoded) {
3551 /* When packet overflow occurs return immediately. */
3552 if (pnt + BGP_ADDPATH_ID_LEN > lim)
3553 return -1;
3554
3555 addpath_id = ntohl(*((uint32_t *)pnt));
3556 pnt += BGP_ADDPATH_ID_LEN;
3557 }
3558
3559 /* All EVPN NLRI types start with type and length. */
3560 if (pnt + 2 > lim)
3561 return -1;
3562
3563 rtype = *pnt++;
3564 psize = rlen = *pnt++;
3565
3566 /* When packet overflow occur return immediately. */
3567 if (pnt + psize > lim)
3568 return -1;
3569
3570 switch (rtype) {
3571 case BGP_EVPN_MAC_IP_ROUTE:
3572 if (process_type2_route(peer, afi, safi,
3573 withdraw ? NULL : attr, pnt,
3574 psize, addpath_id)) {
3575 zlog_err(
3576 "%u:%s - Error in processing EVPN type-2 NLRI size %d",
3577 peer->bgp->vrf_id, peer->host, psize);
3578 return -1;
3579 }
3580 break;
3581
3582 case BGP_EVPN_IMET_ROUTE:
3583 if (process_type3_route(peer, afi, safi,
3584 withdraw ? NULL : attr, pnt,
3585 psize, addpath_id)) {
3586 zlog_err(
3587 "%u:%s - Error in processing EVPN type-3 NLRI size %d",
3588 peer->bgp->vrf_id, peer->host, psize);
3589 return -1;
3590 }
3591 break;
3592
3593 case BGP_EVPN_IP_PREFIX_ROUTE:
3594 if (process_type5_route(peer, afi, safi, attr, pnt,
3595 psize, addpath_id, withdraw)) {
3596 zlog_err(
3597 "%u:%s - Error in processing EVPN type-5 NLRI size %d",
3598 peer->bgp->vrf_id, peer->host, psize);
3599 return -1;
3600 }
3601 break;
3602
3603 default:
3604 break;
3605 }
3606 }
3607
3608 /* Packet length consistency check. */
3609 if (pnt != lim)
3610 return -1;
3611
3612 return 0;
3613 }
3614
3615 /*
3616 * Map the RTs (configured or automatically derived) of a VRF to the VRF.
3617 * The mapping will be used during route processing.
3618 * bgp_def: default bgp instance
3619 * bgp_vrf: specific bgp vrf instance on which RT is configured
3620 */
3621 void bgp_evpn_map_vrf_to_its_rts(struct bgp *bgp_vrf)
3622 {
3623 int i = 0;
3624 struct ecommunity_val *eval = NULL;
3625 struct listnode *node = NULL, *nnode = NULL;
3626 struct ecommunity *ecom = NULL;
3627
3628 for (ALL_LIST_ELEMENTS(bgp_vrf->vrf_import_rtl, node, nnode, ecom)) {
3629 for (i = 0; i < ecom->size; i++) {
3630 eval = (struct ecommunity_val *)(ecom->val
3631 + (i
3632 * ECOMMUNITY_SIZE));
3633 map_vrf_to_rt(bgp_vrf, eval);
3634 }
3635 }
3636 }
3637
3638 /*
3639 * Unmap the RTs (configured or automatically derived) of a VRF from the VRF.
3640 */
3641 void bgp_evpn_unmap_vrf_from_its_rts(struct bgp *bgp_vrf)
3642 {
3643 int i;
3644 struct ecommunity_val *eval;
3645 struct listnode *node, *nnode;
3646 struct ecommunity *ecom;
3647
3648 for (ALL_LIST_ELEMENTS(bgp_vrf->vrf_import_rtl, node, nnode, ecom)) {
3649 for (i = 0; i < ecom->size; i++) {
3650 struct vrf_irt_node *irt;
3651 struct ecommunity_val eval_tmp;
3652
3653 eval = (struct ecommunity_val *)(ecom->val
3654 + (i
3655 * ECOMMUNITY_SIZE));
3656 /* If using "automatic" RT, we only care about the
3657 * local-admin sub-field.
3658 * This is to facilitate using VNI as the RT for EBGP
3659 * peering too.
3660 */
3661 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
3662 if (!CHECK_FLAG(bgp_vrf->vrf_flags,
3663 BGP_VRF_IMPORT_RT_CFGD))
3664 mask_ecom_global_admin(&eval_tmp, eval);
3665
3666 irt = lookup_vrf_import_rt(&eval_tmp);
3667 if (irt)
3668 unmap_vrf_from_rt(bgp_vrf, irt);
3669 }
3670 }
3671 }
3672
3673
3674
3675 /*
3676 * Map the RTs (configured or automatically derived) of a VNI to the VNI.
3677 * The mapping will be used during route processing.
3678 */
3679 void bgp_evpn_map_vni_to_its_rts(struct bgp *bgp, struct bgpevpn *vpn)
3680 {
3681 int i;
3682 struct ecommunity_val *eval;
3683 struct listnode *node, *nnode;
3684 struct ecommunity *ecom;
3685
3686 for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, ecom)) {
3687 for (i = 0; i < ecom->size; i++) {
3688 eval = (struct ecommunity_val *)(ecom->val
3689 + (i
3690 * ECOMMUNITY_SIZE));
3691 map_vni_to_rt(bgp, vpn, eval);
3692 }
3693 }
3694 }
3695
3696 /*
3697 * Unmap the RTs (configured or automatically derived) of a VNI from the VNI.
3698 */
3699 void bgp_evpn_unmap_vni_from_its_rts(struct bgp *bgp, struct bgpevpn *vpn)
3700 {
3701 int i;
3702 struct ecommunity_val *eval;
3703 struct listnode *node, *nnode;
3704 struct ecommunity *ecom;
3705
3706 for (ALL_LIST_ELEMENTS(vpn->import_rtl, node, nnode, ecom)) {
3707 for (i = 0; i < ecom->size; i++) {
3708 struct irt_node *irt;
3709 struct ecommunity_val eval_tmp;
3710
3711 eval = (struct ecommunity_val *)(ecom->val
3712 + (i
3713 * ECOMMUNITY_SIZE));
3714 /* If using "automatic" RT, we only care about the
3715 * local-admin sub-field.
3716 * This is to facilitate using VNI as the RT for EBGP
3717 * peering too.
3718 */
3719 memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
3720 if (!is_import_rt_configured(vpn))
3721 mask_ecom_global_admin(&eval_tmp, eval);
3722
3723 irt = lookup_import_rt(bgp, &eval_tmp);
3724 if (irt)
3725 unmap_vni_from_rt(bgp, vpn, irt);
3726 }
3727 }
3728 }
3729
3730 /*
3731 * Derive Import RT automatically for VNI and map VNI to RT.
3732 * The mapping will be used during route processing.
3733 */
3734 void bgp_evpn_derive_auto_rt_import(struct bgp *bgp, struct bgpevpn *vpn)
3735 {
3736 form_auto_rt(bgp, vpn->vni, vpn->import_rtl);
3737 UNSET_FLAG(vpn->flags, VNI_FLAG_IMPRT_CFGD);
3738
3739 /* Map RT to VNI */
3740 bgp_evpn_map_vni_to_its_rts(bgp, vpn);
3741 }
3742
3743 /*
3744 * Derive Export RT automatically for VNI.
3745 */
3746 void bgp_evpn_derive_auto_rt_export(struct bgp *bgp, struct bgpevpn *vpn)
3747 {
3748 form_auto_rt(bgp, vpn->vni, vpn->export_rtl);
3749 UNSET_FLAG(vpn->flags, VNI_FLAG_EXPRT_CFGD);
3750 }
3751
3752 /*
3753 * Derive RD automatically for VNI using passed information - it
3754 * is of the form RouterId:unique-id-for-vni.
3755 */
3756 void bgp_evpn_derive_auto_rd_for_vrf(struct bgp *bgp)
3757 {
3758 char buf[100];
3759
3760 bgp->vrf_prd.family = AF_UNSPEC;
3761 bgp->vrf_prd.prefixlen = 64;
3762 sprintf(buf, "%s:%hu", inet_ntoa(bgp->router_id), bgp->vrf_rd_id);
3763 str2prefix_rd(buf, &bgp->vrf_prd);
3764 }
3765
3766 /*
3767 * Derive RD automatically for VNI using passed information - it
3768 * is of the form RouterId:unique-id-for-vni.
3769 */
3770 void bgp_evpn_derive_auto_rd(struct bgp *bgp, struct bgpevpn *vpn)
3771 {
3772 char buf[100];
3773
3774 vpn->prd.family = AF_UNSPEC;
3775 vpn->prd.prefixlen = 64;
3776 sprintf(buf, "%s:%hu", inet_ntoa(bgp->router_id), vpn->rd_id);
3777 (void)str2prefix_rd(buf, &vpn->prd);
3778 UNSET_FLAG(vpn->flags, VNI_FLAG_RD_CFGD);
3779 }
3780
3781 /*
3782 * Lookup VNI.
3783 */
3784 struct bgpevpn *bgp_evpn_lookup_vni(struct bgp *bgp, vni_t vni)
3785 {
3786 struct bgpevpn *vpn;
3787 struct bgpevpn tmp;
3788
3789 memset(&tmp, 0, sizeof(struct bgpevpn));
3790 tmp.vni = vni;
3791 vpn = hash_lookup(bgp->vnihash, &tmp);
3792 return vpn;
3793 }
3794
3795 /*
3796 * Create a new vpn - invoked upon configuration or zebra notification.
3797 */
3798 struct bgpevpn *bgp_evpn_new(struct bgp *bgp, vni_t vni,
3799 struct in_addr originator_ip,
3800 vrf_id_t tenant_vrf_id)
3801 {
3802 struct bgpevpn *vpn;
3803
3804 if (!bgp)
3805 return NULL;
3806
3807 vpn = XCALLOC(MTYPE_BGP_EVPN, sizeof(struct bgpevpn));
3808 if (!vpn)
3809 return NULL;
3810
3811 /* Set values - RD and RT set to defaults. */
3812 vpn->vni = vni;
3813 vpn->originator_ip = originator_ip;
3814 vpn->tenant_vrf_id = tenant_vrf_id;
3815
3816 /* Initialize route-target import and export lists */
3817 vpn->import_rtl = list_new();
3818 vpn->import_rtl->cmp = (int (*)(void *, void *))evpn_route_target_cmp;
3819 vpn->export_rtl = list_new();
3820 vpn->export_rtl->cmp = (int (*)(void *, void *))evpn_route_target_cmp;
3821 bf_assign_index(bm->rd_idspace, vpn->rd_id);
3822 derive_rd_rt_for_vni(bgp, vpn);
3823
3824 /* Initialize EVPN route table. */
3825 vpn->route_table = bgp_table_init(AFI_L2VPN, SAFI_EVPN);
3826
3827 /* Add to hash */
3828 if (!hash_get(bgp->vnihash, vpn, hash_alloc_intern)) {
3829 XFREE(MTYPE_BGP_EVPN, vpn);
3830 return NULL;
3831 }
3832
3833 /* add to l2vni list on corresponding vrf */
3834 bgpevpn_link_to_l3vni(vpn);
3835
3836 QOBJ_REG(vpn, bgpevpn);
3837 return vpn;
3838 }
3839
3840 /*
3841 * Free a given VPN - called in multiple scenarios such as zebra
3842 * notification, configuration being deleted, advertise-all-vni disabled etc.
3843 * This just frees appropriate memory, caller should have taken other
3844 * needed actions.
3845 */
3846 void bgp_evpn_free(struct bgp *bgp, struct bgpevpn *vpn)
3847 {
3848 bgpevpn_unlink_from_l3vni(vpn);
3849 bgp_table_unlock(vpn->route_table);
3850 bgp_evpn_unmap_vni_from_its_rts(bgp, vpn);
3851 list_delete_and_null(&vpn->import_rtl);
3852 list_delete_and_null(&vpn->export_rtl);
3853 bf_release_index(bm->rd_idspace, vpn->rd_id);
3854 hash_release(bgp->vnihash, vpn);
3855 QOBJ_UNREG(vpn);
3856 XFREE(MTYPE_BGP_EVPN, vpn);
3857 }
3858
3859 /*
3860 * Import route into matching VNI(s).
3861 */
3862 int bgp_evpn_import_route(struct bgp *bgp, afi_t afi, safi_t safi,
3863 struct prefix *p, struct bgp_info *ri)
3864 {
3865 return install_uninstall_evpn_route(bgp, afi, safi, p, ri, 1);
3866 }
3867
3868 /*
3869 * Unimport route from matching VNI(s).
3870 */
3871 int bgp_evpn_unimport_route(struct bgp *bgp, afi_t afi, safi_t safi,
3872 struct prefix *p, struct bgp_info *ri)
3873 {
3874 return install_uninstall_evpn_route(bgp, afi, safi, p, ri, 0);
3875 }
3876
3877 /* filter routes which have martian next hops */
3878 int bgp_filter_evpn_routes_upon_martian_nh_change(struct bgp *bgp)
3879 {
3880 afi_t afi;
3881 safi_t safi;
3882 struct bgp_node *rd_rn, *rn;
3883 struct bgp_table *table;
3884 struct bgp_info *ri;
3885
3886 afi = AFI_L2VPN;
3887 safi = SAFI_EVPN;
3888
3889 /* Walk entire global routing table and evaluate routes which could be
3890 * imported into this VPN. Note that we cannot just look at the routes
3891 * for the VNI's RD -
3892 * remote routes applicable for this VNI could have any RD.
3893 */
3894 /* EVPN routes are a 2-level table. */
3895 for (rd_rn = bgp_table_top(bgp->rib[afi][safi]); rd_rn;
3896 rd_rn = bgp_route_next(rd_rn)) {
3897 table = (struct bgp_table *)(rd_rn->info);
3898 if (!table)
3899 continue;
3900
3901 for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
3902
3903 for (ri = rn->info; ri; ri = ri->next) {
3904
3905 /* Consider "valid" remote routes applicable for
3906 * this VNI. */
3907 if (!(ri->type == ZEBRA_ROUTE_BGP
3908 && ri->sub_type == BGP_ROUTE_NORMAL))
3909 continue;
3910
3911 if (bgp_nexthop_self(bgp, ri->attr->nexthop)) {
3912
3913 char attr_str[BUFSIZ];
3914 char pbuf[PREFIX_STRLEN];
3915
3916 bgp_dump_attr(ri->attr, attr_str,
3917 BUFSIZ);
3918
3919 if (bgp_debug_update(ri->peer, &rn->p,
3920 NULL, 1))
3921 zlog_debug(
3922 "%u: prefix %s with attr %s - DENIED due to martian or self nexthop",
3923 bgp->vrf_id,
3924 prefix2str(
3925 &rn->p, pbuf,
3926 sizeof(pbuf)),
3927 attr_str);
3928
3929 bgp_evpn_unimport_route(bgp, afi, safi,
3930 &rn->p, ri);
3931
3932 bgp_rib_remove(rn, ri, ri->peer, afi,
3933 safi);
3934 }
3935 }
3936 }
3937 }
3938
3939 return 0;
3940 }
3941
3942 /*
3943 * Handle del of a local MACIP.
3944 */
3945 int bgp_evpn_local_macip_del(struct bgp *bgp, vni_t vni, struct ethaddr *mac,
3946 struct ipaddr *ip)
3947 {
3948 struct bgpevpn *vpn;
3949 struct prefix_evpn p;
3950
3951 if (!bgp->vnihash) {
3952 zlog_err("%u: VNI hash not created", bgp->vrf_id);
3953 return -1;
3954 }
3955
3956 /* Lookup VNI hash - should exist. */
3957 vpn = bgp_evpn_lookup_vni(bgp, vni);
3958 if (!vpn || !is_vni_live(vpn)) {
3959 zlog_warn("%u: VNI hash entry for VNI %u %s at MACIP DEL",
3960 bgp->vrf_id, vni, vpn ? "not live" : "not found");
3961 return -1;
3962 }
3963
3964 /* Remove EVPN type-2 route and schedule for processing. */
3965 build_evpn_type2_prefix(&p, mac, ip);
3966 delete_evpn_route(bgp, vpn, &p);
3967
3968 return 0;
3969 }
3970
3971 /*
3972 * Handle add of a local MACIP.
3973 */
3974 int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni, struct ethaddr *mac,
3975 struct ipaddr *ip, u_char flags)
3976 {
3977 struct bgpevpn *vpn;
3978 struct prefix_evpn p;
3979
3980 if (!bgp->vnihash) {
3981 zlog_err("%u: VNI hash not created", bgp->vrf_id);
3982 return -1;
3983 }
3984
3985 /* Lookup VNI hash - should exist. */
3986 vpn = bgp_evpn_lookup_vni(bgp, vni);
3987 if (!vpn || !is_vni_live(vpn)) {
3988 zlog_warn("%u: VNI hash entry for VNI %u %s at MACIP ADD",
3989 bgp->vrf_id, vni, vpn ? "not live" : "not found");
3990 return -1;
3991 }
3992
3993 /* Create EVPN type-2 route and schedule for processing. */
3994 build_evpn_type2_prefix(&p, mac, ip);
3995 if (update_evpn_route(bgp, vpn, &p, flags)) {
3996 char buf[ETHER_ADDR_STRLEN];
3997 char buf2[INET6_ADDRSTRLEN];
3998
3999 zlog_err(
4000 "%u:Failed to create Type-2 route, VNI %u %s MAC %s IP %s",
4001 bgp->vrf_id, vpn->vni,
4002 CHECK_FLAG(flags, ZEBRA_MAC_TYPE_STICKY) ? "sticky gateway"
4003 : "",
4004 prefix_mac2str(mac, buf, sizeof(buf)),
4005 ipaddr2str(ip, buf2, sizeof(buf2)));
4006 return -1;
4007 }
4008
4009 return 0;
4010 }
4011
4012 static void link_l2vni_hash_to_l3vni(struct hash_backet *backet,
4013 struct bgp *bgp_vrf)
4014 {
4015 struct bgpevpn *vpn = NULL;
4016 struct bgp *bgp_def = NULL;
4017
4018 bgp_def = bgp_get_default();
4019 assert(bgp_def);
4020
4021 vpn = (struct bgpevpn *)backet->data;
4022 if (vpn->tenant_vrf_id == bgp_vrf->vrf_id)
4023 bgpevpn_link_to_l3vni(vpn);
4024 }
4025
4026 int bgp_evpn_local_l3vni_add(vni_t l3vni,
4027 vrf_id_t vrf_id,
4028 struct ethaddr *rmac,
4029 struct in_addr originator_ip)
4030 {
4031 struct bgp *bgp_vrf = NULL; /* bgp VRF instance */
4032 struct bgp *bgp_def = NULL; /* default bgp instance */
4033 struct listnode *node = NULL;
4034 struct bgpevpn *vpn = NULL;
4035 as_t as = 0;
4036
4037 /* get the default instamce - required to get the AS number for VRF
4038 * auto-creation*/
4039 bgp_def = bgp_get_default();
4040 if (!bgp_def) {
4041 zlog_err("Cannot process L3VNI %u ADD - default BGP instance not yet created",
4042 l3vni);
4043 return -1;
4044 }
4045 as = bgp_def->as;
4046
4047 /* if the BGP vrf instance doesnt exist - create one */
4048 bgp_vrf = bgp_lookup_by_name(vrf_id_to_name(vrf_id));
4049 if (!bgp_vrf) {
4050
4051 int ret = 0;
4052
4053 ret = bgp_get(&bgp_vrf, &as, vrf_id_to_name(vrf_id),
4054 BGP_INSTANCE_TYPE_VRF);
4055 switch (ret) {
4056 case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
4057 zlog_err("'bgp multiple-instance' not present\n");
4058 return -1;
4059 case BGP_ERR_AS_MISMATCH:
4060 zlog_err("BGP is already running; AS is %u\n", as);
4061 return -1;
4062 case BGP_ERR_INSTANCE_MISMATCH:
4063 zlog_err("BGP instance name and AS number mismatch\n");
4064 return -1;
4065 }
4066
4067 /* mark as auto created */
4068 SET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_AUTO);
4069 }
4070
4071 /* associate with l3vni */
4072 bgp_vrf->l3vni = l3vni;
4073
4074 /* set the router mac - to be used in mac-ip routes for this vrf */
4075 memcpy(&bgp_vrf->rmac, rmac, sizeof(struct ethaddr));
4076
4077 /* set the originator ip */
4078 bgp_vrf->originator_ip = originator_ip;
4079
4080 /* auto derive RD/RT */
4081 if (!CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_IMPORT_RT_CFGD))
4082 evpn_auto_rt_import_add_for_vrf(bgp_vrf);
4083 if (!CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_EXPORT_RT_CFGD))
4084 evpn_auto_rt_export_add_for_vrf(bgp_vrf);
4085 bgp_evpn_derive_auto_rd_for_vrf(bgp_vrf);
4086
4087 /* link all corresponding l2vnis */
4088 hash_iterate(bgp_def->vnihash,
4089 (void (*)(struct hash_backet *, void *))
4090 link_l2vni_hash_to_l3vni,
4091 bgp_vrf);
4092
4093 /* updates all corresponding local mac-ip routes */
4094 for (ALL_LIST_ELEMENTS_RO(bgp_vrf->l2vnis, node, vpn))
4095 update_routes_for_vni(bgp_def, vpn);
4096
4097 /* advertise type-5 routes if needed */
4098 update_advertise_vrf_routes(bgp_vrf);
4099
4100 /* install all remote routes belonging to this l3vni into correspondng
4101 * vrf */
4102 install_routes_for_vrf(bgp_vrf);
4103
4104 return 0;
4105 }
4106
4107 int bgp_evpn_local_l3vni_del(vni_t l3vni,
4108 vrf_id_t vrf_id)
4109 {
4110 struct bgp *bgp_vrf = NULL; /* bgp vrf instance */
4111 struct bgp *bgp_def = NULL; /* default bgp instance */
4112 struct listnode *node = NULL;
4113 struct bgpevpn *vpn = NULL;
4114
4115 bgp_vrf = bgp_lookup_by_vrf_id(vrf_id);
4116 if (!bgp_vrf) {
4117 zlog_err("Cannot process L3VNI %u Del - Could not find BGP instance",
4118 l3vni);
4119 return -1;
4120 }
4121
4122 bgp_def = bgp_get_default();
4123 if (!bgp_def) {
4124 zlog_err("Cannot process L3VNI %u Del - Could not find default BGP instance",
4125 l3vni);
4126 return -1;
4127 }
4128
4129 /* unimport remote routes from VRF, if it is AUTO vrf bgp_delete will
4130 * take care of uninstalling the routes from zebra */
4131 if (!CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_AUTO))
4132 uninstall_routes_for_vrf(bgp_vrf);
4133
4134 /* delete/withdraw all type-5 routes */
4135 delete_withdraw_vrf_routes(bgp_vrf);
4136
4137 /* remove the l3vni from vrf instance */
4138 bgp_vrf->l3vni = 0;
4139
4140 /* remove the Rmac from the BGP vrf */
4141 memset(&bgp_vrf->rmac, 0, sizeof(struct ethaddr));
4142
4143 /* delete RD/RT */
4144 if (bgp_vrf->vrf_import_rtl && !list_isempty(bgp_vrf->vrf_import_rtl)) {
4145 bgp_evpn_unmap_vrf_from_its_rts(bgp_vrf);
4146 list_delete_all_node(bgp_vrf->vrf_import_rtl);
4147 }
4148 if (bgp_vrf->vrf_export_rtl && !list_isempty(bgp_vrf->vrf_export_rtl)) {
4149 list_delete_all_node(bgp_vrf->vrf_export_rtl);
4150 }
4151
4152 /* update all corresponding local mac-ip routes */
4153 for (ALL_LIST_ELEMENTS_RO(bgp_vrf->l2vnis, node, vpn))
4154 update_routes_for_vni(bgp_def, vpn);
4155
4156
4157 /* Delete the instance if it was autocreated */
4158 if (CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_AUTO))
4159 bgp_delete(bgp_vrf);
4160
4161 return 0;
4162 }
4163
4164 /*
4165 * Handle del of a local VNI.
4166 */
4167 int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni)
4168 {
4169 struct bgpevpn *vpn;
4170
4171 if (!bgp->vnihash) {
4172 zlog_err("%u: VNI hash not created", bgp->vrf_id);
4173 return -1;
4174 }
4175
4176 /* Locate VNI hash */
4177 vpn = bgp_evpn_lookup_vni(bgp, vni);
4178 if (!vpn) {
4179 zlog_warn("%u: VNI hash entry for VNI %u not found at DEL",
4180 bgp->vrf_id, vni);
4181 return 0;
4182 }
4183
4184 /* Remove all local EVPN routes and schedule for processing (to
4185 * withdraw from peers).
4186 */
4187 delete_routes_for_vni(bgp, vpn);
4188
4189 /*
4190 * tunnel is no longer active, del tunnel ip address from tip_hash
4191 */
4192 bgp_tip_del(bgp, &vpn->originator_ip);
4193
4194 /* Clear "live" flag and see if hash needs to be freed. */
4195 UNSET_FLAG(vpn->flags, VNI_FLAG_LIVE);
4196 if (!is_vni_configured(vpn))
4197 bgp_evpn_free(bgp, vpn);
4198
4199 return 0;
4200 }
4201
4202 /*
4203 * Handle add (or update) of a local VNI. The only VNI change we care
4204 * about is change to local-tunnel-ip.
4205 */
4206 int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni,
4207 struct in_addr originator_ip,
4208 vrf_id_t tenant_vrf_id)
4209 {
4210 struct bgpevpn *vpn;
4211 struct prefix_evpn p;
4212
4213 if (!bgp->vnihash) {
4214 zlog_err("%u: VNI hash not created", bgp->vrf_id);
4215 return -1;
4216 }
4217
4218 /* Lookup VNI. If present and no change, exit. */
4219 vpn = bgp_evpn_lookup_vni(bgp, vni);
4220 if (vpn) {
4221
4222 /* update tenant_vrf_id if required */
4223 if (vpn->tenant_vrf_id != tenant_vrf_id) {
4224 bgpevpn_unlink_from_l3vni(vpn);
4225 vpn->tenant_vrf_id = tenant_vrf_id;
4226 bgpevpn_link_to_l3vni(vpn);
4227
4228 /* update all routes with new export RT for VRFs */
4229 update_routes_for_vni(bgp, vpn);
4230 }
4231
4232 if (is_vni_live(vpn)
4233 && IPV4_ADDR_SAME(&vpn->originator_ip, &originator_ip))
4234 /* Probably some other param has changed that we don't
4235 * care about. */
4236 return 0;
4237
4238 /* Local tunnel endpoint IP address has changed */
4239 handle_tunnel_ip_change(bgp, vpn, originator_ip);
4240 }
4241
4242 /* Create or update as appropriate. */
4243 if (!vpn) {
4244 vpn = bgp_evpn_new(bgp, vni, originator_ip, tenant_vrf_id);
4245 if (!vpn) {
4246 zlog_err(
4247 "%u: Failed to allocate VNI entry for VNI %u - at Add",
4248 bgp->vrf_id, vni);
4249 return -1;
4250 }
4251 }
4252
4253 /* if the VNI is live already, there is nothing more to do */
4254 if (is_vni_live(vpn))
4255 return 0;
4256
4257 /* Mark as "live" */
4258 SET_FLAG(vpn->flags, VNI_FLAG_LIVE);
4259
4260 /* tunnel is now active, add tunnel-ip to db */
4261 bgp_tip_add(bgp, &originator_ip);
4262
4263 /* filter routes as nexthop database has changed */
4264 bgp_filter_evpn_routes_upon_martian_nh_change(bgp);
4265
4266 /* Create EVPN type-3 route and schedule for processing. */
4267 build_evpn_type3_prefix(&p, vpn->originator_ip);
4268 if (update_evpn_route(bgp, vpn, &p, 0)) {
4269 zlog_err("%u: Type3 route creation failure for VNI %u",
4270 bgp->vrf_id, vni);
4271 return -1;
4272 }
4273
4274 /* If we have learnt and retained remote routes (VTEPs, MACs) for this
4275 * VNI,
4276 * install them.
4277 */
4278 install_routes_for_vni(bgp, vpn);
4279
4280 /* If we are advertising gateway mac-ip
4281 It needs to be conveyed again to zebra */
4282 bgp_zebra_advertise_gw_macip(bgp, vpn->advertise_gw_macip, vpn->vni);
4283
4284 return 0;
4285 }
4286
4287 /*
4288 * Cleanup EVPN information on disable - Need to delete and withdraw
4289 * EVPN routes from peers.
4290 */
4291 void bgp_evpn_cleanup_on_disable(struct bgp *bgp)
4292 {
4293 hash_iterate(bgp->vnihash, (void (*)(struct hash_backet *,
4294 void *))cleanup_vni_on_disable,
4295 bgp);
4296 }
4297
4298 /*
4299 * Cleanup EVPN information - invoked at the time of bgpd exit or when the
4300 * BGP instance (default) is being freed.
4301 */
4302 void bgp_evpn_cleanup(struct bgp *bgp)
4303 {
4304 if (bgp->vnihash)
4305 hash_iterate(bgp->vnihash, (void (*)(struct hash_backet *,
4306 void *))free_vni_entry,
4307 bgp);
4308 if (bgp->import_rt_hash)
4309 hash_free(bgp->import_rt_hash);
4310 bgp->import_rt_hash = NULL;
4311 if (bgp->vrf_import_rt_hash)
4312 hash_free(bgp->vrf_import_rt_hash);
4313 bgp->vrf_import_rt_hash = NULL;
4314 if (bgp->vnihash)
4315 hash_free(bgp->vnihash);
4316 bgp->vnihash = NULL;
4317 if (bgp->vrf_import_rtl)
4318 list_delete_and_null(&bgp->vrf_import_rtl);
4319 bgp->vrf_import_rtl = NULL;
4320 if (bgp->vrf_export_rtl)
4321 list_delete_and_null(&bgp->vrf_export_rtl);
4322 bgp->vrf_export_rtl = NULL;
4323 if (bgp->l2vnis)
4324 list_delete_and_null(&bgp->l2vnis);
4325 bgp->l2vnis = NULL;
4326 bf_release_index(bm->rd_idspace, bgp->vrf_rd_id);
4327 }
4328
4329 /*
4330 * Initialization for EVPN
4331 * Create
4332 * VNI hash table
4333 * hash for RT to VNI
4334 * assign a unique rd id for auto derivation of vrf_prd
4335 */
4336 void bgp_evpn_init(struct bgp *bgp)
4337 {
4338 bgp->vnihash =
4339 hash_create(vni_hash_key_make, vni_hash_cmp, "BGP VNI Hash");
4340 bgp->import_rt_hash =
4341 hash_create(import_rt_hash_key_make, import_rt_hash_cmp,
4342 "BGP Import RT Hash");
4343 bgp->vrf_import_rt_hash =
4344 hash_create(vrf_import_rt_hash_key_make, vrf_import_rt_hash_cmp,
4345 "BGP VRF Import RT Hash");
4346 bgp->vrf_import_rtl = list_new();
4347 bgp->vrf_import_rtl->cmp =
4348 (int (*)(void *, void *))evpn_route_target_cmp;
4349
4350 bgp->vrf_export_rtl = list_new();
4351 bgp->vrf_export_rtl->cmp =
4352 (int (*)(void *, void *))evpn_route_target_cmp;
4353 bgp->l2vnis = list_new();
4354 bgp->l2vnis->cmp =
4355 (int (*)(void *, void *))vni_hash_cmp;
4356 bf_assign_index(bm->rd_idspace, bgp->vrf_rd_id);
4357
4358 }
4359
4360 void bgp_evpn_vrf_delete(struct bgp *bgp_vrf)
4361 {
4362 bgp_evpn_unmap_vrf_from_its_rts(bgp_vrf);
4363 }