46 #define OCS_ISCSI_API_INIT_DELAY_MS 100
59 ocs_sport_t *sport = NULL;
64 if (ocs->sport[inx].created == FALSE) {
65 sport = &ocs->sport[inx];
92 ocs_log_err(ocs,
"HAL mac address get failed\n");
98 ocs_memcpy(sport->mac, mac,
99 ARRAY_SIZE(sport->mac));
100 ocs_snprintf(sport->mac_str,
101 sizeof(sport->mac_str),
102 "%02x%02x%02x%02x%02x%02x",
103 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
105 sport->domain = ocs->domain;
106 sport->tgt_id = sport->index;
107 sport->created = TRUE;
130 ocs_sport_t *sport_next;
135 if (sport->index == sport_index && sport->created == TRUE) {
136 sport->created = FALSE;
160 tgt = ocs_malloc(ocs,
sizeof(
iscsi_api_tgt_t), OCS_M_ZERO | OCS_M_NOWAIT);
162 ocs_log_err(ocs,
"failed to allocate target structure\n");
172 ocs_log_debug(ocs,
"iSCSI target %s created\n", name);
194 if (count == index) {
223 if (count == index) {
296 return ocs->require_chap;
334 "%s:%02x%02x%02x%02x%02x%02x",
336 mac[0], mac[1],mac[2],mac[3],mac[4],mac[5]);
371 ocs->iscsi_api = ocs_malloc(ocs,
sizeof(
iscsi_api_t),
372 OCS_M_ZERO | OCS_M_NOWAIT);
373 if (ocs->iscsi_api == NULL) {
374 ocs_log_err(ocs,
"failed to allocate iscsi_api structure\n");
378 iscsi_api = ocs->iscsi_api;
380 ocs_lock_init(ocs, &iscsi_api->
api_list_lock,
"iscsi API list lock");
385 ocs_sem_init(&iscsi_api->
link_cfg_sem, 0,
"link cfg sem");
388 if(ocs_strcmp(ocs->local_ip,
"MGMT") == 0) {
390 }
else if (ocs_strcmp(ocs->local_ip,
"DHCP") == 0) {
392 }
else if (ocs_strcmp(ocs->local_ip,
"AutoV6") == 0) {
399 ocs_log_err(ocs,
"IPv4 address supplied, but subnet is not an valid IPv4 subnet\n");
413 ocs_log_err(ocs,
"IPv6 address supplied, but subnet is not an valid IPv6 subnet\n");
424 ocs_log_err(ocs,
"ERROR: Local address supplied is not a valid IPv4, IPv6, DHCP, AutoV6, or MGMT\n");
439 ocs_log_err(ocs,
"Failed to register a link state callback function\n");
452 ocs_log_err(ocs,
"Link config thread start returned %d\n", rc);
482 if (ocs->iscsi_api == NULL) {
502 ocs_log_test(ocs,
"Error stopping Link config thread\n");
510 while (i < num_ips) {
514 ip_str,
sizeof(ip_str));
521 ocs_log_test(ocs,
"failed Stopping Listen on IP %s\n",
524 ocs_log_debug(ocs,
"Stopped Listening on IP %s\n", ip_str);
532 ocs_log_test(ocs,
"failed Stopping ESI Listen on IP %s\n",
535 ocs_log_debug(ocs,
"Stopped ESI Listening on IP %s\n",
542 ocs_log_debug(ocs,
"iSNS deregistration done successfully!\n");
544 ocs_log_test(ocs,
"ERROR: iSNS deregistration FAILED!\n");
558 ocs_log_test(ocs,
"failed removing IP address %s\n", ip_str);
560 ocs_log_debug(ocs,
"removed IP address %s\n", ip_str);
578 ocs_log_err(ocs,
"Delete IFACE handle %d failed\n",
581 ocs_log_debug(ocs,
"Deleted IFACE handle %d of vlan_id %d\n",
584 ocs_free(ocs, portal_info,
sizeof(*portal_info));
596 ocs->iscsi_api = NULL;
618 if(ocs_strcmp(my_name, remote_name)){
619 ocs_log_debug(ocs,
"(%d) different: (%s) and (%s)\n", (
int) ctr, my_name, remote_name);
624 ocs_log_debug(ocs,
"(%d) same: (%s) and (%s)\n", (
int) ctr, my_name, remote_name);
650 for(i = 0; i < nodes_count; i++){
653 ip_string =
ocs_get_ip(&ocs->iscsi, ret, i, 0);
662 ocs_log_test(ocs,
"Failed to connect to target %s\n", iscsi_name);
664 ocs_log_debug(ocs,
"connecting to target %s\n", iscsi_name);
688 uint16_t nodes_count = 0;
689 void *qry_rsp_ptr = NULL;
692 &num_ips, isns_servers);
694 ocs_log_debug(ocs,
"iSNS Discovery succeeded, servers found %d\n",
696 for (i = 0; i < num_ips; i++) {
698 isns_servers[i].ip_address,
699 ip_str,
sizeof(ip_str));
700 ocs_log_debug(ocs,
"iSNS server found at %s\n", ip_str);
702 if (ocs->enable_tgt || ocs->enable_ini) {
707 ocs_log_test(ocs,
"ISNS REGISTERATION FAILED!\n");
713 if(nodes_count == 0){
714 ocs_log_test(ocs,
"iSNS ERROR: the number of discovered nodes = 0\n");
715 }
else if (qry_rsp_ptr != NULL) {
718 ocs_log_test(ocs,
"ISNS TARGETS QUERY FAILED!\n");
724 ocs_log_test(ocs,
"iSNS Discovery status %d\n", rc);
728 for (i = 0; i < iscsi->
num_ips; i++) {
732 ip_str,
sizeof(ip_str));
738 ocs_log_debug(ocs,
"Start iSNS ESI listen on IP %s\n", ip_str);
742 ocs_log_test(ocs,
"failed to start iSNS ESI listen on IP %s\n",
764 ocs_log_err(ocs,
"unable to allocate ip temporary variables\n");
781 (ocs,
"Added", &iscsi_api->
ipsub, portal);
784 ocs_log_test(ocs,
"add IP returned status %d\n", rc);
793 ip_str,
sizeof(ip_str));
794 ocs_log_debug(ocs,
"Added Gateway address %s\n", ip_str);
796 ocs_log_test(ocs,
"setting gateway returned status %d\n", rc);
801 if (ocs->enable_tgt) {
802 for (i = 0; i < iscsi->
num_ips; i++) {
805 ip_str,
sizeof(ip_str));
812 ocs_log_debug(ocs,
"Listen server started on %s\n",
816 ocs_log_test(ocs,
"listen returned status %d on %s\n",
845 if(ipsub_tbl == NULL){
846 ocs_log_err(ocs,
"unable to allocate ip temporary variables\n");
852 ocs_log_debug(ocs,
"Default portal %d\n", portal);
856 ocs_log_debug(ocs,
"set MTU to %s\n",
857 (ocs->enable_jumbo_frame == TRUE ?
"Jumbo" :
"Standard"));
859 ocs_log_test(ocs,
"Failed setting MTU, status=%d\n", rc);
877 for (i = 0; i < num_ips; i++) {
895 ocs_log_test(ocs,
"Query IP returned status %d\n", rc);
904 if(ocs->iscsi_api->enable_mgmt_flag) {
905 ocs_log_debug(ocs,
"waiting for ip managment configuration\n");
923 ocs_t *ocs = mythread->arg;
928 while (ocs_thread_terminate_requested(mythread) == 0) {
942 ocs_log_debug(ocs,
"link configuration thread exiting\n");
972 return ocs->max_cxns_per_session;
984 uint32_t mode, uint32_t type)
991 if ((chap->
mode == mode) && (chap->
type == type)) {
1010 uint32_t type, uint32_t *secret_len)
1017 if ((chap->
mode == mode) && (chap->
type == type)) {
1018 if (ocs_strcmp(name, chap->
username) == 0) {
1019 *secret_len = ocs_strlen(chap->
secret);
1044 char *secret, uint32_t type, uint32_t mode)
1048 uint8_t found = FALSE;
1055 if ((mode == chap->
mode) && (type == chap->
type)) {
1063 OCS_M_ZERO | OCS_M_NOWAIT);
1065 ocs_strcpy(chap->
username, username);
1066 ocs_strcpy(chap->
secret, secret);
1071 ocs_log_debug(ocs,
"%s CHAP %s:%s is added for %s\n",
1077 ocs_log_info(ocs,
"CHAP type %s is already exists\n",
1102 if (ocs->require_chap) {
1103 ocs_log_info(ocs,
"CHAP is enabled! Deletion is not allowed\n");
1117 ocs_log_err(ocs,
"CHAP type outgoing must be deleted "
1118 "prior to the type incoming.\n");
1127 if ((mode == chap->
mode) && (type == chap->
type)) {
1128 if (ocs_strcmp(username, chap->
username) == 0) {
1131 ocs_log_debug(ocs,
"%s CHAP %s:%s is removed for %s\n",
1143 ocs_log_info(ocs,
"CHAP user %s of type %s is not found\n",
1190 if (offset >= buflen) {
1191 ocs_log_err(ocs,
"User buffer is insufficient\n");
1200 sizeof(chap_user_buff.
secret));
1204 if (ocs_copy_to_user(userbuf + offset, &chap_user_buff,
1206 ocs_log_err(ocs,
"Chap list copy to user failed\n");
1226 uint32_t exp_cmdsn = 0;
1227 uint32_t max_cmdsn = 0;
1228 uint8_t response = 0;
1234 ocs_io = (ocs_io_t *)ul_arg;
1236 cb = ocs_io->unassisted_cb;
1237 ocs_io->unassisted_cb = NULL;
1249 rc = cb(ocs_io, exp_cmdsn, max_cmdsn, response);
1251 ocs_dma_free(cxn->ocs, &ocs_io->unassisted_payload);
1259 uint32_t data_size,
bool is_login,
bool set_dm,
1270 io->unassisted_cb = cb;
1271 io->hal_io_size = data_size;
1282 ocs_memset(&io->unassisted_payload, 0,
sizeof(ocs_dma_t));
1284 ocs_dma_alloc(ocs, &io->unassisted_payload,
1286 ocs_memcpy(io->unassisted_payload.virt, data, data_size);
1293 io->iparam.ini_io.lun = 0;
1294 io->iparam.ini_io.cmdsn = ocs_be32toh(nop_hdr->
cmd_sn);
1295 io->iparam.ini_io.dif_info = NULL;
1299 io->iparam.unassisted.set_dm = set_dm;
1300 io->iparam.unassisted.incr_statsn = FALSE;
1301 io->iparam.unassisted.is_login = is_login;
1302 io->iparam.unassisted.payload1 =
1303 (data_size ? &io->unassisted_payload : NULL);
1339 ocs_log_test(iscsi->
os,
"Invalid status %d\n", status);
1361 ocs_session_t *session = cxn->session;
1367 if (hal_io == NULL) {
1391 #if !defined(OCS_EXPORT)
1392 #define OCS_EXPORT(...)
int32_t ocs_iscsi_unassisted_pdu_send(ocs_t *ocs, ocs_io_t *io, ocs_cxn_t *cxn, void *bhs, void *data, uint32_t data_size, bool is_login, bool set_dm, ocs_iscsi_pdu_cb_t cb)
char tgt_alias[OCS_ISCSI_MAX_ALIAS_SIZE]
structure for storing VLAN id and interface handle together
static void ocs_iscsi_api_isns_connect(ocs_t *ocs, void *ret, uint16_t nodes_count)
Logs into any remote targets discovered through iSNS that are not this device.
Defines the iSCSI command PDU header.
ocs_sport_t * ocs_iscsi_tgt_get_free_sport(ocs_t *ocs)
Get a next free sport object index.
ocs_link_state_e
enum identifying the link state.
int32_t ocs_iscsi_tgt_add(ocs_t *ocs, char *name, char *alias)
Adds a target.
void ocs_str_to_ip_struct(ocs_iscsi_t *iscsi, char *ip, ocs_ip_address_t *ip_struct)
Converts a string ip into an ip struct.
int32_t ocs_iscsi_register_link_state_callback(ocs_t *ocs, ocs_link_state_cb_t cb)
Register to receive link state change notifications.
int32_t ocs_iscsi_isns_esi_listen_start(ocs_t *ocs, ocs_ip_address_t *ip, uint16_t tcp_port)
Starts an iSNS ESI TCP listen socket.
uint32_t ocs_iscsi_tgt_is_access_allowed(ocs_t *ocs, char *tgt_name, char *ini_name)
Checks if this initiator is allowed access to a target.
ocs_ip_address_t * ocs_iscsi_tgt_get_ip_address(ocs_t *ocs, char *tgt_name, uint32_t index)
Returns the IP address of the target name based on the index.
structure for storing CHAP usernames and passwords.
uint32_t ocs_iscsi_tgt_get_portal_group(ocs_t *ocs, char *tgt_name, ocs_ip_address_t *ip_address)
Returns the portal group of an IP address of the target name.
Defines the generic iSCSI basic header segment.
int32_t ocs_iscsi_mtu_set(ocs_t *ocs, uint8_t is_jumbo)
Sets the TCP MTU size of the iSCSI device.
int8_t ocs_isns_register(ocs_iscsi_t *iscsi, uint8_t reg_tgts, uint8_t reg_ini, ocs_ip_address_t *isns_ip, char *eid)
Sends the DevAttrReg message to the iSNS server.
#define OCS_CHAP_MODE_TARGET
char * ocs_get_iscsi_name(ocs_iscsi_t *iscsi, void *p, uint16_t index)
Gets the iscsi name of a given node.
static int32_t ocs_iscsi_api_link_configure_thread(ocs_thread_t *mythread)
Configures the link on initial link up.
ocs_session_type_e
enum identifying the types of IP addresses.
ocs_hal_target_login_options_t lgn_options
int32_t ocs_iscsi_listen_start(ocs_t *ocs, ocs_ip_address_t *ip, uint16_t tcp_port)
Starts a TCP listen socket.
void ocs_iscsi_ipsub_combine(ocs_ip_address_subnet_t *ipsub, ocs_ip_address_t *ip, ocs_ip_address_t *subnet)
Combines an iSCSI IP address and subnet into the combined structure.
int32_t ocs_iscsi_chap_user_del(ocs_t *ocs, char *username, uint32_t type, uint32_t mode)
Delete CHAP user.
#define OCS_ISCSI_API_INIT_DELAY_MS
char * ocs_iscsi_ini_get_name(ocs_t *ocs)
Return this initiator's name.
uint8_t ocs_iscsi_tgt_require_chap(ocs_t *ocs, char *tgt_name, ocs_session_type_e type)
Returns TRUE if CHAP is required for the session type.
int32_t ocs_scsi_io_dispatch(ocs_io_t *io, void *cb)
Attempt to dispatch an IO.
ocs_mgmt_functions_t sport_mgmt_functions
int32_t ocs_iscsi_send_context_udpate(ocs_cxn_t *cxn)
Sends the login parameters to the FW.
defines the parameters for an IO based on the IO type.
uint32_t ocs_hal_portal_t
void ocs_iscsi_convert_to_hal_ip(ocs_ip_address_t *ip, ocs_hal_ip_address_t *hal_ip)
Convert an iSCSI IP address to the HAL IP address.
static void * ocs_list_remove(ocs_list_t *list, void *item)
Remove an item from the list.
char * ocs_iscsi_tgt_get_names(ocs_t *ocs, uint32_t index)
Returns the target name based on the index.
static void ocs_iscsi_api_link_configure(ocs_t *ocs)
Configures the link on initial link up.
#define OCS_CHAP_TYPE_INCOMING
ocs_hal_io_t * ocs_hal_io_alloc(ocs_hal_t *hal)
Allocate a HAL IO object.
int32_t ocs_xport_control(ocs_xport_t *xport, ocs_xport_ctrl_e cmd,...)
Perform transport attach function.
uint8_t * ocs_iscsi_mac_get(ocs_t *ocs)
Gets the MAC address of the iSCSI device.
#define ocs_list_init(head, type, link)
char * ocs_iscsi_get_chap_name(ocs_t *ocs, uint8_t sess_type, uint32_t mode, uint32_t type)
Returns the CHAP user name of corresponding type.
int32_t ocs_iscsi_chap_user_add(ocs_t *ocs, char *username, char *secret, uint32_t type, uint32_t mode)
Add CHAP user. If CHAP user of same type is already exists, return error.
static void ocs_iscsi_api_non_mgmt_config(ocs_t *ocs, ocs_hal_portal_t portal)
static void ocs_sport_lock_init(ocs_sport_t *sport)
static void ocs_iscsi_isns_configure(ocs_t *ocs, ocs_hal_portal_t portal, ocs_ip_address_t *isns_servers)
Register/query the iSNS server.
int32_t ocs_iscsi_listen_stop(ocs_t *ocs, ocs_ip_address_t *ip, uint16_t tcp_port)
Stops a TCP listen socket.
#define OCS_CTRLMASK_ISCSI_ISNS_ENABLE
ocs_ip_address_subnet_t ipsub
ocs_hal_portal_t ocs_iscsi_portal_get_default(ocs_t *ocs)
Retrieves the default portal.
int32_t ocs_iscsi_ip_address_remove(ocs_t *ocs, ocs_hal_portal_t portal, ocs_ip_address_subnet_t *ipsub)
Remove the IP address to the specified interface.
void ocs_iscsi_api_link_state(ocs_t *ocs, ocs_link_state_e link_state)
Notifies the higher level iSCSI software of the link state.
#define ocs_list_foreach_safe(list, item, nxt)
Iterate a linked list safely.
ocs_hal_rtn_e ocs_hal_io_send(ocs_hal_t *hal, ocs_hal_io_type_e type, ocs_hal_io_t *io, uint32_t len, ocs_hal_io_param_t *iparam, ocs_cxn_t *cxn, io_cb_t cb, void *arg)
Send a read, write, or response IO.
char ini_name[OCS_MAX_ISCSI_NAME]
int32_t ocs_iscsi_is_ip_in_tbl(ocs_t *ocs, ocs_ip_address_subnet_t *ipsub)
Checks if an IP address/subnet is present in the table.
int32_t ocs_iscsi_ip_address_query(ocs_t *ocs, ocs_hal_portal_t portal, ocs_ip_type_e ip_type, uint32_t max_entries, uint32_t *num_ips, ocs_ip_address_subnet_t *ipsub)
Queries the IP addresses on the default interface.
#define ISCSI_RESERVED_TTT
ocs_hal_portal_t iface_handle
int32_t ocs_iscsi_api_initialize(ocs_t *ocs)
Initialize the higher level iSCSI software.
ocs_thread_t link_cfg_thread
Defines the iSCSI nop-out PDU header.
int32_t ocs_iscsi_chap_list_count(ocs_t *ocs)
Returns the count of chap_list.
int32_t ocs_iscsi_isns_esi_listen_stop(ocs_t *ocs, ocs_ip_address_t *ip, uint16_t tcp_port)
Stops an iSNS ESI TCP listen socket.
struct ocs_hal_io_param_t::@17 context_upd
char * ocs_iscsi_get_chap_secret(ocs_t *ocs, char *name, uint32_t mode, uint32_t type, uint32_t *secret_len)
Returns the unenctypted CHAP secret for a specific user name. Note: Passwords should be at least 16 c...
void ocs_iscsi_rx_buffers_free(ocs_iscsi_t *iscsi, ocs_hal_rq_buffer_t *header, ocs_hal_rq_buffer_t *payload)
Add a receive buffer pair to the Receive Queue, if an error is received, then queue the buffer...
int32_t ocs_iscsi_portal_delete(ocs_t *ocs, ocs_hal_portal_t portal)
Removes a previously-created portal.
void * ocs_isns_qry_tgts(ocs_iscsi_t *iscsi, ocs_ip_address_t *isns_ip, uint16_t *ret_nodes_count)
Sends the DevAttrReg message to the iSNS server.
int32_t ocs_iscsi_gateway_set(ocs_t *ocs, ocs_ip_address_t *gateway)
Sets the IP gateway address.
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
void ocs_hal_io_free(ocs_hal_t *hal, ocs_hal_io_t *io)
Free a previously allocated HAL IO object.
int32_t ocs_iscsi_tgt_add_sport(ocs_t *ocs, ocs_sport_t *sport)
Add sport to iscsi target.
structure wrapping an IP address and subnet together with their type.
#define ocs_list_remove_head(list)
Remove and return an item from the head of the list.
void format_ip_address(ocs_ip_type_e ip_type, uint8_t *address, char *buffer, int size)
Format an IP address into a string.
char * ocs_get_ip(ocs_iscsi_t *iscsi, void *p, uint16_t index, uint16_t ip_index)
Gets the ip address of a given isns node.
structure wrapping an IP address together with it's type.
char * ocs_iscsi_ini_get_alias(ocs_t *ocs)
Returns the initiator alias.
int32_t ocs_cxn_connect(ocs_iscsi_t *iscsi, ocs_hal_ip_address_t *remote_ip, uint16_t tcp_port, char *tgt_name)
Log an initiator into the specified target address.
defines a structure to contain the fields specific to an initiator IO completion. ...
uint16_t ocs_get_port(ocs_iscsi_t *iscsi, void *p, uint16_t index, uint16_t ip_index)
Gets the port of a given isns node.
ocs_ip_type_e
enum identifying the types of IP addresses.
static uint8_t ocs_iscsi_api_not_local_target(ocs_t *ocs, char *remote_name)
Checks to see if the target name is this target.
int32_t ocs_iscsi_chap_list_get(ocs_t *ocs, char *userbuf, int32_t buflen)
Return CHAP list items.
int32_t ocs_iscsi_ip_address_add(ocs_t *ocs, ocs_hal_portal_t portal, ocs_ip_address_subnet_t *ipsub)
Adds the IP address to the specified interface.
static void ocs_domain_lock(ocs_domain_t *domain)
static int32_t ocs_iscsi_unassisted_pdu_cb(struct ocs_hal_io_s *io, ocs_cxn_t *cxn, int32_t status, ocs_ini_cmpl_fields_t *ini_fields, void *ul_arg)
int32_t ocs_iscsi_inet_pton4(const char *src, ocs_ip_address_t *ip)
Converts an IPv4 address from a string to the IP structure.
int32_t ocs_iscsi_isns_discover(ocs_t *ocs, ocs_hal_portal_t portal, uint32_t max_entries, uint32_t *num_ips, ocs_ip_address_t *ip)
Discovers the iSNS through the DHCP service.
Stores information needed to manage targets.
static int32_t ocs_iscsi_send_context_udpate_cb(ocs_hal_io_t *io, ocs_cxn_t *cxn, int32_t status, ocs_ini_cmpl_fields_t *ini_fields, void *ul_arg)
Function to receieve the callback for a context update.
void ocs_iscsi_unregister_link_state_callback(ocs_t *ocs, ocs_link_state_cb_t cb)
Unregister a link state change callback.
#define ocs_assert(cond,...)
#define OCS_MAX_ISCSI_NAME
char tgt_name[OCS_MAX_ISCSI_NAME]
#define OCS_ISCSI_TCP_PORT
ocs_iscsi_tgt_ip_t * ip_info
int32_t ocs_iscsi_inet_pton6(const char *src, ocs_ip_address_t *ip)
Converts an IPv6 address from a string to the IP structure.
ocs_ip_address_t * isns_servers
void * ocs_hal_get_ptr(ocs_hal_t *hal, ocs_hal_property_e prop)
uint32_t ocs_iscsi_get_max_cxns(ocs_t *ocs, char *tgt_name, char *ini_name)
Returns the maximum number of connections allowed per session.
int32_t(* ocs_iscsi_pdu_cb_t)(ocs_io_t *io, uint32_t exp_cmdsn, uint32_t max_cmdsn, uint8_t response)
int32_t ocs_iscsi_login_cb(ocs_hal_io_t *io, ocs_cxn_t *cxn, int32_t status, ocs_ini_cmpl_fields_t *ini_fields, void *ul_arg)
#define ocs_list_foreach(list, item)
Iterate a linked list.
structure wrapping an IP address together with it's type.
void ocs_iscsi_tgt_del_sport(ocs_t *ocs, uint32_t sport_index)
Delete sport from iscsi target.
int32_t ocs_iscsi_add_ip_to_tbl(ocs_t *ocs, char *desc, ocs_ip_address_subnet_t *ipsub, ocs_hal_portal_t portal)
Adds an IP address to the table.
char * ocs_iscsi_tgt_get_alias(ocs_t *ocs, uint32_t index)
Returns the target alias based on the index.
int32_t ocs_cxn_close(ocs_cxn_t *cxn, uint8_t sendRst)
Issues a request to the HAL to close the connection.
int8_t ocs_isns_deregister(ocs_t *ocs, ocs_ip_address_t *isns_ip, char *eid)
Sends the DevDereg message to the iSNS server.
#define OCS_CHAP_TYPE_OUTGOING
ocs_session_login_options_t session_options
static void ocs_domain_unlock(ocs_domain_t *domain)
int32_t ocs_iscsi_api_shutdown(ocs_t *ocs)
Initialize the higher level iSCSI software.