// DelLinkByNameAddr remove an interface returns its IP address // of the specified family func DelLinkByNameAddr(ifName string, family int) (*net.IPNet, error) { iface, err := netlink.LinkByName(ifName) if err != nil { return nil, fmt.Errorf("failed to lookup %q: %v", ifName, err) } addrs, err := netlink.AddrList(iface, family) if err != nil || len(addrs) == 0 { return nil, fmt.Errorf("failed to get IP addresses for %q: %v", ifName, err) } if err = netlink.LinkDel(iface); err != nil { return nil, fmt.Errorf("failed to delete %q: %v", ifName, err) } return addrs[0].IPNet, nil }
func ensureBridgeAddr(br *netlink.Bridge, ipn *net.IPNet) error { addrs, err := netlink.AddrList(br, syscall.AF_INET) if err != nil && err != syscall.ENOENT { return fmt.Errorf("could not get list of IP addresses: %v", err) } // if there're no addresses on the bridge, it's ok -- we'll add one if len(addrs) > 0 { ipnStr := ipn.String() for _, a := range addrs { // string comp is actually easiest for doing IPNet comps if a.IPNet.String() == ipnStr { return nil } } return fmt.Errorf("%q already has an IP address different from %v", br.Name, ipn.String()) } addr := &netlink.Addr{IPNet: ipn, Label: ""} if err := netlink.AddrAdd(br, addr); err != nil { return fmt.Errorf("could not add IP address to %q: %v", br.Name, err) } return nil }