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