root/include/scsi/iscsi_if.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */