Fix the Max MTU calculations. Do not take headers in to account, only MAX MSDU size as per 802.11-2012(8.2.3) is enough. ToDo: Add support for AMSDU in future. Signed-off-by: T Krishna Chaitanya <chaitanyatk@xxxxxxxxxxx> --- net/mac80211/iface.c | 23 ++++++++++++++++------- 1 files changed, 16 insertions(+), 7 deletions(-) diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 54fb7f9..5e5e876 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -207,15 +207,24 @@ void ieee80211_recalc_idle(struct ieee80211_local *local) static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) { - int meshhdrlen; - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); - - meshhdrlen = (sdata->vif.type == NL80211_IFTYPE_MESH_POINT) ? 5 : 0; + /* 802.11-2012: 8.2.3: The maximum frame body size is determined by + 1. The maximum MSDU size (2304 octets), + 2. plus the length of the Mesh Control field (6, 12, or 18 octets) + if present, + 3. the maximum unencrypted MMPDU size excluding the MAC header and + FCS (2304 octets) or + 4. the maximum A- MSDU size (3839 or 7935 octets), + plus any overhead from security encapsulation. + Note1: IEEE80211_MAX_DATA_LEN doesnt include any headers (2304), + so it can be used directly+ Mesh HDR Len + Note2: In Other places (skb_alloc) its handled properly. + + ToDO: Make the MAX_DATA_LEN driver configurable through its + AMSDU capabilities. + */ - /* FIX: what would be proper limits for MTU? - * This interface uses 802.3 frames. */ if (new_mtu < 256 || - new_mtu > IEEE80211_MAX_DATA_LEN - 24 - 6 - meshhdrlen) { + new_mtu > IEEE80211_MAX_DATA_LEN) { return -EINVAL; } -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html