瀏覽代碼

qcacmn: Introduce new QDF API's to handle skb and net dev requirements

Introduce new QDF API's to handle skb and net dev handling in
os abstract code.

Change-Id: If5a460df2c6c1b4068909fed6e5b3036623c2093
CRs-Fixed: 3164916
Karthik Kantamneni 3 年之前
父節點
當前提交
6380170e35

+ 156 - 2
qdf/inc/qdf_nbuf.h

@@ -169,8 +169,9 @@
 #define QDF_NBUF_TX_PKT_HIF                  7
 #define QDF_NBUF_TX_PKT_CE                   8
 #define QDF_NBUF_TX_PKT_FREE                 9
-#define QDF_NBUF_TX_PKT_STATE_MAX            10
-#define QDF_NBUF_TX_PKT_LI_DP                11
+#define QDF_NBUF_TX_PKT_LI_DP                10
+#define QDF_NBUF_TX_PKT_DP                   11
+#define QDF_NBUF_TX_PKT_STATE_MAX            12
 
 /* nbuf allocations only come from one domain */
 #define QDF_DEBUG_NBUF_DOMAIN		     0
@@ -2213,6 +2214,32 @@ static inline qdf_nbuf_t qdf_nbuf_unshare(qdf_nbuf_t buf)
 }
 #endif /* NBUF_MEMORY_DEBUG */
 
