first_seg->pkt_len = pkt_len;
first_seg->port = rxq->port_id;
first_seg->hash.rss = rte_le_to_cpu_32(rxdp->rx.rss_hash);
+ first_seg->ol_flags |= PKT_RX_RSS_HASH;
if (unlikely(hns3_get_bit(bd_base_info, HNS3_RXD_LUM_B))) {
first_seg->hash.fdir.hi =
rte_le_to_cpu_32(rxdp->rx.fd_id);
}
/*
- * If the length of the packet is too long or zero, the packet
- * will be ignored.
+ * If packet length is greater than HNS3_MAX_FRAME_LEN
+ * driver support, the packet will be ignored.
*/
- if (unlikely(tx_pkt->pkt_len > HNS3_MAX_FRAME_LEN ||
- tx_pkt->pkt_len == 0))
+ if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) > HNS3_MAX_FRAME_LEN))
break;
+ /*
+ * If packet length is less than minimum packet size, driver
+ * need to pad it.
+ */
+ if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) < HNS3_MIN_PKT_SIZE)) {
+ uint16_t add_len;
+ char *appended;
+
+ add_len = HNS3_MIN_PKT_SIZE -
+ rte_pktmbuf_pkt_len(tx_pkt);
+ appended = rte_pktmbuf_append(tx_pkt, add_len);
+ if (appended == NULL)
+ break;
+
+ memset(appended, 0, add_len);
+ }
+
m_seg = tx_pkt;
if (unlikely(nb_buf > HNS3_MAX_TX_BD_PER_PKT)) {
if (hns3_reassemble_tx_pkts(txq, tx_pkt, &new_pkt))
} while (m_seg != NULL);
nb_hold += i;
+ txq->next_to_use = tx_next_use;
}
end_of_tx:
if (likely(nb_tx)) {
hns3_queue_xmit(txq, nb_hold);
txq->next_to_clean = tx_next_clean;
- txq->next_to_use = tx_next_use;
txq->tx_bd_ready = tx_bd_ready - nb_hold;
}