Skip to content

Commit

Permalink
Add more netlink functions for set ns by fd and bring iface down
Browse files Browse the repository at this point in the history
Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)
  • Loading branch information
crosbymichael committed Feb 11, 2014
1 parent 4dec36d commit f9cd1be
Showing 1 changed file with 58 additions and 3 deletions.
61 changes: 58 additions & 3 deletions pkg/netlink/netlink_linux.go
Expand Up @@ -15,7 +15,8 @@ const (
DEFAULT_CHANGE = 0xFFFFFFFF
IFLA_INFO_KIND = 1
IFLA_INFO_DATA = 2
VETH_PEER = 1
VETH_INFO_PEER = 1
IFLA_NET_NS_FD = 28
)

var nextSeqNr int
Expand Down Expand Up @@ -365,6 +366,28 @@ func NetworkLinkUp(iface *net.Interface) error {
return s.HandleAck(wb.Seq)
}

func NetworkLinkDown(iface *net.Interface) error {
s, err := getNetlinkSocket()
if err != nil {
return err
}
defer s.Close()

wb := newNetlinkRequest(syscall.RTM_NEWLINK, syscall.NLM_F_ACK)

msg := newIfInfomsg(syscall.AF_UNSPEC)
msg.Change = syscall.IFF_UP
msg.Flags = 0 & ^syscall.IFF_UP
msg.Index = int32(iface.Index)
wb.AddData(msg)

if err := s.Send(wb); err != nil {
return err
}

return s.HandleAck(wb.Seq)
}

func NetworkSetMTU(iface *net.Interface, mtu int) error {
s, err := getNetlinkSocket()
if err != nil {
Expand Down Expand Up @@ -461,6 +484,38 @@ func NetworkSetNsPid(iface *net.Interface, nspid int) error {
return s.HandleAck(wb.Seq)
}

func NetworkSetNsFd(iface *net.Interface, fd int) error {
s, err := getNetlinkSocket()
if err != nil {
return err
}
defer s.Close()

wb := newNetlinkRequest(syscall.RTM_SETLINK, syscall.NLM_F_ACK)

msg := newIfInfomsg(syscall.AF_UNSPEC)
msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(iface.Index)
msg.Change = DEFAULT_CHANGE
wb.AddData(msg)

var (
b = make([]byte, 4)
native = nativeEndian()
)
native.PutUint32(b, uint32(fd))

data := newRtAttr(IFLA_NET_NS_FD, b)
wb.AddData(data)

if err := s.Send(wb); err != nil {
return err
}

return s.HandleAck(wb.Seq)
}

// Add an Ip address to an interface. This is identical to:
// ip addr add $ip/$ipNet dev $iface
func NetworkLinkAddIp(iface *net.Interface, ip net.IP, ipNet *net.IPNet) error {
Expand Down Expand Up @@ -668,15 +723,15 @@ func getIfSocket() (fd int, err error) {
return -1, err
}

func NetworkChangeName(oldName, newName string) error {
func NetworkChangeName(iface *net.Interface, newName string) error {
fd, err := getIfSocket()
if err != nil {
return err
}
defer syscall.Close(fd)

data := [IFNAMSIZ * 2]byte{}
copy(data[:IFNAMSIZ-1], oldName)
copy(data[:IFNAMSIZ-1], iface.Name)
copy(data[IFNAMSIZ:IFNAMSIZ*2-1], newName)

if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.SIOCSIFNAME, uintptr(unsafe.Pointer(&data[0]))); errno != 0 {
Expand Down

0 comments on commit f9cd1be

Please sign in to comment.