socsvn commit: r337276 - in soc2018/sduo/head/sys: dev/netmap net

sduo at FreeBSD.org sduo at FreeBSD.org
Thu Aug 2 10:04:05 UTC 2018


Author: sduo
Date: Thu Aug  2 10:03:51 2018
New Revision: 337276
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=337276

Log:
  Updated netmap files.

Modified:
  soc2018/sduo/head/sys/dev/netmap/if_em_netmap.h
  soc2018/sduo/head/sys/dev/netmap/if_igb_netmap.h
  soc2018/sduo/head/sys/dev/netmap/if_ixl_netmap.h
  soc2018/sduo/head/sys/dev/netmap/if_lem_netmap.h
  soc2018/sduo/head/sys/dev/netmap/if_ptnet.c
  soc2018/sduo/head/sys/dev/netmap/if_re_netmap.h
  soc2018/sduo/head/sys/dev/netmap/if_vtnet_netmap.h
  soc2018/sduo/head/sys/dev/netmap/ixgbe_netmap.h
  soc2018/sduo/head/sys/dev/netmap/netmap.c
  soc2018/sduo/head/sys/dev/netmap/netmap_bdg.c
  soc2018/sduo/head/sys/dev/netmap/netmap_generic.c
  soc2018/sduo/head/sys/dev/netmap/netmap_kern.h
  soc2018/sduo/head/sys/dev/netmap/netmap_mem2.c
  soc2018/sduo/head/sys/dev/netmap/netmap_mem2.h
  soc2018/sduo/head/sys/dev/netmap/netmap_monitor.c
  soc2018/sduo/head/sys/dev/netmap/netmap_offloadings.c
  soc2018/sduo/head/sys/dev/netmap/netmap_pipe.c
  soc2018/sduo/head/sys/dev/netmap/netmap_vale.c
  soc2018/sduo/head/sys/net/netmap.h
  soc2018/sduo/head/sys/net/netmap_user.h

Modified: soc2018/sduo/head/sys/dev/netmap/if_em_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_em_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_em_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -142,9 +142,10 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			/* device-specific */
 			struct e1000_tx_desc *curr = &txr->tx_base[nic_i];
@@ -158,7 +159,8 @@
 			if (slot->flags & NS_BUF_CHANGED) {
 				curr->buffer_addr = htole64(paddr);
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, txr->txtag, txbuf->map, addr);
+				netmap_reload_map(na, txr->txtag, txbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 			}
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 
@@ -266,8 +268,9 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			union e1000_rx_desc_extended *curr = &rxr->rx_base[nic_i];
 			struct em_rxbuffer *rxbuf = &rxr->rx_buffers[nic_i];
@@ -278,7 +281,8 @@
 			curr->read.buffer_addr = htole64(paddr);
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, rxr->rxtag, rxbuf->map, addr);
+				netmap_reload_map(na, rxr->rxtag, rxbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 				slot->flags &= ~NS_BUF_CHANGED;
 			}
 			curr->wb.upper.status_error = 0;

Modified: soc2018/sduo/head/sys/dev/netmap/if_igb_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_igb_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_igb_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -113,9 +113,10 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			/* device-specific */
 			union e1000_adv_tx_desc *curr =
@@ -129,7 +130,8 @@
 
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, txr->txtag, txbuf->map, addr);
+				netmap_reload_map(na, txr->txtag, txbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 			}
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 
@@ -246,8 +248,9 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			union e1000_adv_rx_desc *curr = &rxr->rx_base[nic_i];
 			struct igb_rx_buf *rxbuf = &rxr->rx_buffers[nic_i];
@@ -257,7 +260,8 @@
 
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, rxr->ptag, rxbuf->pmap, addr);
+				netmap_reload_map(na, rxr->ptag, rxbuf->pmap,
+					addr, NETMAP_BUF_SIZE(na, offset));
 				slot->flags &= ~NS_BUF_CHANGED;
 			}
 			curr->wb.upper.status_error = 0;

Modified: soc2018/sduo/head/sys/dev/netmap/if_ixl_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_ixl_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_ixl_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -214,9 +214,10 @@
 
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			/* device-specific */
 			struct i40e_tx_desc *curr = &txr->base[nic_i];
@@ -233,7 +234,8 @@
 
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, txr->dma.tag, txbuf->map, addr);
+				netmap_reload_map(na, txr->dma.tag, txbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 			}
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 
@@ -376,8 +378,9 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			union i40e_32byte_rx_desc *curr = &rxr->base[nic_i];
 			struct ixl_rx_buf *rxbuf = &rxr->buffers[nic_i];
@@ -387,7 +390,8 @@
 
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, rxr->ptag, rxbuf->pmap, addr);
+				netmap_reload_map(na, rxr->ptag, rxbuf->pmap,
+					addr, NETMAP_BUF_SIZE(na, offset));
 				slot->flags &= ~NS_BUF_CHANGED;
 			}
 			curr->read.pkt_addr = htole64(paddr);

Modified: soc2018/sduo/head/sys/dev/netmap/if_lem_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_lem_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_lem_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -124,9 +124,10 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		while (nm_i != head) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			/* device-specific */
 			struct e1000_tx_desc *curr = &adapter->tx_desc_base[nic_i];
@@ -140,7 +141,8 @@
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
 				curr->buffer_addr = htole64(paddr);
