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