]> git.proxmox.com Git - frr.git/blob - debian/patches/pve/0002-bgpd-add-an-option-for-RT-auto-derivation-to-force-A.patch
update patches
[frr.git] / debian / patches / pve / 0002-bgpd-add-an-option-for-RT-auto-derivation-to-force-A.patch
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
5
6 Allow to define a custom AS for autort AS:VNI
7
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
10
11 Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
12 ---
13 bgpd/bgp_evpn.c | 12 ++++++++++--
14 bgpd/bgp_evpn_vty.c | 47 +++++++++++++++++++++++++++++++++------------
15 bgpd/bgpd.h | 3 +++
16 3 files changed, 48 insertions(+), 14 deletions(-)
17
18 diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
19 index 8d8e3ffd2..135c1a610 100644
20 --- a/bgpd/bgp_evpn.c
21 +++ b/bgpd/bgp_evpn.c
22 @@ -491,7 +491,11 @@ static void form_auto_rt(struct bgp *bgp, vni_t vni, struct list *rtl)
23
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);
29 + } else {
30 + encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
31 + }
32
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)
36
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);
42 + } else {
43 + encode_route_target_as((bgp->as & 0xFFFF), vni, &eval);
44 + }
45
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,
53 return CMD_SUCCESS;
54 }
55
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"
66 + "ASN\n")
67 {
68 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
69
70 if (!bgp)
71 return CMD_WARNING;
72 - evpn_set_advertise_autort_rfc8365(bgp);
73 +
74 + if (as) {
75 + bgp->autort_as = as;
76 + bgp_evpn_handle_autort_change(bgp);
77 + }
78 +
79 + if (rfc8365)
80 + evpn_set_advertise_autort_rfc8365(bgp);
81 +
82 return CMD_SUCCESS;
83 }
84
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]",
91 NO_STR
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"
96 + "ASN\n")
97 {
98 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
99
100 if (!bgp)
101 return CMD_WARNING;
102 - evpn_unset_advertise_autort_rfc8365(bgp);
103 +
104 + if (as) {
105 + bgp->autort_as = 0;
106 + bgp_evpn_handle_autort_change(bgp);
107 + }
108 +
109 + if (rfc8365)
110 + evpn_unset_advertise_autort_rfc8365(bgp);
111 +
112 return CMD_SUCCESS;
113 }
114
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");
118
119 + if (bgp->autort_as)
120 + vty_out(vty, " autort as %u\n", bgp->autort_as);
121 +
122 if (bgp->advertise_gw_macip)
123 vty_out(vty, " advertise-default-gw\n");
124
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
138 --- a/bgpd/bgpd.h
139 +++ b/bgpd/bgpd.h
140 @@ -639,6 +639,9 @@ struct bgp {
141 /* EVPN - use RFC 8365 to auto-derive RT */
142 int advertise_autort_rfc8365;
143
144 + /* EVPN - auto-derive RT AS */
145 + uint16_t autort_as;
146 +
147 /*
148 * Flooding mechanism for BUM packets for VxLAN-EVPN.
149 */
150 --
151 2.30.2
152