Browse code

Move MTU setting outside of lxc and set with netlink

Michael Crosby authored on 2013/12/19 13:41:34
Showing 5 changed files
... ...
@@ -582,6 +582,7 @@ func (container *Container) Start() (err error) {
582 582
 		params = append(params,
583 583
 			"-g", network.Gateway,
584 584
 			"-i", fmt.Sprintf("%s/%d", network.IPAddress, network.IPPrefixLen),
585
+			"-mtu", "1500",
585 586
 		)
586 587
 	}
587 588
 
... ...
@@ -14,7 +14,6 @@ lxc.network.type = empty
14 14
 lxc.network.type = veth
15 15
 lxc.network.link = {{.NetworkSettings.Bridge}}
16 16
 lxc.network.name = eth0
17
-lxc.network.mtu = 1500
18 17
 {{end}}
19 18
 
20 19
 # root filesystem
... ...
@@ -25,3 +25,7 @@ func AddDefaultGw(ip net.IP) error {
25 25
 	return fmt.Errorf("Not implemented")
26 26
 
27 27
 }
28
+
29
+func NetworkSetMTU(iface *net.Interface, mtu int) error {
30
+	return fmt.Errorf("Not implemented")
31
+}
... ...
@@ -328,7 +328,6 @@ func AddDefaultGw(ip net.IP) error {
328 328
 	}
329 329
 
330 330
 	return s.HandleAck(wb.Seq)
331
-
332 331
 }
333 332
 
334 333
 // Bring up a particular network interface
... ...
@@ -354,6 +353,37 @@ func NetworkLinkUp(iface *net.Interface) error {
354 354
 	return s.HandleAck(wb.Seq)
355 355
 }
356 356
 
357
+func NetworkSetMTU(iface *net.Interface, mtu int) error {
358
+	s, err := getNetlinkSocket()
359
+	if err != nil {
360
+		return err
361
+	}
362
+	defer s.Close()
363
+
364
+	wb := newNetlinkRequest(syscall.RTM_SETLINK, syscall.NLM_F_ACK)
365
+
366
+	msg := newIfInfomsg(syscall.AF_UNSPEC)
367
+	msg.Type = syscall.RTM_SETLINK
368
+	msg.Flags = syscall.NLM_F_REQUEST
369
+	msg.Index = int32(iface.Index)
370
+	msg.Change = 0xFFFFFFFF
371
+	wb.AddData(msg)
372
+
373
+	var (
374
+		b      = make([]byte, 4)
375
+		native = nativeEndian()
376
+	)
377
+	native.PutUint32(b, uint32(mtu))
378
+
379
+	data := newRtAttr(syscall.IFLA_MTU, b)
380
+	wb.AddData(data)
381
+
382
+	if err := s.Send(wb); err != nil {
383
+		return err
384
+	}
385
+	return s.HandleAck(wb.Seq)
386
+}
387
+
357 388
 // Add an Ip address to an interface. This is identical to:
358 389
 // ip addr add $ip/$ipNet dev $iface
359 390
 func NetworkLinkAddIp(iface *net.Interface, ip net.IP, ipNet *net.IPNet) error {
... ...
@@ -25,6 +25,7 @@ type DockerInitArgs struct {
25 25
 	privileged bool
26 26
 	env        []string
27 27
 	args       []string
28
+	mtu        int
28 29
 }
29 30
 
30 31
 func setupHostname(args *DockerInitArgs) error {
... ...
@@ -50,6 +51,9 @@ func setupNetworking(args *DockerInitArgs) error {
50 50
 		if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil {
51 51
 			return fmt.Errorf("Unable to set up networking: %v", err)
52 52
 		}
53
+		if err := netlink.NetworkSetMTU(iface, args.mtu); err != nil {
54
+			return fmt.Errorf("Unable to set MTU: %v", err)
55
+		}
53 56
 		if err := netlink.NetworkLinkUp(iface); err != nil {
54 57
 			return fmt.Errorf("Unable to set up networking: %v", err)
55 58
 		}
... ...
@@ -227,6 +231,7 @@ func SysInit() {
227 227
 	ip := flag.String("i", "", "ip address")
228 228
 	workDir := flag.String("w", "", "workdir")
229 229
 	privileged := flag.Bool("privileged", false, "privileged mode")
230
+	mtu := flag.Int("mtu", 1500, "interface mtu")
230 231
 	flag.Parse()
231 232
 
232 233
 	// Get env
... ...
@@ -250,6 +255,7 @@ func SysInit() {
250 250
 		privileged: *privileged,
251 251
 		env:        env,
252 252
 		args:       flag.Args(),
253
+		mtu:        *mtu,
253 254
 	}
254 255
 
255 256
 	if err := executeProgram(args); err != nil {