Author: sephe
Date: Thu Oct 13 02:38:46 2016
New Revision: 307167
URL: https://svnweb.freebsd.org/changeset/base/307167

Log:
  MFC 304204-304206,304252-304256
  
  304204
      hyperv/hn: Factor out hn_nvs_send/hn_nvs_send_sglist
  
      Avoid unnecessary message type setting and centralize the send context
      to transaction id cast.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7500
  
  304205
      hyperv/hn: Simplify RNDIS NVS message sending.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7501
  
  304206
      hyperv/hn: Simplify RNDIS message checks on RX path.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7502
  
  304252
      hyperv/hn: Ignore the useless TX table.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7514
  
  304253
      hyperv/hn: Simplify RNDIS RX packets acknowledgement.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7515
  
  304254
      hyperv/hn: Remove reference to nvsp_msg
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7516
  
  304255
      hyperv/hn: Remove reference to nvsp_status
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7517
  
  304256
      hyperv/hn: Get rid of unused bits
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7518

Modified:
  stable/10/sys/dev/hyperv/include/vmbus.h
  stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c
  stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h
  stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
  stable/10/sys/dev/hyperv/netvsc/hv_rndis_filter.c
  stable/10/sys/dev/hyperv/netvsc/if_hnreg.h
  stable/10/sys/dev/hyperv/netvsc/if_hnvar.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/hyperv/include/vmbus.h
==============================================================================
--- stable/10/sys/dev/hyperv/include/vmbus.h    Thu Oct 13 02:32:41 2016        
(r307166)
+++ stable/10/sys/dev/hyperv/include/vmbus.h    Thu Oct 13 02:38:46 2016        
(r307167)
@@ -84,6 +84,7 @@ struct vmbus_chanpkt_hdr {
 #define VMBUS_CHANPKT_TYPE_GPA         0x0009
 #define VMBUS_CHANPKT_TYPE_COMP                0x000b
 
+#define VMBUS_CHANPKT_FLAG_NONE                0
 #define VMBUS_CHANPKT_FLAG_RC          0x0001  /* report completion */
 
 #define VMBUS_CHANPKT_CONST_DATA(pkt)          \

Modified: stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c        Thu Oct 13 02:32:41 
2016        (r307166)
+++ stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c        Thu Oct 13 02:38:46 
2016        (r307167)
@@ -71,7 +71,7 @@ static void hv_nv_on_receive(netvsc_dev 
     const struct vmbus_chanpkt_hdr *pkt);
 static void hn_nvs_sent_none(struct hn_send_ctx *sndc,
     struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
-    const struct nvsp_msg_ *msg, int);
+    const void *, int);
 
 static struct hn_send_ctx      hn_send_ctx_none =
     HN_SEND_CTX_INITIALIZER(hn_nvs_sent_none, NULL);
