Modify igb_process_tx_desc to return the total size of the transmitted packet (in bytes) when processing the End of Packet (EOP) descriptor, and 0 otherwise. This allows the transmission loop to track how many bytes are being sent for rate-limiting calculations.
Signed-off-by: Josh Hilke <[email protected]> --- hw/net/igb_core.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hw/net/igb_core.c b/hw/net/igb_core.c index dea8136..fac4c44 100644 --- a/hw/net/igb_core.c +++ b/hw/net/igb_core.c @@ -600,7 +600,7 @@ igb_on_tx_done_update_stats(IGBCore *core, struct NetTxPkt *tx_pkt, int qn) } } -static void +static size_t igb_process_tx_desc(IGBCore *core, PCIDevice *dev, struct igb_tx *tx, @@ -633,10 +633,10 @@ igb_process_tx_desc(IGBCore *core, tx->ctx[idx].seqnum_seed = le32_to_cpu(tx_ctx_desc->seqnum_seed); tx->ctx[idx].type_tucmd_mlhl = le32_to_cpu(tx_ctx_desc->type_tucmd_mlhl); tx->ctx[idx].mss_l4len_idx = le32_to_cpu(tx_ctx_desc->mss_l4len_idx); - return; + return 0; } else { /* unknown descriptor type */ - return; + return 0; } } else { /* legacy descriptor */ @@ -655,11 +655,13 @@ igb_process_tx_desc(IGBCore *core, } if (cmd_type_len & E1000_TXD_CMD_EOP) { + size_t total_len = 0; if (!tx->skip_cp && net_tx_pkt_parse(tx->tx_pkt)) { idx = (tx->first_olinfo_status >> 4) & 1; igb_tx_insert_vlan(core, queue_index, tx, tx->ctx[idx].vlan_macip_lens >> IGB_TX_FLAGS_VLAN_SHIFT, !!(tx->first_cmd_type_len & E1000_TXD_CMD_VLE)); + total_len = net_tx_pkt_get_total_len(tx->tx_pkt); if ((tx->first_cmd_type_len & E1000_ADVTXD_MAC_TSTAMP) && (core->mac[TSYNCTXCTL] & E1000_TSYNCTXCTL_ENABLED) && @@ -676,7 +678,9 @@ igb_process_tx_desc(IGBCore *core, tx->first = true; tx->skip_cp = false; net_tx_pkt_reset(tx->tx_pkt, net_tx_pkt_unmap_frag_pci, dev); + return total_len; } + return 0; } static uint32_t igb_tx_wb_eic(IGBCore *core, int queue_idx) -- 2.54.0.1136.gdb2ca164c4-goog
