From 12004ae99c009a4ff3c8ea0843f1980aa5bcb4ea Mon Sep 17 00:00:00 2001 From: Sathya Perla Date: Tue, 2 Aug 2011 19:57:46 +0000 Subject: 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: Somnath Kotur Signed-off-by: Sathya Perla Signed-off-by: David S. Miller --- drivers/net/benet/be.h | 2 +- drivers/net/benet/be_main.c | 30 +++++++++++++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 1e7f0094e38..12b5b5168dc 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h @@ -217,7 +217,7 @@ struct be_rx_compl_info { u16 vlan_tag; u16 pkt_size; u16 rxq_idx; - u16 mac_id; + u16 port; u8 vlanf; u8 num_rcvd; u8 err; diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index dba6941f868..1a3accab3d1 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c @@ -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, 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, @@ -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, 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) @@ -1833,16 +1835,30 @@ static int be_poll_rx(struct napi_struct *napi, int budget) if (!rxcp) break; - /* Ignore flush completions */ - if (rxcp->num_rcvd && rxcp->pkt_size) { - if (do_gro(rxcp)) - be_rx_compl_process_gro(adapter, rxo, rxcp); - else - be_rx_compl_process(adapter, rxo, rxcp); - } else if (rxcp->pkt_size == 0) { + /* Is it a flush compl that has no data */ + if (unlikely(rxcp->num_rcvd == 0)) + goto loop_continue; + + /* Discard compl with partial DMA Lancer B0 */ + if (unlikely(!rxcp->pkt_size)) { 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); } -- cgit v1.2.3-18-g5258