Deleted Added
full compact
netmap_legacy.c (341477) netmap_legacy.c (342033)
1/*
2 * Copyright (C) 2018 Vincenzo Maffione
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
1/*
2 * Copyright (C) 2018 Vincenzo Maffione
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26/* $FreeBSD: stable/11/sys/dev/netmap/netmap_legacy.c 341477 2018-12-04 17:40:56Z vmaffione $ */
26/* $FreeBSD: stable/11/sys/dev/netmap/netmap_legacy.c 342033 2018-12-13 10:13:29Z vmaffione $ */
27
28#if defined(__FreeBSD__)
29#include <sys/cdefs.h> /* prerequisite */
30#include <sys/types.h>
31#include <sys/param.h> /* defines used in kernel.h */
32#include <sys/filio.h> /* FIONBIO */
33#include <sys/malloc.h>
34#include <sys/socketvar.h> /* struct socket */

--- 13 unchanged lines hidden (view full) ---

48#include "win_glue.h"
49#endif
50
51/*
52 * common headers
53 */
54#include <net/netmap.h>
55#include <dev/netmap/netmap_kern.h>
27
28#if defined(__FreeBSD__)
29#include <sys/cdefs.h> /* prerequisite */
30#include <sys/types.h>
31#include <sys/param.h> /* defines used in kernel.h */
32#include <sys/filio.h> /* FIONBIO */
33#include <sys/malloc.h>
34#include <sys/socketvar.h> /* struct socket */

--- 13 unchanged lines hidden (view full) ---

