// DelLinkByName removes an interface link. func DelLinkByName(ifName string) error { iface, err := netlink.LinkByName(ifName) if err != nil { return fmt.Errorf("failed to lookup %q: %v", ifName, err) } if err = netlink.LinkDel(iface); err != nil { return fmt.Errorf("failed to delete %q: %v", ifName, err) } return nil }
// 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 }
// teardownKvmNets teardown every active networking from networking by // removing tuntap interface and releasing its ip from IPAM plugin func (n *Networking) teardownKvmNets() { for _, an := range n.nets { switch an.conf.Type { case "ptp", "bridge": // remove tuntap interface tuntap.RemovePersistentIface(an.runtime.IfName, tuntap.Tap) case "macvlan": link, err := netlink.LinkByName(an.runtime.IfName) if err != nil { log.Printf("Cannot find link `%v`: %v", an.runtime.IfName, err) continue } else { err := netlink.LinkDel(link) if err != nil { log.Printf("Cannot remove link `%v`: %v", an.runtime.IfName, err) continue } } default: log.Printf("Unsupported network type: %q", an.conf.Type) continue } // ugly hack again to directly call IPAM plugin to release IP an.conf.Type = an.conf.IPAM.Type _, err := n.execNetPlugin("DEL", &an, an.runtime.IfName) if err != nil { log.Printf("Error executing network plugin: %q", err) } // remove masquerading if it was prepared if an.conf.IPMasq { chain := getChainName(n.podID.String(), an.conf.Name) err := ip.TeardownIPMasq(&net.IPNet{ IP: an.runtime.IP, Mask: net.IPMask(an.runtime.Mask), }, chain) if err != nil { log.Printf("Error on removing masquerading: %q", err) } } } }