From: Julien Courtat <julien.cour...@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.guib...@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