1 From c05ce62d655144e74bf432830130e83ec3617ec1 Mon Sep 17 00:00:00 2001
2 From: Alexandre Derumier <aderumier@odiso.com>
3 Date: Tue, 17 Nov 2020 06:01:26 +0100
4 Subject: [PATCH] bgpd : add an option for RT auto-derivation to force AS
6 Allow to define a custom AS for autort AS:VNI
8 Usefull for evpn with ebgp, where we can't auto-derivated from the router AS,
9 as route-target AS:VNI need to be the same on the each peer
11 Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
13 bgpd/bgp_evpn.c | 12 ++++++++++--
14 bgpd/bgp_evpn_vty.c | 47 +++++++++++++++++++++++++++++++++------------
16 3 files changed, 48 insertions(+), 14 deletions(-)
18 diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
19 index 8d8e3ffd2..135c1a610 100644
22 @@ -491,7 +491,11 @@ static void form_auto_rt(struct bgp *bgp, vni_t vni, struct list *rtl)
24 if (bgp->advertise_autort_rfc8365)
25 vni |= EVPN_AUTORT_VXLAN;
26 - encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
27 + if (bgp->autort_as) {
28 + encode_route_target_as((bgp->autort_as & 0xFFFF), vni, &eval);
30 + encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
33 ecomadd = ecommunity_new();
34 ecommunity_add_val(ecomadd, &eval, false, false);
35 @@ -4367,7 +4371,11 @@ void evpn_rt_delete_auto(struct bgp *bgp, vni_t vni, struct list *rtl)
37 if (bgp->advertise_autort_rfc8365)
38 vni |= EVPN_AUTORT_VXLAN;
39 - encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
40 + if (bgp->autort_as) {
41 + encode_route_target_as((bgp->autort_as & 0xFFFF), vni, &eval);
43 + encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
46 ecom_auto = ecommunity_new();
47 ecommunity_add_val(ecom_auto, &eval, false, false);
48 diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
49 index 3fc1dc128..4c2bae1eb 100644
50 --- a/bgpd/bgp_evpn_vty.c
51 +++ b/bgpd/bgp_evpn_vty.c
52 @@ -3517,32 +3517,52 @@ DEFUN (no_bgp_evpn_advertise_all_vni,
56 -DEFUN (bgp_evpn_advertise_autort_rfc8365,
57 - bgp_evpn_advertise_autort_rfc8365_cmd,
58 - "autort rfc8365-compatible",
59 +DEFPY (bgp_evpn_advertise_autort,
60 + bgp_evpn_advertise_autort_cmd,
61 + "autort [rfc8365-compatible]$rfc8365 [as (1-65536)$as]",
62 "Auto-derivation of RT\n"
63 - "Auto-derivation of RT using RFC8365\n")
64 + "Auto-derivation of RT using RFC8365\n"
65 + "Auto-derivation AS\n"
68 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
72 - evpn_set_advertise_autort_rfc8365(bgp);
75 + bgp->autort_as = as;
76 + bgp_evpn_handle_autort_change(bgp);
80 + evpn_set_advertise_autort_rfc8365(bgp);
85 -DEFUN (no_bgp_evpn_advertise_autort_rfc8365,
86 - no_bgp_evpn_advertise_autort_rfc8365_cmd,
87 - "no autort rfc8365-compatible",
88 +DEFPY (no_bgp_evpn_advertise_autort,
89 + no_bgp_evpn_advertise_autort_cmd,
90 + "no autort [rfc8365-compatible]$rfc8365 [as (1-65536)$as]",
92 "Auto-derivation of RT\n"
93 - "Auto-derivation of RT using RFC8365\n")
94 + "Auto-derivation of RT using RFC8365\n"
95 + "Auto-derivation AS\n"
98 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
102 - evpn_unset_advertise_autort_rfc8365(bgp);
105 + bgp->autort_as = 0;
106 + bgp_evpn_handle_autort_change(bgp);
110 + evpn_unset_advertise_autort_rfc8365(bgp);
115 @@ -6055,6 +6075,9 @@ void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi,
116 if (bgp->advertise_autort_rfc8365)
117 vty_out(vty, " autort rfc8365-compatible\n");
119 + if (bgp->autort_as)
120 + vty_out(vty, " autort as %u\n", bgp->autort_as);
122 if (bgp->advertise_gw_macip)
123 vty_out(vty, " advertise-default-gw\n");
125 @@ -6213,8 +6236,8 @@ void bgp_ethernetvpn_init(void)
126 install_element(BGP_EVPN_NODE, &evpnrt5_network_cmd);
127 install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_all_vni_cmd);
128 install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_all_vni_cmd);
129 - install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_autort_rfc8365_cmd);
130 - install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_autort_rfc8365_cmd);
131 + install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_autort_cmd);
132 + install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_autort_cmd);
133 install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_default_gw_cmd);
134 install_element(BGP_EVPN_NODE, &no_bgp_evpn_advertise_default_gw_cmd);
135 install_element(BGP_EVPN_NODE, &bgp_evpn_advertise_svi_ip_cmd);
136 diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
137 index 4c69fbcdf..2c4d45bb2 100644
140 @@ -639,6 +639,9 @@ struct bgp {
141 /* EVPN - use RFC 8365 to auto-derive RT */
142 int advertise_autort_rfc8365;
144 + /* EVPN - auto-derive RT AS */
145 + uint16_t autort_as;
148 * Flooding mechanism for BUM packets for VxLAN-EVPN.