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
This commit is contained in:
Karthik Kantamneni
2022-03-22 11:19:45 +05:30
committed by Madan Koyyalamudi
parent ec906c0387
commit 6380170e35
10 changed files with 399 additions and 2 deletions

View File

@@ -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);

View File

@@ -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];

View File

@@ -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 */

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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];

View File

@@ -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);