diff options
| author | Javier Cardona <javier@cozybit.com> | 2012-01-17 21:17:46 -0500 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2012-01-18 14:38:06 -0500 |
| commit | 65e8b0ccb6cf176f8eddb1b05534be46580da9dd (patch) | |
| tree | 873c06bd136f80dc2a57a06e086d6934c0daab9c | |
| parent | f96b08a7e6f69c0f0a576554df3df5b1b519c479 (diff) | |
mac80211: Use the right headroom size for mesh mgmt frames
Use local->tx_headroom instad of local->hw.extra_tx_headroom.
local->tx_headroom is the max of hw.extra_tx_headroom required by the
driver and the headroom required by mac80211 for status reporting. On
drivers where hw.extra_tx_headroom is smaller than what mac80211
requires (e.g. ath5k), we would not reserve sufficient buffer space to
report tx status.
Also, don't reserve local->tx_headroom + local->hw.extra_tx_headroom.
Reported-by: Simon Morgenthaler <s.morgenthaler@students.unibe.ch>
Reported-by: Kai Scharwies <kai@scharwies.de>
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | net/mac80211/mesh_hwmp.c | 8 | ||||
| -rw-r--r-- | net/mac80211/mesh_plink.c | 4 |
2 files changed, 6 insertions, 6 deletions
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 73abb7524b2c..54df1b2bafd2 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
| @@ -119,12 +119,12 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags, | |||
| 119 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) + | 119 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) + |
| 120 | sizeof(mgmt->u.action.u.mesh_action); | 120 | sizeof(mgmt->u.action.u.mesh_action); |
| 121 | 121 | ||
| 122 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 122 | skb = dev_alloc_skb(local->tx_headroom + |
| 123 | hdr_len + | 123 | hdr_len + |
| 124 | 2 + 37); /* max HWMP IE */ | 124 | 2 + 37); /* max HWMP IE */ |
| 125 | if (!skb) | 125 | if (!skb) |
| 126 | return -1; | 126 | return -1; |
| 127 | skb_reserve(skb, local->hw.extra_tx_headroom); | 127 | skb_reserve(skb, local->tx_headroom); |
| 128 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 128 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
| 129 | memset(mgmt, 0, hdr_len); | 129 | memset(mgmt, 0, hdr_len); |
| 130 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 130 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
| @@ -250,12 +250,12 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn, | |||
| 250 | if (time_before(jiffies, ifmsh->next_perr)) | 250 | if (time_before(jiffies, ifmsh->next_perr)) |
| 251 | return -EAGAIN; | 251 | return -EAGAIN; |
| 252 | 252 | ||
| 253 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 253 | skb = dev_alloc_skb(local->tx_headroom + |
| 254 | hdr_len + | 254 | hdr_len + |
| 255 | 2 + 15 /* PERR IE */); | 255 | 2 + 15 /* PERR IE */); |
| 256 | if (!skb) | 256 | if (!skb) |
| 257 | return -1; | 257 | return -1; |
| 258 | skb_reserve(skb, local->tx_headroom + local->hw.extra_tx_headroom); | 258 | skb_reserve(skb, local->tx_headroom); |
| 259 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 259 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
| 260 | memset(mgmt, 0, hdr_len); | 260 | memset(mgmt, 0, hdr_len); |
| 261 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 261 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index 41ef1b476442..a17251730b9e 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c | |||
| @@ -172,7 +172,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
| 172 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + | 172 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + |
| 173 | sizeof(mgmt->u.action.u.self_prot); | 173 | sizeof(mgmt->u.action.u.self_prot); |
| 174 | 174 | ||
| 175 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 175 | skb = dev_alloc_skb(local->tx_headroom + |
| 176 | hdr_len + | 176 | hdr_len + |
| 177 | 2 + /* capability info */ | 177 | 2 + /* capability info */ |
| 178 | 2 + /* AID */ | 178 | 2 + /* AID */ |
| @@ -186,7 +186,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
| 186 | sdata->u.mesh.ie_len); | 186 | sdata->u.mesh.ie_len); |
| 187 | if (!skb) | 187 | if (!skb) |
| 188 | return -1; | 188 | return -1; |
| 189 | skb_reserve(skb, local->hw.extra_tx_headroom); | 189 | skb_reserve(skb, local->tx_headroom); |
| 190 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 190 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
| 191 | memset(mgmt, 0, hdr_len); | 191 | memset(mgmt, 0, hdr_len); |
| 192 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 192 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
