net/i40e: exclude LLDP packet count

When use port stats register to calculate the packet count, LLDP packets
are counted in statistics which is not expected, the patch exclude this
number from total number.

Fixes: 763de290cbd1 ("net/i40e: fix packet count for PF")
Cc: stable@dpdk.org

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
This commit is contained in:
Qi Zhang 2017-12-11 13:09:51 -05:00 committed by Ferruh Yigit
parent d2f9fe8ae3
commit 2b38f509c3

View File

@ -2518,6 +2518,22 @@ i40e_read_stats_registers(struct i40e_pf *pf, struct i40e_hw *hw)
pf->offset_loaded,
&pf->internal_stats_offset.rx_broadcast,
&pf->internal_stats.rx_broadcast);
/* Get total internal tx packet count */
i40e_stat_update_48(hw, I40E_GLV_UPTCH(hw->port),
I40E_GLV_UPTCL(hw->port),
pf->offset_loaded,
&pf->internal_stats_offset.tx_unicast,
&pf->internal_stats.tx_unicast);
i40e_stat_update_48(hw, I40E_GLV_MPTCH(hw->port),
I40E_GLV_MPTCL(hw->port),
pf->offset_loaded,
&pf->internal_stats_offset.tx_multicast,
&pf->internal_stats.tx_multicast);
i40e_stat_update_48(hw, I40E_GLV_BPTCH(hw->port),
I40E_GLV_BPTCL(hw->port),
pf->offset_loaded,
&pf->internal_stats_offset.tx_broadcast,
&pf->internal_stats.tx_broadcast);
/* exclude CRC size */
pf->internal_stats.rx_bytes -= (pf->internal_stats.rx_unicast +
@ -2547,16 +2563,32 @@ i40e_read_stats_registers(struct i40e_pf *pf, struct i40e_hw *hw)
ns->eth.rx_bytes -= (ns->eth.rx_unicast + ns->eth.rx_multicast +
ns->eth.rx_broadcast) * ETHER_CRC_LEN;
/* Workaround: it is possible I40E_GLV_GORCH[H/L] is updated before
* I40E_GLPRT_GORCH[H/L], so there is a small window that cause negtive
/* exclude internal rx bytes
* Workaround: it is possible I40E_GLV_GORCH[H/L] is updated before
* I40E_GLPRT_GORCH[H/L], so there is a small window that cause negative
* value.
* same to I40E_GLV_UPRC[H/L], I40E_GLV_MPRC[H/L], I40E_GLV_BPRC[H/L].
*/
if (ns->eth.rx_bytes < pf->internal_stats.rx_bytes)
ns->eth.rx_bytes = 0;
/* exlude internal rx bytes */
else
ns->eth.rx_bytes -= pf->internal_stats.rx_bytes;
if (ns->eth.rx_unicast < pf->internal_stats.rx_unicast)
ns->eth.rx_unicast = 0;
else
ns->eth.rx_unicast -= pf->internal_stats.rx_unicast;
if (ns->eth.rx_multicast < pf->internal_stats.rx_multicast)
ns->eth.rx_multicast = 0;
else
ns->eth.rx_multicast -= pf->internal_stats.rx_multicast;
if (ns->eth.rx_broadcast < pf->internal_stats.rx_broadcast)
ns->eth.rx_broadcast = 0;
else
ns->eth.rx_broadcast -= pf->internal_stats.rx_broadcast;
i40e_stat_update_32(hw, I40E_GLPRT_RDPC(hw->port),
pf->offset_loaded, &os->eth.rx_discards,
&ns->eth.rx_discards);
@ -2585,12 +2617,32 @@ i40e_read_stats_registers(struct i40e_pf *pf, struct i40e_hw *hw)
ns->eth.tx_bytes -= (ns->eth.tx_unicast + ns->eth.tx_multicast +
ns->eth.tx_broadcast) * ETHER_CRC_LEN;
/* exclude internal tx bytes */
/* exclude internal tx bytes
* Workaround: it is possible I40E_GLV_GOTCH[H/L] is updated before
* I40E_GLPRT_GOTCH[H/L], so there is a small window that cause negative
* value.
* same to I40E_GLV_UPTC[H/L], I40E_GLV_MPTC[H/L], I40E_GLV_BPTC[H/L].
*/
if (ns->eth.tx_bytes < pf->internal_stats.tx_bytes)
ns->eth.tx_bytes = 0;
else
ns->eth.tx_bytes -= pf->internal_stats.tx_bytes;
if (ns->eth.tx_unicast < pf->internal_stats.tx_unicast)
ns->eth.tx_unicast = 0;
else
ns->eth.tx_unicast -= pf->internal_stats.tx_unicast;
if (ns->eth.tx_multicast < pf->internal_stats.tx_multicast)
ns->eth.tx_multicast = 0;
else
ns->eth.tx_multicast -= pf->internal_stats.tx_multicast;
if (ns->eth.tx_broadcast < pf->internal_stats.tx_broadcast)
ns->eth.tx_broadcast = 0;
else
ns->eth.tx_broadcast -= pf->internal_stats.tx_broadcast;
/* GLPRT_TEPC not supported */
/* additional port specific stats */