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 --- |