Merge "cfg80211: Define macro to indicate support for new cfg80211 connect api"
This commit is contained in:
commit
3347316df9
|
@ -137,6 +137,7 @@
|
|||
!Finclude/net/cfg80211.h __cfg80211_send_disassoc
|
||||
!Finclude/net/cfg80211.h cfg80211_ibss_joined
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_result
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_bss
|
||||
!Finclude/net/cfg80211.h cfg80211_roamed
|
||||
!Finclude/net/cfg80211.h cfg80211_disconnected
|
||||
!Finclude/net/cfg80211.h cfg80211_ready_on_channel
|
||||
|
|
|
@ -64,6 +64,9 @@ struct wiphy;
|
|||
#define TDLS_MGMT_VERSION2 1
|
||||
#define CFG80211_DEL_STA_V2 1
|
||||
#define CFG80211_BSSID_HINT_BACKPORT 1
|
||||
#define CFG80211_SCAN_BSSID 1
|
||||
#define CFG80211_CONNECT_PREV_BSSID 1
|
||||
#define CFG80211_CONNECT_BSS 1
|
||||
|
||||
/*
|
||||
* wireless hardware capability structures
|
||||
|
@ -1281,6 +1284,7 @@ struct cfg80211_ssid {
|
|||
* @wdev: the wireless device to scan for
|
||||
* @aborted: (internal) scan request was notified as aborted
|
||||
* @no_cck: used to send probe requests at non CCK rate in 2GHz band
|
||||
* @bssid: BSSID to scan for (most commonly, the wildcard BSSID)
|
||||
*/
|
||||
struct cfg80211_scan_request {
|
||||
struct cfg80211_ssid *ssids;
|
||||
|
@ -1294,6 +1298,8 @@ struct cfg80211_scan_request {
|
|||
|
||||
struct wireless_dev *wdev;
|
||||
|
||||
u8 bssid[ETH_ALEN] __aligned(2);
|
||||
|
||||
/* internal */
|
||||
struct wiphy *wiphy;
|
||||
unsigned long scan_start;
|
||||
|
@ -1634,6 +1640,7 @@ struct cfg80211_ibss_params {
|
|||
* @ht_capa_mask: The bits of ht_capa which are to be used.
|
||||
* @vht_capa: VHT Capability overrides
|
||||
* @vht_capa_mask: The bits of vht_capa which are to be used.
|
||||
* @prev_bssid: previous BSSID, if not %NULL use reassociate frame
|
||||
*/
|
||||
struct cfg80211_connect_params {
|
||||
struct ieee80211_channel *channel;
|
||||
|
@ -1656,6 +1663,7 @@ struct cfg80211_connect_params {
|
|||
struct ieee80211_ht_cap ht_capa_mask;
|
||||
struct ieee80211_vht_cap vht_capa;
|
||||
struct ieee80211_vht_cap vht_capa_mask;
|
||||
const u8 *prev_bssid;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -4012,6 +4020,32 @@ static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
|
|||
#define CFG80211_TESTMODE_DUMP(cmd)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* cfg80211_connect_bss - notify cfg80211 of connection result
|
||||
*
|
||||
* @dev: network device
|
||||
* @bssid: the BSSID of the AP
|
||||
* @bss: entry of bss to which STA got connected to, can be obtained
|
||||
* through cfg80211_get_bss (may be %NULL)
|
||||
* @req_ie: association request IEs (maybe be %NULL)
|
||||
* @req_ie_len: association request IEs length
|
||||
* @resp_ie: association response IEs (may be %NULL)
|
||||
* @resp_ie_len: assoc response IEs length
|
||||
* @status: status code, 0 for successful connection, use
|
||||
* %WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
|
||||
* the real status code for failures.
|
||||
* @gfp: allocation flags
|
||||
*
|
||||
* It should be called by the underlying driver whenever connect() has
|
||||
* succeeded. This is similar to cfg80211_connect_result(), but with the
|
||||
* option of identifying the exact bss entry for the connection. Only one of
|
||||
* these functions should be called.
|
||||
*/
|
||||
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
||||
struct cfg80211_bss *bss, const u8 *req_ie,
|
||||
size_t req_ie_len, const u8 *resp_ie,
|
||||
size_t resp_ie_len, u16 status, gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_connect_result - notify cfg80211 of connection result
|
||||
*
|
||||
|
@ -4029,10 +4063,15 @@ static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
|
|||
* It should be called by the underlying driver whenever connect() has
|
||||
* succeeded.
|
||||
*/
|
||||
void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||
const u8 *req_ie, size_t req_ie_len,
|
||||
const u8 *resp_ie, size_t resp_ie_len,
|
||||
u16 status, gfp_t gfp);
|
||||
static inline void
|
||||
cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||
const u8 *req_ie, size_t req_ie_len,
|
||||
const u8 *resp_ie, size_t resp_ie_len,
|
||||
u16 status, gfp_t gfp)
|
||||
{
|
||||
cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, resp_ie,
|
||||
resp_ie_len, status, gfp);
|
||||
}
|
||||
|
||||
/**
|
||||
* cfg80211_roamed - notify cfg80211 of roaming
|
||||
|
|
|
@ -263,7 +263,9 @@
|
|||
* @NL80211_CMD_GET_SCAN: get scan results
|
||||
* @NL80211_CMD_TRIGGER_SCAN: trigger a new scan with the given parameters
|
||||
* %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the
|
||||
* probe requests at CCK rate or not.
|
||||
* probe requests at CCK rate or not. %NL80211_ATTR_MAC can be used to
|
||||
* specify a BSSID to scan for; if not included, the wildcard BSSID will
|
||||
* be used.
|
||||
* @NL80211_CMD_NEW_SCAN_RESULTS: scan notification (as a reply to
|
||||
* NL80211_CMD_GET_SCAN and on the "scan" multicast group)
|
||||
* @NL80211_CMD_SCAN_ABORTED: scan was aborted, for unspecified reasons,
|
||||
|
|
|
@ -223,6 +223,7 @@ struct cfg80211_event {
|
|||
const u8 *resp_ie;
|
||||
size_t req_ie_len;
|
||||
size_t resp_ie_len;
|
||||
struct cfg80211_bss *bss;
|
||||
u16 status;
|
||||
} cr;
|
||||
struct {
|
||||
|
|
|
@ -5426,6 +5426,12 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
|||
request->no_cck =
|
||||
nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_MAC])
|
||||
memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
|
||||
ETH_ALEN);
|
||||
else
|
||||
eth_broadcast_addr(request->bssid);
|
||||
|
||||
request->wdev = wdev;
|
||||
request->wiphy = &rdev->wiphy;
|
||||
request->scan_start = jiffies;
|
||||
|
@ -6943,6 +6949,10 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
|||
connect.mfp = NL80211_MFP_NO;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_PREV_BSSID])
|
||||
connect.prev_bssid =
|
||||
nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
||||
connect.channel =
|
||||
ieee80211_get_channel(wiphy,
|
||||
|
|
|
@ -1159,6 +1159,8 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
|||
if (wiphy->bands[i])
|
||||
creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
|
||||
|
||||
eth_broadcast_addr(creq->bssid);
|
||||
|
||||
rdev->scan_req = creq;
|
||||
err = rdev_scan(rdev, creq);
|
||||
if (err) {
|
||||
|
|
|
@ -172,6 +172,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
|
|||
wdev->conn->params.ssid_len);
|
||||
request->ssids[0].ssid_len = wdev->conn->params.ssid_len;
|
||||
|
||||
eth_broadcast_addr(request->bssid);
|
||||
|
||||
request->wdev = wdev;
|
||||
request->wiphy = &rdev->wiphy;
|
||||
request->scan_start = jiffies;
|
||||
|
@ -567,10 +569,11 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
|||
kfree(country_ie);
|
||||
}
|
||||
|
||||
void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||
const u8 *req_ie, size_t req_ie_len,
|
||||
const u8 *resp_ie, size_t resp_ie_len,
|
||||
u16 status, gfp_t gfp)
|
||||
/* Consumes bss object one way or another */
|
||||
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
||||
struct cfg80211_bss *bss, const u8 *req_ie,
|
||||
size_t req_ie_len, const u8 *resp_ie,
|
||||
size_t resp_ie_len, u16 status, gfp_t gfp)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
|
||||
|
@ -578,10 +581,21 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
|||
unsigned long flags;
|
||||
|
||||
CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTING);
|
||||
if (bss) {
|
||||
/* Make sure the bss entry provided by the driver is valid. */
|
||||
struct cfg80211_internal_bss *ibss = bss_from_pub(bss);
|
||||
|
||||
if (WARN_ON(list_empty(&ibss->list))) {
|
||||
cfg80211_put_bss(wdev->wiphy, bss);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp);
|
||||
if (!ev)
|
||||
if (!ev) {
|
||||
cfg80211_put_bss(wdev->wiphy, bss);
|
||||
return;
|
||||
}
|
||||
|
||||
ev->type = EVENT_CONNECT_RESULT;
|
||||
if (bssid)
|
||||
|
@ -596,6 +610,9 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
|||
ev->cr.resp_ie_len = resp_ie_len;
|
||||
memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len);
|
||||
}
|
||||
if (bss)
|
||||
cfg80211_hold_bss(bss_from_pub(bss));
|
||||
ev->cr.bss = bss;
|
||||
ev->cr.status = status;
|
||||
|
||||
spin_lock_irqsave(&wdev->event_lock, flags);
|
||||
|
@ -603,7 +620,7 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
|||
spin_unlock_irqrestore(&wdev->event_lock, flags);
|
||||
queue_work(cfg80211_wq, &rdev->event_work);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_connect_result);
|
||||
EXPORT_SYMBOL(cfg80211_connect_bss);
|
||||
|
||||
void __cfg80211_roamed(struct wireless_dev *wdev,
|
||||
struct cfg80211_bss *bss,
|
||||
|
|
|
@ -1176,6 +1176,7 @@ TRACE_EVENT(rdev_connect,
|
|||
__field(bool, privacy)
|
||||
__field(u32, wpa_versions)
|
||||
__field(u32, flags)
|
||||
MAC_ENTRY(prev_bssid)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
|
@ -1187,13 +1188,14 @@ TRACE_EVENT(rdev_connect,
|
|||
__entry->privacy = sme->privacy;
|
||||
__entry->wpa_versions = sme->crypto.wpa_versions;
|
||||
__entry->flags = sme->flags;
|
||||
MAC_ASSIGN(prev_bssid, sme->prev_bssid);
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", bssid: " MAC_PR_FMT
|
||||
", ssid: %s, auth type: %d, privacy: %s, wpa versions: %u, "
|
||||
"flags: %u",
|
||||
"flags: %u, previous bssid: " MAC_PR_FMT,
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, MAC_PR_ARG(bssid), __entry->ssid,
|
||||
__entry->auth_type, BOOL_TO_STR(__entry->privacy),
|
||||
__entry->wpa_versions, __entry->flags)
|
||||
__entry->wpa_versions, __entry->flags, MAC_PR_ARG(prev_bssid))
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_cqm_rssi_config,
|
||||
|
|
|
@ -775,7 +775,7 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev)
|
|||
ev->cr.resp_ie, ev->cr.resp_ie_len,
|
||||
ev->cr.status,
|
||||
ev->cr.status == WLAN_STATUS_SUCCESS,
|
||||
NULL);
|
||||
ev->cr.bss);
|
||||
break;
|
||||
case EVENT_ROAMED:
|
||||
__cfg80211_roamed(wdev, ev->rm.bss, ev->rm.req_ie,
|
||||
|
|
Loading…
Reference in New Issue