diff --git a/daemon/daemon.go b/daemon/daemon.go index 5410d14156..60d45b6a80 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -36,6 +36,7 @@ import ( "github.com/docker/docker/registry" "github.com/docker/docker/runconfig" "github.com/docker/docker/trust" + "github.com/docker/libcontainer/netlink" "github.com/docker/libnetwork" ) @@ -589,6 +590,8 @@ func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig. } func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemon, err error) { + setDefaultMtu(config) + // Ensure we have compatible configuration options if err := checkConfigOptions(config); err != nil { return nil, err @@ -981,3 +984,30 @@ func (daemon *Daemon) newBaseContainer(id string) CommonContainer { root: daemon.containerRoot(id), } } + +func setDefaultMtu(config *Config) { + // do nothing if the config does not have the default 0 value. + if config.Mtu != 0 { + return + } + config.Mtu = defaultNetworkMtu + if routeMtu, err := getDefaultRouteMtu(); err == nil { + config.Mtu = routeMtu + } +} + +var errNoDefaultRoute = errors.New("no default route was found") + +// getDefaultRouteMtu returns the MTU for the default route's interface. +func getDefaultRouteMtu() (int, error) { + routes, err := netlink.NetworkGetRoutes() + if err != nil { + return 0, err + } + for _, r := range routes { + if r.Default { + return r.Iface.MTU, nil + } + } + return 0, errNoDefaultRoute +}