|
@@ -1000,37 +1000,29 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
|
|
struct ieee80211_local *local = sdata->local;
|
|
|
struct sk_buff *skb;
|
|
|
struct ieee80211_mgmt *mgmt;
|
|
|
- u8 *pos;
|
|
|
-
|
|
|
- skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt) + 200 +
|
|
|
- ie_len);
|
|
|
- if (!skb) {
|
|
|
- printk(KERN_DEBUG "%s: failed to allocate buffer for probe "
|
|
|
- "request\n", sdata->name);
|
|
|
+ size_t buf_len;
|
|
|
+ u8 *buf;
|
|
|
+
|
|
|
+ /* FIXME: come up with a proper value */
|
|
|
+ buf = kmalloc(200 + ie_len, GFP_KERNEL);
|
|
|
+ if (!buf) {
|
|
|
+ printk(KERN_DEBUG "%s: failed to allocate temporary IE "
|
|
|
+ "buffer\n", sdata->name);
|
|
|
return;
|
|
|
}
|
|
|
- skb_reserve(skb, local->hw.extra_tx_headroom);
|
|
|
|
|
|
- mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
|
|
|
- memset(mgmt, 0, 24);
|
|
|
- mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
|
|
- IEEE80211_STYPE_PROBE_REQ);
|
|
|
- memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
|
|
|
+ buf_len = ieee80211_build_preq_ies(local, buf, ie, ie_len,
|
|
|
+ local->hw.conf.channel->band);
|
|
|
+
|
|
|
+ skb = ieee80211_probereq_get(&local->hw, &sdata->vif,
|
|
|
+ ssid, ssid_len,
|
|
|
+ buf, buf_len);
|
|
|
+
|
|
|
if (dst) {
|
|
|
+ mgmt = (struct ieee80211_mgmt *) skb->data;
|
|
|
memcpy(mgmt->da, dst, ETH_ALEN);
|
|
|
memcpy(mgmt->bssid, dst, ETH_ALEN);
|
|
|
- } else {
|
|
|
- memset(mgmt->da, 0xff, ETH_ALEN);
|
|
|
- memset(mgmt->bssid, 0xff, ETH_ALEN);
|
|
|
}
|
|
|
- pos = skb_put(skb, 2 + ssid_len);
|
|
|
- *pos++ = WLAN_EID_SSID;
|
|
|
- *pos++ = ssid_len;
|
|
|
- memcpy(pos, ssid, ssid_len);
|
|
|
- pos += ssid_len;
|
|
|
-
|
|
|
- skb_put(skb, ieee80211_build_preq_ies(local, pos, ie, ie_len,
|
|
|
- local->hw.conf.channel->band));
|
|
|
|
|
|
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
|
|
ieee80211_tx_skb(sdata, skb);
|