]>
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 | ||
66 | if (afi == AFI_IP && | |
154faa50 MK |
67 | CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN], |
68 | BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST)) | |
fdf19f06 MK |
69 | return 1; |
70 | ||
71 | if (afi == AFI_IP6 && | |
154faa50 MK |
72 | CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN], |
73 | BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST)) | |
fdf19f06 MK |
74 | return 1; |
75 | ||
76 | return 0; | |
77 | } | |
78 | ||
88493076 | 79 | /* Flag if the route's parent is a EVPN route. */ |
4b7e6066 | 80 | static inline int is_route_parent_evpn(struct bgp_path_info *ri) |
88493076 | 81 | { |
4b7e6066 | 82 | struct bgp_path_info *parent_ri; |
88493076 | 83 | struct bgp_table *table; |
84 | struct bgp_node *rn; | |
85 | ||
86 | /* If not imported (or doesn't have a parent), bail. */ | |
87 | if (ri->sub_type != BGP_ROUTE_IMPORTED || | |
88 | !ri->extra || | |
89 | !ri->extra->parent) | |
90 | return 0; | |
91 | ||
08e68f92 | 92 | /* Determine parent recursively */ |
93 | for (parent_ri = ri->extra->parent; | |
94 | parent_ri->extra && parent_ri->extra->parent; | |
95 | parent_ri = parent_ri->extra->parent) | |
96 | ; | |
97 | ||
98 | /* See if of family L2VPN/EVPN */ | |
88493076 | 99 | rn = parent_ri->net; |
100 | if (!rn) | |
101 | return 0; | |
102 | table = bgp_node_table(rn); | |
103 | if (table && | |
104 | table->afi == AFI_L2VPN && | |
105 | table->safi == SAFI_EVPN) | |
106 | return 1; | |
107 | return 0; | |
108 | } | |
109 | ||
0a2f9ac1 | 110 | /* Flag if the route path's family is EVPN. */ |
111 | static inline bool is_pi_family_evpn(struct bgp_path_info *pi) | |
112 | { | |
113 | return is_pi_family_matching(pi, AFI_L2VPN, SAFI_EVPN); | |
114 | } | |
115 | ||
f106e3a7 | 116 | /* Flag if the route is injectable into EVPN. This would be either a |
117 | * non-imported route or a non-EVPN imported route. | |
118 | */ | |
119 | static inline bool is_route_injectable_into_evpn(struct bgp_path_info *pi) | |
120 | { | |
121 | struct bgp_path_info *parent_pi; | |
122 | struct bgp_table *table; | |
123 | struct bgp_node *rn; | |
124 | ||
125 | if (pi->sub_type != BGP_ROUTE_IMPORTED || | |
126 | !pi->extra || | |
127 | !pi->extra->parent) | |
128 | return true; | |
129 | ||
130 | parent_pi = (struct bgp_path_info *)pi->extra->parent; | |
131 | rn = parent_pi->net; | |
132 | if (!rn) | |
133 | return true; | |
134 | table = bgp_node_table(rn); | |
135 | if (table && | |
136 | table->afi == AFI_L2VPN && | |
137 | table->safi == SAFI_EVPN) | |
138 | return false; | |
139 | return true; | |
140 | } | |
141 | ||
5424b7ba | 142 | extern void bgp_evpn_advertise_type5_route(struct bgp *bgp_vrf, |
31310b25 | 143 | struct prefix *p, |
996c9314 LB |
144 | struct attr *src_attr, afi_t afi, |
145 | safi_t safi); | |
146 | extern void bgp_evpn_withdraw_type5_route(struct bgp *bgp_vrf, struct prefix *p, | |
5424b7ba | 147 | afi_t afi, safi_t safi); |
053905d2 MK |
148 | extern void bgp_evpn_withdraw_type5_routes(struct bgp *bgp_vrf, afi_t afi, |
149 | safi_t safi); | |
150 | extern void bgp_evpn_advertise_type5_routes(struct bgp *bgp_vrf, afi_t afi, | |
151 | safi_t safi); | |
523cafc4 | 152 | extern void bgp_evpn_vrf_delete(struct bgp *bgp_vrf); |
d62a17ae | 153 | extern void bgp_evpn_handle_router_id_update(struct bgp *bgp, int withdraw); |
d7c0a89a | 154 | extern char *bgp_evpn_label2str(mpls_label_t *label, uint32_t num_labels, |
b57ba6d2 | 155 | char *buf, int len); |
d62a17ae | 156 | extern char *bgp_evpn_route2str(struct prefix_evpn *p, char *buf, int len); |
b682f6de | 157 | extern void bgp_evpn_route2json(struct prefix_evpn *p, json_object *json); |
d62a17ae | 158 | extern void bgp_evpn_encode_prefix(struct stream *s, struct prefix *p, |
996c9314 | 159 | struct prefix_rd *prd, mpls_label_t *label, |
d7c0a89a QY |
160 | uint32_t num_labels, struct attr *attr, |
161 | int addpath_encode, uint32_t addpath_tx_id); | |
128ea8ab | 162 | extern int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr, |
163 | struct bgp_nlri *packet, int withdraw); | |
d62a17ae | 164 | extern int bgp_evpn_import_route(struct bgp *bgp, afi_t afi, safi_t safi, |
4b7e6066 | 165 | struct prefix *p, struct bgp_path_info *ri); |
d62a17ae | 166 | extern int bgp_evpn_unimport_route(struct bgp *bgp, afi_t afi, safi_t safi, |
4b7e6066 | 167 | struct prefix *p, struct bgp_path_info *ri); |
db0e1937 | 168 | extern int bgp_filter_evpn_routes_upon_martian_nh_change(struct bgp *bgp); |
d62a17ae | 169 | extern int bgp_evpn_local_macip_del(struct bgp *bgp, vni_t vni, |
ec0ab544 AK |
170 | struct ethaddr *mac, struct ipaddr *ip, |
171 | int state); | |
d62a17ae | 172 | extern int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni, |
173 | struct ethaddr *mac, struct ipaddr *ip, | |
f07e1c99 | 174 | uint8_t flags, uint32_t seq); |
523cafc4 | 175 | extern int bgp_evpn_local_l3vni_add(vni_t vni, vrf_id_t vrf_id, |
176 | struct ethaddr *rmac, | |
14e814ea | 177 | struct ethaddr *vrr_rmac, |
0483af6e | 178 | struct in_addr originator_ip, int filter, |
14e814ea | 179 | ifindex_t svi_ifindex, bool is_anycast_mac); |
523cafc4 | 180 | extern int bgp_evpn_local_l3vni_del(vni_t vni, vrf_id_t vrf_id); |
d62a17ae | 181 | extern int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni); |
182 | extern int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni, | |
29c53922 | 183 | struct in_addr originator_ip, |
76d07c7a AK |
184 | vrf_id_t tenant_vrf_id, |
185 | struct in_addr mcast_grp); | |
50f74cf1 | 186 | extern int bgp_evpn_local_es_add(struct bgp *bgp, esi_t *esi, |
187 | struct ipaddr *originator_ip); | |
188 | extern int bgp_evpn_local_es_del(struct bgp *bgp, esi_t *esi, | |
189 | struct ipaddr *originator_ip); | |
fd069644 | 190 | extern void bgp_evpn_flood_control_change(struct bgp *bgp); |
d62a17ae | 191 | extern void bgp_evpn_cleanup_on_disable(struct bgp *bgp); |
192 | extern void bgp_evpn_cleanup(struct bgp *bgp); | |
193 | extern void bgp_evpn_init(struct bgp *bgp); | |
44c69747 | 194 | extern int bgp_evpn_get_type5_prefixlen(struct prefix *pfx); |
7c312383 | 195 | extern bool bgp_evpn_is_prefix_nht_supported(struct prefix *pfx); |
5394a276 | 196 | extern void update_advertise_vrf_routes(struct bgp *bgp_vrf); |
14c1a7bf | 197 | |
128ea8ab | 198 | #endif /* _QUAGGA_BGP_EVPN_H */ |