Jelajahi Sumber

qcacld-3.0: Exchange CSID cap & GTK params

To support group NDP security, WiFi-HAL and firmware introduces
two new parameters (csid_cap and gtk_required) in NDP initiator
request, responder requestor and NDP indication event.

Host driver will retrieve the CSID capabilities and GTK parameter
and parse it to firmware in NDP Initiator and Responder request
TLV. Also, driver extract these parameters from NDP indication TLV
and will passes to Wifi-HAL in vendor event.

Change-Id: I4487559491754edafaccafa466512d6380b826b3
CRs-Fixed: 3583149
Rahul Gusain 1 tahun lalu
induk
melakukan
fa7ef9dc94
2 mengubah file dengan 60 tambahan dan 3 penghapusan
  1. 16 0
      components/nan/core/inc/nan_public_structs.h
  2. 44 3
      os_if/nan/src/os_if_nan.c

+ 16 - 0
components/nan/core/inc/nan_public_structs.h

@@ -367,6 +367,16 @@ struct nan_datapath_inf_delete_rsp {
 	uint32_t reason;
 };
 
+/**
+ * struct ndp_additional_params - NDP parameters
+ * @csid_cap: NAN Cipher Suite Capability field
+ * @gtk: GTK protection is required for the NDP
+ */
+struct ndp_additional_params {
+	uint32_t csid_cap;
+	uint32_t gtk;
+};
+
 /**
  * struct nan_datapath_initiator_req - ndp initiator request params
  * @vdev: pointer to vdev object
@@ -384,6 +394,7 @@ struct nan_datapath_inf_delete_rsp {
  * @service_name: service name
  * @is_ipv6_addr_present: indicates if following ipv6 address is valid
  * @ipv6_addr: ipv6 address address used by ndp
+ * @ndp_add_params: NDP additional parameters
  */
 struct nan_datapath_initiator_req {
 	struct wlan_objmgr_vdev *vdev;
@@ -401,6 +412,7 @@ struct nan_datapath_initiator_req {
 	struct ndp_service_name service_name;
 	bool is_ipv6_addr_present;
 	uint8_t ipv6_addr[QDF_IPV6_ADDR_SIZE];
+	struct ndp_additional_params ndp_add_params;
 };
 
 /**
@@ -438,6 +450,7 @@ struct nan_datapath_initiator_rsp {
  * @port: port specified by for this NDP
  * @is_protocol_present: indicates if following protocol is valid
  * @protocol: protocol used by this NDP
+ * @ndp_add_params: NDP additional parameters
  */
 struct nan_datapath_responder_req {
 	struct wlan_objmgr_vdev *vdev;
@@ -456,6 +469,7 @@ struct nan_datapath_responder_req {
 	uint16_t port;
 	bool is_protocol_present;
 	uint8_t protocol;
+	struct ndp_additional_params ndp_add_params;
 };
 
 /**
@@ -717,6 +731,7 @@ struct nan_datapath_confirm_event {
  * @ipv6_addr: ipv6 address address used by ndp
  * @is_service_id_present: indicates if service id is present
  * @service_id: NDP service id
+ * @ndp_add_params: NDP additional parameters
  */
 struct nan_datapath_indication_event {
 	struct wlan_objmgr_vdev *vdev;
@@ -734,6 +749,7 @@ struct nan_datapath_indication_event {
 	uint8_t ipv6_addr[QDF_IPV6_ADDR_SIZE];
 	bool is_service_id_present;
 	uint8_t service_id[NDP_SERVICE_ID_LEN];
+	struct ndp_additional_params ndp_add_params;
 };
 
 /**

+ 44 - 3
os_if/nan/src/os_if_nan.c

@@ -169,6 +169,13 @@ const struct nla_policy vendor_attr_policy[
 						.type = NLA_U8,
 						.len = NDP_SERVICE_ID_LEN
 	},
+	[QCA_WLAN_VENDOR_ATTR_NDP_CSIA_CAPABILITIES] = {
+						.type = NLA_U8,
+						.len = sizeof(uint8_t)
+	},
+	[QCA_WLAN_VENDOR_ATTR_NDP_GTK_REQUIRED] = {
+						.type = NLA_FLAG,
+	},
 };
 
 /**
@@ -624,14 +631,18 @@ reregister:
  * @pmk: out parameter to populate pmk
  * @passphrase: out parameter to populate passphrase
  * @service_name: out parameter to populate service_name
+ * @ndp_add_param: parameters to populate csid and gtk
  *
  * Return:  0 on success or error code on failure
  */
 static int os_if_nan_parse_security_params(struct nlattr **tb,
 			uint32_t *ncs_sk_type, struct nan_datapath_pmk *pmk,
 			struct ndp_passphrase *passphrase,
-			struct ndp_service_name *service_name)
+			struct ndp_service_name *service_name,
+			struct ndp_additional_params *ndp_add_param)
 {
+	struct nlattr *attr;
+
 	if (!ncs_sk_type || !pmk || !passphrase || !service_name) {
 		osif_err("out buffers for one or more parameters is null");
 		return -EINVAL;
@@ -678,6 +689,13 @@ static int os_if_nan_parse_security_params(struct nlattr **tb,
 				   service_name->service_name_len);
 	}
 
+	attr = tb[QCA_WLAN_VENDOR_ATTR_NDP_CSIA_CAPABILITIES];
+	if (attr)
+		ndp_add_param->csid_cap = nla_get_u8(attr);
+
+	ndp_add_param->gtk =
+			nla_get_flag(tb[QCA_WLAN_VENDOR_ATTR_NDP_GTK_REQUIRED]);
+
 	return 0;
 }
 
@@ -807,7 +825,8 @@ static int __os_if_nan_process_ndp_initiator_req(struct wlan_objmgr_psoc *psoc,
 
 	if (os_if_nan_parse_security_params(tb, &req.ncs_sk_type, &req.pmk,
 					    &req.passphrase,
-					    &req.service_name)) {
+					    &req.service_name,
+					    &req.ndp_add_params)) {
 		osif_err("inconsistent security params in request.");
 		ret = -EINVAL;
 		goto initiator_req_failed;
@@ -997,7 +1016,8 @@ static int __os_if_nan_process_ndp_responder_req(struct wlan_objmgr_psoc *psoc,
 		   req.is_protocol_present);
 
 	if (os_if_nan_parse_security_params(tb, &req.ncs_sk_type, &req.pmk,
-			&req.passphrase, &req.service_name)) {
+					    &req.passphrase, &req.service_name,
+					    &req.ndp_add_params)) {
 		osif_err("inconsistent security params in request.");
 		ret = -EINVAL;
 		goto responder_req_failed;
@@ -1410,6 +1430,14 @@ static inline uint32_t osif_ndp_get_ndp_req_ind_len(
 	if (event->is_service_id_present)
 		data_len += nla_total_size(vendor_attr_policy[
 				QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_ID].len);
+
+	if (event->ndp_add_params.csid_cap)
+		data_len += nla_total_size(vendor_attr_policy[
+			QCA_WLAN_VENDOR_ATTR_NDP_CSIA_CAPABILITIES].len);
+	if (event->ndp_add_params.gtk)
+		data_len += nla_total_size(vendor_attr_policy[
+				QCA_WLAN_VENDOR_ATTR_NDP_GTK_REQUIRED].len);
+
 	return data_len;
 }
 
@@ -1558,6 +1586,19 @@ static void os_if_ndp_indication_handler(struct wlan_objmgr_vdev *vdev,
 			goto ndp_indication_nla_failed;
 	}
 
+	if (event->ndp_add_params.csid_cap) {
+		if (nla_put_u8(vendor_event,
+			       QCA_WLAN_VENDOR_ATTR_NDP_CSIA_CAPABILITIES,
+			       event->ndp_add_params.csid_cap))
+			goto ndp_indication_nla_failed;
+	}
+
+	if (event->ndp_add_params.gtk) {
+		if (nla_put_flag(vendor_event,
+				 QCA_WLAN_VENDOR_ATTR_NDP_GTK_REQUIRED))
+			goto ndp_indication_nla_failed;
+	}
+
 	wlan_cfg80211_vendor_event(vendor_event, GFP_ATOMIC);
 	return;
 ndp_indication_nla_failed: