Below is a proposal for an 'iscsitgt' DTrace provider that will be integrated
into the Solaris iSCSI target. I'll be submitting the PSARC case in about
a week and welcome any feedback (and will potentially act on it until then).

Thanks.

Adam

---8<---

The 'iscsitgt' provider is a USDT provider built into the iSCSI target
daemon (iscsitgtd). As a USDT provider the name is concatenated with
the process ID of the daemon (e.g. 'iscistgt123'). The iscsitgt provider
defines the following probes:

        SCSI command/response
            iscsitgt*:::scsi-command
            iscsitgt*:::scsi-response

        Data out/in/request (rtt)
            iscsitgt*:::data-send
            iscsitgt*:::data-receive
            iscsitgt*:::data-request

        Login and logout command/response
            iscsitgt*:::login-command
            iscsitgt*:::login-response
            iscsitgt*:::logout-command
            iscsitgt*:::logout-response

        NOP out/in (pings)
            iscsitgt*:::nop-receive
            iscsitgt*:::nop-send

        Text and task command/response
            iscsitgt*:::task-command
            iscsitgt*:::task-response
            iscsitgt*:::text-command
            iscsitgt*:::text-response

        Asynchronous message from target
            iscsitgt*:::async-send

The first three arguments to these probes are all the same:

        args[0]         conninfo_t      local (target) socket info
        args[1]         conninfo_t      remote (initiator) socket info
        args[2]         iscsiinfo_t     common iSCSI properties


typedef struct conninfo {
        string ci_host;         /* host IP address as a string */
        uint16_t ci_port;       /* port number */
        uint16_t ci_protocol;   /* IP protocol (either 4 or 6) */
} conninfo_t;


typedef struct iscsiinfo {
        string ii_initiator;            /* initiator IQN */
        string ii_target;               /* target IQN */
        uint64_t ii_lun;                /* target logical unit number */

        uint32_t ii_itt;                /* initiator task tag */
        uint32_t ii_ttt;                /* target transfer tag */

        uint32_t ii_cmdsn;              /* command sequence number */
        uint32_t ii_statsn;             /* status sequence number */
        uint32_t ii_datasn;             /* data sequence number */

        uint32_t ii_datalen;            /* length of data payload */
} iscsiinfo_t;

If the initiator or target IQNs are invalid (e.g. in login-command),
they will be the empy string. If tag fields (ii_itt and ii_ttt) are
invalid, they are set to 0xffffffff (the tag reserved by the iSCSI
protocol). If the sequence numbers are invalid, they are set to 0.


The only probe with an additional argument is the iscsitgt*:::scsi-command
probes:

        args[3]         uint32_t        SCSI opcode

This can be used to determine the exact SCSI operation.


Here's the DTrace stability table for these probes:

              |  Name            Data            Class
 -------------+-------------------------------------------
 Provider     |  Evolving        Evolving        ISA
 Module       |  Private         Private         Unknown
 Function     |  Private         Private         Unknown
 Name         |  Evolving        Evolving        ISA
 Arguments    |  Unstable        Unstable        ISA

-- 
Adam Leventhal, Solaris Kernel Development       http://blogs.sun.com/ahl
_______________________________________________
storage-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/storage-discuss

Reply via email to