From 01820a672e37471f2e06e518e0ea4df983b5375c Mon Sep 17 00:00:00 2001 From: Timo Beckers Date: Fri, 17 Nov 2017 09:19:40 +0100 Subject: [PATCH] Set veth MTU using CALICO_LIBNETWORK_VETH_MTU --- driver/network_driver.go | 24 +++++++++++++++++++++--- utils/netns/netns.go | 3 ++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/driver/network_driver.go b/driver/network_driver.go index f3e565f..00983e6 100644 --- a/driver/network_driver.go +++ b/driver/network_driver.go @@ -8,6 +8,7 @@ import ( "sort" "strings" "time" + "strconv" "github.com/pkg/errors" libcalicoErrors "github.com/projectcalico/libcalico-go/lib/errors" @@ -29,6 +30,7 @@ const DOCKER_LABEL_PREFIX = "org.projectcalico.label." const LABEL_POLL_TIMEOUT_ENVKEY = "CALICO_LIBNETWORK_LABEL_POLL_TIMEOUT" const CREATE_PROFILES_ENVKEY = "CALICO_LIBNETWORK_CREATE_PROFILES" const LABEL_ENDPOINTS_ENVKEY = "CALICO_LIBNETWORK_LABEL_ENDPOINTS" +const VETH_MTU_ENVKEY = "CALICO_LIBNETWORK_VETH_MTU" // NetworkDriver is the Calico network driver representation. // Must be used with Calico IPAM and supports IPv4 only. @@ -42,6 +44,8 @@ type NetworkDriver struct { DummyIPV4Nexthop string + vethMTU uint16 + labelPollTimeout time.Duration createProfiles bool @@ -72,6 +76,20 @@ func NewNetworkDriver(client *datastoreClient.Client) network.Driver { labelEndpoints: strings.EqualFold(os.Getenv(LABEL_ENDPOINTS_ENVKEY), "true"), } + // Check if MTU environment variable is given, parse into uint16 + // and override the default in the NetworkDriver. + if mtuStr, ok := os.LookupEnv(VETH_MTU_ENVKEY); ok { + mtu, err := strconv.ParseUint(mtuStr, 10, 16) + if err != nil { + log.Fatalf("Failed to parse %v '%v' into uint16: %v", + VETH_MTU_ENVKEY, mtuStr, err) + } + + driver.vethMTU = uint16(mtu) + + log.WithField("mtu", mtu).Info("Parsed veth MTU") + } + if !driver.createProfiles { log.Info("Feature disabled: no Calico profiles will be created per network") } @@ -377,10 +395,10 @@ func (d NetworkDriver) Join(request *network.JoinRequest) (*network.JoinResponse hostInterfaceName := "cali" + prefix tempInterfaceName := "temp" + prefix - if err = netns.CreateVeth(hostInterfaceName, tempInterfaceName); err != nil { + if err = netns.CreateVeth(hostInterfaceName, tempInterfaceName, d.vethMTU); err != nil { err = errors.Wrapf( - err, "Veth creation error, hostInterfaceName=%v, tempInterfaceName=%v", - hostInterfaceName, tempInterfaceName) + err, "Veth creation error, hostInterfaceName=%v, tempInterfaceName=%v, vethMTU=%v", + hostInterfaceName, tempInterfaceName, d.vethMTU) log.Errorln(err) return nil, err } diff --git a/utils/netns/netns.go b/utils/netns/netns.go index 55ae5ee..38c4824 100644 --- a/utils/netns/netns.go +++ b/utils/netns/netns.go @@ -11,10 +11,11 @@ import ( "github.com/vishvananda/netlink" ) -func CreateVeth(vethNameHost, vethNameNSTemp string) error { +func CreateVeth(vethNameHost, vethNameNSTemp string, vethMTU uint16) error { veth := &netlink.Veth{ LinkAttrs: netlink.LinkAttrs{ Name: vethNameHost, + MTU: int(vethMTU), }, PeerName: vethNameNSTemp, }