qcacmn: Add API to find IPV4 mcast packet

Propagation from qcacld-2.0 to qcacmn.

Add API to find IPV4 mcast packet to use it in wma_wow_wake_up_stats
func. This is required to know if there is a IPV4 mcast packet embedded
in a link layer unicast packet.

Change-Id: Iceaf1226edbf909ca3881e049c33f7d121860ef2
CRs-fixed: 1049254
This commit is contained in:
Himanshu Agarwal 2016-08-10 15:24:37 +05:30 • committed by qcabuildsw
commit bf1a7c223b
3 changed files with 44 additions and 0 deletions

View file

@ -62,7 +62,10 @@
#define QDF_NBUF_DEST_MAC_OFFSET 0
#define QDF_NBUF_SRC_MAC_OFFSET 6
#define QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET 23
#define QDF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET 30
#define QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET 20
#define QDF_NBUF_TRAC_IPV4_ADDR_MCAST_MASK 0xE0000000
#define QDF_NBUF_TRAC_IPV4_ADDR_BCAST_MASK 0xF0000000
#define QDF_NBUF_TRAC_ICMP_TYPE 1
#define QDF_NBUF_TRAC_TCP_TYPE 6
#define QDF_NBUF_TRAC_UDP_TYPE 17
@ -1536,6 +1539,21 @@ bool qdf_nbuf_data_is_ipv6_pkt(uint8_t *data)
return __qdf_nbuf_data_is_ipv6_pkt(data);
}
/**
* qdf_nbuf_data_is_ipv4_mcast_pkt() - check if it is IPV4 multicast packet.
* @data: Pointer to IPV4 packet data buffer
*
* This func. checks whether it is a IPV4 multicast packet or not.
*
* Return: TRUE if it is a IPV4 multicast packet
* FALSE if not
*/
static inline
bool qdf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data)
{
return __qdf_nbuf_data_is_ipv4_mcast_pkt(data);
}
/**
* qdf_nbuf_is_icmp_pkt() - check if it is IPV4 ICMP packet.
* @buf: Pointer to IPV4 ICMP packet buffer

View file

@ -494,6 +494,7 @@ QDF_STATUS __qdf_nbuf_frag_map(
bool __qdf_nbuf_is_ipv4_wapi_pkt(struct sk_buff *skb);
bool __qdf_nbuf_data_is_ipv4_pkt(uint8_t *data);
bool __qdf_nbuf_data_is_ipv6_pkt(uint8_t *data);
bool __qdf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data);
bool __qdf_nbuf_data_is_icmp_pkt(uint8_t *data);
bool __qdf_nbuf_data_is_icmpv6_pkt(uint8_t *data);
bool __qdf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data);

View file

@ -829,6 +829,31 @@ bool __qdf_nbuf_data_is_ipv6_pkt(uint8_t *data)
return false;
}
/**
* __qdf_nbuf_data_is_ipv4_mcast_pkt() - check if it is IPV4 multicast packet.
* @data: Pointer to IPV4 packet data buffer
*
* This func. checks whether it is a IPV4 multicast packet or not.
*
* Return: TRUE if it is a IPV4 multicast packet
* FALSE if not
*/
bool __qdf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data)
{
uint32_t *dst_addr =
(uint32_t *)(data + QDF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET);
/*
* Check first word of the IPV4 address and if it
* equal to 0xE then it represents multicast IP.
*/
if ((*dst_addr & QDF_NBUF_TRAC_IPV4_ADDR_BCAST_MASK) ==
QDF_NBUF_TRAC_IPV4_ADDR_MCAST_MASK)
return true;
else
return false;
}
/**
* __qdf_nbuf_data_is_icmp_pkt() - check if it is IPV4 ICMP packet.
* @data: Pointer to IPV4 ICMP packet data buffer