]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - sys/dev/hyperv/storvsc/hv_vstorage.h
Fix heimdal KDC-REP service name validation vulnerability [SA-17:05]
[FreeBSD/releng/10.3.git] / sys / dev / hyperv / storvsc / hv_vstorage.h
1 /*-
2  * Copyright (c) 2009-2012 Microsoft Corp.
3  * Copyright (c) 2012 NetApp Inc.
4  * Copyright (c) 2012 Citrix Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice unmodified, this list of conditions, and the following
12  *    disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #ifndef __HV_VSTORAGE_H__
32 #define __HV_VSTORAGE_H__
33
34 /*
35  * Major/minor macros.  Minor version is in LSB, meaning that earlier flat
36  * version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1).
37  */
38
39 #define VMSTOR_PROTOCOL_MAJOR(VERSION_)         (((VERSION_) >> 8) & 0xff)
40 #define VMSTOR_PROTOCOL_MINOR(VERSION_)         (((VERSION_)     ) & 0xff)
41 #define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
42                                                  (((MINOR_) & 0xff)     ))
43
44 #define VMSTOR_PROTOCOL_VERSION_WIN6       VMSTOR_PROTOCOL_VERSION(2, 0)
45 #define VMSTOR_PROTOCOL_VERSION_WIN7       VMSTOR_PROTOCOL_VERSION(4, 2)
46 #define VMSTOR_PROTOCOL_VERSION_WIN8       VMSTOR_PROTOCOL_VERSION(5, 1)
47 #define VMSTOR_PROTOCOL_VERSION_WIN8_1     VMSTOR_PROTOCOL_VERSION(6, 0)
48 #define VMSTOR_PROTOCOL_VERSION_WIN10      VMSTOR_PROTOCOL_VERSION(6, 2)
49 /*
50  * Invalid version.
51  */
52 #define VMSTOR_INVALID_PROTOCOL_VERSION  -1
53
54 /*
55  * Version history:
56  * V1 Beta                    0.1
57  * V1 RC < 2008/1/31          1.0
58  * V1 RC > 2008/1/31          2.0
59  * Win7: 4.2
60  * Win8: 5.1
61  */
62
63 #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(5, 1)
64
65 /**
66  *  Packet structure ops describing virtual storage requests.
67  */
68 enum vstor_packet_ops {
69         VSTOR_OPERATION_COMPLETEIO            = 1,
70         VSTOR_OPERATION_REMOVEDEVICE          = 2,
71         VSTOR_OPERATION_EXECUTESRB            = 3,
72         VSTOR_OPERATION_RESETLUN              = 4,
73         VSTOR_OPERATION_RESETADAPTER          = 5,
74         VSTOR_OPERATION_RESETBUS              = 6,
75         VSTOR_OPERATION_BEGININITIALIZATION   = 7,
76         VSTOR_OPERATION_ENDINITIALIZATION     = 8,
77         VSTOR_OPERATION_QUERYPROTOCOLVERSION  = 9,
78         VSTOR_OPERATION_QUERYPROPERTIES       = 10,
79         VSTOR_OPERATION_ENUMERATE_BUS         = 11,
80         VSTOR_OPERATION_FCHBA_DATA            = 12,
81         VSTOR_OPERATION_CREATE_MULTI_CHANNELS = 13,
82         VSTOR_OPERATION_MAXIMUM               = 13
83 };
84
85
86 /*
87  *  Platform neutral description of a scsi request -
88  *  this remains the same across the write regardless of 32/64 bit
89  *  note: it's patterned off the Windows DDK SCSI_PASS_THROUGH structure
90  */
91
92 #define CDB16GENERIC_LENGTH                     0x10
93 #define SENSE_BUFFER_SIZE                       0x14
94 #define MAX_DATA_BUFFER_LENGTH_WITH_PADDING     0x14
95
96 #define POST_WIN7_STORVSC_SENSE_BUFFER_SIZE     0x14
97 #define PRE_WIN8_STORVSC_SENSE_BUFFER_SIZE      0x12
98
99
100 struct vmscsi_win8_extension {
101         /*
102          * The following were added in Windows 8
103          */
104         uint16_t reserve;
105         uint8_t  queue_tag;
106         uint8_t  queue_action;
107         uint32_t srb_flags;
108         uint32_t time_out_value;
109         uint32_t queue_sort_ey;
110 } __packed;
111
112 struct vmscsi_req {
113         uint16_t length;
114         uint8_t  srb_status;
115         uint8_t  scsi_status;
116
117         /* HBA number, set to the order number detected by initiator. */
118         uint8_t  port;
119         /* SCSI bus number or bus_id, different from CAM's path_id. */
120         uint8_t  path_id;
121
122         uint8_t  target_id;
123         uint8_t  lun;
124
125         uint8_t  cdb_len;
126         uint8_t  sense_info_len;
127         uint8_t  data_in;
128         uint8_t  reserved;
129
130         uint32_t transfer_len;
131
132         union {
133             uint8_t cdb[CDB16GENERIC_LENGTH];
134
135             uint8_t sense_data[SENSE_BUFFER_SIZE];
136
137             uint8_t reserved_array[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
138         } u;
139
140         /*
141          * The following was added in win8.
142          */
143         struct vmscsi_win8_extension win8_extension;
144
145 } __packed;
146
147 /**
148  *  This structure is sent during the initialization phase to get the different
149  *  properties of the channel.
150  */
151
152 struct vmstor_chan_props {
153         uint16_t proto_ver;
154         uint8_t  path_id;
155         uint8_t  target_id;
156
157         uint16_t max_channel_cnt;
158
159         /**
160          * Note: port number is only really known on the client side
161          */
162         uint16_t port;
163         uint32_t flags;
164         uint32_t max_transfer_bytes;
165
166         /**
167          *  This id is unique for each channel and will correspond with
168          *  vendor specific data in the inquiry_ata
169          */
170         uint64_t unique_id;
171
172 } __packed;
173
174 /**
175  *  This structure is sent during the storage protocol negotiations.
176  */
177
178 struct vmstor_proto_ver
179 {
180         /**
181          * Major (MSW) and minor (LSW) version numbers.
182          */
183         uint16_t major_minor;
184
185         uint16_t revision;                      /* always zero */
186 } __packed;
187
188 /**
189  * Channel Property Flags
190  */
191
192 #define STORAGE_CHANNEL_REMOVABLE_FLAG                  0x1
193 #define STORAGE_CHANNEL_EMULATED_IDE_FLAG               0x2
194
195
196 struct vstor_packet {
197         /**
198          * Requested operation type
199          */
200         enum vstor_packet_ops operation;
201
202         /*
203          * Flags - see below for values
204          */
205         uint32_t flags;
206
207         /**
208          * Status of the request returned from the server side.
209          */
210         uint32_t status;
211
212         union
213         {
214             /**
215              * Structure used to forward SCSI commands from the client to
216              * the server.
217              */
218             struct vmscsi_req vm_srb;
219
220             /**
221              * Structure used to query channel properties.
222              */
223             struct vmstor_chan_props chan_props;
224
225             /**
226              * Used during version negotiations.
227              */
228             struct vmstor_proto_ver version;
229
230             /**
231              * Number of multichannels to create
232              */
233             uint16_t multi_channels_cnt;
234         } u;
235
236 } __packed;
237
238
239 /**
240  * SRB (SCSI Request Block) Status Codes
241  */
242 #define SRB_STATUS_PENDING              0x00
243 #define SRB_STATUS_SUCCESS              0x01
244 #define SRB_STATUS_ABORTED              0x02
245 #define SRB_STATUS_ABORT_FAILED 0x03
246 #define SRB_STATUS_ERROR                0x04
247 #define SRB_STATUS_BUSY                 0x05
248
249 /**
250  * SRB Status Masks (can be combined with above status codes)
251  */
252 #define SRB_STATUS_QUEUE_FROZEN         0x40
253 #define SRB_STATUS_AUTOSENSE_VALID      0x80
254 #define SRB_STATUS_INVALID_LUN          0X20
255
256 /**
257  *  Packet flags
258  */
259
260 /**
261  *  This flag indicates that the server should send back a completion for this
262  *  packet.
263  */
264 #define REQUEST_COMPLETION_FLAG 0x1
265
266 /**
267  *  This is the set of flags that the vsc can set in any packets it sends
268  */
269 #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
270
271 #endif /* __HV_VSTORAGE_H__ */