summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/src/wlan_hdd_nan_datapath.c109
-rw-r--r--CORE/HDD/src/wlan_hdd_nan_datapath.h6
-rw-r--r--CORE/MAC/inc/sirApi.h34
-rw-r--r--CORE/MAC/src/pe/nan/nan_datapath.c5
-rw-r--r--CORE/SERVICES/WMA/wma_nan_datapath.c113
-rw-r--r--CORE/SME/src/nan/nan_datapath_api.c151
6 files changed, 321 insertions, 97 deletions
diff --git a/CORE/HDD/src/wlan_hdd_nan_datapath.c b/CORE/HDD/src/wlan_hdd_nan_datapath.c
index d0d173ef26db..2a2e6e4dba80 100644
--- a/CORE/HDD/src/wlan_hdd_nan_datapath.c
+++ b/CORE/HDD/src/wlan_hdd_nan_datapath.c
@@ -62,6 +62,11 @@ qca_wlan_vendor_ndp_policy[QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX + 1] = {
NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG] = { .type = NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE] = { .type = NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_NDP_PMK] = { .type = NLA_BINARY,
+ .len = NDP_PMK_LEN },
+ [QCA_WLAN_VENDOR_ATTR_NDP_SCID] = { .type = NLA_BINARY,
+ .len = NDP_SCID_BUF_LEN },
};
/**
@@ -466,6 +471,18 @@ static int hdd_ndi_delete_req_handler(hdd_context_t *hdd_ctx,
* @hdd_ctx: hdd context
* @tb: parsed NL attribute list
*
+ * tb will contain following vendor attributes:
+ * QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR
+ * QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID
+ * QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG
+ * QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID
+ * QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR
+ * QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_PMK - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE - optional
+ *
* Return: 0 on success or error code on failure
*/
static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx,
@@ -525,9 +542,13 @@ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx,
req.channel =
nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL]);
- if (tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG])
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG]) {
req.channel_cfg =
nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG]);
+ } else {
+ hddLog(LOGE, FL("Channel config is unavailable"));
+ return -EINVAL;
+ }
if (!tb[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID]) {
hddLog(LOGE, FL("NDP service instance ID is unavailable"));
@@ -562,10 +583,31 @@ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx,
nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS]);
}
- hddLog(LOG1, FL("vdev_id: %d, transaction_id: %d, channel: %d, service_instance_id: %d, ndp_app_info_len: %d, peer_discovery_mac_addr: %pM"),
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE] &&
+ !tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) {
+ hddLog(LOGE, FL("PMK cannot be absent when CSID is present."));
+ return -EINVAL;
+ }
+
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) {
+ req.pmk.pmk = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]);
+ req.pmk.pmk_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]);
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD,
+ VOS_TRACE_LEVEL_DEBUG,
+ req.pmk.pmk, req.pmk.pmk_len);
+ }
+
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]) {
+ req.ncs_sk_type =
+ nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]);
+
+ }
+
+ hddLog(LOG1,
+ FL("vdev_id: %d, transaction_id: %d, channel: %d, service_instance_id: %d, ndp_app_info_len: %d, csid: %d, peer_discovery_mac_addr: %pM"),
req.vdev_id, req.transaction_id, req.channel,
req.service_instance_id, req.ndp_info.ndp_app_info_len,
- req.peer_discovery_mac_addr.bytes);
+ req.ncs_sk_type, req.peer_discovery_mac_addr.bytes);
status = sme_ndp_initiator_req_handler(hal, &req);
if (status != VOS_STATUS_SUCCESS) {
hddLog(LOGE,
@@ -582,6 +624,16 @@ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx,
* @hdd_ctx: hdd context
* @tb: parsed NL attribute list
*
+ * tb includes following vendor attributes:
+ * QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR
+ * QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID
+ * QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID
+ * QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE
+ * QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_PMK - optional
+ * QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE - optional
+ *
* Return: 0 on success or error code on failure
*/
static int hdd_ndp_responder_req_handler(hdd_context_t *hdd_ctx,
@@ -676,10 +728,31 @@ static int hdd_ndp_responder_req_handler(hdd_context_t *hdd_ctx,
hddLog(LOG1, FL("NDP config data is unavailable"));
}
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE] &&
+ !tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) {
+ hddLog(LOGE, FL("PMK cannot be absent when CSID is present."));
+ return -EINVAL;
+ }
+
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) {
+ req.pmk.pmk = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]);
+ req.pmk.pmk_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]);
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD,
+ VOS_TRACE_LEVEL_DEBUG,
+ req.pmk.pmk, req.pmk.pmk_len);
+ }
+
+ if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]) {
+ req.ncs_sk_type =
+ nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]);
+
+ }
+
hddLog(LOG1,
- FL("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d"),
+ FL("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d, csid: %d"),
req.vdev_id, req.transaction_id, req.ndp_rsp,
- req.ndp_instance_id, req.ndp_info.ndp_app_info_len);
+ req.ndp_instance_id, req.ndp_info.ndp_app_info_len,
+ req.ncs_sk_type);
status = sme_ndp_responder_req_handler(hdd_ctx->hHal, &req);
if (status != eHAL_STATUS_SUCCESS) {
@@ -1364,6 +1437,8 @@ ndp_confirm_nla_failed:
* QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO (ndp_app_info_len size)
* QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE(4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_SCID(scid_len in size)
*
* Return: none
*/
@@ -1419,9 +1494,9 @@ static void hdd_ndp_indication_handler(hdd_adapter_t *adapter,
return;
}
- data_len = (4 * sizeof(uint32_t)) + (2 * VOS_MAC_ADDR_SIZE) + IFNAMSIZ +
- event->ndp_info.ndp_app_info_len + (8 * NLA_HDRLEN) +
- NLMSG_HDRLEN;
+ data_len = (5 * sizeof(uint32_t)) + (2 * VOS_MAC_ADDR_SIZE) + IFNAMSIZ +
+ event->ndp_info.ndp_app_info_len + event->scid.scid_len +
+ (10 * NLA_HDRLEN) + NLMSG_HDRLEN;
/* notify response to the upper layer */
vendor_event = cfg80211_vendor_event_alloc(hdd_ctx->wiphy,
@@ -1475,6 +1550,24 @@ static void hdd_ndp_indication_handler(hdd_adapter_t *adapter,
goto ndp_indication_nla_failed;
}
+ if (event->scid.scid_len) {
+ if (nla_put_u32(vendor_event,
+ QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE,
+ event->ncs_sk_type))
+ goto ndp_indication_nla_failed;
+
+ if (nla_put(vendor_event, QCA_WLAN_VENDOR_ATTR_NDP_SCID,
+ event->scid.scid_len,
+ event->scid.scid))
+ goto ndp_indication_nla_failed;
+
+ hddLog(LOG1, FL("csid: %d, scid_len: %d"),
+ event->ncs_sk_type, event->scid.scid_len);
+
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG,
+ event->scid.scid, event->scid.scid_len);
+ }
+
cfg80211_vendor_event(vendor_event, GFP_KERNEL);
EXIT();
return;
diff --git a/CORE/HDD/src/wlan_hdd_nan_datapath.h b/CORE/HDD/src/wlan_hdd_nan_datapath.h
index 69c09f7d8be1..3af78bdac5a8 100644
--- a/CORE/HDD/src/wlan_hdd_nan_datapath.h
+++ b/CORE/HDD/src/wlan_hdd_nan_datapath.h
@@ -39,6 +39,8 @@ struct wireless_dev;
#define NDP_APP_INFO_LEN 255
#define NDP_QOS_INFO_LEN 255
+#define NDP_PMK_LEN 32
+#define NDP_SCID_BUF_LEN 256
#define NDP_NUM_INSTANCE_ID 255
@@ -84,6 +86,7 @@ enum qca_wlan_vendor_attr_ndp_params {
QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL,
QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR,
QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR,
+ /* CONFIG_SECURITY is deprecated, use NCS_SK_TYPE/PMK/SCID instead */
QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_SECURITY,
QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS,
QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO,
@@ -94,6 +97,9 @@ enum qca_wlan_vendor_attr_ndp_params {
QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE,
QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG,
+ QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE,
+ QCA_WLAN_VENDOR_ATTR_NDP_PMK,
+ QCA_WLAN_VENDOR_ATTR_NDP_SCID,
QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX =
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 62a9a833947a..605e9c697d21 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -7853,6 +7853,28 @@ struct ndp_app_info {
};
/**
+ * struct ndp_scid - structure to hold sceurity context identifier
+ * @scid_len: length of scid
+ * @scid: scid
+ *
+ */
+struct ndp_scid {
+ uint32_t scid_len;
+ uint8_t *scid;
+};
+
+/**
+ * struct ndp_pmk - structure to hold pairwise master key
+ * @pmk_len: length of pairwise master key
+ * @pmk: buffer containing pairwise master key
+ *
+ */
+struct ndp_pmk {
+ uint32_t pmk_len;
+ uint8_t *pmk;
+};
+
+/**
* struct ndi_create_req - ndi create request params
* @transaction_id: unique identifier
* @iface_name: interface name
@@ -7897,6 +7919,8 @@ struct ndp_app_info {
* @self_ndi_mac_addr: self NDI mac address
* @ndp_config: ndp configuration params
* @ndp_info: ndp application info
+ * @ncs_sk_type: indicates NCS_SK_128 or NCS_SK_256
+ * @pmk: pairwise master key
*
*/
struct ndp_initiator_req {
@@ -7909,6 +7933,8 @@ struct ndp_initiator_req {
v_MACADDR_t self_ndi_mac_addr;
struct ndp_cfg ndp_config;
struct ndp_app_info ndp_info;
+ uint32_t ncs_sk_type;
+ struct ndp_pmk pmk;
};
/**
@@ -7940,6 +7966,8 @@ struct ndp_initiator_rsp {
* @ndp_accept_policy: accept policy configured by the upper layer
* @ndp_config: ndp configuration params
* @ndp_info: ndp application info
+ * @ncs_sk_type: indicates NCS_SK_128 or NCS_SK_256
+ * @scid: security context identifier
*
*/
struct ndp_indication_event {
@@ -7952,6 +7980,8 @@ struct ndp_indication_event {
enum ndp_accept_policy policy;
struct ndp_cfg ndp_config;
struct ndp_app_info ndp_info;
+ uint32_t ncs_sk_type;
+ struct ndp_scid scid;
};
/**
@@ -7962,6 +7992,8 @@ struct ndp_indication_event {
* @ndp_rsp: response to the ndp create request
* @ndp_config: ndp configuration params
* @ndp_info: ndp application info
+ * @pmk: pairwise master key
+ * @ncs_sk_type: indicates NCS_SK_128 or NCS_SK_256
*
*/
struct ndp_responder_req {
@@ -7971,6 +8003,8 @@ struct ndp_responder_req {
enum ndp_response_code ndp_rsp;
struct ndp_cfg ndp_config;
struct ndp_app_info ndp_info;
+ struct ndp_pmk pmk;
+ uint32_t ncs_sk_type;
};
/**
diff --git a/CORE/MAC/src/pe/nan/nan_datapath.c b/CORE/MAC/src/pe/nan/nan_datapath.c
index e7435afe9a26..24ab09000963 100644
--- a/CORE/MAC/src/pe/nan/nan_datapath.c
+++ b/CORE/MAC/src/pe/nan/nan_datapath.c
@@ -131,8 +131,9 @@ static VOS_STATUS lim_handle_ndp_indication_event(tpAniSirGlobal mac_ctx,
VOS_STATUS status = VOS_STATUS_SUCCESS;
limLog(mac_ctx, LOG1,
- FL("role: %d, vdev: %d, peer_mac_addr "MAC_ADDRESS_STR),
- ndp_ind->role, ndp_ind->vdev_id,
+ FL("role: %d, vdev: %d, csid: %d, peer_mac_addr "
+ MAC_ADDRESS_STR),
+ ndp_ind->role, ndp_ind->vdev_id, ndp_ind->ncs_sk_type,
MAC_ADDR_ARRAY(ndp_ind->peer_mac_addr.bytes));
if ((ndp_ind->role == NDP_ROLE_INITIATOR) ||
diff --git a/CORE/SERVICES/WMA/wma_nan_datapath.c b/CORE/SERVICES/WMA/wma_nan_datapath.c
index bf7e24acb9d6..78022203d7c2 100644
--- a/CORE/SERVICES/WMA/wma_nan_datapath.c
+++ b/CORE/SERVICES/WMA/wma_nan_datapath.c
@@ -43,15 +43,15 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req)
VOS_STATUS status;
int ret;
uint16_t len;
- uint32_t vdev_id, ndp_cfg_len, ndp_app_info_len;
+ uint32_t vdev_id, ndp_cfg_len, ndp_app_info_len, pmk_len;
struct ndp_initiator_rsp *rsp = NULL;
- uint8_t *cfg_info, *app_info;
ol_txrx_vdev_handle vdev;
wmi_buf_t buf;
wmi_ndp_initiator_req_fixed_param *cmd;
vos_msg_t pe_msg = {0};
struct ndp_initiator_req *ndp_req = req;
wmi_channel *ch_tlv;
+ uint8_t *tlv_ptr;
if (NULL == ndp_req) {
WMA_LOGE(FL("Invalid ndp_req."));
@@ -75,9 +75,11 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req)
*/
ndp_cfg_len = vos_roundup(ndp_req->ndp_config.ndp_cfg_len, 4);
ndp_app_info_len = vos_roundup(ndp_req->ndp_info.ndp_app_info_len, 4);
+ pmk_len = vos_roundup(ndp_req->pmk.pmk_len, 4);
/* allocated memory for fixed params as well as variable size data */
- len = sizeof(*cmd) + ndp_cfg_len + ndp_app_info_len +
- (2 * WMI_TLV_HDR_SIZE) + sizeof(*ch_tlv);
+ len = sizeof(*cmd) + sizeof(*ch_tlv) + (3 * WMI_TLV_HDR_SIZE)
+ + ndp_cfg_len + ndp_app_info_len + pmk_len;
+
buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
if (!buf) {
WMA_LOGE(FL("wmi_buf_alloc failed"));
@@ -97,6 +99,8 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req)
cmd->ndp_cfg_len = ndp_req->ndp_config.ndp_cfg_len;
cmd->ndp_app_info_len = ndp_req->ndp_info.ndp_app_info_len;
cmd->ndp_channel_cfg = ndp_req->channel_cfg;
+ cmd->nan_pmk_len = ndp_req->pmk.pmk_len;
+ cmd->nan_csid = ndp_req->ncs_sk_type;
ch_tlv = (wmi_channel *)&cmd[1];
WMITLV_SET_HDR(ch_tlv, WMITLV_TAG_STRUC_wmi_channel,
@@ -104,21 +108,26 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req)
ch_tlv->mhz = ndp_req->channel;
ch_tlv->band_center_freq1 =
vos_chan_to_freq(vos_freq_to_chan(ndp_req->channel));
+ tlv_ptr = (uint8_t *)&ch_tlv[1];
+
+ WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len);
+ vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE],
+ ndp_req->ndp_config.ndp_cfg, cmd->ndp_cfg_len);
+ tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_cfg_len;
- cfg_info = (uint8_t *)&ch_tlv[1];
- WMITLV_SET_HDR(cfg_info, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len);
- vos_mem_copy(&cfg_info[WMI_TLV_HDR_SIZE], ndp_req->ndp_config.ndp_cfg,
- cmd->ndp_cfg_len);
+ WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len);
+ vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE],
+ ndp_req->ndp_info.ndp_app_info, cmd->ndp_app_info_len);
+ tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_app_info_len;
- app_info = &cfg_info[WMI_TLV_HDR_SIZE + ndp_cfg_len];
- WMITLV_SET_HDR(app_info, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len);
- vos_mem_copy(&app_info[WMI_TLV_HDR_SIZE],
- ndp_req->ndp_info.ndp_app_info,
- cmd->ndp_app_info_len);
+ WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len);
+ vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], ndp_req->pmk.pmk,
+ cmd->nan_pmk_len);
+ tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len;
- WMA_LOGE(FL("vdev_id = %d, transaction_id: %d, service_instance_id, %d channel: %d"),
+ WMA_LOGE(FL("vdev_id = %d, transaction_id: %d, service_instance_id: %d, ch: %d, ch_cfg: %d, csid: %d"),
cmd->vdev_id, cmd->transaction_id, cmd->service_instance_id,
- ch_tlv->mhz);
+ ch_tlv->mhz, cmd->ndp_channel_cfg, cmd->nan_csid);
WMA_LOGE(FL("peer mac addr: mac_addr31to0: 0x%x, mac_addr47to32: 0x%x"),
cmd->peer_discovery_mac_addr.mac_addr31to0,
cmd->peer_discovery_mac_addr.mac_addr47to32);
@@ -133,8 +142,12 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req)
ndp_req->ndp_info.ndp_app_info,
ndp_req->ndp_info.ndp_app_info_len);
+ WMA_LOGE(FL("pmk len: %d"), cmd->nan_pmk_len);
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG,
+ ndp_req->pmk.pmk, cmd->nan_pmk_len);
WMA_LOGE(FL("sending WMI_NDP_INITIATOR_REQ_CMDID(0x%X)"),
WMI_NDP_INITIATOR_REQ_CMDID);
+
ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
WMI_NDP_INITIATOR_REQ_CMDID);
if (ret < 0) {
@@ -230,8 +243,8 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle,
{
wmi_buf_t buf;
ol_txrx_vdev_handle vdev;
- uint32_t vdev_id = 0, ndp_cfg_len, ndp_app_info_len;
- uint8_t *cfg_info, *app_info;
+ uint32_t vdev_id = 0, ndp_cfg_len, ndp_app_info_len, pmk_len;
+ uint8_t *tlv_ptr;
int ret;
wmi_ndp_responder_req_fixed_param *cmd;
uint16_t len;
@@ -265,9 +278,11 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle,
*/
ndp_cfg_len = vos_roundup(req_params->ndp_config.ndp_cfg_len, 4);
ndp_app_info_len = vos_roundup(req_params->ndp_info.ndp_app_info_len, 4);
+ pmk_len = vos_roundup(req_params->pmk.pmk_len, 4);
/* allocated memory for fixed params as well as variable size data */
- len = sizeof(*cmd) + ndp_cfg_len + ndp_app_info_len +
- (2 * WMI_TLV_HDR_SIZE);
+ len = sizeof(*cmd) + 3*WMI_TLV_HDR_SIZE + ndp_cfg_len + ndp_app_info_len
+ + pmk_len;
+
buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
if (!buf) {
WMA_LOGE(FL("wmi_buf_alloc failed"));
@@ -285,19 +300,29 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle,
cmd->ndp_cfg_len = req_params->ndp_config.ndp_cfg_len;
cmd->ndp_app_info_len = req_params->ndp_info.ndp_app_info_len;
+ cmd->nan_pmk_len = req_params->pmk.pmk_len;
+ cmd->nan_csid = req_params->ncs_sk_type;
- cfg_info = (uint8_t *)&cmd[1];
- /* WMI command expects 4 byte alligned len */
- WMITLV_SET_HDR(cfg_info, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len);
- vos_mem_copy(&cfg_info[WMI_TLV_HDR_SIZE],
- req_params->ndp_config.ndp_cfg, cmd->ndp_cfg_len);
+ tlv_ptr = (uint8_t *)&cmd[1];
- app_info = &cfg_info[WMI_TLV_HDR_SIZE + ndp_cfg_len];
- /* WMI command expects 4 byte alligned len */
- WMITLV_SET_HDR(app_info, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len);
- vos_mem_copy(&app_info[WMI_TLV_HDR_SIZE],
+ WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len);
+ vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE],
+ req_params->ndp_config.ndp_cfg, cmd->ndp_cfg_len);
+ tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_cfg_len;
+
+ WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len);
+ vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE],
req_params->ndp_info.ndp_app_info,
req_params->ndp_info.ndp_app_info_len);
+ tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_app_info_len;
+
+ WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len);
+ vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], req_params->pmk.pmk,
+ cmd->nan_pmk_len);
+ tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len;
+
+ WMA_LOGE(FL("vdev_id = %d, transaction_id: %d, csid: %d"),
+ cmd->vdev_id, cmd->transaction_id, cmd->nan_csid);
WMA_LOGD(FL("ndp_config len: %d"),
req_params->ndp_config.ndp_cfg_len);
@@ -311,6 +336,12 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle,
req_params->ndp_info.ndp_app_info,
req_params->ndp_info.ndp_app_info_len);
+ WMA_LOGE(FL("pmk len: %d"), cmd->nan_pmk_len);
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG,
+ req_params->pmk.pmk, cmd->nan_pmk_len);
+
+ WMA_LOGE(FL("sending WMI_NDP_RESPONDER_REQ_CMDID(0x%X)"),
+ WMI_NDP_RESPONDER_REQ_CMDID);
ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
WMI_NDP_RESPONDER_REQ_CMDID);
if (ret < 0) {
@@ -473,11 +504,14 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info,
WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_discovery_mac_addr,
ind_event->peer_discovery_mac_addr.bytes);
- WMA_LOGD(FL("WMI_NDP_INDICATION_EVENTID(0x%X) received. vdev %d, service_instance %d, ndp_instance %d, role %d, policy %d, peer_mac_addr: %pM, peer_disc_mac_addr: %pM"),
+ WMA_LOGD(FL("WMI_NDP_INDICATION_EVENTID(0x%X) received. vdev %d, \n"
+ "service_instance %d, ndp_instance %d, role %d, policy %d, \n"
+ "csid: %d, scid_len: %d, peer_mac_addr: %pM, peer_disc_mac_addr: %pM"),
WMI_NDP_INDICATION_EVENTID, fixed_params->vdev_id,
fixed_params->service_instance_id,
fixed_params->ndp_instance_id, fixed_params->self_ndp_role,
fixed_params->accept_policy,
+ fixed_params->nan_csid, fixed_params->nan_scid_len,
ind_event->peer_mac_addr.bytes,
ind_event->peer_discovery_mac_addr.bytes);
@@ -490,6 +524,8 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info,
&event->ndp_app_info, fixed_params->ndp_app_info_len);
ind_event->ndp_config.ndp_cfg_len = fixed_params->ndp_cfg_len;
ind_event->ndp_info.ndp_app_info_len = fixed_params->ndp_app_info_len;
+ ind_event->ncs_sk_type = fixed_params->nan_csid;
+ ind_event->scid.scid_len = fixed_params->nan_scid_len;
if (ind_event->ndp_config.ndp_cfg_len) {
ind_event->ndp_config.ndp_cfg =
@@ -516,6 +552,24 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info,
event->ndp_app_info,
ind_event->ndp_info.ndp_app_info_len);
}
+
+ if (ind_event->scid.scid_len) {
+ ind_event->scid.scid =
+ vos_mem_malloc(ind_event->scid.scid_len);
+ if (NULL == ind_event->scid.scid) {
+ WMA_LOGE(FL("malloc failed"));
+ vos_mem_free(ind_event->ndp_config.ndp_cfg);
+ vos_mem_free(ind_event->ndp_info.ndp_app_info);
+ vos_mem_free(ind_event);
+ return VOS_STATUS_E_NOMEM;
+ }
+ vos_mem_copy(ind_event->scid.scid,
+ event->ndp_scid, ind_event->scid.scid_len);
+ WMA_LOGD(FL("scid hex dump:"));
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG,
+ ind_event->scid.scid, ind_event->scid.scid_len);
+ }
+
pe_msg.type = SIR_HAL_NDP_INDICATION;
pe_msg.bodyptr = ind_event;
pe_msg.bodyval = 0;
@@ -526,6 +580,7 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info,
WMA_LOGE(FL("fail to post SIR_HAL_NDP_INDICATION msg to PE"));
vos_mem_free(ind_event->ndp_config.ndp_cfg);
vos_mem_free(ind_event->ndp_info.ndp_app_info);
+ vos_mem_free(ind_event->scid.scid);
vos_mem_free(ind_event);
}
diff --git a/CORE/SME/src/nan/nan_datapath_api.c b/CORE/SME/src/nan/nan_datapath_api.c
index a8fa921cda7d..e9eff93e0a41 100644
--- a/CORE/SME/src/nan/nan_datapath_api.c
+++ b/CORE/SME/src/nan/nan_datapath_api.c
@@ -30,6 +30,46 @@
#include "sme_nan_datapath.h"
/**
+ * csr_free_ndp_initiator_req() - free resouces from sme command for ndp
+ * initiator request
+ * @cmd: sme command msg
+ *
+ * Return: None
+ */
+void csr_free_ndp_initiator_req(tSmeCmd *cmd)
+{
+ vos_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg);
+ cmd->u.initiator_req.ndp_config.ndp_cfg = NULL;
+ cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0;
+ vos_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info);
+ cmd->u.initiator_req.ndp_info.ndp_app_info = NULL;
+ cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0;
+ vos_mem_free(cmd->u.initiator_req.pmk.pmk);
+ cmd->u.initiator_req.pmk.pmk = NULL;
+ cmd->u.initiator_req.pmk.pmk_len = 0;
+}
+
+/**
+ * csr_free_ndp_responder_req() - free resouces from sme command for ndp
+ * responder request
+ * @cmd: sme command msg
+ *
+ * Return: None
+ */
+void csr_free_ndp_responder_req(tSmeCmd *cmd)
+{
+ vos_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg);
+ cmd->u.responder_req.ndp_config.ndp_cfg = NULL;
+ cmd->u.responder_req.ndp_config.ndp_cfg_len = 0;
+ vos_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info);
+ cmd->u.responder_req.ndp_info.ndp_app_info = NULL;
+ cmd->u.responder_req.ndp_info.ndp_app_info_len = 0;
+ vos_mem_free(cmd->u.responder_req.pmk.pmk);
+ cmd->u.responder_req.pmk.pmk = NULL;
+ cmd->u.responder_req.pmk.pmk_len = 0;
+}
+
+/**
* sme_ndp_initiator_req_handler() - ndp initiator req handler
* @hal: hal handle
* @req_params: request parameters
@@ -67,12 +107,13 @@ eHalStatus sme_ndp_initiator_req_handler(tHalHandle hal,
/* pointers copied as part of above operation are to be overwritten */
cmd->u.initiator_req.ndp_info.ndp_app_info = NULL;
cmd->u.initiator_req.ndp_config.ndp_cfg = NULL;
+ cmd->u.initiator_req.pmk.pmk = NULL;
if (req_params->ndp_info.ndp_app_info_len) {
cmd->u.initiator_req.ndp_info.ndp_app_info =
vos_mem_malloc(req_params->ndp_info.ndp_app_info_len);
if (NULL == cmd->u.initiator_req.ndp_info.ndp_app_info) {
- csrReleaseCommandRoam(mac_ctx, cmd);
+ csr_release_ndp_initiator_req(mac_ctx, cmd);
sme_ReleaseGlobalLock(&mac_ctx->sme);
return eHAL_STATUS_FAILED_ALLOC;
}
@@ -85,11 +126,8 @@ eHalStatus sme_ndp_initiator_req_handler(tHalHandle hal,
cmd->u.initiator_req.ndp_config.ndp_cfg =
vos_mem_malloc(req_params->ndp_config.ndp_cfg_len);
if (NULL == cmd->u.initiator_req.ndp_config.ndp_cfg) {
- csrReleaseCommandRoam(mac_ctx, cmd);
+ csr_release_ndp_initiator_req(mac_ctx, cmd);
sme_ReleaseGlobalLock(&mac_ctx->sme);
- vos_mem_free(
- cmd->u.initiator_req.ndp_info.ndp_app_info);
- cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0;
return eHAL_STATUS_FAILED_ALLOC;
}
vos_mem_copy(cmd->u.initiator_req.ndp_config.ndp_cfg,
@@ -97,6 +135,18 @@ eHalStatus sme_ndp_initiator_req_handler(tHalHandle hal,
req_params->ndp_config.ndp_cfg_len);
}
+ if (req_params->pmk.pmk_len) {
+ cmd->u.initiator_req.pmk.pmk =
+ vos_mem_malloc(req_params->pmk.pmk_len);
+ if (NULL == cmd->u.initiator_req.pmk.pmk) {
+ csr_release_ndp_initiator_req(mac_ctx, cmd);
+ sme_ReleaseGlobalLock(&mac_ctx->sme);
+ return eHAL_STATUS_FAILED_ALLOC;
+ }
+ vos_mem_copy(cmd->u.initiator_req.pmk.pmk,
+ req_params->pmk.pmk, req_params->pmk.pmk_len);
+ }
+
status = csrQueueSmeCommand(mac_ctx, cmd, TRUE);
if (eHAL_STATUS_SUCCESS != status) {
smsLog(mac_ctx, LOGE, FL("SME enqueue failed, status:%d"),
@@ -150,12 +200,13 @@ eHalStatus sme_ndp_responder_req_handler(tHalHandle hal,
*/
cmd->u.responder_req.ndp_info.ndp_app_info = NULL;
cmd->u.responder_req.ndp_config.ndp_cfg = NULL;
+ cmd->u.responder_req.pmk.pmk = NULL;
if (req_params->ndp_info.ndp_app_info_len) {
cmd->u.responder_req.ndp_info.ndp_app_info =
vos_mem_malloc(req_params->ndp_info.ndp_app_info_len);
if (NULL == cmd->u.responder_req.ndp_info.ndp_app_info) {
- csrReleaseCommandRoam(mac_ctx, cmd);
+ csr_release_ndp_responder_req(mac_ctx, cmd);
sme_ReleaseGlobalLock(&mac_ctx->sme);
return eHAL_STATUS_FAILED_ALLOC;
}
@@ -168,11 +219,8 @@ eHalStatus sme_ndp_responder_req_handler(tHalHandle hal,
cmd->u.responder_req.ndp_config.ndp_cfg =
vos_mem_malloc(req_params->ndp_config.ndp_cfg_len);
if (NULL == cmd->u.responder_req.ndp_config.ndp_cfg) {
- csrReleaseCommandRoam(mac_ctx, cmd);
+ csr_release_ndp_responder_req(mac_ctx, cmd);
sme_ReleaseGlobalLock(&mac_ctx->sme);
- vos_mem_free(
- cmd->u.responder_req.ndp_info.ndp_app_info);
- cmd->u.responder_req.ndp_info.ndp_app_info_len = 0;
return eHAL_STATUS_FAILED_ALLOC;
}
vos_mem_copy(cmd->u.responder_req.ndp_config.ndp_cfg,
@@ -180,6 +228,18 @@ eHalStatus sme_ndp_responder_req_handler(tHalHandle hal,
req_params->ndp_config.ndp_cfg_len);
}
+ if (req_params->pmk.pmk_len) {
+ cmd->u.responder_req.pmk.pmk =
+ vos_mem_malloc(req_params->pmk.pmk_len);
+ if (NULL == cmd->u.responder_req.pmk.pmk) {
+ csr_release_ndp_responder_req(mac_ctx, cmd);
+ sme_ReleaseGlobalLock(&mac_ctx->sme);
+ return eHAL_STATUS_FAILED_ALLOC;
+ }
+ vos_mem_copy(cmd->u.responder_req.pmk.pmk,
+ req_params->pmk.pmk, req_params->pmk.pmk_len);
+ }
+
status = csrQueueSmeCommand(mac_ctx, cmd, TRUE);
if (eHAL_STATUS_SUCCESS != status) {
smsLog(mac_ctx, LOGE,
@@ -414,14 +474,17 @@ eHalStatus csr_process_ndp_initiator_request(tpAniSirGlobal mac_ctx,
if (NULL == cmd) {
smsLog(mac_ctx, LOGE, FL("Invalid req_params"));
- return eHAL_STATUS_INVALID_PARAMETER;
+ status = eHAL_STATUS_INVALID_PARAMETER;
+ goto sme_initiator_req_failed;
}
req = &cmd->u.initiator_req;
msg_len = sizeof(*lim_msg);
lim_msg = vos_mem_malloc(msg_len);
- if (NULL == lim_msg)
- return eHAL_STATUS_FAILED_ALLOC;
+ if (NULL == lim_msg) {
+ status = eHAL_STATUS_FAILED_ALLOC;
+ goto sme_initiator_req_failed;
+ }
vos_mem_set(lim_msg, msg_len, 0);
lim_msg->msg_type =
@@ -440,18 +503,11 @@ eHalStatus csr_process_ndp_initiator_request(tpAniSirGlobal mac_ctx,
MAC_ADDR_ARRAY(self_mac_addr));
status = palSendMBMessage(mac_ctx->hHdd, lim_msg);
- if (!HAL_STATUS_SUCCESS(status)) {
- /*
- * If fail, free up the ndp_cfg and ndp_app_info
- * allocated in sme.
- */
- vos_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info);
- vos_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg);
- cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0;
- cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0;
- cmd->u.initiator_req.ndp_config.ndp_cfg = NULL;
- cmd->u.initiator_req.ndp_info.ndp_app_info = NULL;
- }
+
+sme_initiator_req_failed:
+ /* If fail, free up resources allocated in sme. */
+ if (!HAL_STATUS_SUCCESS(status))
+ csr_free_ndp_initiator_req(cmd);
return status;
}
@@ -487,9 +543,9 @@ eHalStatus csr_process_ndp_responder_request(tpAniSirGlobal mac_ctx,
pal_cpu_to_be16((uint16_t)eWNI_SME_NDP_RESPONDER_REQ);
lim_msg->msg_len = pal_cpu_to_be16(msg_len);
/*
- * following is being copied from p_cmd->u.initiator_req,
+ * following is being copied from p_cmd->u.responder_req,
* no need to perform deep copy, as we are going to use memory
- * allocated at SME in p_cmd->u.initiator_req and pass it all the way
+ * allocated at SME in p_cmd->u.responder_req and pass it all the way
* to WMA.
*/
vos_mem_copy(&lim_msg->req, &cmd->u.responder_req,
@@ -504,18 +560,9 @@ eHalStatus csr_process_ndp_responder_request(tpAniSirGlobal mac_ctx,
status = palSendMBMessage(mac_ctx->hHdd, lim_msg);
free_config:
- if (!HAL_STATUS_SUCCESS(status)) {
- /*
- * If fail, free up the ndp_cfg and ndp_app_info
- * allocated in sme.
- */
- vos_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info);
- vos_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg);
- cmd->u.responder_req.ndp_info.ndp_app_info_len = 0;
- cmd->u.responder_req.ndp_config.ndp_cfg_len = 0;
- cmd->u.responder_req.ndp_config.ndp_cfg = NULL;
- cmd->u.responder_req.ndp_info.ndp_app_info = NULL;
- }
+ /* If fail, free up the ndp_cfg and ndp_app_info allocated in sme. */
+ if (!HAL_STATUS_SUCCESS(status))
+ csr_free_ndp_responder_req(cmd);
return status;
}
@@ -716,11 +763,10 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, vos_msg_t *msg)
}
break;
case eWNI_SME_NDP_INDICATION:
+ vos_mem_free(roam_info.ndp.ndp_indication_params.scid.scid);
+ vos_mem_free(roam_info.ndp.ndp_indication_params.ndp_config.ndp_cfg);
vos_mem_free(
- roam_info.ndp.ndp_indication_params.ndp_config.ndp_cfg);
- vos_mem_free(
- roam_info.ndp.ndp_indication_params.
- ndp_info.ndp_app_info);
+ roam_info.ndp.ndp_indication_params.ndp_info.ndp_app_info);
break;
case eWNI_SME_NDP_END_RSP:
if (cmd &&
@@ -745,6 +791,7 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, vos_msg_t *msg)
/**
* csr_release_ndp_initiator_req() - free resouces from sme command for ndp
+ * and release the cmd
* initiator request
* @mac_ctx: Global MAC context
* @cmd: sme command msg
@@ -753,19 +800,13 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, vos_msg_t *msg)
*/
void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd)
{
- vos_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg);
- cmd->u.initiator_req.ndp_config.ndp_cfg = NULL;
- cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0;
- vos_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info);
- cmd->u.initiator_req.ndp_info.ndp_app_info = NULL;
- cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0;
+ csr_free_ndp_initiator_req(cmd);
smeReleaseCommand(mac_ctx, cmd);
}
-
/**
* csr_release_ndp_responder_req() - free resouces from sme command for ndp
- * responder request
+ * responder request and release the command
* @mac_ctx: Global MAC context
* @cmd: sme command msg
*
@@ -773,16 +814,10 @@ void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd)
*/
void csr_release_ndp_responder_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd)
{
- vos_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg);
- cmd->u.responder_req.ndp_config.ndp_cfg = NULL;
- cmd->u.responder_req.ndp_config.ndp_cfg_len = 0;
- vos_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info);
- cmd->u.responder_req.ndp_info.ndp_app_info = NULL;
- cmd->u.responder_req.ndp_info.ndp_app_info_len = 0;
+ csr_free_ndp_responder_req(cmd);
smeReleaseCommand(mac_ctx, cmd);
}
-
/**
* csr_release_ndp_data_end_req() - free resouces from sme command for ndp
* data end request