mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-07-16 16:32:03 +00:00
macvlan: Assign random MAC address
Macvtap interfaces require mac addresses to be unique even though they may be in a separate namespace. Hence use a randomly generate MAC address. Signed-off-by: Archana Shinde <archana.m.shinde@intel.com>
This commit is contained in:
parent
8847af8343
commit
581ff17857
@ -6,6 +6,7 @@
|
|||||||
package virtcontainers
|
package virtcontainers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
cryptoRand "crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -1345,7 +1346,10 @@ func createVirtualNetworkEndpoint(idx int, ifName string, interworkingModel NetI
|
|||||||
return &VirtualEndpoint{}, fmt.Errorf("invalid network endpoint index: %d", idx)
|
return &VirtualEndpoint{}, fmt.Errorf("invalid network endpoint index: %d", idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
netPair := createNetworkInterfacePair(idx, ifName, interworkingModel)
|
netPair, err := createNetworkInterfacePair(idx, ifName, interworkingModel)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
endpoint := &VirtualEndpoint{
|
endpoint := &VirtualEndpoint{
|
||||||
// TODO This is too specific. We may need to create multiple
|
// TODO This is too specific. We may need to create multiple
|
||||||
@ -1366,7 +1370,10 @@ func createBridgedMacvlanNetworkEndpoint(idx int, ifName string, interworkingMod
|
|||||||
return &BridgedMacvlanEndpoint{}, fmt.Errorf("invalid network endpoint index: %d", idx)
|
return &BridgedMacvlanEndpoint{}, fmt.Errorf("invalid network endpoint index: %d", idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
netPair := createNetworkInterfacePair(idx, ifName, interworkingModel)
|
netPair, err := createNetworkInterfacePair(idx, ifName, interworkingModel)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
endpoint := &BridgedMacvlanEndpoint{
|
endpoint := &BridgedMacvlanEndpoint{
|
||||||
NetPair: netPair,
|
NetPair: netPair,
|
||||||
@ -1466,17 +1473,20 @@ func generateInterfacesAndRoutes(networkNS NetworkNamespace) ([]*grpc.Interface,
|
|||||||
return ifaces, routes, nil
|
return ifaces, routes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNetworkInterfacePair(idx int, ifName string, interworkingModel NetInterworkingModel) NetworkInterfacePair {
|
func createNetworkInterfacePair(idx int, ifName string, interworkingModel NetInterworkingModel) (NetworkInterfacePair, error) {
|
||||||
uniqueID := uuid.Generate().String()
|
uniqueID := uuid.Generate().String()
|
||||||
|
|
||||||
hardAddr := net.HardwareAddr{0x02, 0x00, 0xCA, 0xFE, byte(idx >> 8), byte(idx)}
|
randomMacAddr, err := generateRandomPrivateMacAddr()
|
||||||
|
if err != nil {
|
||||||
|
return NetworkInterfacePair{}, fmt.Errorf("Could not generate random mac address: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
netPair := NetworkInterfacePair{
|
netPair := NetworkInterfacePair{
|
||||||
ID: uniqueID,
|
ID: uniqueID,
|
||||||
Name: fmt.Sprintf("br%d_kata", idx),
|
Name: fmt.Sprintf("br%d_kata", idx),
|
||||||
VirtIface: NetworkInterface{
|
VirtIface: NetworkInterface{
|
||||||
Name: fmt.Sprintf("eth%d", idx),
|
Name: fmt.Sprintf("eth%d", idx),
|
||||||
HardAddr: hardAddr.String(),
|
HardAddr: randomMacAddr,
|
||||||
},
|
},
|
||||||
TAPIface: NetworkInterface{
|
TAPIface: NetworkInterface{
|
||||||
Name: fmt.Sprintf("tap%d_kata", idx),
|
Name: fmt.Sprintf("tap%d_kata", idx),
|
||||||
@ -1484,8 +1494,23 @@ func createNetworkInterfacePair(idx int, ifName string, interworkingModel NetInt
|
|||||||
NetInterworkingModel: interworkingModel,
|
NetInterworkingModel: interworkingModel,
|
||||||
}
|
}
|
||||||
|
|
||||||
return netPair
|
return netPair, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateRandomPrivateMacAddr() (string, error) {
|
||||||
|
buf := make([]byte, 6)
|
||||||
|
_, err := cryptoRand.Read(buf)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the local bit for local addresses
|
||||||
|
// Addresses in this range are local mac addresses:
|
||||||
|
// x2-xx-xx-xx-xx-xx , x6-xx-xx-xx-xx-xx , xA-xx-xx-xx-xx-xx , xE-xx-xx-xx-xx-xx
|
||||||
|
buf[0] = (buf[0] | 2) & 0xfe
|
||||||
|
|
||||||
|
hardAddr := net.HardwareAddr(buf)
|
||||||
|
return hardAddr.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func networkInfoFromLink(handle *netlink.Handle, link netlink.Link) (NetworkInfo, error) {
|
func networkInfoFromLink(handle *netlink.Handle, link netlink.Link) (NetworkInfo, error) {
|
||||||
|
@ -230,8 +230,11 @@ func TestCreateVirtualNetworkEndpoint(t *testing.T) {
|
|||||||
// the resulting ID will be random - so let's overwrite to test the rest of the flow
|
// the resulting ID will be random - so let's overwrite to test the rest of the flow
|
||||||
result.NetPair.ID = "uniqueTestID-4"
|
result.NetPair.ID = "uniqueTestID-4"
|
||||||
|
|
||||||
|
// the resulting mac address will be random - so lets overwrite it
|
||||||
|
result.NetPair.VirtIface.HardAddr = macAddr.String()
|
||||||
|
|
||||||
if reflect.DeepEqual(result, expected) == false {
|
if reflect.DeepEqual(result, expected) == false {
|
||||||
t.Fatal()
|
t.Fatalf("\nGot: %+v, \n\nExpected: %+v", result, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,8 +265,11 @@ func TestCreateVirtualNetworkEndpointChooseIfaceName(t *testing.T) {
|
|||||||
// the resulting ID will be random - so let's overwrite to test the rest of the flow
|
// the resulting ID will be random - so let's overwrite to test the rest of the flow
|
||||||
result.NetPair.ID = "uniqueTestID-4"
|
result.NetPair.ID = "uniqueTestID-4"
|
||||||
|
|
||||||
|
// the resulting mac address will be random - so lets overwrite it
|
||||||
|
result.NetPair.VirtIface.HardAddr = macAddr.String()
|
||||||
|
|
||||||
if reflect.DeepEqual(result, expected) == false {
|
if reflect.DeepEqual(result, expected) == false {
|
||||||
t.Fatal()
|
t.Fatalf("\nGot: %+v, \n\nExpected: %+v", result, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user