Line  | Count  | Source  | 
1  |  | // SPDX-License-Identifier: GPL-2.0-or-later  | 
2  |  | /* E-VPN header for packet handling  | 
3  |  |  * Copyright (C) 2016 6WIND  | 
4  |  |  */  | 
5  |  |  | 
6  |  | #ifndef _QUAGGA_BGP_EVPN_H  | 
7  |  | #define _QUAGGA_BGP_EVPN_H  | 
8  |  |  | 
9  |  | #include "vxlan.h"  | 
10  |  | #include "bgpd.h"  | 
11  |  |  | 
12  |  | #define EVPN_ROUTE_STRLEN 200 /* Must be >> MAC + IPv6 strings. */  | 
13  | 0  | #define EVPN_AUTORT_VXLAN 0x10000000  | 
14  |  |  | 
15  | 0  | #define EVPN_ENABLED(bgp)  (bgp)->advertise_all_vni  | 
16  |  | static inline int is_evpn_enabled(void)  | 
17  | 0  | { | 
18  | 0  |   struct bgp *bgp = NULL;  | 
19  |  | 
  | 
20  | 0  |   bgp = bgp_get_evpn();  | 
21  | 0  |   return bgp ? EVPN_ENABLED(bgp) : 0;  | 
22  | 0  | } Unexecuted instantiation: bgp_main.c:is_evpn_enabled Unexecuted instantiation: bgp_attr.c:is_evpn_enabled Unexecuted instantiation: bgp_attr_evpn.c:is_evpn_enabled Unexecuted instantiation: bgp_debug.c:is_evpn_enabled Unexecuted instantiation: bgp_evpn.c:is_evpn_enabled Unexecuted instantiation: bgp_evpn_mh.c:is_evpn_enabled Unexecuted instantiation: bgp_evpn_vty.c:is_evpn_enabled Unexecuted instantiation: bgp_mplsvpn.c:is_evpn_enabled Unexecuted instantiation: bgp_nht.c:is_evpn_enabled Unexecuted instantiation: bgp_packet.c:is_evpn_enabled Unexecuted instantiation: bgp_route.c:is_evpn_enabled Unexecuted instantiation: bgp_routemap.c:is_evpn_enabled Unexecuted instantiation: bgp_vty.c:is_evpn_enabled Unexecuted instantiation: bgp_zebra.c:is_evpn_enabled Unexecuted instantiation: bgpd.c:is_evpn_enabled  | 
23  |  |  | 
24  |  | static inline int advertise_type5_routes(struct bgp *bgp_vrf,  | 
25  |  |            afi_t afi)  | 
26  | 0  | { | 
27  | 0  |   if (!bgp_vrf->l3vni)  | 
28  | 0  |     return 0;  | 
29  |  |  | 
30  | 0  |   if ((afi == AFI_IP)  | 
31  | 0  |       && ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],  | 
32  | 0  |           BGP_L2VPN_EVPN_ADV_IPV4_UNICAST))  | 
33  | 0  |     || (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],  | 
34  | 0  |              BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP))))  | 
35  | 0  |     return 1;  | 
36  |  |  | 
37  | 0  |   if ((afi == AFI_IP6)  | 
38  | 0  |       && ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],  | 
39  | 0  |           BGP_L2VPN_EVPN_ADV_IPV6_UNICAST))  | 
40  | 0  |     || (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],  | 
41  | 0  |              BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))))  | 
42  | 0  |     return 1;  | 
43  |  |  | 
44  | 0  |   return 0;  | 
45  | 0  | } Unexecuted instantiation: bgp_main.c:advertise_type5_routes Unexecuted instantiation: bgp_attr.c:advertise_type5_routes Unexecuted instantiation: bgp_attr_evpn.c:advertise_type5_routes Unexecuted instantiation: bgp_debug.c:advertise_type5_routes Unexecuted instantiation: bgp_evpn.c:advertise_type5_routes Unexecuted instantiation: bgp_evpn_mh.c:advertise_type5_routes Unexecuted instantiation: bgp_evpn_vty.c:advertise_type5_routes Unexecuted instantiation: bgp_mplsvpn.c:advertise_type5_routes Unexecuted instantiation: bgp_nht.c:advertise_type5_routes Unexecuted instantiation: bgp_packet.c:advertise_type5_routes Unexecuted instantiation: bgp_route.c:advertise_type5_routes Unexecuted instantiation: bgp_routemap.c:advertise_type5_routes Unexecuted instantiation: bgp_vty.c:advertise_type5_routes Unexecuted instantiation: bgp_zebra.c:advertise_type5_routes Unexecuted instantiation: bgpd.c:advertise_type5_routes  | 
46  |  |  | 
47  |  | /* Flag if the route's parent is a EVPN route. */  | 
48  |  | static inline struct bgp_path_info *  | 
49  |  | get_route_parent_evpn(struct bgp_path_info *ri)  | 
50  | 0  | { | 
51  | 0  |   struct bgp_path_info *parent_ri;  | 
52  |  |  | 
53  |  |   /* If not imported (or doesn't have a parent), bail. */  | 
54  | 0  |   if (ri->sub_type != BGP_ROUTE_IMPORTED ||  | 
55  | 0  |       !ri->extra ||  | 
56  | 0  |       !ri->extra->parent)  | 
57  | 0  |     return NULL;  | 
58  |  |  | 
59  |  |   /* Determine parent recursively */  | 
60  | 0  |   for (parent_ri = ri->extra->parent;  | 
61  | 0  |        parent_ri->extra && parent_ri->extra->parent;  | 
62  | 0  |        parent_ri = parent_ri->extra->parent)  | 
63  | 0  |     ;  | 
64  |  | 
  | 
65  | 0  |   return parent_ri;  | 
66  | 0  | } Unexecuted instantiation: bgp_main.c:get_route_parent_evpn Unexecuted instantiation: bgp_attr.c:get_route_parent_evpn Unexecuted instantiation: bgp_attr_evpn.c:get_route_parent_evpn Unexecuted instantiation: bgp_debug.c:get_route_parent_evpn Unexecuted instantiation: bgp_evpn.c:get_route_parent_evpn Unexecuted instantiation: bgp_evpn_mh.c:get_route_parent_evpn Unexecuted instantiation: bgp_evpn_vty.c:get_route_parent_evpn Unexecuted instantiation: bgp_mplsvpn.c:get_route_parent_evpn Unexecuted instantiation: bgp_nht.c:get_route_parent_evpn Unexecuted instantiation: bgp_packet.c:get_route_parent_evpn Unexecuted instantiation: bgp_route.c:get_route_parent_evpn Unexecuted instantiation: bgp_routemap.c:get_route_parent_evpn Unexecuted instantiation: bgp_vty.c:get_route_parent_evpn Unexecuted instantiation: bgp_zebra.c:get_route_parent_evpn Unexecuted instantiation: bgpd.c:get_route_parent_evpn  | 
67  |  |  | 
68  |  | /* Flag if the route's parent is a EVPN route. */  | 
69  |  | static inline int is_route_parent_evpn(struct bgp_path_info *ri)  | 
70  | 0  | { | 
71  | 0  |   struct bgp_path_info *parent_ri;  | 
72  | 0  |   struct bgp_table *table;  | 
73  | 0  |   struct bgp_dest *dest;  | 
74  |  | 
  | 
75  | 0  |   parent_ri = get_route_parent_evpn(ri);  | 
76  | 0  |   if (!parent_ri)  | 
77  | 0  |     return 0;  | 
78  |  |  | 
79  |  |   /* See if of family L2VPN/EVPN */  | 
80  | 0  |   dest = parent_ri->net;  | 
81  | 0  |   if (!dest)  | 
82  | 0  |     return 0;  | 
83  | 0  |   table = bgp_dest_table(dest);  | 
84  | 0  |   if (table &&  | 
85  | 0  |       table->afi == AFI_L2VPN &&  | 
86  | 0  |       table->safi == SAFI_EVPN)  | 
87  | 0  |     return 1;  | 
88  | 0  |   return 0;  | 
89  | 0  | } Unexecuted instantiation: bgp_main.c:is_route_parent_evpn Unexecuted instantiation: bgp_attr.c:is_route_parent_evpn Unexecuted instantiation: bgp_attr_evpn.c:is_route_parent_evpn Unexecuted instantiation: bgp_debug.c:is_route_parent_evpn Unexecuted instantiation: bgp_evpn.c:is_route_parent_evpn Unexecuted instantiation: bgp_evpn_mh.c:is_route_parent_evpn Unexecuted instantiation: bgp_evpn_vty.c:is_route_parent_evpn Unexecuted instantiation: bgp_mplsvpn.c:is_route_parent_evpn Unexecuted instantiation: bgp_nht.c:is_route_parent_evpn Unexecuted instantiation: bgp_packet.c:is_route_parent_evpn Unexecuted instantiation: bgp_route.c:is_route_parent_evpn Unexecuted instantiation: bgp_routemap.c:is_route_parent_evpn Unexecuted instantiation: bgp_vty.c:is_route_parent_evpn Unexecuted instantiation: bgp_zebra.c:is_route_parent_evpn Unexecuted instantiation: bgpd.c:is_route_parent_evpn  | 
90  |  |  | 
91  |  | /* Flag if the route path's family is EVPN. */  | 
92  |  | static inline bool is_pi_family_evpn(struct bgp_path_info *pi)  | 
93  | 0  | { | 
94  | 0  |   return is_pi_family_matching(pi, AFI_L2VPN, SAFI_EVPN);  | 
95  | 0  | } Unexecuted instantiation: bgp_main.c:is_pi_family_evpn Unexecuted instantiation: bgp_attr.c:is_pi_family_evpn Unexecuted instantiation: bgp_attr_evpn.c:is_pi_family_evpn Unexecuted instantiation: bgp_debug.c:is_pi_family_evpn Unexecuted instantiation: bgp_evpn.c:is_pi_family_evpn Unexecuted instantiation: bgp_evpn_mh.c:is_pi_family_evpn Unexecuted instantiation: bgp_evpn_vty.c:is_pi_family_evpn Unexecuted instantiation: bgp_mplsvpn.c:is_pi_family_evpn Unexecuted instantiation: bgp_nht.c:is_pi_family_evpn Unexecuted instantiation: bgp_packet.c:is_pi_family_evpn Unexecuted instantiation: bgp_route.c:is_pi_family_evpn Unexecuted instantiation: bgp_routemap.c:is_pi_family_evpn Unexecuted instantiation: bgp_vty.c:is_pi_family_evpn Unexecuted instantiation: bgp_zebra.c:is_pi_family_evpn Unexecuted instantiation: bgpd.c:is_pi_family_evpn  | 
96  |  |  | 
97  |  | /* Flag if the route is injectable into EVPN. This would be either a  | 
98  |  |  * non-imported route or a non-EVPN imported route.  | 
99  |  |  */  | 
100  |  | static inline bool is_route_injectable_into_evpn(struct bgp_path_info *pi)  | 
101  | 0  | { | 
102  | 0  |   struct bgp_path_info *parent_pi;  | 
103  | 0  |   struct bgp_table *table;  | 
104  | 0  |   struct bgp_dest *dest;  | 
105  |  | 
  | 
106  | 0  |   if (pi->sub_type != BGP_ROUTE_IMPORTED ||  | 
107  | 0  |       !pi->extra ||  | 
108  | 0  |       !pi->extra->parent)  | 
109  | 0  |     return true;  | 
110  |  |  | 
111  | 0  |   parent_pi = (struct bgp_path_info *)pi->extra->parent;  | 
112  | 0  |   dest = parent_pi->net;  | 
113  | 0  |   if (!dest)  | 
114  | 0  |     return true;  | 
115  | 0  |   table = bgp_dest_table(dest);  | 
116  | 0  |   if (table &&  | 
117  | 0  |       table->afi == AFI_L2VPN &&  | 
118  | 0  |       table->safi == SAFI_EVPN)  | 
119  | 0  |     return false;  | 
120  | 0  |   return true;  | 
121  | 0  | } Unexecuted instantiation: bgp_main.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_attr.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_attr_evpn.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_debug.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_evpn.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_evpn_mh.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_evpn_vty.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_mplsvpn.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_nht.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_packet.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_route.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_routemap.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_vty.c:is_route_injectable_into_evpn Unexecuted instantiation: bgp_zebra.c:is_route_injectable_into_evpn Unexecuted instantiation: bgpd.c:is_route_injectable_into_evpn  | 
122  |  |  | 
123  |  | static inline bool evpn_resolve_overlay_index(void)  | 
124  | 0  | { | 
125  | 0  |   struct bgp *bgp = NULL;  | 
126  |  | 
  | 
127  | 0  |   bgp = bgp_get_evpn();  | 
128  | 0  |   return bgp ? bgp->resolve_overlay_index : false;  | 
129  | 0  | } Unexecuted instantiation: bgp_main.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_attr.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_attr_evpn.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_debug.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_evpn.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_evpn_mh.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_evpn_vty.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_mplsvpn.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_nht.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_packet.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_route.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_routemap.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_vty.c:evpn_resolve_overlay_index Unexecuted instantiation: bgp_zebra.c:evpn_resolve_overlay_index Unexecuted instantiation: bgpd.c:evpn_resolve_overlay_index  | 
130  |  |  | 
131  |  | extern void bgp_evpn_advertise_type5_route(struct bgp *bgp_vrf,  | 
132  |  |              const struct prefix *p,  | 
133  |  |              struct attr *src_attr, afi_t afi,  | 
134  |  |              safi_t safi);  | 
135  |  | extern void bgp_evpn_withdraw_type5_route(struct bgp *bgp_vrf,  | 
136  |  |             const struct prefix *p, afi_t afi,  | 
137  |  |             safi_t safi);  | 
138  |  | extern void bgp_evpn_withdraw_type5_routes(struct bgp *bgp_vrf, afi_t afi,  | 
139  |  |              safi_t safi);  | 
140  |  | extern void bgp_evpn_advertise_type5_routes(struct bgp *bgp_vrf, afi_t afi,  | 
141  |  |               safi_t safi);  | 
142  |  | extern void bgp_evpn_vrf_delete(struct bgp *bgp_vrf);  | 
143  |  | extern void bgp_evpn_handle_router_id_update(struct bgp *bgp, int withdraw);  | 
144  |  | extern char *bgp_evpn_label2str(mpls_label_t *label, uint32_t num_labels,  | 
145  |  |         char *buf, int len);  | 
146  |  | extern void bgp_evpn_route2json(const struct prefix_evpn *p, json_object *json);  | 
147  |  | extern void bgp_evpn_encode_prefix(struct stream *s, const struct prefix *p,  | 
148  |  |            const struct prefix_rd *prd,  | 
149  |  |            mpls_label_t *label, uint32_t num_labels,  | 
150  |  |            struct attr *attr, bool addpath_capable,  | 
151  |  |            uint32_t addpath_tx_id);  | 
152  |  | extern int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr,  | 
153  |  |              struct bgp_nlri *packet, bool withdraw);  | 
154  |  | extern int bgp_evpn_import_route(struct bgp *bgp, afi_t afi, safi_t safi,  | 
155  |  |          const struct prefix *p,  | 
156  |  |          struct bgp_path_info *ri);  | 
157  |  | extern int bgp_evpn_unimport_route(struct bgp *bgp, afi_t afi, safi_t safi,  | 
158  |  |            const struct prefix *p,  | 
159  |  |            struct bgp_path_info *ri);  | 
160  |  | extern int bgp_filter_evpn_routes_upon_martian_nh_change(struct bgp *bgp);  | 
161  |  | extern int bgp_evpn_local_macip_del(struct bgp *bgp, vni_t vni,  | 
162  |  |             struct ethaddr *mac, struct ipaddr *ip,  | 
163  |  |           int state);  | 
164  |  | extern int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni,  | 
165  |  |             struct ethaddr *mac, struct ipaddr *ip,  | 
166  |  |             uint8_t flags, uint32_t seq, esi_t *esi);  | 
167  |  | extern int bgp_evpn_local_l3vni_add(vni_t vni, vrf_id_t vrf_id,  | 
168  |  |             struct ethaddr *rmac,  | 
169  |  |             struct ethaddr *vrr_rmac,  | 
170  |  |             struct in_addr originator_ip, int filter,  | 
171  |  |             ifindex_t svi_ifindex, bool is_anycast_mac);  | 
172  |  | extern int bgp_evpn_local_l3vni_del(vni_t vni, vrf_id_t vrf_id);  | 
173  |  | extern int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni);  | 
174  |  | extern int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni,  | 
175  |  |           struct in_addr originator_ip,  | 
176  |  |           vrf_id_t tenant_vrf_id,  | 
177  |  |           struct in_addr mcast_grp,  | 
178  |  |           ifindex_t svi_ifindex);  | 
179  |  | extern void bgp_evpn_flood_control_change(struct bgp *bgp);  | 
180  |  | extern void bgp_evpn_cleanup_on_disable(struct bgp *bgp);  | 
181  |  | extern void bgp_evpn_cleanup(struct bgp *bgp);  | 
182  |  | extern void bgp_evpn_init(struct bgp *bgp);  | 
183  |  | extern int bgp_evpn_get_type5_prefixlen(const struct prefix *pfx);  | 
184  |  | extern bool bgp_evpn_is_prefix_nht_supported(const struct prefix *pfx);  | 
185  |  | extern void update_advertise_vrf_routes(struct bgp *bgp_vrf);  | 
186  |  | extern void bgp_evpn_show_remote_ip_hash(struct hash_bucket *bucket,  | 
187  |  |            void *args);  | 
188  |  | extern void bgp_evpn_show_vni_svi_hash(struct hash_bucket *bucket, void *args);  | 
189  |  | extern bool bgp_evpn_is_gateway_ip_resolved(struct bgp_nexthop_cache *bnc);  | 
190  |  | extern void  | 
191  |  | bgp_evpn_handle_resolve_overlay_index_set(struct hash_bucket *bucket,  | 
192  |  |             void *arg);  | 
193  |  | extern void  | 
194  |  | bgp_evpn_handle_resolve_overlay_index_unset(struct hash_bucket *bucket,  | 
195  |  |               void *arg);  | 
196  |  | extern mpls_label_t *bgp_evpn_path_info_labels_get_l3vni(mpls_label_t *labels,  | 
197  |  |                uint32_t num_labels);  | 
198  |  | extern vni_t bgp_evpn_path_info_get_l3vni(const struct bgp_path_info *pi);  | 
199  |  | extern bool bgp_evpn_mpath_has_dvni(const struct bgp *bgp_vrf,  | 
200  |  |             struct bgp_path_info *mpinfo);  | 
201  |  |  | 
202  |  | #endif /* _QUAGGA_BGP_EVPN_H */  |