Index: sys/net/if_vxlan.c =================================================================== --- sys/net/if_vxlan.c +++ sys/net/if_vxlan.c @@ -84,6 +84,11 @@ int vxlsomc_users; }; +/* + * The maximum supported Ethernet length and some space for encapsulation. + */ +#define VXLAN_MAX_MTU 65435 + #define VXLAN_SO_MC_MAX_GROUPS 32 #define VXLAN_SO_VNI_HASH_SHIFT 6 @@ -2247,10 +2252,11 @@ ifr = (struct ifreq *) data; ifd = (struct ifdrv *) data; + error = 0; + switch (cmd) { case SIOCADDMULTI: case SIOCDELMULTI: - error = 0; break; case SIOCGDRVSPEC: @@ -2267,6 +2273,13 @@ error = ifmedia_ioctl(ifp, ifr, &sc->vxl_media, cmd); break; + case SIOCSIFMTU: + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > VXLAN_MAX_MTU) + error = EINVAL; + else + ifp->if_mtu = ifr->ifr_mtu; + break; + default: error = ether_ioctl(ifp, cmd, data); break; @@ -2747,8 +2760,8 @@ ifp->if_ioctl = vxlan_ioctl; ifp->if_transmit = vxlan_transmit; ifp->if_qflush = vxlan_qflush; - ifp->if_capabilities |= IFCAP_LINKSTATE; - ifp->if_capenable |= IFCAP_LINKSTATE; + ifp->if_capabilities |= IFCAP_LINKSTATE | IFCAP_JUMBO_MTU; + ifp->if_capenable |= IFCAP_LINKSTATE | IFCAP_JUMBO_MTU; ifmedia_init(&sc->vxl_media, 0, vxlan_media_change, vxlan_media_status); ifmedia_add(&sc->vxl_media, IFM_ETHER | IFM_AUTO, 0, NULL);