1*2224f3a1Sclaudio /* $OpenBSD: iscsid.h,v 1.24 2025/01/28 20:41:44 claudio Exp $ */ 2bde1ae23Sclaudio 3bde1ae23Sclaudio /* 4bde1ae23Sclaudio * Copyright (c) 2009 Claudio Jeker <claudio@openbsd.org> 5bde1ae23Sclaudio * 6bde1ae23Sclaudio * Permission to use, copy, modify, and distribute this software for any 7bde1ae23Sclaudio * purpose with or without fee is hereby granted, provided that the above 8bde1ae23Sclaudio * copyright notice and this permission notice appear in all copies. 9bde1ae23Sclaudio * 10bde1ae23Sclaudio * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11bde1ae23Sclaudio * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12bde1ae23Sclaudio * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13bde1ae23Sclaudio * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14bde1ae23Sclaudio * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15bde1ae23Sclaudio * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16bde1ae23Sclaudio * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17bde1ae23Sclaudio */ 18bde1ae23Sclaudio 19bde1ae23Sclaudio #define ISCSID_DEVICE "/dev/vscsi0" 20bde1ae23Sclaudio #define ISCSID_CONTROL "/var/run/iscsid.sock" 21bde1ae23Sclaudio #define ISCSID_CONFIG "/etc/iscsi.conf" 22bde1ae23Sclaudio #define ISCSID_USER "_iscsid" 23bde1ae23Sclaudio 24bde1ae23Sclaudio #define ISCSID_BASE_NAME "iqn.1995-11.org.openbsd.iscsid" 254125a3c4Sclaudio #define ISCSID_DEF_CONNS 8 26daed3c83Sclaudio #define ISCSID_HOLD_TIME_MAX 128 27bde1ae23Sclaudio 28bde1ae23Sclaudio #define PDU_READ_SIZE (256 * 1024) 29bde1ae23Sclaudio #define CONTROL_READ_SIZE 8192 30bde1ae23Sclaudio #define PDU_MAXIOV 5 31bde1ae23Sclaudio #define PDU_WRIOV (PDU_MAXIOV * 8) 32bde1ae23Sclaudio 33bde1ae23Sclaudio #define PDU_HEADER 0 34bde1ae23Sclaudio #define PDU_AHS 1 35bde1ae23Sclaudio #define PDU_HDIGEST 2 36bde1ae23Sclaudio #define PDU_DATA 3 37bde1ae23Sclaudio #define PDU_DDIGEST 4 38bde1ae23Sclaudio 39bde1ae23Sclaudio #define PDU_LEN(x) ((((x) + 3) / 4) * 4) 40bde1ae23Sclaudio 41f75ac035Stedu #ifndef nitems 42f75ac035Stedu #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 43f75ac035Stedu #endif 44f75ac035Stedu 45bde1ae23Sclaudio /* 46bde1ae23Sclaudio * Common control message header. 47bde1ae23Sclaudio * A message can consist of up to 3 parts with specified length. 48bde1ae23Sclaudio */ 49bde1ae23Sclaudio struct ctrlmsghdr { 50bde1ae23Sclaudio u_int16_t type; 51bde1ae23Sclaudio u_int16_t len[3]; 52bde1ae23Sclaudio }; 53bde1ae23Sclaudio 54f73922b8Sclaudio struct ctrldata { 55f73922b8Sclaudio void *buf; 56f73922b8Sclaudio size_t len; 57f73922b8Sclaudio }; 58f73922b8Sclaudio 59f73922b8Sclaudio #define CTRLARGV(x...) ((struct ctrldata []){ x }) 60f73922b8Sclaudio 61bde1ae23Sclaudio /* Control message types */ 62bde1ae23Sclaudio #define CTRL_SUCCESS 1 63bde1ae23Sclaudio #define CTRL_FAILURE 2 646727bd69Sclaudio #define CTRL_INPROGRESS 3 656727bd69Sclaudio #define CTRL_INITIATOR_CONFIG 4 666727bd69Sclaudio #define CTRL_SESSION_CONFIG 5 676727bd69Sclaudio #define CTRL_LOG_VERBOSE 6 68234d8810Sclaudio #define CTRL_VSCSI_STATS 7 699683d5fdSclaudio #define CTRL_SHOW_SUM 8 70ea99aae6Sclaudio #define CTRL_SESS_POLL 9 71bde1ae23Sclaudio 72bde1ae23Sclaudio TAILQ_HEAD(session_head, session); 73bde1ae23Sclaudio TAILQ_HEAD(connection_head, connection); 74bde1ae23Sclaudio TAILQ_HEAD(pduq, pdu); 75bde1ae23Sclaudio TAILQ_HEAD(taskq, task); 76bde1ae23Sclaudio 77bde1ae23Sclaudio /* as in tcp_seq.h */ 78bde1ae23Sclaudio #define SEQ_LT(a,b) ((int)((a)-(b)) < 0) 79bde1ae23Sclaudio #define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) 80bde1ae23Sclaudio #define SEQ_GT(a,b) ((int)((a)-(b)) > 0) 81bde1ae23Sclaudio #define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) 82bde1ae23Sclaudio 83cb408c6cSclaudio #define SESS_INIT 0x0001 84cb408c6cSclaudio #define SESS_FREE 0x0002 8512bd4d7fSclaudio #define SESS_LOGGED_IN 0x0004 8612bd4d7fSclaudio #define SESS_FAILED 0x0008 87cb408c6cSclaudio #define SESS_ANYSTATE 0xffff 8812bd4d7fSclaudio #define SESS_RUNNING (SESS_FREE | SESS_LOGGED_IN | SESS_FAILED) 89bde1ae23Sclaudio 90daed3c83Sclaudio #define CONN_FREE 0x0001 /* S1 = R3 */ 91daed3c83Sclaudio #define CONN_XPT_WAIT 0x0002 /* S2 */ 92daed3c83Sclaudio #define CONN_XPT_UP 0x0004 /* S3 */ 93daed3c83Sclaudio #define CONN_IN_LOGIN 0x0008 /* S4 */ 94daed3c83Sclaudio #define CONN_LOGGED_IN 0x0010 /* S5 */ 95daed3c83Sclaudio #define CONN_IN_LOGOUT 0x0020 /* S6 */ 96daed3c83Sclaudio #define CONN_LOGOUT_REQ 0x0040 /* S7 */ 97daed3c83Sclaudio #define CONN_CLEANUP_WAIT 0x0080 /* S8 = R1 */ 98daed3c83Sclaudio #define CONN_IN_CLEANUP 0x0100 /* R2 */ 99bde1ae23Sclaudio #define CONN_ANYSTATE 0xffff 10012bd4d7fSclaudio #define CONN_RUNNING (CONN_LOGGED_IN | CONN_LOGOUT_REQ) 10112bd4d7fSclaudio #define CONN_FAILED (CONN_CLEANUP_WAIT | CONN_IN_CLEANUP) 1024125a3c4Sclaudio #define CONN_NEVER_LOGGED_IN (CONN_FREE | CONN_XPT_WAIT | CONN_XPT_UP | \ 1034125a3c4Sclaudio CONN_IN_LOGIN) 104bde1ae23Sclaudio 105bde1ae23Sclaudio enum c_event { 106bde1ae23Sclaudio CONN_EV_FAIL, 10712bd4d7fSclaudio CONN_EV_FREE, 108bde1ae23Sclaudio CONN_EV_CONNECT, 109bde1ae23Sclaudio CONN_EV_CONNECTED, 110bde1ae23Sclaudio CONN_EV_LOGGED_IN, 111daed3c83Sclaudio CONN_EV_REQ_LOGOUT, 112cb408c6cSclaudio CONN_EV_LOGOUT, 113cb408c6cSclaudio CONN_EV_LOGGED_OUT, 114daed3c83Sclaudio CONN_EV_CLOSED, 115daed3c83Sclaudio CONN_EV_CLEANING_UP 116cb408c6cSclaudio }; 117cb408c6cSclaudio 118cb408c6cSclaudio enum s_event { 119cb408c6cSclaudio SESS_EV_START, 120daed3c83Sclaudio SESS_EV_STOP, 12112bd4d7fSclaudio SESS_EV_CONN_LOGGED_IN, 122cb408c6cSclaudio SESS_EV_CONN_FAIL, 123cb408c6cSclaudio SESS_EV_CONN_CLOSED, 124daed3c83Sclaudio SESS_EV_REINSTATEMENT, 125daed3c83Sclaudio SESS_EV_TIMEOUT, 12612bd4d7fSclaudio SESS_EV_CLOSED, 127daed3c83Sclaudio SESS_EV_FAIL, 128daed3c83Sclaudio SESS_EV_FREE 129bde1ae23Sclaudio }; 130bde1ae23Sclaudio 13112bd4d7fSclaudio #define SESS_ACT_UP 0 13212bd4d7fSclaudio #define SESS_ACT_DOWN 1 13312bd4d7fSclaudio 134bde1ae23Sclaudio struct pdu { 135bde1ae23Sclaudio TAILQ_ENTRY(pdu) entry; 136bde1ae23Sclaudio struct iovec iov[PDU_MAXIOV]; 137bde1ae23Sclaudio size_t resid; 138bde1ae23Sclaudio }; 139bde1ae23Sclaudio 140bde1ae23Sclaudio struct pdu_readbuf { 141bde1ae23Sclaudio char *buf; 142bde1ae23Sclaudio size_t size; 143bde1ae23Sclaudio size_t rpos; 144bde1ae23Sclaudio size_t wpos; 145bde1ae23Sclaudio struct pdu *wip; 146bde1ae23Sclaudio }; 147bde1ae23Sclaudio 148bde1ae23Sclaudio struct connection_config { 149bde1ae23Sclaudio /* values inherited from session_config */ 150bde1ae23Sclaudio struct sockaddr_storage TargetAddr; /* IP:port of target */ 151bde1ae23Sclaudio struct sockaddr_storage LocalAddr; /* IP:port of target */ 152bde1ae23Sclaudio }; 153bde1ae23Sclaudio 154bde1ae23Sclaudio struct initiator_config { 155bde1ae23Sclaudio u_int32_t isid_base; /* only 24 bits */ 156bde1ae23Sclaudio u_int16_t isid_qual; 157bde1ae23Sclaudio u_int16_t pad; 158bde1ae23Sclaudio }; 159bde1ae23Sclaudio 160bde1ae23Sclaudio struct session_config { 161bde1ae23Sclaudio /* unique session ID */ 162bde1ae23Sclaudio char SessionName[32]; 163bde1ae23Sclaudio /* 164bde1ae23Sclaudio * I = initialize only, L = leading only 165bde1ae23Sclaudio * S = session wide, C = connection only 166bde1ae23Sclaudio */ 167bde1ae23Sclaudio struct connection_config connection; 168bde1ae23Sclaudio 169bde1ae23Sclaudio char *TargetName; /* String: IS */ 170bde1ae23Sclaudio 171bde1ae23Sclaudio char *InitiatorName; /* String: IS */ 172bde1ae23Sclaudio 173bde1ae23Sclaudio u_int16_t MaxConnections; 174bde1ae23Sclaudio /* 1, 1-65535 (min()): LS */ 175bde1ae23Sclaudio u_int8_t HeaderDigest; 176bde1ae23Sclaudio /* None , (None|CRC32): IC */ 177bde1ae23Sclaudio u_int8_t DataDigest; 178bde1ae23Sclaudio /* None , (None|CRC32): IC */ 179bde1ae23Sclaudio u_int8_t SessionType; 180bde1ae23Sclaudio /* Normal, (Discovery|Normal): LS */ 181bde1ae23Sclaudio u_int8_t disabled; 182bde1ae23Sclaudio }; 183bde1ae23Sclaudio 184aeec9c16Sclaudio #define DIGEST_NONE 0x1 185aeec9c16Sclaudio #define DIGEST_CRC32C 0x2 186aeec9c16Sclaudio 187bde1ae23Sclaudio #define SESSION_TYPE_NORMAL 0 188bde1ae23Sclaudio #define SESSION_TYPE_DISCOVERY 1 189bde1ae23Sclaudio 190bde1ae23Sclaudio struct session_params { 191bde1ae23Sclaudio u_int32_t MaxBurstLength; 192bde1ae23Sclaudio /* 262144, 512-to-(2**24-1) (min()): LS */ 193bde1ae23Sclaudio u_int32_t FirstBurstLength; 194bde1ae23Sclaudio /* 65536, 512-to-(2**24-1) (min()): LS */ 195bde1ae23Sclaudio u_int16_t DefaultTime2Wait; 196bde1ae23Sclaudio /* 2, 0-to-3600 (max()): LS */ 197bde1ae23Sclaudio u_int16_t DefaultTime2Retain; 198bde1ae23Sclaudio /* 20, 0-to-3600 (min()): LS */ 199bde1ae23Sclaudio u_int16_t MaxOutstandingR2T; 200bde1ae23Sclaudio /* 1, 1-to-65535 (min()): LS */ 201bde1ae23Sclaudio u_int16_t TargetPortalGroupTag; 202bde1ae23Sclaudio /* 1- 65535: IS */ 203310dec26Sclaudio u_int16_t MaxConnections; 2044125a3c4Sclaudio /* 1, 1-65535 (min()): LS */ 205bde1ae23Sclaudio u_int8_t InitialR2T; 206bde1ae23Sclaudio /* yes, bool (||): LS */ 207bde1ae23Sclaudio u_int8_t ImmediateData; 208bde1ae23Sclaudio /* yes, bool (&&): LS */ 209bde1ae23Sclaudio u_int8_t DataPDUInOrder; 210bde1ae23Sclaudio /* yes, bool (||): LS */ 211bde1ae23Sclaudio u_int8_t DataSequenceInOrder; 212bde1ae23Sclaudio /* yes, bool (||): LS */ 213bde1ae23Sclaudio u_int8_t ErrorRecoveryLevel; 214bde1ae23Sclaudio /* 0, 0 - 2 (min()): LS */ 215bde1ae23Sclaudio }; 216bde1ae23Sclaudio 217bde1ae23Sclaudio struct connection_params { 218bde1ae23Sclaudio u_int32_t MaxRecvDataSegmentLength; 219bde1ae23Sclaudio /* 8192, 512-to-(2**24-1): C */ 220bde1ae23Sclaudio /* inherited from session_config */ 221bde1ae23Sclaudio u_int8_t HeaderDigest; 222bde1ae23Sclaudio u_int8_t DataDigest; 223bde1ae23Sclaudio }; 224bde1ae23Sclaudio 225bde1ae23Sclaudio struct initiator { 226bde1ae23Sclaudio struct session_head sessions; 227bde1ae23Sclaudio struct initiator_config config; 228bde1ae23Sclaudio u_int target; 229bde1ae23Sclaudio }; 230bde1ae23Sclaudio 231cb408c6cSclaudio struct sessev { 2320908bd10Sclaudio struct event ev; 233daed3c83Sclaudio struct session *sess; 234cb408c6cSclaudio struct connection *conn; 235cb408c6cSclaudio enum s_event event; 236cb408c6cSclaudio }; 237cb408c6cSclaudio 238bde1ae23Sclaudio struct session { 239bde1ae23Sclaudio TAILQ_ENTRY(session) entry; 2400908bd10Sclaudio struct sessev sev; 241bde1ae23Sclaudio struct connection_head connections; 242bde1ae23Sclaudio struct taskq tasks; 243bde1ae23Sclaudio struct session_config config; 244bde1ae23Sclaudio struct session_params mine; 245bde1ae23Sclaudio struct session_params his; 246bde1ae23Sclaudio struct session_params active; 247bde1ae23Sclaudio u_int32_t cmdseqnum; 248bde1ae23Sclaudio u_int32_t itt; 249bde1ae23Sclaudio u_int32_t isid_base; /* only 24 bits */ 250bde1ae23Sclaudio u_int16_t isid_qual; /* inherited from initiator */ 251bde1ae23Sclaudio u_int16_t tsih; /* target session id handle */ 252bde1ae23Sclaudio u_int target; 253daed3c83Sclaudio int holdTimer; /* internal hold timer */ 254bde1ae23Sclaudio int state; 25512bd4d7fSclaudio int action; 256bde1ae23Sclaudio }; 257bde1ae23Sclaudio 258ea99aae6Sclaudio struct session_poll { 259ea99aae6Sclaudio int session_count; 260ea99aae6Sclaudio int session_init_count; 261ea99aae6Sclaudio int session_running_count; 262ea99aae6Sclaudio int conn_logged_in_count; 263ea99aae6Sclaudio int conn_failed_count; 264ea99aae6Sclaudio int conn_waiting_count; 265ea99aae6Sclaudio int sess_conn_status; 266ea99aae6Sclaudio }; 267ea99aae6Sclaudio 268bde1ae23Sclaudio struct connection { 269bde1ae23Sclaudio struct event ev; 270bde1ae23Sclaudio struct event wev; 2710908bd10Sclaudio struct sessev sev; 272bde1ae23Sclaudio TAILQ_ENTRY(connection) entry; 273bde1ae23Sclaudio struct connection_params mine; 274bde1ae23Sclaudio struct connection_params his; 275bde1ae23Sclaudio struct connection_params active; 276bde1ae23Sclaudio struct connection_config config; 277bde1ae23Sclaudio struct pdu_readbuf prbuf; 278bde1ae23Sclaudio struct pduq pdu_w; 279bde1ae23Sclaudio struct taskq tasks; 280bde1ae23Sclaudio struct session *session; 281bde1ae23Sclaudio u_int32_t expstatsn; 282bde1ae23Sclaudio int state; 283bde1ae23Sclaudio int fd; 2843a50f0a9Sjmc u_int16_t cid; /* connection id */ 285bde1ae23Sclaudio }; 286bde1ae23Sclaudio 287bde1ae23Sclaudio struct task { 288bde1ae23Sclaudio TAILQ_ENTRY(task) entry; 289bde1ae23Sclaudio struct pduq sendq; 290bde1ae23Sclaudio struct pduq recvq; 291bde1ae23Sclaudio void *callarg; 292bde1ae23Sclaudio void (*callback)(struct connection *, void *, struct pdu *); 293cb408c6cSclaudio void (*failback)(void *); 294bde1ae23Sclaudio u_int32_t cmdseqnum; 295bde1ae23Sclaudio u_int32_t itt; 296cb408c6cSclaudio u_int8_t pending; 297bde1ae23Sclaudio }; 298bde1ae23Sclaudio 299bde1ae23Sclaudio struct kvp { 300bde1ae23Sclaudio char *key; 301bde1ae23Sclaudio char *value; 302bde1ae23Sclaudio long flags; 303bde1ae23Sclaudio }; 304bde1ae23Sclaudio #define KVP_KEY_ALLOCED 0x01 305bde1ae23Sclaudio #define KVP_VALUE_ALLOCED 0x02 306bde1ae23Sclaudio 307234d8810Sclaudio struct vscsi_stats { 308234d8810Sclaudio u_int64_t bytes_rd; 309234d8810Sclaudio u_int64_t bytes_wr; 310234d8810Sclaudio u_int64_t cnt_read; 311234d8810Sclaudio u_int64_t cnt_write; 312234d8810Sclaudio u_int64_t cnt_i2t; 313234d8810Sclaudio u_int64_t cnt_i2t_dir[3]; 314234d8810Sclaudio u_int64_t cnt_t2i; 315234d8810Sclaudio u_int64_t cnt_t2i_status[3]; 316234d8810Sclaudio u_int32_t cnt_probe; 317234d8810Sclaudio u_int32_t cnt_detach; 318234d8810Sclaudio }; 319234d8810Sclaudio 3204125a3c4Sclaudio extern const struct session_params iscsi_sess_defaults; 3214125a3c4Sclaudio extern const struct connection_params iscsi_conn_defaults; 3224125a3c4Sclaudio extern struct session_params initiator_sess_defaults; 3234125a3c4Sclaudio extern struct connection_params initiator_conn_defaults; 3244125a3c4Sclaudio 325bde1ae23Sclaudio void iscsid_ctrl_dispatch(void *, struct pdu *); 3264125a3c4Sclaudio void iscsi_merge_sess_params(struct session_params *, 3274125a3c4Sclaudio struct session_params *, struct session_params *); 3284125a3c4Sclaudio void iscsi_merge_conn_params(struct connection_params *, 3294125a3c4Sclaudio struct connection_params *, struct connection_params *); 330bde1ae23Sclaudio 3317b833938Sclaudio void initiator_init(void); 3327b833938Sclaudio void initiator_cleanup(void); 3337b833938Sclaudio void initiator_set_config(struct initiator_config *); 3347b833938Sclaudio struct initiator_config *initiator_get_config(void); 3357b833938Sclaudio void initiator_shutdown(void); 3367b833938Sclaudio int initiator_isdown(void); 3377b833938Sclaudio struct session *initiator_new_session(u_int8_t); 3387b833938Sclaudio struct session *initiator_find_session(char *); 339bde1ae23Sclaudio struct session *initiator_t2s(u_int); 3407b833938Sclaudio struct session_head *initiator_get_sessions(void); 34117fa8594Sclaudio void initiator_login(struct connection *); 34217fa8594Sclaudio void initiator_discovery(struct session *); 34312bd4d7fSclaudio void initiator_logout(struct session *, struct connection *, u_int8_t); 34417fa8594Sclaudio void initiator_nop_in_imm(struct connection *, struct pdu *); 34536af5452Sclaudio char *default_initiator_name(void); 346bde1ae23Sclaudio 347bde1ae23Sclaudio int control_init(char *); 348bde1ae23Sclaudio void control_cleanup(char *); 34977822a85Sclaudio void control_event_init(void); 350f73922b8Sclaudio void control_queue(void *, struct pdu *); 351bde1ae23Sclaudio int control_compose(void *, u_int16_t, void *, size_t); 352f73922b8Sclaudio int control_build(void *, u_int16_t, int, struct ctrldata *); 353bde1ae23Sclaudio 354cb408c6cSclaudio void session_cleanup(struct session *); 35512bd4d7fSclaudio int session_shutdown(struct session *); 356bde1ae23Sclaudio void session_config(struct session *, struct session_config *); 357bde1ae23Sclaudio void session_task_issue(struct session *, struct task *); 35812bd4d7fSclaudio void session_logout_issue(struct session *, struct task *); 359bde1ae23Sclaudio void session_schedule(struct session *); 3600908bd10Sclaudio void session_fsm(struct sessev *, enum s_event, unsigned int); 3610908bd10Sclaudio void session_fsm_callback(int, short, void *); 362bde1ae23Sclaudio 363bde1ae23Sclaudio void conn_new(struct session *, struct connection_config *); 364bde1ae23Sclaudio void conn_free(struct connection *); 365cb408c6cSclaudio int conn_task_ready(struct connection *); 366cb408c6cSclaudio void conn_task_issue(struct connection *, struct task *); 367bde1ae23Sclaudio void conn_task_schedule(struct connection *); 3684125a3c4Sclaudio void conn_task_cleanup(struct connection *, struct task *); 3694125a3c4Sclaudio int conn_parse_kvp(struct connection *, struct kvp *); 370*2224f3a1Sclaudio int kvp_set_from_mine(struct kvp *, const char *, struct connection *); 371bde1ae23Sclaudio void conn_pdu_write(struct connection *, struct pdu *); 372bde1ae23Sclaudio void conn_fail(struct connection *); 373cb408c6cSclaudio void conn_fsm(struct connection *, enum c_event); 374bde1ae23Sclaudio 375bde1ae23Sclaudio void *pdu_gethdr(struct pdu *); 376bde1ae23Sclaudio int text_to_pdu(struct kvp *, struct pdu *); 377bde1ae23Sclaudio struct kvp *pdu_to_text(char *, size_t); 3784125a3c4Sclaudio u_int64_t text_to_num(const char *, u_int64_t, u_int64_t, const char **); 3794125a3c4Sclaudio int text_to_bool(const char *, const char **); 380aeec9c16Sclaudio int text_to_digest(const char *, const char **); 381bde1ae23Sclaudio void pdu_free_queue(struct pduq *); 382bde1ae23Sclaudio ssize_t pdu_read(struct connection *); 383bde1ae23Sclaudio ssize_t pdu_write(struct connection *); 384bde1ae23Sclaudio int pdu_pending(struct connection *); 385bde1ae23Sclaudio void pdu_parse(struct connection *); 386bde1ae23Sclaudio int pdu_readbuf_set(struct pdu_readbuf *, size_t); 387bde1ae23Sclaudio void pdu_readbuf_free(struct pdu_readbuf *); 388bde1ae23Sclaudio 389bde1ae23Sclaudio struct pdu *pdu_new(void); 390bde1ae23Sclaudio void *pdu_alloc(size_t); 391bde1ae23Sclaudio void *pdu_dup(void *, size_t); 392bde1ae23Sclaudio int pdu_addbuf(struct pdu *, void *, size_t, unsigned int); 393bde1ae23Sclaudio void *pdu_getbuf(struct pdu *, size_t *, unsigned int); 394bde1ae23Sclaudio void pdu_free(struct pdu *); 395bde1ae23Sclaudio int socket_setblockmode(int, int); 396bde1ae23Sclaudio const char *log_sockaddr(void *); 397dda190faSclaudio void kvp_free(struct kvp *); 398bde1ae23Sclaudio 399bde1ae23Sclaudio void task_init(struct task *, struct session *, int, void *, 400cb408c6cSclaudio void (*)(struct connection *, void *, struct pdu *), 401cb408c6cSclaudio void (*)(void *)); 402cb408c6cSclaudio void taskq_cleanup(struct taskq *); 403bde1ae23Sclaudio void task_pdu_add(struct task *, struct pdu *); 404bde1ae23Sclaudio void task_pdu_cb(struct connection *, struct pdu *); 405bde1ae23Sclaudio 406bde1ae23Sclaudio void vscsi_open(char *); 407bde1ae23Sclaudio void vscsi_dispatch(int, short, void *); 408bde1ae23Sclaudio void vscsi_data(unsigned long, int, void *, size_t); 409bde1ae23Sclaudio void vscsi_status(int, int, void *, size_t); 410bde1ae23Sclaudio void vscsi_event(unsigned long, u_int, u_int); 411234d8810Sclaudio struct vscsi_stats *vscsi_stats(void); 412e86986b3Sbenno 413ea99aae6Sclaudio /* Session polling */ 414ea99aae6Sclaudio void poll_session(struct session_poll *, struct session *); 415ea99aae6Sclaudio void poll_finalize(struct session_poll *); 416ea99aae6Sclaudio 417e86986b3Sbenno /* logmsg.c */ 418e86986b3Sbenno void log_hexdump(void *, size_t); 419e86986b3Sbenno void log_pdu(struct pdu *, int); 420