Mailing List Archive

[PATCH 54/57] bgpd: VRF table exportation filters labels according to layer type
From: Julien Courtat <julien.courtat@6wind.com>

From draft-ietf-bess-evpn-inter-subnet-forwarding-01#section-5.1.1,
Label-1 and Label-2 is not exported systematically. Actually, Label-1
refers to MAC-VRF and is exported to LAYER_2 VRF. Label-2 will act the
same with IP-VRF and is exported to LAYER_3 VRF.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
---
bgpd/bgp_route.c | 78 +++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 55 insertions(+), 23 deletions(-)

diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 6673749c7dde..9a8619dda841 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1737,6 +1737,58 @@ bgp_vrf_update (struct bgp_vrf *vrf, afi_t afi, struct bgp_node *rn,
}
}

+/* when exporting bgp_info structure to out VRF RIB,
+ * some information are copied :
+ * other info is filtered : labels
+ */
+static void bgp_vrf_copy_bgp_info(struct bgp_vrf *vrf, struct bgp_node *rn,
+ safi_t safi, struct bgp_info *select, struct bgp_info *target)
+{
+ if(!target->extra)
+ target->extra = bgp_info_extra_new();
+ if(select->attr)
+ {
+ if(target->attr)
+ bgp_attr_unintern(&target->attr);
+ target->attr = bgp_attr_intern (select->attr);
+ if(select->attr->extra)
+ {
+ if(select->attr->extra->ecommunity)
+ {
+ if(!target->attr->extra)
+ bgp_attr_extra_get(target->attr);
+ /* MAC-VRF does not export RouterMac
+ * however, because ecom is shared among all bgp infos
+ * this option is not stripped;
+ * This should be the place to strip the ecomm
+ */
+ overlay_index_dup(target->attr, &(select->attr->extra->evpn_overlay));
+ }
+ }
+ }
+ /* copy label information */
+ if(select->extra)
+ {
+ uint32_t l3label = 0, l2label = 0;
+
+ bgp_vrf_update_labels (vrf, rn, select, &l3label, &l2label);
+ if(safi == SAFI_INTERNAL_EVPN)
+ {
+ target->extra->nlabels = 1;
+ if(vrf->ltype == BGP_LAYER_TYPE_3)
+ target->extra->labels[0] = (l3label << 4) | 1;
+ else
+ target->extra->labels[0] = (l2label << 4) | 1;
+ }
+ else
+ {
+ target->extra->nlabels = select->extra->nlabels;
+ memcpy (target->extra->labels, select->extra->labels,
+ select->extra->nlabels * sizeof(select->extra->labels[0]));
+ }
+ }
+}
+
/* updates selected bgp_info structure to bgp vrf rib table
* most of the cases, processing consists in adding or removing entries in RIB tables
* on some cases, there is an update request. then it is necessary to have both old and new ri
@@ -1798,7 +1850,6 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
/* check entry not already present */
for (iter = vrf_rn->info; iter; iter = iter->next)
{
- /* coming from same peer */
if(iter->peer->remote_id.s_addr == select->peer->remote_id.s_addr)
{
bgp_info_delete(vrf_rn, iter);
@@ -1842,24 +1893,7 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
{
/* update labels labels */
/* update attr part / containing next hop */
- if(select->extra)
- {
- iter->extra->nlabels = select->extra->nlabels;
- memcpy (iter->extra->labels, select->extra->labels,
- select->extra->nlabels * sizeof(select->extra->labels[0]));
- }
- if(select->attr)
- {
- if(iter->attr)
- bgp_attr_unintern(&iter->attr);
- iter->attr = bgp_attr_intern (select->attr);
- if(select->attr->extra && select->attr->extra->ecommunity)
- {
- bgp_attr_extra_get(iter->attr);
- iter->attr->extra->ecommunity =
- ecommunity_dup(select->attr->extra->ecommunity);
- }
- }
+ bgp_vrf_copy_bgp_info(vrf, rn, safi, select, iter);
/* if changes, update, and permit resending
information */
bgp_info_set_flag (rn, iter, BGP_INFO_ATTR_CHANGED);
@@ -1870,16 +1904,14 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, safi_t safi, struct bgp_nod
/* silently add new entry to rn */
if(!iter)
{
- iter = info_make (select->type, select->sub_type, select->peer, select->attr,
+ iter = info_make (select->type, select->sub_type, select->peer, NULL,
vrf_rn);
if (select->extra)
{
iter->extra = bgp_info_extra_new();
iter->extra->vrf_rd = *prd;
- iter->extra->nlabels = select->extra->nlabels;
- memcpy (iter->extra->labels, select->extra->labels,
- select->extra->nlabels * sizeof(select->extra->labels[0]));
}
+ bgp_vrf_copy_bgp_info(vrf, rn, safi, select, iter);
if (select->attr->extra)
overlay_index_dup(iter->attr, &(select->attr->extra->evpn_overlay));
if(safi == SAFI_INTERNAL_EVPN)
--
2.1.4


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev