Merge "WifiHal: Add support to accept either passphrase or pmk"
am: 2931ad23a4
Change-Id: I5fc6a53d2419d863d4d1a55caa7cc85171819f16
diff --git a/qcwcn/wifi_hal/nan.cpp b/qcwcn/wifi_hal/nan.cpp
index 7efa503..73cdc75 100644
--- a/qcwcn/wifi_hal/nan.cpp
+++ b/qcwcn/wifi_hal/nan.cpp
@@ -32,6 +32,8 @@
#define STRUCT_PACKED
#endif
+#define OUT_OF_BAND_SERVICE_INSTANCE_ID 0
+
//Singleton Static Instance
NanCommand* NanCommand::mNanCommandInstance = NULL;
@@ -785,6 +787,22 @@
return (wifi_error)ret;
}
+ if ((msg->cipher_type != NAN_CIPHER_SUITE_SHARED_KEY_NONE) &&
+ (msg->key_info.body.pmk_info.pmk_len == 0) &&
+ (msg->key_info.body.passphrase_info.passphrase_len == 0)) {
+ ALOGE("%s: Failed-Initiator req, missing pmk and passphrase",
+ __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ if ((msg->cipher_type != NAN_CIPHER_SUITE_SHARED_KEY_NONE) &&
+ (msg->requestor_instance_id == OUT_OF_BAND_SERVICE_INSTANCE_ID) &&
+ (msg->service_name_len == 0)) {
+ ALOGE("%s: Failed-Initiator req, missing service name for out of band request",
+ __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
/* Add the vendor specific attributes for the NL command. */
nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
if (!nlData)
@@ -852,11 +870,30 @@
if (nanCommand->put_u32(QCA_WLAN_VENDOR_ATTR_NDP_CSID,
msg->cipher_type))
goto cleanup;
- }
- if (msg->pmk_len == NAN_PMK_INFO_LEN) {
- if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
- (char *)msg->pmk, msg->pmk_len))
- goto cleanup;
+
+ if ( msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK &&
+ msg->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN) {
+ if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+ (char *)msg->key_info.body.pmk_info.pmk,
+ msg->key_info.body.pmk_info.pmk_len))
+ goto cleanup;
+ } else if (msg->key_info.key_type ==
+ NAN_SECURITY_KEY_INPUT_PASSPHRASE &&
+ msg->key_info.body.passphrase_info.passphrase_len >=
+ NAN_SECURITY_MIN_PASSPHRASE_LEN &&
+ msg->key_info.body.passphrase_info.passphrase_len <=
+ NAN_SECURITY_MAX_PASSPHRASE_LEN) {
+ if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE,
+ (char *)msg->key_info.body.passphrase_info.passphrase,
+ msg->key_info.body.passphrase_info.passphrase_len))
+ goto cleanup;
+ }
+
+ if (msg->service_name_len) {
+ if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME,
+ (char *)msg->service_name, msg->service_name_len))
+ goto cleanup;
+ }
}
nanCommand->attr_end(nlData);
@@ -888,6 +925,14 @@
return (wifi_error)ret;
}
+ if ((msg->cipher_type != NAN_CIPHER_SUITE_SHARED_KEY_NONE) &&
+ (msg->key_info.body.pmk_info.pmk_len == 0) &&
+ (msg->key_info.body.passphrase_info.passphrase_len == 0)) {
+ ALOGE("%s: Failed-Initiator req, missing pmk and passphrase",
+ __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
/* Add the vendor specific attributes for the NL command. */
nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
if (!nlData)
@@ -944,11 +989,29 @@
if (nanCommand->put_u32(QCA_WLAN_VENDOR_ATTR_NDP_CSID,
msg->cipher_type))
goto cleanup;
- }
- if (msg->pmk_len == NAN_PMK_INFO_LEN) {
- if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
- (char *)msg->pmk, msg->pmk_len))
- goto cleanup;
+
+ if ( msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK &&
+ msg->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN) {
+ if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+ (char *)msg->key_info.body.pmk_info.pmk,
+ msg->key_info.body.pmk_info.pmk_len))
+ goto cleanup;
+ } else if (msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE &&
+ msg->key_info.body.passphrase_info.passphrase_len >=
+ NAN_SECURITY_MIN_PASSPHRASE_LEN &&
+ msg->key_info.body.passphrase_info.passphrase_len <=
+ NAN_SECURITY_MAX_PASSPHRASE_LEN) {
+ if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE,
+ (char *)msg->key_info.body.passphrase_info.passphrase,
+ msg->key_info.body.passphrase_info.passphrase_len))
+ goto cleanup;
+ }
+
+ if (msg->service_name_len) {
+ if (nanCommand->put_bytes(QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME,
+ (char *)msg->service_name, msg->service_name_len))
+ goto cleanup;
+ }
}
nanCommand->attr_end(nlData);
diff --git a/qcwcn/wifi_hal/nan_i.h b/qcwcn/wifi_hal/nan_i.h
index 8a3ae3b..26f6b2b 100644
--- a/qcwcn/wifi_hal/nan_i.h
+++ b/qcwcn/wifi_hal/nan_i.h
@@ -167,6 +167,7 @@
NAN_TLV_TYPE_NAN20_RANGING_REQUEST = 24,
NAN_TLV_TYPE_NAN20_RANGING_RESULT = 25,
NAN_TLV_TYPE_NAN20_RANGING_REQUEST_RECEIVED = 26,
+ NAN_TLV_TYPE_NAN_PASSPHRASE = 27,
NAN_TLV_TYPE_SDEA_SERVICE_SPECIFIC_INFO = 28,
NAN_TLV_TYPE_SDF_LAST = 4095,
diff --git a/qcwcn/wifi_hal/nan_req.cpp b/qcwcn/wifi_hal/nan_req.cpp
index 735936d..7f96568 100644
--- a/qcwcn/wifi_hal/nan_req.cpp
+++ b/qcwcn/wifi_hal/nan_req.cpp
@@ -568,7 +568,6 @@
(pReq->tx_match_filter_len ? SIZEOF_TLV_HDR + pReq->tx_match_filter_len : 0) +
(SIZEOF_TLV_HDR + sizeof(NanServiceAcceptPolicy)) +
(pReq->cipher_type ? SIZEOF_TLV_HDR + sizeof(NanCsidType) : 0) +
- (pReq->pmk_len ? SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN : 0) +
((pReq->sdea_params.config_nan_data_path || pReq->sdea_params.security_cfg ||
pReq->sdea_params.ranging_state || pReq->sdea_params.range_report) ?
SIZEOF_TLV_HDR + sizeof(NanFWSdeaCtrlParams) : 0) +
@@ -580,6 +579,17 @@
SIZEOF_TLV_HDR + sizeof(NanFWRangeReqMsg) : 0) +
(pReq->sdea_service_specific_info_len ? SIZEOF_TLV_HDR + pReq->sdea_service_specific_info_len : 0);
+ if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) &&
+ (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN))
+ message_len += SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN;
+ else if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len >=
+ NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len <=
+ NAN_SECURITY_MAX_PASSPHRASE_LEN))
+ message_len += SIZEOF_TLV_HDR +
+ pReq->key_info.body.passphrase_info.passphrase_len;
+
pNanPublishServiceReqMsg pFwReq = (pNanPublishServiceReqMsg)malloc(message_len);
if (pFwReq == NULL) {
cleanup();
@@ -645,10 +655,23 @@
tlvs = addTlv(NAN_TLV_TYPE_NAN_CSID, sizeof(NanCsidType),
(const u8*)&pNanCsidType, tlvs);
}
- if (pReq->pmk_len) {
- tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK, pReq->pmk_len,
- (const u8*)&pReq->pmk[0], tlvs);
+
+ if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) &&
+ (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN)) {
+ tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK,
+ pReq->key_info.body.pmk_info.pmk_len,
+ (const u8*)&pReq->key_info.body.pmk_info.pmk[0], tlvs);
+ } else if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len >=
+ NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len <=
+ NAN_SECURITY_MAX_PASSPHRASE_LEN)) {
+ tlvs = addTlv(NAN_TLV_TYPE_NAN_PASSPHRASE,
+ pReq->key_info.body.passphrase_info.passphrase_len,
+ (const u8*)&pReq->key_info.body.passphrase_info.passphrase[0],
+ tlvs);
}
+
if (pReq->sdea_params.config_nan_data_path ||
pReq->sdea_params.security_cfg ||
pReq->sdea_params.ranging_state ||
@@ -794,7 +817,6 @@
(pReq->rx_match_filter_len ? SIZEOF_TLV_HDR + pReq->rx_match_filter_len : 0) +
(pReq->tx_match_filter_len ? SIZEOF_TLV_HDR + pReq->tx_match_filter_len : 0) +
(pReq->cipher_type ? SIZEOF_TLV_HDR + sizeof(NanCsidType) : 0) +
- (pReq->pmk_len ? SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN : 0) +
((pReq->sdea_params.config_nan_data_path || pReq->sdea_params.security_cfg ||
pReq->sdea_params.ranging_state || pReq->sdea_params.range_report) ?
SIZEOF_TLV_HDR + sizeof(NanFWSdeaCtrlParams) : 0) +
@@ -809,6 +831,19 @@
message_len += \
(pReq->num_intf_addr_present * (SIZEOF_TLV_HDR + NAN_MAC_ADDR_LEN));
+
+ if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) &&
+ (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN))
+ message_len += SIZEOF_TLV_HDR + NAN_PMK_INFO_LEN;
+ else if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len >=
+ NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len <=
+ NAN_SECURITY_MAX_PASSPHRASE_LEN))
+ message_len += SIZEOF_TLV_HDR +
+ pReq->key_info.body.passphrase_info.passphrase_len;
+
+
pNanSubscribeServiceReqMsg pFwReq = (pNanSubscribeServiceReqMsg)malloc(message_len);
if (pFwReq == NULL) {
cleanup();
@@ -878,10 +913,23 @@
tlvs = addTlv(NAN_TLV_TYPE_NAN_CSID, sizeof(NanCsidType),
(const u8*)&pNanCsidType, tlvs);
}
- if (pReq->pmk_len) {
- tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK, pReq->pmk_len,
- (const u8*)&pReq->pmk[0], tlvs);
+
+ if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) &&
+ (pReq->key_info.body.pmk_info.pmk_len == NAN_PMK_INFO_LEN)) {
+ tlvs = addTlv(NAN_TLV_TYPE_NAN_PMK,
+ pReq->key_info.body.pmk_info.pmk_len,
+ (const u8*)&pReq->key_info.body.pmk_info.pmk[0], tlvs);
+ } else if ((pReq->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len >=
+ NAN_SECURITY_MIN_PASSPHRASE_LEN) &&
+ (pReq->key_info.body.passphrase_info.passphrase_len <=
+ NAN_SECURITY_MAX_PASSPHRASE_LEN)) {
+ tlvs = addTlv(NAN_TLV_TYPE_NAN_PASSPHRASE,
+ pReq->key_info.body.passphrase_info.passphrase_len,
+ (const u8*)&pReq->key_info.body.passphrase_info.passphrase[0],
+ tlvs);
}
+
if (pReq->sdea_params.config_nan_data_path ||
pReq->sdea_params.security_cfg ||
pReq->sdea_params.ranging_state ||
diff --git a/qcwcn/wifi_hal/vendor_definitions.h b/qcwcn/wifi_hal/vendor_definitions.h
index ac8afcd..ea105fa 100644
--- a/qcwcn/wifi_hal/vendor_definitions.h
+++ b/qcwcn/wifi_hal/vendor_definitions.h
@@ -364,6 +364,12 @@
QCA_WLAN_VENDOR_ATTR_NDP_CSID,
/* Array of u8: len = NAN_PMK_INFO_LEN */
QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+ QCA_WLAN_VENDOR_ATTR_NDP_SCID,
+ /* Array of u8: len = NAN_SECURITY_MAX_PASSPHRASE_LEN*/
+ QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE,
+ /* Array of u8: len = NAN_MAX_SERVICE_NAME_LEN */
+ QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME,
+
/* KEEP LAST */
QCA_WLAN_VENDOR_ATTR_NDP_AFTER_LAST,