The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/hyperv/netvsc/if_hnvar.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2016-2017 Microsoft Corp.
    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  *    notice unmodified, this list of conditions, and the following
   10  *    disclaimer.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  *
   15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   25  *
   26  * $FreeBSD$
   27  */
   28 
   29 #ifndef _IF_HNVAR_H_
   30 #define _IF_HNVAR_H_
   31 
   32 #define HN_USE_TXDESC_BUFRING
   33 
   34 #define HN_CHIM_SIZE                    (15 * 1024 * 1024)
   35 
   36 #define HN_RXBUF_SIZE                   (31 * 1024 * 1024)
   37 #define HN_RXBUF_SIZE_COMPAT            (15 * 1024 * 1024)
   38 
   39 #define HN_MTU_MAX                      (65535 - ETHER_ADDR_LEN)
   40 
   41 #define HN_TXBR_SIZE                    (128 * PAGE_SIZE)
   42 #define HN_RXBR_SIZE                    (128 * PAGE_SIZE)
   43 
   44 #define HN_XACT_REQ_PGCNT               2
   45 #define HN_XACT_RESP_PGCNT              2
   46 #define HN_XACT_REQ_SIZE                (HN_XACT_REQ_PGCNT * PAGE_SIZE)
   47 #define HN_XACT_RESP_SIZE               (HN_XACT_RESP_PGCNT * PAGE_SIZE)
   48 
   49 #define HN_GPACNT_MAX                   32
   50 
   51 struct hn_txdesc;
   52 #ifndef HN_USE_TXDESC_BUFRING
   53 SLIST_HEAD(hn_txdesc_list, hn_txdesc);
   54 #else
   55 struct buf_ring;
   56 #endif
   57 struct hn_tx_ring;
   58 
   59 #define HN_NVS_RSC_MAX          562     /* Max RSC frags in one vmbus packet */
   60 
   61 struct hn_rx_rsc {
   62         const uint32_t          *vlan_info;
   63         const uint32_t          *csum_info;
   64         const uint32_t          *hash_info;
   65         const uint32_t          *hash_value;
   66         uint32_t                cnt;            /* fragment count */
   67         uint32_t                pktlen;         /* full packet length */
   68         uint8_t                 is_last;        /* last fragment */
   69         const void              *frag_data[HN_NVS_RSC_MAX];
   70         uint32_t                frag_len[HN_NVS_RSC_MAX];
   71 };
   72 
   73 struct hn_rx_ring {
   74         struct ifnet    *hn_ifp;
   75         struct ifnet    *hn_rxvf_ifp;   /* SR-IOV VF for RX */
   76         struct hn_tx_ring *hn_txr;
   77         void            *hn_pktbuf;
   78         int             hn_pktbuf_len;
   79         int             hn_rx_flags;    /* HN_RX_FLAG_ */
   80         uint32_t        hn_mbuf_hash;   /* NDIS_HASH_ */
   81         uint8_t         *hn_rxbuf;      /* shadow sc->hn_rxbuf */
   82         int             hn_rx_idx;
   83         struct hn_rx_rsc rsc;
   84 
   85         /* Trust csum verification on host side */
   86         int             hn_trust_hcsum; /* HN_TRUST_HCSUM_ */
   87         struct lro_ctrl hn_lro;
   88 
   89         u_long          hn_csum_ip;
   90         u_long          hn_csum_tcp;
   91         u_long          hn_csum_udp;
   92         u_long          hn_csum_trusted;
   93         u_long          hn_lro_tried;
   94         u_long          hn_small_pkts;
   95         u_long          hn_pkts;
   96         u_long          hn_rss_pkts;
   97         u_long          hn_ack_failed;
   98         u_long          hn_rsc_pkts;
   99         u_long          hn_rsc_drop;
  100 
  101         /* Rarely used stuffs */
  102         struct sysctl_oid *hn_rx_sysctl_tree;
  103 
  104         void            *hn_br;         /* TX/RX bufring */
  105         struct hyperv_dma hn_br_dma;
  106 
  107         struct vmbus_channel *hn_chan;
  108 } __aligned(CACHE_LINE_SIZE);
  109 
  110 #define HN_TRUST_HCSUM_IP       0x0001
  111 #define HN_TRUST_HCSUM_TCP      0x0002
  112 #define HN_TRUST_HCSUM_UDP      0x0004
  113 
  114 #define HN_RX_FLAG_ATTACHED     0x0001
  115 #define HN_RX_FLAG_BR_REF       0x0002
  116 #define HN_RX_FLAG_XPNT_VF      0x0004
  117 #define HN_RX_FLAG_UDP_HASH     0x0008
  118 
  119 struct hn_tx_ring {
  120 #ifndef HN_USE_TXDESC_BUFRING
  121         struct mtx      hn_txlist_spin;
  122         struct hn_txdesc_list hn_txlist;
  123 #else
  124         struct buf_ring *hn_txdesc_br;
  125 #endif
  126         int             hn_txdesc_cnt;
  127         int             hn_txdesc_avail;
  128         u_short         hn_has_txeof;
  129         u_short         hn_txdone_cnt;
  130 
  131         int             hn_sched_tx;
  132         void            (*hn_txeof)(struct hn_tx_ring *);
  133         struct taskqueue *hn_tx_taskq;
  134         struct task     hn_tx_task;
  135         struct task     hn_txeof_task;
  136 
  137         struct buf_ring *hn_mbuf_br;
  138         int             hn_oactive;
  139         int             hn_tx_idx;
  140         int             hn_tx_flags;
  141 
  142         struct mtx      hn_tx_lock;
  143         struct hn_softc *hn_sc;
  144         struct vmbus_channel *hn_chan;
  145 
  146         int             hn_direct_tx_size;
  147         int             hn_chim_size;
  148         bus_dma_tag_t   hn_tx_data_dtag;
  149         uint64_t        hn_csum_assist;
  150 
  151         /* Applied packet transmission aggregation limits. */
  152         int             hn_agg_szmax;
  153         short           hn_agg_pktmax;
  154         short           hn_agg_align;
  155 
  156         /* Packet transmission aggregation states. */
  157         struct hn_txdesc *hn_agg_txd;
  158         int             hn_agg_szleft;
  159         short           hn_agg_pktleft;
  160         struct rndis_packet_msg *hn_agg_prevpkt;
  161 
  162         /* Temporary stats for each sends. */
  163         int             hn_stat_size;
  164         short           hn_stat_pkts;
  165         short           hn_stat_mcasts;
  166 
  167         int             (*hn_sendpkt)(struct hn_tx_ring *, struct hn_txdesc *);
  168         int             hn_suspended;
  169         int             hn_gpa_cnt;
  170         struct vmbus_gpa hn_gpa[HN_GPACNT_MAX];
  171 
  172         u_long          hn_no_txdescs;
  173         u_long          hn_send_failed;
  174         u_long          hn_txdma_failed;
  175         u_long          hn_tx_collapsed;
  176         u_long          hn_tx_chimney_tried;
  177         u_long          hn_tx_chimney;
  178         u_long          hn_pkts;
  179         u_long          hn_sends;
  180         u_long          hn_flush_failed;
  181 
  182         /* Rarely used stuffs */
  183         struct hn_txdesc *hn_txdesc;
  184         bus_dma_tag_t   hn_tx_rndis_dtag;
  185         struct sysctl_oid *hn_tx_sysctl_tree;
  186 } __aligned(CACHE_LINE_SIZE);
  187 
  188 #define HN_TX_FLAG_ATTACHED     0x0001
  189 #define HN_TX_FLAG_HASHVAL      0x0002  /* support HASHVAL pktinfo */
  190 
  191 /*
  192  * Device-specific softc structure
  193  */
  194 struct hn_softc {
  195         struct ifnet    *hn_ifp;
  196         struct ifmedia  hn_media;
  197         device_t        hn_dev;
  198         int             hn_if_flags;
  199         struct sx       hn_lock;
  200         struct vmbus_channel *hn_prichan;
  201 
  202         int             hn_rx_ring_cnt;
  203         int             hn_rx_ring_inuse;
  204         struct hn_rx_ring *hn_rx_ring;
  205 
  206         struct rmlock   hn_vf_lock;
  207         struct ifnet    *hn_vf_ifp;     /* SR-IOV VF */
  208         uint32_t        hn_xvf_flags;   /* transparent VF flags */
  209 
  210         int             hn_tx_ring_cnt;
  211         int             hn_tx_ring_inuse;
  212         struct hn_tx_ring *hn_tx_ring;
  213 
  214         uint8_t         *hn_chim;
  215         u_long          *hn_chim_bmap;
  216         int             hn_chim_bmap_cnt;
  217         int             hn_chim_cnt;
  218         int             hn_chim_szmax;
  219 
  220         int             hn_cpu;
  221         struct taskqueue **hn_tx_taskqs;
  222         struct sysctl_oid *hn_tx_sysctl_tree;
  223         struct sysctl_oid *hn_rx_sysctl_tree;
  224         struct vmbus_xact_ctx *hn_xact;
  225         uint32_t        hn_nvs_ver;
  226         uint32_t        hn_rx_filter;
  227 
  228         /* Packet transmission aggregation user settings. */
  229         int                     hn_agg_size;
  230         int                     hn_agg_pkts;
  231 
  232         struct taskqueue        *hn_mgmt_taskq;
  233         struct taskqueue        *hn_mgmt_taskq0;
  234         struct task             hn_link_task;
  235         struct task             hn_netchg_init;
  236         struct timeout_task     hn_netchg_status;
  237         uint32_t                hn_link_flags;  /* HN_LINK_FLAG_ */
  238 
  239         uint32_t                hn_caps;        /* HN_CAP_ */
  240         uint32_t                hn_flags;       /* HN_FLAG_ */
  241         u_int                   hn_pollhz;
  242 
  243         void                    *hn_rxbuf;
  244         uint32_t                hn_rxbuf_gpadl;
  245         struct hyperv_dma       hn_rxbuf_dma;
  246 
  247         uint32_t                hn_chim_gpadl;
  248         struct hyperv_dma       hn_chim_dma;
  249 
  250         uint32_t                hn_rndis_rid;
  251         uint32_t                hn_ndis_ver;
  252         int                     hn_ndis_tso_szmax;
  253         int                     hn_ndis_tso_sgmin;
  254         uint32_t                hn_rndis_agg_size;
  255         uint32_t                hn_rndis_agg_pkts;
  256         uint32_t                hn_rndis_agg_align;
  257 
  258         int                     hn_rss_ind_size;
  259         uint32_t                hn_rss_hash;    /* setting, NDIS_HASH_ */
  260         uint32_t                hn_rss_hcap;    /* caps, NDIS_HASH_ */
  261         struct ndis_rssprm_toeplitz hn_rss;
  262 
  263         eventhandler_tag        hn_ifaddr_evthand;
  264         eventhandler_tag        hn_ifnet_evthand;
  265         eventhandler_tag        hn_ifnet_atthand;
  266         eventhandler_tag        hn_ifnet_dethand;
  267         eventhandler_tag        hn_ifnet_lnkhand;
  268 
  269         /*
  270          * Transparent VF delayed initialization.
  271          */
  272         int                     hn_vf_rdytick;  /* ticks, 0 == ready */
  273         struct taskqueue        *hn_vf_taskq;
  274         struct timeout_task     hn_vf_init;
  275 
  276         /*
  277          * Saved information for VF under transparent mode.
  278          */
  279         void                    (*hn_vf_input)
  280                                 (struct ifnet *, struct mbuf *);
  281         int                     hn_saved_caps;
  282         u_int                   hn_saved_tsomax;
  283         u_int                   hn_saved_tsosegcnt;
  284         u_int                   hn_saved_tsosegsz;
  285 
  286         /*
  287          * RSC switch, default off
  288          */
  289         u_int                   hn_rsc_ctrl;
  290 };
  291 
  292 #define HN_FLAG_RXBUF_CONNECTED         0x0001
  293 #define HN_FLAG_CHIM_CONNECTED          0x0002
  294 #define HN_FLAG_HAS_RSSKEY              0x0004
  295 #define HN_FLAG_HAS_RSSIND              0x0008
  296 #define HN_FLAG_SYNTH_ATTACHED          0x0010
  297 #define HN_FLAG_NO_SLEEPING             0x0020
  298 #define HN_FLAG_RXBUF_REF               0x0040
  299 #define HN_FLAG_CHIM_REF                0x0080
  300 #define HN_FLAG_RXVF                    0x0100
  301 
  302 #define HN_FLAG_ERRORS                  (HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF)
  303 
  304 #define HN_XVFFLAG_ENABLED              0x0001
  305 #define HN_XVFFLAG_ACCBPF               0x0002
  306 
  307 #define HN_NO_SLEEPING(sc)                      \
  308 do {                                            \
  309         (sc)->hn_flags |= HN_FLAG_NO_SLEEPING;  \
  310 } while (0)
  311 
  312 #define HN_SLEEPING_OK(sc)                      \
  313 do {                                            \
  314         (sc)->hn_flags &= ~HN_FLAG_NO_SLEEPING; \
  315 } while (0)
  316 
  317 #define HN_CAN_SLEEP(sc)                \
  318         (((sc)->hn_flags & HN_FLAG_NO_SLEEPING) == 0)
  319 
  320 #define HN_CAP_VLAN                     0x0001
  321 #define HN_CAP_MTU                      0x0002
  322 #define HN_CAP_IPCS                     0x0004
  323 #define HN_CAP_TCP4CS                   0x0008
  324 #define HN_CAP_TCP6CS                   0x0010
  325 #define HN_CAP_UDP4CS                   0x0020
  326 #define HN_CAP_UDP6CS                   0x0040
  327 #define HN_CAP_TSO4                     0x0080
  328 #define HN_CAP_TSO6                     0x0100
  329 #define HN_CAP_HASHVAL                  0x0200
  330 #define HN_CAP_UDPHASH                  0x0400
  331 
  332 /* Capability description for use with printf(9) %b identifier. */
  333 #define HN_CAP_BITS                             \
  334         "\020\1VLAN\2MTU\3IPCS\4TCP4CS\5TCP6CS" \
  335         "\6UDP4CS\7UDP6CS\10TSO4\11TSO6\12HASHVAL\13UDPHASH"
  336 
  337 #define HN_LINK_FLAG_LINKUP             0x0001
  338 #define HN_LINK_FLAG_NETCHG             0x0002
  339 
  340 #endif  /* !_IF_HNVAR_H_ */

Cache object: 316f9c851bd84652e5a317e72c95bfd6


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.