diff options
Diffstat (limited to 'table/vrf.go')
-rw-r--r-- | table/vrf.go | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/table/vrf.go b/table/vrf.go index c8fc2a16..18a5af87 100644 --- a/table/vrf.go +++ b/table/vrf.go @@ -16,6 +16,7 @@ package table import ( + "fmt" "github.com/osrg/gobgp/packet/bgp" ) @@ -27,6 +28,30 @@ type Vrf struct { LabelMap map[string]uint32 } +func (v *Vrf) ToGlobalPath(path *Path, label uint32) error { + nlri := path.GetNlri() + switch rf := path.GetRouteFamily(); rf { + case bgp.RF_IPv4_UC: + n := nlri.(*bgp.IPAddrPrefix) + path.OriginInfo().nlri = bgp.NewLabeledVPNIPAddrPrefix(n.Length, n.Prefix.String(), *bgp.NewMPLSLabelStack(label), v.Rd) + case bgp.RF_IPv6_UC: + n := nlri.(*bgp.IPv6AddrPrefix) + path.OriginInfo().nlri = bgp.NewLabeledVPNIPv6AddrPrefix(n.Length, n.Prefix.String(), *bgp.NewMPLSLabelStack(label), v.Rd) + case bgp.RF_EVPN: + n := nlri.(*bgp.EVPNNLRI) + switch n.RouteType { + case bgp.EVPN_ROUTE_TYPE_MAC_IP_ADVERTISEMENT: + n.RouteTypeData.(*bgp.EVPNMacIPAdvertisementRoute).RD = v.Rd + case bgp.EVPN_INCLUSIVE_MULTICAST_ETHERNET_TAG: + n.RouteTypeData.(*bgp.EVPNMulticastEthernetTagRoute).RD = v.Rd + } + default: + return fmt.Errorf("unsupported route family for vrf: %s", rf) + } + path.SetExtCommunities(v.ExportRt, false) + return nil +} + func (v *Vrf) Clone() *Vrf { f := func(rt []bgp.ExtendedCommunityInterface) []bgp.ExtendedCommunityInterface { l := make([]bgp.ExtendedCommunityInterface, 0, len(rt)) |