* [RFC] cfg80211/nl80211: Notify connection request failure in AP mode
@ 2012-09-10 10:53 Pandiyarajan Pitchaimuthu
2012-09-10 11:28 ` Johannes Berg
0 siblings, 1 reply; 3+ messages in thread
From: Pandiyarajan Pitchaimuthu @ 2012-09-10 10:53 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless
In AP mode, when a station requests connection to an AP and if the
request is failed for particular reason, userspace is notified about the
failure through NL80211_CMD_CONN_FAILED command. Reason for the failure
is sent through the attribute NL80211_ATTR_CONN_FAILED_REASON.
Signed-off-by: Pandiyarajan Pitchaimuthu <c_ppitch@qca.qualcomm.com>
---
include/linux/nl80211.h | 19 +++++++++++++++++++
include/net/cfg80211.h | 18 ++++++++++++++++++
net/wireless/mlme.c | 11 +++++++++++
net/wireless/nl80211.c | 34 ++++++++++++++++++++++++++++++++++
net/wireless/nl80211.h | 5 +++++
5 files changed, 87 insertions(+)
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 2f38788..e5bf1ae 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -565,6 +565,11 @@
* %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ with
* %NL80211_ATTR_WIPHY_CHANNEL_TYPE.
*
+ * @NL80211_CMD_CONN_FAILED: connection request to an AP failed; used to
+ * notify userspace that AP has rejected the connection request from a
+ * station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON
+ * is used for this.
+ *
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
*/
@@ -708,6 +713,8 @@ enum nl80211_commands {
NL80211_CMD_CH_SWITCH_NOTIFY,
+ NL80211_CMD_CONN_FAILED,
+
/* add new commands above here */
/* used to define NL80211_CMD_MAX below */
@@ -1251,6 +1258,10 @@ enum nl80211_commands {
* was used to provide the hint. For the different types of
* allowed user regulatory hints see nl80211_user_reg_hint_type.
*
+ * @NL80211_ATTR_CONN_FAILED_REASON: The reason for which AP has rejected
+ * the connection request from a station. nl80211_connect_failed_reason
+ * enum has different reasons of connection failure.
+ *
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
*/
@@ -1506,6 +1517,8 @@ enum nl80211_attrs {
NL80211_ATTR_USER_REG_HINT_TYPE,
+ NL80211_ATTR_CONN_FAILED_REASON,
+
/* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST,
@@ -3023,4 +3036,10 @@ enum nl80211_probe_resp_offload_support_attr {
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U = 1<<3,
};
+/* AP mode - sta's connection request failed reasons */
+enum nl80211_connect_failed_reason {
+ NL80211_CONN_FAIL_MAX_CLIENTS = 1,
+ NL80211_CONN_FAIL_BLOCKED_CLIENT = 2,
+};
+
#endif /* __LINUX_NL80211_H */
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 3d254e1..94a5bde 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -3342,6 +3342,24 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp);
/**
+ * cfg80211_conn_failed - connection request failed notification
+ *
+ * @dev: the netdev
+ * @mac_addr: the station's address
+ * @reason: the reason for connection failure
+ * @gfp: allocation flags
+ *
+ * Whenever a station tries to connect to an AP and if the station
+ * could not connect to the AP for some reason, this function is called.
+ *
+ * The reason for connection failure can be any of the value from
+ * nl80211_connect_failed_reason enum
+ */
+void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
+ enum nl80211_connect_failed_reason reason,
+ gfp_t gfp);
+
+/**
* cfg80211_rx_mgmt - notification of received, unprocessed management frame
* @wdev: wireless device receiving the frame
* @freq: Frequency on which the frame was received in MHz
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 1cdb1d5..7e3eca5 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -612,6 +612,17 @@ void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
}
EXPORT_SYMBOL(cfg80211_del_sta);
+void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
+ enum nl80211_connect_failed_reason reason,
+ gfp_t gfp)
+{
+ struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
+ struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
+
+ nl80211_send_conn_failed_event(rdev, dev, mac_addr, reason, gfp);
+}
+EXPORT_SYMBOL(cfg80211_conn_failed);
+
struct cfg80211_mgmt_registration {
struct list_head list;
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 97026f3..db06929 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -8252,6 +8252,40 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
nlmsg_free(msg);
}
+void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev,
+ struct net_device *dev, const u8 *mac_addr,
+ enum nl80211_connect_failed_reason reason,
+ gfp_t gfp)
+{
+ struct sk_buff *msg;
+ void *hdr;
+
+ msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
+ if (!msg)
+ return;
+
+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
+ if (!hdr) {
+ nlmsg_free(msg);
+ return;
+ }
+
+ if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
+ nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
+ nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
+ goto nla_put_failure;
+
+ genlmsg_end(msg, hdr);
+
+ genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
+ nl80211_mlme_mcgrp.id, gfp);
+ return;
+
+ nla_put_failure:
+ genlmsg_cancel(msg, hdr);
+ nlmsg_free(msg);
+}
+
static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
const u8 *addr, gfp_t gfp)
{
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
index 9f2616f..f615351 100644
--- a/net/wireless/nl80211.h
+++ b/net/wireless/nl80211.h
@@ -91,6 +91,11 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
struct net_device *dev, const u8 *mac_addr,
gfp_t gfp);
+void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev,
+ struct net_device *dev, const u8 *mac_addr,
+ enum nl80211_connect_failed_reason reason,
+ gfp_t gfp);
+
int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev, u32 nlpid,
int freq, int sig_dbm,
--
1.7.9.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [RFC] cfg80211/nl80211: Notify connection request failure in AP mode
2012-09-10 10:53 [RFC] cfg80211/nl80211: Notify connection request failure in AP mode Pandiyarajan Pitchaimuthu
@ 2012-09-10 11:28 ` Johannes Berg
2012-09-10 15:12 ` Pandiyarajan
0 siblings, 1 reply; 3+ messages in thread
From: Johannes Berg @ 2012-09-10 11:28 UTC (permalink / raw)
To: Pandiyarajan Pitchaimuthu; +Cc: linville, linux-wireless
On Mon, 2012-09-10 at 16:23 +0530, Pandiyarajan Pitchaimuthu wrote:
> In AP mode, when a station requests connection to an AP and if the
> request is failed for particular reason, userspace is notified about the
> failure through NL80211_CMD_CONN_FAILED command. Reason for the failure
> is sent through the attribute NL80211_ATTR_CONN_FAILED_REASON.
Why would userspace care?
> +/* AP mode - sta's connection request failed reasons */
> +enum nl80211_connect_failed_reason {
> + NL80211_CONN_FAIL_MAX_CLIENTS = 1,
> + NL80211_CONN_FAIL_BLOCKED_CLIENT = 2,
> +};
Why number explicitly?
> + * Whenever a station tries to connect to an AP and if the station
> + * could not connect to the AP for some reason, this function is called.
It's not really "for some reason", it's "because the AP rejected it for
some reason"... You're not handling other cases anyway.
johannes
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFC] cfg80211/nl80211: Notify connection request failure in AP mode
2012-09-10 11:28 ` Johannes Berg
@ 2012-09-10 15:12 ` Pandiyarajan
0 siblings, 0 replies; 3+ messages in thread
From: Pandiyarajan @ 2012-09-10 15:12 UTC (permalink / raw)
To: Johannes Berg; +Cc: linville, linux-wireless
Hi Johannes,
On Monday 10 September 2012 04:58 PM, Johannes Berg wrote:
> On Mon, 2012-09-10 at 16:23 +0530, Pandiyarajan Pitchaimuthu wrote:
>> In AP mode, when a station requests connection to an AP and if the
>> request is failed for particular reason, userspace is notified about the
>> failure through NL80211_CMD_CONN_FAILED command. Reason for the failure
>> is sent through the attribute NL80211_ATTR_CONN_FAILED_REASON.
> Why would userspace care?
It would be useful to inform the userspace that the driver/firmware's
limitation of maintaining the maximum number of connected clients is
reached.
Without this the user may not be clear about why another client cannot
be added.
Also, further enhancements/decisions can be made based on this event.
>> +/* AP mode - sta's connection request failed reasons */
>> +enum nl80211_connect_failed_reason {
>> + NL80211_CONN_FAIL_MAX_CLIENTS = 1,
>> + NL80211_CONN_FAIL_BLOCKED_CLIENT = 2,
>> +};
> Why number explicitly?
Thanks. Will change it to have the default value.
>> + * Whenever a station tries to connect to an AP and if the station
>> + * could not connect to the AP for some reason, this function is called.
> It's not really "for some reason", it's "because the AP rejected it for
> some reason"... You're not handling other cases anyway.
>
> johannes
>
Sure. Will change the comment.
Pandiyarajan.P
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-09-10 15:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-10 10:53 [RFC] cfg80211/nl80211: Notify connection request failure in AP mode Pandiyarajan Pitchaimuthu
2012-09-10 11:28 ` Johannes Berg
2012-09-10 15:12 ` Pandiyarajan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).