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