diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2011-08-02 19:57:46 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-03 10:23:30 (GMT) |
commit | 12004ae99c009a4ff3c8ea0843f1980aa5bcb4ea (patch) | |
tree | df510ef2be2eb17ca9e5bae681f27092e789729a /drivers/net | |
parent | 306f13487c9f7d6e3303a547e01e22958a04c666 (diff) | |
download | linux-12004ae99c009a4ff3c8ea0843f1980aa5bcb4ea.tar.xz |
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 <somnath.kotur@emulex.com>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/benet/be.h | 2 | ||||
-rw-r--r-- | 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 1e7f009..12b5b51 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 dba6941f..1a3acca 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); } |