summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c147
1 files changed, 90 insertions, 57 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 51354a33f2c6..053012dd0ce4 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -2299,6 +2299,12 @@ wlan_hdd_cfg80211_get_features(struct wiphy *wiphy,
return ret;
}
+#define PARAM_NUM_NW \
+ QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_NUM_NETWORKS
+#define PARAM_SET_BSSID \
+ QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_BSSID
+#define PRAM_SSID_LIST QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_LIST
+#define PARAM_LIST_SSID QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID
/**
* __wlan_hdd_cfg80211_set_ext_roam_params() - Settings for roaming parameters
@@ -2322,7 +2328,7 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy,
uint8_t session_id;
struct roam_ext_params roam_params;
uint32_t cmd_type, req_id;
- struct nlattr *curr_attr;
+ struct nlattr *curr_attr = NULL;
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX + 1];
struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX + 1];
int rem, i;
@@ -2366,45 +2372,63 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy,
switch (cmd_type) {
case QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_SSID_WHITE_LIST:
i = 0;
- nla_for_each_nested(curr_attr,
- tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_LIST],
- rem) {
- if (nla_parse(tb2,
- QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_MAX,
- nla_data(curr_attr), nla_len(curr_attr),
- NULL)) {
- hdd_err("nla_parse failed");
- goto fail;
- }
- /* Parse and Fetch allowed SSID list*/
- if (!tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID]) {
- hdd_err("attr allowed ssid failed");
- goto fail;
- }
- buf_len = nla_len(tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID]);
- /*
- * Upper Layers include a null termination character.
- * Check for the actual permissible length of SSID and
- * also ensure not to copy the NULL termination
- * character to the driver buffer.
- */
- if (buf_len && (i < MAX_SSID_ALLOWED_LIST) &&
- ((buf_len - 1) <= SIR_MAC_MAX_SSID_LENGTH)) {
- nla_memcpy(
+ if (tb[PARAM_NUM_NW]) {
+ count = nla_get_u32(
+ tb[PARAM_NUM_NW]);
+ } else {
+ hdd_err("Number of networks is not provided");
+ goto fail;
+ }
+
+ if (count &&
+ tb[PRAM_SSID_LIST]) {
+ nla_for_each_nested(curr_attr,
+ tb[PRAM_SSID_LIST], rem) {
+ if (nla_parse(tb2,
+ QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_MAX,
+ nla_data(curr_attr), nla_len(curr_attr),
+ NULL)) {
+ hdd_err("nla_parse failed");
+ goto fail;
+ }
+ /* Parse and Fetch allowed SSID list*/
+ if (!tb2[PARAM_LIST_SSID]) {
+ hdd_err("attr allowed ssid failed");
+ goto fail;
+ }
+ buf_len = nla_len(tb2[PARAM_LIST_SSID]);
+ /*
+ * Upper Layers include a null termination
+ * character. Check for the actual permissible
+ * length of SSID and also ensure not to copy
+ * the NULL termination character to the driver
+ * buffer.
+ */
+ if (buf_len && (i < MAX_SSID_ALLOWED_LIST) &&
+ ((buf_len - 1) <=
+ SIR_MAC_MAX_SSID_LENGTH)) {
+ nla_memcpy(
roam_params.ssid_allowed_list[i].ssId,
- tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID],
- buf_len - 1);
- roam_params.ssid_allowed_list[i].length =
- buf_len - 1;
- hdd_debug("SSID[%d]: %.*s,length = %d", i,
+ tb2[PARAM_LIST_SSID], buf_len - 1);
+ roam_params.ssid_allowed_list[i].length
+ = buf_len - 1;
+ hdd_debug("SSID[%d]: %.*s,length = %d",
+ i,
roam_params.ssid_allowed_list[i].length,
roam_params.ssid_allowed_list[i].ssId,
roam_params.ssid_allowed_list[i].length);
- i++;
- } else {
- hdd_err("Invalid buffer length");
+ i++;
+ } else {
+ hdd_err("Invalid buffer length");
+ }
}
}
+ if (i != count) {
+ hdd_err("Invalid number of SSIDs i = %d, count = %d",
+ i, count);
+ goto fail;
+ }
+
roam_params.num_ssid_allowed_list = i;
hdd_debug("Num of Allowed SSID %d",
roam_params.num_ssid_allowed_list);
@@ -2566,34 +2590,38 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy,
}
hdd_debug("Num of blacklist BSSID (%d)", count);
i = 0;
- nla_for_each_nested(curr_attr,
+
+ if (count &&
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS]) {
+ nla_for_each_nested(curr_attr,
tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS],
rem) {
- if (i == count) {
- hdd_warn("Ignoring excess Blacklist BSSID");
- break;
- }
+ if (i == count) {
+ hdd_warn("Ignoring excess Blacklist BSSID");
+ break;
+ }
- if (nla_parse(tb2,
- QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX,
- nla_data(curr_attr), nla_len(curr_attr),
- NULL)) {
- hdd_err("nla_parse failed");
- goto fail;
- }
- /* Parse and fetch MAC address */
- if (!tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_BSSID]) {
- hdd_err("attr blacklist addr failed");
- goto fail;
+ if (nla_parse(tb2,
+ QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX,
+ nla_data(curr_attr), nla_len(curr_attr),
+ NULL)) {
+ hdd_err("nla_parse failed");
+ goto fail;
+ }
+ /* Parse and fetch MAC address */
+ if (!tb2[PARAM_SET_BSSID]) {
+ hdd_err("attr blacklist addr failed");
+ goto fail;
+ }
+ nla_memcpy(
+ roam_params.bssid_avoid_list[i].bytes,
+ tb2[PARAM_SET_BSSID], QDF_MAC_ADDR_SIZE);
+ hdd_debug(MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(
+ roam_params.bssid_avoid_list[i].bytes));
+ i++;
}
- nla_memcpy(roam_params.bssid_avoid_list[i].bytes,
- tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_BSSID],
- QDF_MAC_ADDR_SIZE);
- hdd_debug(MAC_ADDRESS_STR,
- MAC_ADDR_ARRAY(
- roam_params.bssid_avoid_list[i].bytes));
- i++;
}
if (i < count)
hdd_warn("Num Blacklist BSSID %u less than expected %u",
@@ -2607,6 +2635,11 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy,
fail:
return -EINVAL;
}
+#undef PARAM_NUM_NW
+#undef PARAM_SET_BSSID
+#undef PRAM_SSID_LIST
+#undef PARAM_LIST_SSID
+
/**
* wlan_hdd_cfg80211_set_ext_roam_params() - set ext scan roam params