Commit 12004ae9 authored by Sathya Perla's avatar Sathya Perla Committed by David S. Miller

be2net: drop pkts that do not belong to the port

On some BE skews, while in promiscuous mode, pkts that do not belong to a
port can arrive on that port. Drop such pkts.
Signed-off-by: default avatarSomnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 306f1348
...@@ -217,7 +217,7 @@ struct be_rx_compl_info { ...@@ -217,7 +217,7 @@ struct be_rx_compl_info {
u16 vlan_tag; u16 vlan_tag;
u16 pkt_size; u16 pkt_size;
u16 rxq_idx; u16 rxq_idx;
u16 mac_id; u16 port;
u8 vlanf; u8 vlanf;
u8 num_rcvd; u8 num_rcvd;
u8 err; u8 err;
......
...@@ -1213,6 +1213,7 @@ static void be_parse_rx_compl_v1(struct be_adapter *adapter, ...@@ -1213,6 +1213,7 @@ static void be_parse_rx_compl_v1(struct be_adapter *adapter,
rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag, rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
compl); compl);
} }
rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, port, compl);
} }
static void be_parse_rx_compl_v0(struct be_adapter *adapter, static void be_parse_rx_compl_v0(struct be_adapter *adapter,
...@@ -1245,6 +1246,7 @@ static void be_parse_rx_compl_v0(struct be_adapter *adapter, ...@@ -1245,6 +1246,7 @@ static void be_parse_rx_compl_v0(struct be_adapter *adapter,
rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag, rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
compl); compl);
} }
rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, port, compl);
} }
static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo) static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
...@@ -1833,16 +1835,30 @@ static int be_poll_rx(struct napi_struct *napi, int budget) ...@@ -1833,16 +1835,30 @@ static int be_poll_rx(struct napi_struct *napi, int budget)
if (!rxcp) if (!rxcp)
break; break;
/* Ignore flush completions */ /* Is it a flush compl that has no data */
if (rxcp->num_rcvd && rxcp->pkt_size) { if (unlikely(rxcp->num_rcvd == 0))
if (do_gro(rxcp)) goto loop_continue;
be_rx_compl_process_gro(adapter, rxo, rxcp);
else /* Discard compl with partial DMA Lancer B0 */
be_rx_compl_process(adapter, rxo, rxcp); if (unlikely(!rxcp->pkt_size)) {
} else if (rxcp->pkt_size == 0) {
be_rx_compl_discard(adapter, rxo, rxcp); be_rx_compl_discard(adapter, rxo, rxcp);
goto loop_continue;
} }
/* On BE drop pkts that arrive due to imperfect filtering in
* promiscuous mode on some skews
*/
if (unlikely(rxcp->port != adapter->port_num &&
!lancer_chip(adapter))) {
be_rx_compl_discard(adapter, rxo, rxcp);
goto loop_continue;
}
if (do_gro(rxcp))
be_rx_compl_process_gro(adapter, rxo, rxcp);
else
be_rx_compl_process(adapter, rxo, rxcp);
loop_continue:
be_rx_stats_update(rxo, rxcp); be_rx_stats_update(rxo, rxcp);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment