146 lines
7.1 KiB
C
146 lines
7.1 KiB
C
|
/*
|
||
|
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By downloading, copying, installing or
|
||
|
* using the software you agree to this license. If you do not agree to this license, do not download, install,
|
||
|
* copy or use the software.
|
||
|
*
|
||
|
* Intel License Agreement
|
||
|
*
|
||
|
* Copyright (c) 2000, Intel Corporation
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that
|
||
|
* the following conditions are met:
|
||
|
*
|
||
|
* -Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
||
|
* following disclaimer.
|
||
|
*
|
||
|
* -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.
|
||
|
*
|
||
|
* -The name of Intel Corporation may not be used to endorse or promote products derived from this software
|
||
|
* without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 INTEL 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.
|
||
|
*/
|
||
|
|
||
|
#ifndef OSD_H
|
||
|
#define OSD_H
|
||
|
|
||
|
#ifndef __KERNEL__
|
||
|
#include <stdint.h>
|
||
|
#endif
|
||
|
|
||
|
#include "util.h"
|
||
|
|
||
|
#define OSD_VENDOR "NetBSD"
|
||
|
#define OSD_PRODUCT "NetBSD/Intel OSD"
|
||
|
#define OSD_VERSION 0
|
||
|
|
||
|
/*
|
||
|
* OSD Configuration
|
||
|
*/
|
||
|
|
||
|
#define CONFIG_OSD_CAPACITY_DFLT 1024
|
||
|
#define CONFIG_OSD_LUNS_DFLT 1
|
||
|
#define CONFIG_OSD_BASEDIR_DFLT "/tmp/iscsi_osd"
|
||
|
#define CONFIG_OSD_CDB_LEN 128
|
||
|
|
||
|
/*
|
||
|
* OSD Service Actions
|
||
|
*/
|
||
|
|
||
|
#define OSD_CREATE_GROUP 0x880B
|
||
|
#define OSD_REMOVE_GROUP 0x880C
|
||
|
#define OSD_CREATE 0x8802
|
||
|
#define OSD_REMOVE 0x880A
|
||
|
#define OSD_READ 0x8805
|
||
|
#define OSD_WRITE 0x8806
|
||
|
#define OSD_GET_ATTR 0x880E
|
||
|
#define OSD_SET_ATTR 0x880F
|
||
|
|
||
|
/*
|
||
|
* OSD Arguments
|
||
|
*/
|
||
|
|
||
|
typedef struct osd_args_t {
|
||
|
uint8_t opcode;
|
||
|
uint8_t control;
|
||
|
uint8_t security;
|
||
|
uint8_t add_cdb_len;
|
||
|
uint16_t service_action;
|
||
|
uint8_t options_byte;
|
||
|
uint8_t second_options_byte;
|
||
|
uint32_t GroupID;
|
||
|
uint64_t UserID;
|
||
|
uint32_t SessionID;
|
||
|
uint64_t length;
|
||
|
uint64_t offset;
|
||
|
uint32_t set_attributes_list_length;
|
||
|
uint32_t get_attributes_page;
|
||
|
uint32_t get_attributes_list_length;
|
||
|
uint32_t get_attributes_allocation_length;
|
||
|
} osd_args_t;
|
||
|
|
||
|
#define OSD_ENCAP_CDB(ARGS, CDB) \
|
||
|
(CDB)[0] = (ARGS)->opcode; \
|
||
|
(CDB)[1] = (ARGS)->control; \
|
||
|
(CDB)[6] = (ARGS)->security; \
|
||
|
(CDB)[7] = (ARGS)->add_cdb_len; \
|
||
|
*((uint16_t *)((CDB)+8)) = ISCSI_HTONS((ARGS)->service_action); \
|
||
|
(CDB)[10] = (ARGS)->options_byte; \
|
||
|
(CDB)[11] = (ARGS)->second_options_byte; \
|
||
|
*((uint32_t *)((CDB)+12)) = ISCSI_HTONL((ARGS)->GroupID); \
|
||
|
*((uint64_t *)((CDB)+16)) = ISCSI_HTONLL((ARGS)->UserID); \
|
||
|
*((uint32_t *)((CDB)+24)) = ISCSI_HTONL((ARGS)->SessionID); \
|
||
|
*((uint64_t *)((CDB)+28)) = ISCSI_HTONLL((ARGS)->length); \
|
||
|
*((uint64_t *)((CDB)+36)) = ISCSI_HTONLL((ARGS)->offset); \
|
||
|
*((uint32_t *)((CDB)+44)) = ISCSI_HTONL((ARGS)->get_attributes_page); \
|
||
|
*((uint32_t *)((CDB)+48)) = ISCSI_HTONL((ARGS)->get_attributes_list_length); \
|
||
|
*((uint32_t *)((CDB)+52)) = ISCSI_HTONL((ARGS)->get_attributes_allocation_length); \
|
||
|
*((uint32_t *)((CDB)+72)) = ISCSI_HTONL((ARGS)->set_attributes_list_length);
|
||
|
|
||
|
#define OSD_DECAP_CDB(CDB, EXT_CDB, ARGS) \
|
||
|
(ARGS)->opcode = (CDB)[0]; \
|
||
|
(ARGS)->control = (CDB)[1]; \
|
||
|
(ARGS)->security = (CDB)[6]; \
|
||
|
(ARGS)->add_cdb_len = (CDB)[7]; \
|
||
|
(ARGS)->service_action = ISCSI_NTOHS(*((uint16_t *)((CDB)+8))); \
|
||
|
(ARGS)->options_byte = (CDB)[10]; \
|
||
|
(ARGS)->second_options_byte = (CDB)[11]; \
|
||
|
(ARGS)->GroupID = ISCSI_NTOHL(*((uint32_t *)((CDB)+12))); \
|
||
|
(ARGS)->UserID = ISCSI_NTOHLL(*((uint64_t *)((EXT_CDB)-16+16))); \
|
||
|
(ARGS)->SessionID = ISCSI_NTOHL(*((uint32_t *)((EXT_CDB)-16+24))); \
|
||
|
(ARGS)->length = ISCSI_NTOHLL(*((uint64_t *)((EXT_CDB)-16+28))); \
|
||
|
(ARGS)->offset = ISCSI_NTOHLL(*((uint64_t *)((EXT_CDB)-16+36))); \
|
||
|
(ARGS)->get_attributes_page = ISCSI_NTOHL(*((uint32_t *)((EXT_CDB)-16+44))); \
|
||
|
(ARGS)->get_attributes_list_length = ISCSI_NTOHL(*((uint32_t *)((EXT_CDB)-16+48))); \
|
||
|
(ARGS)->get_attributes_allocation_length = ISCSI_NTOHL(*((uint32_t *)((EXT_CDB)-16+52))); \
|
||
|
(ARGS)->set_attributes_list_length = ISCSI_NTOHL(*((uint32_t *)((EXT_CDB)-16+72)));
|
||
|
|
||
|
#define OSD_PRINT_CDB(CDB, EXT_CDB) \
|
||
|
PRINT("opcode = 0x%x\n", CDB[0]); \
|
||
|
PRINT("control = 0x%x\n", CDB[1]); \
|
||
|
PRINT("security = 0x%x\n", CDB[6]); \
|
||
|
PRINT("add_cdb_len = %u\n", CDB[7]); \
|
||
|
PRINT("service_action = 0x%x\n", ISCSI_NTOHS(*(uint16_t*)(CDB+8))); \
|
||
|
PRINT("options byte 1 = 0x%x\n", CDB[10]); \
|
||
|
PRINT("options byte 2 = 0x%x\n", CDB[11]); \
|
||
|
PRINT("group id = 0x%x\n", ISCSI_NTOHL(*(uint32_t*)(CDB+12))); \
|
||
|
PRINT("user id = 0x%llx\n", ISCSI_NTOHLL(*(uint64_t*)(EXT_CDB-16+16))); \
|
||
|
PRINT("session id = 0x%x\n", ISCSI_NTOHL(*(uint32_t*)(EXT_CDB-16+24))); \
|
||
|
PRINT("length = %llu\n", ISCSI_NTOHLL(*(uint64_t*)(EXT_CDB-16+28))); \
|
||
|
PRINT("offset = %llu\n", ISCSI_NTOHLL(*(uint64_t*)(EXT_CDB-16+36))); \
|
||
|
PRINT("get attr page = %u\n", ISCSI_NTOHL(*(uint32_t*)(EXT_CDB-16+44))); \
|
||
|
PRINT("get list len = %u\n", ISCSI_NTOHL(*(uint32_t*)(EXT_CDB-16+48))); \
|
||
|
PRINT("get alloc len = %u\n", ISCSI_NTOHL(*(uint32_t*)(EXT_CDB-16+52))); \
|
||
|
PRINT("set list len = %u\n", ISCSI_NTOHL(*(uint32_t*)(EXT_CDB-16+72)));
|
||
|
|
||
|
#endif /* OSD_H */
|