48#include "win_glue.h"
49#endif
50
51/*
52 * common headers
53 */
54#include <net/netmap.h>
55#include <dev/netmap/netmap_kern.h>
56#include <dev/netmap/netmap_bdg.h>
56
57static int
58nmreq_register_from_legacy(struct nmreq *nmr, struct nmreq_header *hdr,
59 struct nmreq_register *req)
60{
61 req->nr_offset = nmr->nr_offset;
62 req->nr_memsize = nmr->nr_memsize;
63 req->nr_tx_slots = nmr->nr_tx_slots;

--- 8 unchanged lines hidden (view full) ---

72 u_int regmode = NR_REG_DEFAULT;
73 if (req->nr_ringid & NETMAP_SW_RING) {
74 regmode = NR_REG_SW;
75 } else if (req->nr_ringid & NETMAP_HW_RING) {
76 regmode = NR_REG_ONE_NIC;
77 } else {
78 regmode = NR_REG_ALL_NIC;
79 }
57
58static int
59nmreq_register_from_legacy(struct nmreq *nmr, struct nmreq_header *hdr,
60 struct nmreq_register *req)
61{
62 req->nr_offset = nmr->nr_offset;
63 req->nr_memsize = nmr->nr_memsize;
64 req->nr_tx_slots = nmr->nr_tx_slots;

--- 8 unchanged lines hidden (view full) ---

73 u_int regmode = NR_REG_DEFAULT;
74 if (req->nr_ringid & NETMAP_SW_RING) {
75 regmode = NR_REG_SW;
76 } else if (req->nr_ringid & NETMAP_HW_RING) {
77 regmode = NR_REG_ONE_NIC;
78 } else {
79 regmode = NR_REG_ALL_NIC;
80 }
80 nmr->nr_flags = regmode |
81 (nmr->nr_flags & (~NR_REG_MASK));
81 req->nr_mode = regmode;
82 } else {
83 req->nr_mode = nmr->nr_flags & NR_REG_MASK;
82 }
84 }
83 req->nr_mode = nmr->nr_flags & NR_REG_MASK;
85
84 /* Fix nr_name, nr_mode and nr_ringid to handle pipe requests. */
85 if (req->nr_mode == NR_REG_PIPE_MASTER ||
86 req->nr_mode == NR_REG_PIPE_SLAVE) {
87 char suffix[10];
88 snprintf(suffix, sizeof(suffix), "%c%d",
89 (req->nr_mode == NR_REG_PIPE_MASTER ? '{' : '}'),
90 req->nr_ringid);
91 if (strlen(hdr->nr_name) + strlen(suffix)

--- 31 unchanged lines hidden (view full) ---

123
124 /* Sanitize nmr->nr_name by adding the string terminator. */
125 if (ioctl_cmd == NIOCGINFO || ioctl_cmd == NIOCREGIF) {
126 nmr->nr_name[sizeof(nmr->nr_name) - 1] = '\0';
127 }
128
129 /* First prepare the request header. */
130 hdr->nr_version = NETMAP_API; /* new API */
86 /* Fix nr_name, nr_mode and nr_ringid to handle pipe requests. */
87 if (req->nr_mode == NR_REG_PIPE_MASTER ||
88 req->nr_mode == NR_REG_PIPE_SLAVE) {
89 char suffix[10];
90 snprintf(suffix, sizeof(suffix), "%c%d",
91 (req->nr_mode == NR_REG_PIPE_MASTER ? '{' : '}'),
92 req->nr_ringid);
93 if (strlen(hdr->nr_name) + strlen(suffix)

--- 31 unchanged lines hidden (view full) ---

125
126 /* Sanitize nmr->nr_name by adding the string terminator. */
127 if (ioctl_cmd == NIOCGINFO || ioctl_cmd == NIOCREGIF) {
128 nmr->nr_name[sizeof(nmr->nr_name) - 1] = '\0';
129 }
130
131 /* First prepare the request header. */
132 hdr->nr_version = NETMAP_API; /* new API */
131 strncpy(hdr->nr_name, nmr->nr_name, sizeof(nmr->nr_name));
133 strlcpy(hdr->nr_name, nmr->nr_name, sizeof(nmr->nr_name));
132 hdr->nr_options = (uintptr_t)NULL;
133 hdr->nr_body = (uintptr_t)NULL;
134
135 switch (ioctl_cmd) {
136 case NIOCREGIF: {
137 switch (nmr->nr_cmd) {
138 case 0: {
139 /* Regular NIOCREGIF operation. */

--- 73 unchanged lines hidden (view full) ---

213 break;
214 }
215 req->nr_first_cpu_id = nmr->nr_ringid & NETMAP_RING_MASK;
216 req->nr_num_polling_cpus = nmr->nr_arg1;
217 break;
218 }
219 case NETMAP_PT_HOST_CREATE:
220 case NETMAP_PT_HOST_DELETE: {
134 hdr->nr_options = (uintptr_t)NULL;
135 hdr->nr_body = (uintptr_t)NULL;
136
137 switch (ioctl_cmd) {
138 case NIOCREGIF: {
139 switch (nmr->nr_cmd) {
140 case 0: {
141 /* Regular NIOCREGIF operation. */

--- 73 unchanged lines hidden (view full) ---

215 break;
216 }
217 req->nr_first_cpu_id = nmr->nr_ringid & NETMAP_RING_MASK;
218 req->nr_num_polling_cpus = nmr->nr_arg1;
219 break;
220 }
221 case NETMAP_PT_HOST_CREATE:
222 case NETMAP_PT_HOST_DELETE: {
221 D("Netmap passthrough not supported yet");
223 nm_prerr("Netmap passthrough not supported yet");
222 return NULL;
223 break;
224 }
225 }
226 break;
227 }
228 case NIOCGINFO: {
229 if (nmr->nr_cmd == NETMAP_BDG_LIST) {

--- 4 unchanged lines hidden (view full) ---

234 req->nr_bridge_idx = nmr->nr_arg1;
235 req->nr_port_idx = nmr->nr_arg2;
236 } else {
237 /* Regular NIOCGINFO. */
238 struct nmreq_port_info_get *req = nm_os_malloc(sizeof(*req));
239 if (!req) { goto oom; }
240 hdr->nr_body = (uintptr_t)req;
241 hdr->nr_reqtype = NETMAP_REQ_PORT_INFO_GET;
224 return NULL;
225 break;
226 }
227 }
228 break;
229 }
230 case NIOCGINFO: {
231 if (nmr->nr_cmd == NETMAP_BDG_LIST) {

--- 4 unchanged lines hidden (view full) ---

236 req->nr_bridge_idx = nmr->nr_arg1;
237 req->nr_port_idx = nmr->nr_arg2;
238 } else {
239 /* Regular NIOCGINFO. */
240 struct nmreq_port_info_get *req = nm_os_malloc(sizeof(*req));
241 if (!req) { goto oom; }
242 hdr->nr_body = (uintptr_t)req;
243 hdr->nr_reqtype = NETMAP_REQ_PORT_INFO_GET;
242 req->nr_offset = nmr->nr_offset;
243 req->nr_memsize = nmr->nr_memsize;
244 req->nr_tx_slots = nmr->nr_tx_slots;
245 req->nr_rx_slots = nmr->nr_rx_slots;
246 req->nr_tx_rings = nmr->nr_tx_rings;
247 req->nr_rx_rings = nmr->nr_rx_rings;
248 req->nr_mem_id = nmr->nr_arg2;
249 }
250 break;
251 }
252 }
253
254 return hdr;
255oom:
256 if (hdr) {
257 if (hdr->nr_body) {
258 nm_os_free((void *)(uintptr_t)hdr->nr_body);
259 }
260 nm_os_free(hdr);
261 }
244 req->nr_memsize = nmr->nr_memsize;
245 req->nr_tx_slots = nmr->nr_tx_slots;
246 req->nr_rx_slots = nmr->nr_rx_slots;
247 req->nr_tx_rings = nmr->nr_tx_rings;
248 req->nr_rx_rings = nmr->nr_rx_rings;
249 req->nr_mem_id = nmr->nr_arg2;
250 }
251 break;
252 }
253 }
254
255 return hdr;
256oom:
257 if (hdr) {
258 if (hdr->nr_body) {
259 nm_os_free((void *)(uintptr_t)hdr->nr_body);
260 }
261 nm_os_free(hdr);
262 }
262 D("Failed to allocate memory for nmreq_xyz struct");
263 nm_prerr("Failed to allocate memory for nmreq_xyz struct");
263
264 return NULL;
265}
266
267static void
268nmreq_register_to_legacy(const struct nmreq_register *req, struct nmreq *nmr)
269{
270 nmr->nr_offset = req->nr_offset;

--- 21 unchanged lines hidden (view full) ---

292 struct nmreq_register *req =
293 (struct nmreq_register *)(uintptr_t)hdr->nr_body;
294 nmreq_register_to_legacy(req, nmr);
295 break;
296 }
297 case NETMAP_REQ_PORT_INFO_GET: {
298 struct nmreq_port_info_get *req =
299 (struct nmreq_port_info_get *)(uintptr_t)hdr->nr_body;
264
265 return NULL;
266}
267
268static void
269nmreq_register_to_legacy(const struct nmreq_register *req, struct nmreq *nmr)
270{
271 nmr->nr_offset = req->nr_offset;

--- 21 unchanged lines hidden (view full) ---

293 struct nmreq_register *req =
294 (struct nmreq_register *)(uintptr_t)hdr->nr_body;
295 nmreq_register_to_legacy(req, nmr);
296 break;
297 }
298 case NETMAP_REQ_PORT_INFO_GET: {
299 struct nmreq_port_info_get *req =
300 (struct nmreq_port_info_get *)(uintptr_t)hdr->nr_body;
300 nmr->nr_offset = req->nr_offset;
301 nmr->nr_memsize = req->nr_memsize;
302 nmr->nr_tx_slots = req->nr_tx_slots;
303 nmr->nr_rx_slots = req->nr_rx_slots;
304 nmr->nr_tx_rings = req->nr_tx_rings;
305 nmr->nr_rx_rings = req->nr_rx_rings;
306 nmr->nr_arg2 = req->nr_mem_id;
307 break;
308 }

--- 4 unchanged lines hidden (view full) ---

313 break;
314 }
315 case NETMAP_REQ_VALE_DETACH: {
316 break;
317 }
318 case NETMAP_REQ_VALE_LIST: {
319 struct nmreq_vale_list *req =
320 (struct nmreq_vale_list *)(uintptr_t)hdr->nr_body;
301 nmr->nr_memsize = req->nr_memsize;
302 nmr->nr_tx_slots = req->nr_tx_slots;
303 nmr->nr_rx_slots = req->nr_rx_slots;
304 nmr->nr_tx_rings = req->nr_tx_rings;
305 nmr->nr_rx_rings = req->nr_rx_rings;
306 nmr->nr_arg2 = req->nr_mem_id;
307 break;
308 }

