Merge "msm: wlan: Define CFG80211_CONNECT_TIMEOUT_REASON_CODE"
This commit is contained in:
commit
4c2c203412
9 changed files with 131 additions and 29 deletions
|
@ -137,6 +137,7 @@
|
||||||
!Finclude/net/cfg80211.h cfg80211_ibss_joined
|
!Finclude/net/cfg80211.h cfg80211_ibss_joined
|
||||||
!Finclude/net/cfg80211.h cfg80211_connect_result
|
!Finclude/net/cfg80211.h cfg80211_connect_result
|
||||||
!Finclude/net/cfg80211.h cfg80211_connect_bss
|
!Finclude/net/cfg80211.h cfg80211_connect_bss
|
||||||
|
!Finclude/net/cfg80211.h cfg80211_connect_timeout
|
||||||
!Finclude/net/cfg80211.h cfg80211_roamed
|
!Finclude/net/cfg80211.h cfg80211_roamed
|
||||||
!Finclude/net/cfg80211.h cfg80211_disconnected
|
!Finclude/net/cfg80211.h cfg80211_disconnected
|
||||||
!Finclude/net/cfg80211.h cfg80211_ready_on_channel
|
!Finclude/net/cfg80211.h cfg80211_ready_on_channel
|
||||||
|
|
|
@ -71,6 +71,8 @@ struct wiphy;
|
||||||
#define CFG80211_BEACON_TX_RATE_CUSTOM_BACKPORT 1
|
#define CFG80211_BEACON_TX_RATE_CUSTOM_BACKPORT 1
|
||||||
#define CFG80211_RAND_TA_FOR_PUBLIC_ACTION_FRAME 1
|
#define CFG80211_RAND_TA_FOR_PUBLIC_ACTION_FRAME 1
|
||||||
#define CFG80211_REPORT_BETTER_BSS_IN_SCHED_SCAN 1
|
#define CFG80211_REPORT_BETTER_BSS_IN_SCHED_SCAN 1
|
||||||
|
#define CFG80211_CONNECT_TIMEOUT 1
|
||||||
|
#define CFG80211_CONNECT_TIMEOUT_REASON_CODE 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wireless hardware capability structures
|
* wireless hardware capability structures
|
||||||
|
@ -2437,9 +2439,23 @@ struct cfg80211_qos_map {
|
||||||
* (invoked with the wireless_dev mutex held)
|
* (invoked with the wireless_dev mutex held)
|
||||||
*
|
*
|
||||||
* @connect: Connect to the ESS with the specified parameters. When connected,
|
* @connect: Connect to the ESS with the specified parameters. When connected,
|
||||||
* call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS.
|
* call cfg80211_connect_result()/cfg80211_connect_bss() with status code
|
||||||
* If the connection fails for some reason, call cfg80211_connect_result()
|
* %WLAN_STATUS_SUCCESS. If the connection fails for some reason, call
|
||||||
* with the status from the AP.
|
* cfg80211_connect_result()/cfg80211_connect_bss() with the status code
|
||||||
|
* from the AP or cfg80211_connect_timeout() if no frame with status code
|
||||||
|
* was received.
|
||||||
|
* The driver is allowed to roam to other BSSes within the ESS when the
|
||||||
|
* other BSS matches the connect parameters. When such roaming is initiated
|
||||||
|
* by the driver, the driver is expected to verify that the target matches
|
||||||
|
* the configured security parameters and to use Reassociation Request
|
||||||
|
* frame instead of Association Request frame.
|
||||||
|
* The connect function can also be used to request the driver to perform a
|
||||||
|
* specific roam when connected to an ESS. In that case, the prev_bssid
|
||||||
|
* parameter is set to the BSSID of the currently associated BSS as an
|
||||||
|
* indication of requesting reassociation.
|
||||||
|
* In both the driver-initiated and new connect() call initiated roaming
|
||||||
|
* cases, the result of roaming is indicated with a call to
|
||||||
|
* cfg80211_roamed() or cfg80211_roamed_bss().
|
||||||
* (invoked with the wireless_dev mutex held)
|
* (invoked with the wireless_dev mutex held)
|
||||||
* @update_connect_params: Update the connect parameters while connected to a
|
* @update_connect_params: Update the connect parameters while connected to a
|
||||||
* BSS. The updated parameters can be used by driver/firmware for
|
* BSS. The updated parameters can be used by driver/firmware for
|
||||||
|
@ -4804,6 +4820,12 @@ static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
|
||||||
* %WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
|
* %WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
|
||||||
* the real status code for failures.
|
* the real status code for failures.
|
||||||
* @gfp: allocation flags
|
* @gfp: allocation flags
|
||||||
|
* @timeout_reason: reason for connection timeout. This is used when the
|
||||||
|
* connection fails due to a timeout instead of an explicit rejection from
|
||||||
|
* the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is
|
||||||
|
* not known. This value is used only if @status < 0 to indicate that the
|
||||||
|
* failure is due to a timeout and not due to explicit rejection by the AP.
|
||||||
|
* This value is ignored in other cases (@status >= 0).
|
||||||
*
|
*
|
||||||
* It should be called by the underlying driver whenever connect() has
|
* It should be called by the underlying driver whenever connect() has
|
||||||
* succeeded. This is similar to cfg80211_connect_result(), but with the
|
* succeeded. This is similar to cfg80211_connect_result(), but with the
|
||||||
|
@ -4813,7 +4835,8 @@ static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
|
||||||
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
||||||
struct cfg80211_bss *bss, const u8 *req_ie,
|
struct cfg80211_bss *bss, const u8 *req_ie,
|
||||||
size_t req_ie_len, const u8 *resp_ie,
|
size_t req_ie_len, const u8 *resp_ie,
|
||||||
size_t resp_ie_len, u16 status, gfp_t gfp);
|
size_t resp_ie_len, int status, gfp_t gfp,
|
||||||
|
enum nl80211_timeout_reason timeout_reason);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cfg80211_connect_result - notify cfg80211 of connection result
|
* cfg80211_connect_result - notify cfg80211 of connection result
|
||||||
|
@ -4839,7 +4862,33 @@ cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||||
u16 status, gfp_t gfp)
|
u16 status, gfp_t gfp)
|
||||||
{
|
{
|
||||||
cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, resp_ie,
|
cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, resp_ie,
|
||||||
resp_ie_len, status, gfp);
|
resp_ie_len, status, gfp,
|
||||||
|
NL80211_TIMEOUT_UNSPECIFIED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cfg80211_connect_timeout - notify cfg80211 of connection timeout
|
||||||
|
*
|
||||||
|
* @dev: network device
|
||||||
|
* @bssid: the BSSID of the AP
|
||||||
|
* @req_ie: association request IEs (maybe be %NULL)
|
||||||
|
* @req_ie_len: association request IEs length
|
||||||
|
* @gfp: allocation flags
|
||||||
|
* @timeout_reason: reason for connection timeout.
|
||||||
|
*
|
||||||
|
* It should be called by the underlying driver whenever connect() has failed
|
||||||
|
* in a sequence where no explicit authentication/association rejection was
|
||||||
|
* received from the AP. This could happen, e.g., due to not being able to send
|
||||||
|
* out the Authentication or Association Request frame or timing out while
|
||||||
|
* waiting for the response.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid,
|
||||||
|
const u8 *req_ie, size_t req_ie_len, gfp_t gfp,
|
||||||
|
enum nl80211_timeout_reason timeout_reason)
|
||||||
|
{
|
||||||
|
cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, NULL, 0, -1,
|
||||||
|
gfp, timeout_reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -486,7 +486,12 @@
|
||||||
* This attribute is ignored if driver does not support roam scan.
|
* This attribute is ignored if driver does not support roam scan.
|
||||||
* It is also sent as an event, with the BSSID and response IEs when the
|
* It is also sent as an event, with the BSSID and response IEs when the
|
||||||
* connection is established or failed to be established. This can be
|
* connection is established or failed to be established. This can be
|
||||||
* determined by the STATUS_CODE attribute.
|
* determined by the %NL80211_ATTR_STATUS_CODE attribute (0 = success,
|
||||||
|
* non-zero = failure). If %NL80211_ATTR_TIMED_OUT is included in the
|
||||||
|
* event, the connection attempt failed due to not being able to initiate
|
||||||
|
* authentication/association or not receiving a response from the AP.
|
||||||
|
* Non-zero %NL80211_ATTR_STATUS_CODE value is indicated in that case as
|
||||||
|
* well to remain backwards compatible.
|
||||||
* @NL80211_CMD_ROAM: request that the card roam (currently not implemented),
|
* @NL80211_CMD_ROAM: request that the card roam (currently not implemented),
|
||||||
* sent as an event when the card/driver roamed by itself.
|
* sent as an event when the card/driver roamed by itself.
|
||||||
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
||||||
|
@ -1948,6 +1953,10 @@ enum nl80211_commands {
|
||||||
* better BSSs. The attribute value is a packed structure
|
* better BSSs. The attribute value is a packed structure
|
||||||
* value as specified by &struct nl80211_bss_select_rssi_adjust.
|
* value as specified by &struct nl80211_bss_select_rssi_adjust.
|
||||||
*
|
*
|
||||||
|
* @NL80211_ATTR_TIMEOUT_REASON: The reason for which an operation timed out.
|
||||||
|
* u32 attribute with an &enum nl80211_timeout_reason value. This is used,
|
||||||
|
* e.g., with %NL80211_CMD_CONNECT event.
|
||||||
|
*
|
||||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||||
|
@ -2357,6 +2366,8 @@ enum nl80211_attrs {
|
||||||
NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
|
NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
|
||||||
NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
|
NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
|
||||||
|
|
||||||
|
NL80211_ATTR_TIMEOUT_REASON,
|
||||||
|
|
||||||
/* add attributes here, update the policy in nl80211.c */
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
|
@ -4694,6 +4705,21 @@ enum nl80211_connect_failed_reason {
|
||||||
NL80211_CONN_FAIL_BLOCKED_CLIENT,
|
NL80211_CONN_FAIL_BLOCKED_CLIENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum nl80211_timeout_reason - timeout reasons
|
||||||
|
*
|
||||||
|
* @NL80211_TIMEOUT_UNSPECIFIED: Timeout reason unspecified.
|
||||||
|
* @NL80211_TIMEOUT_SCAN: Scan (AP discovery) timed out.
|
||||||
|
* @NL80211_TIMEOUT_AUTH: Authentication timed out.
|
||||||
|
* @NL80211_TIMEOUT_ASSOC: Association timed out.
|
||||||
|
*/
|
||||||
|
enum nl80211_timeout_reason {
|
||||||
|
NL80211_TIMEOUT_UNSPECIFIED,
|
||||||
|
NL80211_TIMEOUT_SCAN,
|
||||||
|
NL80211_TIMEOUT_AUTH,
|
||||||
|
NL80211_TIMEOUT_ASSOC,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum nl80211_scan_flags - scan request control flags
|
* enum nl80211_scan_flags - scan request control flags
|
||||||
*
|
*
|
||||||
|
|
|
@ -215,7 +215,8 @@ struct cfg80211_event {
|
||||||
size_t req_ie_len;
|
size_t req_ie_len;
|
||||||
size_t resp_ie_len;
|
size_t resp_ie_len;
|
||||||
struct cfg80211_bss *bss;
|
struct cfg80211_bss *bss;
|
||||||
u16 status;
|
int status; /* -1 = failed; 0..65535 = status code */
|
||||||
|
enum nl80211_timeout_reason timeout_reason;
|
||||||
} cr;
|
} cr;
|
||||||
struct {
|
struct {
|
||||||
const u8 *req_ie;
|
const u8 *req_ie;
|
||||||
|
@ -375,8 +376,9 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
|
||||||
void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||||
const u8 *req_ie, size_t req_ie_len,
|
const u8 *req_ie, size_t req_ie_len,
|
||||||
const u8 *resp_ie, size_t resp_ie_len,
|
const u8 *resp_ie, size_t resp_ie_len,
|
||||||
u16 status, bool wextev,
|
int status, bool wextev,
|
||||||
struct cfg80211_bss *bss);
|
struct cfg80211_bss *bss,
|
||||||
|
enum nl80211_timeout_reason timeout_reason);
|
||||||
void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
|
void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
|
||||||
size_t ie_len, u16 reason, bool from_ap);
|
size_t ie_len, u16 reason, bool from_ap);
|
||||||
int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
|
int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
|
||||||
|
|
|
@ -48,7 +48,8 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
|
||||||
/* update current_bss etc., consumes the bss reference */
|
/* update current_bss etc., consumes the bss reference */
|
||||||
__cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, ie, len - ieoffs,
|
__cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, ie, len - ieoffs,
|
||||||
status_code,
|
status_code,
|
||||||
status_code == WLAN_STATUS_SUCCESS, bss);
|
status_code == WLAN_STATUS_SUCCESS, bss,
|
||||||
|
NL80211_TIMEOUT_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cfg80211_rx_assoc_resp);
|
EXPORT_SYMBOL(cfg80211_rx_assoc_resp);
|
||||||
|
|
||||||
|
|
|
@ -408,6 +408,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
||||||
[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
|
[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
|
||||||
.len = sizeof(struct nl80211_bss_select_rssi_adjust)
|
.len = sizeof(struct nl80211_bss_select_rssi_adjust)
|
||||||
},
|
},
|
||||||
|
[NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* policy for the key attributes */
|
/* policy for the key attributes */
|
||||||
|
@ -12264,7 +12265,9 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *netdev, const u8 *bssid,
|
struct net_device *netdev, const u8 *bssid,
|
||||||
const u8 *req_ie, size_t req_ie_len,
|
const u8 *req_ie, size_t req_ie_len,
|
||||||
const u8 *resp_ie, size_t resp_ie_len,
|
const u8 *resp_ie, size_t resp_ie_len,
|
||||||
u16 status, gfp_t gfp)
|
int status,
|
||||||
|
enum nl80211_timeout_reason timeout_reason,
|
||||||
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct sk_buff *msg;
|
struct sk_buff *msg;
|
||||||
void *hdr;
|
void *hdr;
|
||||||
|
@ -12282,7 +12285,12 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
|
||||||
if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
||||||
nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
|
nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
|
||||||
(bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) ||
|
(bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) ||
|
||||||
nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, status) ||
|
nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
|
||||||
|
status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
|
||||||
|
status) ||
|
||||||
|
(status < 0 &&
|
||||||
|
(nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
|
||||||
|
nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, timeout_reason))) ||
|
||||||
(req_ie &&
|
(req_ie &&
|
||||||
nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
|
nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
|
||||||
(resp_ie &&
|
(resp_ie &&
|
||||||
|
|
|
@ -55,7 +55,9 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *netdev, const u8 *bssid,
|
struct net_device *netdev, const u8 *bssid,
|
||||||
const u8 *req_ie, size_t req_ie_len,
|
const u8 *req_ie, size_t req_ie_len,
|
||||||
const u8 *resp_ie, size_t resp_ie_len,
|
const u8 *resp_ie, size_t resp_ie_len,
|
||||||
u16 status, gfp_t gfp);
|
int status,
|
||||||
|
enum nl80211_timeout_reason timeout_reason,
|
||||||
|
gfp_t gfp);
|
||||||
void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
|
void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *netdev, const u8 *bssid,
|
struct net_device *netdev, const u8 *bssid,
|
||||||
const u8 *req_ie, size_t req_ie_len,
|
const u8 *req_ie, size_t req_ie_len,
|
||||||
|
|
|
@ -34,10 +34,11 @@ struct cfg80211_conn {
|
||||||
CFG80211_CONN_SCAN_AGAIN,
|
CFG80211_CONN_SCAN_AGAIN,
|
||||||
CFG80211_CONN_AUTHENTICATE_NEXT,
|
CFG80211_CONN_AUTHENTICATE_NEXT,
|
||||||
CFG80211_CONN_AUTHENTICATING,
|
CFG80211_CONN_AUTHENTICATING,
|
||||||
CFG80211_CONN_AUTH_FAILED,
|
CFG80211_CONN_AUTH_FAILED_TIMEOUT,
|
||||||
CFG80211_CONN_ASSOCIATE_NEXT,
|
CFG80211_CONN_ASSOCIATE_NEXT,
|
||||||
CFG80211_CONN_ASSOCIATING,
|
CFG80211_CONN_ASSOCIATING,
|
||||||
CFG80211_CONN_ASSOC_FAILED,
|
CFG80211_CONN_ASSOC_FAILED,
|
||||||
|
CFG80211_CONN_ASSOC_FAILED_TIMEOUT,
|
||||||
CFG80211_CONN_DEAUTH,
|
CFG80211_CONN_DEAUTH,
|
||||||
CFG80211_CONN_CONNECTED,
|
CFG80211_CONN_CONNECTED,
|
||||||
} state;
|
} state;
|
||||||
|
@ -162,7 +163,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cfg80211_conn_do_work(struct wireless_dev *wdev)
|
static int cfg80211_conn_do_work(struct wireless_dev *wdev,
|
||||||
|
enum nl80211_timeout_reason *treason)
|
||||||
{
|
{
|
||||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||||
struct cfg80211_connect_params *params;
|
struct cfg80211_connect_params *params;
|
||||||
|
@ -193,7 +195,8 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev)
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
params->key, params->key_len,
|
params->key, params->key_len,
|
||||||
params->key_idx, NULL, 0);
|
params->key_idx, NULL, 0);
|
||||||
case CFG80211_CONN_AUTH_FAILED:
|
case CFG80211_CONN_AUTH_FAILED_TIMEOUT:
|
||||||
|
*treason = NL80211_TIMEOUT_AUTH;
|
||||||
return -ENOTCONN;
|
return -ENOTCONN;
|
||||||
case CFG80211_CONN_ASSOCIATE_NEXT:
|
case CFG80211_CONN_ASSOCIATE_NEXT:
|
||||||
if (WARN_ON(!rdev->ops->assoc))
|
if (WARN_ON(!rdev->ops->assoc))
|
||||||
|
@ -220,6 +223,9 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev)
|
||||||
WLAN_REASON_DEAUTH_LEAVING,
|
WLAN_REASON_DEAUTH_LEAVING,
|
||||||
false);
|
false);
|
||||||
return err;
|
return err;
|
||||||
|
case CFG80211_CONN_ASSOC_FAILED_TIMEOUT:
|
||||||
|
*treason = NL80211_TIMEOUT_ASSOC;
|
||||||
|
/* fall through */
|
||||||
case CFG80211_CONN_ASSOC_FAILED:
|
case CFG80211_CONN_ASSOC_FAILED:
|
||||||
cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
|
cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
|
@ -243,6 +249,7 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
container_of(work, struct cfg80211_registered_device, conn_work);
|
container_of(work, struct cfg80211_registered_device, conn_work);
|
||||||
struct wireless_dev *wdev;
|
struct wireless_dev *wdev;
|
||||||
u8 bssid_buf[ETH_ALEN], *bssid = NULL;
|
u8 bssid_buf[ETH_ALEN], *bssid = NULL;
|
||||||
|
enum nl80211_timeout_reason treason;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
||||||
|
@ -264,12 +271,12 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
|
memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
|
||||||
bssid = bssid_buf;
|
bssid = bssid_buf;
|
||||||
}
|
}
|
||||||
if (cfg80211_conn_do_work(wdev)) {
|
treason = NL80211_TIMEOUT_UNSPECIFIED;
|
||||||
|
if (cfg80211_conn_do_work(wdev, &treason)) {
|
||||||
__cfg80211_connect_result(
|
__cfg80211_connect_result(
|
||||||
wdev->netdev, bssid,
|
wdev->netdev, bssid,
|
||||||
NULL, 0, NULL, 0,
|
NULL, 0, NULL, 0, -1, false, NULL,
|
||||||
WLAN_STATUS_UNSPECIFIED_FAILURE,
|
treason);
|
||||||
false, NULL);
|
|
||||||
}
|
}
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
}
|
}
|
||||||
|
@ -374,7 +381,8 @@ void cfg80211_sme_rx_auth(struct wireless_dev *wdev, const u8 *buf, size_t len)
|
||||||
} else if (status_code != WLAN_STATUS_SUCCESS) {
|
} else if (status_code != WLAN_STATUS_SUCCESS) {
|
||||||
__cfg80211_connect_result(wdev->netdev, mgmt->bssid,
|
__cfg80211_connect_result(wdev->netdev, mgmt->bssid,
|
||||||
NULL, 0, NULL, 0,
|
NULL, 0, NULL, 0,
|
||||||
status_code, false, NULL);
|
status_code, false, NULL,
|
||||||
|
NL80211_TIMEOUT_UNSPECIFIED);
|
||||||
} else if (wdev->conn->state == CFG80211_CONN_AUTHENTICATING) {
|
} else if (wdev->conn->state == CFG80211_CONN_AUTHENTICATING) {
|
||||||
wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
|
wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
|
||||||
schedule_work(&rdev->conn_work);
|
schedule_work(&rdev->conn_work);
|
||||||
|
@ -422,7 +430,7 @@ void cfg80211_sme_auth_timeout(struct wireless_dev *wdev)
|
||||||
if (!wdev->conn)
|
if (!wdev->conn)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wdev->conn->state = CFG80211_CONN_AUTH_FAILED;
|
wdev->conn->state = CFG80211_CONN_AUTH_FAILED_TIMEOUT;
|
||||||
schedule_work(&rdev->conn_work);
|
schedule_work(&rdev->conn_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,7 +452,7 @@ void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev)
|
||||||
if (!wdev->conn)
|
if (!wdev->conn)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
|
wdev->conn->state = CFG80211_CONN_ASSOC_FAILED_TIMEOUT;
|
||||||
schedule_work(&rdev->conn_work);
|
schedule_work(&rdev->conn_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -565,7 +573,9 @@ static int cfg80211_sme_connect(struct wireless_dev *wdev,
|
||||||
|
|
||||||
/* we're good if we have a matching bss struct */
|
/* we're good if we have a matching bss struct */
|
||||||
if (bss) {
|
if (bss) {
|
||||||
err = cfg80211_conn_do_work(wdev);
|
enum nl80211_timeout_reason treason;
|
||||||
|
|
||||||
|
err = cfg80211_conn_do_work(wdev, &treason);
|
||||||
cfg80211_put_bss(wdev->wiphy, bss);
|
cfg80211_put_bss(wdev->wiphy, bss);
|
||||||
} else {
|
} else {
|
||||||
/* otherwise we'll need to scan for the AP first */
|
/* otherwise we'll need to scan for the AP first */
|
||||||
|
@ -662,8 +672,9 @@ static DECLARE_WORK(cfg80211_disconnect_work, disconnect_work);
|
||||||
void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||||
const u8 *req_ie, size_t req_ie_len,
|
const u8 *req_ie, size_t req_ie_len,
|
||||||
const u8 *resp_ie, size_t resp_ie_len,
|
const u8 *resp_ie, size_t resp_ie_len,
|
||||||
u16 status, bool wextev,
|
int status, bool wextev,
|
||||||
struct cfg80211_bss *bss)
|
struct cfg80211_bss *bss,
|
||||||
|
enum nl80211_timeout_reason timeout_reason)
|
||||||
{
|
{
|
||||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||||
const u8 *country_ie;
|
const u8 *country_ie;
|
||||||
|
@ -682,7 +693,7 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||||
nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev,
|
nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev,
|
||||||
bssid, req_ie, req_ie_len,
|
bssid, req_ie, req_ie_len,
|
||||||
resp_ie, resp_ie_len,
|
resp_ie, resp_ie_len,
|
||||||
status, GFP_KERNEL);
|
status, timeout_reason, GFP_KERNEL);
|
||||||
|
|
||||||
#ifdef CONFIG_CFG80211_WEXT
|
#ifdef CONFIG_CFG80211_WEXT
|
||||||
if (wextev) {
|
if (wextev) {
|
||||||
|
@ -771,7 +782,8 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||||
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
||||||
struct cfg80211_bss *bss, const u8 *req_ie,
|
struct cfg80211_bss *bss, const u8 *req_ie,
|
||||||
size_t req_ie_len, const u8 *resp_ie,
|
size_t req_ie_len, const u8 *resp_ie,
|
||||||
size_t resp_ie_len, u16 status, gfp_t gfp)
|
size_t resp_ie_len, int status, gfp_t gfp,
|
||||||
|
enum nl80211_timeout_reason timeout_reason)
|
||||||
{
|
{
|
||||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||||
|
@ -811,6 +823,7 @@ void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
|
||||||
cfg80211_hold_bss(bss_from_pub(bss));
|
cfg80211_hold_bss(bss_from_pub(bss));
|
||||||
ev->cr.bss = bss;
|
ev->cr.bss = bss;
|
||||||
ev->cr.status = status;
|
ev->cr.status = status;
|
||||||
|
ev->cr.timeout_reason = timeout_reason;
|
||||||
|
|
||||||
spin_lock_irqsave(&wdev->event_lock, flags);
|
spin_lock_irqsave(&wdev->event_lock, flags);
|
||||||
list_add_tail(&ev->list, &wdev->event_list);
|
list_add_tail(&ev->list, &wdev->event_list);
|
||||||
|
|
|
@ -878,7 +878,7 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev)
|
||||||
ev->cr.resp_ie, ev->cr.resp_ie_len,
|
ev->cr.resp_ie, ev->cr.resp_ie_len,
|
||||||
ev->cr.status,
|
ev->cr.status,
|
||||||
ev->cr.status == WLAN_STATUS_SUCCESS,
|
ev->cr.status == WLAN_STATUS_SUCCESS,
|
||||||
ev->cr.bss);
|
ev->cr.bss, ev->cr.timeout_reason);
|
||||||
break;
|
break;
|
||||||
case EVENT_ROAMED:
|
case EVENT_ROAMED:
|
||||||
__cfg80211_roamed(wdev, ev->rm.bss, ev->rm.req_ie,
|
__cfg80211_roamed(wdev, ev->rm.bss, ev->rm.req_ie,
|
||||||
|
|
Loading…
Add table
Reference in a new issue