+/**
+ * qdf_nbuf_kfree() - Free nbuf using kfree
+ * @buf: Pointer to network buffer
+ *
+ * This function is called to free the skb on failure cases
+ *
+ * Return: None
+ */
+static inline void qdf_nbuf_kfree(qdf_nbuf_t buf)
+{
+	__qdf_nbuf_kfree(buf);
+}
+
+/**
+ * qdf_nbuf_dev_kfree() - Free nbuf using dev based os call
+ * @buf: Pointer to network buffer
+ *
+ * This function is called to free the skb on failure cases
+ *
+ * Return: None
+ */
+static inline void qdf_nbuf_dev_kfree(qdf_nbuf_t buf)
+{
+	__qdf_nbuf_dev_kfree(buf);
+}
+
 /**
  * qdf_nbuf_copy_expand_fraglist() - copy and expand nbuf and
  * get reference of the fraglist.
@@ -2542,6 +2569,43 @@ static inline void qdf_nbuf_set_dev_scratch(qdf_nbuf_t buf, unsigned long value)
 	__qdf_nbuf_set_dev_scratch(buf, value);
 }
 
+/**
+ * qdf_nbuf_set_dev() - set dev in network buffer
+ * @buf: Pointer to network buffer
+ * @dev: netdev to be set in network buffer
+ *
+ * Return: void
+ */
+static inline
+void qdf_nbuf_set_dev(qdf_nbuf_t nbuf, qdf_netdev_t dev)
+{
+	__qdf_nbuf_set_dev(nbuf, dev);
+}
+
+/**
+ * qdf_nbuf_get_dev_mtu() - get dev mtu in n/w buffer
+ * @buf: Pointer to network buffer
+ *
+ * Return: dev mtu value in nbuf
+ */
+static inline
+unsigned int qdf_nbuf_get_dev_mtu(qdf_nbuf_t nbuf)
+{
+	return __qdf_nbuf_get_dev_mtu(nbuf);
+}
+
+/**
+ * qdf_nbuf_set_protocol_eth_tye_trans() - set protocol using eth trans os API
+ * @buf: Pointer to network buffer
+ *
+ * Return: None
+ */
+static inline
+void qdf_nbuf_set_protocol_eth_tye_trans(qdf_nbuf_t nbuf)
+{
+	__qdf_nbuf_set_protocol_eth_type_trans(nbuf);
+}
+
 /**
  * qdf_nbuf_peek_header() - return the data pointer & length of the header
  * @buf: Network nbuf
@@ -3786,6 +3850,62 @@ bool qdf_nbuf_is_bcast_pkt(qdf_nbuf_t buf)
 	return __qdf_nbuf_is_bcast_pkt(buf);
 }
 
+/**
+ * qdf_nbuf_pkt_type_is_mcast() - check if skb pkt type is mcast
+ * @buf: Network buffer
+ *
+ * Return: TRUE if skb pkt type is mcast
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_pkt_type_is_mcast(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_pkt_type_is_mcast(buf);
+}
+
+/**
+ * qdf_nbuf_pkt_type_is_bcast() - check if skb pkt type is bcast
+ * @buf: Network buffer
+ *
+ * Return: TRUE if skb pkt type is mcast
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_pkt_type_is_bcast(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_pkt_type_is_bcast(buf);
+}
+
+/**
+ * qdf_nbuf_is_mcast_replay() - check if it is multicast replay packet.
+ * @buf: Network buffer
+ *
+ * This func. checks whether packet is multicast replay packet or not.
+ *
+ * Return: TRUE if it is multicast packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_mcast_replay(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_is_mcast_replay(buf);
+}
+
+/**
+ * qdf_nbuf_is_arp_local() - check if it is local or no local arp
+ * @buf: Network buffer
+ *
+ * This func. checks whether packet is local or no local arp.
+ *
+ * Return: TRUE if it is broadcast packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_arp_local(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_is_arp_local(buf);
+}
+
 /**
  * qdf_nbuf_reset_num_frags() - decrement the number of fragments
  * @buf: Network buffer
@@ -3883,6 +4003,29 @@ static inline uint16_t qdf_nbuf_get_gso_segs(qdf_nbuf_t nbuf)
 	return __qdf_nbuf_get_gso_segs(nbuf);
 }
 
+/**
+ * qdf_nbuf_get_gso_size() - Return the number of gso size in
+ * nbuf
+ * @nbuf: Network buffer
+ *
+ * Return: number of gso segments in nbuf
+ */
+static inline unsigned int qdf_nbuf_get_gso_size(qdf_nbuf_t nbuf)
+{
+	return __qdf_nbuf_get_gso_size(nbuf);
+}
+
+/**
+ * qdf_nbuf_set_gso_size() - Set the gso size in nbuf
+ * @skb: Pointer to network buffer
+ *
+ * Return: Return the number of gso segments
+ */
+static inline void  qdf_nbuf_set_gso_size(qdf_nbuf_t nbuf, unsigned int val)
+{
+	__qdf_nbuf_set_gso_size(nbuf, val);
+}
+
 /**
  * qdf_nbuf_inc_users() - function to increment the number of
  * users referencing this network buffer
@@ -4058,6 +4201,17 @@ static inline qdf_size_t qdf_nbuf_l2l3l4_hdr_len(qdf_nbuf_t buf)
 	return __qdf_nbuf_l2l3l4_hdr_len(buf);
 }
 
+/**
+ * qdf_nbuf_get_tcp_hdr_len() - return TCP header length of the skb
+ * @skb: sk buff
+ *
+ * Return: size of TCP header length
+ */
+static inline size_t qdf_nbuf_get_tcp_hdr_len(qdf_nbuf_t nbuf)
+{
+	return __qdf_nbuf_get_tcp_hdr_len(nbuf);
+}
+
 static inline bool qdf_nbuf_is_nonlinear(qdf_nbuf_t buf)
 {
 	return __qdf_nbuf_is_nonlinear(buf);

+ 6 - 0
qdf/inc/qdf_net_types.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -536,6 +537,11 @@ static inline int32_t qdf_csum_ipv6(const in6_addr_t *saddr,
 	return (int32_t)__qdf_csum_ipv6(saddr, daddr, len, proto, sum);
 }
 
+static inline char *qdf_netdev_get_devname(qdf_netdev_t dev)
+{
+	return __qdf_netdev_get_devname(dev);
+}
+
 typedef struct {
 	uint8_t i_fc[2];
 	uint8_t i_dur[2];

+ 12 - 0
qdf/inc/qdf_threads.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -197,4 +198,15 @@ bool qdf_cpumask_empty(const qdf_cpu_mask *srcp);
  */
 void qdf_cpumask_copy(qdf_cpu_mask *dstp,
 		      const qdf_cpu_mask *srcp);
+
+/**
+ * qdf_cpumask_or - set *dstp = *src1p | *src2p
+ * @dstp: the cpumask result
+ * @src1p: the first input
+ * @src2p: the second input
+ *
+ * Return: None
+ */
+void qdf_cpumask_or(qdf_cpu_mask *dstp, qdf_cpu_mask *src1p,
+		    qdf_cpu_mask *src2p);
 #endif /* __QDF_THREADS_H */

+ 5 - 0
qdf/inc/qdf_trace.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -221,7 +222,9 @@ typedef struct s_qdf_trace_data {
  * @QDF_DP_TRACE_FREE_PACKET_PTR_RECORD - tx completion ptr record
  * @QDF_DP_TRACE_LOW_VERBOSITY - below this are part of low verbosity
  * @QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD - HDD layer ptr record
+ * @QDF_DP_TRACE_TX_PACKET_PTR_RECORD - DP component Tx ptr record
  * @QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD - Lithium DP layer ptr record
+ * @QDF_DP_TRACE_RX_PACKET_PTR_RECORD - DP component Rx ptr record
  * @QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD - HDD RX record
  * @QDF_DP_TRACE_CE_PACKET_PTR_RECORD - CE layer ptr record
  * @QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD- CE fastpath ptr record
@@ -267,7 +270,9 @@ enum  QDF_DP_TRACE_ID {
 	QDF_DP_TRACE_FREE_PACKET_PTR_RECORD,
 	QDF_DP_TRACE_LOW_VERBOSITY,
 	QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD,
+	QDF_DP_TRACE_TX_PACKET_PTR_RECORD,
 	QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD,
+	QDF_DP_TRACE_RX_PACKET_PTR_RECORD,
 	QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD,
 	QDF_DP_TRACE_CE_PACKET_PTR_RECORD,
 	QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD,

+ 10 - 0
qdf/inc/qdf_types.h

@@ -174,6 +174,16 @@ typedef __qdf_cpu_mask qdf_cpu_mask;
  */
 typedef __qdf_netdev_t qdf_netdev_t;
 
+/**
+ * pointer to napi struct
+ */
+typedef __qdf_napi_struct qdf_napi_struct;
+
+/**
+ * pointer to net dev stats
+ */
+typedef __qdf_net_dev_stats qdf_net_dev_stats;
+
 /**
  * struct qdf_dma_map_info - Information inside a DMA map.
  * @nsegs: total number mapped segments

+ 125 - 0
qdf/linux/src/i_qdf_nbuf.h

@@ -874,6 +874,8 @@ bool __qdf_nbuf_data_is_ipv4_igmp_pkt(uint8_t *data);
 bool __qdf_nbuf_data_is_ipv6_igmp_pkt(uint8_t *data);
 bool __qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data);
 bool __qdf_nbuf_is_bcast_pkt(__qdf_nbuf_t nbuf);
+bool __qdf_nbuf_is_mcast_replay(__qdf_nbuf_t nbuf);
+bool __qdf_nbuf_is_arp_local(struct sk_buff *skb);
 bool __qdf_nbuf_data_is_arp_req(uint8_t *data);
 bool __qdf_nbuf_data_is_arp_rsp(uint8_t *data);
 uint32_t __qdf_nbuf_get_arp_src_ip(uint8_t *data);
@@ -2163,6 +2165,17 @@ static inline size_t __qdf_nbuf_l2l3l4_hdr_len(struct sk_buff *skb)
 	return skb_transport_offset(skb) + tcp_hdrlen(skb);
 }
 
+/**
+ * __qdf_nbuf_get_tcp_hdr_len() - return TCP header length of the skb
+ * @skb: sk buff
+ *
+ * Return: size of TCP header length
+ */
+static inline size_t __qdf_nbuf_get_tcp_hdr_len(struct sk_buff *skb)
+{
+	return tcp_hdrlen(skb);
+}
+
 /**
  * __qdf_nbuf_is_nonlinear() - test whether the nbuf is nonlinear or not
  * @buf: sk buff
@@ -2643,6 +2656,118 @@ static inline uint16_t __qdf_nbuf_get_gso_segs(struct sk_buff *skb)
 	return skb_shinfo(skb)->gso_segs;
 }
 
+/**
+ * __qdf_nbuf_get_gso_size() - Return the number of gso size
+ * @skb: Pointer to network buffer
+ *
+ * Return: Return the number of gso segments
+ */
+static inline unsigned int __qdf_nbuf_get_gso_size(struct sk_buff *skb)
+{
+	return skb_shinfo(skb)->gso_size;
+}
+
+/**
+ * __qdf_nbuf_set_gso_size() - Set the gso size in nbuf
+ * @skb: Pointer to network buffer
+ *
+ * Return: Return the number of gso segments
+ */
+static inline void
+__qdf_nbuf_set_gso_size(struct sk_buff *skb, unsigned int val)
+{
+	skb_shinfo(skb)->gso_size = val;
+}
+
+/**
+ * __qdf_nbuf_kfree() - Free nbuf using kfree
+ * @buf: Pointer to network buffer
+ *
+ * This function is called to free the skb on failure cases
+ *
+ * Return: None
+ */
+static inline void __qdf_nbuf_kfree(struct sk_buff *skb)
+{
+	kfree_skb(skb);
+}
+
+/**
+ * __qdf_nbuf_dev_kfree() - Free nbuf using dev based os call
+ * @buf: Pointer to network buffer
+ *
+ * This function is called to free the skb on failure cases
+ *
+ * Return: None
+ */
+static inline void __qdf_nbuf_dev_kfree(struct sk_buff *skb)
+{
+	dev_kfree_skb(skb);
+}
+
+/**
+ * __qdf_nbuf_pkt_type_is_mcast() - check if skb pkt type is mcast
+ * @buf: Network buffer
+ *
+ * Return: TRUE if skb pkt type is mcast
+ *         FALSE if not
+ */
+static inline
+bool __qdf_nbuf_pkt_type_is_mcast(struct sk_buff *skb)
+{
+	return skb->pkt_type == PACKET_MULTICAST;
+}
+
+/**
+ * __qdf_nbuf_pkt_type_is_bcast() - check if skb pkt type is bcast
+ * @buf: Network buffer
+ *
+ * Return: TRUE if skb pkt type is mcast
+ *         FALSE if not
+ */
+static inline
+bool __qdf_nbuf_pkt_type_is_bcast(struct sk_buff *skb)
+{
+	return skb->pkt_type == PACKET_BROADCAST;
+}
+
+/**
+ * __qdf_nbuf_set_dev_scratch() - set dev_scratch of network buffer
+ * @buf: Pointer to network buffer
+ * @value: value to be set in dev_scratch of network buffer
+ *
+ * Return: void
+ */
+static inline
+void __qdf_nbuf_set_dev(struct sk_buff *skb, struct net_device *dev)
+{
+	skb->dev = dev;
+}
+
+/**
+ * __qdf_nbuf_get_dev_mtu() - get dev mtu in n/w buffer
+ * @buf: Pointer to network buffer
+ *
+ * Return: dev mtu value in nbuf
+ */
+static inline
+unsigned int __qdf_nbuf_get_dev_mtu(struct sk_buff *skb)
+{
+	return skb->dev->mtu;
+}
+
+/**
+ * __qdf_nbuf_set_protocol_eth_tye_trans() - set protocol using eth trans os API
+ * @buf: Pointer to network buffer
+ *
+ * Return: None
+ */
+static inline
+void __qdf_nbuf_set_protocol_eth_type_trans(struct sk_buff *skb)
+{
+	skb->protocol = eth_type_trans(skb, skb->dev);
+}
+
 /*
  * __qdf_nbuf_net_timedelta() - get time delta
  * @t: time as __qdf_ktime_t object

+ 6 - 0
qdf/linux/src/i_qdf_net_types.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -41,6 +42,11 @@ static inline  int32_t __qdf_csum_ipv6(const struct in6_addr *saddr,
 			       (struct in6_addr *)daddr, len, proto, sum);
 }
 
+static inline char *__qdf_netdev_get_devname(qdf_netdev_t dev)
+{
+	return dev->name;
+}
+
 #define __QDF_TCPHDR_FIN TCPHDR_FIN
 #define __QDF_TCPHDR_SYN TCPHDR_SYN
 #define __QDF_TCPHDR_RST TCPHDR_RST

+ 2 - 0
qdf/linux/src/i_qdf_types.h

@@ -171,7 +171,9 @@ typedef int (*__qdf_os_intr)(void *);
 typedef dma_addr_t __qdf_dma_addr_t;
 typedef size_t __qdf_dma_size_t;
 typedef dma_addr_t __qdf_dma_context_t;
+typedef struct napi_struct __qdf_napi_struct;
 typedef struct net_device *__qdf_netdev_t;
+typedef struct net_device_stats __qdf_net_dev_stats;
 typedef struct cpumask __qdf_cpu_mask;
 typedef __le16 __qdf_le16_t;
 typedef __le32 __qdf_le32_t;

+ 68 - 0
qdf/linux/src/qdf_nbuf.c

@@ -28,6 +28,7 @@
 #include <linux/skbuff.h>
 #include <linux/module.h>
 #include <linux/proc_fs.h>
+#include <linux/inetdevice.h>
 #include <qdf_atomic.h>
 #include <qdf_debugfs.h>
 #include <qdf_lock.h>
@@ -2465,6 +2466,73 @@ bool __qdf_nbuf_is_bcast_pkt(qdf_nbuf_t nbuf)
 }
 qdf_export_symbol(__qdf_nbuf_is_bcast_pkt);
 
+/**
+ * __qdf_nbuf_is_mcast_replay() - is multicast replay packet
+ * @nbuf - sk buff
+ *
+ * Return: true if packet is multicast replay
+ *	   false otherwise
+ */
+bool __qdf_nbuf_is_mcast_replay(qdf_nbuf_t nbuf)
+{
+	struct ethhdr *eh = (struct ethhdr *)qdf_nbuf_data(nbuf);
+
+	if (unlikely(nbuf->pkt_type == PACKET_MULTICAST)) {
+		if (unlikely(ether_addr_equal(eh->h_source,
+					      nbuf->dev->dev_addr)))
+			return true;
+	}
+	return false;
+}
+
+/**
+ * __qdf_nbuf_is_arp_local() - check if local or non local arp
+ * @skb: pointer to sk_buff
+ *
+ * Return: true if local arp or false otherwise.
+ */
+bool __qdf_nbuf_is_arp_local(struct sk_buff *skb)
+{
+	struct arphdr *arp;
+	struct in_ifaddr **ifap = NULL;
+	struct in_ifaddr *ifa = NULL;
+	struct in_device *in_dev;
+	unsigned char *arp_ptr;
+	__be32 tip;
+
+	arp = (struct arphdr *)skb->data;
+	if (arp->ar_op == htons(ARPOP_REQUEST)) {
+		/* if fail to acquire rtnl lock, assume it's local arp */
+		if (!rtnl_trylock())
+			return true;
+
+		in_dev = __in_dev_get_rtnl(skb->dev);
+		if (in_dev) {
+			for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL;
+				ifap = &ifa->ifa_next) {
+				if (!strcmp(skb->dev->name, ifa->ifa_label))
+					break;
+			}
+		}
+
+		if (ifa && ifa->ifa_local) {
+			arp_ptr = (unsigned char *)(arp + 1);
+			arp_ptr += (skb->dev->addr_len + 4 +
+					skb->dev->addr_len);
+			memcpy(&tip, arp_ptr, 4);
+			qdf_debug("ARP packet: local IP: %x dest IP: %x",
+				  ifa->ifa_local, tip);
+			if (ifa->ifa_local == tip) {
+				rtnl_unlock();
+				return true;
+			}
+		}
+		rtnl_unlock();
+	}
+
+	return false;
+}
+
 #ifdef NBUF_MEMORY_DEBUG
 
 static spinlock_t g_qdf_net_buf_track_lock[QDF_NET_BUF_TRACK_MAX_SIZE];

+ 9 - 0
qdf/linux/src/qdf_threads.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -304,3 +305,11 @@ void qdf_cpumask_copy(qdf_cpu_mask *dstp,
 }
 
 qdf_export_symbol(qdf_cpumask_copy);
+
+void qdf_cpumask_or(qdf_cpu_mask *dstp, qdf_cpu_mask *src1p,
+		    qdf_cpu_mask *src2p)
+{
+	cpumask_or(dstp, src1p, src2p);
+}
+
+qdf_export_symbol(qdf_cpumask_or);