qcacmn: Handling of IGMP packets in MLO Multipass

Due to the CCE rule in QCN9224 IGMP packets will be routed
to err ring. When multipass is enabled, perform multipass processing
before handing over the packet to stack.

Change-Id: I50b747710eb3c49eab60c81bbc61e75e2f8650ed
CRs-Fixed: 3275888
This commit is contained in:
Sai Rupesh Chevuru
2022-08-25 10:26:44 +05:30
committed by Madan Koyyalamudi
parent e12273c5cd
commit ef34b5b9ab
3 changed files with 104 additions and 15 deletions

View File

@@ -1873,6 +1873,56 @@ bool __qdf_nbuf_is_ipv4_wapi_pkt(struct sk_buff *skb)
}
qdf_export_symbol(__qdf_nbuf_is_ipv4_wapi_pkt);
/**
* qdf_nbuf_is_ipv6_vlan_pkt() - check wheather packet is vlan IPV6
* @data: Pointer to network data buffer
*
* This api is for vlan header included ipv6 packet.
*
* Return: true if packet is vlan header included IPV6
* false otherwise.
*/
static bool qdf_nbuf_is_ipv6_vlan_pkt(uint8_t *data)
{
uint16_t ether_type;
ether_type = *(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET);
if (unlikely(ether_type == QDF_SWAP_U16(QDF_ETH_TYPE_8021Q))) {
ether_type = *(uint16_t *)(data +
QDF_NBUF_TRAC_VLAN_ETH_TYPE_OFFSET);
if (ether_type == QDF_SWAP_U16(QDF_NBUF_TRAC_IPV6_ETH_TYPE))
return true;
}
return false;
}
/**
* qdf_nbuf_is_ipv4_vlan_pkt() - check wheather packet is vlan IPV4
* @data: Pointer to network data buffer
*
* This api is for vlan header included ipv4 packet.
*
* Return: true if packet is vlan header included IPV4
* false otherwise.
*/
static bool qdf_nbuf_is_ipv4_vlan_pkt(uint8_t *data)
{
uint16_t ether_type;
ether_type = *(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET);
if (unlikely(ether_type == QDF_SWAP_U16(QDF_ETH_TYPE_8021Q))) {
ether_type = *(uint16_t *)(data +
QDF_NBUF_TRAC_VLAN_ETH_TYPE_OFFSET);
if (ether_type == QDF_SWAP_U16(QDF_NBUF_TRAC_IPV4_ETH_TYPE))
return true;
}
return false;
}
/**
* __qdf_nbuf_data_is_ipv4_igmp_pkt() - check if skb data is a igmp packet
* @data: Pointer to network data buffer
@@ -1884,15 +1934,26 @@ qdf_export_symbol(__qdf_nbuf_is_ipv4_wapi_pkt);
*/
bool __qdf_nbuf_data_is_ipv4_igmp_pkt(uint8_t *data)
{
if (__qdf_nbuf_data_is_ipv4_pkt(data)) {
uint8_t pkt_type;
uint8_t pkt_type;
if (__qdf_nbuf_data_is_ipv4_pkt(data)) {
pkt_type = (uint8_t)(*(uint8_t *)(data +
QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET));
if (pkt_type == QDF_NBUF_TRAC_IGMP_TYPE)
return true;
goto is_igmp;
}
if (qdf_nbuf_is_ipv4_vlan_pkt(data)) {
pkt_type = (uint8_t)(*(uint8_t *)(
data +
QDF_NBUF_TRAC_VLAN_IPV4_PROTO_TYPE_OFFSET));
goto is_igmp;
}
return false;
is_igmp:
if (pkt_type == QDF_NBUF_TRAC_IGMP_TYPE)
return true;
return false;
}
@@ -1909,21 +1970,38 @@ qdf_export_symbol(__qdf_nbuf_data_is_ipv4_igmp_pkt);
*/
bool __qdf_nbuf_data_is_ipv6_igmp_pkt(uint8_t *data)
{
if (__qdf_nbuf_data_is_ipv6_pkt(data)) {
uint8_t pkt_type;
uint8_t next_hdr;
uint8_t pkt_type;
uint8_t next_hdr;
if (__qdf_nbuf_data_is_ipv6_pkt(data)) {
pkt_type = (uint8_t)(*(uint8_t *)(data +
QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET));
next_hdr = (uint8_t)(*(uint8_t *)(data +
next_hdr = (uint8_t)(*(uint8_t *)(
data +
QDF_NBUF_TRAC_IPV6_OFFSET +
QDF_NBUF_TRAC_IPV6_HEADER_SIZE));
if (pkt_type == QDF_NBUF_TRAC_ICMPV6_TYPE)
return true;
if ((pkt_type == QDF_NBUF_TRAC_HOPOPTS_TYPE) &&
(next_hdr == QDF_NBUF_TRAC_HOPOPTS_TYPE))
return true;
goto is_mld;
}
if (qdf_nbuf_is_ipv6_vlan_pkt(data)) {
pkt_type = (uint8_t)(*(uint8_t *)(
data +
QDF_NBUF_TRAC_VLAN_IPV6_PROTO_TYPE_OFFSET));
next_hdr = (uint8_t)(*(uint8_t *)(
data +
QDF_NBUF_TRAC_VLAN_IPV6_OFFSET +
QDF_NBUF_TRAC_IPV6_HEADER_SIZE));
goto is_mld;
}
return false;
is_mld:
if (pkt_type == QDF_NBUF_TRAC_ICMPV6_TYPE)
return true;
if ((pkt_type == QDF_NBUF_TRAC_HOPOPTS_TYPE) &&
(next_hdr == QDF_NBUF_TRAC_ICMPV6_TYPE))
return true;
return false;
}