diff --git a/libnetwork/drivers/overlay/encryption.go b/libnetwork/drivers/overlay/encryption.go index 36d2a2f2b7..17e7c244ea 100644 --- a/libnetwork/drivers/overlay/encryption.go +++ b/libnetwork/drivers/overlay/encryption.go @@ -17,8 +17,9 @@ import ( ) const ( - mark = uint32(0xD0C4E3) - timeout = 30 + mark = uint32(0xD0C4E3) + timeout = 30 + pktExpansion = 26 // SPI(4) + SeqN(4) + IV(8) + PadLength(1) + NextHeader(1) + ICV(8) ) const ( @@ -560,3 +561,14 @@ func updateNodeKey(lIP, rIP net.IP, idxs []*spi, curKeys []*key, newIdx, priIdx, return spis } + +func (n *network) maxMTU() int { + mtu := vxlanVethMTU + if n.secure { + // In case of encryption account for the + // esp packet espansion and padding + mtu -= pktExpansion + mtu -= (mtu % 4) + } + return mtu +} diff --git a/libnetwork/drivers/overlay/joinleave.go b/libnetwork/drivers/overlay/joinleave.go index 1f21ee9b0d..3fa679c921 100644 --- a/libnetwork/drivers/overlay/joinleave.go +++ b/libnetwork/drivers/overlay/joinleave.go @@ -75,11 +75,13 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, // Set the container interface and its peer MTU to 1450 to allow // for 50 bytes vxlan encap (inner eth header(14) + outer IP(20) + // outer UDP(8) + vxlan header(8)) + mtu := n.maxMTU() + veth, err := nlh.LinkByName(overlayIfName) if err != nil { return fmt.Errorf("cound not find link by name %s: %v", overlayIfName, err) } - err = nlh.LinkSetMTU(veth, vxlanVethMTU) + err = nlh.LinkSetMTU(veth, mtu) if err != nil { return err } @@ -93,7 +95,7 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, if err != nil { return fmt.Errorf("could not find link by name %s: %v", containerIfName, err) } - err = nlh.LinkSetMTU(veth, vxlanVethMTU) + err = nlh.LinkSetMTU(veth, mtu) if err != nil { return err }