/* * 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 #include "config.h" #include #ifdef HAVE_STDINT_H #include #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 */