浏览代码

Merge pull request #3273 from crosbymichael/set-mtu-in-dockerinit

Move MTU setting outside of lxc and set with netlink
Victor Vieux 11 年之前
父节点
当前提交
93abcc3a3b
共有 5 个文件被更改,包括 42 次插入2 次删除
  1. 1 0
      container.go
  2. 0 1
      lxc_template.go
  3. 4 0
      netlink/netlink_darwin.go
  4. 31 1
      netlink/netlink_linux.go
  5. 6 0
      sysinit/sysinit.go

+ 1 - 0
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",
 		)
 	}
 

+ 0 - 1
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

+ 4 - 0
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")
+}

+ 31 - 1
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 {

+ 6 - 0
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 {