My workplace has 2 office areas which is only 200 meters away from each other. They have their own local networks, their own Internet connections, with routers configured to fallback to the other if their own Internet connection is down. The connection between 2 routers is stable with multiple redundant links.
There are multiple Wireless Access Points between these 2 areas, with wired connection to either one. Users often move between these 2 areas a lot, and I want to provide them a seamless AP transition instead of setting up 2 separate SSIDs. To achieve it, all Access Points (or SSIDs with the same name) must be on the same Layer-2 network. 1 of the 2 routers will be used as the default gateway, with the other still being used as fallback.
The past 2 weeks was a lot of fun (and headache) to me after I learned a lot about wireless operation modes and how to encapsulate 802.1q frames inside 802.11 packets using GRE tunnel. Putting a 1522 byte packet inside a packet which allows 2304 bytes of payload is straightforward. So far so good.
The problem arises when I try to do the same over a wired interface with 1500 byte MTU. The GRE itself takes 4 bytes, and the outer IPv4 header takes 20 bytes, or 40 bytes in case of IPv6, the MTU of the GRE should be reduced to 1476 and 1456 respectively. On both sides of the tunnel, I bridge the GRE interface to a physical network, to merge the 2 Layer-2 networks on both ends of the tunnel together.
Here comes the issue: all devices and interfaces on the 2 Layer-2 networks use default MTU of 1500 bytes. From the technical perspective, all Ethernet frames with payload exceeding the MTU won't go through the tunnel -- they will be dropped instead. From the end-user perspective, the problem is obvious and takes effect immediately as network services on the other side of the tunnel are reported as online but are not responding to requests.
Note that there is no Layer-3 involved, so no MSS clamping nor Path MTU Discovery here. Manually reducing the MTU of all hosts on the 2 networks is not an option. Is there any elegant solution for this?
I thought of setting the GRE tunnel MTU to 1500 bytes regardless of the physical interface MTU. The tunnel traffic over the physical interface is routed at Layer-3 (not switched at Layer-2), meaning it can be fragmented, but I do not know if it will work and at what kind of performance. I am also not sure about what will happen if the outer IPv4 packet header exceeds the default 20 bytes, or the outer IPv6 header exceeds the default 40 bytes.