-				netmap_reload_map(na, adapter->txtag, txbuf->map, addr);
+				netmap_reload_map(na, adapter->txtag, txbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 			}
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 
@@ -258,8 +260,9 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			struct e1000_rx_desc *curr = &adapter->rx_desc_base[nic_i];
 			struct em_buffer *rxbuf = &adapter->rx_buffer_area[nic_i];
@@ -270,7 +273,8 @@
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
 				curr->buffer_addr = htole64(paddr);
-				netmap_reload_map(na, adapter->rxtag, rxbuf->map, addr);
+				netmap_reload_map(na, adapter->rxtag, rxbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 				slot->flags &= ~NS_BUF_CHANGED;
 			}
 			curr->status = 0;

Modified: soc2018/sduo/head/sys/dev/netmap/if_ptnet.c
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_ptnet.c	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_ptnet.c	Thu Aug  2 10:03:51 2018	(r337276)
@@ -909,7 +909,7 @@
 		goto err_register;
 	}
 
-	nm_buf_size = NETMAP_BUF_SIZE(na_dr);
+	nm_buf_size = NETMAP_BUF_SIZE(na_dr, 0);
 
 	KASSERT(nm_buf_size > 0, ("Invalid netmap buffer size"));
 	sc->min_tx_space = PTNET_MAX_PKT_SIZE / nm_buf_size + 2;
@@ -1107,12 +1107,13 @@
 ptnet_nm_config(struct netmap_adapter *na, struct nm_config_info *info)
 {
 	struct ptnet_softc *sc = if_getsoftc(na->ifp);
+	uint64_t offset = 0;
 
 	info->num_tx_rings = bus_read_4(sc->iomem, PTNET_IO_NUM_TX_RINGS);
 	info->num_rx_rings = bus_read_4(sc->iomem, PTNET_IO_NUM_RX_RINGS);
 	info->num_tx_descs = bus_read_4(sc->iomem, PTNET_IO_NUM_TX_SLOTS);
 	info->num_rx_descs = bus_read_4(sc->iomem, PTNET_IO_NUM_RX_SLOTS);
-	info->rx_buf_maxsize = NETMAP_BUF_SIZE(na);
+	info->rx_buf_maxsize = NETMAP_BUF_SIZE(na, offset);
 
 	device_printf(sc->dev, "txr %u, rxr %u, txd %u, rxd %u, rxbufsz %u\n",
 			info->num_tx_rings, info->num_rx_rings,
@@ -1801,7 +1802,7 @@
 
 		/* Initialize transmission state variables. */
 		slot = ring->slot + head;
-		nmbuf = NMB(na, slot);
+		nmbuf = NMB(kring, slot);
 		nmbuf_bytes = 0;
 
 		/* If needed, prepare the virtio-net header at the beginning
@@ -1842,7 +1843,8 @@
 			int mlen = mf->m_len;
 
 			for (;;) {
-				int copy = NETMAP_BUF_SIZE(na) - nmbuf_bytes;
+				uint64_t offset = kring->fixed_buf_offset + slot->offset;
+				int copy = NETMAP_BUF_SIZE(na, offset) - nmbuf_bytes;
 
 				if (mlen < copy) {
 					copy = mlen;
@@ -1865,7 +1867,7 @@
 				KASSERT(head != ring->tail,
 					("Unexpectedly run out of TX space"));
 				slot = ring->slot + head;
-				nmbuf = NMB(na, slot);
+				nmbuf = NMB(kring, slot);
 				nmbuf_bytes = 0;
 			}
 		}
@@ -2074,7 +2076,7 @@
 		/* Initialize ring state variables, possibly grabbing the
 		 * virtio-net header. */
 		slot = ring->slot + head;
-		nmbuf = NMB(na, slot);
+		nmbuf = NMB(kring, slot);
 		nmbuf_len = slot->len;
 
 		vh = (struct virtio_net_hdr *)nmbuf;
@@ -2160,7 +2162,7 @@
 			}
 
 			slot = ring->slot + head;
-			nmbuf = NMB(na, slot);
+			nmbuf = NMB(kring, slot);
 			nmbuf_len = slot->len;
 			mhead->m_pkthdr.len += nmbuf_len;
 		}

Modified: soc2018/sduo/head/sys/dev/netmap/if_re_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_re_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_re_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -94,9 +94,10 @@
 
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			/* device-specific */
 			struct rl_desc *desc = &sc->rl_ldata.rl_tx_list[nic_i];
@@ -113,7 +114,8 @@
 				desc->rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr));
 				desc->rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr));
 				netmap_reload_map(na, sc->rl_ldata.rl_tx_mtag,
-					txd[nic_i].tx_dmamap, addr);
+					txd[nic_i].tx_dmamap, addr,
+					NETMAP_BUF_SIZE(na, offset));
 			}
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 
@@ -236,11 +238,12 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			struct rl_desc *desc = &sc->rl_ldata.rl_rx_list[nic_i];
-			int cmd = NETMAP_BUF_SIZE(na) | RL_RDESC_CMD_OWN;
+			int cmd = NETMAP_BUF_SIZE(na, offset) | RL_RDESC_CMD_OWN;
 
 			if (addr == NETMAP_BUF_BASE(na)) /* bad buf */
 				goto ring_reset;
