Skip to content

Commit

Permalink
netdev-dpdk: Dump packets that fail Tx preparation.
Browse files Browse the repository at this point in the history
It's hard to debug situations where driver rejects packets for some
reason.  Dumping out the mbuf should help with that.

Sample output looks like this:

  |netdev_dpdk(pmd-c03/id:8)|DBG|ovs-p1: First invalid packet:
  dump mbuf at 0x1180bce140, iova=0x2cb7ce400, buf_len=2176
    pkt_len=64, ol_flags=0x2, nb_segs=1, port=65535, ptype=0
    segment at 0x1180bce140, data=0x1180bce580, len=90, off=384, refcnt=1
    Dump data at [0x1180bce580], len=64
  00000000: 33 33 00 00 00 16 AA 27 91 F9 4D 96 86 DD 60 00 | 33.....'..M...`.
  00000010: 00 00 00 24 00 01 00 00 00 00 00 00 00 00 00 00 | ...$............
  00000020: 00 00 00 00 00 00 FF 02 00 00 00 00 00 00 00 00 | ................
  00000030: 00 00 00 00 00 16 3A 00 05 02 00 00 01 00 8F 00 | ......:.........

Acked-by: Eelco Chaudron <[email protected]>
Acked-by: Kevin Traynor <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
igsilya committed Mar 8, 2024
1 parent 07c2ef5 commit 2c4ffd2
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions lib/netdev-dpdk.c
Original file line number Diff line number Diff line change
Expand Up @@ -2664,6 +2664,35 @@ netdev_dpdk_prep_hwol_batch(struct netdev_dpdk *dev, struct rte_mbuf **pkts,
return cnt;
}

static void
netdev_dpdk_mbuf_dump(const char *prefix, const char *message,
const struct rte_mbuf *mbuf)
{
static struct vlog_rate_limit dump_rl = VLOG_RATE_LIMIT_INIT(5, 5);
char *response = NULL;
FILE *stream;
size_t size;

if (VLOG_DROP_DBG(&dump_rl)) {
return;
}

stream = open_memstream(&response, &size);
if (!stream) {
VLOG_ERR("Unable to open memstream for mbuf dump: %s.",
ovs_strerror(errno));
return;
}

rte_pktmbuf_dump(stream, mbuf, rte_pktmbuf_pkt_len(mbuf));

fclose(stream);

VLOG_DBG(prefix ? "%s: %s:\n%s" : "%s%s:\n%s",
prefix ? prefix : "", message, response);
free(response);
}

/* Tries to transmit 'pkts' to txq 'qid' of device 'dev'. Takes ownership of
* 'pkts', even in case of failure.
*
Expand All @@ -2680,6 +2709,8 @@ netdev_dpdk_eth_tx_burst(struct netdev_dpdk *dev, int qid,
VLOG_WARN_RL(&rl, "%s: Output batch contains invalid packets. "
"Only %u/%u are valid: %s", netdev_get_name(&dev->up),
nb_tx_prep, cnt, rte_strerror(rte_errno));
netdev_dpdk_mbuf_dump(netdev_get_name(&dev->up),
"First invalid packet", pkts[nb_tx_prep]);
}

while (nb_tx != nb_tx_prep) {
Expand Down

0 comments on commit 2c4ffd2

Please sign in to comment.