]>
Commit | Line | Data |
---|---|---|
7ef5a232 | 1 | /* E-VPN header for packet handling |
896014f4 DL |
2 | * Copyright (C) 2016 6WIND |
3 | * | |
4 | * This file is part of FRRouting. | |
5 | * | |
6 | * FRRouting 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 | * FRRouting is distributed in the hope that it will be useful, but | |
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | * General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License along | |
17 | * with this program; see the file COPYING; if not, write to the Free Software | |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
19 | */ | |
7ef5a232 PG |
20 | |
21 | #ifndef _QUAGGA_BGP_EVPN_H | |
22 | #define _QUAGGA_BGP_EVPN_H | |
23 | ||
128ea8ab | 24 | #include "vxlan.h" |
94c2f693 | 25 | #include "bgpd.h" |
7ef5a232 | 26 | |
520d5d76 | 27 | #define EVPN_ROUTE_STRLEN 200 /* Must be >> MAC + IPv6 strings. */ |
bf1061d8 | 28 | #define EVPN_AUTORT_VXLAN 0x10000000 |
520d5d76 | 29 | |
f920dd6d | 30 | #define EVPN_ENABLED(bgp) (bgp)->advertise_all_vni |
94c2f693 MK |
31 | static inline int is_evpn_enabled(void) |
32 | { | |
33 | struct bgp *bgp = NULL; | |
34 | ||
e2f3a930 | 35 | bgp = bgp_get_evpn(); |
f920dd6d | 36 | return bgp ? EVPN_ENABLED(bgp) : 0; |
94c2f693 MK |
37 | } |
38 | ||
b57ba6d2 MK |
39 | static inline void vni2label(vni_t vni, mpls_label_t *label) |
40 | { | |
d7c0a89a | 41 | uint8_t *tag = (uint8_t *)label; |
b57ba6d2 MK |
42 | |
43 | tag[0] = (vni >> 16) & 0xFF; | |
44 | tag[1] = (vni >> 8) & 0xFF; | |
45 | tag[2] = vni & 0xFF; | |
46 | } | |
47 | ||
48 | static inline vni_t label2vni(mpls_label_t *label) | |
49 | { | |
d7c0a89a | 50 | uint8_t *tag = (uint8_t *)label; |
b57ba6d2 MK |
51 | vni_t vni; |
52 | ||
d7c0a89a QY |
53 | vni = ((uint32_t)*tag++ << 16); |
54 | vni |= (uint32_t)*tag++ << 8; | |
55 | vni |= (uint32_t)(*tag & 0xFF); | |
b57ba6d2 MK |
56 | |
57 | return vni; | |
58 | } | |
59 | ||
fdf19f06 MK |
60 | static inline int advertise_type5_routes(struct bgp *bgp_vrf, |
61 | afi_t afi) | |
62 | { | |
63 | if (!bgp_vrf->l3vni) | |
64 | return 0; | |
65 | ||
d4a88de3 AD |
66 | if ((afi == AFI_IP) |
67 | && ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN], | |
68 | BGP_L2VPN_EVPN_ADV_IPV4_UNICAST)) | |
69 | || (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN], | |
70 | BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP)))) | |
fdf19f06 MK |
71 | return 1; |
72 | ||
d4a88de3 AD |
73 | if ((afi == AFI_IP6) |
74 | && ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN], | |
75 | BGP_L2VPN_EVPN_ADV_IPV6_UNICAST)) | |
76 | || (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN], | |
77 | BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP)))) | |
fdf19f06 MK |
78 | return 1; |
79 | ||
80 | return 0; | |
81 | } | |
82 | ||
88493076 | 83 | /* Flag if the route's parent is a EVPN route. */ |
6348981a AK |
84 | static inline struct bgp_path_info * |
85 | get_route_parent_evpn(struct bgp_path_info *ri) | |
88493076 | 86 | { |
4b7e6066 | 87 | struct bgp_path_info *parent_ri; |
88493076 | 88 | |
89 | /* If not imported (or doesn't have a parent), bail. */ | |
90 | if (ri->sub_type != BGP_ROUTE_IMPORTED || | |
91 | !ri->extra || | |
92 | !ri->extra->parent) | |
6348981a | 93 | return NULL; |
88493076 | 94 | |
08e68f92 | 95 | /* Determine parent recursively */ |
96 | for (parent_ri = ri->extra->parent; | |
97 | parent_ri->extra && parent_ri->extra->parent; | |
98 | parent_ri = parent_ri->extra->parent) | |
99 | ; | |
100 | ||
6348981a AK |
101 | return parent_ri; |
102 | } | |
103 | ||
104 | /* Flag if the route's parent is a EVPN route. */ | |
105 | static inline int is_route_parent_evpn(struct bgp_path_info *ri) | |
106 | { | |
107 | struct bgp_path_info *parent_ri; | |
108 | struct bgp_table *table; | |
109 | struct bgp_dest *dest; | |
110 | ||
111 | parent_ri = get_route_parent_evpn(ri); | |
112 | if (!parent_ri) | |
113 | return 0; | |
114 | ||
08e68f92 | 115 | /* See if of family L2VPN/EVPN */ |
9bcb3eef DS |
116 | dest = parent_ri->net; |
117 | if (!dest) | |
88493076 | 118 | return 0; |
9bcb3eef | 119 | table = bgp_dest_table(dest); |
88493076 | 120 | if (table && |
121 | table->afi == AFI_L2VPN && | |
122 | table->safi == SAFI_EVPN) | |
123 | return 1; | |
124 | return 0; | |
125 | } | |
126 | ||
0a2f9ac1 | 127 | /* Flag if the route path's family is EVPN. */ |
128 | static inline bool is_pi_family_evpn(struct bgp_path_info *pi) | |
129 | { | |
130 | return is_pi_family_matching(pi, AFI_L2VPN, SAFI_EVPN); | |
131 | } | |
132 | ||
f106e3a7 | 133 | /* Flag if the route is injectable into EVPN. This would be either a |
134 | * non-imported route or a non-EVPN imported route. | |
135 | */ | |
136 | static inline bool is_route_injectable_into_evpn(struct bgp_path_info *pi) | |
137 | { | |
138 | struct bgp_path_info *parent_pi; | |
139 | struct bgp_table *table; | |
9bcb3eef | 140 | struct bgp_dest *dest; |
f106e3a7 | 141 | |
142 | if (pi->sub_type != BGP_ROUTE_IMPORTED || | |
143 | !pi->extra || | |
144 | !pi->extra->parent) | |
145 | return true; | |
146 | ||
147 | parent_pi = (struct bgp_path_info *)pi->extra->parent; | |
9bcb3eef DS |
148 | dest = parent_pi->net; |
149 | if (!dest) | |
f106e3a7 | 150 | return true; |
9bcb3eef | 151 | table = bgp_dest_table(dest); |
f106e3a7 | 152 | if (table && |
153 | table->afi == AFI_L2VPN && | |
154 | table->safi == SAFI_EVPN) | |
155 | return false; | |
156 | return true; | |
157 | } | |
158 | ||
dc6cef73 AD |
159 | static inline bool evpn_resolve_overlay_index(void) |
160 | { | |
161 | struct bgp *bgp = NULL; | |
162 | ||
163 | bgp = bgp_get_evpn(); | |
164 | return bgp ? bgp->resolve_overlay_index : false; | |
165 | } | |
166 | ||
5424b7ba | 167 | extern void bgp_evpn_advertise_type5_route(struct bgp *bgp_vrf, |
bd494ec5 | 168 | const struct prefix *p, |
996c9314 LB |
169 | struct attr *src_attr, afi_t afi, |
170 | safi_t safi); | |
bd494ec5 DS |
171 | extern void bgp_evpn_withdraw_type5_route(struct bgp *bgp_vrf, |
172 | const struct prefix *p, afi_t afi, | |
173 | safi_t safi); | |
053905d2 MK |
174 | extern void bgp_evpn_withdraw_type5_routes(struct bgp *bgp_vrf, afi_t afi, |
175 | safi_t safi); | |
176 | extern void bgp_evpn_advertise_type5_routes(struct bgp *bgp_vrf, afi_t afi, | |
177 | safi_t safi); | |
523cafc4 | 178 | extern void bgp_evpn_vrf_delete(struct bgp *bgp_vrf); |
d62a17ae | 179 | extern void bgp_evpn_handle_router_id_update(struct bgp *bgp, int withdraw); |
d7c0a89a | 180 | extern char *bgp_evpn_label2str(mpls_label_t *label, uint32_t num_labels, |
b57ba6d2 | 181 | char *buf, int len); |
bd494ec5 | 182 | extern void bgp_evpn_route2json(const struct prefix_evpn *p, json_object *json); |
5f040085 DS |
183 | extern void bgp_evpn_encode_prefix(struct stream *s, const struct prefix *p, |
184 | const struct prefix_rd *prd, | |
185 | mpls_label_t *label, uint32_t num_labels, | |
be92fc9f | 186 | struct attr *attr, bool addpath_capable, |
5f040085 | 187 | uint32_t addpath_tx_id); |
128ea8ab | 188 | extern int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr, |
189 | struct bgp_nlri *packet, int withdraw); | |
d62a17ae | 190 | extern int bgp_evpn_import_route(struct bgp *bgp, afi_t afi, safi_t safi, |
5a1ae2c2 DS |
191 | const struct prefix *p, |
192 | struct bgp_path_info *ri); | |
d62a17ae | 193 | extern int bgp_evpn_unimport_route(struct bgp *bgp, afi_t afi, safi_t safi, |
5a1ae2c2 DS |
194 | const struct prefix *p, |
195 | struct bgp_path_info *ri); | |
db0e1937 | 196 | extern int bgp_filter_evpn_routes_upon_martian_nh_change(struct bgp *bgp); |
d62a17ae | 197 | extern int bgp_evpn_local_macip_del(struct bgp *bgp, vni_t vni, |
ec0ab544 AK |
198 | struct ethaddr *mac, struct ipaddr *ip, |
199 | int state); | |
d62a17ae | 200 | extern int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni, |
201 | struct ethaddr *mac, struct ipaddr *ip, | |
c44ab6f1 | 202 | uint8_t flags, uint32_t seq, esi_t *esi); |
523cafc4 | 203 | extern int bgp_evpn_local_l3vni_add(vni_t vni, vrf_id_t vrf_id, |
204 | struct ethaddr *rmac, | |
14e814ea | 205 | struct ethaddr *vrr_rmac, |
0483af6e | 206 | struct in_addr originator_ip, int filter, |
14e814ea | 207 | ifindex_t svi_ifindex, bool is_anycast_mac); |
523cafc4 | 208 | extern int bgp_evpn_local_l3vni_del(vni_t vni, vrf_id_t vrf_id); |
d62a17ae | 209 | extern int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni); |
210 | extern int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni, | |
29c53922 | 211 | struct in_addr originator_ip, |
76d07c7a | 212 | vrf_id_t tenant_vrf_id, |
9daa5d47 AD |
213 | struct in_addr mcast_grp, |
214 | ifindex_t svi_ifindex); | |
fd069644 | 215 | extern void bgp_evpn_flood_control_change(struct bgp *bgp); |
d62a17ae | 216 | extern void bgp_evpn_cleanup_on_disable(struct bgp *bgp); |
217 | extern void bgp_evpn_cleanup(struct bgp *bgp); | |
218 | extern void bgp_evpn_init(struct bgp *bgp); | |
5f040085 | 219 | extern int bgp_evpn_get_type5_prefixlen(const struct prefix *pfx); |
5a1ae2c2 | 220 | extern bool bgp_evpn_is_prefix_nht_supported(const struct prefix *pfx); |
5394a276 | 221 | extern void update_advertise_vrf_routes(struct bgp *bgp_vrf); |
021b6596 AD |
222 | extern void bgp_evpn_show_remote_ip_hash(struct hash_bucket *bucket, |
223 | void *args); | |
224 | extern void bgp_evpn_show_vni_svi_hash(struct hash_bucket *bucket, void *args); | |
225 | extern bool bgp_evpn_is_gateway_ip_resolved(struct bgp_nexthop_cache *bnc); | |
dc6cef73 AD |
226 | extern void |
227 | bgp_evpn_handle_resolve_overlay_index_set(struct hash_bucket *bucket, | |
228 | void *arg); | |
229 | extern void | |
230 | bgp_evpn_handle_resolve_overlay_index_unset(struct hash_bucket *bucket, | |
231 | void *arg); | |
021b6596 | 232 | |
128ea8ab | 233 | #endif /* _QUAGGA_BGP_EVPN_H */ |