@@ -253,7 +256,8 @@
 				desc->rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr));
 				desc->rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr));
 				netmap_reload_map(na, sc->rl_ldata.rl_rx_mtag,
-					rxd[nic_i].rx_dmamap, addr);
+					rxd[nic_i].rx_dmamap, addr,
+					NETMAP_BUF_SIZE(na, offset));
 				slot->flags &= ~NS_BUF_CHANGED;
 			}
 			desc->rl_cmdstat = htole32(cmd);
@@ -301,14 +305,17 @@
 
 	/* l points in the netmap ring, i points in the NIC ring */
 	for (i = 0; i < n; i++) {
+		struct netmap_kring *kring = na->tx_rings[0];
+		uint64_t offset = kring->fixed_buf_offset;
 		uint64_t paddr;
-		int l = netmap_idx_n2k(na->tx_rings[0], i);
-		void *addr = PNMB(na, slot + l, &paddr);
+		int l = netmap_idx_n2k(kring, i);
+		void *addr = PNMB(kring, slot + l, &paddr);
 
 		desc[i].rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr));
 		desc[i].rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr));
 		netmap_load_map(na, sc->rl_ldata.rl_tx_mtag,
-			txd[i].tx_dmamap, addr);
+			txd[i].tx_dmamap, addr,
+			NETMAP_BUF_SIZE(na, offset));
 	}
 }
 
@@ -318,6 +325,7 @@
 	struct netmap_adapter *na = NA(sc->rl_ifp);
 	struct netmap_slot *slot = netmap_reset(na, NR_RX, 0, 0);
 	struct rl_desc *desc = sc->rl_ldata.rl_rx_list;
+	struct netmap_kring *kring = na->rx_rings[0];
 	uint32_t cmdstat;
 	uint32_t nic_i, max_avail;
 	uint32_t const n = sc->rl_ldata.rl_rx_desc_cnt;
@@ -328,21 +336,23 @@
 	 * Do not release the slots owned by userspace,
 	 * and also keep one empty.
 	 */
-	max_avail = n - 1 - nm_kr_rxspace(na->rx_rings[0]);
+	max_avail = n - 1 - nm_kr_rxspace(kring);
 	for (nic_i = 0; nic_i < n; nic_i++) {
+		uint32_t nm_i = netmap_idx_n2k(kring, nic_i);
+		uint64_t offset = kring->fixed_buf_offset + (slot + nm_i)->offset;
 		void *addr;
 		uint64_t paddr;
-		uint32_t nm_i = netmap_idx_n2k(na->rx_rings[0], nic_i);
 
-		addr = PNMB(na, slot + nm_i, &paddr);
+		addr = PNMB(kring, slot + nm_i, &paddr);
 
 		netmap_reload_map(na, sc->rl_ldata.rl_rx_mtag,
-		    sc->rl_ldata.rl_rx_desc[nic_i].rx_dmamap, addr);
+		    sc->rl_ldata.rl_rx_desc[nic_i].rx_dmamap,
+		    addr, NETMAP_BUF_SIZE(na, offset));
 		bus_dmamap_sync(sc->rl_ldata.rl_rx_mtag,
 		    sc->rl_ldata.rl_rx_desc[nic_i].rx_dmamap, BUS_DMASYNC_PREREAD);
 		desc[nic_i].rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr));
 		desc[nic_i].rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr));
-		cmdstat = NETMAP_BUF_SIZE(na);
+		cmdstat = NETMAP_BUF_SIZE(na, offset);
 		if (nic_i == n - 1) /* mark the end of ring */
 			cmdstat |= RL_RDESC_CMD_EOR;
 		if (nic_i < max_avail)

Modified: soc2018/sduo/head/sys/dev/netmap/if_vtnet_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/if_vtnet_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/if_vtnet_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -140,7 +140,7 @@
 			struct netmap_slot *slot = &ring->slot[nm_i];
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
                         int err;
 
 			NM_CHECK_ADDR_LEN(na, addr, len);
