Merge pull request #5115 from alexlarsson/fix-libcontainer-network-rhel6

Fix libcontainer network support on rhel6
This commit is contained in:
Guillaume J. Charmes 2014-04-10 07:45:12 -07:00
commit 8a64aa8f4b
3 changed files with 35 additions and 1 deletions

View file

@ -50,7 +50,7 @@ func SetInterfaceMaster(name, master string) error {
if err != nil {
return err
}
return netlink.NetworkSetMaster(iface, masterIface)
return netlink.AddToBridge(iface, masterIface)
}
func SetDefaultGateway(ip string) error {

View file

@ -19,6 +19,7 @@ const (
VETH_INFO_PEER = 1
IFLA_NET_NS_FD = 28
SIOC_BRADDBR = 0x89a0
SIOC_BRADDIF = 0x89a2
)
var nextSeqNr int
@ -28,6 +29,11 @@ type ifreqHwaddr struct {
IfruHwaddr syscall.RawSockaddr
}
type ifreqIndex struct {
IfrnName [16]byte
IfruIndex int32
}
func nativeEndian() binary.ByteOrder {
var x uint32 = 0x01020304
if *(*byte)(unsafe.Pointer(&x)) == 0x01 {
@ -842,6 +848,30 @@ func CreateBridge(name string, setMacAddr bool) error {
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)
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
}
}
defer syscall.Close(s)
ifr := ifreqIndex{}
copy(ifr.IfrnName[:], master.Name)
ifr.IfruIndex = int32(iface.Index)
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(s), SIOC_BRADDIF, uintptr(unsafe.Pointer(&ifr))); err != 0 {
return err
}
return nil
}
func setBridgeMacAddress(s int, name string) error {
ifr := ifreqHwaddr{}
ifr.IfruHwaddr.Family = syscall.ARPHRD_ETHER

View file

@ -63,3 +63,7 @@ func NetworkLinkDown(iface *net.Interface) error {
func CreateBridge(name string, setMacAddr bool) error {
return ErrNotImplemented
}
func AddToBridge(iface, master *net.Interface) error {
return ErrNotImplemented
}