From 0bf2305d2f238bfb0bea1d75e8f7d6a0a028a7bf Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Wed, 18 Dec 2013 20:41:34 -0800 Subject: [PATCH] Move MTU setting outside of lxc and set with netlink Upstream-commit: 0e6f0c4e02f4a29a1495f68f8aa52c5a10f587da Component: engine --- components/engine/container.go | 1 + components/engine/lxc_template.go | 1 - components/engine/netlink/netlink_darwin.go | 4 +++ components/engine/netlink/netlink_linux.go | 32 ++++++++++++++++++++- components/engine/sysinit/sysinit.go | 6 ++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/components/engine/container.go b/components/engine/container.go index e13747df51..1c55fbbe91 100644 --- a/components/engine/container.go +++ b/components/engine/container.go @@ -582,6 +582,7 @@ func (container *Container) Start() (err error) { params = append(params, "-g", network.Gateway, "-i", fmt.Sprintf("%s/%d", network.IPAddress, network.IPPrefixLen), + "-mtu", "1500", ) } diff --git a/components/engine/lxc_template.go b/components/engine/lxc_template.go index c0dc4f39a9..f96323b5ea 100644 --- a/components/engine/lxc_template.go +++ b/components/engine/lxc_template.go @@ -14,7 +14,6 @@ lxc.network.type = empty lxc.network.type = veth lxc.network.link = {{.NetworkSettings.Bridge}} lxc.network.name = eth0 -lxc.network.mtu = 1500 {{end}} # root filesystem diff --git a/components/engine/netlink/netlink_darwin.go b/components/engine/netlink/netlink_darwin.go index 9a972fe63f..dcc60b6764 100644 --- a/components/engine/netlink/netlink_darwin.go +++ b/components/engine/netlink/netlink_darwin.go @@ -25,3 +25,7 @@ func AddDefaultGw(ip net.IP) error { return fmt.Errorf("Not implemented") } + +func NetworkSetMTU(iface *net.Interface, mtu int) error { + return fmt.Errorf("Not implemented") +} diff --git a/components/engine/netlink/netlink_linux.go b/components/engine/netlink/netlink_linux.go index 239614b5fb..4417f5249e 100644 --- a/components/engine/netlink/netlink_linux.go +++ b/components/engine/netlink/netlink_linux.go @@ -328,7 +328,6 @@ func AddDefaultGw(ip net.IP) error { } return s.HandleAck(wb.Seq) - } // Bring up a particular network interface @@ -354,6 +353,37 @@ func NetworkLinkUp(iface *net.Interface) error { return s.HandleAck(wb.Seq) } +func NetworkSetMTU(iface *net.Interface, mtu 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 = 0xFFFFFFFF + wb.AddData(msg) + + var ( + b = make([]byte, 4) + native = nativeEndian() + ) + native.PutUint32(b, uint32(mtu)) + + data := newRtAttr(syscall.IFLA_MTU, 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 { diff --git a/components/engine/sysinit/sysinit.go b/components/engine/sysinit/sysinit.go index ad97439450..01c7473b5d 100644 --- a/components/engine/sysinit/sysinit.go +++ b/components/engine/sysinit/sysinit.go @@ -25,6 +25,7 @@ type DockerInitArgs struct { privileged bool env []string args []string + mtu int } func setupHostname(args *DockerInitArgs) error { @@ -50,6 +51,9 @@ func setupNetworking(args *DockerInitArgs) error { if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil { return fmt.Errorf("Unable to set up networking: %v", err) } + if err := netlink.NetworkSetMTU(iface, args.mtu); err != nil { + return fmt.Errorf("Unable to set MTU: %v", err) + } if err := netlink.NetworkLinkUp(iface); err != nil { return fmt.Errorf("Unable to set up networking: %v", err) } @@ -227,6 +231,7 @@ func SysInit() { ip := flag.String("i", "", "ip address") workDir := flag.String("w", "", "workdir") privileged := flag.Bool("privileged", false, "privileged mode") + mtu := flag.Int("mtu", 1500, "interface mtu") flag.Parse() // Get env @@ -250,6 +255,7 @@ func SysInit() { privileged: *privileged, env: env, args: flag.Args(), + mtu: *mtu, } if err := executeProgram(args); err != nil {