Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70692ad2 authored by Jouni Malinen's avatar Jouni Malinen Committed by John W. Linville
Browse files

nl80211: Optional IEs into scan request



This extends the NL80211_CMD_TRIGGER_SCAN command to allow applications
to specify a set of information element(s) to be added into Probe
Request frames with NL80211_ATTR_IE. This provides support for the
MLME-SCAN.request primitive parameter VendorSpecificInfo and can be
used, e.g., to implement WPS scanning.

Signed-off-by: default avatarJouni Malinen <jouni.malinen@atheros.com>
Acked-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 83befbde
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -525,6 +525,8 @@ struct cfg80211_ssid {
 * @n_ssids: number of SSIDs
 * @channels: channels to scan on.
 * @n_channels: number of channels for each band
 * @ie: optional information element(s) to add into Probe Request or %NULL
 * @ie_len: length of ie in octets
 * @wiphy: the wiphy this was for
 * @ifidx: the interface index
 */
@@ -533,6 +535,8 @@ struct cfg80211_scan_request {
	int n_ssids;
	struct ieee80211_channel **channels;
	u32 n_channels;
	u8 *ie;
	size_t ie_len;

	/* internal */
	struct wiphy *wiphy;
+2 −1
Original line number Diff line number Diff line
@@ -1093,7 +1093,8 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
			 u8 *extra, size_t extra_len,
			 const u8 *bssid, int encrypt);
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
			      u8 *ssid, size_t ssid_len);
			      u8 *ssid, size_t ssid_len,
			      u8 *ie, size_t ie_len);

void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
				  const size_t supp_rates_len,
+5 −3
Original line number Diff line number Diff line
@@ -716,7 +716,7 @@ static void ieee80211_direct_probe(struct ieee80211_sub_if_data *sdata)
	 * will not answer to direct packet in unassociated state.
	 */
	ieee80211_send_probe_req(sdata, NULL,
				 ifmgd->ssid, ifmgd->ssid_len);
				 ifmgd->ssid, ifmgd->ssid_len, NULL, 0);

	mod_timer(&ifmgd->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
}
@@ -946,7 +946,8 @@ static void ieee80211_associated(struct ieee80211_sub_if_data *sdata)
			} else
				ieee80211_send_probe_req(sdata, ifmgd->bssid,
							 ifmgd->ssid,
							 ifmgd->ssid_len);
							 ifmgd->ssid_len,
							 NULL, 0);
			ifmgd->flags ^= IEEE80211_STA_PROBEREQ_POLL;
		} else {
			ifmgd->flags &= ~IEEE80211_STA_PROBEREQ_POLL;
@@ -955,7 +956,8 @@ static void ieee80211_associated(struct ieee80211_sub_if_data *sdata)
				ifmgd->last_probe = jiffies;
				ieee80211_send_probe_req(sdata, ifmgd->bssid,
							 ifmgd->ssid,
							 ifmgd->ssid_len);
							 ifmgd->ssid_len,
							 NULL, 0);
			}
		}
	}
+2 −1
Original line number Diff line number Diff line
@@ -338,7 +338,8 @@ void ieee80211_scan_work(struct work_struct *work)
			ieee80211_send_probe_req(
				sdata, NULL,
				local->scan_req->ssids[i].ssid,
				local->scan_req->ssids[i].ssid_len);
				local->scan_req->ssids[i].ssid_len,
				local->scan_req->ie, local->scan_req->ie_len);
		next_delay = IEEE80211_CHANNEL_TIME;
		break;
	}
+5 −2
Original line number Diff line number Diff line
@@ -884,7 +884,8 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
}

void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
			      u8 *ssid, size_t ssid_len)
			      u8 *ssid, size_t ssid_len,
			      u8 *ie, size_t ie_len)
{
	struct ieee80211_local *local = sdata->local;
	struct ieee80211_supported_band *sband;
@@ -903,7 +904,7 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
	}

	skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt) + 200 +
			    extra_preq_ie_len);
			    ie_len + extra_preq_ie_len);
	if (!skb) {
		printk(KERN_DEBUG "%s: failed to allocate buffer for probe "
		       "request\n", sdata->dev->name);
@@ -950,6 +951,8 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
		*pos = rate->bitrate / 5;
	}

	if (ie)
		memcpy(skb_put(skb, ie_len), ie, ie_len);
	if (extra_preq_ie)
		memcpy(skb_put(skb, extra_preq_ie_len), extra_preq_ie,
		       extra_preq_ie_len);
Loading