summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx.c3
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c64
-rw-r--r--CORE/HDD/src/wlan_hdd_wmm.c17
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c62
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h46
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_trace.c6
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h51
7 files changed, 194 insertions, 55 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.c b/CORE/CLD_TXRX/TXRX/ol_tx.c
index dae35b756bbc..890303999a85 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx.c
@@ -671,8 +671,7 @@ ol_tx_hl_base(
if (adf_os_atomic_read(&pdev->tx_queue.rsrc_cnt) >
TXRX_HL_TX_DESC_HI_PRIO_RESERVED) {
tx_desc = ol_tx_desc_hl(pdev, vdev, msdu, &tx_msdu_info);
- } else if ((adf_nbuf_is_dhcp_pkt(msdu) == A_STATUS_OK)
- || (adf_nbuf_is_eapol_pkt(msdu) == A_STATUS_OK)) {
+ } else if (ADF_NBUF_GET_IS_DHCP(msdu) || ADF_NBUF_GET_IS_EAPOL(msdu)) {
tx_desc = ol_tx_desc_hl(pdev, vdev, msdu, &tx_msdu_info);
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
"Provided tx descriptor from reserve pool for DHCP/EAPOL\n");
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index f86e99f5cf28..cfe12b02face 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -91,38 +91,6 @@ const v_U8_t hdd_QdiscAcToTlAC[] = {
Function definitions and documentation
-------------------------------------------------------------------------*/
-/**
- * wlan_hdd_is_wai() - Check if frame is EAPOL or WAPI
- * @skb: skb data
- *
- * This function checks if the frame is EAPOL or WAPI.
- * single routine call will check for both types, thus avoiding
- * data path performance penalty.
- *
- * Return: true (1) if packet is EAPOL or WAPI
- *
- */
-static bool wlan_hdd_is_eapol_or_wai(struct sk_buff *skb)
-{
- uint16_t ether_type;
-
- if (!skb) {
- hddLog(VOS_TRACE_LEVEL_ERROR, FL("skb is NULL"));
- return false;
- }
-
- ether_type = (uint16_t)(*(uint16_t *)
- (skb->data + HDD_ETHERTYPE_802_1_X_FRAME_OFFSET));
-
- if (ether_type == VOS_SWAP_U16(HDD_ETHERTYPE_802_1_X) ||
- ether_type == VOS_SWAP_U16(HDD_ETHERTYPE_WAI))
- return true;
-
- /* No error msg handled since this will happen often */
- return false;
-}
-
-
/**============================================================================
@brief hdd_flush_tx_queues() - Utility function to flush the TX queues
@@ -404,6 +372,33 @@ void hdd_drop_skb_list(hdd_adapter_t *adapter, struct sk_buff *skb,
}
}
+/**
+ * wlan_hdd_classify_pkt() - classify skb packet type.
+ * @data: Pointer to skb
+ *
+ * This function classifies skb packet type.
+ *
+ * Return: none
+ */
+void wlan_hdd_classify_pkt(struct sk_buff *skb)
+{
+ /* classify broadcast/multicast packet */
+ if (adf_nbuf_is_bcast_pkt(skb))
+ ADF_NBUF_SET_BCAST(skb);
+ else if (adf_nbuf_is_multicast_pkt(skb))
+ ADF_NBUF_SET_MCAST(skb);
+
+ /* classify eapol/arp/dhcp/wai packet */
+ if (adf_nbuf_is_eapol_pkt(skb))
+ ADF_NBUF_SET_EAPOL(skb);
+ else if (adf_nbuf_is_ipv4_arp_pkt(skb))
+ ADF_NBUF_SET_ARP(skb);
+ else if (adf_nbuf_is_dhcp_pkt(skb))
+ ADF_NBUF_SET_DHCP(skb);
+ else if (adf_nbuf_is_wai_pkt(skb))
+ ADF_NBUF_SET_WAPI(skb);
+}
+
/**============================================================================
@brief hdd_hard_start_xmit() - Function registered with the Linux OS for
transmitting packets. This version of the function directly passes the packet
@@ -453,6 +448,9 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
while (skb) {
skb_next = skb->next;
+ /* memset skb control block */
+ vos_mem_zero(skb->cb, sizeof(skb->cb));
+ wlan_hdd_classify_pkt(skb);
if (WLAN_HDD_IBSS == pAdapter->device_mode)
{
v_MACADDR_t *pDestMacAddress = (v_MACADDR_t*)skb->data;
@@ -561,7 +559,7 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
likely(
pAdapter->hddWmmStatus.wmmAcStatus[ac].wmmAcAccessAllowed)) ||
((pHddStaCtx->conn_info.uIsAuthenticated == VOS_FALSE) &&
- wlan_hdd_is_eapol_or_wai(skb)))
+ (ADF_NBUF_GET_IS_EAPOL(skb) || ADF_NBUF_GET_IS_WAPI(skb))))
{
granted = VOS_TRUE;
}
diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c
index ff929711f767..5d586e9d50fa 100644
--- a/CORE/HDD/src/wlan_hdd_wmm.c
+++ b/CORE/HDD/src/wlan_hdd_wmm.c
@@ -1634,23 +1634,6 @@ VOS_STATUS hdd_wmm_adapter_close ( hdd_adapter_t* pAdapter )
}
/**============================================================================
- @brief is_dhcp_packet() - Function which will check OS packet for
- DHCP packet
-
- @param skb : [in] pointer to OS packet (sk_buff)
- @return : VOS_TRUE if the OS packet is DHCP packet
- : otherwise VOS_FALSE
- ===========================================================================*/
-v_BOOL_t is_dhcp_packet(struct sk_buff *skb)
-{
- if (*((u16*)((u8*)skb->data+34)) == DHCP_SOURCE_PORT ||
- *((u16*)((u8*)skb->data+34)) == DHCP_DESTINATION_PORT)
- return VOS_TRUE;
-
- return VOS_FALSE;
-}
-
-/**============================================================================
@brief hdd_wmm_classify_pkt() - Function which will classify an OS packet
into a WMM AC based on either 802.1Q or DSCP
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index 944894f25531..81494f127492 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -1159,3 +1159,65 @@ __adf_nbuf_validate_skb_cb(void)
BUILD_BUG_ON(sizeof(struct cvg_nbuf_cb) >
FIELD_SIZEOF(struct sk_buff, cb));
}
+
+/**
+ * __adf_nbuf_is_wai() - Check if frame is WAI
+ * @data: pointer to skb data buffer
+ *
+ * This function checks if the frame is WAPI.
+ *
+ * Return: true (1) if WAPI
+ *
+ */
+bool __adf_nbuf_is_wai_pkt(uint8_t *data)
+{
+ uint16_t ether_type;
+
+ ether_type = (uint16_t)(*(uint16_t *)
+ (data + ADF_NBUF_TRAC_ETH_TYPE_OFFSET));
+
+ if (ether_type == VOS_SWAP_U16(ADF_NBUF_TRAC_WAI_ETH_TYPE))
+ return true;
+
+ return false;
+}
+
+/**
+ * __adf_nbuf_is_group_pkt() - Check if frame is multicast packet
+ * @data: pointer to skb data buffer
+ *
+ * This function checks if the frame is multicast packet.
+ *
+ * Return: true (1) if multicast
+ *
+ */
+bool __adf_nbuf_is_multicast_pkt(uint8_t *data)
+{
+ struct adf_mac_addr *mac_addr = (struct adf_mac_addr*)data;
+
+ if ( mac_addr->bytes[0] & 0x01 )
+ return true;
+
+ return false;
+}
+
+/**
+ * __adf_nbuf_is_bcast_pkt() - Check if frame is broadcast packet
+ * @data: pointer to skb data buffer
+ *
+ * This function checks if the frame is broadcast packet.
+ *
+ * Return: true (1) if broadcast
+ *
+ */
+bool __adf_nbuf_is_bcast_pkt(uint8_t *data)
+{
+ struct adf_mac_addr *mac_addr = (struct adf_mac_addr*)data;
+ struct adf_mac_addr bcast_addr = VOS_MAC_ADDR_BROADCAST_INITIALIZER;
+
+ if (!memcmp( mac_addr, &bcast_addr, VOS_MAC_ADDR_SIZE))
+ return true;
+
+ return false;
+}
+
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index 860aa7f77d28..d827ac23393c 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -74,6 +74,7 @@
#define ADF_NBUF_TRAC_TCP_TYPE 6
#define ADF_NBUF_TRAC_UDP_TYPE 17
#define ADF_NBUF_TRAC_ICMPv6_TYPE 0x3a
+#define ADF_NBUF_TRAC_WAI_ETH_TYPE 0x88b4
/* EAPOL Related MASK */
#define EAPOL_PACKET_TYPE_OFFSET 15
@@ -1829,6 +1830,51 @@ adf_nbuf_update_skb_mark(adf_nbuf_t skb, uint32_t mask)
__adf_nbuf_update_skb_mark(skb, mask);
}
+/**
+ * adf_nbuf_is_wai() - Check if frame is WAI
+ * @skb: Pointer to skb
+ *
+ * This function checks if the frame is WAPI.
+ *
+ * Return: true (1) if WAPI
+ *
+ */
+static inline bool adf_nbuf_is_wai_pkt(struct sk_buff *skb)
+{
+ return __adf_nbuf_is_wai_pkt(skb->data);
+}
+
+/**
+ * adf_nbuf_is_multicast_pkt() - Check if frame is multicast packet
+ * @skb: Pointer to skb
+ *
+ * This function checks if the frame is multicast packet.
+ *
+ * Return: true (1) if multicast
+ *
+ */
+static inline bool adf_nbuf_is_multicast_pkt(struct sk_buff *skb)
+{
+ return __adf_nbuf_is_multicast_pkt(skb->data);
+}
+
+/**
+ * adf_nbuf_is_bcast_pkt() - Check if frame is broadcast packet
+ * @skb: Pointer to skb
+ *
+ * This function checks if the frame is broadcast packet.
+ *
+ * Return: true (1) if broadcast
+ *
+ */
+static inline bool adf_nbuf_is_bcast_pkt(struct sk_buff *skb)
+{
+ return __adf_nbuf_is_bcast_pkt(skb->data);
+}
+
+
+
+
void adf_nbuf_set_state(adf_nbuf_t nbuf, uint8_t current_state);
void adf_nbuf_tx_desc_count_display(void);
void adf_nbuf_tx_desc_count_clear(void);
diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.c b/CORE/SERVICES/COMMON/adf/adf_trace.c
index 0a4fddb95ff3..7720aa6fdc2d 100644
--- a/CORE/SERVICES/COMMON/adf/adf_trace.c
+++ b/CORE/SERVICES/COMMON/adf/adf_trace.c
@@ -436,7 +436,7 @@ bool adf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
enum adf_proto_subtype subtype;
if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_EAPOL) &&
- adf_nbuf_is_eapol_pkt(skb) == A_STATUS_OK) {
+ ADF_NBUF_GET_IS_EAPOL(skb)) {
subtype = adf_nbuf_get_eapol_subtype(skb);
DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_EAPOL_PACKET_RECORD,
@@ -467,7 +467,7 @@ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
enum adf_proto_subtype subtype = ADF_PROTO_INVALID;
if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_DHCP) &&
- adf_nbuf_is_dhcp_pkt(skb) == A_STATUS_OK) {
+ ADF_NBUF_GET_IS_DHCP(skb)) {
subtype = adf_nbuf_get_dhcp_subtype(skb);
DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_DHCP_PACKET_RECORD,
@@ -499,7 +499,7 @@ bool adf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
enum adf_proto_subtype proto_subtype;
if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_ARP) &&
- adf_nbuf_is_ipv4_arp_pkt(skb) == true) {
+ ADF_NBUF_GET_IS_ARP(skb)) {
proto_subtype = adf_nbuf_get_arp_subtype(skb);
diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
index 70fd459f891b..7230e5f14444 100644
--- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
+++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
@@ -153,6 +153,15 @@ struct cvg_nbuf_cb {
unsigned char tx_htt2_frm: 1;
unsigned char tx_htt2_reserved: 7;
#endif /* QCA_TX_HTT2_SUPPORT */
+ struct {
+ uint8_t is_eapol: 1;
+ uint8_t is_arp: 1;
+ uint8_t is_dhcp: 1;
+ uint8_t is_wapi: 1;
+ uint8_t is_mcast: 1;
+ uint8_t is_bcast: 1;
+ uint8_t reserved: 2;
+ } packet_type;
} __packed;
#ifdef QCA_ARP_SPOOFING_WAR
@@ -224,6 +233,25 @@ struct cvg_nbuf_cb {
#define NBUF_SET_PACKET_TRACK(skb, pkt_track) \
(((struct cvg_nbuf_cb *)((skb)->cb))->trace.packet_track = \
pkt_track)
+#define ADF_NBUF_SET_EAPOL(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_eapol = \
+ true)
+#define ADF_NBUF_SET_ARP(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_arp = \
+ true)
+#define ADF_NBUF_SET_DHCP(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_dhcp = \
+ true)
+#define ADF_NBUF_SET_WAPI(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_wapi = \
+ true)
+#define ADF_NBUF_SET_MCAST(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_mcast = \
+ true)
+#define ADF_NBUF_SET_BCAST(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_bcast = \
+ true)
+
#define NBUF_GET_PACKET_TRACK(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->trace.packet_track)
@@ -233,6 +261,26 @@ struct cvg_nbuf_cb {
#define ADF_NBUF_CB_TX_DP_TRACE(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->trace.dp_trace)
+#define ADF_NBUF_GET_IS_EAPOL(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_eapol)
+
+#define ADF_NBUF_GET_IS_ARP(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_arp)
+
+#define ADF_NBUF_GET_IS_DHCP(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_dhcp)
+
+#define ADF_NBUF_GET_IS_WAPI(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_wapi)
+
+#define ADF_NBUF_GET_IS_BCAST(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_bcast)
+
+#define ADF_NBUF_GET_IS_MCAST(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_mcast)
+
+
+
#define __adf_nbuf_get_num_frags(skb) \
/* assume the OS provides a single fragment */ \
(NBUF_NUM_EXTRA_FRAGS(skb) + 1)
@@ -356,6 +404,9 @@ enum adf_proto_subtype __adf_nbuf_data_get_eapol_subtype(uint8_t *data);
enum adf_proto_subtype __adf_nbuf_data_get_arp_subtype(uint8_t *data);
enum adf_proto_subtype __adf_nbuf_data_get_icmp_subtype(uint8_t *data);
enum adf_proto_subtype __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data);
+bool __adf_nbuf_is_bcast_pkt(uint8_t *data);
+bool __adf_nbuf_is_multicast_pkt(uint8_t *data);
+bool __adf_nbuf_is_wai_pkt(uint8_t *data);
#ifdef QCA_PKT_PROTO_TRACE