| ... | ... |
@@ -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 {
|