From 2c4c27eb17ee58919bc6d765192935953e83e412 Mon Sep 17 00:00:00 2001 From: Casey Callendrello Date: Mon, 16 Jan 2023 17:36:00 +0100 Subject: [PATCH] bridge: re-fetch mac address It was noticed that, sometimes, the mac of the host-side of the veth changes after setting up the bridge. So, just refresh it. Fixes: #805 Signed-off-by: Casey Callendrello --- plugins/main/bridge/bridge.go | 45 +++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/plugins/main/bridge/bridge.go b/plugins/main/bridge/bridge.go index f1bdd8da..dce8568b 100644 --- a/plugins/main/bridge/bridge.go +++ b/plugins/main/bridge/bridge.go @@ -126,8 +126,8 @@ func loadNetConf(bytes []byte, envArgs string) (*NetConf, string, error) { // calcGateways processes the results from the IPAM plugin and does the // following for each IP family: -// - Calculates and compiles a list of gateway addresses -// - Adds a default route if needed +// - Calculates and compiles a list of gateway addresses +// - Adds a default route if needed func calcGateways(result *current.Result, n *NetConf) (*gwInfo, *gwInfo, error) { gwsV4 := &gwInfo{} @@ -517,24 +517,6 @@ func cmdAdd(args *skel.CmdArgs) error { return err } - // check bridge port state - retries := []int{0, 50, 500, 1000, 1000} - for idx, sleep := range retries { - time.Sleep(time.Duration(sleep) * time.Millisecond) - - hostVeth, err := netlink.LinkByName(hostInterface.Name) - if err != nil { - return err - } - if hostVeth.Attrs().OperState == netlink.OperUp { - break - } - - if idx == len(retries)-1 { - return fmt.Errorf("bridge port in error state: %s", hostVeth.Attrs().OperState) - } - } - if n.IsGW { var firstV4Addr net.IP var vlanInterface *current.Interface @@ -601,6 +583,29 @@ func cmdAdd(args *skel.CmdArgs) error { } } + var hostVeth netlink.Link + + // check bridge port state + retries := []int{0, 50, 500, 1000, 1000} + for idx, sleep := range retries { + time.Sleep(time.Duration(sleep) * time.Millisecond) + + hostVeth, err = netlink.LinkByName(hostInterface.Name) + if err != nil { + return err + } + if hostVeth.Attrs().OperState == netlink.OperUp { + break + } + + if idx == len(retries)-1 { + return fmt.Errorf("bridge port in error state: %s", hostVeth.Attrs().OperState) + } + } + + // In certain circumstances, the host-side of the veth may change addrs + hostInterface.Mac = hostVeth.Attrs().HardwareAddr.String() + // Refetch the bridge since its MAC address may change when the first // veth is added or after its IP address is set br, err = bridgeByName(n.BrName)