enum { WG_NETDEV_FEATURES = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
                                    NETIF_F_SG | NETIF_F_GSO |
                                    NETIF_F_GSO_SOFTWARE | NETIF_F_HIGHDMA };
+       const int overhead = MESSAGE_MINIMUM_LENGTH + sizeof(struct udphdr) +
+                            max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
 
        dev->netdev_ops = &netdev_ops;
        dev->hard_header_len = 0;
        dev->features |= WG_NETDEV_FEATURES;
        dev->hw_features |= WG_NETDEV_FEATURES;
        dev->hw_enc_features |= WG_NETDEV_FEATURES;
-       dev->mtu = ETH_DATA_LEN - MESSAGE_MINIMUM_LENGTH -
-                  sizeof(struct udphdr) -
-                  max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
+       dev->mtu = ETH_DATA_LEN - overhead;
+       dev->max_mtu = round_down(INT_MAX, MESSAGE_PADDING_MULTIPLE) - overhead;
 
        SET_NETDEV_DEVTYPE(dev, &device_type);
 
 
 
 static unsigned int calculate_skb_padding(struct sk_buff *skb)
 {
+       unsigned int padded_size, last_unit = skb->len;
+
+       if (unlikely(!PACKET_CB(skb)->mtu))
+               return ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE) - last_unit;
+
        /* We do this modulo business with the MTU, just in case the networking
         * layer gives us a packet that's bigger than the MTU. In that case, we
         * wouldn't want the final subtraction to overflow in the case of the
-        * padded_size being clamped.
+        * padded_size being clamped. Fortunately, that's very rarely the case,
+        * so we optimize for that not happening.
         */
-       unsigned int last_unit = skb->len % PACKET_CB(skb)->mtu;
-       unsigned int padded_size = ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE);
+       if (unlikely(last_unit > PACKET_CB(skb)->mtu))
+               last_unit %= PACKET_CB(skb)->mtu;
 
-       if (padded_size > PACKET_CB(skb)->mtu)
-               padded_size = PACKET_CB(skb)->mtu;
+       padded_size = min(PACKET_CB(skb)->mtu,
+                         ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE));
        return padded_size - last_unit;
 }