@@ -242,8 +242,9 @@
 	for (n = 0; nm_i != head; n++) {
 		static struct virtio_net_hdr_mrg_rxbuf hdr;
 		struct netmap_slot *slot = &ring->slot[nm_i];
+		uint64_t offset = kring->fixed_buf_offset + slot->offset;
 		uint64_t paddr;
-		void *addr = PNMB(na, slot, &paddr);
+		void *addr = PNMB(kring, slot, &paddr);
 		int err = 0;
 
 		if (addr == NETMAP_BUF_BASE(na)) { /* bad buf */
@@ -254,7 +255,7 @@
 		slot->flags &= ~NS_BUF_CHANGED;
 		sglist_reset(&sg); // cheap
 		err = sglist_append(&sg, &hdr, sc->vtnet_hdr_size);
-		err = sglist_append_phys(&sg, paddr, NETMAP_BUF_SIZE(na));
+		err = sglist_append_phys(&sg, paddr, NETMAP_BUF_SIZE(na, offset));
 		/* writable for the host */
 		err = virtqueue_enqueue(vq, rxq, &sg, 0, sg.sg_nseg);
 		if (err < 0) {

Modified: soc2018/sduo/head/sys/dev/netmap/ixgbe_netmap.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/ixgbe_netmap.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/ixgbe_netmap.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -236,9 +236,10 @@
 
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset;
 			u_int len = slot->len;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			/* device-specific */
 			union ixgbe_adv_tx_desc *curr = &txr->tx_base[nic_i];
@@ -255,7 +256,8 @@
 
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, txr->txtag, txbuf->map, addr);
+				netmap_reload_map(na, txr->txtag, txbuf->map,
+					addr, NETMAP_BUF_SIZE(na, offset));
 			}
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 
@@ -437,8 +439,9 @@
 		nic_i = netmap_idx_k2n(kring, nm_i);
 		for (n = 0; nm_i != head; n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			uint64_t paddr;
-			void *addr = PNMB(na, slot, &paddr);
+			void *addr = PNMB(kring, slot, &paddr);
 
 			union ixgbe_adv_rx_desc *curr = &rxr->rx_base[nic_i];
 			struct ixgbe_rx_buf *rxbuf = &rxr->rx_buffers[nic_i];
@@ -448,7 +451,8 @@
 
 			if (slot->flags & NS_BUF_CHANGED) {
 				/* buffer has changed, reload map */
-				netmap_reload_map(na, rxr->ptag, rxbuf->pmap, addr);
+				netmap_reload_map(na, rxr->ptag, rxbuf->pmap,
+					addr, NETMAP_BUF_SIZE(na, offset));
 				slot->flags &= ~NS_BUF_CHANGED;
 			}
 			curr->wb.upper.status_error = 0;

Modified: soc2018/sduo/head/sys/dev/netmap/netmap.c
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/netmap.c	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/netmap.c	Thu Aug  2 10:03:51 2018	(r337276)
@@ -1163,16 +1163,17 @@
 	for (n = kring->nr_hwcur; n != head; n = nm_next(n, lim)) {
 		struct mbuf *m;
 		struct netmap_slot *slot = &kring->ring->slot[n];
+		uint64_t offset = kring->fixed_buf_offset + slot->offset;
 
 		if ((slot->flags & NS_FORWARD) == 0 && !force)
 			continue;
-		if (slot->len < 14 || slot->len > NETMAP_BUF_SIZE(na)) {
+		if (slot->len < 14 || slot->len > NETMAP_BUF_SIZE(na, offset)) {
 			RD(5, "bad pkt at %d len %d", n, slot->len);
 			continue;
 		}
 		slot->flags &= ~NS_FORWARD; // XXX needed ?
 		/* XXX TODO: adapt to the case of a multisegment packet */
-		m = m_devget(NMB(na, slot), slot->len, 0, na->ifp, NULL);
+		m = m_devget(NMB(kring, slot), slot->len, 0, na->ifp, NULL);
 
 		if (m == NULL)
 			break;
@@ -1328,10 +1329,10 @@
 			int len = MBUF_LEN(m);
 			struct netmap_slot *slot = &ring->slot[nm_i];
 
-			m_copydata(m, 0, len, NMB(na, slot));
+			m_copydata(m, 0, len, NMB(kring, slot));
 			ND("nm %d len %d", nm_i, len);
 			if (netmap_verbose)
-				D("%s", nm_dump_buf(NMB(na, slot),len, 128, NULL));
+				D("%s", nm_dump_buf(NMB(kring, slot),len, 128, NULL));
 
 			slot->len = len;
 			slot->flags = 0;
@@ -1770,11 +1771,13 @@
 	for (i = 0; i <= lim; i++) {
 		u_int idx = ring->slot[i].buf_idx;
 		u_int len = ring->slot[i].len;
+		uint64_t offset = kring->fixed_buf_offset + ring->slot[i].offset;
+
 		if (idx < 2 || idx >= kring->na->na_lut.objtotal) {
 			RD(5, "bad index at slot %d idx %d len %d ", i, idx, len);
 			ring->slot[i].buf_idx = 0;
 			ring->slot[i].len = 0;
-		} else if (len > NETMAP_BUF_SIZE(kring->na)) {
+		} else if (len > NETMAP_BUF_SIZE(kring->na, offset)) {
 			ring->slot[i].len = 0;
 			RD(5, "bad len at slot %d idx %d len %d", i, idx, len);
 		}
@@ -2091,7 +2094,8 @@
  */
 int
 netmap_do_regif(struct netmap_priv_d *priv, struct netmap_adapter *na,
-	uint32_t nr_mode, uint16_t nr_ringid, uint64_t nr_flags)
+	uint32_t nr_mode, uint16_t nr_ringid, uint64_t nr_flags,
+	uint64_t fixed_buf_offset)
 {
 	struct netmap_if *nifp = NULL;
 	int error;
@@ -2128,7 +2132,7 @@
 		 */
 		if (na->ifp && nm_priv_rx_enabled(priv)) {
 			/* This netmap adapter is attached to an ifnet. */
-			unsigned nbs = NETMAP_BUF_SIZE(na);
+			unsigned nbs = NETMAP_BUF_SIZE(na, fixed_buf_offset);
 			unsigned mtu = nm_os_ifnet_mtu(na->ifp);
 
 			ND("%s: mtu %d rx_buf_maxsize %d netmap_buf_size %d",
@@ -2250,6 +2254,89 @@
 	return error;
 }
 
+/* Checks that every every buffer, belonging to [first_ring, last_ring[
+ * (tx/rx dependings on t) of the specified na, is bigger than the
+ * specified offset.
+ */
+int
+check_fixed_offset(struct netmap_adapter *na, enum txrx t, u_int first_ring,
+		u_int last_ring, uint64_t offset)
+{
+	u_int i;
+
+	for (i = first_ring; i < last_ring; ++i) {
+		struct netmap_kring *kring = NMR(na, t)[i];
+		struct netmap_ring *ring = kring->ring;
+
+		if (ring->nr_buf_size <= offset) {
+			return EINVAL;
+		}
+	}
+
+	return 0;
+}
+
+/* Sets the fields needed to use the specified offset for every
+ * buffer belonging to [first_ring, last_ring[ (tx/rx dependings on t)
+ * of the specified na.
+ */
+void
+set_fixed_offset(struct netmap_adapter *na, enum txrx t, u_int first_ring,
+		u_int last_ring, uint64_t offset)
+{
+	u_int i;
+
+	for (i = first_ring; i < last_ring; ++i) {
+		struct netmap_kring *kring = NMR(na, t)[i];
+		struct netmap_ring *ring = kring->ring;
+		uint32_t buf_size;
+		int j;
+
+		kring->fixed_buf_offset = offset;
+		ring->fixed_buf_offset = offset;
+		buf_size = ring->nr_buf_size - offset;
+		*(uint32_t *)(uintptr_t)&ring->nr_buf_size = buf_size;
+		for (j = 0; j < ring->num_slots; ++j) {
+			struct netmap_slot *slot = &ring->slot[j];
+
+			slot->len -= offset;
+		}
+	}
+}
+
+/* Default callback to set fixed per-ring offsets. Applies the offset
+ * to every ring the request is trying to open.
+ */
+int
+netmap_set_fixed_offset(struct netmap_adapter *na, struct netmap_priv_d *priv,
+		struct nmreq_opt_ring_offset *opt)
+{
+	uint64_t fixed_buf_offset;
+	enum txrx t;
+	int ret;
+
+	if (opt == NULL) {
+		return 0;
+	}
+
+	fixed_buf_offset = opt->nro_fixed_buf_offset;
+	for_rx_tx(t) {
+		ret = check_fixed_offset(na, t, priv->np_qfirst[t],
+				priv->np_qlast[t], fixed_buf_offset);
+		if (ret != 0) {
+			opt->nro_opt.nro_status = ret;
+			return ret;
+		}
+	}
+
+	for_rx_tx(t) {
+		set_fixed_offset(na, t, priv->np_qfirst[t], priv->np_qlast[t],
+				fixed_buf_offset);
+	}
+
+	opt->nro_opt.nro_status = 0;
+	return 0;
+}
 
 /*
  * update kring and ring at the end of rxsync/txsync.
@@ -2282,6 +2369,40 @@
 static int nmreq_copyout(struct nmreq_header *, int);
 static int nmreq_checkoptions(struct nmreq_header *);
 
+static int
+netmap_handle_slot_offset(struct nmreq_header *hdr, struct netmap_adapter *na)
+{
+	struct nmreq_opt_slot_offset *off_opt;
+	struct nmreq_option *opt;
+	uint32_t mem_flag;
+	int error;
+
+	if (hdr->nr_flags & NETMAP_REQ_LEGACY) {
+		/* Legacy requests do not support per-slot variable offsets */
+		mem_flag = NETMAP_MEM_LEGACY;
+		opt = NULL;
+	} else {
+		opt = nmreq_findoption((struct nmreq_option *)(uintptr_t)hdr->nr_options,
+			NETMAP_REQ_OPT_SLOT_OFFSET);
+		if (opt == NULL) {
+			/* Default behaviour: per-slot variable offsets disabled */
+			mem_flag = NETMAP_MEM_LEGACY;
+		} else {
+			/* If there's an option embedded in the request,
+			 * do as the user says */
+			off_opt = (struct nmreq_opt_slot_offset *)opt;
+			mem_flag = (off_opt->nro_enable == 0) ?
+				NETMAP_MEM_LEGACY : NETMAP_MEM_OFFSET;
+		}
+	}
+
+	error = netmap_mem_flag_offset(na->nm_mem, mem_flag);
+	if (opt != NULL) {
+		opt->nro_status = error;
+	}
+	return error;
+}
+
 /*
  * ioctl(2) support for the "netmap" device.
  *
@@ -2346,10 +2467,10 @@
 			/* Protect access to priv from concurrent requests. */
 			NMG_LOCK();
 			do {
-				u_int memflags;
-#ifdef WITH_EXTMEM
+				struct nmreq_opt_ring_offset *off_opt = NULL;
+				uint64_t fixed_buf_offset;
 				struct nmreq_option *opt;
-#endif /* WITH_EXTMEM */
+				u_int memflags;
 
 				if (priv->np_nifp != NULL) {	/* thread already registered */
 					error = EBUSY;
@@ -2375,7 +2496,6 @@
 						break;
 				}
 #endif /* WITH_EXTMEM */
-
 				if (nmd == NULL && req->nr_mem_id) {
 					/* find the allocator and get a reference */
 					nmd = netmap_mem_find(req->nr_mem_id);
@@ -2399,8 +2519,23 @@
 					break;
 				}
 
+				opt = nmreq_findoption(
+					(struct nmreq_option *)(uintptr_t)hdr->nr_options,
+					NETMAP_REQ_OPT_RING_OFFSET);
+				if (opt == NULL) {
+					fixed_buf_offset = 0;
+				} else if (nmreq_checkduplicate(opt) != 0) {
+					opt->nro_status = EINVAL;
+					error = opt->nro_status;
+					break;
+				} else {
+					off_opt = (struct nmreq_opt_ring_offset *)opt;
+					fixed_buf_offset = off_opt->nro_fixed_buf_offset;
+				}
+
 				error = netmap_do_regif(priv, na, req->nr_mode,
-							req->nr_ringid, req->nr_flags);
+							req->nr_ringid, req->nr_flags,
+							fixed_buf_offset);
 				if (error) {    /* reg. failed, release priv and ref */
 					break;
 				}
@@ -2412,6 +2547,7 @@
 				req->nr_tx_rings = na->num_tx_rings;
 				req->nr_rx_slots = na->num_rx_desc;
 				req->nr_tx_slots = na->num_tx_desc;
+
 				error = netmap_mem_get_info(na->nm_mem, &req->nr_memsize, &memflags,
 					&req->nr_mem_id);
 				if (error) {
@@ -2437,8 +2573,29 @@
 				}
 				req->nr_offset = netmap_mem_if_offset(na->nm_mem, nifp);
 
+				/* Fixed per-ring offset handling */
+				if (na->nm_set_fixed_offset != NULL) {
+					nm_prinf("netmap: setting fixed offset for %s\n",
+							na->name);
+					error = na->nm_set_fixed_offset(na, priv, off_opt);
+					if (error != 0) {
+						nm_prinf("netmap: error while setting "
+								"fixed offset\n");
+						netmap_do_unregif(priv);
+						break;
+					}
+				}
+
+				error = netmap_handle_slot_offset(hdr, na);
+				if (error != 0) {
+					nm_prinf("netmap: failed to set slot offsets\n");
+					netmap_do_unregif(priv);
+					break;
+				}
+
 				error = nmreq_checkoptions(hdr);
 				if (error) {
+					nm_prinf("netmap: an option failed\n");
 					netmap_do_unregif(priv);
 					break;
 				}
@@ -2558,7 +2715,8 @@
 					(struct netmap_vp_adapter *)na;
 				na->virt_hdr_len = req->nr_hdr_len;
 				if (na->virt_hdr_len) {
-					vpna->mfs = NETMAP_BUF_SIZE(na);
+					/* TODO: Retrieve biggest offset from krings? */
+					vpna->mfs = NETMAP_BUF_SIZE(na, 0);
 				}
 				D("Using vnet_hdr_len %d for %p", na->virt_hdr_len, na);
 				netmap_adapter_put(na);
@@ -2761,6 +2919,12 @@
 		rv = sizeof(struct nmreq_opt_extmem);
 		break;
 #endif /* WITH_EXTMEM */
+	case NETMAP_REQ_OPT_RING_OFFSET:
+		rv = sizeof(struct nmreq_opt_ring_offset);
+		break;
+	case NETMAP_REQ_OPT_SLOT_OFFSET:
+		rv = sizeof(struct nmreq_opt_slot_offset);
+		break;
 	}
 	/* subtract the common header */
 	return rv - sizeof(struct nmreq_option);
@@ -3602,6 +3766,7 @@
 	u_int len = MBUF_LEN(m);
 	u_int error = ENOBUFS;
 	unsigned int txr;
+	uint64_t offset;
 	struct mbq *q;
 	int busy;
 	u_int i;
@@ -3611,6 +3776,7 @@
 		i = i % na->num_host_rx_rings;
 	}
 	kring = NMR(na, NR_RX)[nma_get_nrings(na, NR_RX) + i];
+	offset = kring->fixed_buf_offset;
 
 	// XXX [Linux] we do not need this lock
 	// if we follow the down/configure/up protocol -gl
@@ -3635,9 +3801,9 @@
 	q = &kring->rx_queue;
 
 	// XXX reconsider long packets if we handle fragments
-	if (len > NETMAP_BUF_SIZE(na)) { /* too long for us */
+	if (len > NETMAP_BUF_SIZE(na, offset)) { /* too long for us */
 		D("%s from_host, drop packet size %d > %d", na->name,
-			len, NETMAP_BUF_SIZE(na));
+			len, NETMAP_BUF_SIZE(na, offset));
 		goto done;
 	}
 

Modified: soc2018/sduo/head/sys/dev/netmap/netmap_bdg.c
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/netmap_bdg.c	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/netmap_bdg.c	Thu Aug  2 10:03:51 2018	(r337276)
@@ -1130,7 +1130,6 @@
 static int
 netmap_vp_rxsync_locked(struct netmap_kring *kring, int flags)
 {
-	struct netmap_adapter *na = kring->na;
 	struct netmap_ring *ring = kring->ring;
 	u_int nm_i, lim = kring->nkr_num_slots - 1;
 	u_int head = kring->rhead;
@@ -1151,7 +1150,7 @@
 		/* consistency check, but nothing really important here */
 		for (n = 0; likely(nm_i != head); n++) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
-			void *addr = NMB(na, slot);
+			void *addr = NMB(kring, slot);
 
 			if (addr == NETMAP_BUF_BASE(kring->na)) { /* bad buf */
 				D("bad buffer index %d, ignore ?",
@@ -1436,10 +1435,6 @@
 				NMR(na, t)[i]->ring = NULL;
 			}
 		}
-		/* reset the number of host rings to default */
-		for_rx_tx(t) {
-			nma_set_host_nrings(hwna, t, 1);
-		}
 
 	}
 
@@ -1658,7 +1653,7 @@
 			return ENOMEM;
 		npriv->np_ifp = na->ifp; /* let the priv destructor release the ref */
 		error = netmap_do_regif(npriv, na, req->reg.nr_mode,
-					req->reg.nr_ringid, req->reg.nr_flags);
+					req->reg.nr_ringid, req->reg.nr_flags, 0);
 		if (error) {
 			netmap_priv_delete(npriv);
 			return error;
@@ -1726,24 +1721,12 @@
 			na->na_flags |= NAF_SW_ONLY;
 		na->na_flags |= NAF_HOST_RINGS;
 		hostna = &bna->host.up;
-
-		/* limit the number of host rings to that of hw */
-		nm_bound_var(&hostna->num_tx_rings, 1, 1,
-				nma_get_nrings(hwna, NR_TX), NULL);
-		nm_bound_var(&hostna->num_rx_rings, 1, 1,
-				nma_get_nrings(hwna, NR_RX), NULL);
-
 		snprintf(hostna->name, sizeof(hostna->name), "%s^", na->name);
 		hostna->ifp = hwna->ifp;
 		for_rx_tx(t) {
 			enum txrx r = nm_txrx_swap(t);
-			u_int nr = nma_get_nrings(hostna, t);
-
-			nma_set_nrings(hostna, t, nr);
-			nma_set_host_nrings(na, t, nr);
-			if (nma_get_host_nrings(hwna, t) < nr) {
-				nma_set_host_nrings(hwna, t, nr);
-			}
+			nma_set_nrings(hostna, t, 1);
+			nma_set_host_nrings(na, t, 1);
 			nma_set_ndesc(hostna, t, nma_get_ndesc(hwna, r));
 		}
 		// hostna->nm_txsync = netmap_bwrap_host_txsync;

Modified: soc2018/sduo/head/sys/dev/netmap/netmap_generic.c
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/netmap_generic.c	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/netmap_generic.c	Thu Aug  2 10:03:51 2018	(r337276)
@@ -708,8 +708,9 @@
 
 		while (nm_i != head) {
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = kring->fixed_buf_offset + slot->offset;
 			u_int len = slot->len;
-			void *addr = NMB(na, slot);
+			void *addr = NMB(kring, slot);
 			/* device-specific */
 			struct mbuf *m;
 			int tx_ret;
@@ -721,7 +722,7 @@
 			m = kring->tx_pool[nm_i];
 			if (unlikely(m == NULL)) {
 				kring->tx_pool[nm_i] = m =
-					nm_os_get_mbuf(ifp, NETMAP_BUF_SIZE(na));
+					nm_os_get_mbuf(ifp, NETMAP_BUF_SIZE(na, offset));
 				if (m == NULL) {
 					RD(2, "Failed to replenish mbuf");
 					/* Here we could schedule a timer which
@@ -835,12 +836,14 @@
 	struct netmap_kring *kring;
 	u_int work_done;
 	u_int r = MBUF_RXQ(m); /* receive ring number */
+	uint64_t offset;
 
 	if (r >= na->num_rx_rings) {
 		r = r % na->num_rx_rings;
 	}
 
 	kring = na->rx_rings[r];
+	offset = kring->fixed_buf_offset;
 
 	if (kring->nr_mode == NKR_NETMAP_OFF) {
 		/* We must not intercept this mbuf. */
@@ -848,7 +851,7 @@
 	}
 
 	/* limit the size of the queue */
-	if (unlikely(!gna->rxsg && MBUF_LEN(m) > NETMAP_BUF_SIZE(na))) {
+	if (unlikely(!gna->rxsg && MBUF_LEN(m) > NETMAP_BUF_SIZE(na, offset))) {
 		/* This may happen when GRO/LRO features are enabled for
 		 * the NIC driver when the generic adapter does not
 		 * support RX scatter-gather. */
@@ -892,6 +895,7 @@
 {
 	struct netmap_ring *ring = kring->ring;
 	struct netmap_adapter *na = kring->na;
+	uint64_t offset = kring->fixed_buf_offset;
 	u_int nm_i;	/* index into the netmap ring */ //j,
 	u_int n;
 	u_int const lim = kring->nkr_num_slots - 1;
@@ -899,7 +903,7 @@
 	int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR;
 
 	/* Adapter-specific variables. */
-	u_int nm_buf_len = NETMAP_BUF_SIZE(na);
+	u_int nm_buf_len = NETMAP_BUF_SIZE(na, offset);
 	struct mbq tmpq;
 	struct mbuf *m;
 	int avail; /* in bytes */
@@ -1000,7 +1004,7 @@
 		}
 
 		do {
-			nmaddr = NMB(na, &ring->slot[nm_i]);
+			nmaddr = NMB(kring, &ring->slot[nm_i]);
 			/* We only check the address here on generic rx rings. */
 			if (nmaddr == NETMAP_BUF_BASE(na)) { /* Bad buffer */
 				m_freem(m);
@@ -1117,11 +1121,11 @@
 	na->ifp = ifp;
 	na->num_tx_desc = num_tx_desc;
 	na->num_rx_desc = num_rx_desc;
-	na->rx_buf_maxsize = 32768;
 	na->nm_register = &generic_netmap_register;
 	na->nm_txsync = &generic_netmap_txsync;
 	na->nm_rxsync = &generic_netmap_rxsync;
 	na->nm_dtor = &generic_netmap_dtor;
+	na->nm_set_fixed_offset = &netmap_set_fixed_offset;
 	/* when using generic, NAF_NETMAP_ON is set so we force
 	 * NAF_SKIP_INTR to use the regular interrupt handler
 	 */

Modified: soc2018/sduo/head/sys/dev/netmap/netmap_kern.h
==============================================================================
--- soc2018/sduo/head/sys/dev/netmap/netmap_kern.h	Thu Aug  2 00:07:30 2018	(r337275)
+++ soc2018/sduo/head/sys/dev/netmap/netmap_kern.h	Thu Aug  2 10:03:51 2018	(r337276)
@@ -538,6 +538,8 @@
 	int (*mon_notify)(struct netmap_kring *kring, int flags);
 
 #endif
+	/* Fixed per-ring offset, set during the first regif. */
+	uint64_t fixed_buf_offset;
 }
 #ifdef _WIN32
 __declspec(align(64));
@@ -676,30 +678,32 @@
 	 */
 	NM_OS_MAGIC magic;
 	uint32_t na_flags;	/* enabled, and other flags */
-#define NAF_SKIP_INTR	1	/* use the regular interrupt handler.
+#define NAF_SKIP_INTR	   1	/* use the regular interrupt handler.
 				 * useful during initialization
 				 */
-#define NAF_SW_ONLY	2	/* forward packets only to sw adapter */
-#define NAF_BDG_MAYSLEEP 4	/* the bridge is allowed to sleep when
+#define NAF_SW_ONLY	   2	/* forward packets only to sw adapter */
+#define NAF_BDG_MAYSLEEP   4	/* the bridge is allowed to sleep when
 				 * forwarding packets coming from this
 				 * interface
 				 */
-#define NAF_MEM_OWNER	8	/* the adapter uses its own memory area
+#define NAF_MEM_OWNER	    8	/* the adapter uses its own memory area
 				 * that cannot be changed
 				 */
-#define NAF_NATIVE      16      /* the adapter is native.
+#define NAF_NATIVE	   16	/* the adapter is native.
 				 * Virtual ports (non persistent vale ports,
 				 * pipes, monitors...) should never use
 				 * this flag.
 				 */
-#define	NAF_NETMAP_ON	32	/* netmap is active (either native or
+#define	NAF_NETMAP_ON	   32	/* netmap is active (either native or
 				 * emulated). Where possible (e.g. FreeBSD)
 				 * IFCAP_NETMAP also mirrors this flag.
 				 */
-#define NAF_HOST_RINGS  64	/* the adapter supports the host rings */
-#define NAF_FORCE_NATIVE 128	/* the adapter is always NATIVE */
+#define NAF_HOST_RINGS	   64	/* the adapter supports the host rings */
+#define NAF_FORCE_NATIVE  128	/* the adapter is always NATIVE */
 #define NAF_PTNETMAP_HOST 256	/* the adapter supports ptnetmap in the host */
-#define NAF_MOREFRAG	512	/* the adapter supports NS_MOREFRAG */
+#define NAF_MOREFRAG	  512	/* the adapter supports NS_MOREFRAG */
+#define NAF_LEGACY_OPEN (1U<<10)
+#define NAF_OFFSET_OPEN (1U<<11)
 #define NAF_ZOMBIE	(1U<<30) /* the nic driver has been unloaded */
 #define	NAF_BUSY	(1U<<31) /* the adapter is used internally and
 				  * cannot be registered from userspace
@@ -862,6 +866,10 @@
 #ifdef WITH_MONITOR
 	unsigned long	monitor_id;	/* debugging */
 #endif
+
+	/* Called during a NETMAP_REQ_REGISTER to handle fixed offset */
+	int (*nm_set_fixed_offset)(struct netmap_adapter *,
+			struct netmap_priv_d *, struct nmreq_opt_ring_offset *);
 };
 
 static __inline u_int
@@ -1364,16 +1372,19 @@
 /* check/fix address and len in tx rings */
 #if 1 /* debug version */
 #define	NM_CHECK_ADDR_LEN(_na, _a, _l)	do {				\
-	if (_a == NETMAP_BUF_BASE(_na) || _l > NETMAP_BUF_SIZE(_na)) {	\
+	uint64_t offset = kring->fixed_buf_offset;			\
+	if (_a == NETMAP_BUF_BASE(_na) ||				\
+	    _l > NETMAP_BUF_SIZE(_na, offset)) {			\
 		RD(5, "bad addr/len ring %d slot %d idx %d len %d",	\
 			kring->ring_id, nm_i, slot->buf_idx, len);	\
-		if (_l > NETMAP_BUF_SIZE(_na))				\
-			_l = NETMAP_BUF_SIZE(_na);			\
+		if (_l > NETMAP_BUF_SIZE(_na, offset))			\
+			_l = NETMAP_BUF_SIZE(_na, offset);		\

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-soc-all mailing list