-void clamp_mss(node_t *source, node_t *via, vpn_packet_t *packet) {
- int i;
- int len = ((packet->data[46] >> 4) - 5) * 4;
+static void clamp_mss(const node_t *source, const node_t *via, vpn_packet_t *packet) {
+ if(!source || !via || !(via->options & OPTION_CLAMP_MSS))
+ return;
+
+ uint16_t mtu = source->mtu;
+ if(via != myself && via->mtu < mtu)
+ mtu = via->mtu;
+
+ /* Find TCP header */
+ int start = 0;
+ uint16_t type = packet->data[12] << 8 | packet->data[13];
+
+ if(type == ETH_P_IP && packet->data[23] == 6)
+ start = 14 + (packet->data[14] & 0xf) * 4;
+ else if(type == ETH_P_IPV6 && packet->data[20] == 6)
+ start = 14 + 40;
+
+ if(!start || packet->len <= start + 20)
+ return;