plugins: set MAC addresses based on IP

This will give deterministic MAC addresses for all interfaces CNI
creates and manages the IP for:
* bridge: container veth and host bridge
* macvlan: container veth
* ptp: container veth and host veth
This commit is contained in:
Stefan Junker
2016-06-28 17:46:17 -07:00
parent 3a1354cff6
commit 924b30b57d
7 changed files with 69 additions and 42 deletions

View File

@ -21,16 +21,10 @@ import (
"github.com/containernetworking/cni/pkg/invoke"
"github.com/containernetworking/cni/pkg/ip"
"github.com/containernetworking/cni/pkg/types"
"github.com/containernetworking/cni/pkg/utils/hwaddr"
"github.com/vishvananda/netlink"
)
const (
// veth link dev type
vethLinkType = "veth"
)
func ExecAdd(plugin string, netconf []byte) (*types.Result, error) {
return invoke.DelegateAdd(plugin, netconf)
}
@ -51,17 +45,6 @@ func ConfigureIface(ifName string, res *types.Result) error {
return fmt.Errorf("failed to set %q UP: %v", ifName, err)
}
// only set hardware address to veth when using ipv4
if link.Type() == vethLinkType && res.IP4 != nil {
hwAddr, err := hwaddr.GenerateHardwareAddr4(res.IP4.IP.IP, hwaddr.PrivateMACPrefix)
if err != nil {
return fmt.Errorf("failed to generate hardware addr: %v", err)
}
if err = netlink.LinkSetHardwareAddr(link, hwAddr); err != nil {
return fmt.Errorf("failed to add hardware addr to %q: %v", ifName, err)
}
}
// TODO(eyakubovich): IPv6
addr := &netlink.Addr{IPNet: &res.IP4.IP, Label: ""}
if err = netlink.AddrAdd(link, addr); err != nil {