git: 163f4f15733f - main - netmap: bridge: fix NS_MOREFRAG support
Vincenzo Maffione
vmaffione at FreeBSD.org
Thu Jan 7 07:06:38 UTC 2021
The branch main has been updated by vmaffione:
URL: https://cgit.FreeBSD.org/src/commit/?id=163f4f15733f82584a967538cf2340bf1b6a245f
commit 163f4f15733f82584a967538cf2340bf1b6a245f
Author: Vincenzo Maffione <vmaffione at FreeBSD.org>
AuthorDate: 2021-01-07 07:00:43 +0000
Commit: Vincenzo Maffione <vmaffione at FreeBSD.org>
CommitDate: 2021-01-07 07:05:57 +0000
netmap: bridge: fix NS_MOREFRAG support
Support for NS_MOREFRAG is broken, as NS_MOREFRAG is copied from
the TX slot to the RX slot rather than the other way around.
Also, the NS_MOREFRAG must be copied also in case of packet
copy (no zerocopy).
Reported by: rajesh1.kumar_amd.com
MFC after: 3 days
Differential Revision: https://reviews.freebsd.org/D27980
---
tools/tools/netmap/bridge.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/tools/tools/netmap/bridge.c b/tools/tools/netmap/bridge.c
index af8c2847130a..77d235bf6e08 100644
--- a/tools/tools/netmap/bridge.c
+++ b/tools/tools/netmap/bridge.c
@@ -86,13 +86,12 @@ rings_move(struct netmap_ring *rxring, struct netmap_ring *txring,
struct netmap_slot *rs = &rxring->slot[j];
struct netmap_slot *ts = &txring->slot[k];
- /* swap packets */
if (ts->buf_idx < 2 || rs->buf_idx < 2) {
RD(2, "wrong index rxr[%d] = %d -> txr[%d] = %d",
j, rs->buf_idx, k, ts->buf_idx);
sleep(2);
}
- /* copy the packet length. */
+ /* Copy the packet length. */
if (rs->len > rxring->nr_buf_size) {
RD(2, "%s: invalid len %u, rxr[%d] -> txr[%d]",
msg, rs->len, j, k);
@@ -109,13 +108,16 @@ rings_move(struct netmap_ring *rxring, struct netmap_ring *txring,
/* report the buffer change. */
ts->flags |= NS_BUF_CHANGED;
rs->flags |= NS_BUF_CHANGED;
- /* copy the NS_MOREFRAG */
- rs->flags = (rs->flags & ~NS_MOREFRAG) | (ts->flags & NS_MOREFRAG);
} else {
char *rxbuf = NETMAP_BUF(rxring, rs->buf_idx);
char *txbuf = NETMAP_BUF(txring, ts->buf_idx);
nm_pkt_copy(rxbuf, txbuf, ts->len);
}
+ /*
+ * Copy the NS_MOREFRAG from rs to ts, leaving any
+ * other flags unchanged.
+ */
+ ts->flags = (ts->flags & ~NS_MOREFRAG) | (rs->flags & NS_MOREFRAG);
j = nm_ring_next(rxring, j);
k = nm_ring_next(txring, k);
}
@@ -190,7 +192,7 @@ usage(void)
int
main(int argc, char **argv)
{
- char msg_a2b[128], msg_b2a[128];
+ char msg_a2b[256], msg_b2a[256];
struct pollfd pollfd[2];
u_int burst = 1024, wait_link = 4;
struct nmport_d *pa = NULL, *pb = NULL;
More information about the dev-commits-src-all
mailing list