diff --git a/netlink/netlink_linux.go b/netlink/netlink_linux.go index 92accd4aa..f2b42db89 100644 --- a/netlink/netlink_linux.go +++ b/netlink/netlink_linux.go @@ -17,21 +17,27 @@ const ( VETH_INFO_PEER = 1 IFLA_NET_NS_FD = 28 SIOC_BRADDBR = 0x89a0 + SIOC_BRDELBR = 0x89a1 SIOC_BRADDIF = 0x89a2 ) var nextSeqNr uint32 type ifreqHwaddr struct { - IfrnName [16]byte + IfrnName [IFNAMSIZ]byte IfruHwaddr syscall.RawSockaddr } type ifreqIndex struct { - IfrnName [16]byte + IfrnName [IFNAMSIZ]byte IfruIndex int32 } +type ifreqFlags struct { + IfrnName [IFNAMSIZ]byte + Ifruflags uint16 +} + func nativeEndian() binary.ByteOrder { var x uint32 = 0x01020304 if *(*byte)(unsafe.Pointer(&x)) == 0x01 { @@ -895,13 +901,9 @@ func NetworkCreateVethPair(name1, name2 string) error { // Create the actual bridge device. This is more backward-compatible than // netlink.NetworkLinkAdd and works on RHEL 6. func CreateBridge(name string, setMacAddr bool) error { - s, err := syscall.Socket(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_IP) + s, err := getIfSocket() if err != nil { - // ipv6 issue, creating with ipv4 - s, err = syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_IP) - if err != nil { - return err - } + return err } defer syscall.Close(s) @@ -918,16 +920,39 @@ func CreateBridge(name string, setMacAddr bool) error { return nil } +// Delete the actual bridge device. +func DeleteBridge(name string) error { + s, err := getIfSocket() + if err != nil { + return err + } + defer syscall.Close(s) + + nameBytePtr, err := syscall.BytePtrFromString(name) + if err != nil { + return err + } + + var ifr ifreqFlags + copy(ifr.IfrnName[:len(ifr.IfrnName)-1], []byte(name)) + if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(s), + syscall.SIOCSIFFLAGS, uintptr(unsafe.Pointer(&ifr))); err != 0 { + return err + } + + if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(s), + SIOC_BRDELBR, uintptr(unsafe.Pointer(nameBytePtr))); err != 0 { + return err + } + return nil +} + // Add a slave to abridge device. This is more backward-compatible than // netlink.NetworkSetMaster and works on RHEL 6. func AddToBridge(iface, master *net.Interface) error { - s, err := syscall.Socket(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_IP) + s, err := getIfSocket() if err != nil { - // ipv6 issue, creating with ipv4 - s, err = syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_IP) - if err != nil { - return err - } + return err } defer syscall.Close(s) diff --git a/netlink/netlink_unsupported.go b/netlink/netlink_unsupported.go index 2c4d31940..f428933c1 100644 --- a/netlink/netlink_unsupported.go +++ b/netlink/netlink_unsupported.go @@ -67,6 +67,10 @@ func CreateBridge(name string, setMacAddr bool) error { return ErrNotImplemented } +func DeleteBridge(name string) error { + return ErrNotImplemented +} + func AddToBridge(iface, master *net.Interface) error { return ErrNotImplemented }