1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * iSCSI User/Kernel Shares (Defines, Constants, Protocol definitions, etc) 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2005 Dmitry Yusupov 6*4882a593Smuzhiyun * Copyright (C) 2005 Alex Aizman 7*4882a593Smuzhiyun * maintained by open-iscsi@googlegroups.com 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef ISCSI_IF_H 11*4882a593Smuzhiyun #define ISCSI_IF_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <scsi/iscsi_proto.h> 14*4882a593Smuzhiyun #include <linux/in.h> 15*4882a593Smuzhiyun #include <linux/in6.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define ISCSI_NL_GRP_ISCSID 1 18*4882a593Smuzhiyun #define ISCSI_NL_GRP_UIP 2 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define UEVENT_BASE 10 21*4882a593Smuzhiyun #define KEVENT_BASE 100 22*4882a593Smuzhiyun #define ISCSI_ERR_BASE 1000 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun enum iscsi_uevent_e { 25*4882a593Smuzhiyun ISCSI_UEVENT_UNKNOWN = 0, 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* down events */ 28*4882a593Smuzhiyun ISCSI_UEVENT_CREATE_SESSION = UEVENT_BASE + 1, 29*4882a593Smuzhiyun ISCSI_UEVENT_DESTROY_SESSION = UEVENT_BASE + 2, 30*4882a593Smuzhiyun ISCSI_UEVENT_CREATE_CONN = UEVENT_BASE + 3, 31*4882a593Smuzhiyun ISCSI_UEVENT_DESTROY_CONN = UEVENT_BASE + 4, 32*4882a593Smuzhiyun ISCSI_UEVENT_BIND_CONN = UEVENT_BASE + 5, 33*4882a593Smuzhiyun ISCSI_UEVENT_SET_PARAM = UEVENT_BASE + 6, 34*4882a593Smuzhiyun ISCSI_UEVENT_START_CONN = UEVENT_BASE + 7, 35*4882a593Smuzhiyun ISCSI_UEVENT_STOP_CONN = UEVENT_BASE + 8, 36*4882a593Smuzhiyun ISCSI_UEVENT_SEND_PDU = UEVENT_BASE + 9, 37*4882a593Smuzhiyun ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10, 38*4882a593Smuzhiyun ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11, 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun ISCSI_UEVENT_TRANSPORT_EP_CONNECT = UEVENT_BASE + 12, 41*4882a593Smuzhiyun ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13, 42*4882a593Smuzhiyun ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14, 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15, 45*4882a593Smuzhiyun ISCSI_UEVENT_SET_HOST_PARAM = UEVENT_BASE + 16, 46*4882a593Smuzhiyun ISCSI_UEVENT_UNBIND_SESSION = UEVENT_BASE + 17, 47*4882a593Smuzhiyun ISCSI_UEVENT_CREATE_BOUND_SESSION = UEVENT_BASE + 18, 48*4882a593Smuzhiyun ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST = UEVENT_BASE + 19, 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun ISCSI_UEVENT_PATH_UPDATE = UEVENT_BASE + 20, 51*4882a593Smuzhiyun ISCSI_UEVENT_SET_IFACE_PARAMS = UEVENT_BASE + 21, 52*4882a593Smuzhiyun ISCSI_UEVENT_PING = UEVENT_BASE + 22, 53*4882a593Smuzhiyun ISCSI_UEVENT_GET_CHAP = UEVENT_BASE + 23, 54*4882a593Smuzhiyun ISCSI_UEVENT_DELETE_CHAP = UEVENT_BASE + 24, 55*4882a593Smuzhiyun ISCSI_UEVENT_SET_FLASHNODE_PARAMS = UEVENT_BASE + 25, 56*4882a593Smuzhiyun ISCSI_UEVENT_NEW_FLASHNODE = UEVENT_BASE + 26, 57*4882a593Smuzhiyun ISCSI_UEVENT_DEL_FLASHNODE = UEVENT_BASE + 27, 58*4882a593Smuzhiyun ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28, 59*4882a593Smuzhiyun ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, 60*4882a593Smuzhiyun ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, 61*4882a593Smuzhiyun ISCSI_UEVENT_SET_CHAP = UEVENT_BASE + 31, 62*4882a593Smuzhiyun ISCSI_UEVENT_GET_HOST_STATS = UEVENT_BASE + 32, 63*4882a593Smuzhiyun ISCSI_UEVENT_DESTROY_SESSION_ASYNC = UEVENT_BASE + 33, 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* up events */ 66*4882a593Smuzhiyun ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, 67*4882a593Smuzhiyun ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, 68*4882a593Smuzhiyun ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3, 69*4882a593Smuzhiyun ISCSI_KEVENT_DESTROY_SESSION = KEVENT_BASE + 4, 70*4882a593Smuzhiyun ISCSI_KEVENT_UNBIND_SESSION = KEVENT_BASE + 5, 71*4882a593Smuzhiyun ISCSI_KEVENT_CREATE_SESSION = KEVENT_BASE + 6, 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun ISCSI_KEVENT_PATH_REQ = KEVENT_BASE + 7, 74*4882a593Smuzhiyun ISCSI_KEVENT_IF_DOWN = KEVENT_BASE + 8, 75*4882a593Smuzhiyun ISCSI_KEVENT_CONN_LOGIN_STATE = KEVENT_BASE + 9, 76*4882a593Smuzhiyun ISCSI_KEVENT_HOST_EVENT = KEVENT_BASE + 10, 77*4882a593Smuzhiyun ISCSI_KEVENT_PING_COMP = KEVENT_BASE + 11, 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun enum iscsi_tgt_dscvr { 81*4882a593Smuzhiyun ISCSI_TGT_DSCVR_SEND_TARGETS = 1, 82*4882a593Smuzhiyun ISCSI_TGT_DSCVR_ISNS = 2, 83*4882a593Smuzhiyun ISCSI_TGT_DSCVR_SLP = 3, 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun enum iscsi_host_event_code { 87*4882a593Smuzhiyun ISCSI_EVENT_LINKUP = 1, 88*4882a593Smuzhiyun ISCSI_EVENT_LINKDOWN, 89*4882a593Smuzhiyun /* must always be last */ 90*4882a593Smuzhiyun ISCSI_EVENT_MAX, 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct iscsi_uevent { 94*4882a593Smuzhiyun uint32_t type; /* k/u events type */ 95*4882a593Smuzhiyun uint32_t iferror; /* carries interface or resource errors */ 96*4882a593Smuzhiyun uint64_t transport_handle; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun union { 99*4882a593Smuzhiyun /* messages u -> k */ 100*4882a593Smuzhiyun struct msg_create_session { 101*4882a593Smuzhiyun uint32_t initial_cmdsn; 102*4882a593Smuzhiyun uint16_t cmds_max; 103*4882a593Smuzhiyun uint16_t queue_depth; 104*4882a593Smuzhiyun } c_session; 105*4882a593Smuzhiyun struct msg_create_bound_session { 106*4882a593Smuzhiyun uint64_t ep_handle; 107*4882a593Smuzhiyun uint32_t initial_cmdsn; 108*4882a593Smuzhiyun uint16_t cmds_max; 109*4882a593Smuzhiyun uint16_t queue_depth; 110*4882a593Smuzhiyun } c_bound_session; 111*4882a593Smuzhiyun struct msg_destroy_session { 112*4882a593Smuzhiyun uint32_t sid; 113*4882a593Smuzhiyun } d_session; 114*4882a593Smuzhiyun struct msg_create_conn { 115*4882a593Smuzhiyun uint32_t sid; 116*4882a593Smuzhiyun uint32_t cid; 117*4882a593Smuzhiyun } c_conn; 118*4882a593Smuzhiyun struct msg_bind_conn { 119*4882a593Smuzhiyun uint32_t sid; 120*4882a593Smuzhiyun uint32_t cid; 121*4882a593Smuzhiyun uint64_t transport_eph; 122*4882a593Smuzhiyun uint32_t is_leading; 123*4882a593Smuzhiyun } b_conn; 124*4882a593Smuzhiyun struct msg_destroy_conn { 125*4882a593Smuzhiyun uint32_t sid; 126*4882a593Smuzhiyun uint32_t cid; 127*4882a593Smuzhiyun } d_conn; 128*4882a593Smuzhiyun struct msg_send_pdu { 129*4882a593Smuzhiyun uint32_t sid; 130*4882a593Smuzhiyun uint32_t cid; 131*4882a593Smuzhiyun uint32_t hdr_size; 132*4882a593Smuzhiyun uint32_t data_size; 133*4882a593Smuzhiyun } send_pdu; 134*4882a593Smuzhiyun struct msg_set_param { 135*4882a593Smuzhiyun uint32_t sid; 136*4882a593Smuzhiyun uint32_t cid; 137*4882a593Smuzhiyun uint32_t param; /* enum iscsi_param */ 138*4882a593Smuzhiyun uint32_t len; 139*4882a593Smuzhiyun } set_param; 140*4882a593Smuzhiyun struct msg_start_conn { 141*4882a593Smuzhiyun uint32_t sid; 142*4882a593Smuzhiyun uint32_t cid; 143*4882a593Smuzhiyun } start_conn; 144*4882a593Smuzhiyun struct msg_stop_conn { 145*4882a593Smuzhiyun uint32_t sid; 146*4882a593Smuzhiyun uint32_t cid; 147*4882a593Smuzhiyun uint64_t conn_handle; 148*4882a593Smuzhiyun uint32_t flag; 149*4882a593Smuzhiyun } stop_conn; 150*4882a593Smuzhiyun struct msg_get_stats { 151*4882a593Smuzhiyun uint32_t sid; 152*4882a593Smuzhiyun uint32_t cid; 153*4882a593Smuzhiyun } get_stats; 154*4882a593Smuzhiyun struct msg_transport_connect { 155*4882a593Smuzhiyun uint32_t non_blocking; 156*4882a593Smuzhiyun } ep_connect; 157*4882a593Smuzhiyun struct msg_transport_connect_through_host { 158*4882a593Smuzhiyun uint32_t host_no; 159*4882a593Smuzhiyun uint32_t non_blocking; 160*4882a593Smuzhiyun } ep_connect_through_host; 161*4882a593Smuzhiyun struct msg_transport_poll { 162*4882a593Smuzhiyun uint64_t ep_handle; 163*4882a593Smuzhiyun uint32_t timeout_ms; 164*4882a593Smuzhiyun } ep_poll; 165*4882a593Smuzhiyun struct msg_transport_disconnect { 166*4882a593Smuzhiyun uint64_t ep_handle; 167*4882a593Smuzhiyun } ep_disconnect; 168*4882a593Smuzhiyun struct msg_tgt_dscvr { 169*4882a593Smuzhiyun enum iscsi_tgt_dscvr type; 170*4882a593Smuzhiyun uint32_t host_no; 171*4882a593Smuzhiyun /* 172*4882a593Smuzhiyun * enable = 1 to establish a new connection 173*4882a593Smuzhiyun * with the server. enable = 0 to disconnect 174*4882a593Smuzhiyun * from the server. Used primarily to switch 175*4882a593Smuzhiyun * from one iSNS server to another. 176*4882a593Smuzhiyun */ 177*4882a593Smuzhiyun uint32_t enable; 178*4882a593Smuzhiyun } tgt_dscvr; 179*4882a593Smuzhiyun struct msg_set_host_param { 180*4882a593Smuzhiyun uint32_t host_no; 181*4882a593Smuzhiyun uint32_t param; /* enum iscsi_host_param */ 182*4882a593Smuzhiyun uint32_t len; 183*4882a593Smuzhiyun } set_host_param; 184*4882a593Smuzhiyun struct msg_set_path { 185*4882a593Smuzhiyun uint32_t host_no; 186*4882a593Smuzhiyun } set_path; 187*4882a593Smuzhiyun struct msg_set_iface_params { 188*4882a593Smuzhiyun uint32_t host_no; 189*4882a593Smuzhiyun uint32_t count; 190*4882a593Smuzhiyun } set_iface_params; 191*4882a593Smuzhiyun struct msg_iscsi_ping { 192*4882a593Smuzhiyun uint32_t host_no; 193*4882a593Smuzhiyun uint32_t iface_num; 194*4882a593Smuzhiyun uint32_t iface_type; 195*4882a593Smuzhiyun uint32_t payload_size; 196*4882a593Smuzhiyun uint32_t pid; /* unique ping id associated 197*4882a593Smuzhiyun with each ping request */ 198*4882a593Smuzhiyun } iscsi_ping; 199*4882a593Smuzhiyun struct msg_get_chap { 200*4882a593Smuzhiyun uint32_t host_no; 201*4882a593Smuzhiyun uint32_t num_entries; /* number of CHAP entries 202*4882a593Smuzhiyun * on request, number of 203*4882a593Smuzhiyun * valid CHAP entries on 204*4882a593Smuzhiyun * response */ 205*4882a593Smuzhiyun uint16_t chap_tbl_idx; 206*4882a593Smuzhiyun } get_chap; 207*4882a593Smuzhiyun struct msg_delete_chap { 208*4882a593Smuzhiyun uint32_t host_no; 209*4882a593Smuzhiyun uint16_t chap_tbl_idx; 210*4882a593Smuzhiyun } delete_chap; 211*4882a593Smuzhiyun struct msg_set_flashnode_param { 212*4882a593Smuzhiyun uint32_t host_no; 213*4882a593Smuzhiyun uint32_t flashnode_idx; 214*4882a593Smuzhiyun uint32_t count; 215*4882a593Smuzhiyun } set_flashnode; 216*4882a593Smuzhiyun struct msg_new_flashnode { 217*4882a593Smuzhiyun uint32_t host_no; 218*4882a593Smuzhiyun uint32_t len; 219*4882a593Smuzhiyun } new_flashnode; 220*4882a593Smuzhiyun struct msg_del_flashnode { 221*4882a593Smuzhiyun uint32_t host_no; 222*4882a593Smuzhiyun uint32_t flashnode_idx; 223*4882a593Smuzhiyun } del_flashnode; 224*4882a593Smuzhiyun struct msg_login_flashnode { 225*4882a593Smuzhiyun uint32_t host_no; 226*4882a593Smuzhiyun uint32_t flashnode_idx; 227*4882a593Smuzhiyun } login_flashnode; 228*4882a593Smuzhiyun struct msg_logout_flashnode { 229*4882a593Smuzhiyun uint32_t host_no; 230*4882a593Smuzhiyun uint32_t flashnode_idx; 231*4882a593Smuzhiyun } logout_flashnode; 232*4882a593Smuzhiyun struct msg_logout_flashnode_sid { 233*4882a593Smuzhiyun uint32_t host_no; 234*4882a593Smuzhiyun uint32_t sid; 235*4882a593Smuzhiyun } logout_flashnode_sid; 236*4882a593Smuzhiyun struct msg_get_host_stats { 237*4882a593Smuzhiyun uint32_t host_no; 238*4882a593Smuzhiyun } get_host_stats; 239*4882a593Smuzhiyun } u; 240*4882a593Smuzhiyun union { 241*4882a593Smuzhiyun /* messages k -> u */ 242*4882a593Smuzhiyun int retcode; 243*4882a593Smuzhiyun struct msg_create_session_ret { 244*4882a593Smuzhiyun uint32_t sid; 245*4882a593Smuzhiyun uint32_t host_no; 246*4882a593Smuzhiyun } c_session_ret; 247*4882a593Smuzhiyun struct msg_create_conn_ret { 248*4882a593Smuzhiyun uint32_t sid; 249*4882a593Smuzhiyun uint32_t cid; 250*4882a593Smuzhiyun } c_conn_ret; 251*4882a593Smuzhiyun struct msg_unbind_session { 252*4882a593Smuzhiyun uint32_t sid; 253*4882a593Smuzhiyun uint32_t host_no; 254*4882a593Smuzhiyun } unbind_session; 255*4882a593Smuzhiyun struct msg_recv_req { 256*4882a593Smuzhiyun uint32_t sid; 257*4882a593Smuzhiyun uint32_t cid; 258*4882a593Smuzhiyun uint64_t recv_handle; 259*4882a593Smuzhiyun } recv_req; 260*4882a593Smuzhiyun struct msg_conn_login { 261*4882a593Smuzhiyun uint32_t sid; 262*4882a593Smuzhiyun uint32_t cid; 263*4882a593Smuzhiyun uint32_t state; /* enum iscsi_conn_state */ 264*4882a593Smuzhiyun } conn_login; 265*4882a593Smuzhiyun struct msg_conn_error { 266*4882a593Smuzhiyun uint32_t sid; 267*4882a593Smuzhiyun uint32_t cid; 268*4882a593Smuzhiyun uint32_t error; /* enum iscsi_err */ 269*4882a593Smuzhiyun } connerror; 270*4882a593Smuzhiyun struct msg_session_destroyed { 271*4882a593Smuzhiyun uint32_t host_no; 272*4882a593Smuzhiyun uint32_t sid; 273*4882a593Smuzhiyun } d_session; 274*4882a593Smuzhiyun struct msg_transport_connect_ret { 275*4882a593Smuzhiyun uint64_t handle; 276*4882a593Smuzhiyun } ep_connect_ret; 277*4882a593Smuzhiyun struct msg_req_path { 278*4882a593Smuzhiyun uint32_t host_no; 279*4882a593Smuzhiyun } req_path; 280*4882a593Smuzhiyun struct msg_notify_if_down { 281*4882a593Smuzhiyun uint32_t host_no; 282*4882a593Smuzhiyun } notify_if_down; 283*4882a593Smuzhiyun struct msg_host_event { 284*4882a593Smuzhiyun uint32_t host_no; 285*4882a593Smuzhiyun uint32_t data_size; 286*4882a593Smuzhiyun enum iscsi_host_event_code code; 287*4882a593Smuzhiyun } host_event; 288*4882a593Smuzhiyun struct msg_ping_comp { 289*4882a593Smuzhiyun uint32_t host_no; 290*4882a593Smuzhiyun uint32_t status; /* enum 291*4882a593Smuzhiyun * iscsi_ping_status_code */ 292*4882a593Smuzhiyun uint32_t pid; /* unique ping id associated 293*4882a593Smuzhiyun with each ping request */ 294*4882a593Smuzhiyun uint32_t data_size; 295*4882a593Smuzhiyun } ping_comp; 296*4882a593Smuzhiyun struct msg_new_flashnode_ret { 297*4882a593Smuzhiyun uint32_t flashnode_idx; 298*4882a593Smuzhiyun } new_flashnode_ret; 299*4882a593Smuzhiyun } r; 300*4882a593Smuzhiyun } __attribute__ ((aligned (sizeof(uint64_t)))); 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun enum iscsi_param_type { 303*4882a593Smuzhiyun ISCSI_PARAM, /* iscsi_param (session, conn, target, LU) */ 304*4882a593Smuzhiyun ISCSI_HOST_PARAM, /* iscsi_host_param */ 305*4882a593Smuzhiyun ISCSI_NET_PARAM, /* iscsi_net_param */ 306*4882a593Smuzhiyun ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ 307*4882a593Smuzhiyun ISCSI_CHAP_PARAM, /* iscsi_chap_param */ 308*4882a593Smuzhiyun ISCSI_IFACE_PARAM, /* iscsi_iface_param */ 309*4882a593Smuzhiyun }; 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun /* structure for minimalist usecase */ 312*4882a593Smuzhiyun struct iscsi_param_info { 313*4882a593Smuzhiyun uint32_t len; /* Actual length of the param value */ 314*4882a593Smuzhiyun uint16_t param; /* iscsi param */ 315*4882a593Smuzhiyun uint8_t value[]; /* length sized value follows */ 316*4882a593Smuzhiyun } __packed; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun struct iscsi_iface_param_info { 319*4882a593Smuzhiyun uint32_t iface_num; /* iface number, 0 - n */ 320*4882a593Smuzhiyun uint32_t len; /* Actual length of the param */ 321*4882a593Smuzhiyun uint16_t param; /* iscsi param value */ 322*4882a593Smuzhiyun uint8_t iface_type; /* IPv4 or IPv6 */ 323*4882a593Smuzhiyun uint8_t param_type; /* iscsi_param_type */ 324*4882a593Smuzhiyun uint8_t value[]; /* length sized value follows */ 325*4882a593Smuzhiyun } __packed; 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun /* 328*4882a593Smuzhiyun * To keep the struct iscsi_uevent size the same for userspace code 329*4882a593Smuzhiyun * compatibility, the main structure for ISCSI_UEVENT_PATH_UPDATE and 330*4882a593Smuzhiyun * ISCSI_KEVENT_PATH_REQ is defined separately and comes after the 331*4882a593Smuzhiyun * struct iscsi_uevent in the NETLINK_ISCSI message. 332*4882a593Smuzhiyun */ 333*4882a593Smuzhiyun struct iscsi_path { 334*4882a593Smuzhiyun uint64_t handle; 335*4882a593Smuzhiyun uint8_t mac_addr[6]; 336*4882a593Smuzhiyun uint8_t mac_addr_old[6]; 337*4882a593Smuzhiyun uint32_t ip_addr_len; /* 4 or 16 */ 338*4882a593Smuzhiyun union { 339*4882a593Smuzhiyun struct in_addr v4_addr; 340*4882a593Smuzhiyun struct in6_addr v6_addr; 341*4882a593Smuzhiyun } src; 342*4882a593Smuzhiyun union { 343*4882a593Smuzhiyun struct in_addr v4_addr; 344*4882a593Smuzhiyun struct in6_addr v6_addr; 345*4882a593Smuzhiyun } dst; 346*4882a593Smuzhiyun uint16_t vlan_id; 347*4882a593Smuzhiyun uint16_t pmtu; 348*4882a593Smuzhiyun } __attribute__ ((aligned (sizeof(uint64_t)))); 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* iscsi iface enabled/disabled setting */ 351*4882a593Smuzhiyun #define ISCSI_IFACE_DISABLE 0x01 352*4882a593Smuzhiyun #define ISCSI_IFACE_ENABLE 0x02 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* ipv4 bootproto */ 355*4882a593Smuzhiyun #define ISCSI_BOOTPROTO_STATIC 0x01 356*4882a593Smuzhiyun #define ISCSI_BOOTPROTO_DHCP 0x02 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /* ipv6 addr autoconfig type */ 359*4882a593Smuzhiyun #define ISCSI_IPV6_AUTOCFG_DISABLE 0x01 360*4882a593Smuzhiyun #define ISCSI_IPV6_AUTOCFG_ND_ENABLE 0x02 361*4882a593Smuzhiyun #define ISCSI_IPV6_AUTOCFG_DHCPV6_ENABLE 0x03 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun /* ipv6 link local addr type */ 364*4882a593Smuzhiyun #define ISCSI_IPV6_LINKLOCAL_AUTOCFG_ENABLE 0x01 365*4882a593Smuzhiyun #define ISCSI_IPV6_LINKLOCAL_AUTOCFG_DISABLE 0x02 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /* ipv6 router addr type */ 368*4882a593Smuzhiyun #define ISCSI_IPV6_ROUTER_AUTOCFG_ENABLE 0x01 369*4882a593Smuzhiyun #define ISCSI_IPV6_ROUTER_AUTOCFG_DISABLE 0x02 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define ISCSI_IFACE_TYPE_IPV4 0x01 372*4882a593Smuzhiyun #define ISCSI_IFACE_TYPE_IPV6 0x02 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun #define ISCSI_MAX_VLAN_ID 4095 375*4882a593Smuzhiyun #define ISCSI_MAX_VLAN_PRIORITY 7 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun /* iscsi vlan enable/disabled setting */ 378*4882a593Smuzhiyun #define ISCSI_VLAN_DISABLE 0x01 379*4882a593Smuzhiyun #define ISCSI_VLAN_ENABLE 0x02 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* iscsi generic enable/disabled setting for various features */ 382*4882a593Smuzhiyun #define ISCSI_NET_PARAM_DISABLE 0x01 383*4882a593Smuzhiyun #define ISCSI_NET_PARAM_ENABLE 0x02 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun /* iSCSI network params */ 386*4882a593Smuzhiyun enum iscsi_net_param { 387*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_ADDR = 1, 388*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_SUBNET, 389*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_GW, 390*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_BOOTPROTO, 391*4882a593Smuzhiyun ISCSI_NET_PARAM_MAC, 392*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_LINKLOCAL, 393*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ADDR, 394*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ROUTER, 395*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG, 396*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG, 397*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG, 398*4882a593Smuzhiyun ISCSI_NET_PARAM_IFACE_ENABLE, 399*4882a593Smuzhiyun ISCSI_NET_PARAM_VLAN_ID, 400*4882a593Smuzhiyun ISCSI_NET_PARAM_VLAN_PRIORITY, 401*4882a593Smuzhiyun ISCSI_NET_PARAM_VLAN_ENABLED, 402*4882a593Smuzhiyun ISCSI_NET_PARAM_VLAN_TAG, 403*4882a593Smuzhiyun ISCSI_NET_PARAM_IFACE_TYPE, 404*4882a593Smuzhiyun ISCSI_NET_PARAM_IFACE_NAME, 405*4882a593Smuzhiyun ISCSI_NET_PARAM_MTU, 406*4882a593Smuzhiyun ISCSI_NET_PARAM_PORT, 407*4882a593Smuzhiyun ISCSI_NET_PARAM_IPADDR_STATE, 408*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE, 409*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ROUTER_STATE, 410*4882a593Smuzhiyun ISCSI_NET_PARAM_DELAYED_ACK_EN, 411*4882a593Smuzhiyun ISCSI_NET_PARAM_TCP_NAGLE_DISABLE, 412*4882a593Smuzhiyun ISCSI_NET_PARAM_TCP_WSF_DISABLE, 413*4882a593Smuzhiyun ISCSI_NET_PARAM_TCP_WSF, 414*4882a593Smuzhiyun ISCSI_NET_PARAM_TCP_TIMER_SCALE, 415*4882a593Smuzhiyun ISCSI_NET_PARAM_TCP_TIMESTAMP_EN, 416*4882a593Smuzhiyun ISCSI_NET_PARAM_CACHE_ID, 417*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN, 418*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN, 419*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_TOS_EN, 420*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_TOS, 421*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN, 422*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN, 423*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID, 424*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN, 425*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN, 426*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID, 427*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN, 428*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE, 429*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN, 430*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV4_TTL, 431*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN, 432*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_MLD_EN, 433*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_FLOW_LABEL, 434*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS, 435*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_HOP_LIMIT, 436*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO, 437*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME, 438*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_ND_STALE_TMO, 439*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT, 440*4882a593Smuzhiyun ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU, 441*4882a593Smuzhiyun ISCSI_NET_PARAM_REDIRECT_EN, 442*4882a593Smuzhiyun }; 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun enum iscsi_ipaddress_state { 445*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_UNCONFIGURED, 446*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_ACQUIRING, 447*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_TENTATIVE, 448*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_VALID, 449*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_DISABLING, 450*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_INVALID, 451*4882a593Smuzhiyun ISCSI_IPDDRESS_STATE_DEPRECATED, 452*4882a593Smuzhiyun }; 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun enum iscsi_router_state { 455*4882a593Smuzhiyun ISCSI_ROUTER_STATE_UNKNOWN, 456*4882a593Smuzhiyun ISCSI_ROUTER_STATE_ADVERTISED, 457*4882a593Smuzhiyun ISCSI_ROUTER_STATE_MANUAL, 458*4882a593Smuzhiyun ISCSI_ROUTER_STATE_STALE, 459*4882a593Smuzhiyun }; 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun /* iSCSI specific settings params for iface */ 462*4882a593Smuzhiyun enum iscsi_iface_param { 463*4882a593Smuzhiyun ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO, 464*4882a593Smuzhiyun ISCSI_IFACE_PARAM_HDRDGST_EN, 465*4882a593Smuzhiyun ISCSI_IFACE_PARAM_DATADGST_EN, 466*4882a593Smuzhiyun ISCSI_IFACE_PARAM_IMM_DATA_EN, 467*4882a593Smuzhiyun ISCSI_IFACE_PARAM_INITIAL_R2T_EN, 468*4882a593Smuzhiyun ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN, 469*4882a593Smuzhiyun ISCSI_IFACE_PARAM_PDU_INORDER_EN, 470*4882a593Smuzhiyun ISCSI_IFACE_PARAM_ERL, 471*4882a593Smuzhiyun ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH, 472*4882a593Smuzhiyun ISCSI_IFACE_PARAM_FIRST_BURST, 473*4882a593Smuzhiyun ISCSI_IFACE_PARAM_MAX_R2T, 474*4882a593Smuzhiyun ISCSI_IFACE_PARAM_MAX_BURST, 475*4882a593Smuzhiyun ISCSI_IFACE_PARAM_CHAP_AUTH_EN, 476*4882a593Smuzhiyun ISCSI_IFACE_PARAM_BIDI_CHAP_EN, 477*4882a593Smuzhiyun ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL, 478*4882a593Smuzhiyun ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN, 479*4882a593Smuzhiyun ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN, 480*4882a593Smuzhiyun ISCSI_IFACE_PARAM_INITIATOR_NAME, 481*4882a593Smuzhiyun }; 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun enum iscsi_conn_state { 484*4882a593Smuzhiyun ISCSI_CONN_STATE_FREE, 485*4882a593Smuzhiyun ISCSI_CONN_STATE_XPT_WAIT, 486*4882a593Smuzhiyun ISCSI_CONN_STATE_IN_LOGIN, 487*4882a593Smuzhiyun ISCSI_CONN_STATE_LOGGED_IN, 488*4882a593Smuzhiyun ISCSI_CONN_STATE_IN_LOGOUT, 489*4882a593Smuzhiyun ISCSI_CONN_STATE_LOGOUT_REQUESTED, 490*4882a593Smuzhiyun ISCSI_CONN_STATE_CLEANUP_WAIT, 491*4882a593Smuzhiyun }; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* 494*4882a593Smuzhiyun * Common error codes 495*4882a593Smuzhiyun */ 496*4882a593Smuzhiyun enum iscsi_err { 497*4882a593Smuzhiyun ISCSI_OK = 0, 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun ISCSI_ERR_DATASN = ISCSI_ERR_BASE + 1, 500*4882a593Smuzhiyun ISCSI_ERR_DATA_OFFSET = ISCSI_ERR_BASE + 2, 501*4882a593Smuzhiyun ISCSI_ERR_MAX_CMDSN = ISCSI_ERR_BASE + 3, 502*4882a593Smuzhiyun ISCSI_ERR_EXP_CMDSN = ISCSI_ERR_BASE + 4, 503*4882a593Smuzhiyun ISCSI_ERR_BAD_OPCODE = ISCSI_ERR_BASE + 5, 504*4882a593Smuzhiyun ISCSI_ERR_DATALEN = ISCSI_ERR_BASE + 6, 505*4882a593Smuzhiyun ISCSI_ERR_AHSLEN = ISCSI_ERR_BASE + 7, 506*4882a593Smuzhiyun ISCSI_ERR_PROTO = ISCSI_ERR_BASE + 8, 507*4882a593Smuzhiyun ISCSI_ERR_LUN = ISCSI_ERR_BASE + 9, 508*4882a593Smuzhiyun ISCSI_ERR_BAD_ITT = ISCSI_ERR_BASE + 10, 509*4882a593Smuzhiyun ISCSI_ERR_CONN_FAILED = ISCSI_ERR_BASE + 11, 510*4882a593Smuzhiyun ISCSI_ERR_R2TSN = ISCSI_ERR_BASE + 12, 511*4882a593Smuzhiyun ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13, 512*4882a593Smuzhiyun ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14, 513*4882a593Smuzhiyun ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15, 514*4882a593Smuzhiyun ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16, 515*4882a593Smuzhiyun ISCSI_ERR_NO_SCSI_CMD = ISCSI_ERR_BASE + 17, 516*4882a593Smuzhiyun ISCSI_ERR_INVALID_HOST = ISCSI_ERR_BASE + 18, 517*4882a593Smuzhiyun ISCSI_ERR_XMIT_FAILED = ISCSI_ERR_BASE + 19, 518*4882a593Smuzhiyun ISCSI_ERR_TCP_CONN_CLOSE = ISCSI_ERR_BASE + 20, 519*4882a593Smuzhiyun ISCSI_ERR_SCSI_EH_SESSION_RST = ISCSI_ERR_BASE + 21, 520*4882a593Smuzhiyun ISCSI_ERR_NOP_TIMEDOUT = ISCSI_ERR_BASE + 22, 521*4882a593Smuzhiyun }; 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun /* 524*4882a593Smuzhiyun * iSCSI Parameters (RFC3720) 525*4882a593Smuzhiyun */ 526*4882a593Smuzhiyun enum iscsi_param { 527*4882a593Smuzhiyun /* passed in using netlink set param */ 528*4882a593Smuzhiyun ISCSI_PARAM_MAX_RECV_DLENGTH, 529*4882a593Smuzhiyun ISCSI_PARAM_MAX_XMIT_DLENGTH, 530*4882a593Smuzhiyun ISCSI_PARAM_HDRDGST_EN, 531*4882a593Smuzhiyun ISCSI_PARAM_DATADGST_EN, 532*4882a593Smuzhiyun ISCSI_PARAM_INITIAL_R2T_EN, 533*4882a593Smuzhiyun ISCSI_PARAM_MAX_R2T, 534*4882a593Smuzhiyun ISCSI_PARAM_IMM_DATA_EN, 535*4882a593Smuzhiyun ISCSI_PARAM_FIRST_BURST, 536*4882a593Smuzhiyun ISCSI_PARAM_MAX_BURST, 537*4882a593Smuzhiyun ISCSI_PARAM_PDU_INORDER_EN, 538*4882a593Smuzhiyun ISCSI_PARAM_DATASEQ_INORDER_EN, 539*4882a593Smuzhiyun ISCSI_PARAM_ERL, 540*4882a593Smuzhiyun ISCSI_PARAM_IFMARKER_EN, 541*4882a593Smuzhiyun ISCSI_PARAM_OFMARKER_EN, 542*4882a593Smuzhiyun ISCSI_PARAM_EXP_STATSN, 543*4882a593Smuzhiyun ISCSI_PARAM_TARGET_NAME, 544*4882a593Smuzhiyun ISCSI_PARAM_TPGT, 545*4882a593Smuzhiyun ISCSI_PARAM_PERSISTENT_ADDRESS, 546*4882a593Smuzhiyun ISCSI_PARAM_PERSISTENT_PORT, 547*4882a593Smuzhiyun ISCSI_PARAM_SESS_RECOVERY_TMO, 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun /* passed in through bind conn using transport_fd */ 550*4882a593Smuzhiyun ISCSI_PARAM_CONN_PORT, 551*4882a593Smuzhiyun ISCSI_PARAM_CONN_ADDRESS, 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun ISCSI_PARAM_USERNAME, 554*4882a593Smuzhiyun ISCSI_PARAM_USERNAME_IN, 555*4882a593Smuzhiyun ISCSI_PARAM_PASSWORD, 556*4882a593Smuzhiyun ISCSI_PARAM_PASSWORD_IN, 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun ISCSI_PARAM_FAST_ABORT, 559*4882a593Smuzhiyun ISCSI_PARAM_ABORT_TMO, 560*4882a593Smuzhiyun ISCSI_PARAM_LU_RESET_TMO, 561*4882a593Smuzhiyun ISCSI_PARAM_HOST_RESET_TMO, 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun ISCSI_PARAM_PING_TMO, 564*4882a593Smuzhiyun ISCSI_PARAM_RECV_TMO, 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun ISCSI_PARAM_IFACE_NAME, 567*4882a593Smuzhiyun ISCSI_PARAM_ISID, 568*4882a593Smuzhiyun ISCSI_PARAM_INITIATOR_NAME, 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun ISCSI_PARAM_TGT_RESET_TMO, 571*4882a593Smuzhiyun ISCSI_PARAM_TARGET_ALIAS, 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun ISCSI_PARAM_CHAP_IN_IDX, 574*4882a593Smuzhiyun ISCSI_PARAM_CHAP_OUT_IDX, 575*4882a593Smuzhiyun 576*4882a593Smuzhiyun ISCSI_PARAM_BOOT_ROOT, 577*4882a593Smuzhiyun ISCSI_PARAM_BOOT_NIC, 578*4882a593Smuzhiyun ISCSI_PARAM_BOOT_TARGET, 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun ISCSI_PARAM_AUTO_SND_TGT_DISABLE, 581*4882a593Smuzhiyun ISCSI_PARAM_DISCOVERY_SESS, 582*4882a593Smuzhiyun ISCSI_PARAM_PORTAL_TYPE, 583*4882a593Smuzhiyun ISCSI_PARAM_CHAP_AUTH_EN, 584*4882a593Smuzhiyun ISCSI_PARAM_DISCOVERY_LOGOUT_EN, 585*4882a593Smuzhiyun ISCSI_PARAM_BIDI_CHAP_EN, 586*4882a593Smuzhiyun ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL, 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun ISCSI_PARAM_DEF_TIME2WAIT, 589*4882a593Smuzhiyun ISCSI_PARAM_DEF_TIME2RETAIN, 590*4882a593Smuzhiyun ISCSI_PARAM_MAX_SEGMENT_SIZE, 591*4882a593Smuzhiyun ISCSI_PARAM_STATSN, 592*4882a593Smuzhiyun ISCSI_PARAM_KEEPALIVE_TMO, 593*4882a593Smuzhiyun ISCSI_PARAM_LOCAL_PORT, 594*4882a593Smuzhiyun ISCSI_PARAM_TSID, 595*4882a593Smuzhiyun ISCSI_PARAM_DEF_TASKMGMT_TMO, 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun ISCSI_PARAM_TCP_TIMESTAMP_STAT, 598*4882a593Smuzhiyun ISCSI_PARAM_TCP_WSF_DISABLE, 599*4882a593Smuzhiyun ISCSI_PARAM_TCP_NAGLE_DISABLE, 600*4882a593Smuzhiyun ISCSI_PARAM_TCP_TIMER_SCALE, 601*4882a593Smuzhiyun ISCSI_PARAM_TCP_TIMESTAMP_EN, 602*4882a593Smuzhiyun ISCSI_PARAM_TCP_XMIT_WSF, 603*4882a593Smuzhiyun ISCSI_PARAM_TCP_RECV_WSF, 604*4882a593Smuzhiyun ISCSI_PARAM_IP_FRAGMENT_DISABLE, 605*4882a593Smuzhiyun ISCSI_PARAM_IPV4_TOS, 606*4882a593Smuzhiyun ISCSI_PARAM_IPV6_TC, 607*4882a593Smuzhiyun ISCSI_PARAM_IPV6_FLOW_LABEL, 608*4882a593Smuzhiyun ISCSI_PARAM_IS_FW_ASSIGNED_IPV6, 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun ISCSI_PARAM_DISCOVERY_PARENT_IDX, 611*4882a593Smuzhiyun ISCSI_PARAM_DISCOVERY_PARENT_TYPE, 612*4882a593Smuzhiyun ISCSI_PARAM_LOCAL_IPADDR, 613*4882a593Smuzhiyun /* must always be last */ 614*4882a593Smuzhiyun ISCSI_PARAM_MAX, 615*4882a593Smuzhiyun }; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun /* iSCSI HBA params */ 618*4882a593Smuzhiyun enum iscsi_host_param { 619*4882a593Smuzhiyun ISCSI_HOST_PARAM_HWADDRESS, 620*4882a593Smuzhiyun ISCSI_HOST_PARAM_INITIATOR_NAME, 621*4882a593Smuzhiyun ISCSI_HOST_PARAM_NETDEV_NAME, 622*4882a593Smuzhiyun ISCSI_HOST_PARAM_IPADDRESS, 623*4882a593Smuzhiyun ISCSI_HOST_PARAM_PORT_STATE, 624*4882a593Smuzhiyun ISCSI_HOST_PARAM_PORT_SPEED, 625*4882a593Smuzhiyun ISCSI_HOST_PARAM_MAX, 626*4882a593Smuzhiyun }; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun /* portal type */ 629*4882a593Smuzhiyun #define PORTAL_TYPE_IPV4 "ipv4" 630*4882a593Smuzhiyun #define PORTAL_TYPE_IPV6 "ipv6" 631*4882a593Smuzhiyun 632*4882a593Smuzhiyun /* iSCSI Flash Target params */ 633*4882a593Smuzhiyun enum iscsi_flashnode_param { 634*4882a593Smuzhiyun ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6, 635*4882a593Smuzhiyun ISCSI_FLASHNODE_PORTAL_TYPE, 636*4882a593Smuzhiyun ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE, 637*4882a593Smuzhiyun ISCSI_FLASHNODE_DISCOVERY_SESS, 638*4882a593Smuzhiyun ISCSI_FLASHNODE_ENTRY_EN, 639*4882a593Smuzhiyun ISCSI_FLASHNODE_HDR_DGST_EN, 640*4882a593Smuzhiyun ISCSI_FLASHNODE_DATA_DGST_EN, 641*4882a593Smuzhiyun ISCSI_FLASHNODE_IMM_DATA_EN, 642*4882a593Smuzhiyun ISCSI_FLASHNODE_INITIAL_R2T_EN, 643*4882a593Smuzhiyun ISCSI_FLASHNODE_DATASEQ_INORDER, 644*4882a593Smuzhiyun ISCSI_FLASHNODE_PDU_INORDER, 645*4882a593Smuzhiyun ISCSI_FLASHNODE_CHAP_AUTH_EN, 646*4882a593Smuzhiyun ISCSI_FLASHNODE_SNACK_REQ_EN, 647*4882a593Smuzhiyun ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN, 648*4882a593Smuzhiyun ISCSI_FLASHNODE_BIDI_CHAP_EN, 649*4882a593Smuzhiyun /* make authentication for discovery sessions optional */ 650*4882a593Smuzhiyun ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL, 651*4882a593Smuzhiyun ISCSI_FLASHNODE_ERL, 652*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT, 653*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_NAGLE_DISABLE, 654*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_WSF_DISABLE, 655*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_TIMER_SCALE, 656*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_TIMESTAMP_EN, 657*4882a593Smuzhiyun ISCSI_FLASHNODE_IP_FRAG_DISABLE, 658*4882a593Smuzhiyun ISCSI_FLASHNODE_MAX_RECV_DLENGTH, 659*4882a593Smuzhiyun ISCSI_FLASHNODE_MAX_XMIT_DLENGTH, 660*4882a593Smuzhiyun ISCSI_FLASHNODE_FIRST_BURST, 661*4882a593Smuzhiyun ISCSI_FLASHNODE_DEF_TIME2WAIT, 662*4882a593Smuzhiyun ISCSI_FLASHNODE_DEF_TIME2RETAIN, 663*4882a593Smuzhiyun ISCSI_FLASHNODE_MAX_R2T, 664*4882a593Smuzhiyun ISCSI_FLASHNODE_KEEPALIVE_TMO, 665*4882a593Smuzhiyun ISCSI_FLASHNODE_ISID, 666*4882a593Smuzhiyun ISCSI_FLASHNODE_TSID, 667*4882a593Smuzhiyun ISCSI_FLASHNODE_PORT, 668*4882a593Smuzhiyun ISCSI_FLASHNODE_MAX_BURST, 669*4882a593Smuzhiyun ISCSI_FLASHNODE_DEF_TASKMGMT_TMO, 670*4882a593Smuzhiyun ISCSI_FLASHNODE_IPADDR, 671*4882a593Smuzhiyun ISCSI_FLASHNODE_ALIAS, 672*4882a593Smuzhiyun ISCSI_FLASHNODE_REDIRECT_IPADDR, 673*4882a593Smuzhiyun ISCSI_FLASHNODE_MAX_SEGMENT_SIZE, 674*4882a593Smuzhiyun ISCSI_FLASHNODE_LOCAL_PORT, 675*4882a593Smuzhiyun ISCSI_FLASHNODE_IPV4_TOS, 676*4882a593Smuzhiyun ISCSI_FLASHNODE_IPV6_TC, 677*4882a593Smuzhiyun ISCSI_FLASHNODE_IPV6_FLOW_LABEL, 678*4882a593Smuzhiyun ISCSI_FLASHNODE_NAME, 679*4882a593Smuzhiyun ISCSI_FLASHNODE_TPGT, 680*4882a593Smuzhiyun ISCSI_FLASHNODE_LINK_LOCAL_IPV6, 681*4882a593Smuzhiyun ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX, 682*4882a593Smuzhiyun ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE, 683*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_XMIT_WSF, 684*4882a593Smuzhiyun ISCSI_FLASHNODE_TCP_RECV_WSF, 685*4882a593Smuzhiyun ISCSI_FLASHNODE_CHAP_IN_IDX, 686*4882a593Smuzhiyun ISCSI_FLASHNODE_CHAP_OUT_IDX, 687*4882a593Smuzhiyun ISCSI_FLASHNODE_USERNAME, 688*4882a593Smuzhiyun ISCSI_FLASHNODE_USERNAME_IN, 689*4882a593Smuzhiyun ISCSI_FLASHNODE_PASSWORD, 690*4882a593Smuzhiyun ISCSI_FLASHNODE_PASSWORD_IN, 691*4882a593Smuzhiyun ISCSI_FLASHNODE_STATSN, 692*4882a593Smuzhiyun ISCSI_FLASHNODE_EXP_STATSN, 693*4882a593Smuzhiyun ISCSI_FLASHNODE_IS_BOOT_TGT, 694*4882a593Smuzhiyun 695*4882a593Smuzhiyun ISCSI_FLASHNODE_MAX, 696*4882a593Smuzhiyun }; 697*4882a593Smuzhiyun 698*4882a593Smuzhiyun struct iscsi_flashnode_param_info { 699*4882a593Smuzhiyun uint32_t len; /* Actual length of the param */ 700*4882a593Smuzhiyun uint16_t param; /* iscsi param value */ 701*4882a593Smuzhiyun uint8_t value[]; /* length sized value follows */ 702*4882a593Smuzhiyun } __packed; 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun enum iscsi_discovery_parent_type { 705*4882a593Smuzhiyun ISCSI_DISC_PARENT_UNKNOWN = 0x1, 706*4882a593Smuzhiyun ISCSI_DISC_PARENT_SENDTGT = 0x2, 707*4882a593Smuzhiyun ISCSI_DISC_PARENT_ISNS = 0x3, 708*4882a593Smuzhiyun }; 709*4882a593Smuzhiyun 710*4882a593Smuzhiyun /* iSCSI port Speed */ 711*4882a593Smuzhiyun enum iscsi_port_speed { 712*4882a593Smuzhiyun ISCSI_PORT_SPEED_UNKNOWN = 0x1, 713*4882a593Smuzhiyun ISCSI_PORT_SPEED_10MBPS = 0x2, 714*4882a593Smuzhiyun ISCSI_PORT_SPEED_100MBPS = 0x4, 715*4882a593Smuzhiyun ISCSI_PORT_SPEED_1GBPS = 0x8, 716*4882a593Smuzhiyun ISCSI_PORT_SPEED_10GBPS = 0x10, 717*4882a593Smuzhiyun ISCSI_PORT_SPEED_25GBPS = 0x20, 718*4882a593Smuzhiyun ISCSI_PORT_SPEED_40GBPS = 0x40, 719*4882a593Smuzhiyun }; 720*4882a593Smuzhiyun 721*4882a593Smuzhiyun /* iSCSI port state */ 722*4882a593Smuzhiyun enum iscsi_port_state { 723*4882a593Smuzhiyun ISCSI_PORT_STATE_DOWN = 0x1, 724*4882a593Smuzhiyun ISCSI_PORT_STATE_UP = 0x2, 725*4882a593Smuzhiyun }; 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun /* iSCSI PING status/error code */ 728*4882a593Smuzhiyun enum iscsi_ping_status_code { 729*4882a593Smuzhiyun ISCSI_PING_SUCCESS = 0, 730*4882a593Smuzhiyun ISCSI_PING_FW_DISABLED = 0x1, 731*4882a593Smuzhiyun ISCSI_PING_IPADDR_INVALID = 0x2, 732*4882a593Smuzhiyun ISCSI_PING_LINKLOCAL_IPV6_ADDR_INVALID = 0x3, 733*4882a593Smuzhiyun ISCSI_PING_TIMEOUT = 0x4, 734*4882a593Smuzhiyun ISCSI_PING_INVALID_DEST_ADDR = 0x5, 735*4882a593Smuzhiyun ISCSI_PING_OVERSIZE_PACKET = 0x6, 736*4882a593Smuzhiyun ISCSI_PING_ICMP_ERROR = 0x7, 737*4882a593Smuzhiyun ISCSI_PING_MAX_REQ_EXCEEDED = 0x8, 738*4882a593Smuzhiyun ISCSI_PING_NO_ARP_RECEIVED = 0x9, 739*4882a593Smuzhiyun }; 740*4882a593Smuzhiyun 741*4882a593Smuzhiyun #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) 742*4882a593Smuzhiyun #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) 743*4882a593Smuzhiyun 744*4882a593Smuzhiyun /* 745*4882a593Smuzhiyun * These flags presents iSCSI Data-Path capabilities. 746*4882a593Smuzhiyun */ 747*4882a593Smuzhiyun #define CAP_RECOVERY_L0 0x1 748*4882a593Smuzhiyun #define CAP_RECOVERY_L1 0x2 749*4882a593Smuzhiyun #define CAP_RECOVERY_L2 0x4 750*4882a593Smuzhiyun #define CAP_MULTI_R2T 0x8 751*4882a593Smuzhiyun #define CAP_HDRDGST 0x10 752*4882a593Smuzhiyun #define CAP_DATADGST 0x20 753*4882a593Smuzhiyun #define CAP_MULTI_CONN 0x40 754*4882a593Smuzhiyun #define CAP_TEXT_NEGO 0x80 755*4882a593Smuzhiyun #define CAP_MARKERS 0x100 756*4882a593Smuzhiyun #define CAP_FW_DB 0x200 757*4882a593Smuzhiyun #define CAP_SENDTARGETS_OFFLOAD 0x400 /* offload discovery process */ 758*4882a593Smuzhiyun #define CAP_DATA_PATH_OFFLOAD 0x800 /* offload entire IO path */ 759*4882a593Smuzhiyun #define CAP_DIGEST_OFFLOAD 0x1000 /* offload hdr and data digests */ 760*4882a593Smuzhiyun #define CAP_PADDING_OFFLOAD 0x2000 /* offload padding insertion, removal, 761*4882a593Smuzhiyun and verification */ 762*4882a593Smuzhiyun #define CAP_LOGIN_OFFLOAD 0x4000 /* offload session login */ 763*4882a593Smuzhiyun 764*4882a593Smuzhiyun /* 765*4882a593Smuzhiyun * These flags describes reason of stop_conn() call 766*4882a593Smuzhiyun */ 767*4882a593Smuzhiyun #define STOP_CONN_TERM 0x1 768*4882a593Smuzhiyun #define STOP_CONN_SUSPEND 0x2 769*4882a593Smuzhiyun #define STOP_CONN_RECOVER 0x3 770*4882a593Smuzhiyun 771*4882a593Smuzhiyun #define ISCSI_STATS_CUSTOM_MAX 32 772*4882a593Smuzhiyun #define ISCSI_STATS_CUSTOM_DESC_MAX 64 773*4882a593Smuzhiyun struct iscsi_stats_custom { 774*4882a593Smuzhiyun char desc[ISCSI_STATS_CUSTOM_DESC_MAX]; 775*4882a593Smuzhiyun uint64_t value; 776*4882a593Smuzhiyun }; 777*4882a593Smuzhiyun 778*4882a593Smuzhiyun /* 779*4882a593Smuzhiyun * struct iscsi_stats - iSCSI Statistics (iSCSI MIB) 780*4882a593Smuzhiyun * 781*4882a593Smuzhiyun * Note: this structure contains counters collected on per-connection basis. 782*4882a593Smuzhiyun */ 783*4882a593Smuzhiyun struct iscsi_stats { 784*4882a593Smuzhiyun /* octets */ 785*4882a593Smuzhiyun uint64_t txdata_octets; 786*4882a593Smuzhiyun uint64_t rxdata_octets; 787*4882a593Smuzhiyun 788*4882a593Smuzhiyun /* xmit pdus */ 789*4882a593Smuzhiyun uint32_t noptx_pdus; 790*4882a593Smuzhiyun uint32_t scsicmd_pdus; 791*4882a593Smuzhiyun uint32_t tmfcmd_pdus; 792*4882a593Smuzhiyun uint32_t login_pdus; 793*4882a593Smuzhiyun uint32_t text_pdus; 794*4882a593Smuzhiyun uint32_t dataout_pdus; 795*4882a593Smuzhiyun uint32_t logout_pdus; 796*4882a593Smuzhiyun uint32_t snack_pdus; 797*4882a593Smuzhiyun 798*4882a593Smuzhiyun /* recv pdus */ 799*4882a593Smuzhiyun uint32_t noprx_pdus; 800*4882a593Smuzhiyun uint32_t scsirsp_pdus; 801*4882a593Smuzhiyun uint32_t tmfrsp_pdus; 802*4882a593Smuzhiyun uint32_t textrsp_pdus; 803*4882a593Smuzhiyun uint32_t datain_pdus; 804*4882a593Smuzhiyun uint32_t logoutrsp_pdus; 805*4882a593Smuzhiyun uint32_t r2t_pdus; 806*4882a593Smuzhiyun uint32_t async_pdus; 807*4882a593Smuzhiyun uint32_t rjt_pdus; 808*4882a593Smuzhiyun 809*4882a593Smuzhiyun /* errors */ 810*4882a593Smuzhiyun uint32_t digest_err; 811*4882a593Smuzhiyun uint32_t timeout_err; 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun /* 814*4882a593Smuzhiyun * iSCSI Custom Statistics support, i.e. Transport could 815*4882a593Smuzhiyun * extend existing MIB statistics with its own specific statistics 816*4882a593Smuzhiyun * up to ISCSI_STATS_CUSTOM_MAX 817*4882a593Smuzhiyun */ 818*4882a593Smuzhiyun uint32_t custom_length; 819*4882a593Smuzhiyun struct iscsi_stats_custom custom[] 820*4882a593Smuzhiyun __attribute__ ((aligned (sizeof(uint64_t)))); 821*4882a593Smuzhiyun }; 822*4882a593Smuzhiyun 823*4882a593Smuzhiyun enum chap_type_e { 824*4882a593Smuzhiyun CHAP_TYPE_OUT, 825*4882a593Smuzhiyun CHAP_TYPE_IN, 826*4882a593Smuzhiyun }; 827*4882a593Smuzhiyun 828*4882a593Smuzhiyun enum iscsi_chap_param { 829*4882a593Smuzhiyun ISCSI_CHAP_PARAM_INDEX, 830*4882a593Smuzhiyun ISCSI_CHAP_PARAM_CHAP_TYPE, 831*4882a593Smuzhiyun ISCSI_CHAP_PARAM_USERNAME, 832*4882a593Smuzhiyun ISCSI_CHAP_PARAM_PASSWORD, 833*4882a593Smuzhiyun ISCSI_CHAP_PARAM_PASSWORD_LEN 834*4882a593Smuzhiyun }; 835*4882a593Smuzhiyun 836*4882a593Smuzhiyun #define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256 837*4882a593Smuzhiyun #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256 838*4882a593Smuzhiyun struct iscsi_chap_rec { 839*4882a593Smuzhiyun uint16_t chap_tbl_idx; 840*4882a593Smuzhiyun enum chap_type_e chap_type; 841*4882a593Smuzhiyun char username[ISCSI_CHAP_AUTH_NAME_MAX_LEN]; 842*4882a593Smuzhiyun uint8_t password[ISCSI_CHAP_AUTH_SECRET_MAX_LEN]; 843*4882a593Smuzhiyun uint8_t password_length; 844*4882a593Smuzhiyun }; 845*4882a593Smuzhiyun 846*4882a593Smuzhiyun #define ISCSI_HOST_STATS_CUSTOM_MAX 32 847*4882a593Smuzhiyun #define ISCSI_HOST_STATS_CUSTOM_DESC_MAX 64 848*4882a593Smuzhiyun struct iscsi_host_stats_custom { 849*4882a593Smuzhiyun char desc[ISCSI_HOST_STATS_CUSTOM_DESC_MAX]; 850*4882a593Smuzhiyun uint64_t value; 851*4882a593Smuzhiyun }; 852*4882a593Smuzhiyun 853*4882a593Smuzhiyun /* struct iscsi_offload_host_stats: Host statistics, 854*4882a593Smuzhiyun * Include statistics for MAC, IP, TCP & iSCSI. 855*4882a593Smuzhiyun */ 856*4882a593Smuzhiyun struct iscsi_offload_host_stats { 857*4882a593Smuzhiyun /* MAC */ 858*4882a593Smuzhiyun uint64_t mactx_frames; 859*4882a593Smuzhiyun uint64_t mactx_bytes; 860*4882a593Smuzhiyun uint64_t mactx_multicast_frames; 861*4882a593Smuzhiyun uint64_t mactx_broadcast_frames; 862*4882a593Smuzhiyun uint64_t mactx_pause_frames; 863*4882a593Smuzhiyun uint64_t mactx_control_frames; 864*4882a593Smuzhiyun uint64_t mactx_deferral; 865*4882a593Smuzhiyun uint64_t mactx_excess_deferral; 866*4882a593Smuzhiyun uint64_t mactx_late_collision; 867*4882a593Smuzhiyun uint64_t mactx_abort; 868*4882a593Smuzhiyun uint64_t mactx_single_collision; 869*4882a593Smuzhiyun uint64_t mactx_multiple_collision; 870*4882a593Smuzhiyun uint64_t mactx_collision; 871*4882a593Smuzhiyun uint64_t mactx_frames_dropped; 872*4882a593Smuzhiyun uint64_t mactx_jumbo_frames; 873*4882a593Smuzhiyun uint64_t macrx_frames; 874*4882a593Smuzhiyun uint64_t macrx_bytes; 875*4882a593Smuzhiyun uint64_t macrx_unknown_control_frames; 876*4882a593Smuzhiyun uint64_t macrx_pause_frames; 877*4882a593Smuzhiyun uint64_t macrx_control_frames; 878*4882a593Smuzhiyun uint64_t macrx_dribble; 879*4882a593Smuzhiyun uint64_t macrx_frame_length_error; 880*4882a593Smuzhiyun uint64_t macrx_jabber; 881*4882a593Smuzhiyun uint64_t macrx_carrier_sense_error; 882*4882a593Smuzhiyun uint64_t macrx_frame_discarded; 883*4882a593Smuzhiyun uint64_t macrx_frames_dropped; 884*4882a593Smuzhiyun uint64_t mac_crc_error; 885*4882a593Smuzhiyun uint64_t mac_encoding_error; 886*4882a593Smuzhiyun uint64_t macrx_length_error_large; 887*4882a593Smuzhiyun uint64_t macrx_length_error_small; 888*4882a593Smuzhiyun uint64_t macrx_multicast_frames; 889*4882a593Smuzhiyun uint64_t macrx_broadcast_frames; 890*4882a593Smuzhiyun /* IP */ 891*4882a593Smuzhiyun uint64_t iptx_packets; 892*4882a593Smuzhiyun uint64_t iptx_bytes; 893*4882a593Smuzhiyun uint64_t iptx_fragments; 894*4882a593Smuzhiyun uint64_t iprx_packets; 895*4882a593Smuzhiyun uint64_t iprx_bytes; 896*4882a593Smuzhiyun uint64_t iprx_fragments; 897*4882a593Smuzhiyun uint64_t ip_datagram_reassembly; 898*4882a593Smuzhiyun uint64_t ip_invalid_address_error; 899*4882a593Smuzhiyun uint64_t ip_error_packets; 900*4882a593Smuzhiyun uint64_t ip_fragrx_overlap; 901*4882a593Smuzhiyun uint64_t ip_fragrx_outoforder; 902*4882a593Smuzhiyun uint64_t ip_datagram_reassembly_timeout; 903*4882a593Smuzhiyun uint64_t ipv6tx_packets; 904*4882a593Smuzhiyun uint64_t ipv6tx_bytes; 905*4882a593Smuzhiyun uint64_t ipv6tx_fragments; 906*4882a593Smuzhiyun uint64_t ipv6rx_packets; 907*4882a593Smuzhiyun uint64_t ipv6rx_bytes; 908*4882a593Smuzhiyun uint64_t ipv6rx_fragments; 909*4882a593Smuzhiyun uint64_t ipv6_datagram_reassembly; 910*4882a593Smuzhiyun uint64_t ipv6_invalid_address_error; 911*4882a593Smuzhiyun uint64_t ipv6_error_packets; 912*4882a593Smuzhiyun uint64_t ipv6_fragrx_overlap; 913*4882a593Smuzhiyun uint64_t ipv6_fragrx_outoforder; 914*4882a593Smuzhiyun uint64_t ipv6_datagram_reassembly_timeout; 915*4882a593Smuzhiyun /* TCP */ 916*4882a593Smuzhiyun uint64_t tcptx_segments; 917*4882a593Smuzhiyun uint64_t tcptx_bytes; 918*4882a593Smuzhiyun uint64_t tcprx_segments; 919*4882a593Smuzhiyun uint64_t tcprx_byte; 920*4882a593Smuzhiyun uint64_t tcp_duplicate_ack_retx; 921*4882a593Smuzhiyun uint64_t tcp_retx_timer_expired; 922*4882a593Smuzhiyun uint64_t tcprx_duplicate_ack; 923*4882a593Smuzhiyun uint64_t tcprx_pure_ackr; 924*4882a593Smuzhiyun uint64_t tcptx_delayed_ack; 925*4882a593Smuzhiyun uint64_t tcptx_pure_ack; 926*4882a593Smuzhiyun uint64_t tcprx_segment_error; 927*4882a593Smuzhiyun uint64_t tcprx_segment_outoforder; 928*4882a593Smuzhiyun uint64_t tcprx_window_probe; 929*4882a593Smuzhiyun uint64_t tcprx_window_update; 930*4882a593Smuzhiyun uint64_t tcptx_window_probe_persist; 931*4882a593Smuzhiyun /* ECC */ 932*4882a593Smuzhiyun uint64_t ecc_error_correction; 933*4882a593Smuzhiyun /* iSCSI */ 934*4882a593Smuzhiyun uint64_t iscsi_pdu_tx; 935*4882a593Smuzhiyun uint64_t iscsi_data_bytes_tx; 936*4882a593Smuzhiyun uint64_t iscsi_pdu_rx; 937*4882a593Smuzhiyun uint64_t iscsi_data_bytes_rx; 938*4882a593Smuzhiyun uint64_t iscsi_io_completed; 939*4882a593Smuzhiyun uint64_t iscsi_unexpected_io_rx; 940*4882a593Smuzhiyun uint64_t iscsi_format_error; 941*4882a593Smuzhiyun uint64_t iscsi_hdr_digest_error; 942*4882a593Smuzhiyun uint64_t iscsi_data_digest_error; 943*4882a593Smuzhiyun uint64_t iscsi_sequence_error; 944*4882a593Smuzhiyun /* 945*4882a593Smuzhiyun * iSCSI Custom Host Statistics support, i.e. Transport could 946*4882a593Smuzhiyun * extend existing host statistics with its own specific statistics 947*4882a593Smuzhiyun * up to ISCSI_HOST_STATS_CUSTOM_MAX 948*4882a593Smuzhiyun */ 949*4882a593Smuzhiyun uint32_t custom_length; 950*4882a593Smuzhiyun struct iscsi_host_stats_custom custom[] 951*4882a593Smuzhiyun __aligned(sizeof(uint64_t)); 952*4882a593Smuzhiyun }; 953*4882a593Smuzhiyun 954*4882a593Smuzhiyun #endif 955