]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/dpdk/examples/netmap_compat/netmap/netmap.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / dpdk / examples / netmap_compat / netmap / netmap.h
diff --git a/ceph/src/spdk/dpdk/examples/netmap_compat/netmap/netmap.h b/ceph/src/spdk/dpdk/examples/netmap_compat/netmap/netmap.h
deleted file mode 100644 (file)
index 677c8a9..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (C) 2011 Matteo Landi, Luigi Rizzo. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the
- *      distribution.
- *
- *   3. Neither the name of the authors nor the names of their contributors
- *      may be used to endorse or promote products derived from this
- *      software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY MATTEO LANDI AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTEO LANDI OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * $FreeBSD: head/sys/net/netmap.h 231198 2012-02-08 11:43:29Z luigi $
- * $Id: netmap.h 10879 2012-04-12 22:48:59Z luigi $
- *
- * Definitions of constants and the structures used by the netmap
- * framework, for the part visible to both kernel and userspace.
- * Detailed info on netmap is available with "man netmap" or at
- *
- *     http://info.iet.unipi.it/~luigi/netmap/
- */
-
-#ifndef _NET_NETMAP_H_
-#define _NET_NETMAP_H_
-
-/*
- * --- Netmap data structures ---
- *
- * The data structures used by netmap are shown below. Those in
- * capital letters are in an mmapp()ed area shared with userspace,
- * while others are private to the kernel.
- * Shared structures do not contain pointers but only memory
- * offsets, so that addressing is portable between kernel and userspace.
-
-
- softc
-+----------------+
-| standard fields|
-| if_pspare[0] ----------+
-+----------------+       |
-                         |
-+----------------+<------+
-|(netmap_adapter)|
-|                |                             netmap_kring
-| tx_rings *--------------------------------->+---------------+
-|                |       netmap_kring         | ring    *---------.
-| rx_rings *--------->+---------------+       | nr_hwcur      |   |
-+----------------+    | ring    *--------.    | nr_hwavail    |   V
-                      | nr_hwcur      |  |    | selinfo       |   |
-                      | nr_hwavail    |  |    +---------------+   .
-                      | selinfo       |  |    |     ...       |   .
-                      +---------------+  |    |(ntx+1 entries)|
-                      |    ....       |  |    |               |
-                      |(nrx+1 entries)|  |    +---------------+
-                      |               |  |
-   KERNEL             +---------------+  |
-                                         |
-  ====================================================================
-                                         |
-   USERSPACE                             |      NETMAP_RING
-                                         +---->+-------------+
-                                             / | cur         |
-   NETMAP_IF  (nifp, one per file desc.)    /  | avail       |
-    +---------------+                      /   | buf_ofs     |
-    | ni_tx_rings   |                     /    +=============+
-    | ni_rx_rings   |                    /     | buf_idx     | slot[0]
-    |               |                   /      | len, flags  |
-    |               |                  /       +-------------+
-    +===============+                 /        | buf_idx     | slot[1]
-    | txring_ofs[0] | (rel.to nifp)--'         | len, flags  |
-    | txring_ofs[1] |                          +-------------+
-  (num_rings+1 entries)                     (nr_num_slots entries)
-    | txring_ofs[n] |                          | buf_idx     | slot[n-1]
-    +---------------+                          | len, flags  |
-    | rxring_ofs[0] |                          +-------------+
-    | rxring_ofs[1] |
-  (num_rings+1 entries)
-    | txring_ofs[n] |
-    +---------------+
-
- * The private descriptor ('softc' or 'adapter') of each interface
- * is extended with a "struct netmap_adapter" containing netmap-related
- * info (see description in dev/netmap/netmap_kernel.h.
- * Among other things, tx_rings and rx_rings point to the arrays of
- * "struct netmap_kring" which in turn reache the various
- * "struct netmap_ring", shared with userspace.
-
- * The NETMAP_RING is the userspace-visible replica of the NIC ring.
- * Each slot has the index of a buffer, its length and some flags.
- * In user space, the buffer address is computed as
- *     (char *)ring + buf_ofs + index*NETMAP_BUF_SIZE
- * In the kernel, buffers do not necessarily need to be contiguous,
- * and the virtual and physical addresses are derived through
- * a lookup table.
- * To associate a different buffer to a slot, applications must
- * write the new index in buf_idx, and set NS_BUF_CHANGED flag to
- * make sure that the kernel updates the hardware ring as needed.
- *
- * Normally the driver is not requested to report the result of
- * transmissions (this can dramatically speed up operation).
- * However the user may request to report completion by setting
- * NS_REPORT.
- */
-struct netmap_slot {
-       uint32_t buf_idx; /* buffer index */
-       uint16_t len;   /* packet length, to be copied to/from the hw ring */
-       uint16_t flags; /* buf changed, etc. */
-#define        NS_BUF_CHANGED  0x0001  /* must resync the map, buffer changed */
-#define        NS_REPORT       0x0002  /* ask the hardware to report results
-                                * e.g. by generating an interrupt
-                                */
-};
-
-/*
- * Netmap representation of a TX or RX ring (also known as "queue").
- * This is a queue implemented as a fixed-size circular array.
- * At the software level, two fields are important: avail and cur.
- *
- * In TX rings:
- *     avail   indicates the number of slots available for transmission.
- *             It is updated by the kernel after every netmap system call.
- *             It MUST BE decremented by the application when it appends a
- *             packet.
- *     cur     indicates the slot to use for the next packet
- *             to send (i.e. the "tail" of the queue).
- *             It MUST BE incremented by the application before
- *             netmap system calls to reflect the number of newly
- *             sent packets.
- *             It is checked by the kernel on netmap system calls
- *             (normally unmodified by the kernel unless invalid).
- *
- *   The kernel side of netmap uses two additional fields in its own
- *   private ring structure, netmap_kring:
- *     nr_hwcur is a copy of nr_cur on an NIOCTXSYNC.
- *     nr_hwavail is the number of slots known as available by the
- *             hardware. It is updated on an INTR (inc by the
- *             number of packets sent) and on a NIOCTXSYNC
- *             (decrease by nr_cur - nr_hwcur)
- *             A special case, nr_hwavail is -1 if the transmit
- *             side is idle (no pending transmits).
- *
- * In RX rings:
- *     avail   is the number of packets available (possibly 0).
- *             It MUST BE decremented by the application when it consumes
- *             a packet, and it is updated to nr_hwavail on a NIOCRXSYNC
- *     cur     indicates the first slot that contains a packet not
- *             processed yet (the "head" of the queue).
- *             It MUST BE incremented by the software when it consumes
- *             a packet.
- *     reserved        indicates the number of buffers before 'cur'
- *             that the application has still in use. Normally 0,
- *             it MUST BE incremented by the application when it
- *             does not return the buffer immediately, and decremented
- *             when the buffer is finally freed.
- *
- *   The kernel side of netmap uses two additional fields in the kring:
- *     nr_hwcur is a copy of nr_cur on an NIOCRXSYNC
- *     nr_hwavail is the number of packets available. It is updated
- *             on INTR (inc by the number of new packets arrived)
- *             and on NIOCRXSYNC (decreased by nr_cur - nr_hwcur).
- *
- * DATA OWNERSHIP/LOCKING:
- *     The netmap_ring is owned by the user program and it is only
- *     accessed or modified in the upper half of the kernel during
- *     a system call.
- *
- *     The netmap_kring is only modified by the upper half of the kernel.
- */
-struct netmap_ring {
-       /*
-        * nr_buf_base_ofs is meant to be used through macros.
-        * It contains the offset of the buffer region from this
-        * descriptor.
-        */
-       ssize_t buf_ofs;
-       uint32_t        num_slots;      /* number of slots in the ring. */
-       uint32_t        avail;          /* number of usable slots */
-       uint32_t        cur;            /* 'current' r/w position */
-       uint32_t        reserved;       /* not refilled before current */
-
-       uint16_t        nr_buf_size;
-       uint16_t        flags;
-#define        NR_TIMESTAMP    0x0002          /* set timestamp on *sync() */
-
-       struct timeval  ts;             /* time of last *sync() */
-
-       /* the slots follow. This struct has variable size */
-       struct netmap_slot slot[0];     /* array of slots. */
-};
-
-
-/*
- * Netmap representation of an interface and its queue(s).
- * There is one netmap_if for each file descriptor on which we want
- * to select/poll.  We assume that on each interface has the same number
- * of receive and transmit queues.
- * select/poll operates on one or all pairs depending on the value of
- * nmr_queueid passed on the ioctl.
- */
-struct netmap_if {
-       char            ni_name[IFNAMSIZ]; /* name of the interface. */
-       u_int   ni_version;     /* API version, currently unused */
-       u_int   ni_rx_rings;    /* number of rx rings */
-       u_int   ni_tx_rings;    /* if zero, same as ni_rx_rings */
-       /*
-        * The following array contains the offset of each netmap ring
-        * from this structure. The first ni_tx_queues+1 entries refer
-        * to the tx rings, the next ni_rx_queues+1 refer to the rx rings
-        * (the last entry in each block refers to the host stack rings).
-        * The area is filled up by the kernel on NIOCREG,
-        * and then only read by userspace code.
-        */
-       ssize_t ring_ofs[0];
-};
-
-#ifndef NIOCREGIF
-/*
- * ioctl names and related fields
- *
- * NIOCGINFO takes a struct ifreq, the interface name is the input,
- *     the outputs are number of queues and number of descriptor
- *     for each queue (useful to set number of threads etc.).
- *
- * NIOCREGIF takes an interface name within a struct ifreq,
- *     and activates netmap mode on the interface (if possible).
- *
- * NIOCUNREGIF unregisters the interface associated to the fd.
- *
- * NIOCTXSYNC, NIOCRXSYNC synchronize tx or rx queues,
- *     whose identity is set in NIOCREGIF through nr_ringid
- */
-
-/*
- * struct nmreq overlays a struct ifreq
- */
-struct nmreq {
-       char            nr_name[IFNAMSIZ];
-       uint32_t        nr_version;     /* API version */
-#define        NETMAP_API      3               /* current version */
-       uint32_t        nr_offset;      /* nifp offset in the shared region */
-       uint32_t        nr_memsize;     /* size of the shared region */
-       uint32_t        nr_tx_slots;    /* slots in tx rings */
-       uint32_t        nr_rx_slots;    /* slots in rx rings */
-       uint16_t        nr_tx_rings;    /* number of tx rings */
-       uint16_t        nr_rx_rings;    /* number of rx rings */
-       uint16_t        nr_ringid;      /* ring(s) we care about */
-#define NETMAP_HW_RING 0x4000          /* low bits indicate one hw ring */
-#define NETMAP_SW_RING 0x2000          /* process the sw ring */
-#define NETMAP_NO_TX_POLL      0x1000  /* no automatic txsync on poll */
-#define NETMAP_RING_MASK 0xfff         /* the ring number */
-       uint16_t        spare1;
-       uint32_t        spare2[4];
-};
-
-/*
- * FreeBSD uses the size value embedded in the _IOWR to determine
- * how much to copy in/out. So we need it to match the actual
- * data structure we pass. We put some spares in the structure
- * to ease compatibility with other versions
- */
-#define NIOCGINFO      _IOWR('i', 145, struct nmreq) /* return IF info */
-#define NIOCREGIF      _IOWR('i', 146, struct nmreq) /* interface register */
-#define NIOCUNREGIF    _IO('i', 147) /* interface unregister */
-#define NIOCTXSYNC     _IO('i', 148) /* sync tx queues */
-#define NIOCRXSYNC     _IO('i', 149) /* sync rx queues */
-#endif /* !NIOCREGIF */
-
-#endif /* _NET_NETMAP_H_ */