diff options
| author | Anuradha Karuppiah <anuradhak@cumulusnetworks.com> | 2020-05-08 16:35:09 -0700 |
|---|---|---|
| committer | Anuradha Karuppiah <anuradhak@cumulusnetworks.com> | 2020-10-26 10:26:21 -0700 |
| commit | 74e2bd891d85d68250ce368cb538fb5404867238 (patch) | |
| tree | c8c58d5103b2227432f4a49d412fdef730178612 /bgpd/bgp_attr_evpn.c | |
| parent | 070a7cd8bd71b8fde4d8d0b2b6d4e24dd5a4bb7b (diff) | |
bgpd: support for DF election in EVPN-MH
DF (Designated forwarder) election is used for picking a single
BUM-traffic forwarded per-ES. RFC7432 specifies a mechanism called
service carving for DF election. However that mechanism has many
disadvantages -
1. LBs poorly.
2. Doesn't allow for a controlled failover needed in upgrade
scenarios.
3. Not easy to hw accelerate.
To fix the poor performance of service carving alternate DF mechanisms
have been proposed via the following drafts -
draft-ietf-bess-evpn-df-election-framework
draft-ietf-bess-evpn-pref-df
This commit adds support for the pref-df election mechanism which
is used as the default. Other mechanisms including service-carving
may be added later.
In this mechanism one switch on an ES is elected as DF based on the
preference value; higher preference wins with IP address acting
as the tie-breaker (lower-IP wins if pref value is the same).
Sample output
=============
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
torm-11# sh bgp l2vpn evpn es 03:00:00:00:00:01:11:00:00:01
ESI: 03:00:00:00:00:01:11:00:00:01
Type: LR
RD: 27.0.0.15:6
Originator-IP: 27.0.0.15
Local ES DF preference: 100
VNI Count: 10
Remote VNI Count: 10
Inconsistent VNI VTEP Count: 0
Inconsistencies: -
VTEPs:
27.0.0.16 flags: EA df_alg: preference df_pref: 32767
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
torm-11# sh bgp l2vpn evpn route esi 03:00:00:00:00:01:11:00:00:01
*> [4]:[03:00:00:00:00:01:11:00:00:01]:[32]:[27.0.0.15]
27.0.0.15 32768 i
ET:8 ES-Import-Rt:00:00:00:00:01:11 DF: (alg: 2, pref: 100)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
Diffstat (limited to 'bgpd/bgp_attr_evpn.c')
| -rw-r--r-- | bgpd/bgp_attr_evpn.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/bgpd/bgp_attr_evpn.c b/bgpd/bgp_attr_evpn.c index aa0c59f3a7..7cc9ecd79e 100644 --- a/bgpd/bgp_attr_evpn.c +++ b/bgpd/bgp_attr_evpn.c @@ -26,6 +26,7 @@ #include "log.h" #include "memory.h" #include "stream.h" +#include "vxlan.h" #include "bgpd/bgpd.h" #include "bgpd/bgp_attr.h" @@ -146,6 +147,43 @@ uint8_t bgp_attr_default_gw(struct attr *attr) } /* + * Fetch and return the DF preference and algorithm from + * DF election extended community, if present, else 0. + */ +uint16_t bgp_attr_df_pref_from_ec(struct attr *attr, uint8_t *alg) +{ + struct ecommunity *ecom; + int i; + uint16_t df_pref = 0; + + *alg = EVPN_MH_DF_ALG_SERVICE_CARVING; + ecom = attr->ecommunity; + if (!ecom || !ecom->size) + return 0; + + for (i = 0; i < ecom->size; i++) { + uint8_t *pnt; + uint8_t type, sub_type; + + pnt = (ecom->val + (i * ECOMMUNITY_SIZE)); + type = *pnt++; + sub_type = *pnt++; + if (!(type == ECOMMUNITY_ENCODE_EVPN + && sub_type == ECOMMUNITY_EVPN_SUBTYPE_DF_ELECTION)) + continue; + + *alg = (*pnt++) & ECOMMUNITY_EVPN_SUBTYPE_DF_ALG_BITS; + + pnt += 3; + pnt = ptr_get_be16(pnt, &df_pref); + (void)pnt; /* consume value */ + break; + } + + return df_pref; +} + +/* * Fetch and return the sequence number from MAC Mobility extended * community, if present, else 0. */ |
