func SetHWAddrByIP(ifName string, ip4 net.IP, ip6 net.IP) error { iface, err := netlink.LinkByName(ifName) if err != nil { return fmt.Errorf("failed to lookup %q: %v", ifName, err) } switch { case ip4 == nil && ip6 == nil: return fmt.Errorf("neither ip4 or ip6 specified") case ip4 != nil: { hwAddr, err := hwaddr.GenerateHardwareAddr4(ip4, hwaddr.PrivateMACPrefix) if err != nil { return fmt.Errorf("failed to generate hardware addr: %v", err) } if err = netlink.LinkSetHardwareAddr(iface, hwAddr); err != nil { return fmt.Errorf("failed to add hardware addr to %q: %v", ifName, err) } } case ip6 != nil: // TODO: IPv6 } return nil }
{ ip: net.ParseIP("10.250.0.244"), expectedMAC: (net.HardwareAddr)(append(hwaddr.PrivateMACPrefix, 0x0a, 0xfa, 0x00, 0xf4)), }, { ip: net.ParseIP("172.17.0.2"), expectedMAC: (net.HardwareAddr)(append(hwaddr.PrivateMACPrefix, 0xac, 0x11, 0x00, 0x02)), }, { ip: net.IPv4(byte(172), byte(17), byte(0), byte(2)), expectedMAC: (net.HardwareAddr)(append(hwaddr.PrivateMACPrefix, 0xac, 0x11, 0x00, 0x02)), }, } for _, tc := range testCases { mac, err := hwaddr.GenerateHardwareAddr4(tc.ip, hwaddr.PrivateMACPrefix) Expect(err).NotTo(HaveOccurred()) Expect(mac).To(Equal(tc.expectedMAC)) } }) It("return error if input is not ipv4 address", func() { testCases := []net.IP{ net.ParseIP(""), net.ParseIP("2001:db8:0:1:1:1:1:1"), } for _, tc := range testCases { _, err := hwaddr.GenerateHardwareAddr4(tc, hwaddr.PrivateMACPrefix) Expect(err).To(BeAssignableToTypeOf(hwaddr.SupportIp4OnlyErr{})) } })