diff --git a/calico-vpp-agent/cni/pod_interface/memif.go b/calico-vpp-agent/cni/pod_interface/memif.go index 791066e5..a12f8e8a 100644 --- a/calico-vpp-agent/cni/pod_interface/memif.go +++ b/calico-vpp-agent/cni/pod_interface/memif.go @@ -17,6 +17,7 @@ package pod_interface import ( "fmt" + "net" "github.com/containernetworking/plugins/pkg/ns" "github.com/pkg/errors" @@ -83,6 +84,12 @@ func (i *MemifPodInterfaceDriver) CreateInterface(podSpec *storage.LocalPodSpec, } if *usedIfSpec.IsL3 { memif.Mode = types.MemifModeIP + } else if podSpec.NetworkName == "" && podSpec.PBLMemifSpec.Mac != "" { + pblMac, err := net.ParseMAC(podSpec.PBLMemifSpec.Mac) + if err != nil { + return err + } + memif.MacAddress = pblMac } err = i.vpp.CreateMemif(memif) diff --git a/calico-vpp-agent/cni/pod_interface/tuntap.go b/calico-vpp-agent/cni/pod_interface/tuntap.go index 875b5fd4..6e8ab504 100644 --- a/calico-vpp-agent/cni/pod_interface/tuntap.go +++ b/calico-vpp-agent/cni/pod_interface/tuntap.go @@ -149,6 +149,14 @@ func (i *TunTapPodInterfaceDriver) CreateInterface(podSpec *storage.LocalPodSpec HostMtu: i.computePodMtu(podSpec.Mtu, i.felixConfig, i.ipipEncapRefCounts > 0, i.vxlanEncapRefCounts > 0), } + if podSpec.IfSpec.Mac != "" { + i.log.Debugf("mac address specified for interface %s in vpp: '%s'", podSpec.InterfaceName, podSpec.IfSpec.Mac) + mac, err := net.ParseMAC("02:00:00:00:00:02") + if err != nil { + return err + } + tun.HardwareAddr = mac + } if *podSpec.IfSpec.IsL3 { tun.Flags |= types.TapFlagTun } diff --git a/calico-vpp-agent/cni/storage/storage.go b/calico-vpp-agent/cni/storage/storage.go index 28b3847f..407ee29f 100644 --- a/calico-vpp-agent/cni/storage/storage.go +++ b/calico-vpp-agent/cni/storage/storage.go @@ -35,7 +35,7 @@ import ( ) const ( - CniServerStateFileVersion = 8 // Used to ensure compatibility wen we reload data + CniServerStateFileVersion = 10 // Used to ensure compatibility wen we reload data MaxApiTagLen = 63 /* No more than 64 characters in API tags */ VrfTagHashLen = 8 /* how many hash charatecters (b64) of the name in tag prefix (useful when trucated) */ ) diff --git a/config/config.go b/config/config.go index 3fcda0ca..9ef6f863 100644 --- a/config/config.go +++ b/config/config.go @@ -176,6 +176,7 @@ type InterfaceSpec struct { IsL3 *bool `json:"isl3"` /* "interrupt" "adaptive" or "polling" mode */ RxMode types.RxMode `json:"rxMode"` + Mac string `json:"mac"` } func (i *InterfaceSpec) GetIsL3(isMemif bool) bool {