1255570Strasz/*- 2255570Strasz * Copyright (c) 2012 The FreeBSD Foundation 3255570Strasz * All rights reserved. 4255570Strasz * 5255570Strasz * This software was developed by Edward Tomasz Napierala under sponsorship 6255570Strasz * from the FreeBSD Foundation. 7255570Strasz * 8255570Strasz * Redistribution and use in source and binary forms, with or without 9255570Strasz * modification, are permitted provided that the following conditions 10255570Strasz * are met: 11255570Strasz * 1. Redistributions of source code must retain the above copyright 12255570Strasz * notice, this list of conditions and the following disclaimer. 13255570Strasz * 2. Redistributions in binary form must reproduce the above copyright 14255570Strasz * notice, this list of conditions and the following disclaimer in the 15255570Strasz * documentation and/or other materials provided with the distribution. 16255570Strasz * 17255570Strasz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18255570Strasz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19255570Strasz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20255570Strasz * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21255570Strasz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22255570Strasz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23255570Strasz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24255570Strasz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25255570Strasz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26255570Strasz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27255570Strasz * SUCH DAMAGE. 28255570Strasz * 29255570Strasz * $FreeBSD$ 30255570Strasz */ 31255570Strasz 32255570Strasz#ifndef CTLD_H 33255570Strasz#define CTLD_H 34255570Strasz 35255570Strasz#include <sys/queue.h> 36265513Strasz#ifdef ICL_KERNEL_PROXY 37265513Strasz#include <sys/types.h> 38270137Smav#endif 39265513Strasz#include <sys/socket.h> 40255570Strasz#include <stdbool.h> 41255570Strasz#include <libutil.h> 42255570Strasz 43255570Strasz#define DEFAULT_CONFIG_PATH "/etc/ctl.conf" 44255570Strasz#define DEFAULT_PIDFILE "/var/run/ctld.pid" 45255570Strasz#define DEFAULT_BLOCKSIZE 512 46255570Strasz 47255570Strasz#define MAX_NAME_LEN 223 48255570Strasz#define MAX_DATA_SEGMENT_LENGTH (128 * 1024) 49255570Strasz#define MAX_BURST_LENGTH 16776192 50255570Strasz 51255570Straszstruct auth { 52255570Strasz TAILQ_ENTRY(auth) a_next; 53255570Strasz struct auth_group *a_auth_group; 54255570Strasz char *a_user; 55255570Strasz char *a_secret; 56255570Strasz char *a_mutual_user; 57255570Strasz char *a_mutual_secret; 58255570Strasz}; 59255570Strasz 60263720Straszstruct auth_name { 61263720Strasz TAILQ_ENTRY(auth_name) an_next; 62263720Strasz struct auth_group *an_auth_group; 63263720Strasz char *an_initator_name; 64263720Strasz}; 65263720Strasz 66263720Straszstruct auth_portal { 67263720Strasz TAILQ_ENTRY(auth_portal) ap_next; 68263720Strasz struct auth_group *ap_auth_group; 69263720Strasz char *ap_initator_portal; 70270137Smav struct sockaddr_storage ap_sa; 71270137Smav int ap_mask; 72263720Strasz}; 73263720Strasz 74255570Strasz#define AG_TYPE_UNKNOWN 0 75263729Strasz#define AG_TYPE_DENY 1 76263729Strasz#define AG_TYPE_NO_AUTHENTICATION 2 77263729Strasz#define AG_TYPE_CHAP 3 78263729Strasz#define AG_TYPE_CHAP_MUTUAL 4 79255570Strasz 80255570Straszstruct auth_group { 81255570Strasz TAILQ_ENTRY(auth_group) ag_next; 82255570Strasz struct conf *ag_conf; 83255570Strasz char *ag_name; 84255570Strasz struct target *ag_target; 85255570Strasz int ag_type; 86255570Strasz TAILQ_HEAD(, auth) ag_auths; 87263720Strasz TAILQ_HEAD(, auth_name) ag_names; 88263720Strasz TAILQ_HEAD(, auth_portal) ag_portals; 89255570Strasz}; 90255570Strasz 91255570Straszstruct portal { 92255570Strasz TAILQ_ENTRY(portal) p_next; 93255570Strasz struct portal_group *p_portal_group; 94255570Strasz bool p_iser; 95255570Strasz char *p_listen; 96255570Strasz struct addrinfo *p_ai; 97265509Strasz#ifdef ICL_KERNEL_PROXY 98265509Strasz int p_id; 99265509Strasz#endif 100255570Strasz 101255570Strasz TAILQ_HEAD(, target) p_targets; 102255570Strasz int p_socket; 103255570Strasz}; 104255570Strasz 105255570Straszstruct portal_group { 106255570Strasz TAILQ_ENTRY(portal_group) pg_next; 107255570Strasz struct conf *pg_conf; 108255570Strasz char *pg_name; 109255570Strasz struct auth_group *pg_discovery_auth_group; 110255570Strasz bool pg_unassigned; 111255570Strasz TAILQ_HEAD(, portal) pg_portals; 112255570Strasz 113255570Strasz uint16_t pg_tag; 114255570Strasz}; 115255570Strasz 116255570Straszstruct lun_option { 117255570Strasz TAILQ_ENTRY(lun_option) lo_next; 118255570Strasz struct lun *lo_lun; 119255570Strasz char *lo_name; 120255570Strasz char *lo_value; 121255570Strasz}; 122255570Strasz 123255570Straszstruct lun { 124255570Strasz TAILQ_ENTRY(lun) l_next; 125255570Strasz TAILQ_HEAD(, lun_option) l_options; 126255570Strasz struct target *l_target; 127255570Strasz int l_lun; 128255570Strasz char *l_backend; 129255570Strasz int l_blocksize; 130255570Strasz char *l_device_id; 131255570Strasz char *l_path; 132255570Strasz char *l_serial; 133255570Strasz int64_t l_size; 134255570Strasz 135255570Strasz int l_ctl_lun; 136255570Strasz}; 137255570Strasz 138255570Straszstruct target { 139255570Strasz TAILQ_ENTRY(target) t_next; 140255570Strasz TAILQ_HEAD(, lun) t_luns; 141255570Strasz struct conf *t_conf; 142255570Strasz struct auth_group *t_auth_group; 143255570Strasz struct portal_group *t_portal_group; 144263723Strasz char *t_name; 145255570Strasz char *t_alias; 146255570Strasz}; 147255570Strasz 148255570Straszstruct conf { 149255570Strasz char *conf_pidfile_path; 150255570Strasz TAILQ_HEAD(, target) conf_targets; 151255570Strasz TAILQ_HEAD(, auth_group) conf_auth_groups; 152255570Strasz TAILQ_HEAD(, portal_group) conf_portal_groups; 153255570Strasz int conf_debug; 154255570Strasz int conf_timeout; 155255570Strasz int conf_maxproc; 156255570Strasz 157255570Strasz uint16_t conf_last_portal_group_tag; 158265509Strasz#ifdef ICL_KERNEL_PROXY 159265509Strasz int conf_portal_id; 160265509Strasz#endif 161255570Strasz struct pidfh *conf_pidfh; 162263725Strasz 163263725Strasz bool conf_default_pg_defined; 164263725Strasz bool conf_default_ag_defined; 165265511Strasz bool conf_kernel_port_on; 166255570Strasz}; 167255570Strasz 168255570Strasz#define CONN_SESSION_TYPE_NONE 0 169255570Strasz#define CONN_SESSION_TYPE_DISCOVERY 1 170255570Strasz#define CONN_SESSION_TYPE_NORMAL 2 171255570Strasz 172255570Strasz#define CONN_DIGEST_NONE 0 173255570Strasz#define CONN_DIGEST_CRC32C 1 174255570Strasz 175255570Straszstruct connection { 176255570Strasz struct portal *conn_portal; 177255570Strasz struct target *conn_target; 178255570Strasz int conn_socket; 179255570Strasz int conn_session_type; 180255570Strasz char *conn_initiator_name; 181255570Strasz char *conn_initiator_addr; 182255570Strasz char *conn_initiator_alias; 183268684Smav uint8_t conn_initiator_isid[6]; 184270137Smav struct sockaddr_storage conn_initiator_sa; 185255570Strasz uint32_t conn_cmdsn; 186255570Strasz uint32_t conn_statsn; 187255570Strasz size_t conn_max_data_segment_length; 188255570Strasz size_t conn_max_burst_length; 189255570Strasz int conn_immediate_data; 190255570Strasz int conn_header_digest; 191255570Strasz int conn_data_digest; 192255570Strasz}; 193255570Strasz 194255570Straszstruct pdu { 195255570Strasz struct connection *pdu_connection; 196255570Strasz struct iscsi_bhs *pdu_bhs; 197255570Strasz char *pdu_data; 198255570Strasz size_t pdu_data_len; 199255570Strasz}; 200255570Strasz 201255570Strasz#define KEYS_MAX 1024 202255570Strasz 203255570Straszstruct keys { 204255570Strasz char *keys_names[KEYS_MAX]; 205255570Strasz char *keys_values[KEYS_MAX]; 206255570Strasz char *keys_data; 207255570Strasz size_t keys_data_len; 208255570Strasz}; 209255570Strasz 210255570Straszstruct conf *conf_new(void); 211255570Straszstruct conf *conf_new_from_file(const char *path); 212255570Straszstruct conf *conf_new_from_kernel(void); 213255570Straszvoid conf_delete(struct conf *conf); 214255570Straszint conf_verify(struct conf *conf); 215255570Strasz 216255570Straszstruct auth_group *auth_group_new(struct conf *conf, const char *name); 217255570Straszvoid auth_group_delete(struct auth_group *ag); 218265514Straszstruct auth_group *auth_group_find(const struct conf *conf, 219265514Strasz const char *name); 220263724Straszint auth_group_set_type_str(struct auth_group *ag, 221263724Strasz const char *type); 222255570Strasz 223255570Straszconst struct auth *auth_new_chap(struct auth_group *ag, 224255570Strasz const char *user, const char *secret); 225255570Straszconst struct auth *auth_new_chap_mutual(struct auth_group *ag, 226255570Strasz const char *user, const char *secret, 227255570Strasz const char *user2, const char *secret2); 228265514Straszconst struct auth *auth_find(const struct auth_group *ag, 229255570Strasz const char *user); 230255570Strasz 231263720Straszconst struct auth_name *auth_name_new(struct auth_group *ag, 232263720Strasz const char *initiator_name); 233263720Straszbool auth_name_defined(const struct auth_group *ag); 234263720Straszconst struct auth_name *auth_name_find(const struct auth_group *ag, 235263720Strasz const char *initiator_name); 236263720Strasz 237263720Straszconst struct auth_portal *auth_portal_new(struct auth_group *ag, 238263720Strasz const char *initiator_portal); 239263720Straszbool auth_portal_defined(const struct auth_group *ag); 240263720Straszconst struct auth_portal *auth_portal_find(const struct auth_group *ag, 241270137Smav const struct sockaddr_storage *sa); 242263720Strasz 243255570Straszstruct portal_group *portal_group_new(struct conf *conf, const char *name); 244255570Straszvoid portal_group_delete(struct portal_group *pg); 245265514Straszstruct portal_group *portal_group_find(const struct conf *conf, 246265514Strasz const char *name); 247255570Straszint portal_group_add_listen(struct portal_group *pg, 248255570Strasz const char *listen, bool iser); 249255570Strasz 250263723Straszstruct target *target_new(struct conf *conf, const char *name); 251255570Straszvoid target_delete(struct target *target); 252255570Straszstruct target *target_find(struct conf *conf, 253263723Strasz const char *name); 254255570Strasz 255255570Straszstruct lun *lun_new(struct target *target, int lun_id); 256255570Straszvoid lun_delete(struct lun *lun); 257265514Straszstruct lun *lun_find(const struct target *target, int lun_id); 258255570Straszvoid lun_set_backend(struct lun *lun, const char *value); 259255570Straszvoid lun_set_blocksize(struct lun *lun, size_t value); 260255570Straszvoid lun_set_device_id(struct lun *lun, const char *value); 261255570Straszvoid lun_set_path(struct lun *lun, const char *value); 262255570Straszvoid lun_set_serial(struct lun *lun, const char *value); 263255570Straszvoid lun_set_size(struct lun *lun, size_t value); 264255570Straszvoid lun_set_ctl_lun(struct lun *lun, uint32_t value); 265255570Strasz 266255570Straszstruct lun_option *lun_option_new(struct lun *lun, 267255570Strasz const char *name, const char *value); 268255570Straszvoid lun_option_delete(struct lun_option *clo); 269265514Straszstruct lun_option *lun_option_find(const struct lun *lun, 270265514Strasz const char *name); 271255570Straszvoid lun_option_set(struct lun_option *clo, 272255570Strasz const char *value); 273255570Strasz 274255570Straszvoid kernel_init(void); 275255570Straszint kernel_lun_add(struct lun *lun); 276255570Straszint kernel_lun_resize(struct lun *lun); 277255570Straszint kernel_lun_remove(struct lun *lun); 278255570Straszvoid kernel_handoff(struct connection *conn); 279268682Smavint kernel_port_add(struct target *targ); 280268682Smavint kernel_port_remove(struct target *targ); 281255570Straszvoid kernel_capsicate(void); 282255570Strasz 283265513Strasz#ifdef ICL_KERNEL_PROXY 284265509Straszvoid kernel_listen(struct addrinfo *ai, bool iser, 285265509Strasz int portal_id); 286265513Straszvoid kernel_accept(int *connection_id, int *portal_id, 287265513Strasz struct sockaddr *client_sa, 288265513Strasz socklen_t *client_salen); 289255570Straszvoid kernel_send(struct pdu *pdu); 290255570Straszvoid kernel_receive(struct pdu *pdu); 291265513Strasz#endif 292255570Strasz 293255570Straszstruct keys *keys_new(void); 294255570Straszvoid keys_delete(struct keys *keys); 295255570Straszvoid keys_load(struct keys *keys, const struct pdu *pdu); 296255570Straszvoid keys_save(struct keys *keys, struct pdu *pdu); 297255570Straszconst char *keys_find(struct keys *keys, const char *name); 298255570Straszint keys_find_int(struct keys *keys, const char *name); 299255570Straszvoid keys_add(struct keys *keys, 300255570Strasz const char *name, const char *value); 301255570Straszvoid keys_add_int(struct keys *keys, 302255570Strasz const char *name, int value); 303255570Strasz 304255570Straszstruct pdu *pdu_new(struct connection *conn); 305255570Straszstruct pdu *pdu_new_response(struct pdu *request); 306255570Straszvoid pdu_delete(struct pdu *pdu); 307255570Straszvoid pdu_receive(struct pdu *request); 308255570Straszvoid pdu_send(struct pdu *response); 309255570Strasz 310255570Straszvoid login(struct connection *conn); 311255570Strasz 312255570Straszvoid discovery(struct connection *conn); 313255570Strasz 314255570Straszvoid log_init(int level); 315255570Straszvoid log_set_peer_name(const char *name); 316255570Straszvoid log_set_peer_addr(const char *addr); 317255570Straszvoid log_err(int, const char *, ...) 318263732Strasz __dead2 __printflike(2, 3); 319255570Straszvoid log_errx(int, const char *, ...) 320263732Strasz __dead2 __printflike(2, 3); 321263732Straszvoid log_warn(const char *, ...) __printflike(1, 2); 322255570Straszvoid log_warnx(const char *, ...) __printflike(1, 2); 323263732Straszvoid log_debugx(const char *, ...) __printflike(1, 2); 324255570Strasz 325255570Straszchar *checked_strdup(const char *); 326255570Straszbool valid_iscsi_name(const char *name); 327255570Straszbool timed_out(void); 328255570Strasz 329255570Strasz#endif /* !CTLD_H */ 330