From bf1a7c223bd4d39ed96dddea7a832142acc38a0b Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Wed, 10 Aug 2016 15:24:37 +0530 Subject: [PATCH] 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 --- qdf/inc/qdf_nbuf.h | 18 ++++++++++++++++++ qdf/linux/src/i_qdf_nbuf.h | 1 + qdf/linux/src/qdf_nbuf.c | 25 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index f1ce9e864c69..1565ac89823b 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -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 diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 4297431dd47a..04a3f7e1de5b 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -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); diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index f61b75d8e603..911db5acc888 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -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