]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_evpn_private.h
bgpd: EVPN definitions
[mirror_frr.git] / bgpd / bgp_evpn_private.h
1 /* BGP EVPN internal definitions
2 * Copyright (C) 2017 Cumulus Networks, Inc.
3 *
4 * This file is part of FRR.
5 *
6 * FRR is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * FRR is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with FRR; see the file COPYING. If not, write to the Free
18 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 * 02111-1307, USA.
20 */
21
22 #ifndef _BGP_EVPN_PRIVATE_H
23 #define _BGP_EVPN_PRIVATE_H
24
25 #include "vxlan.h"
26 #include "zebra.h"
27
28 #include "bgpd/bgpd.h"
29 #include "bgpd/bgp_ecommunity.h"
30
31 /* EVPN prefix lengths. */
32 #define EVPN_TYPE_2_ROUTE_PREFIXLEN 224
33 #define EVPN_TYPE_3_ROUTE_PREFIXLEN 224
34
35 /* EVPN route types. */
36 typedef enum
37 {
38 BGP_EVPN_AD_ROUTE = 1, /* Ethernet Auto-Discovery (A-D) route */
39 BGP_EVPN_MAC_IP_ROUTE, /* MAC/IP Advertisement route */
40 BGP_EVPN_IMET_ROUTE, /* Inclusive Multicast Ethernet Tag route */
41 BGP_EVPN_ES_ROUTE, /* Ethernet Segment route */
42 BGP_EVPN_IP_PREFIX_ROUTE, /* IP Prefix route */
43 } bgp_evpn_route_type;
44
45 /*
46 * Hash table of EVIs. Right now, the only type of EVI supported is with
47 * VxLAN encapsulation, hence each EVI corresponds to a L2 VNI.
48 * The VNIs are not "created" through BGP but through some other interface
49 * on the system. This table stores VNIs that BGP comes to know as present
50 * on the system (through interaction with zebra) as well as pre-configured
51 * VNIs (which need to be defined in the system to become "live").
52 */
53 struct bgpevpn
54 {
55 vni_t vni;
56 u_int32_t flags;
57 #define VNI_FLAG_CFGD 0x1 /* VNI is user configured */
58 #define VNI_FLAG_LIVE 0x2 /* VNI is "live" */
59 #define VNI_FLAG_RD_CFGD 0x4 /* RD is user configured. */
60 #define VNI_FLAG_IMPRT_CFGD 0x8 /* Import RT is user configured */
61 #define VNI_FLAG_EXPRT_CFGD 0x10 /* Export RT is user configured */
62
63 /* Id for deriving the RD automatically for this VNI */
64 u_int16_t rd_id;
65
66 /* RD for this VNI. */
67 struct prefix_rd prd;
68
69 /* Route type 3 field */
70 struct in_addr originator_ip;
71
72 /* Import and Export RTs. */
73 struct list *import_rtl;
74 struct list *export_rtl;
75
76 /* Route table for EVPN routes for this VNI. */
77 struct bgp_table *route_table;
78
79 QOBJ_FIELDS
80 };
81
82 DECLARE_QOBJ_TYPE(bgpevpn)
83
84 /* Mapping of Import RT to VNIs.
85 * The Import RTs of all VNIs are maintained in a hash table with each
86 * RT linking to all VNIs that will import routes matching this RT.
87 */
88 struct irt_node
89 {
90 /* RT */
91 struct ecommunity_val rt;
92
93 /* List of VNIs importing routes matching this RT. */
94 struct list *vnis;
95 };
96
97 #endif /* _BGP_EVPN_PRIVATE_H */