From 859053034a5cafeb584fc63bcd256ff6b8e9ae0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20=C5=9Awi=C4=85tek?= Date: Mon, 28 Oct 2024 19:27:32 +0100 Subject: [PATCH] Fetch all ip addresses in a single syscall on Linux --- providers/shared/network.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/providers/shared/network.go b/providers/shared/network.go index cd11acd6..9b7bf6cb 100644 --- a/providers/shared/network.go +++ b/providers/shared/network.go @@ -29,15 +29,19 @@ func Network() (ips, macs []string, err error) { ips = make([]string, 0, len(ifcs)) macs = make([]string, 0, len(ifcs)) - for _, ifc := range ifcs { - addrs, err := ifc.Addrs() - if err != nil { - return nil, nil, err - } - for _, addr := range addrs { - ips = append(ips, addr.String()) - } + // This function fetches all the addresses in a single syscall. Fetching addresses individually for each interface + // can be expensive when the host has a lot of interfaces. This usually happens when the host is doing virtualized + // networking for guests, in Kubernetes for example. + addrs, err := net.InterfaceAddrs() + if err != nil { + return nil, nil, err + } + for _, addr := range addrs { + ips = append(ips, addr.String()) + } + + for _, ifc := range ifcs { mac := ifc.HardwareAddr.String() if mac != "" { macs = append(macs, mac)