Selaa lähdekoodia

qca-wifi: Add new feature to support protocol tags.

With this feature, using appropriate commands, link layer, network layer,
transport layer and some of the application protocols can be tagged with
the user provided tag values for easier identification of protocols. The
supported protocols today are as follows.

ARP, DHCPv4, DHCPv6, DNS over TCP (v4), DNS over TCP (v6), DNS over UDP
(v4), DNS over UDP (v6), ICMPv4, ICMPv6, TCPv4, TCPv6, UDPv4,
UDPv6, IPv4, IPv6, EAP.

Receive packets are tagged by hardware. Tags are applied after the first
matching rule. Hence it is recommended that the rules are
programmed in such a way that tags are configured from application layer
to data link layer to get expected results.

Change-Id: Idd47cbab5882cef4530a19c0d96f52f9a47de6d4
Karunakar Dasineni 6 vuotta sitten
vanhempi
sitoutus
a7ec8895c5
3 muutettua tiedostoa jossa 91 lisäystä ja 0 poistoa
  1. 13 0
      wmi/inc/wmi_unified_ap_api.h
  2. 21 0
      wmi/src/wmi_unified_ap_api.c
  3. 57 0
      wmi/src/wmi_unified_ap_tlv.c

+ 13 - 0
wmi/inc/wmi_unified_ap_api.h

@@ -274,4 +274,17 @@ QDF_STATUS wmi_unified_vdev_pcp_tid_map_cmd_send(void *wmi_hdl,
  */
 QDF_STATUS wmi_unified_vdev_tidmap_prec_cmd_send(void *wmi_hdl,
 					struct vap_tidmap_prec_params *param);
+
+#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
+/**
+ * wmi_unified_set_rx_pkt_type_routing_tag() - api to add/delete
+ * the protocols to be tagged by CCE
+ * @wmi_hdl: wmi handle
+ * @param: Packet routing/tagging info
+ *
+ * @return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS wmi_unified_set_rx_pkt_type_routing_tag(
+	void *wmi_hdl, struct wmi_rx_pkt_protocol_routing_info *param);
+#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
 #endif /* _WMI_UNIFIED_AP_API_H_ */

+ 21 - 0
wmi/src/wmi_unified_ap_api.c

@@ -1181,3 +1181,24 @@ wmi_unified_vdev_tidmap_prec_cmd_send(void *wmi_hdl,
 
 	return QDF_STATUS_E_FAILURE;
 }
+
+#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
+/**
+ * wmi_unified_set_rx_pkt_protocol_routing_tag() - api to add/delete the
+ *					protocols to be tagged by CCE
+ * @wmi_hdl: wmi handle
+ * @param: Packet routing/tagging info
+ *
+ * @return QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE on failure
+ */
+QDF_STATUS wmi_unified_set_rx_pkt_type_routing_tag(
+		void *wmi_hdl, struct wmi_rx_pkt_protocol_routing_info *param)
+{
+	wmi_unified_t wmi = (wmi_unified_t)wmi_hdl;
+
+	if (wmi->ops->set_rx_pkt_type_routing_tag_cmd)
+		return wmi->ops->set_rx_pkt_type_routing_tag_cmd(wmi, param);
+
+	return QDF_STATUS_E_FAILURE;
+}
+#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */

+ 57 - 0
wmi/src/wmi_unified_ap_tlv.c

@@ -1887,6 +1887,59 @@ static QDF_STATUS extract_pdev_caldata_version_check_ev_param_tlv(
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
+/**
+ * set_rx_pkt_type_routing_tag_update_tlv() - add/delete protocol tag in CCE
+ * @wmi_handle: wmi handle
+ * @param evt_buf: pointer to event buffer
+ * @param param: pointer to protocol tag/routing struct
+ *
+ * @return:QDF_STATUS_SUCCESS for success or
+ *			QDF_STATUS_E_NOMEM/QDF_STATUS_E_FAILURE on failure
+*/
+static QDF_STATUS set_rx_pkt_type_routing_tag_update_tlv(
+			void *wmi_hdl,
+			struct wmi_rx_pkt_protocol_routing_info *param)
+{
+	wmi_pdev_update_pkt_routing_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	QDF_STATUS status;
+	uint32_t len = sizeof(wmi_pdev_update_pkt_routing_cmd_fixed_param);
+
+	buf = wmi_buf_alloc(wmi_hdl, len);
+	if (!buf) {
+		WMI_LOGE("%s : wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	cmd = (wmi_pdev_update_pkt_routing_cmd_fixed_param *)wmi_buf_data(buf);
+		WMITLV_SET_HDR(&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_pdev_update_pkt_routing_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+	wmi_pdev_update_pkt_routing_cmd_fixed_param));
+	cmd->pdev_id = param->pdev_id;
+	cmd->op_code = (A_UINT32) param->op_code;
+	cmd->routing_type_bitmap = param->routing_type_bitmap;
+	cmd->dest_ring = param->dest_ring;
+	cmd->meta_data = param->meta_data;
+	cmd->dest_ring_handler = param->dest_ring_handler;
+	WMI_LOGI("Set RX PKT ROUTING TYPE TAG - opcode: %u", param->op_code);
+	WMI_LOGI("routing_bitmap: %u, dest_ring: %u",
+		 param->routing_type_bitmap, param->dest_ring);
+	WMI_LOGI("dest_ring_handler: %u, meta_data: 0x%x",
+		 param->dest_ring_handler, param->meta_data);
+
+	wmi_mtrace(WMI_PDEV_UPDATE_PKT_ROUTING_CMDID, cmd->pdev_id, 0);
+	status = wmi_unified_cmd_send(wmi_hdl, buf, len,
+				      WMI_PDEV_UPDATE_PKT_ROUTING_CMDID);
+	if (status != QDF_STATUS_SUCCESS) {
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
+
 #ifdef WLAN_SUPPORT_FILS
 /**
  * send_vdev_fils_enable_cmd_tlv() - enable/Disable FD Frame command to fw
@@ -2759,4 +2812,8 @@ void wmi_ap_attach_tlv(wmi_unified_t wmi_handle)
 	ops->extract_channel_hopping_event = extract_channel_hopping_event_tlv;
 	ops->send_peer_chan_width_switch_cmd =
 					send_peer_chan_width_switch_cmd_tlv;
+#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
+	ops->set_rx_pkt_type_routing_tag_cmd =
+					set_rx_pkt_type_routing_tag_update_tlv;
+#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
 }