#ifndef _ISCSID_GLOBALS_H
#define _ISCSID_GLOBALS_H
#ifndef _THREAD_SAFE
#define _THREAD_SAFE 1
#endif
#include <sys/queue.h>
#include <sys/scsiio.h>
#include <sys/param.h>
#include <uvm/uvm_param.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdarg.h>
#include <signal.h>
#ifndef ISCSI_NOTHREAD
#include <pthread.h>
#endif
#include <iscsi.h>
#include <iscsi_ioctl.h>
#include "iscsid.h"
#define INTERFACE_VERSION 2
#define VERSION_MAJOR 3
#define VERSION_MINOR 1
#define VERSION_STRING "NetBSD iSCSI Software Initiator Daemon 20110407 "
#define REQ_BUFFER_SIZE 8192
#define RSP_BUFFER_SIZE 8192
#define ISCSI_DEFAULT_PORT 3260
#define ISCSI_DEFAULT_ISNS_PORT 3205
#ifndef TRUE
typedef int boolean_t;
#define TRUE 1
#define FALSE 0
#endif
struct generic_entry_s
{
TAILQ_ENTRY(generic_entry_s) link;
iscsid_sym_id_t sid;
};
typedef struct generic_entry_s generic_entry_t;
TAILQ_HEAD(generic_list_s, generic_entry_s);
typedef struct generic_list_s generic_list_t;
struct isns_s
{
generic_entry_t entry;
uint8_t address[ISCSI_ADDRESS_LENGTH];
uint16_t port;
int sock;
uint8_t reg_iscsi_name[ISCSI_STRING_LENGTH];
uint8_t reg_entity_id[ISCSI_STRING_LENGTH];
uint8_t reg_ip_addr[16];
uint32_t reg_ip_port;
};
TAILQ_HEAD(isns_list_s, isns_s);
typedef struct isns_s isns_t;
typedef struct isns_list_s isns_list_t;
typedef struct initiator_s initiator_t;
struct initiator_s
{
generic_entry_t entry;
uint8_t address[ISCSI_ADDRESS_LENGTH];
uint32_t active_connections;
};
TAILQ_HEAD(initiator_list_s, initiator_s);
typedef struct initiator_list_s initiator_list_t;
typedef enum
{
PORTAL_TYPE_STATIC = 0,
PORTAL_TYPE_SENDTARGET = 1,
PORTAL_TYPE_ISNS = 2,
PORTAL_TYPE_REFRESHING = 99
} iscsi_portal_types_t;
typedef struct portal_s portal_t;
typedef struct portal_group_s portal_group_t;
typedef struct target_s target_t;
typedef struct send_target_s send_target_t;
struct portal_s
{
generic_entry_t entry;
TAILQ_ENTRY(portal_s) group_list;
iscsi_portal_address_t addr;
iscsid_portal_options_t options;
target_t *target;
portal_group_t *group;
iscsi_portal_types_t portaltype;
uint32_t discoveryid;
uint32_t active_connections;
};
TAILQ_HEAD(portal_list_s, portal_s);
typedef struct portal_list_s portal_list_t;
struct portal_group_s
{
TAILQ_ENTRY(portal_group_s) groups;
portal_list_t portals;
uint32_t tag;
u_short num_portals;
};
TAILQ_HEAD(portal_group_list_s, portal_group_s);
typedef struct portal_group_list_s portal_group_list_t;
struct target_s
{
generic_entry_t entry;
uint8_t TargetName[ISCSI_STRING_LENGTH];
uint8_t TargetAlias[ISCSI_STRING_LENGTH];
u_short num_portals;
u_short num_groups;
iscsid_get_set_target_options_t options;
iscsid_set_target_authentication_req_t auth;
portal_group_list_t group_list;
};
TAILQ_HEAD(target_list_s, target_s);
typedef struct target_list_s target_list_t;
struct send_target_s
{
generic_entry_t entry;
uint8_t TargetName[ISCSI_STRING_LENGTH];
uint8_t TargetAlias[ISCSI_STRING_LENGTH];
u_short num_portals;
u_short num_groups;
iscsid_get_set_target_options_t options;
iscsid_set_target_authentication_req_t auth;
iscsi_portal_address_t addr;
};
TAILQ_HEAD(send_target_list_s, send_target_s);
typedef struct send_target_list_s send_target_list_t;
struct target_info_s
{
iscsid_sym_id_t sid;
uint8_t TargetName[ISCSI_STRING_LENGTH];
uint8_t TargetAlias[ISCSI_STRING_LENGTH];
iscsid_get_set_target_options_t options;
iscsid_set_target_authentication_req_t auth;
};
typedef struct target_info_s target_info_t;
struct portal_info_s
{
iscsid_sym_id_t sid;
iscsi_portal_address_t addr;
};
typedef struct portal_info_s portal_info_t;
typedef struct connection_s connection_t;
typedef struct session_s session_t;
struct connection_s
{
generic_entry_t entry;
session_t *session;
target_info_t target;
portal_info_t portal;
uint32_t initiator_id;
iscsi_login_parameters_t loginp;
};
struct session_s
{
generic_entry_t entry;
target_info_t target;
iscsi_login_session_type_t login_type;
uint32_t max_connections;
uint32_t num_connections;
generic_list_t connections;
};
TAILQ_HEAD(session_list_s, session_s);
typedef struct session_list_s session_list_t;
typedef struct
{
generic_list_t list;
int num_entries;
} list_head_t;
extern int driver;
extern int client_sock;
extern list_head_t list[NUM_DAEMON_LISTS];
#ifndef ISCSI_NOTHREAD
extern pthread_t event_thread;
extern pthread_mutex_t sesslist_lock;
#endif
extern iscsid_set_node_name_req_t node_name;
extern int debug_level;
#define DEBOUT(x) iscsid_log x
#define DEB(lev,x) { if (debug_level >= lev) iscsid_log x ; }
void iscsid_log(const char *, ...) __printflike(1, 2);
#define LOCK_SESSIONS pthread_mutex_lock(&sesslist_lock)
#define UNLOCK_SESSIONS pthread_mutex_unlock(&sesslist_lock)
#define NO_ID(sid) (!(sid)->id && !(sid)->name[0])
iscsid_response_t *make_rsp(size_t, iscsid_response_t **, int *);
generic_entry_t *find_id(generic_list_t *, uint32_t);
generic_entry_t *find_name(generic_list_t *, uint8_t *);
generic_entry_t *find_sym_id(generic_list_t *, iscsid_sym_id_t *);
uint32_t get_id(generic_list_t *, iscsid_sym_id_t *);
target_t *find_target(iscsid_list_kind_t, iscsid_sym_id_t *);
target_t *find_TargetName(iscsid_list_kind_t, uint8_t *);
portal_t *find_portal_by_addr(target_t *, iscsi_portal_address_t *);
send_target_t *find_send_target_by_addr(iscsi_portal_address_t *);
#define find_isns_id(id) \
(isns_t *)(void *)find_id(&list [ISNS_LIST].list, id)
#define find_session_id(id) \
(session_t *)(void *)find_id(&list [SESSION_LIST].list, id)
#define find_connection_id(session, id) \
(connection_t *)(void *)find_id(&session->connections, id)
#define find_portal_id(id) \
(portal_t *)(void *)find_id(&list [PORTAL_LIST].list, id)
#define find_target_id(lst, id) \
(target_t *)(void *)find_id(&list [lst].list, id)
#define find_send_target_id(id) \
(send_target_t *)(void *)find_id(&list [SEND_TARGETS_LIST].list, id)
#define find_initiator_id(id) \
(initiator_t *)(void *)find_id(&list [INITIATOR_LIST].list, id)
#define find_isns_name(name) \
(isns_t *)(void *)find_name(&list [ISNS_LIST].list, name)
#define find_session_name(name) \
(session_t *)(void *)find_name(&list [SESSION_LIST].list, name)
#define find_connection_name(session, name) \
(connection_t *)(void *)find_name(&session->connections, name)
#define find_portal_name(name) \
(portal_t *)(void *)find_name(&list [PORTAL_LIST].list, name)
#define find_target_symname(lst, name) \
(target_t *)(void *)find_name(&list [lst].list, name)
#define find_initiator_name(name) \
(initiator_t *)(void *)find_name(&list [INITIATOR_LIST].list, name)
#define find_isns(sid) \
(isns_t *)(void *)find_sym_id(&list [ISNS_LIST].list, sid)
#define find_session(sid) \
(session_t *)(void *)find_sym_id(&list [SESSION_LIST].list, sid)
#define find_connection(session, sid) \
(connection_t *)(void *)find_sym_id(&session->connections, sid)
#define find_portal(sid) \
(portal_t *)(void *)find_sym_id(&list [PORTAL_LIST].list, sid)
#define find_initiator(sid) \
(initiator_t *)(void *)find_sym_id(&list [INITIATOR_LIST].list, sid)
void get_list(iscsid_get_list_req_t *, iscsid_response_t **, int *);
void search_list(iscsid_search_list_req_t *, iscsid_response_t **, int *);
void get_session_list(iscsid_response_t **, int *);
void get_connection_info(iscsid_get_connection_info_req_t *,
iscsid_response_t **, int *);
void get_connection_list(iscsid_sym_id_t *, iscsid_response_t **, int *);
void add_initiator_portal(iscsid_add_initiator_req_t *, iscsid_response_t **,
int *);
uint32_t remove_initiator_portal(iscsid_sym_id_t *);
void get_initiator_portal(iscsid_sym_id_t *, iscsid_response_t **, int *);
initiator_t *select_initiator(void);
void event_kill_session(uint32_t);
void event_kill_connection(uint32_t, uint32_t);
void add_target(iscsid_add_target_req_t *, iscsid_response_t **, int *);
uint32_t set_target_options(iscsid_get_set_target_options_t *);
uint32_t set_target_auth(iscsid_set_target_authentication_req_t *);
void add_portal(iscsid_add_portal_req_t *, iscsid_response_t **, int *);
void delete_portal(portal_t *, boolean_t);
void get_target_info(iscsid_list_id_t *, iscsid_response_t **, int *);
void get_portal_info(iscsid_list_id_t *, iscsid_response_t **, int *);
uint32_t remove_target(iscsid_list_id_t *);
uint32_t refresh_targets(iscsid_refresh_req_t *);
target_t *add_discovered_target(uint8_t *, iscsi_portal_address_t *,
iscsi_portal_types_t, uint32_t);
boolean_t register_event_handler(void);
void deregister_event_handler(void);
void *event_handler(void *);
uint32_t set_node_name(iscsid_set_node_name_req_t *);
void log_in(iscsid_login_req_t *, iscsid_response_t *);
void add_connection(iscsid_login_req_t *, iscsid_response_t *);
uint32_t send_targets(uint32_t, uint8_t **, uint32_t *);
uint32_t log_out(iscsid_sym_id_t *);
uint32_t remove_connection(iscsid_remove_connection_req_t *);
void get_version(iscsid_response_t **, int *);
#ifndef ISCSI_MINIMAL
void add_isns_server(iscsid_add_isns_server_req_t *, iscsid_response_t **,
int *);
void get_isns_server(iscsid_sym_id_t *, iscsid_response_t **, int *);
uint32_t refresh_isns_server(uint32_t);
uint32_t remove_isns_server(iscsid_sym_id_t *);
void dereg_all_isns_servers(void);
#endif
#endif