net/virtio: fix oversized packets in vectorized Rx

If packed ring size is not power of two, it is possible that remained
number less than one batch and meanwhile batch operation can pass.
This will cause incorrect remained number calculation and then lead to
receiving oversized packets. The patch fixed the issue by added
remained number check before batch operation.

Fixes: 77d66da838 ("net/virtio: add vectorized packed ring Rx")
Cc: stable@dpdk.org

Signed-off-by: Marvin Liu <yong.liu@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
Marvin Liu 2021-09-26 17:28:42 +08:00 committed by Maxime Coquelin
parent 8011a09add
commit 99ebada2d6

View File

@ -95,11 +95,13 @@ virtio_recv_pkts_packed_vec(void *rx_queue,
num = num - ((vq->vq_used_cons_idx + num) % PACKED_BATCH_SIZE);
while (num) {
if (!virtqueue_dequeue_batch_packed_vec(rxvq,
&rx_pkts[nb_rx])) {
nb_rx += PACKED_BATCH_SIZE;
num -= PACKED_BATCH_SIZE;
continue;
if (num >= PACKED_BATCH_SIZE) {
if (!virtqueue_dequeue_batch_packed_vec(rxvq,
&rx_pkts[nb_rx])) {
nb_rx += PACKED_BATCH_SIZE;
num -= PACKED_BATCH_SIZE;
continue;
}
}
if (!virtqueue_dequeue_single_packed_vec(rxvq,
&rx_pkts[nb_rx])) {