1*b321acabSVincenzo Maffione /* 2*b321acabSVincenzo Maffione * Copyright (C) 2018 Giuseppe Lettieri 3*b321acabSVincenzo Maffione * All rights reserved. 4*b321acabSVincenzo Maffione * 5*b321acabSVincenzo Maffione * Redistribution and use in source and binary forms, with or without 6*b321acabSVincenzo Maffione * modification, are permitted provided that the following conditions 7*b321acabSVincenzo Maffione * are met: 8*b321acabSVincenzo Maffione * 1. Redistributions of source code must retain the above copyright 9*b321acabSVincenzo Maffione * notice, this list of conditions and the following disclaimer. 10*b321acabSVincenzo Maffione * 2. Redistributions in binary form must reproduce the above copyright 11*b321acabSVincenzo Maffione * notice, this list of conditions and the following disclaimer in the 12*b321acabSVincenzo Maffione * documentation and/or other materials provided with the distribution. 13*b321acabSVincenzo Maffione * 14*b321acabSVincenzo Maffione * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*b321acabSVincenzo Maffione * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*b321acabSVincenzo Maffione * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*b321acabSVincenzo Maffione * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*b321acabSVincenzo Maffione * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*b321acabSVincenzo Maffione * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*b321acabSVincenzo Maffione * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*b321acabSVincenzo Maffione * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*b321acabSVincenzo Maffione * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*b321acabSVincenzo Maffione * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*b321acabSVincenzo Maffione * SUCH DAMAGE. 25*b321acabSVincenzo Maffione */ 26*b321acabSVincenzo Maffione /* $FreeBSD$ */ 27*b321acabSVincenzo Maffione 28*b321acabSVincenzo Maffione #if defined(__FreeBSD__) 29*b321acabSVincenzo Maffione #include <sys/cdefs.h> /* prerequisite */ 30*b321acabSVincenzo Maffione 31*b321acabSVincenzo Maffione #include <sys/types.h> 32*b321acabSVincenzo Maffione #include <sys/errno.h> 33*b321acabSVincenzo Maffione #include <sys/param.h> /* defines used in kernel.h */ 34*b321acabSVincenzo Maffione #include <sys/kernel.h> /* types used in module initialization */ 35*b321acabSVincenzo Maffione #include <sys/malloc.h> 36*b321acabSVincenzo Maffione #include <sys/poll.h> 37*b321acabSVincenzo Maffione #include <sys/lock.h> 38*b321acabSVincenzo Maffione #include <sys/rwlock.h> 39*b321acabSVincenzo Maffione #include <sys/selinfo.h> 40*b321acabSVincenzo Maffione #include <sys/sysctl.h> 41*b321acabSVincenzo Maffione #include <sys/socket.h> /* sockaddrs */ 42*b321acabSVincenzo Maffione #include <net/if.h> 43*b321acabSVincenzo Maffione #include <net/if_var.h> 44*b321acabSVincenzo Maffione #include <machine/bus.h> /* bus_dmamap_* */ 45*b321acabSVincenzo Maffione #include <sys/refcount.h> 46*b321acabSVincenzo Maffione 47*b321acabSVincenzo Maffione 48*b321acabSVincenzo Maffione #elif defined(linux) 49*b321acabSVincenzo Maffione 50*b321acabSVincenzo Maffione #include "bsd_glue.h" 51*b321acabSVincenzo Maffione 52*b321acabSVincenzo Maffione #elif defined(__APPLE__) 53*b321acabSVincenzo Maffione 54*b321acabSVincenzo Maffione #warning OSX support is only partial 55*b321acabSVincenzo Maffione #include "osx_glue.h" 56*b321acabSVincenzo Maffione 57*b321acabSVincenzo Maffione #elif defined(_WIN32) 58*b321acabSVincenzo Maffione #include "win_glue.h" 59*b321acabSVincenzo Maffione 60*b321acabSVincenzo Maffione #else 61*b321acabSVincenzo Maffione 62*b321acabSVincenzo Maffione #error Unsupported platform 63*b321acabSVincenzo Maffione 64*b321acabSVincenzo Maffione #endif /* unsupported */ 65*b321acabSVincenzo Maffione 66*b321acabSVincenzo Maffione /* 67*b321acabSVincenzo Maffione * common headers 68*b321acabSVincenzo Maffione */ 69*b321acabSVincenzo Maffione 70*b321acabSVincenzo Maffione #include <net/netmap.h> 71*b321acabSVincenzo Maffione #include <dev/netmap/netmap_kern.h> 72*b321acabSVincenzo Maffione #include <dev/netmap/netmap_mem2.h> 73*b321acabSVincenzo Maffione 74*b321acabSVincenzo Maffione #ifdef WITH_NMNULL 75*b321acabSVincenzo Maffione 76*b321acabSVincenzo Maffione static int 77*b321acabSVincenzo Maffione netmap_null_txsync(struct netmap_kring *kring, int flags) 78*b321acabSVincenzo Maffione { 79*b321acabSVincenzo Maffione (void)kring; 80*b321acabSVincenzo Maffione (void)flags; 81*b321acabSVincenzo Maffione return 0; 82*b321acabSVincenzo Maffione } 83*b321acabSVincenzo Maffione 84*b321acabSVincenzo Maffione static int 85*b321acabSVincenzo Maffione netmap_null_rxsync(struct netmap_kring *kring, int flags) 86*b321acabSVincenzo Maffione { 87*b321acabSVincenzo Maffione (void)kring; 88*b321acabSVincenzo Maffione (void)flags; 89*b321acabSVincenzo Maffione return 0; 90*b321acabSVincenzo Maffione } 91*b321acabSVincenzo Maffione 92*b321acabSVincenzo Maffione static int 93*b321acabSVincenzo Maffione netmap_null_krings_create(struct netmap_adapter *na) 94*b321acabSVincenzo Maffione { 95*b321acabSVincenzo Maffione return netmap_krings_create(na, 0); 96*b321acabSVincenzo Maffione } 97*b321acabSVincenzo Maffione 98*b321acabSVincenzo Maffione static void 99*b321acabSVincenzo Maffione netmap_null_krings_delete(struct netmap_adapter *na) 100*b321acabSVincenzo Maffione { 101*b321acabSVincenzo Maffione netmap_krings_delete(na); 102*b321acabSVincenzo Maffione } 103*b321acabSVincenzo Maffione 104*b321acabSVincenzo Maffione static int 105*b321acabSVincenzo Maffione netmap_null_reg(struct netmap_adapter *na, int onoff) 106*b321acabSVincenzo Maffione { 107*b321acabSVincenzo Maffione if (na->active_fds == 0) { 108*b321acabSVincenzo Maffione if (onoff) 109*b321acabSVincenzo Maffione na->na_flags |= NAF_NETMAP_ON; 110*b321acabSVincenzo Maffione else 111*b321acabSVincenzo Maffione na->na_flags &= ~NAF_NETMAP_ON; 112*b321acabSVincenzo Maffione } 113*b321acabSVincenzo Maffione return 0; 114*b321acabSVincenzo Maffione } 115*b321acabSVincenzo Maffione 116*b321acabSVincenzo Maffione static int 117*b321acabSVincenzo Maffione netmap_null_bdg_attach(const char *name, struct netmap_adapter *na, 118*b321acabSVincenzo Maffione struct nm_bridge *b) 119*b321acabSVincenzo Maffione { 120*b321acabSVincenzo Maffione (void)name; 121*b321acabSVincenzo Maffione (void)na; 122*b321acabSVincenzo Maffione (void)b; 123*b321acabSVincenzo Maffione return EINVAL; 124*b321acabSVincenzo Maffione } 125*b321acabSVincenzo Maffione 126*b321acabSVincenzo Maffione int 127*b321acabSVincenzo Maffione netmap_get_null_na(struct nmreq_header *hdr, struct netmap_adapter **na, 128*b321acabSVincenzo Maffione struct netmap_mem_d *nmd, int create) 129*b321acabSVincenzo Maffione { 130*b321acabSVincenzo Maffione struct nmreq_register *req = (struct nmreq_register *)(uintptr_t)hdr->nr_body; 131*b321acabSVincenzo Maffione struct netmap_null_adapter *nna; 132*b321acabSVincenzo Maffione int error; 133*b321acabSVincenzo Maffione 134*b321acabSVincenzo Maffione if (req->nr_mode != NR_REG_NULL) { 135*b321acabSVincenzo Maffione nm_prdis("not a null port"); 136*b321acabSVincenzo Maffione return 0; 137*b321acabSVincenzo Maffione } 138*b321acabSVincenzo Maffione 139*b321acabSVincenzo Maffione if (!create) { 140*b321acabSVincenzo Maffione nm_prerr("null ports cannot be re-opened"); 141*b321acabSVincenzo Maffione return EINVAL; 142*b321acabSVincenzo Maffione } 143*b321acabSVincenzo Maffione 144*b321acabSVincenzo Maffione if (nmd == NULL) { 145*b321acabSVincenzo Maffione nm_prerr("null ports must use an existing allocator"); 146*b321acabSVincenzo Maffione return EINVAL; 147*b321acabSVincenzo Maffione } 148*b321acabSVincenzo Maffione 149*b321acabSVincenzo Maffione nna = nm_os_malloc(sizeof(*nna)); 150*b321acabSVincenzo Maffione if (nna == NULL) { 151*b321acabSVincenzo Maffione error = ENOMEM; 152*b321acabSVincenzo Maffione goto err; 153*b321acabSVincenzo Maffione } 154*b321acabSVincenzo Maffione snprintf(nna->up.name, sizeof(nna->up.name), "null:%s", hdr->nr_name); 155*b321acabSVincenzo Maffione 156*b321acabSVincenzo Maffione nna->up.nm_txsync = netmap_null_txsync; 157*b321acabSVincenzo Maffione nna->up.nm_rxsync = netmap_null_rxsync; 158*b321acabSVincenzo Maffione nna->up.nm_register = netmap_null_reg; 159*b321acabSVincenzo Maffione nna->up.nm_krings_create = netmap_null_krings_create; 160*b321acabSVincenzo Maffione nna->up.nm_krings_delete = netmap_null_krings_delete; 161*b321acabSVincenzo Maffione nna->up.nm_bdg_attach = netmap_null_bdg_attach; 162*b321acabSVincenzo Maffione nna->up.nm_mem = netmap_mem_get(nmd); 163*b321acabSVincenzo Maffione 164*b321acabSVincenzo Maffione nna->up.num_tx_rings = req->nr_tx_rings; 165*b321acabSVincenzo Maffione nna->up.num_rx_rings = req->nr_rx_rings; 166*b321acabSVincenzo Maffione nna->up.num_tx_desc = req->nr_tx_slots; 167*b321acabSVincenzo Maffione nna->up.num_rx_desc = req->nr_rx_slots; 168*b321acabSVincenzo Maffione error = netmap_attach_common(&nna->up); 169*b321acabSVincenzo Maffione if (error) 170*b321acabSVincenzo Maffione goto free_nna; 171*b321acabSVincenzo Maffione *na = &nna->up; 172*b321acabSVincenzo Maffione netmap_adapter_get(*na); 173*b321acabSVincenzo Maffione nm_prdis("created null %s", nna->up.name); 174*b321acabSVincenzo Maffione 175*b321acabSVincenzo Maffione return 0; 176*b321acabSVincenzo Maffione 177*b321acabSVincenzo Maffione free_nna: 178*b321acabSVincenzo Maffione nm_os_free(nna); 179*b321acabSVincenzo Maffione err: 180*b321acabSVincenzo Maffione return error; 181*b321acabSVincenzo Maffione } 182*b321acabSVincenzo Maffione 183*b321acabSVincenzo Maffione 184*b321acabSVincenzo Maffione #endif /* WITH_NMNULL */ 185