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 | |