Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/cam/ctl/ctl_ioctl.h
39478 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2003 Silicon Graphics International Corp.
5
* Copyright (c) 2011 Spectra Logic Corporation
6
* Copyright (c) 2014-2017 Alexander Motin <[email protected]>
7
* All rights reserved.
8
*
9
* Redistribution and use in source and binary forms, with or without
10
* modification, are permitted provided that the following conditions
11
* are met:
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions, and the following disclaimer,
14
* without modification.
15
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
16
* substantially similar to the "NO WARRANTY" disclaimer below
17
* ("Disclaimer") and any redistribution must be conditioned upon
18
* including a substantially similar Disclaimer requirement for further
19
* binary redistribution.
20
*
21
* NO WARRANTY
22
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
25
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
* POSSIBILITY OF SUCH DAMAGES.
33
*
34
* $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_ioctl.h#4 $
35
*/
36
/*
37
* CAM Target Layer ioctl interface.
38
*
39
* Author: Ken Merry <[email protected]>
40
*/
41
42
#ifndef _CTL_IOCTL_H_
43
#define _CTL_IOCTL_H_
44
45
#ifdef ICL_KERNEL_PROXY
46
#include <sys/socket.h>
47
#endif
48
49
#include <sys/ioccom.h>
50
#include <sys/nv.h>
51
#include <dev/nvmf/nvmf.h>
52
#include <dev/nvmf/nvmf_proto.h>
53
54
#define CTL_DEFAULT_DEV "/dev/cam/ctl"
55
/*
56
* Maximum number of targets we support.
57
*/
58
#define CTL_MAX_TARGETS 1
59
60
/*
61
* Maximum target ID we support.
62
*/
63
#define CTL_MAX_TARGID 15
64
65
/*
66
* Maximum number of initiators per port.
67
*/
68
#define CTL_MAX_INIT_PER_PORT 2048
69
70
/* Hopefully this won't conflict with new misc devices that pop up */
71
#define CTL_MINOR 225
72
73
typedef enum {
74
CTL_DELAY_TYPE_NONE,
75
CTL_DELAY_TYPE_CONT,
76
CTL_DELAY_TYPE_ONESHOT
77
} ctl_delay_type;
78
79
typedef enum {
80
CTL_DELAY_LOC_NONE,
81
CTL_DELAY_LOC_DATAMOVE,
82
CTL_DELAY_LOC_DONE,
83
} ctl_delay_location;
84
85
typedef enum {
86
CTL_DELAY_STATUS_NONE,
87
CTL_DELAY_STATUS_OK,
88
CTL_DELAY_STATUS_INVALID_LUN,
89
CTL_DELAY_STATUS_INVALID_TYPE,
90
CTL_DELAY_STATUS_INVALID_LOC,
91
CTL_DELAY_STATUS_NOT_IMPLEMENTED
92
} ctl_delay_status;
93
94
struct ctl_io_delay_info {
95
uint32_t lun_id;
96
ctl_delay_type delay_type;
97
ctl_delay_location delay_loc;
98
uint32_t delay_secs;
99
ctl_delay_status status;
100
};
101
102
typedef enum {
103
CTL_STATS_NO_IO,
104
CTL_STATS_READ,
105
CTL_STATS_WRITE
106
} ctl_stat_types;
107
#define CTL_STATS_NUM_TYPES 3
108
109
typedef enum {
110
CTL_SS_OK,
111
CTL_SS_NEED_MORE_SPACE,
112
CTL_SS_ERROR
113
} ctl_stats_status;
114
115
typedef u_int ctl_stats_flags;
116
117
#define CTL_STATS_FLAG_NONE 0x00
118
#define CTL_STATS_FLAG_TIME_VALID 0x01
119
120
struct ctl_io_stats {
121
uint32_t item;
122
uint64_t bytes[CTL_STATS_NUM_TYPES];
123
uint64_t operations[CTL_STATS_NUM_TYPES];
124
uint64_t dmas[CTL_STATS_NUM_TYPES];
125
struct bintime time[CTL_STATS_NUM_TYPES];
126
struct bintime dma_time[CTL_STATS_NUM_TYPES];
127
};
128
129
struct ctl_get_io_stats {
130
struct ctl_io_stats *stats; /* passed to/from kernel */
131
size_t alloc_len; /* passed to kernel */
132
size_t fill_len; /* passed to userland */
133
int first_item; /* passed to kernel */
134
int num_items; /* passed to userland */
135
ctl_stats_status status; /* passed to userland */
136
ctl_stats_flags flags; /* passed to userland */
137
struct timespec timestamp; /* passed to userland */
138
};
139
140
/*
141
* The types of errors that can be injected:
142
*
143
* NONE: No error specified.
144
* ABORTED: SSD_KEY_ABORTED_COMMAND, 0x45, 0x00
145
* MEDIUM_ERR: Medium error, different asc/ascq depending on read/write.
146
* UA: Unit attention.
147
* CUSTOM: User specifies the sense data.
148
* TYPE: Mask to use with error types.
149
*
150
* Flags that affect injection behavior:
151
* CONTINUOUS: This error will stay around until explicitly cleared.
152
* DESCRIPTOR: Use descriptor sense instead of fixed sense.
153
*/
154
typedef u_int ctl_lun_error;
155
156
#define CTL_LUN_INJ_NONE 0x000
157
#define CTL_LUN_INJ_ABORTED 0x001
158
#define CTL_LUN_INJ_MEDIUM_ERR 0x002
159
#define CTL_LUN_INJ_UA 0x003
160
#define CTL_LUN_INJ_CUSTOM 0x004
161
#define CTL_LUN_INJ_TYPE 0x0ff
162
#define CTL_LUN_INJ_CONTINUOUS 0x100
163
#define CTL_LUN_INJ_DESCRIPTOR 0x200
164
165
/*
166
* Flags to specify what type of command the given error pattern will
167
* execute on. The first group of types can be ORed together.
168
*
169
* READ: Any read command.
170
* WRITE: Any write command.
171
* READWRITE: Any read or write command.
172
* READCAP: Any read capacity command.
173
* TUR: Test Unit Ready.
174
* ANY: Any command.
175
* MASK: Mask for basic command patterns.
176
*
177
* Special types:
178
*
179
* CMD: The CDB to act on is specified in struct ctl_error_desc_cmd.
180
* RANGE: For read/write commands, act when the LBA is in the
181
* specified range.
182
*/
183
typedef u_int ctl_lun_error_pattern;
184
185
#define CTL_LUN_PAT_NONE 0x000
186
#define CTL_LUN_PAT_READ 0x001
187
#define CTL_LUN_PAT_WRITE 0x002
188
#define CTL_LUN_PAT_READWRITE CTL_LUN_PAT_READ | CTL_LUN_PAT_WRITE
189
#define CTL_LUN_PAT_READCAP 0x004
190
#define CTL_LUN_PAT_TUR 0x008
191
#define CTL_LUN_PAT_ANY 0x0ff
192
#define CTL_LUN_PAT_MASK 0x0ff
193
#define CTL_LUN_PAT_CMD 0x100
194
#define CTL_LUN_PAT_RANGE 0x200
195
196
/*
197
* This structure allows the user to specify a particular CDB pattern to
198
* look for.
199
*
200
* cdb_pattern: Fill in the relevant bytes to look for in the CDB.
201
* cdb_valid_bytes: Bitmask specifying valid bytes in the cdb_pattern.
202
* flags: Specify any command flags (see ctl_io_flags) that
203
* should be set.
204
*/
205
struct ctl_error_desc_cmd {
206
uint8_t cdb_pattern[CTL_MAX_CDBLEN];
207
uint32_t cdb_valid_bytes;
208
uint32_t flags;
209
};
210
211
/*
212
* Error injection descriptor.
213
*
214
* lun_id LUN to act on.
215
* lun_error: The type of error to inject. See above for descriptions.
216
* error_pattern: What kind of command to act on. See above.
217
* cmd_desc: For CTL_LUN_PAT_CMD only.
218
* lba_range: For CTL_LUN_PAT_RANGE only.
219
* custom_sense: Specify sense. For CTL_LUN_INJ_CUSTOM only.
220
* serial: Serial number returned by the kernel. Use for deletion.
221
* links: Kernel use only.
222
*/
223
struct ctl_error_desc {
224
uint32_t lun_id; /* To kernel */
225
ctl_lun_error lun_error; /* To kernel */
226
ctl_lun_error_pattern error_pattern; /* To kernel */
227
struct ctl_error_desc_cmd cmd_desc; /* To kernel */
228
struct ctl_lba_len lba_range; /* To kernel */
229
struct scsi_sense_data custom_sense; /* To kernel */
230
uint64_t serial; /* From kernel */
231
STAILQ_ENTRY(ctl_error_desc) links; /* Kernel use only */
232
};
233
234
typedef u_int ctl_ooa_flags;
235
236
#define CTL_OOA_FLAG_NONE 0x00
237
#define CTL_OOA_FLAG_ALL_LUNS 0x01
238
239
typedef enum {
240
CTL_OOA_OK,
241
CTL_OOA_NEED_MORE_SPACE,
242
CTL_OOA_ERROR
243
} ctl_get_ooa_status;
244
245
typedef u_int ctl_ooa_cmd_flags;
246
247
#define CTL_OOACMD_FLAG_NONE 0x00
248
#define CTL_OOACMD_FLAG_DMA 0x01
249
#define CTL_OOACMD_FLAG_BLOCKED 0x02
250
#define CTL_OOACMD_FLAG_ABORT 0x04
251
#define CTL_OOACMD_FLAG_RTR 0x08
252
#define CTL_OOACMD_FLAG_DMA_QUEUED 0x10
253
#define CTL_OOACMD_FLAG_STATUS_QUEUED 0x20
254
#define CTL_OOACMD_FLAG_STATUS_SENT 0x40
255
256
struct ctl_ooa_entry {
257
ctl_ooa_cmd_flags cmd_flags;
258
uint8_t cdb[CTL_MAX_CDBLEN];
259
uint8_t cdb_len;
260
uint64_t tag_num;
261
ctl_tag_type tag_type;
262
uint32_t lun_num;
263
struct bintime start_bt;
264
};
265
266
struct ctl_ooa {
267
ctl_ooa_flags flags; /* passed to kernel */
268
uint64_t lun_num; /* passed to kernel */
269
uint32_t alloc_len; /* passed to kernel */
270
uint32_t alloc_num; /* passed to kernel */
271
struct ctl_ooa_entry *entries; /* filled in kernel */
272
uint32_t fill_len; /* passed to userland */
273
uint32_t fill_num; /* passed to userland */
274
uint32_t dropped_num; /* passed to userland */
275
struct bintime cur_bt; /* passed to userland */
276
ctl_get_ooa_status status; /* passed to userland */
277
};
278
279
typedef enum {
280
CTL_LUN_NOSTATUS,
281
CTL_LUN_OK,
282
CTL_LUN_ERROR,
283
CTL_LUN_WARNING
284
} ctl_lun_status;
285
286
#define CTL_ERROR_STR_LEN 160
287
288
typedef enum {
289
CTL_LUNREQ_CREATE,
290
CTL_LUNREQ_RM,
291
CTL_LUNREQ_MODIFY,
292
} ctl_lunreq_type;
293
294
/*
295
* The ID_REQ flag is used to say that the caller has requested a
296
* particular LUN ID in the req_lun_id field. If we cannot allocate that
297
* LUN ID, the ctl_add_lun() call will fail.
298
*
299
* The STOPPED flag tells us that the LUN should default to the powered
300
* off state. It will return 0x04,0x02 until it is powered up. ("Logical
301
* unit not ready, initializing command required.")
302
*
303
* The NO_MEDIA flag tells us that the LUN has no media inserted.
304
*
305
* The PRIMARY flag tells us that this LUN is registered as a Primary LUN
306
* which is accessible via the Master shelf controller in an HA. This flag
307
* being set indicates a Primary LUN. This flag being reset represents a
308
* Secondary LUN controlled by the Secondary controller in an HA
309
* configuration. Flag is applicable at this time to T_DIRECT types.
310
*
311
* The SERIAL_NUM flag tells us that the serial_num field is filled in and
312
* valid for use in SCSI INQUIRY VPD page 0x80.
313
*
314
* The DEVID flag tells us that the device_id field is filled in and
315
* valid for use in SCSI INQUIRY VPD page 0x83.
316
*
317
* The DEV_TYPE flag tells us that the device_type field is filled in.
318
*
319
* The EJECTED flag tells us that the removable LUN has tray open.
320
*
321
* The UNMAP flag tells us that this LUN supports UNMAP.
322
*
323
* The OFFLINE flag tells us that this LUN can not access backing store.
324
*/
325
typedef u_int ctl_backend_lun_flags;
326
327
#define CTL_LUN_FLAG_ID_REQ 0x01
328
#define CTL_LUN_FLAG_STOPPED 0x02
329
#define CTL_LUN_FLAG_NO_MEDIA 0x04
330
#define CTL_LUN_FLAG_PRIMARY 0x08
331
#define CTL_LUN_FLAG_SERIAL_NUM 0x10
332
#define CTL_LUN_FLAG_DEVID 0x20
333
#define CTL_LUN_FLAG_DEV_TYPE 0x40
334
#define CTL_LUN_FLAG_UNMAP 0x80
335
#define CTL_LUN_FLAG_EJECTED 0x100
336
#define CTL_LUN_FLAG_READONLY 0x200
337
338
/*
339
* LUN creation parameters:
340
*
341
* flags: Various LUN flags, see above.
342
*
343
* device_type: The SCSI device type. e.g. 0 for Direct Access,
344
* 3 for Processor, etc. Only certain backends may
345
* support setting this field. The CTL_LUN_FLAG_DEV_TYPE
346
* flag should be set in the flags field if the device
347
* type is set.
348
*
349
* lun_size_bytes: The size of the LUN in bytes. For some backends
350
* this is relevant (e.g. ramdisk), for others, it may
351
* be ignored in favor of using the properties of the
352
* backing store. If specified, this should be a
353
* multiple of the blocksize.
354
*
355
* The actual size of the LUN is returned in this
356
* field.
357
*
358
* blocksize_bytes: The LUN blocksize in bytes. For some backends this
359
* is relevant, for others it may be ignored in
360
* favor of using the properties of the backing store.
361
*
362
* The actual blocksize of the LUN is returned in this
363
* field.
364
*
365
* req_lun_id: The requested LUN ID. The CTL_LUN_FLAG_ID_REQ flag
366
* should be set if this is set. The request will be
367
* granted if the LUN number is available, otherwise
368
* the LUN addition request will fail.
369
*
370
* The allocated LUN number is returned in this field.
371
*
372
* serial_num: This is the value returned in SCSI INQUIRY VPD page
373
* 0x80. If it is specified, the CTL_LUN_FLAG_SERIAL_NUM
374
* flag should be set.
375
*
376
* The serial number value used is returned in this
377
* field.
378
*
379
* device_id: This is the value returned in the T10 vendor ID
380
* based DESIGNATOR field in the SCSI INQUIRY VPD page
381
* 0x83 data. If it is specified, the CTL_LUN_FLAG_DEVID
382
* flag should be set.
383
*
384
* The device id value used is returned in this field.
385
*/
386
struct ctl_lun_create_params {
387
ctl_backend_lun_flags flags;
388
uint8_t device_type;
389
uint64_t lun_size_bytes;
390
uint32_t blocksize_bytes;
391
uint32_t req_lun_id;
392
uint8_t serial_num[CTL_SN_LEN];
393
uint8_t device_id[CTL_DEVID_LEN];
394
};
395
396
/*
397
* LUN removal parameters:
398
*
399
* lun_id: The number of the LUN to delete. This must be set.
400
* The LUN must be backed by the given backend.
401
*/
402
struct ctl_lun_rm_params {
403
uint32_t lun_id;
404
};
405
406
/*
407
* LUN modification parameters:
408
*
409
* lun_id: The number of the LUN to modify. This must be set.
410
* The LUN must be backed by the given backend.
411
*
412
* lun_size_bytes: The size of the LUN in bytes. If zero, update
413
* the size using the backing file size, if possible.
414
*/
415
struct ctl_lun_modify_params {
416
uint32_t lun_id;
417
uint64_t lun_size_bytes;
418
};
419
420
/*
421
* Union of request type data. Fill in the appropriate union member for
422
* the request type.
423
*/
424
union ctl_lunreq_data {
425
struct ctl_lun_create_params create;
426
struct ctl_lun_rm_params rm;
427
struct ctl_lun_modify_params modify;
428
};
429
430
/*
431
* LUN request interface:
432
*
433
* backend: This is required, and is NUL-terminated a string
434
* that is the name of the backend, like "ramdisk" or
435
* "block".
436
*
437
* reqtype: The type of request, CTL_LUNREQ_CREATE to create a
438
* LUN, CTL_LUNREQ_RM to delete a LUN.
439
*
440
* reqdata: Request type-specific information. See the
441
* description of individual the union members above
442
* for more information.
443
*
444
* num_be_args: This is the number of backend-specific arguments
445
* in the be_args array.
446
*
447
* be_args: This is an array of backend-specific arguments.
448
* See above for a description of the fields in this
449
* structure.
450
*
451
* status: Status of the LUN request.
452
*
453
* error_str: If the status is CTL_LUN_ERROR, this will
454
* contain a string describing the error.
455
*
456
* kern_be_args: For kernel use only.
457
*/
458
struct ctl_lun_req {
459
#define CTL_BE_NAME_LEN 32
460
char backend[CTL_BE_NAME_LEN];
461
ctl_lunreq_type reqtype;
462
union ctl_lunreq_data reqdata;
463
void * args;
464
nvlist_t * args_nvl;
465
#define CTL_MAX_ARGS_LEN (1024 * 1024)
466
size_t args_len;
467
void * result;
468
nvlist_t * result_nvl;
469
size_t result_len;
470
ctl_lun_status status;
471
char error_str[CTL_ERROR_STR_LEN];
472
};
473
474
/*
475
* LUN list status:
476
*
477
* NONE: No status.
478
*
479
* OK: Request completed successfully.
480
*
481
* NEED_MORE_SPACE: The allocated length of the entries field is too
482
* small for the available data.
483
*
484
* ERROR: An error occurred, look at the error string for a
485
* description of the error.
486
*/
487
typedef enum {
488
CTL_LUN_LIST_NONE,
489
CTL_LUN_LIST_OK,
490
CTL_LUN_LIST_NEED_MORE_SPACE,
491
CTL_LUN_LIST_ERROR
492
} ctl_lun_list_status;
493
494
/*
495
* LUN list interface
496
*
497
* backend_name: This is a NUL-terminated string. If the string
498
* length is 0, then all LUNs on all backends will
499
* be enumerated. Otherwise this is the name of the
500
* backend to be enumerated, like "ramdisk" or "block".
501
*
502
* alloc_len: The length of the data buffer allocated for entries.
503
* In order to properly size the buffer, make one call
504
* with alloc_len set to 0, and then use the returned
505
* dropped_len as the buffer length to allocate and
506
* pass in on a subsequent call.
507
*
508
* lun_xml: XML-formatted information on the requested LUNs.
509
*
510
* fill_len: The amount of data filled in the storage for entries.
511
*
512
* status: The status of the request. See above for the
513
* description of the values of this field.
514
*
515
* error_str: If the status indicates an error, this string will
516
* be filled in to describe the error.
517
*/
518
struct ctl_lun_list {
519
char backend[CTL_BE_NAME_LEN]; /* passed to kernel*/
520
uint32_t alloc_len; /* passed to kernel */
521
char *lun_xml; /* filled in kernel */
522
uint32_t fill_len; /* passed to userland */
523
ctl_lun_list_status status; /* passed to userland */
524
char error_str[CTL_ERROR_STR_LEN];
525
/* passed to userland */
526
};
527
528
/*
529
* Port request interface:
530
*
531
* driver: This is required, and is NUL-terminated a string
532
* that is the name of the frontend, like "iscsi" .
533
*
534
* reqtype: The type of request, CTL_REQ_CREATE to create a
535
* port, CTL_REQ_REMOVE to delete a port.
536
*
537
* num_be_args: This is the number of frontend-specific arguments
538
* in the be_args array.
539
*
540
* be_args: This is an array of frontend-specific arguments.
541
* See above for a description of the fields in this
542
* structure.
543
*
544
* status: Status of the request.
545
*
546
* error_str: If the status is CTL_LUN_ERROR, this will
547
* contain a string describing the error.
548
*
549
* kern_be_args: For kernel use only.
550
*/
551
typedef enum {
552
CTL_REQ_CREATE,
553
CTL_REQ_REMOVE,
554
CTL_REQ_MODIFY,
555
} ctl_req_type;
556
557
struct ctl_req {
558
char driver[CTL_DRIVER_NAME_LEN];
559
ctl_req_type reqtype;
560
void * args;
561
nvlist_t * args_nvl;
562
size_t args_len;
563
void * result;
564
nvlist_t * result_nvl;
565
size_t result_len;
566
ctl_lun_status status;
567
char error_str[CTL_ERROR_STR_LEN];
568
};
569
570
/*
571
* iSCSI status
572
*
573
* OK: Request completed successfully.
574
*
575
* ERROR: An error occurred, look at the error string for a
576
* description of the error.
577
*
578
* CTL_ISCSI_LIST_NEED_MORE_SPACE:
579
* User has to pass larger buffer for CTL_ISCSI_LIST ioctl.
580
*/
581
typedef enum {
582
CTL_ISCSI_OK,
583
CTL_ISCSI_ERROR,
584
CTL_ISCSI_LIST_NEED_MORE_SPACE,
585
CTL_ISCSI_SESSION_NOT_FOUND
586
} ctl_iscsi_status;
587
588
typedef enum {
589
CTL_ISCSI_HANDOFF,
590
CTL_ISCSI_LIST,
591
CTL_ISCSI_LOGOUT,
592
CTL_ISCSI_TERMINATE,
593
CTL_ISCSI_LIMITS,
594
#if defined(ICL_KERNEL_PROXY) || 1
595
/*
596
* We actually need those in all cases, but leave the ICL_KERNEL_PROXY,
597
* to remember to remove them along with rest of proxy code, eventually.
598
*/
599
CTL_ISCSI_LISTEN,
600
CTL_ISCSI_ACCEPT,
601
CTL_ISCSI_SEND,
602
CTL_ISCSI_RECEIVE,
603
#endif
604
} ctl_iscsi_type;
605
606
typedef enum {
607
CTL_ISCSI_DIGEST_NONE,
608
CTL_ISCSI_DIGEST_CRC32C
609
} ctl_iscsi_digest;
610
611
#define CTL_ISCSI_NAME_LEN 224 /* 223 bytes, by RFC 3720, + '\0' */
612
#define CTL_ISCSI_ADDR_LEN 47 /* INET6_ADDRSTRLEN + '\0' */
613
#define CTL_ISCSI_ALIAS_LEN 128 /* Arbitrary. */
614
#define CTL_ISCSI_OFFLOAD_LEN 8 /* Arbitrary. */
615
616
struct ctl_iscsi_handoff_params {
617
char initiator_name[CTL_ISCSI_NAME_LEN];
618
char initiator_addr[CTL_ISCSI_ADDR_LEN];
619
char initiator_alias[CTL_ISCSI_ALIAS_LEN];
620
uint8_t initiator_isid[6];
621
char target_name[CTL_ISCSI_NAME_LEN];
622
int socket;
623
int portal_group_tag;
624
625
/*
626
* Connection parameters negotiated by ctld(8).
627
*/
628
ctl_iscsi_digest header_digest;
629
ctl_iscsi_digest data_digest;
630
uint32_t cmdsn;
631
uint32_t statsn;
632
int max_recv_data_segment_length;
633
int max_burst_length;
634
int first_burst_length;
635
uint32_t immediate_data;
636
char offload[CTL_ISCSI_OFFLOAD_LEN];
637
#ifdef ICL_KERNEL_PROXY
638
int connection_id;
639
#else
640
int spare;
641
#endif
642
int max_send_data_segment_length;
643
};
644
645
struct ctl_iscsi_list_params {
646
uint32_t alloc_len; /* passed to kernel */
647
char *conn_xml; /* filled in kernel */
648
uint32_t fill_len; /* passed to userland */
649
int spare[4];
650
};
651
652
struct ctl_iscsi_logout_params {
653
int connection_id; /* passed to kernel */
654
char initiator_name[CTL_ISCSI_NAME_LEN];
655
/* passed to kernel */
656
char initiator_addr[CTL_ISCSI_ADDR_LEN];
657
/* passed to kernel */
658
int all; /* passed to kernel */
659
int spare[4];
660
};
661
662
struct ctl_iscsi_terminate_params {
663
int connection_id; /* passed to kernel */
664
char initiator_name[CTL_ISCSI_NAME_LEN];
665
/* passed to kernel */
666
char initiator_addr[CTL_ISCSI_NAME_LEN];
667
/* passed to kernel */
668
int all; /* passed to kernel */
669
int spare[4];
670
};
671
672
struct ctl_iscsi_limits_params {
673
/* passed to kernel */
674
char offload[CTL_ISCSI_OFFLOAD_LEN];
675
int socket;
676
677
/* passed to userland */
678
#ifdef __LP64__
679
int spare;
680
#endif
681
int max_recv_data_segment_length;
682
int max_send_data_segment_length;
683
int max_burst_length;
684
int first_burst_length;
685
};
686
687
#ifdef ICL_KERNEL_PROXY
688
struct ctl_iscsi_listen_params {
689
int iser;
690
int domain;
691
int socktype;
692
int protocol;
693
struct sockaddr *addr;
694
socklen_t addrlen;
695
int portal_id;
696
int spare[4];
697
};
698
699
struct ctl_iscsi_accept_params {
700
int connection_id;
701
int portal_id;
702
struct sockaddr *initiator_addr;
703
socklen_t initiator_addrlen;
704
int spare[4];
705
};
706
707
struct ctl_iscsi_send_params {
708
int connection_id;
709
void *bhs;
710
size_t spare;
711
void *spare2;
712
size_t data_segment_len;
713
void *data_segment;
714
int spare3[4];
715
};
716
717
struct ctl_iscsi_receive_params {
718
int connection_id;
719
void *bhs;
720
size_t spare;
721
void *spare2;
722
size_t data_segment_len;
723
void *data_segment;
724
int spare3[4];
725
};
726
727
#endif /* ICL_KERNEL_PROXY */
728
729
union ctl_iscsi_data {
730
struct ctl_iscsi_handoff_params handoff;
731
struct ctl_iscsi_list_params list;
732
struct ctl_iscsi_logout_params logout;
733
struct ctl_iscsi_terminate_params terminate;
734
struct ctl_iscsi_limits_params limits;
735
#ifdef ICL_KERNEL_PROXY
736
struct ctl_iscsi_listen_params listen;
737
struct ctl_iscsi_accept_params accept;
738
struct ctl_iscsi_send_params send;
739
struct ctl_iscsi_receive_params receive;
740
#endif
741
};
742
743
/*
744
* iSCSI interface
745
*
746
* status: The status of the request. See above for the
747
* description of the values of this field.
748
*
749
* error_str: If the status indicates an error, this string will
750
* be filled in to describe the error.
751
*/
752
struct ctl_iscsi {
753
ctl_iscsi_type type; /* passed to kernel */
754
union ctl_iscsi_data data; /* passed to kernel */
755
ctl_iscsi_status status; /* passed to userland */
756
char error_str[CTL_ERROR_STR_LEN];
757
/* passed to userland */
758
};
759
760
struct ctl_lun_map {
761
uint32_t port;
762
uint32_t plun;
763
uint32_t lun;
764
};
765
766
/*
767
* NVMe over Fabrics status
768
*
769
* OK: Request completed successfully.
770
*
771
* ERROR: An error occurred, look at the error string for a
772
* description of the error.
773
*/
774
typedef enum {
775
CTL_NVMF_OK,
776
CTL_NVMF_ERROR,
777
CTL_NVMF_LIST_NEED_MORE_SPACE,
778
CTL_NVMF_ASSOCIATION_NOT_FOUND
779
} ctl_nvmf_status;
780
781
typedef enum {
782
CTL_NVMF_HANDOFF,
783
CTL_NVMF_LIST,
784
CTL_NVMF_TERMINATE
785
} ctl_nvmf_type;
786
787
struct ctl_nvmf_list_params {
788
uint32_t alloc_len; /* passed to kernel */
789
char *conn_xml; /* filled in kernel */
790
uint32_t fill_len; /* passed to userland */
791
int spare[4];
792
};
793
794
struct ctl_nvmf_terminate_params {
795
int cntlid; /* passed to kernel */
796
char hostnqn[NVME_NQN_FIELD_SIZE];
797
/* passed to kernel */
798
int all; /* passed to kernel */
799
int spare[4];
800
};
801
802
union ctl_nvmf_data {
803
struct nvmf_ioc_nv handoff;
804
struct ctl_nvmf_list_params list;
805
struct ctl_nvmf_terminate_params terminate;
806
};
807
808
/*
809
* NVMe over Fabrics interface
810
*
811
* status: The status of the request. See above for the
812
* description of the values of this field.
813
*
814
* error_str: If the status indicates an error, this string will
815
* be filled in to describe the error.
816
*/
817
struct ctl_nvmf {
818
ctl_nvmf_type type; /* passed to kernel */
819
union ctl_nvmf_data data; /* passed to kernel */
820
ctl_nvmf_status status; /* passed to userland */
821
char error_str[CTL_ERROR_STR_LEN];
822
/* passed to userland */
823
};
824
825
#define CTL_IO _IOWR(CTL_MINOR, 0x00, union ctl_io)
826
#define CTL_ENABLE_PORT _IOW(CTL_MINOR, 0x04, struct ctl_port_entry)
827
#define CTL_DISABLE_PORT _IOW(CTL_MINOR, 0x05, struct ctl_port_entry)
828
#define CTL_DELAY_IO _IOWR(CTL_MINOR, 0x10, struct ctl_io_delay_info)
829
#define CTL_ERROR_INJECT _IOWR(CTL_MINOR, 0x16, struct ctl_error_desc)
830
#define CTL_GET_OOA _IOWR(CTL_MINOR, 0x18, struct ctl_ooa)
831
#define CTL_DUMP_STRUCTS _IO(CTL_MINOR, 0x19)
832
#define CTL_LUN_REQ _IOWR(CTL_MINOR, 0x21, struct ctl_lun_req)
833
#define CTL_LUN_LIST _IOWR(CTL_MINOR, 0x22, struct ctl_lun_list)
834
#define CTL_ERROR_INJECT_DELETE _IOW(CTL_MINOR, 0x23, struct ctl_error_desc)
835
#define CTL_SET_PORT_WWNS _IOW(CTL_MINOR, 0x24, struct ctl_port_entry)
836
#define CTL_ISCSI _IOWR(CTL_MINOR, 0x25, struct ctl_iscsi)
837
#define CTL_PORT_REQ _IOWR(CTL_MINOR, 0x26, struct ctl_req)
838
#define CTL_PORT_LIST _IOWR(CTL_MINOR, 0x27, struct ctl_lun_list)
839
#define CTL_LUN_MAP _IOW(CTL_MINOR, 0x28, struct ctl_lun_map)
840
#define CTL_GET_LUN_STATS _IOWR(CTL_MINOR, 0x29, struct ctl_get_io_stats)
841
#define CTL_GET_PORT_STATS _IOWR(CTL_MINOR, 0x2a, struct ctl_get_io_stats)
842
#define CTL_NVMF _IOWR(CTL_MINOR, 0x2b, struct ctl_nvmf)
843
844
#endif /* _CTL_IOCTL_H_ */
845
846
/*
847
* vim: ts=8
848
*/
849
850