@@ -117,7 +117,7 @@ hv_nv_get_next_send_section(netvsc_dev *
        unsigned long bitsmap_words = net_dev->bitsmap_words;
        unsigned long *bitsmap = net_dev->send_section_bitsmap;
        unsigned long idx;
-       int ret = NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX;
+       int ret = HN_NVS_CHIM_IDX_INVALID;
        int i;
 
        for (i = 0; i < bitsmap_words; i++) {
@@ -205,9 +205,8 @@ hv_nv_init_rx_buffer_with_net_vsp(struct
        hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
        vmbus_xact_activate(xact);
 
-       error = vmbus_chan_send(sc->hn_prichan,
-           VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           conn, sizeof(*conn), (uint64_t)(uintptr_t)&sndc);
+       error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_RC,
+           conn, sizeof(*conn), &sndc);
        if (error != 0) {
                if_printf(sc->hn_ifp, "send nvs rxbuf conn failed: %d\n",
                    error);
@@ -312,9 +311,8 @@ hv_nv_init_send_buffer_with_net_vsp(stru
        hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
        vmbus_xact_activate(xact);
 
-       error = vmbus_chan_send(sc->hn_prichan,
-           VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           chim, sizeof(*chim), (uint64_t)(uintptr_t)&sndc);
+       error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_RC,
+           chim, sizeof(*chim), &sndc);
        if (error) {
                if_printf(sc->hn_ifp, "send nvs chim conn failed: %d\n",
                    error);
@@ -392,9 +390,10 @@ hv_nv_destroy_rx_buffer(netvsc_dev *net_
                disconn.nvs_type = HN_NVS_TYPE_RXBUF_DISCONN;
                disconn.nvs_sig = HN_NVS_RXBUF_SIG;
 
-               ret = vmbus_chan_send(net_dev->sc->hn_prichan,
-                   VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn),
-                   (uint64_t)(uintptr_t)&hn_send_ctx_none);
+               /* NOTE: No response. */
+               ret = hn_nvs_send(net_dev->sc->hn_prichan,
+                   VMBUS_CHANPKT_FLAG_NONE, &disconn, sizeof(disconn),
+                   &hn_send_ctx_none);
                if (ret != 0) {
                        if_printf(net_dev->sc->hn_ifp,
                            "send rxbuf disconn failed: %d\n", ret);
@@ -444,9 +443,10 @@ hv_nv_destroy_send_buffer(netvsc_dev *ne
                disconn.nvs_type = HN_NVS_TYPE_CHIM_DISCONN;
                disconn.nvs_sig = HN_NVS_CHIM_SIG;
 
-               ret = vmbus_chan_send(net_dev->sc->hn_prichan,
-                   VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn),
-                   (uint64_t)(uintptr_t)&hn_send_ctx_none);
+               /* NOTE: No response. */
+               ret = hn_nvs_send(net_dev->sc->hn_prichan,
+                   VMBUS_CHANPKT_FLAG_NONE, &disconn, sizeof(disconn),
+                   &hn_send_ctx_none);
                if (ret != 0) {
                        if_printf(net_dev->sc->hn_ifp,
                            "send chim disconn failed: %d\n", ret);
@@ -508,9 +508,8 @@ hv_nv_negotiate_nvsp_protocol(struct hn_
        vmbus_xact_activate(xact);
        hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
 
-       error = vmbus_chan_send(sc->hn_prichan,
-           VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           init, sizeof(*init), (uint64_t)(uintptr_t)&sndc);
+       error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_RC,
+           init, sizeof(*init), &sndc);
        if (error) {
                if_printf(sc->hn_ifp, "send nvs init failed: %d\n", error);
                vmbus_xact_deactivate(xact);
@@ -559,8 +558,9 @@ hv_nv_send_ndis_config(struct hn_softc *
        conf.nvs_mtu = mtu;
        conf.nvs_caps = HN_NVS_NDIS_CONF_VLAN;
 
-       error = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0,
-           &conf, sizeof(conf), (uint64_t)(uintptr_t)&hn_send_ctx_none);
+       /* NOTE: No response. */
+       error = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_NONE,
+           &conf, sizeof(conf), &hn_send_ctx_none);
        if (error)
                if_printf(sc->hn_ifp, "send nvs ndis conf failed: %d\n", error);
        return (error);
@@ -626,8 +626,9 @@ hv_nv_connect_to_vsp(struct hn_softc *sc
        else
                ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_30;
 
-       ret = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0,
-           &ndis, sizeof(ndis), (uint64_t)(uintptr_t)&hn_send_ctx_none);
+       /* NOTE: No response. */
+       ret = hn_nvs_send(sc->hn_prichan, VMBUS_CHANPKT_FLAG_NONE,
+           &ndis, sizeof(ndis), &hn_send_ctx_none);
        if (ret != 0) {
                if_printf(sc->hn_ifp, "send nvs ndis init failed: %d\n", ret);
                goto cleanup;
@@ -688,8 +689,6 @@ hv_nv_on_device_add(struct hn_softc *sc,
 
        /* Initialize the NetVSC channel extension */
 
-       sema_init(&net_dev->channel_init_sema, 0, "netdev_sema");
-
        /*
         * Open the channel
         */
@@ -720,7 +719,6 @@ cleanup:
         * Free the packet buffers on the netvsc device packet queue.
         * Release other resources.
         */
-       sema_destroy(&net_dev->channel_init_sema);
        free(net_dev, M_NETVSC);
 
        return (NULL);
@@ -745,7 +743,6 @@ hv_nv_on_device_remove(struct hn_softc *
 
        vmbus_chan_close(sc->hn_prichan);
 
-       sema_destroy(&net_dev->channel_init_sema);
        free(net_dev, M_NETVSC);
 
        return (0);
@@ -754,16 +751,16 @@ hv_nv_on_device_remove(struct hn_softc *
 void
 hn_nvs_sent_xact(struct hn_send_ctx *sndc,
     struct netvsc_dev_ *net_dev __unused, struct vmbus_channel *chan __unused,
-    const struct nvsp_msg_ *msg, int dlen)
+    const void *data, int dlen)
 {
 
-       vmbus_xact_wakeup(sndc->hn_cbarg, msg, dlen);
+       vmbus_xact_wakeup(sndc->hn_cbarg, data, dlen);
 }
 
 static void
 hn_nvs_sent_none(struct hn_send_ctx *sndc __unused,
     struct netvsc_dev_ *net_dev __unused, struct vmbus_channel *chan __unused,
-    const struct nvsp_msg_ *msg __unused, int dlen __unused)
+    const void *data __unused, int dlen __unused)
 {
        /* EMPTY */
 }
@@ -812,33 +809,23 @@ hv_nv_on_send_completion(netvsc_dev *net
  * Returns 0 on success, non-zero on failure.
  */
 int
-hv_nv_on_send(struct vmbus_channel *chan, bool is_data_pkt,
+hv_nv_on_send(struct vmbus_channel *chan, uint32_t rndis_mtype,
     struct hn_send_ctx *sndc, struct vmbus_gpa *gpa, int gpa_cnt)
 {
-       nvsp_msg send_msg;
+       struct hn_nvs_rndis rndis;
        int ret;
 
-       send_msg.hdr.msg_type = nvsp_msg_1_type_send_rndis_pkt;
-       if (is_data_pkt) {
-               /* 0 is RMC_DATA */
-               send_msg.msgs.vers_1_msgs.send_rndis_pkt.chan_type = 0;
-       } else {
-               /* 1 is RMC_CONTROL */
-               send_msg.msgs.vers_1_msgs.send_rndis_pkt.chan_type = 1;
-       }
-
-       send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_idx =
-           sndc->hn_chim_idx;
-       send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_size =
-           sndc->hn_chim_sz;
+       rndis.nvs_type = HN_NVS_TYPE_RNDIS;
+       rndis.nvs_rndis_mtype = rndis_mtype;
+       rndis.nvs_chim_idx = sndc->hn_chim_idx;
+       rndis.nvs_chim_sz = sndc->hn_chim_sz;
 
        if (gpa_cnt) {
-               ret = vmbus_chan_send_sglist(chan, gpa, gpa_cnt,
-                   &send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)sndc);
+               ret = hn_nvs_send_sglist(chan, gpa, gpa_cnt,
+                   &rndis, sizeof(rndis), sndc);
        } else {
-               ret = vmbus_chan_send(chan,
-                   VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-                   &send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)sndc);
+               ret = hn_nvs_send(chan, VMBUS_CHANPKT_FLAG_RC,
+                   &rndis, sizeof(rndis), sndc);
        }
 
        return (ret);
@@ -855,19 +842,18 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
     struct vmbus_channel *chan, const struct vmbus_chanpkt_hdr *pkthdr)
 {
        const struct vmbus_chanpkt_rxbuf *pkt;
-       const nvsp_msg *nvsp_msg_pkt;
+       const struct hn_nvs_hdr *nvs_hdr;
        netvsc_packet vsc_pkt;
        netvsc_packet *net_vsc_pkt = &vsc_pkt;
        int count = 0;
        int i = 0;
-       int status = nvsp_status_success;
-
-       nvsp_msg_pkt = VMBUS_CHANPKT_CONST_DATA(pkthdr);
+       int status = HN_NVS_STATUS_OK;
 
-       /* Make sure this is a valid nvsp packet */
-       if (nvsp_msg_pkt->hdr.msg_type != nvsp_msg_1_type_send_rndis_pkt) {
-               if_printf(rxr->hn_ifp, "packet hdr type %u is invalid!\n",
-                   nvsp_msg_pkt->hdr.msg_type);
+       /* Make sure that this is a RNDIS message. */
+       nvs_hdr = VMBUS_CHANPKT_CONST_DATA(pkthdr);
+       if (__predict_false(nvs_hdr->nvs_type != HN_NVS_TYPE_RNDIS)) {
+               if_printf(rxr->hn_ifp, "nvs type %u, not RNDIS\n",
+                   nvs_hdr->nvs_type);
                return;
        }
        
@@ -883,15 +869,16 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
 
        /* Each range represents 1 RNDIS pkt that contains 1 Ethernet frame */
        for (i = 0; i < count; i++) {
-               net_vsc_pkt->status = nvsp_status_success;
+               net_vsc_pkt->status = HN_NVS_STATUS_OK;
                net_vsc_pkt->data = ((uint8_t *)net_dev->rx_buf +
                    pkt->cp_rxbuf[i].rb_ofs);
                net_vsc_pkt->tot_data_buf_len = pkt->cp_rxbuf[i].rb_len;
 
                hv_rf_on_receive(net_dev, rxr, net_vsc_pkt);
-               if (net_vsc_pkt->status != nvsp_status_success) {
-                       status = nvsp_status_failure;
-               }
+
+               /* XXX pretty broken; whack it */
+               if (net_vsc_pkt->status != HN_NVS_STATUS_OK)
+                       status = HN_NVS_STATUS_FAILED;
        }
        
        /*
@@ -911,20 +898,17 @@ static void
 hv_nv_on_receive_completion(struct vmbus_channel *chan, uint64_t tid,
     uint32_t status)
 {
-       nvsp_msg rx_comp_msg;
+       struct hn_nvs_rndis_ack ack;
        int retries = 0;
        int ret = 0;
        
-       rx_comp_msg.hdr.msg_type = nvsp_msg_1_type_send_rndis_pkt_complete;
-
-       /* Pass in the status */
-       rx_comp_msg.msgs.vers_1_msgs.send_rndis_pkt_complete.status =
-           status;
+       ack.nvs_type = HN_NVS_TYPE_RNDIS_ACK;
+       ack.nvs_status = status;
 
 retry_send_cmplt:
        /* Send the completion */
-       ret = vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_COMP, 0,
-           &rx_comp_msg, sizeof(nvsp_msg), tid);
+       ret = vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_COMP,
+           VMBUS_CHANPKT_FLAG_NONE, &ack, sizeof(ack), tid);
        if (ret == 0) {
                /* success */
                /* no-op */
@@ -939,44 +923,17 @@ retry_send_cmplt:
        }
 }
 
-/*
- * Net VSC receiving vRSS send table from VSP
- */
 static void
-hv_nv_send_table(struct hn_softc *sc, const struct vmbus_chanpkt_hdr *pkt)
+hn_proc_notify(struct hn_softc *sc, const struct vmbus_chanpkt_hdr *pkt)
 {
-       netvsc_dev *net_dev;
-       const nvsp_msg *nvsp_msg_pkt;
-       int i;
-       uint32_t count;
-       const uint32_t *table;
-
-       net_dev = hv_nv_get_inbound_net_device(sc);
-       if (!net_dev)
-               return;
-
-       nvsp_msg_pkt = VMBUS_CHANPKT_CONST_DATA(pkt);
+       const struct hn_nvs_hdr *hdr;
 
-       if (nvsp_msg_pkt->hdr.msg_type !=
-           nvsp_msg5_type_send_indirection_table) {
-               printf("Netvsc: !Warning! receive msg type not "
-                       "send_indirection_table. type = %d\n",
-                       nvsp_msg_pkt->hdr.msg_type);
+       hdr = VMBUS_CHANPKT_CONST_DATA(pkt);
+       if (hdr->nvs_type == HN_NVS_TYPE_TXTBL_NOTE) {
+               /* Useless; ignore */
                return;
        }
-
-       count = nvsp_msg_pkt->msgs.vers_5_msgs.send_table.count;
-       if (count != VRSS_SEND_TABLE_SIZE) {
-               printf("Netvsc: Received wrong send table size: %u\n", count);
-               return;
-       }
-
-       table = (const uint32_t *)
-           ((const uint8_t *)&nvsp_msg_pkt->msgs.vers_5_msgs.send_table +
-            nvsp_msg_pkt->msgs.vers_5_msgs.send_table.offset);
-
-       for (i = 0; i < count; i++)
-               net_dev->vrss_send_table[i] = table[i];
+       if_printf(sc->hn_ifp, "got notify, nvs type %u\n", hdr->nvs_type);
 }
 
 /*
@@ -1014,7 +971,7 @@ hv_nv_on_channel_callback(struct vmbus_c
                                        hv_nv_on_receive(net_dev, rxr, chan, 
pkt);
                                        break;
                                case VMBUS_CHANPKT_TYPE_INBAND:
-                                       hv_nv_send_table(sc, pkt);
+                                       hn_proc_notify(sc, pkt);
                                        break;
                                default:
                                        if_printf(rxr->hn_ifp,

Modified: stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h        Thu Oct 13 02:32:41 
2016        (r307166)
+++ stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h        Thu Oct 13 02:38:46 
2016        (r307167)
@@ -177,834 +177,6 @@ typedef struct rndis_recv_scale_param_ {
         uint32_t processor_masks_entry_size;
 } rndis_recv_scale_param;
 
-typedef enum nvsp_msg_type_ {
-       nvsp_msg_type_none                      = 0,
-
-       /*
-        * Init Messages
-        */
-       nvsp_msg_type_init                      = 1,
-       nvsp_msg_type_init_complete             = 2,
-
-       nvsp_version_msg_start                  = 100,
-
-       /*
-        * Version 1 Messages
-        */
-       nvsp_msg_1_type_send_ndis_vers          = nvsp_version_msg_start,
-
-       nvsp_msg_1_type_send_rx_buf,
-       nvsp_msg_1_type_send_rx_buf_complete,
-       nvsp_msg_1_type_revoke_rx_buf,
-
-       nvsp_msg_1_type_send_send_buf,
-       nvsp_msg_1_type_send_send_buf_complete,
-       nvsp_msg_1_type_revoke_send_buf,
-
-       nvsp_msg_1_type_send_rndis_pkt,
-       nvsp_msg_1_type_send_rndis_pkt_complete,
-    
-       /*
-        * Version 2 Messages
-        */
-       nvsp_msg_2_type_send_chimney_delegated_buf,
-       nvsp_msg_2_type_send_chimney_delegated_buf_complete,
-       nvsp_msg_2_type_revoke_chimney_delegated_buf,
-
-       nvsp_msg_2_type_resume_chimney_rx_indication,
-
-       nvsp_msg_2_type_terminate_chimney,
-       nvsp_msg_2_type_terminate_chimney_complete,
-
-       nvsp_msg_2_type_indicate_chimney_event,
-
-       nvsp_msg_2_type_send_chimney_packet,
-       nvsp_msg_2_type_send_chimney_packet_complete,
-
-       nvsp_msg_2_type_post_chimney_rx_request,
-       nvsp_msg_2_type_post_chimney_rx_request_complete,
-
-       nvsp_msg_2_type_alloc_rx_buf,
-       nvsp_msg_2_type_alloc_rx_buf_complete,
-
-       nvsp_msg_2_type_free_rx_buf,
-
-       nvsp_msg_2_send_vmq_rndis_pkt,
-       nvsp_msg_2_send_vmq_rndis_pkt_complete,
-
-       nvsp_msg_2_type_send_ndis_config,
-
-       nvsp_msg_2_type_alloc_chimney_handle,
-       nvsp_msg_2_type_alloc_chimney_handle_complete,
-
-       nvsp_msg2_max = nvsp_msg_2_type_alloc_chimney_handle_complete,
-
-       /*
-        * Version 4 Messages
-        */
-       nvsp_msg4_type_send_vf_association,
-       nvsp_msg4_type_switch_data_path,
-       nvsp_msg4_type_uplink_connect_state_deprecated,
-
-       nvsp_msg4_max = nvsp_msg4_type_uplink_connect_state_deprecated,
-
-       /*
-        * Version 5 Messages
-        */
-       nvsp_msg5_type_oid_query_ex,
-       nvsp_msg5_type_oid_query_ex_comp,
-       nvsp_msg5_type_subchannel,
-       nvsp_msg5_type_send_indirection_table,
-
-       nvsp_msg5_max = nvsp_msg5_type_send_indirection_table,
-} nvsp_msg_type;
-
-typedef enum nvsp_status_ {
-       nvsp_status_none = 0,
-       nvsp_status_success,
-       nvsp_status_failure,
-       /* Deprecated */
-       nvsp_status_prot_vers_range_too_new,
-       /* Deprecated */
-       nvsp_status_prot_vers_range_too_old,
-       nvsp_status_invalid_rndis_pkt,
-       nvsp_status_busy,
-       nvsp_status_max,
-} nvsp_status;
-
-typedef struct nvsp_msg_hdr_ {
-       uint32_t                                msg_type;
-} __packed nvsp_msg_hdr;
-
-/*
- * Init Messages
- */
-
-/*
- * This message is used by the VSC to initialize the channel
- * after the channels has been opened. This message should 
- * never include anything other then versioning (i.e. this
- * message will be the same for ever).
- *
- * Forever is a long time.  The values have been redefined
- * in Win7 to indicate major and minor protocol version
- * number.
- */
-typedef struct nvsp_msg_init_ {
-       union {
-               struct {
-                       uint16_t                minor_protocol_version;
-                       uint16_t                major_protocol_version;
-               } s;
-               /* Formerly min_protocol_version */
-               uint32_t                        protocol_version;
-       } p1;
-       /* Formerly max_protocol_version */
-       uint32_t                                protocol_version_2;
-} __packed nvsp_msg_init;
-
-/*
- * This message is used by the VSP to complete the initialization
- * of the channel. This message should never include anything other 
- * then versioning (i.e. this message will be the same forever).
- */
-typedef struct nvsp_msg_init_complete_ {
-       /* Deprecated */
-       uint32_t                                negotiated_prot_vers;
-       uint32_t                                max_mdl_chain_len;
-       uint32_t                                status;
-} __packed nvsp_msg_init_complete;
-
-typedef union nvsp_msg_init_uber_ {
-       nvsp_msg_init                           init;
-       nvsp_msg_init_complete                  init_compl;
-} __packed nvsp_msg_init_uber;
-
-/*
- * Version 1 Messages
- */
-
-/*
- * This message is used by the VSC to send the NDIS version
- * to the VSP.  The VSP can use this information when handling
- * OIDs sent by the VSC.
- */
-typedef struct nvsp_1_msg_send_ndis_version_ {
-       uint32_t                                ndis_major_vers;
-       /* Deprecated */
-       uint32_t                                ndis_minor_vers;
-} __packed nvsp_1_msg_send_ndis_version;
-
-/*
- * This message is used by the VSC to send a receive buffer
- * to the VSP. The VSP can then use the receive buffer to
- * send data to the VSC.
- */
-typedef struct nvsp_1_msg_send_rx_buf_ {
-       uint32_t                                gpadl_handle;
-       uint16_t                                id;
-} __packed nvsp_1_msg_send_rx_buf;
-
-typedef struct nvsp_1_rx_buf_section_ {
-       uint32_t                                offset;
-       uint32_t                                sub_allocation_size;
-       uint32_t                                num_sub_allocations;
-       uint32_t                                end_offset;
-} __packed nvsp_1_rx_buf_section;
-
-/*
- * This message is used by the VSP to acknowledge a receive 
- * buffer send by the VSC.  This message must be sent by the 
- * VSP before the VSP uses the receive buffer.
- */
-typedef struct nvsp_1_msg_send_rx_buf_complete_ {
-       uint32_t                                status;
-       uint32_t                                num_sections;
-
-       /*
-        * The receive buffer is split into two parts, a large
-        * suballocation section and a small suballocation
-        * section. These sections are then suballocated by a 
-        * certain size.
-        *
-        * For example, the following break up of the receive
-        * buffer has 6 large suballocations and 10 small
-        * suballocations.
-        *
-        * |            Large Section          |  |   Small Section   |
-        * ------------------------------------------------------------
-        * |     |     |     |     |     |     |  | | | | | | | | | | |
-        * |                                      |  
-        * LargeOffset                            SmallOffset
-        */
-       nvsp_1_rx_buf_section                   sections[1];
-
-} __packed nvsp_1_msg_send_rx_buf_complete;
-
-/*
- * This message is sent by the VSC to revoke the receive buffer.
- * After the VSP completes this transaction, the VSP should never
- * use the receive buffer again.
- */
-typedef struct nvsp_1_msg_revoke_rx_buf_ {
-       uint16_t                                id;
-} __packed nvsp_1_msg_revoke_rx_buf;
-
-/*
- * This message is used by the VSC to send a send buffer
- * to the VSP. The VSC can then use the send buffer to
- * send data to the VSP.
- */
-typedef struct nvsp_1_msg_send_send_buf_ {
-       uint32_t                                gpadl_handle;
-       uint16_t                                id;
-} __packed nvsp_1_msg_send_send_buf;
-
-/*
- * This message is used by the VSP to acknowledge a send 
- * buffer sent by the VSC. This message must be sent by the 
- * VSP before the VSP uses the sent buffer.
- */
-typedef struct nvsp_1_msg_send_send_buf_complete_ {
-       uint32_t                                status;
-
-       /*
-        * The VSC gets to choose the size of the send buffer and
-        * the VSP gets to choose the sections size of the buffer.
-        * This was done to enable dynamic reconfigurations when
-        * the cost of GPA-direct buffers decreases.
-        */
-       uint32_t                                section_size;
-} __packed nvsp_1_msg_send_send_buf_complete;
-
-/*
- * This message is sent by the VSC to revoke the send buffer.
- * After the VSP completes this transaction, the vsp should never
- * use the send buffer again.
- */
-typedef struct nvsp_1_msg_revoke_send_buf_ {
-       uint16_t                                id;
-} __packed nvsp_1_msg_revoke_send_buf;
-
-/*
- * This message is used by both the VSP and the VSC to send
- * an RNDIS message to the opposite channel endpoint.
- */
-typedef struct nvsp_1_msg_send_rndis_pkt_ {
-       /*
-        * This field is specified by RNIDS.  They assume there's
-        * two different channels of communication. However, 
-        * the Network VSP only has one.  Therefore, the channel
-        * travels with the RNDIS packet.
-        */
-       uint32_t                                chan_type;
-
-       /*
-        * This field is used to send part or all of the data
-        * through a send buffer. This values specifies an 
-        * index into the send buffer.  If the index is 
-        * 0xFFFFFFFF, then the send buffer is not being used
-        * and all of the data was sent through other VMBus
-        * mechanisms.
-        */
-       uint32_t                                send_buf_section_idx;
-       uint32_t                                send_buf_section_size;
-} __packed nvsp_1_msg_send_rndis_pkt;
-
-/*
- * This message is used by both the VSP and the VSC to complete
- * a RNDIS message to the opposite channel endpoint.  At this
- * point, the initiator of this message cannot use any resources
- * associated with the original RNDIS packet.
- */
-typedef struct nvsp_1_msg_send_rndis_pkt_complete_ {
-       uint32_t                                status;
-} __packed nvsp_1_msg_send_rndis_pkt_complete;
-
-
-/*
- * Version 2 Messages
- */
-
-/*
- * This message is used by the VSC to send the NDIS version
- * to the VSP.  The VSP can use this information when handling
- * OIDs sent by the VSC.
- */
-typedef struct nvsp_2_netvsc_capabilities_ {
-       union {
-               uint64_t                        as_uint64;
-               struct {
-                       uint64_t                vmq           : 1;
-                       uint64_t                chimney       : 1;
-                       uint64_t                sriov         : 1;
-                       uint64_t                ieee8021q     : 1;
-                       uint64_t                correlationid : 1;
-                       uint64_t                teaming       : 1;
-               } u2;
-       } u1;
-} __packed nvsp_2_netvsc_capabilities;
-
-typedef struct nvsp_2_msg_send_ndis_config_ {
-       uint32_t                                mtu;
-       uint32_t                                reserved;
-       nvsp_2_netvsc_capabilities              capabilities;
-} __packed nvsp_2_msg_send_ndis_config;
-
-/*
- * NvspMessage2TypeSendChimneyDelegatedBuffer
- */
-typedef struct nvsp_2_msg_send_chimney_buf_
-{
-       /*
-        * On WIN7 beta, delegated_obj_max_size is defined as a uint32_t
-        * Since WIN7 RC, it was split into two uint16_t.  To have the same
-        * struct layout, delegated_obj_max_size shall be the first field.
-        */
-       uint16_t                                delegated_obj_max_size;
-
-       /*
-        * The revision # of chimney protocol used between NVSC and NVSP.
-        *
-        * This revision is NOT related to the chimney revision between
-        * NDIS protocol and miniport drivers.
-        */
-       uint16_t                                revision;
-
-       uint32_t                                gpadl_handle;
-} __packed nvsp_2_msg_send_chimney_buf;
-
-
-/* Unsupported chimney revision 0 (only present in WIN7 beta) */
-#define NVSP_CHIMNEY_REVISION_0                 0
-
-/* WIN7 Beta Chimney QFE */
-#define NVSP_CHIMNEY_REVISION_1                 1
-
-/* The chimney revision since WIN7 RC */
-#define NVSP_CHIMNEY_REVISION_2                 2
-
-
-/*
- * NvspMessage2TypeSendChimneyDelegatedBufferComplete
- */
-typedef struct nvsp_2_msg_send_chimney_buf_complete_ {
-       uint32_t                                status;
-
-       /*
-        * Maximum number outstanding sends and pre-posted receives.
-        *
-        * NVSC should not post more than SendQuota/ReceiveQuota packets.
-        * Otherwise, it can block the non-chimney path for an indefinite
-        * amount of time.
-        * (since chimney sends/receives are affected by the remote peer).
-        *
-        * Note: NVSP enforces the quota restrictions on a per-VMBCHANNEL
-        * basis.  It doesn't enforce the restriction separately for chimney
-        * send/receive.  If NVSC doesn't voluntarily enforce "SendQuota",
-        * it may kill its own network connectivity.
-        */
-       uint32_t                                send_quota;
-       uint32_t                                rx_quota;
-} __packed nvsp_2_msg_send_chimney_buf_complete;
-
-/*
- * NvspMessage2TypeRevokeChimneyDelegatedBuffer
- */
-typedef struct nvsp_2_msg_revoke_chimney_buf_ {
-       uint32_t                                gpadl_handle;
-} __packed nvsp_2_msg_revoke_chimney_buf;
-
-
-#define NVSP_CHIMNEY_OBJECT_TYPE_NEIGHBOR       0
-#define NVSP_CHIMNEY_OBJECT_TYPE_PATH4          1
-#define NVSP_CHIMNEY_OBJECT_TYPE_PATH6          2
-#define NVSP_CHIMNEY_OBJECT_TYPE_TCP            3
-
-/*
- * NvspMessage2TypeAllocateChimneyHandle
- */
-typedef struct nvsp_2_msg_alloc_chimney_handle_ {
-       uint64_t                                vsc_context;
-       uint32_t                                object_type;
-} __packed nvsp_2_msg_alloc_chimney_handle;
-
-/*
- * NvspMessage2TypeAllocateChimneyHandleComplete
- */
-typedef struct nvsp_2_msg_alloc_chimney_handle_complete_ {
-       uint32_t                                vsp_handle;
-} __packed nvsp_2_msg_alloc_chimney_handle_complete;
-
-
-/*
- * NvspMessage2TypeResumeChimneyRXIndication
- */
-typedef struct nvsp_2_msg_resume_chimney_rx_indication {
-       /*
-        * Handle identifying the offloaded connection
-        */
-       uint32_t                                vsp_tcp_handle;
-} __packed nvsp_2_msg_resume_chimney_rx_indication;
-
-
-#define NVSP_2_MSG_TERMINATE_CHIMNEY_FLAGS_FIRST_STAGE      (0x01u)
-#define NVSP_2_MSG_TERMINATE_CHIMNEY_FLAGS_RESERVED         (~(0x01u))
-
-/*
- * NvspMessage2TypeTerminateChimney
- */
-typedef struct nvsp_2_msg_terminate_chimney_ {
-       /*
-       * Handle identifying the offloaded object
-       */
-       uint32_t                                vsp_handle;
-
-       /*
-        * Terminate Offload Flags
-        *     Bit 0:
-        *         When set to 0, terminate the offload at the destination NIC
-        *     Bit 1-31:  Reserved, shall be zero
-        */
-       uint32_t                                flags;
-
-       union {
-               /*
-                * This field is valid only when bit 0 of flags is clear.
-                * It specifies the index into the premapped delegated
-                * object buffer.  The buffer was sent through the
-                * NvspMessage2TypeSendChimneyDelegatedBuffer
-                * message at initialization time.
-                *
-                * NVSP will write the delegated state into the delegated
-                * buffer upon upload completion.
-                */
-               uint32_t                        index;
-
-               /*
-                * This field is valid only when bit 0 of flags is set.
-                *
-                * The seqence number of the most recently accepted RX
-                * indication when VSC sets its TCP context into
-                * "terminating" state.
-                *
-                * This allows NVSP to determines if there are any in-flight
-                * RX indications for which the acceptance state is still
-                * undefined.
-                */
-               uint64_t                        last_accepted_rx_seq_no;
-       } f0;
-} __packed nvsp_2_msg_terminate_chimney;
-
-
-#define NVSP_TERMINATE_CHIMNEY_COMPLETE_FLAG_DATA_CORRUPTED     0x0000001u
-
-/*
- * NvspMessage2TypeTerminateChimneyComplete
- */
-typedef struct nvsp_2_msg_terminate_chimney_complete_ {
-       uint64_t                                vsc_context;
-       uint32_t                                flags;
-} __packed nvsp_2_msg_terminate_chimney_complete;
-
-/*
- * NvspMessage2TypeIndicateChimneyEvent
- */
-typedef struct nvsp_2_msg_indicate_chimney_event_ {
-       /*
-        * When VscTcpContext is 0, event_type is an NDIS_STATUS event code
-        * Otherwise, EventType is an TCP connection event (defined in
-        * NdisTcpOffloadEventHandler chimney DDK document).
-        */
-       uint32_t                                event_type;
-
-       /*
-        * When VscTcpContext is 0, EventType is an NDIS_STATUS event code
-        * Otherwise, EventType is an TCP connection event specific information
-        * (defined in NdisTcpOffloadEventHandler chimney DDK document).
-        */
-       uint32_t                                event_specific_info;
-
-       /*
-        * If not 0, the event is per-TCP connection event.  This field
-        * contains the VSC's TCP context.
-        * If 0, the event indication is global.
-        */
-       uint64_t                                vsc_tcp_context;
-} __packed nvsp_2_msg_indicate_chimney_event;
-
-
-#define NVSP_1_CHIMNEY_SEND_INVALID_OOB_INDEX       0xffffu
-#define NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX   0xffffffff
-
-/*
- * NvspMessage2TypeSendChimneyPacket
- */
-typedef struct nvsp_2_msg_send_chimney_pkt_ {
-    /*
-     * Identify the TCP connection for which this chimney send is
-     */
-    uint32_t                                    vsp_tcp_handle;
-
-    /*
-     * This field is used to send part or all of the data
-     * through a send buffer. This values specifies an
-     * index into the send buffer. If the index is
-     * 0xFFFF, then the send buffer is not being used
-     * and all of the data was sent through other VMBus
-     * mechanisms.
-     */
-    uint16_t                                    send_buf_section_index;
-    uint16_t                                    send_buf_section_size;
-
-    /*
-     * OOB Data Index
-     * This an index to the OOB data buffer. If the index is 0xFFFFFFFF,
-     * then there is no OOB data.
-     *
-     * This field shall be always 0xFFFFFFFF for now. It is reserved for
-     * the future.
-     */
-    uint16_t                                    oob_data_index;
-
-    /*
-     * DisconnectFlags = 0
-     *      Normal chimney send. See MiniportTcpOffloadSend for details.
-     *
-     * DisconnectFlags = TCP_DISCONNECT_GRACEFUL_CLOSE (0x01)
-     *      Graceful disconnect. See MiniportTcpOffloadDisconnect for details.
-     *
-     * DisconnectFlags = TCP_DISCONNECT_ABORTIVE_CLOSE (0x02)
-     *      Abortive disconnect. See MiniportTcpOffloadDisconnect for details.
-     */
-    uint16_t                                    disconnect_flags;
-
-    uint32_t                                    seq_no;
-} __packed nvsp_2_msg_send_chimney_pkt;
-
-/*
- * NvspMessage2TypeSendChimneyPacketComplete
- */
-typedef struct nvsp_2_msg_send_chimney_pkt_complete_ {
-    /*
-     * The NDIS_STATUS for the chimney send
-     */
-    uint32_t                                    status;
-
-    /*
-     * Number of bytes that have been sent to the peer (and ACKed by the peer).
-     */
-    uint32_t                                    bytes_transferred;
-} __packed nvsp_2_msg_send_chimney_pkt_complete;
-
-
-#define NVSP_1_CHIMNEY_RECV_FLAG_NO_PUSH        0x0001u
-#define NVSP_1_CHIMNEY_RECV_INVALID_OOB_INDEX   0xffffu
-
-/*
- * NvspMessage2TypePostChimneyRecvRequest
- */
-typedef struct nvsp_2_msg_post_chimney_rx_request_ {
-       /*
-        * Identify the TCP connection which this chimney receive request
-        * is for.
-        */
-       uint32_t                                vsp_tcp_handle;
-
-       /*
-        * OOB Data Index
-        * This an index to the OOB data buffer. If the index is 0xFFFFFFFF,
-        * then there is no OOB data.
-        *
-        * This field shall be always 0xFFFFFFFF for now. It is reserved for
-        * the future.
-        */
-       uint32_t                                oob_data_index;
-
-       /*
-        * Bit 0
-        *      When it is set, this is a "no-push" receive.
-        *      When it is clear, this is a "push" receive.
-        *
-        * Bit 1-15:  Reserved and shall be zero
-        */
-       uint16_t                                flags;
-
-       /*
-        * For debugging and diagnoses purpose.
-        * The SeqNo is per TCP connection and starts from 0.
-        */
-       uint32_t                                seq_no;
-} __packed nvsp_2_msg_post_chimney_rx_request;
-
-/*
- * NvspMessage2TypePostChimneyRecvRequestComplete
- */
-typedef struct nvsp_2_msg_post_chimney_rx_request_complete_ {
-       /*
-        * The NDIS_STATUS for the chimney send
-        */
-       uint32_t                                status;
-
-       /*
-        * Number of bytes that have been sent to the peer (and ACKed by
-        * the peer).
-        */
-       uint32_t                                bytes_xferred;
-} __packed nvsp_2_msg_post_chimney_rx_request_complete;
-
-/*
- * NvspMessage2TypeAllocateReceiveBuffer
- */
-typedef struct nvsp_2_msg_alloc_rx_buf_ {
-       /*
-        * Allocation ID to match the allocation request and response
-        */
-       uint32_t                                allocation_id;
-
-       /*
-        * Length of the VM shared memory receive buffer that needs to
-        * be allocated
-        */
-       uint32_t                                length;
-} __packed nvsp_2_msg_alloc_rx_buf;
-
-/*
- * NvspMessage2TypeAllocateReceiveBufferComplete
- */
-typedef struct nvsp_2_msg_alloc_rx_buf_complete_ {
-       /*
-        * The NDIS_STATUS code for buffer allocation
-        */
-       uint32_t                                status;
-
-       /*
-        * Allocation ID from NVSP_2_MESSAGE_ALLOCATE_RECEIVE_BUFFER
-        */
-       uint32_t                                allocation_id;
-
-       /*
-        * GPADL handle for the allocated receive buffer
-        */
-       uint32_t                                gpadl_handle;
-
-       /*
-        * Receive buffer ID that is further used in

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to