--- 4 unchanged lines hidden (view full) ---

313 break;
314 }
315 case NETMAP_REQ_VALE_DETACH: {
316 break;
317 }
318 case NETMAP_REQ_VALE_LIST: {
319 struct nmreq_vale_list *req =
320 (struct nmreq_vale_list *)(uintptr_t)hdr->nr_body;
321 strncpy(nmr->nr_name, hdr->nr_name, sizeof(nmr->nr_name));
321 strlcpy(nmr->nr_name, hdr->nr_name, sizeof(nmr->nr_name));
322 nmr->nr_arg1 = req->nr_bridge_idx;
323 nmr->nr_arg2 = req->nr_port_idx;
324 break;
325 }
326 case NETMAP_REQ_PORT_HDR_SET:
327 case NETMAP_REQ_PORT_HDR_GET: {
328 struct nmreq_port_hdr *req =
329 (struct nmreq_port_hdr *)(uintptr_t)hdr->nr_body;

--- 96 unchanged lines hidden ---
322 nmr->nr_arg1 = req->nr_bridge_idx;
323 nmr->nr_arg2 = req->nr_port_idx;
324 break;
325 }
326 case NETMAP_REQ_PORT_HDR_SET:
327 case NETMAP_REQ_PORT_HDR_GET: {
328 struct nmreq_port_hdr *req =
329 (struct nmreq_port_hdr *)(uintptr_t)hdr->nr_body;

--- 96 unchanged lines hidden ---