RFC 4455

Definition of Managed Objects for Small Computer System Interface (SCSI) Entities

๐Ÿ“… published April 2006, from ietf

RFC 4455: Definition of Managed Objects for Small Computer System Interface (SCSI) Entities ๐ŸŽ€

Okay bestie, first the paperwork, because it's important ๐Ÿ“‹โœจ

  • Series: Network Working Group
  • Number: RFC 4455
  • Title: Definition of Managed Objects for Small Computer System Interface (SCSI) Entities
  • Authors: M. Hallak-Stamler (Sanrad Intelligent Storage), M. Bakke (Cisco Systems, Inc.), Y. Lederman (Siliquent Technologies), M. Krueger (Hewlett-Packard), and K. McCloghrie (Cisco Systems, Inc.)
  • Category: Standards Track
  • Date: April 2006
  • Obsoletes / Updates: the title block doesn't list either one, so it doesn't mention any other RFC being replaced or changed ๐Ÿ™ˆ

Status of This Memo ๐Ÿ“ฃ

This document is an Internet standards track protocol for the Internet community, and it's literally asking people to talk about it and suggest improvements ๐Ÿ’ฌ. For the official standardization state and status, check the current edition of the "Internet Official Protocol Standards" (STD 1) ๐Ÿ“š. Distribution of this memo is unlimited, so share away ๐Ÿฆ‹.

Copyright (C) The Internet Society (2006).

Abstract ๐ŸŒธ

This memo carves out a piece of the Management Information Base (MIB) for network management protocols used across the Internet community ๐Ÿงš. The main focus is managed objects for Small Computer System Interface (SCSI) entities, and it covers them without caring which interconnect subsystem layer they sit on. Main character energy for the storage world ๐Ÿ’œ.

Table of Contents ๐Ÿ—‚๏ธ

   1. The Internet-Standard Management Framework ......................3
   2. Requirements Notation ...........................................3
   3. Overview ........................................................3
      3.1. Introduction ...............................................4
      3.2. SCSI Terminology ...........................................6
           3.2.1. SCSI Application Layer ..............................6
           3.2.2. SCSI Device .........................................6
           3.2.3. SCSI Port ...........................................6
           3.2.4. SCSI Initiator Device ...............................7
           3.2.5. SCSI Initiator Port .................................7
           3.2.6. SCSI Target Device ..................................7
           3.2.7. SCSI Target Port ....................................7
           3.2.8. Logical Units .......................................7
           3.2.9. Logical Unit Number .................................7
           3.2.10. Interconnect Subsystem .............................7
           3.2.11. Device Server ......................................8
           3.2.12. Task Manager .......................................8
           3.2.13. SCSI Instance ......................................8
      3.3. SCSI MIB Module Implementation .............................8
      3.4. Bridging and Virtualization ...............................10
      3.5. SCSI Command MIB Module ...................................11
   4. Structure of the MIB ...........................................11
      4.1. The SCSI Device Group .....................................11
      4.2. The Initiator Group .......................................11
      4.3. The Target Group ..........................................11
      4.4. The Discovery Group .......................................12
      4.5. The LUN Map Group .........................................12
      4.6. The Target Statistic Group ................................12
      4.7. The Target High Speed Statistic Group .....................12
      4.8. The LUN Map Statistics Group ..............................12
      4.9. The LUN Map Statistics High Speed Group ...................13
      4.10. The Initiator Statistics Group ...........................13
      4.11. The Initiator High Speed Statistic Group .................13
      4.12. The Discovery Statistics Group ...........................13
      4.13. The Discovery Statistics High Speed Group ................14
      4.14. The Device Statistics Group ..............................14
   5. Relationships in This MIB ......................................14
   6. Relationship to Other MIBs .....................................16
      6.1. Host Resource MIB .........................................16
      6.2. iSCSI MIB Module ..........................................16
   7. Miscellaneous Details ..........................................16
      7.1. Names and Identifiers .....................................16
      7.2. Logical Unit Number .......................................16
      7.3. Notifications .............................................16
      7.4. SCSI Domains ..............................................17
      7.5. Counters: 32 Bits and 64 Bits .............................17
      7.6. Local versus Remote Entities ..............................18
   8. Abbreviations ..................................................18
   9. Object Definitions .............................................18
   10. Object Population Example: SCSI Target and Initiator
       Devices on a pSCSI Bus ........................................76
      10.1. scsiInstance Table: ......................................77
      10.2. scsiDevice Table: ........................................77
      10.3. scsiPort Table: ..........................................77
      10.4. scsiTransport Table: .....................................77
      10.5. scsiIntrDev Table: .......................................78
      10.6. scsiInitiatorPort Table: .................................78
      10.7. scsiDscTgt Table: ........................................78
      10.8. scsiDscLUN: ..............................................78
      10.9. scsiDscLUNIdentifier: ....................................79
      10.10. scsiAttTgtPort Table: ...................................79
      10.11. scsiTgtDev Table: .......................................79
      10.12. scsiTgtPort Table: ......................................80
      10.13. scsiLU Table: ...........................................80
      10.14. scsiLuId Table: .........................................80
      10.15. scsiLunMap Table: .......................................81
      10.16. scsiAuthorizedIntr Table: ...............................81
      10.17. scsiAttIntrPort Table: ..................................81
   11. Security Considerations .......................................81
   12. Acknowledgements ..............................................84
   13. IANA Considerations ...........................................84
   14. References ....................................................84
      14.1. Normative References .....................................84
      14.2. Informative References ...................................85

1. The Internet-Standard Management Framework โœจ

If you want the full tour of the documents that describe the current Internet-Standard Management Framework, go read section 7 of RFC 3410 [RFC3410] ๐Ÿ“–.

Managed objects live in a virtual information store called the Management Information Base, or MIB ๐Ÿ—„๏ธ. You usually reach MIB objects through the Simple Network Management Protocol (SNMP) ๐Ÿ“ก. The objects get defined using the rules in the Structure of Management Information (SMI) ๐Ÿงฉ. This memo specifies a MIB module that is compliant to the SMIv2, which is described in STD 58, RFC 2578 [RFC2578], STD 58, RFC 2579 [RFC2579] and STD 58, RFC 2580 [RFC2580] ๐Ÿ’….

2. Requirements Notation ๐Ÿซถ

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] ๐Ÿ”ฅ.

3. Overview ๐Ÿฆ‹

Okay so this memo is all about a chunk of the MIB for network management protocols across the Internet community ๐ŸŒˆ. Specifically, it describes a set of managed objects that lets you configure and monitor Small Computer System Interface entities (SCSI entities) ๐Ÿ’–. Those are SCSI target devices, SCSI initiator devices, and SCSI ports โœจ.

SCSI is a client-server protocol. Application clients inside a SCSI initiator device (client) send service requests to logical units that live in a SCSI target device(server). It's giving request and response, but make it storage ๐Ÿ“.

This MIB module is based on documents from the ANSI T10 Technical Committee, specifically the SCSI Architecture Model - 2 [SAM2] and SCSI Primary Commands - 2 [SPC2] ๐Ÿงš. The [SAM2] standard is the main source for the SCSI architecture discussion in this document, and it's also where the terminology in this MIB module comes from ๐Ÿ‘‘.

3.1. Introduction ๐ŸŽ€

Okay so, in the late 1970s, a firm called Shugart Associates was having major success with a peripheral interface in the PC marketplace. An open standards committee adopted it and extended it into the Small Computer Systems Interface (SCSI). ๐Ÿ’พ SCSI is an 8-bit-wide multi-drop "bus" structure, and it could connect up to eight peripherals and computer systems in total. ๐Ÿ”Œ

Here's the tea: at first, SCSI only standardized the "physical connection," meaning the connectors, cables, and interface signals. ๐Ÿซ  So even when one peripheral was hooked up to multiple systems, the information flowing across the interface was different each time. Five years later, a Common Command Set was defined, and that's when it became possible for the first time to build a peripheral with a common interface and common operating firmware for connecting to multiple systems. Iconic glow-up ๐Ÿฆ‹

Through the 1980s, the physical interface kept evolving with fast (up to 10 megabytes/s) and wide (16 bits) variants. The distance was still capped at 25 meters (from one end of the bus to the other), and honestly some of the faster variants supported way less than that. ๐Ÿซฃ Meanwhile, the command set kept growing, with special commands for tapes, printers, and even processors added to the original disk-focused set. SCSI was so successful in the 1980s that most available Operating Systems supported the SCSI command set as standard. ๐Ÿ‘‘

But at the end of the 1980s, the distance, speed, and number of devices SCSI could handle were becoming major blockers for systems design. The "information explosion" hadn't really kicked off yet, but everyone could see it coming. ๐Ÿ“ˆ At the same time, serial interface tech from Local Area Networks like Ethernet, plus fibre optics tech first used in telecommunications, were getting rugged and cheap enough for peripheral interfaces. โœจ So in 1988, a standards project started to build a new serial, fibre-optic interface that could carry SCSI command sets and other peripheral protocols. That interface became known as Fibre Channel (FC), and it's built around an abstractly defined "fabric," which may be a switch or a loop connection. MIB modules for various FC equipment already exist. ๐ŸŒˆ

To support these new interfaces, the SCSI standards and definitions had to be completely reorganized. The command sets were separated from the physical interface definitions, and a SCSI Architectural Model (SAM) was created to define how the various standards interact. ๐Ÿงฉ Here's the wildest part: SAM was first created approximately 10 years AFTER the first SCSI products shipped! ๐Ÿ˜ญ

The most recent chapter of this saga started in 2000, when an IETF Working Group formed to address, among other things, a definition for transporting SCSI command sets directly over a TCP/IP infrastructure. That effort is known as iSCSI [RFC3720], and an iSCSI MIB module is already under development [ISCSI]. ๐Ÿซถ

Most of the projects are in T10, except Fibre Channel, which is defined by T11, and IEEE defines 1394. ๐Ÿ“

The SCSI MIB module represents the SCSI protocol layer that's common to all SCSI command sets and transports. It does not represent the command sets and transports themselves. Those should show up in other MIB modules specific to the transport or command set. The illustration below shows how all the actual and possible SCSI-related MIB modules relate to each other. ๐Ÿ—บ๏ธ

                 +---------------------------------+
   SCSI Command  | Higher-level MIBs, specific to  |
   Sets          | command sets, disk, tape, etc.  |
                 +---------------------------------+
   SCSI          |             SCSI MIB            |
                 +-------+---------+-------+-------+
   SCSI          | iSCSI |   FCP   |  SPI  | Other |
   Transport     |  MIB  |   MIB   |  MIB  |  MIBs |
   Protocols     |       |         |       |       |
                 +-------+---------+-------+-------+
   SCSI          |  TCP  |  Fibre  |    Other      |
   Interconnect  |  MIB  | Channel | Interconnect  |
                 |       |  MIBs   |    MIBs       |
                 +-------+---------+---------------+

An iSCSI MIB module [ISCSI] and a Fibre Channel interconnect MIB module [RFC4044] are currently being developed. There's no development currently planned for standard command-set-specific or device-specific MIBs. ๐Ÿ™ˆ

The TCP-MIB [RFC4022] is already a proposed standard RFC 4022. ๐ŸŽ‰

3.2. SCSI Terminology ๐Ÿ“š

The next sections explain some of the SCSI terminology that gets used later when we define the MIB module. For the authoritative definitions of these terms, check out SAM-2 [SAM2]. ๐Ÿค“

3.2.1. SCSI Application Layer ๐Ÿ’…

This is the set of protocols and procedures that implement or invoke SCSI commands and task management functions by using services from a SCSI transport protocol layer. ๐Ÿงš

3.2.2. SCSI Device ๐Ÿ”ง

A SCSI device is an entity that holds one or more SCSI ports, which connect to a service delivery subsystem, and it supports a SCSI application protocol. ๐Ÿ’œ

3.2.3. SCSI Port ๐Ÿ”Œ

A SCSI port is a device-resident entity that connects the application client, device server, or task manager to the service delivery subsystem, which is where requests and responses get routed. A SCSI port is synonymous with "port," and it's either a SCSI initiator port or a SCSI target port. ๐ŸŒธ

3.2.4. SCSI Initiator Device ๐Ÿš€

A SCSI initiator device contains application clients and SCSI initiator ports that start device service and task management requests to be processed by a SCSI target device. When this term is used, it refers to SCSI initiator devices or SCSI target/initiator devices that are using the SCSI target/initiator port as a SCSI initiator port. ๐Ÿซก

3.2.5. SCSI Initiator Port ๐Ÿค

A SCSI initiator port acts as the connection between application clients and the service delivery subsystem, where requests and responses get routed. Whenever this term shows up, it refers to an initiator port or a SCSI target/initiator port operating as a SCSI initiator port. ๐Ÿฆ‹

3.2.6. SCSI Target Device ๐ŸŽฏ

A SCSI target device contains logical units and SCSI target ports that receive device service and task management requests to process. When this term is used, it refers to SCSI target devices or SCSI target/initiator devices that are using the SCSI target/initiator port as a SCSI target port. ๐Ÿ’–

3.2.7. SCSI Target Port ๐ŸŒท

A SCSI target port contains a task router and acts as the connection between device servers and task managers and the service delivery subsystem, where requests and responses get routed. When this term is used, it refers to a SCSI target port or a SCSI target/initiator port operating as a SCSI target port. โœจ

3.2.8. Logical Units ๐Ÿง 

A logical unit is an entity inside the SCSI target device that implements a device model and processes SCSI commands sent by an application client. ๐Ÿซง

3.2.9. Logical Unit Number ๐Ÿ”ข

A Logical Unit Number, or LUN, is a 64-bit identifier for a logical unit. ๐ŸŽ€

3.2.10. Interconnect Subsystem ๐Ÿ•ธ๏ธ

An interconnect subsystem is one or more interconnects that appear as a single path for transferring information between SCSI devices. ๐Ÿ›ค๏ธ

3.2.11. Device Server ๐Ÿ–ฅ๏ธ

A device server is an object within the logical unit that processes SCSI tasks according to the rules for task management. ๐Ÿ‘‘

3.2.12. Task Manager ๐Ÿ—‚๏ธ

A task manager is a server within the SCSI target device that processes task management functions. ๐Ÿฆ„

3.2.13. SCSI Instance ๐ŸŒˆ

A "SCSI instance" is a distinct SCSI entity within a managed system. Most implementations will only have one SCSI instance, but the MIB module lets you have multiple (virtual) instances, so a large system can be "partitioned" into multiple distinct virtual systems. Main character energy, literally. ๐Ÿ’…โœจ

For example, on a host, it lets multiple vendors' implementations of the MIB module co-exist under a single SNMP agent, with each vendor's implementation being its own SCSI instance. ๐Ÿซถ It also lets a single SNMP agent represent multiple subsystems, each of which has its own SCSI instance. ๐Ÿงš๐Ÿ’œ

3.3. SCSI MIB Module Implementation โœจ

okay so the SCSI MIB module is the basic building block for basically every SCSI management scenario ๐Ÿ’…. It's meant to be implemented in every SCSI entity on a managed system. A SCSI entity can be a SCSI initiator device, a SCSI target device, or a device that's both an initiator and a target. And since SCSI (storage) networking devices can hold more than one SCSI entity, it's totally possible for more than one SCSI instance to live inside a single device ๐Ÿงš.

In small setups, one network management station (NMS) can have SNMP access to both the initiator devices and the target devices. But if target devices (or virtualized target devices) are sold as a service, it's more likely the service provider owns and manages the targets, and the consumer owns and manages the initiators. In that case, the provider's NMS and the consumer's NMS may only have SNMP access to the targets and the initiators, respectively ๐Ÿซถ.

The figures in this chapter show where the SCSI MIB module implementations live across the different management scenarios. The SCSI SNMP agents that implement the SCSI MIB module are marked with '*' ๐ŸŒธ.

  +----------+                                       +---------+
  |SCSI      |          SCSI Transport               |SCSI     |
  |Initiator +---------------------------------------+Target   |
  |Device    |                                       |Device   |
  |     *    |                                       |    *    |
  +----------+                                       +---------+
        |                                                 |
        |                                                 |
        |                                                 |
        |                                                 |
        |                                                 |
        |      SNMP        +----------+     SNMP          |
        +------------------|SCSI      |-------------------+
                           |Management|
                           | (NMS)    |
                           +----------+

   Figure 1.  Single SCSI Initiator Device and
              Single SCSI Target Device

Figure 1 is the simplest scenario: one SCSI initiator device, one SCSI target device, and a management station. There are two SNMP agents here, each holding its own SCSI instance and its respective objects. Since the target device and initiator device are interconnected, their target and initiator port objects will be complementary ๐Ÿ”ฅ.

 +-----------+
 |  +--------+-+          SCSI Transport               +---------+
 |  | SCSI     |---------------------------------------+ SCSI    |
 |* | Initiator+---------------------------------------+ Target  |
 +--| Device   |          SCSI Transport               | Device  |
  | |     *    |                                       |    *    |
  | +----------+                                       +---------+
  |       |                                                 |
  |       |                                                 |
  |       |                                                 |
  |       |                                                 |
  |       |                                                 |
  |SNMP   |      SNMP        +----------+     SNMP          |
  +-------+------------------|SCSI      |-------------------+
                             |Management|
                             | (NMS)    |
                             +----------+

   Figure 2.  Multiple Hosts and a Single Target Device

Figure 2 adds another SCSI initiator device to the SCSI network, and it connects to that same SCSI target device. The extra initiator also runs an SNMP agent implementing the SCSI MIB module. So in this setup, the target device's MIB module will show that two SCSI initiator devices are attached to it ๐Ÿ‘‘.

 +-----------+                                          +----------+
 |  +----------+              +---------------+       +-+-------+  |
 |  |SCSI      |--------------| Virtualization|       | SCSI    |  |
 |* |Initiator +--------------| Device        +-------+ Target  |  |
 +--|Device    | SCSI         |               |       | Device  | *|
  | |     *    |              |            *  |       |    *    |--+
  | +----------+ Transport    +------------+--+       +---------+ |
  |       |                                |              |       |
  |       |                                |              |       |
  |       |                                |              |       |
  |       |                                |              |       |
  |       |                                |              |       |
  |       |      SNMP        +-----------+ |   SNMP       |       |
  +-------+------------------+ SCSI      + +-+------------+-------+
                             | Management|
                             | (NMS)     |
                             +-----------+

   Figure 3.  Multiple Hosts, Virtualization Device and Multiple SCSI
              Target Devices

Figure 3 adds an in-band virtualization device that wraps up the SCSI target devices and might change how they look to the SCSI initiator devices ๐Ÿฆ‹. It's common practice for an in-band virtualization device to have both SCSI target and initiator device functionality, so its SCSI MIB module implementation includes both the SCSI Target device and Initiator device objects. Heads up though: the virtualization device might also implement extra proprietary MIB modules, because the SCSI MIB module doesn't tell physical and virtual SCSI entities apart ๐Ÿ™ˆ.

3.4. Bridging and Virtualization ๐ŸŒˆ

Storage virtualization is a concept that takes storage resources and abstracts them so that storage entities show up as a pool of logical entities ๐Ÿง.

Usually the virtualization process is invisible to the storage users (i.e., hosts). It mostly changes the SCSI entities that get shown to SCSI initiator devices. Still, the SCSI MIB module lets you represent SCSI entities along with their status, including error and performance-monitoring statistics. It should be possible to do a limited number of configuration changes and diagnostic actions too ๐Ÿ’–.

The SCSI entities inside bridging and virtualization devices can be represented by the SCSI MIB module. But configuring bridging and virtualization devices is outside the scope described above, so that should be handled by other MIB modules instead ๐Ÿซถ.

3.5. SCSI Command MIB Module ๐Ÿ’œ

Managing SCSI commands is outside the scope of this MIB module. A future SCSI Command MIB module can link to this one through Object Identifiers (OIDs) or INDEX values from the appropriate tables ๐Ÿ“.


4. Structure of the MIB ๐Ÿฆ‹

This MIB module contains fourteen conformance groups:

4.1. The SCSI Device Group ๐ŸŽ€

The scsiDeviceGroup group holds the objects that are general to each SCSI instance: instance, device, and port objects. It also holds the objects about the transport(s) those SCSI instances use. This group is mandatory for all SCSI managed systems ๐Ÿ’….

Alias objects are provided for SCSI instances and SCSI devices so admins can identify them. These objects contain human-readable administrative text strings, so they use the SnmpAdminString textual convention from [RFC3411] ๐Ÿ“.

4.2. The Initiator Group ๐Ÿ‘‘

The scsiInitiatorDeviceGroup contains all the managed information about a local SCSI initiator device and port. It also contains the managed objects for the monitored attached SCSI target devices. Any managed system acting as a SCSI initiator or target/initiator device and port MUST support this group ๐Ÿ”ฅ.

4.3. The Target Group โœจ

The scsiTargetDeviceGroup contains all the managed objects related to a local SCSI target device, a local SCSI target port, monitored attached initiator ports, logical units, and logical unit identifiers ๐ŸŒธ.

Managed systems acting as a SCSI target or target/initiator device and port must support this group ๐Ÿงš.

4.4. The Discovery Group ๐Ÿ”

The scsiDiscoveryGroup group is a collection of managed objects about remote SCSI target devices, remote SCSI target ports, remote logical units, and remote logical unit identifiers. These are either discovered by or configured to a managed system acting as a SCSI initiator device ๐Ÿ›ฐ๏ธ.

Managed systems acting as a SCSI initiator device and port that also support configuring or discovering remote SCSI target devices or ports should implement this group ๐Ÿ’œ.

4.5. The LUN Map Group ๐Ÿ—บ๏ธ

The scsiLunMapGroup group is a collection of managed objects that allow mapping between SCSI target devices, logical units, and logical unit numbers on one side, and remote authorized SCSI initiator devices or ports on the other side ๐ŸŽ€.

Managed systems that support this mapping should implement the scsiLunMapGroup ๐Ÿ’….

4.6. The Target Statistic Group ๐Ÿ“Š

The scsiTargetDevStatsGroup group is a collection of managed objects representing various statistics about a SCSI target device or port ๐Ÿ’–.

Managed systems acting as a SCSI target device and port that support statistics should implement this group ๐Ÿซถ.

4.7. The Target High Speed Statistic Group โšก

The scsiTargetDevHSStatsGroup group is a collection of managed objects representing various statistics about a SCSI target device or port. It supports systems that can quickly generate countable information because they run at high speed ๐ŸŽ๏ธ.

Managed systems acting as a SCSI target device and port and running at high speed supporting should implement this group ๐Ÿ”ฅ.

4.8. The LUN Map Statistics Group ๐Ÿ“ˆ

The scsiLunMapStatsGroup group is a collection of managed objects representing various statistics about remote authorized SCSI initiator devices or ports ๐ŸŒˆ.

Managed systems acting as a SCSI target device and port that are able to gather statistics on remote SCSI initiator devices or ports should implement this group ๐Ÿ’….

4.9. The LUN Map Statistics High Speed Group ๐Ÿš€

The scsiLunMapHSStatsGroup group is a collection of managed objects representing various statistics about remote authorized SSCI initiator devices or ports. It supports systems that can quickly generate countable information because they run at high speed ๐Ÿงš.

Managed systems acting as a SCSI target device and port that are able to gather statistics on remote SCSI initiator devices or ports and are running at high speed should implement this group ๐Ÿ’–.

4.10. The Initiator Statistics Group ๐Ÿ“‰

The scsiInitiatorDevStatsGroup group is a collection of managed objects representing various statistics about a SCSI initiator device or port ๐ŸŽ€.

Managed systems acting as a SCSI initiator device and port that support statistics should implement this group ๐Ÿซถ.

4.11. The Initiator High Speed Statistic Group ๐Ÿ

The scsiInitiatorDevHSStatsGroup group is a collection of managed objects representing various statistics about a SCSI initiator device or port. It supports systems that can quickly generate countable information because they run at high speed ๐Ÿ’œ.

Managed systems acting as a SCSI initiator device and port that are running at high speed supporting should implement this group โœจ.

4.12. The Discovery Statistics Group โœจ

The scsiDiscoveryStatsGroup group is basically a grab-bag of managed objects tracking stats about remote SCSI target devices or ports that have been discovered or configured. ๐Ÿ“Š

Managed systems that act as a SCSI initiator device and port, and can gather stats on remote SCSI target devices or ports, should implement this group. ๐Ÿ’…

4.13. The Discovery Statistics High Speed Group ๐Ÿš€

The scsiDiscoveryHSStatsGroup group is the high-speed sibling of the one above. It holds managed objects with stats about remote discovered or configured SCSI target devices or ports, and it's for systems that can churn out countable info quickly because they run at high speed. ๐ŸŽ๏ธ

Managed systems that act as a SCSI initiator device and port, can gather stats on remote SCSI target devices or ports, and run at high speed should implement this group. ๐Ÿ”ฅ

4.14. The Device Statistics Group ๐ŸŒธ

The scsiDeviceStatGroup group is a collection of managed objects holding various stats about a SCSI device. ๐Ÿงš

Managed systems that are able to gather device statistics should implement this group. ๐Ÿ’–

5. Relationships in This MIB ๐Ÿฆ‹

This section lays out how the MIB tables work together and depend on each other, giving you the functionality needed to manage SCSI initiator and target devices. If you want to know how a specific table gets used, check its description and the descriptions of its entries and attributes. ๐Ÿ“

Here's the list of required SCSI initiator-related features, plus the tables that make each one happen:

  • List all the SCSI initiator ports that should be managed through this MIB module. The table scsiIntrPortTable keeps track of every SCSI initiator port for the SCSI initiator devices in the MIB module. ๐Ÿ—‚๏ธ
  • Provide a list of all SCSI target ports or SCSI target devices that a SCSI initiator port can attach to. This should stop a SCSI initiator device or port from attaching to SCSI target devices that are supposed to be invisible or off-limits to it. ๐Ÿšซ The entries in this list can be created manually or through automatic discovery mechanisms (e.g., SLP, iSNS). The ScsiDscTgtTable provides this info. Its entries point to the SCSI initiator port and say that the initiator port can only attach to the SCSI target ports or SCSI target devices listed in the matching ScsiDscTgtTable entries.

This MIB module permits, but does not require, this table to be written via SNMP. Allowing writes to this table comes with significant security considerations, so see Section 11. ๐Ÿ”

  • The info about those SCSI target ports or SCSI target devices, including their LUs and respective LUN Ids, should be provided. The scsiDscLunTable and scsiDscLunIdTable hold this info. ๐Ÿ”ข
  • The scsiAttTgtPortTable tells you which SCSI target ports each SCSI initiator port is currently talking to. This table should be dynamically updated to reflect those connections. โšก

Here's the list of required SCSI target device-related features, plus the tables that power them:

  • List all the SCSI target ports that should be managed through this MIB module. The table scsiTgtPortTable keeps every SCSI target port for the SCSI target devices in the MIB module. ๐ŸŽฏ
  • Provide a list of valid SCSI initiator ports or SCSI initiator devices that are authorized to attach to a SCSI target port. This list should use the concept of "access lists," which are common in IP routers and switches. ๐Ÿšช The ScsiAuthorizedIntr table provides this info. This MIB module permits, but does not require, this table to be written via SNMP. Writes to this table come with significant security considerations, so see Section 11. ๐Ÿ”
  • It should be possible to specify the list of LUNs exposed to each SCSI initiator port or device when it's attached to the SCSI target device. SCSI target devices must provide a default list of LUNs. This list can be a unique list for each SCSI initiator device or be the default list. For each entry in the ScsiAuthorizedIntr table, a pointer named scsiAuthIntrLunMapIndex indexes the ScsiLunMapTable, which makes this feature work. ๐Ÿงฉ
  • Provide a way to monitor all the SCSI initiator ports currently attached to this SCSI target port. The scsiAttIntrPortTable provides this info. This table should be dynamically updated to reflect those connections. ๐Ÿ‘€

6. Relationship to Other MIBs ๐ŸŒˆ

6.1. Host Resource MIB ๐Ÿ’ป

The SCSI MIB module extends objects defined in the host resource MIB module to SCSI-specific entities. It does not contain info on software modules such as device drivers. If you need MIB objects for installed packages of SCSI software, the standard MIB objects to use are in the hrSWInstalledGroup of the Host Resources MIB [RFC2790]. ๐Ÿ“ฆ

6.2. iSCSI MIB Module ๐Ÿ”Œ

The SCSI MIB module defines managed objects for the SCSI protocol layer. The SCSI layer can run on top of several transport layers, and iSCSI is one of them. The ISCSI-MIB [ISCSI] is the MIB portion that defines the managed objects for the iSCSI transport. In the same way, a fibre channel or parallel SCSI MIB module would define managed objects for a transport called fibre channel or parallel SCSI, respectively. ๐Ÿงต

The relationship between the SCSI MIB module and any valid transport MIB module is determined through the SCSI port managed table. That table has an object pointing to the corresponding row, if there is one, of the relevant table in a transport MIB module. ๐Ÿ”—

7. Miscellaneous Details ๐ŸŽ€

7.1. Names and Identifiers ๐Ÿท๏ธ

The names and identifiers of SCSI devices, ports, and logical units depend on the underlying transport protocols, so their format and length vary accordingly. For more details, check out SAM-2 [SAM2]. ๐Ÿ“–

7.2. Logical Unit Number ๐Ÿ”ข

The Logical Unit Number is a 64-bit integer. That type doesn't exist in SMI, so this MIB contains a textual convention that defines LUN as an OCTET STRING. ๐Ÿง 

7.3. Notifications ๐Ÿ””

Separate SNMP notifications may be enabled or disabled to report a change in any of the SCSI device status variables. A notification will be generated theoretically for each occurrence (see restriction below) of the abnormal status. For example, if the SCSI device's current status is abnormal and another logical unit changes its status from available to abnormal, another notification will occur. ๐Ÿšจ

To avoid sending an excessive number of notifications for multiple counted errors, an SNMP agent implementing the SCSI MIB module should not send more than three SCSI notifications in any 10-second period. โฑ๏ธ

The 3-in-10 rule was chosen because one notification every three seconds was deemed often enough. But if two or three different notifications happen at the same time, it wouldn't be desirable to suppress them. Three notifications in 10 seconds is a happy medium: a short burst of notifications is allowed without inundating the network and/or destination host with a huge pile of notifications. ๐Ÿ™Œ

The ultimate control over sending notifications is in the command of the notification generator module specified in [RFC3413]. ๐ŸŽ›๏ธ

7.4. SCSI Domains ๐ŸŒ

SAM-2 [SAM2] specifies that devices belong to a domain. However, it's not usually possible to determine this from within a system, so domains are not represented within this MIB module. ๐Ÿคทโ€โ™€๏ธ

7.5. Counters: 32 Bits and 64 Bits ๐Ÿ”ข

Some counters in (newer) high-performance systems can increase fast enough that their representation as Counter32s can cause them to "wrap" in less than an hour. The SMIv2 provides Counter64 as the syntax for such counters. However, (older) SNMPv1 implementations cannot support Counter64s. So this MIB module defines such counters as both Counter32s and Counter64's. ๐Ÿ’ซ

The counters in this MIB module that count data are defined in terms of megabytes (i.e., as the number of megabytes of data), so Counter64s are not required for them. ๐Ÿ“ˆ

However, the counters in this MIB module that count commands can wrap within an hour when in use at 5 GBit/second with 512-byte read/write operations. Therefore, each of these counters will be defined as both a Counter32 and a Counter64, with the latter being mandatory, for system speeds of 4 Gbit/second or higher. โš ๏ธ

A possible (but not required) implementation strategy is to have the value of each Counter32 be the same as the low-order 32 bits of the corresponding Counter64. ๐Ÿงฎ

7.6. Local versus Remote Entities ๐Ÿ 

This MIB module often labels SCSI entities as local or remote. The local entities are the ones the agent is reporting on. The remote entities are the ones the local entities are communicating with via the SCSI protocol. ๐Ÿ›ฐ๏ธ

8. Abbreviations ๐Ÿ“š

This MIB module will use the following abbreviations:

   Inst = Instance

   Dev = SCSI Device

   Tgt = SCSI Target Device

   Intr = SCSI Initiator Device

   Att = Attached

   Id = Identifier

   Dsc = Discovered

   pSCSI = Parallel SCSI

9. Object Definitions ๐Ÿ’œ

Here's the full MIB module, copied exactly as written:

   SCSI-MIB DEFINITIONS ::= BEGIN

      IMPORTS
      MODULE-IDENTITY, OBJECT-IDENTITY, OBJECT-TYPE,
      NOTIFICATION-TYPE, Integer32, Unsigned32, Counter32,
      Counter64, Gauge32,
      mib-2                                     FROM SNMPv2-SMI
      TEXTUAL-CONVENTION, TimeStamp, TruthValue,
      RowStatus, RowPointer, AutonomousType,
      StorageType                               FROM SNMPv2-TC
      MODULE-COMPLIANCE, OBJECT-GROUP,
      NOTIFICATION-GROUP                        FROM SNMPv2-CONF
      SnmpAdminString                  FROM SNMP-FRAMEWORK-MIB;

   scsiMIB MODULE-IDENTITY
        LAST-UPDATED "200603300000Z"        -- 30th March 2006
        ORGANIZATION "IETF"
        CONTACT-INFO "
             Michele Hallak-Stamler
             Sanrad Intelligent Network
             27 Habarzel Street
             Tel Aviv, Israel
             Phone: +972 3 7674809
             E-mail: michele@sanrad.com

             Yaron Lederman
             Siliquent Technologies Ltd.
             21 Etzel Street
             Ramat Gan, Israel
             Phone: +972 54 5308833
             E-mail: yaronled@bezeqint.net

             Mark Bakke
             Postal: Cisco Systems, Inc
             7900 International Drive, Suite 400
             Bloomington, MN
             USA 55425
             E-mail: mbakke@cisco.com

             Marjorie Krueger
             Postal: Hewlett-Packard
             8000 Foothills Blvd.
             Roseville, CA 95747
             E-mail: marjorie_krueger@hp.com

             Keith McCloghrie
             Cisco Systems, Inc.
             Postal: 170 West Tasman Drive
             San Jose, CA USA 95134
             Phone: +1 408 526-5260
             E-mail: kzm@cisco.com

            "
        DESCRIPTION
             "The SCSI MIB Module.
             Copyright (C) The Internet Society (2006).  This version of
             this MIB module is part of RFC 4455; see the RFC
             itself for full legal notices."

      -- Revision History

        REVISION     "200603300000Z"
        DESCRIPTION  " Initial version published as RFC 4455."
   ::= { mib-2 139}

   --****************** Textual Conventions **************************
   ScsiLUN  ::= TEXTUAL-CONVENTION

Okay bestie, the LUN convention is giving main character energy ๐Ÿ’– Its syntax is an OCTET STRING that's either 2 or 8 bytes, and the format is pointed to Tables A.2 and A.3 of SAM-2 ๐ŸŽ€

        STATUS current
        DESCRIPTION
           "This textual convention represents a SCSI Logical Unit
           Number (LUN).  The format of a LUN is documented in Tables
           A.2 and A.3 of SAM-2 [SAM2]."
        REFERENCE
         "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
         T10 Project 1157-D, 12 September 2002 - Annex A [SAM2]"
        SYNTAX OCTET STRING (SIZE ( 2 | 8))

   ScsiIndexValue ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
           "An arbitrary integer value, greater than zero, for use
           as a unique index value."
        SYNTAX Unsigned32 (1..4294967295)

   ScsiPortIndexValueOrZero ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
         "This textual convention is an extension of the ScsiIndexValue
          convention.  The latter defines a greater than zero value used
          to identify an index.  This extension permits the additional
          value of zero and is applicable only to indices of SCSI port.
          Usage of the zero is object-specific and must therefore be
          defined as part of the description of any object that uses
          this syntax.  Examples of the usage of zero might include
          situations where the index was unknown, or when none or all
          indices need to be referenced."
        SYNTAX Unsigned32 (0..4294967295)

   ScsiIndexValueOrZero ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
         "This textual convention is an extension of the ScsiIndexValue
          convention.  The latter defines a greater than zero value used
          to identify an index.  This extension permits the additional
          value of zero.  Usage of the zero is object-specific and must
          therefore be defined as part of the description of any object
          that uses this syntax.  Examples of the usage of zero might
          include situations where index was unknown, or when none or
          all indices need to be referenced."
        SYNTAX Unsigned32 (0..4294967295)

   ScsiIdentifier ::= TEXTUAL-CONVENTION

        STATUS current
        DESCRIPTION
          "This textual convention represents a generic SCSI port
          identifier.
          The format depends on the transport used and is documented
          in Tables A.2 and A.3 of SAM-2 [SAM2]."
        REFERENCE
         "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
         T10 Project 1157-D, 12 September 2002 - Annex A [SAM2]"
        SYNTAX OCTET STRING (SIZE (0..262))

   ScsiName ::= TEXTUAL-CONVENTION
        STATUS current
        DESCRIPTION
          "This textual convention represents the name of a SCSI
          initiator device, a SCSI target device, a SCSI initiator port
          or a SCSI target port.
          The format depends on the transport used and is documented
          in Tables A.4 and A.5 of SAM-2 [SAM2].
         Every object defined using this syntax must define whether it
         is
         a) always used for a port,
         b) always used for a device, or
         c) the circumstances under which it is used for a port or
         device."
        REFERENCE
         "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
         T10 Project 1157-D, 12 September 2002 - Annex A [SAM2]"
        SYNTAX OCTET STRING (SIZE (0..262))

   ScsiLuNameOrZero  ::= TEXTUAL-CONVENTION
        STATUS current
        DESCRIPTION
          "This textual convention represents either the name of a SCSI
          logical unit or a zero-length string.  Objects defined with
          this syntax must specify the meaning of the zero-length
          string.
          The format of the name of a LU is defined as:
          - a zero-length octet string or
          - a string of eight bytes."
        REFERENCE
         "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
         T10 Project 1157-D, 12 September 2002 - Annex A [SAM2]"
        SYNTAX OCTET STRING (SIZE (0 | 8))



   ScsiDeviceOrPort ::= TEXTUAL-CONVENTION

        STATUS current
        DESCRIPTION
          "This type specifies whether a particular configuration is
          applicable to a port or to a device."
        SYNTAX INTEGER  {
            device(1),
            port(2),
            other(3)
         }

   ScsiIdCodeSet ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
          "This textual convention specifies the code set for the
          identifier contained in an Identification Descriptor returned
          in a logical unit's Device Identification Page, and is
          formatted as defined in T10 SPC-2 (see REFERENCE) Table 172 -
          Code Set"
        REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
        SYNTAX Unsigned32 (0..15)

   ScsiIdAssociation ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
          "This textual convention specifies what the identifier is
          associated with (e.g., with the addressed physical/logical
          device or with a particular port) for the identifier
          contained in an Identification Descriptor returned in a
          logical unit's Device Identification Page, and is
          formatted as defined in T10 SPC-2 (see REFERENCE)
          Table 173 - Association."
        REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
        SYNTAX Unsigned32 (0..3)

   ScsiIdType ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
         "This textual convention specifies the type for the identifier
          contained in an Identification Descriptor returned in a
          logical unit's Device Identification Page, and is formatted
          as defined in T10 SPC-2 (see REFERENCE) table 174 - Identifier
          Type."
        REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
        SYNTAX Unsigned32 (0..15)

   ScsiIdValue ::= TEXTUAL-CONVENTION
        STATUS current
        DESCRIPTION
         "This textual convention represents an identifier.  The objects
          of type ScsiIdCodeSet, ScsiIdAssociation, ScsiIdType define
          together the format.
          The format is the same as contained in an Identification
          Descriptor returned in a logical unit's Device Identification
          Page, and is formatted as defined in T10 SPC-2
          (see REFERENCE)."
       REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
        SYNTAX OCTET STRING (SIZE (0..255))

   ScsiHrSWInstalledIndexOrZero ::= TEXTUAL-CONVENTION
        DISPLAY-HINT "d"
        STATUS current
        DESCRIPTION
          "The index value for a software module's row in the Host
          Resources MIBs hrSWInstalledTable.  A zero value indicates
          that no row in the hrSWInstalledTable is applicable."
        REFERENCE
          "hrSWInstalledTable is defined in the Host Resources MIB,
          [RFC2790]."
        SYNTAX   Integer32 (0..2147483647)


   --****************** Structure of the MIB **************************
   scsiNotifications OBJECT IDENTIFIER ::= { scsiMIB 0 }
   scsiAdmin         OBJECT IDENTIFIER ::= { scsiMIB 1 }
   scsiObjects       OBJECT IDENTIFIER ::= { scsiMIB 2 }
   scsiConformance   OBJECT IDENTIFIER ::= { scsiMIB 3 }

   scsiTransportTypes   OBJECT IDENTIFIER ::= { scsiAdmin 1 }
   scsiGeneral          OBJECT IDENTIFIER ::= { scsiObjects 1 }
   scsiInitiatorDevice  OBJECT IDENTIFIER ::= { scsiObjects 2 }
   scsiTargetDevice     OBJECT IDENTIFIER ::= { scsiObjects 3 }
   scsiLogicalUnit      OBJECT IDENTIFIER ::= { scsiObjects 4 }

   --****************** Transport Types *******************************
   -- The following object identifiers allow determining the different
   -- transports (service delivery subsystems) in use under the SCSI
   -- layer.

   scsiTransportOther   OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION
        "This identity identifies a transport that has no identity; it
        might happen because the transport is unknown or might not
        have been defined when this MIB module was created."
   ::= { scsiTransportTypes 1 }

   scsiTransportSPI     OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION
        "This identity identifies a parallel SCSI transport."
      REFERENCE
        "T10 - SCSI Parallel Interface - 4 (SPI-4)
        - ANSI INCITS 362-2002 [SPI4]"
   ::= { scsiTransportTypes 2 }

   scsiTransportFCP     OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION
        "This identity identifies a Fibre Channel Protocol for SCSI,
        Second Version."
      REFERENCE
        "T10 - SCSI Fibre Channel Protocol - 2 (FCP-2)
        - ANSI INCITS 350-2003 [FCP2]"
   ::= { scsiTransportTypes 3 }

   scsiTransportSRP  OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION
        "This identity identifies a protocol for transporting SCSI over
        Remote Direct Memory Access (RDMA) interfaces, e.g., InfiniBand
        (tm)."
      REFERENCE
        "T10 - SCSI RDMA Protocol (SRP)
         - ANSI INCITS 365-2002 [SRP]."
   ::= { scsiTransportTypes 4 }

   scsiTransportISCSI   OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION

        "This identity identifies an iSCSI transport."
      REFERENCE
        "IETF IPS WG - Internet Small Computer Systems Interface
         (iSCSI) [RFC3720] "
   ::= { scsiTransportTypes 5 }

   scsiTransportSBP  OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION
        "This identity identifies the Serial Bus Protocol 3."
      REFERENCE
        "T10 - Serial Bus Protocol 3 (SBP-3)
        - ANSI INCITS 375-2004 [SBP3]."
   ::= { scsiTransportTypes 6 }

   scsiTransportSAS  OBJECT-IDENTITY
      STATUS   current
      DESCRIPTION
        "This identity identifies the Serial Attach SCSI Protocol."
      REFERENCE
        "T10 - Serial Attached SCSI - 1.1 (SAS - 1.1)
        - #1601-D Rev-10 [SAS-1.1]."
   ::= { scsiTransportTypes 7 }

   --****************** Instance Table *****************************
   scsiInstanceTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF ScsiInstanceEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "A list of SCSI instances present on the system.
        The SCSI instance is the top-level entity, to which everything
        else belongs.  An SNMP agent could represent more than one
        instance if it represents either a stack of devices, or virtual
        partitions of a larger device, or a host running multiple SCSI
        implementations from different vendors."
   ::= { scsiGeneral 1 }

   scsiInstanceEntry OBJECT-TYPE
      SYNTAX         ScsiInstanceEntry
      MAX-ACCESS     not-accessible
      STATUS         current
      DESCRIPTION
        "An entry (row) containing management information applicable to
        a particular SCSI instance."
      INDEX { scsiInstIndex }
   ::= { scsiInstanceTable 1 }
   ScsiInstanceEntry ::= SEQUENCE {
      scsiInstIndex              ScsiIndexValue,
      scsiInstAlias              SnmpAdminString,
      scsiInstSoftwareIndex      ScsiHrSWInstalledIndexOrZero,
      scsiInstVendorVersion      SnmpAdminString,
      scsiInstScsiNotificationsEnable  TruthValue,
      scsiInstStorageType        StorageType
   }

Okay so the big takeaway here: these textual conventions are basically the reusable "types" ๐Ÿงš Each one gets a name, a description, and a SYNTAX line that says exactly what shape the value has, like an index that has to be greater than zero (ScsiIndexValue) versus one that's allowed to be zero too (ScsiPortIndexValueOrZero) ๐Ÿ’…

Then the MIB gets its little map of folders ๐Ÿ—‚๏ธ scsiNotifications, scsiAdmin, scsiObjects and scsiConformance all hang off scsiMIB, and the transport types list is where each SCSI transport gets its own numbered ID, from SPI all the way to SAS ๐Ÿฆ‹ scsiInstanceTable is the top-level list of SCSI instances on a system, and every row in it is indexed by scsiInstIndex ๐ŸŒธ


okay so we're still in Section 9 bestie, and this part is all about the MIB definitions ๐ŸŽ€ Just the object definitions, no fluff, and the comment banners (the --**** lines) are part of the code so they stay too ๐Ÿงš

Instance entries first. scsiInstIndex is the unique ID for each SCSI instance, and scsiInstAlias is a little admin nickname someone can set (it can even be empty, which is giving minimalism ๐Ÿค). โœจ

   scsiInstIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object represents an arbitrary integer used to uniquely
        identify a particular SCSI instance."
   ::= { scsiInstanceEntry 1 }

   scsiInstAlias OBJECT-TYPE
      SYNTAX      SnmpAdminString (SIZE(0..79))
      MAX-ACCESS  read-write
      STATUS      current
      DESCRIPTION
        "This object represents an administrative string, configured by
        the administrator.  It can be a zero-length string."
   ::= { scsiInstanceEntry 2 }

   scsiInstSoftwareIndex    OBJECT-TYPE
      SYNTAX      ScsiHrSWInstalledIndexOrZero
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "If this management instance corresponds to an installed
        software module, then this object's value is the value of the
        hrSWInstalledIndex of that module.  If there is no
        correspondence to an installed software module (or no module
        that has an hrSWInstalledIndex value), then the value of this
        object is zero."
      REFERENCE
        "hrSWInstalledIndex is defined in the Host Resources MIB,
        [RFC2790]."
   ::= { scsiInstanceEntry 3 }

   scsiInstVendorVersion OBJECT-TYPE
      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION

        "This object represents a text string set by the manufacturer
        describing the version of this instance.  The format of this
        string is determined solely by the manufacturer and is for
        informational purposes only.  It is unrelated to the SCSI
        specification version numbers."
   ::= { scsiInstanceEntry 4 }

   scsiInstScsiNotificationsEnable  OBJECT-TYPE
      SYNTAX      TruthValue
      MAX-ACCESS  read-write
      STATUS      current
      DESCRIPTION
        "This object indicates whether notifications defined in this
         MIB module will be generated."
      DEFVAL { true }
   ::= { scsiInstanceEntry 5 }

   scsiInstStorageType OBJECT-TYPE
       SYNTAX       StorageType
       MAX-ACCESS   read-write
       STATUS       current
       DESCRIPTION
              "This object specifies the memory realization for
              this SCSI entity.
              Specifically, each row in the following tables:

                         scsiIntrDevTable
                         scsiDscTgtTable
                         scsiAuthorizedIntrTable
                         scsiLunMapTable

              has a StorageType as specified by the instance of
              this object that is INDEXed by the same value of
              scsiInstIndex.
              This value of this object is also used to indicate
              the persistence across reboots of writable values in
              its row of the scsiInstanceTable.
              Conceptual rows having the value 'permanent' need not
              allow write-access to any columnar objects in the row,
              nor to any object belonging to a table whose entry is
              INDEXed by the same value of scsiInstIndex."
       DEFVAL { nonVolatile }
   ::= { scsiInstanceEntry 6 }

okay the StorageType one is a whole vibe ๐Ÿ“ It says the storage realization for the SCSI entity, and it's basically the persistence setting for the tables listed inside it. Its default is nonVolatile, and the row it's indexed by gets the same storage type too ๐Ÿ’…


Next up is the Device Table ๐Ÿฆ‹ scsiDeviceTable is the list of SCSI devices in each instance, and each row is keyed by both scsiInstIndex and scsiDeviceIndex. The scsiDeviceRole bits tell you whether a device is a target, an initiator, or both. ๐Ÿซถ

   --******************** Device Table ********************************
   scsiDeviceTable  OBJECT-TYPE
      SYNTAX           SEQUENCE OF ScsiDeviceEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "A list of SCSI devices contained in each of the SCSI manageable
        instances that this agent is reporting."
   ::= { scsiGeneral 2 }

   scsiDeviceEntry OBJECT-TYPE
      SYNTAX         ScsiDeviceEntry
      MAX-ACCESS     not-accessible
      STATUS         current
      DESCRIPTION
        "An entry (row) containing management information applicable to
        a particular SCSI device included in this SCSI manageable
        instance identifiable by the value of scsiInstIndex."
      INDEX {scsiInstIndex, scsiDeviceIndex}
   ::= { scsiDeviceTable 1 }

   ScsiDeviceEntry ::= SEQUENCE {
      scsiDeviceIndex      ScsiIndexValue,
      scsiDeviceAlias      SnmpAdminString,
      scsiDeviceRole       BITS,
      scsiDevicePortNumber Unsigned32
   }

   scsiDeviceIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object is an arbitrary integer used to uniquely identify
        a particular device within a particular SCSI instance."
   ::= { scsiDeviceEntry 1 }

   scsiDeviceAlias OBJECT-TYPE
      SYNTAX      SnmpAdminString (SIZE(0..79))
      MAX-ACCESS  read-write
      STATUS      current
      DESCRIPTION
        "This object contains an administrative name for this device.
        If no name is assigned, the value of this object is the
        zero-length string.
        The StorageType of this object is specified by the instance
        of scsiInstStorageType that is INDEXed by the same value of
        scsiInstIndex."
   ::= { scsiDeviceEntry 2 }

   scsiDeviceRole OBJECT-TYPE

      SYNTAX      BITS {
            target(0),
            initiator(1)
      }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object determines whether this device is acting as a
        SCSI initiator device, or as a SCSI target device, or as both."
   ::= { scsiDeviceEntry 3 }

   scsiDevicePortNumber OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of ports contained in this
        device."
   ::= { scsiDeviceEntry 4 }

Now the Port Table ๐ŸŒธ scsiPortTable lists the ports for each device, and each port is keyed by instance, device, and port index. scsiPortTransportPtr points at the matching row in the transport table, and scsiPortBusyStatuses is a counter for busy statuses. The description also says discontinuities can happen when the management system re-initializes ๐Ÿ™ˆ

   --****************** Port Table ************************************
   scsiPortTable  OBJECT-TYPE
      SYNTAX  SEQUENCE OF ScsiPortEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "A list of SCSI ports for each SCSI device in each instance."
   ::= { scsiGeneral 3 }

   scsiPortEntry OBJECT-TYPE
      SYNTAX            ScsiPortEntry
      MAX-ACCESS        not-accessible
      STATUS            current
      DESCRIPTION
        "An entry (row) containing management information applicable to
        a particular SCSI port of a particular SCSI device in a
        particular SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiPortIndex }
   ::= { scsiPortTable  1 }

   ScsiPortEntry ::= SEQUENCE {
      scsiPortIndex        ScsiIndexValue,
      scsiPortRole         BITS,
      scsiPortTransportPtr    RowPointer,
      scsiPortBusyStatuses Counter32
   }
   scsiPortIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An arbitrary integer used to uniquely identify a particular
        port of a given device within a particular SCSI instance."
   ::= { scsiPortEntry 1 }

   scsiPortRole OBJECT-TYPE
      SYNTAX      BITS {
            target(0),
            initiator(1)
      }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates whether this port is acting as a
        SCSI initiator port, or as a SCSI target port or as both."
   ::= { scsiPortEntry 2 }

   scsiPortTransportPtr OBJECT-TYPE
      SYNTAX      RowPointer
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object is a pointer to the corresponding row in the
        scsiTransportTable.  This row contains information on the
        transport such as transport type and port name."
   ::= { scsiPortEntry 3 }

   scsiPortBusyStatuses OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of port busy statuses sent or
        received by this port.  Note: Initiator ports only receive busy
        status and SCSI target ports only send busy status.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiPortEntry 4 }

Next, the Transport Table ๐Ÿš€ This one lists the transports attached to each device. scsiTransportType says what kind of transport it is (the example is scsiTransportFCP), and scsiTransportPointer links to a row in another transport MIB module, like the iSCSI one. If there's no MIB for that transport, the pointer is 0.0 ๐Ÿงš

   --******************** Table of supported transports ***************
   scsiTransportTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF ScsiTransportEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table contains the device transport-specific information
        for each transport connected to each device in
        scsiDeviceTable."
   ::= { scsiGeneral 5 }

   scsiTransportEntry OBJECT-TYPE
      SYNTAX      ScsiTransportEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An entry (row) containing parameters applicable to a transport
        used by a particular device of a particular SCSI manageable
        instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiTransportIndex}
   ::= { scsiTransportTable 1 }

   ScsiTransportEntry ::= SEQUENCE {
      scsiTransportIndex   ScsiIndexValue,
      scsiTransportType    AutonomousType,
      scsiTransportPointer RowPointer,
      scsiTransportDevName ScsiName
   }

   scsiTransportIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An arbitrary integer used to uniquely identify a particular
        transport within a given device within a particular SCSI
        instance."
   ::= { scsiTransportEntry 1 }

   scsiTransportType OBJECT-TYPE
      SYNTAX      AutonomousType
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object identifies the transport type of this row of the
        transport table.  For example, if this object has the value
        scsiTransportFCP, then the identified transport is FCP."
   ::= { scsiTransportEntry 2 }

   scsiTransportPointer OBJECT-TYPE
      SYNTAX      RowPointer
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents a pointer to a conceptual row in a
        'transport' MIB module allowing a manager to get useful
        information for the transport described by this entry.
        For example, if the transport of this device is iSCSI, this
        object will point to the iSCSI Instance of the iSCSI MIB
        module.
        If there is no MIB for this transport, this object has the
        value 0.0."
   ::= { scsiTransportEntry 3 }

   scsiTransportDevName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the name of this device in one of the
        format(s) appropriate for this type of transport."
   ::= { scsiTransportEntry 4 }

Last bit for this part is the SCSI Initiator Device Table ๐ŸŽ€ It holds info for each local initiator device, and the first object here is scsiIntrDevTgtAccessMode. I'm cutting it right at the start of its definition, so the next part picks it up ๐Ÿ’œ

   --******************** SCSI Initiator Device Table ***************
   scsiIntrDevTable  OBJECT-TYPE
      SYNTAX           SEQUENCE OF ScsiIntrDevEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "This table contains information for each local SCSI initiator
        device in each instance."
   ::= { scsiInitiatorDevice 1}

   scsiIntrDevEntry OBJECT-TYPE
      SYNTAX           ScsiIntrDevEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "An entry (row) containing information applicable to a SCSI
        initiator device within a particular SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex }
   ::= { scsiIntrDevTable  1 }

   ScsiIntrDevEntry ::= SEQUENCE {
      scsiIntrDevTgtAccessMode   INTEGER,
      scsiIntrDevOutResets       Counter32
   }

   scsiIntrDevTgtAccessMode   OBJECT-TYPE
      SYNTAX      INTEGER {
            unknown(1),
            autoEnable(2),
            manualEnable(3)
      }
      MAX-ACCESS  read-write
      STATUS      current
      DESCRIPTION
        "This object controls whether or not a discovered SCSI target
        device is immediately authorized:
            - autoEnable (2) means that when a SCSI initiator device
            discovers a SCSI target device, it can use it immediately.
            - manualEnable (3) means that the SCSI initiator device
            must wait for an operator to set scsiIntrDscTgtConfigured
            = true before it is authorized.
        The StorageType of this object is specified by the instance
        of scsiInstStorageType that is INDEXed by the same value of
        scsiInstIndex."
   ::= { scsiIntrDevEntry 1 }

   scsiIntrDevOutResets OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the total number of times that this SCSI
        initiator device has issued
        - a LOGICAL UNIT RESET or TARGET RESET task management request,
          or
        - any other SCSI transport protocol-specific action or event
          that causes a Logical Unit Reset or a Hard Reset at one or
          more SCSI target ports ([SAM2] chapters 5.9.6, 5.9.7).
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
      REFERENCE
         "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
         T10 Project 1157-D, 12 September 2002
         Chapters 5.9.6 & 5.9.7 [SAM2]"
   ::= { scsiIntrDevEntry 2 }

okay so this bit is all about the authorization switch ๐Ÿ”โœจ autoEnable means a discovered target is usable the second the initiator finds it, and manualEnable means someone has to flip scsiIntrDscTgtConfigured to true first. bestie that's giving gatekeeper energy ๐Ÿ’…

then scsiIntrDevOutResets is the counter for how many times this initiator has kicked off a LOGICAL UNIT RESET or TARGET RESET (or any transport action that causes one) ๐Ÿ”„ the source for all that is [SAM2] chapters 5.9.6 & 5.9.7, and the counter can get a reset at management re-initialization ๐ŸŒธ

   -- The following section describes managed objects related to
   -- SCSI initiator ports.

   scsiIntrPortTable OBJECT-TYPE
      SYNTAX          SEQUENCE OF ScsiIntrPortEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION

        "This table contains all the SCSI initiator ports for each
        local SCSI initiator or target/initiator devices in each SCSI
        instance."
   ::= { scsiInitiatorDevice 2 }

   scsiIntrPortEntry OBJECT-TYPE
      SYNTAX          ScsiIntrPortEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "An entry (row) containing information applicable to a
        particular SCSI initiator port of a particular SCSI device
        within a SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiPortIndex }
   ::= { scsiIntrPortTable 1 }

   ScsiIntrPortEntry ::= SEQUENCE {
      scsiIntrPortName           ScsiName,
      scsiIntrPortIdentifier     ScsiIdentifier,
      scsiIntrPortOutCommands    Counter32,
      scsiIntrPortWrittenMegaBytes  Counter32,
      scsiIntrPortReadMegaBytes  Counter32,
      scsiIntrPortHSOutCommands  Counter64
   }

   scsiIntrPortName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the name of the port assigned for use
        by the SCSI protocol.  The format will depend on the type of
        transport this port is using."
   ::= { scsiIntrPortEntry 1 }


   scsiIntrPortIdentifier OBJECT-TYPE
      SYNTAX      ScsiIdentifier
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the identifier of the port in one of
        the format(s) appropriate for the type of transport in use."
   ::= { scsiIntrPortEntry 2 }

   scsiIntrPortOutCommands OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands sent by this
        SCSI initiator port.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiIntrPortEntry 3 }

   scsiIntrPortWrittenMegaBytes  OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of data in megabytes sent
        by this SCSI initiator port.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiIntrPortEntry 4 }

   scsiIntrPortReadMegaBytes  OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of data in megabytes
        received by this SCSI initiator port.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiIntrPortEntry 5 }

   scsiIntrPortHSOutCommands  OBJECT-TYPE
      SYNTAX      Counter64
      UNITS       "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands sent by this
        SCSI initiator port.  This object provides support for systems
        that can quickly generate a large number of commands because
        they run at high speed.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiIntrPortEntry 6 }

the initiator port table is next ๐Ÿฆ‹ it's basically a list of every SCSI initiator port on each local device, and each row gets a name, an identifier, and a bunch of counters (commands, written and read megabytes, plus a Counter64 version of the command count for really fast systems ๐Ÿš€). the 64-bit one is literally there so busy machines don't run out of room, which is so thoughtful ๐Ÿฅน

   --******************** Discovered SCSI Target Device group ********
   scsiRemoteTgtDev OBJECT IDENTIFIER ::= { scsiInitiatorDevice 3 }

   -- SCSI target device discovered or authorized to attach each of the
   -- SCSI initiator ports of each SCSI initiator device of each
   -- instance.

   scsiDscTgtTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF ScsiDscTgtEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table includes all the remote (not in the local system)
        SCSI target ports that are authorized to attach to each local
        SCSI initiator port of this SCSI instance."
   ::= { scsiRemoteTgtDev 1 }

   scsiDscTgtEntry OBJECT-TYPE
      SYNTAX         ScsiDscTgtEntry
      MAX-ACCESS     not-accessible
      STATUS         current
      DESCRIPTION
        "Each entry (row) contains information about the SCSI target
        device or port to which this SCSI initiator port (or all SCSI
        initiator ports in the SCSI initiator entry indexed by
        scsiInstIndex, scsiDeviceIndex) will attempt to attach.  The
        entry is either for all local ports (if scsiDscTgtIntrPortIndex
        is zero) or only for the specific SCSI initiator port
        identified by scsiDscTgtIntrPortIndex.  Note that if an entry in
        this table is deleted, any corresponding entries in the
        scsiDscLunsTable must be deleted as well.
        The StorageType of a row in this table is specified by the
        instance of scsiInstStorageType that is INDEXed by the same
        value of scsiInstIndex."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiDscTgtIntrPortIndex,
      scsiDscTgtIndex }
   ::= { scsiDscTgtTable 1 }

   ScsiDscTgtEntry ::= SEQUENCE {
      scsiDscTgtIntrPortIndex ScsiPortIndexValueOrZero,
      scsiDscTgtIndex         ScsiIndexValue,
      scsiDscTgtDevOrPort     ScsiDeviceOrPort,
      scsiDscTgtName          ScsiName,
      scsiDscTgtConfigured    TruthValue,
      scsiDscTgtDiscovered    TruthValue,
      scsiDscTgtInCommands    Counter32,
      scsiDscTgtWrittenMegaBytes Counter32,
      scsiDscTgtReadMegaBytes Counter32,
      scsiDscTgtHSInCommands  Counter64,
      scsiDscTgtLastCreation  TimeStamp,
      scsiDscTgtRowStatus     RowStatus
   }

   scsiDscTgtIntrPortIndex OBJECT-TYPE
      SYNTAX      ScsiPortIndexValueOrZero
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object relates to a particular local device within a
        particular SCSI instance and specifies
        - the index of the local SCSI initiator port,
        - or zero, if this entry refers to the local device and
        therefore refers to all the local SCSI initiator ports."
   ::= { scsiDscTgtEntry 1 }

   scsiDscTgtIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object is an arbitrary integer used to uniquely identify
        a particular SCSI target device either discovered by, or
        configured for use with, one or more ports scsiDscTgtName of
        a particular device within a particular SCSI instance."
   ::= { scsiDscTgtEntry 2 }

   scsiDscTgtDevOrPort OBJECT-TYPE
      SYNTAX      ScsiDeviceOrPort
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object indicates whether this entry describes a
        configured SCSI target device name (and applies to all ports
        on the identified SCSI target device) or an individual SCSI
        target port."
   ::= { scsiDscTgtEntry 3 }

   scsiDscTgtName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object represents the name of this configured or
        discovered SCSI target device or port depending on the value
        of scsiDscTgtDevOrPort."
      ::= { scsiDscTgtEntry 4 }

   scsiDscTgtConfigured OBJECT-TYPE
      SYNTAX      TruthValue
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object means
         -true(1): this entry has been configured by an administrator.
         -false(2): this entry has been added from a discovery
        mechanism (e.g., SendTargets, SLP, iSNS).
        An administrator can modify this value from false to true."
      DEFVAL { true }
   ::= { scsiDscTgtEntry 5 }

   scsiDscTgtDiscovered OBJECT-TYPE
      SYNTAX      TruthValue
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object means
         -true(1): this entry has been discovered by the SCSI instance
         as result of an automatic discovery process.
         -false(2):this entry has been added by manual configuration.
        This entry is read-only because an administrator cannot change
        it.
        Note that it is an implementation decision to determine how
        long to retain a row with configured=false, such as when the
        SCSI target device is no longer visible/accessible to the local
        SCSI initiator device."
   ::= { scsiDscTgtEntry 6 }

   scsiDscTgtInCommands OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
         "This object represents the number of commands received from
         this SCSI target port or device.
         Discontinuities in the value of this counter can occur at re-
         initialization of the management system, and at other times as
         indicated by the value of scsiDscTgtLastCreation."
   ::= { scsiDscTgtEntry 7 }

   scsiDscTgtWrittenMegaBytes OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of megabytes of data sent as
        the result of WRITE commands to this SCSI target port or device.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiDscTgtLastCreation."
   ::= { scsiDscTgtEntry 8 }

last bit of this chunk is the discovered target device group ๐ŸŽฏ the scsiDscTgtTable tracks every remote target that's allowed to attach to each local initiator port, and each row can be either a whole device or one specific port. things like scsiDscTgtConfigured (set by an admin) versus scsiDscTgtDiscovered (found automatically) keep it all sorted, and the scsiDscTgtInCommands and megabyte counters track what's coming in from each target ๐Ÿ“ the whole table is so organized it's kind of iconic ๐Ÿ‘‘

okay so the MIB is still serving, and this next batch is all about the SCSI target and LUN tables ๐Ÿ’…โœจ

   scsiDscTgtReadMegaBytes OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of megabytes received as the
        result of READ commands to this SCSI target port or device.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiDscTgtLastCreation."
   ::= { scsiDscTgtEntry 9 }

   scsiDscTgtHSInCommands OBJECT-TYPE
      SYNTAX      Counter64
      UNITS       "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands received by this
        SCSI target port or device.  This object provides support for
        system that can quickly generate a large number of commands
        because they run at high speed.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiDscTgtLastCreation."
   ::= { scsiDscTgtEntry 10 }

   scsiDscTgtLastCreation OBJECT-TYPE
      SYNTAX      TimeStamp
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the value of sysUpTime when this row
        was created."
   ::= { scsiDscTgtEntry 11 }

   scsiDscTgtRowStatus OBJECT-TYPE
      SYNTAX      RowStatus
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object allows an administrator to configure dynamically a
        new entry in this table via SNMP or eventually delete it.
        An administrator is not allowed to delete an entry for which
        the value of the object scsiIntrDscTgtDiscovered is equal to
        true.
        Note that when an entry in this table is deleted, then any
        corresponding entries in the scsiDscLunsTable must also be
        automatically deleted.

        A newly created row cannot be made active until a value has
        been set for scsiDscTgtName.  In this case, the value of the
        corresponding instance of the scsiDscTgtRowStatus column will
        stay 'notReady'.
        The RowStatus TC [RFC2579] requires that this DESCRIPTION
        clause states under which circumstances other objects in this
        row can be modified:
        The value of this object has no effect on whether other objects
        in this conceptual row can be modified."
   ::= { scsiDscTgtEntry 12 }

the read counters are the vibe check for how much data is flowing in, and the row status is the bouncer that decides who gets to stay in the table ๐Ÿšช๐Ÿ’– the notReady thing is giving "not ready until you set a name" energy, no cap ๐Ÿ™ˆ

   --********************** LUNs discovered ***************************
   scsiDscLunTable OBJECT-TYPE
      SYNTAX          SEQUENCE OF ScsiDscLunEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "This table includes all the remote (not in the local system)
        logical unit numbers (LUNs) discovered via each local SCSI
        initiator port of each local device within a particular SCSI
        instance."
   ::= { scsiRemoteTgtDev 2 }

   scsiDscLunEntry OBJECT-TYPE
      SYNTAX          ScsiDscLunEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "An entry (row) represents a discovered LUN at a particular
        SCSI target device (scsiDscTgtIndex), where the LUN was
        discovered by a particular local SCSI initiator device within a
        particular SCSI instance, possibly via a particular local
        SCSI initiator port.
        Note that when an entry in the scsiDscTgtTable is deleted,
        all corresponding entries in this table should automatically be
        deleted."

      INDEX { scsiInstIndex, scsiDeviceIndex, scsiDscTgtIntrPortIndex,
      scsiDscTgtIndex, scsiDscLunIndex }
   ::= { scsiDscLunTable 1 }

   ScsiDscLunEntry ::= SEQUENCE {
      scsiDscLunIndex   ScsiIndexValue,
      scsiDscLunLun     ScsiLUN
   }

   scsiDscLunIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object is an arbitrary integer used to uniquely identify
        a particular LUN discovered by a particular SCSI initiator port
        or a particular SCSI initiator device within a particular SCSI
        instance.
        Entries in the scsiDscLunIdTable are associated with a LUN by
        having the value of this object in their INDEX."
   ::= { scsiDscLunEntry 1 }

   scsiDscLunLun  OBJECT-TYPE
      SYNTAX      ScsiLUN
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object contains the Logical Unit Number (LUN) of the
        discovered logical unit."
   ::= { scsiDscLunEntry 2 }

so the LUN table is basically the guest list of every discovered LUN, and each row is one LUN at one target device, found by one initiator ๐ŸŒธ๐Ÿงš it's giving very organised, very iconic ๐Ÿ‘‘

   --******************** LU Identifiers discovered *******************
   scsiDscLunIdTable OBJECT-TYPE
      SYNTAX          SEQUENCE OF ScsiDscLunIdEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "This table includes all the known LU identifiers of the remote
        (not in the local system) logical units discovered via each
        local SCSI initiator port or device of this SCSI instance."
   ::= { scsiRemoteTgtDev 3 }

   scsiDscLunIdEntry OBJECT-TYPE
      SYNTAX           ScsiDscLunIdEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION

        "An entry (row) represents the LU identifier of a discovered
        LUN at a particular SCSI target device (scsiDscTgtIndex), where
        the LUN was discovered by a particular local SCSI initiator
        device within a particular SCSI instance, possibly via a
        particular local SCSI initiator port."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiDscTgtIntrPortIndex,
      scsiDscTgtIndex, scsiDscLunIndex, scsiDscLunIdIndex }
   ::= { scsiDscLunIdTable 1 }

   ScsiDscLunIdEntry ::= SEQUENCE {
      scsiDscLunIdIndex       ScsiIndexValue,
      scsiDscLunIdCodeSet     ScsiIdCodeSet,
      scsiDscLunIdAssociation ScsiIdAssociation,
      scsiDscLunIdType        ScsiIdType,
      scsiDscLunIdValue       ScsiIdValue
   }

   scsiDscLunIdIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object is an arbitrary integer used to uniquely identify
        a particular LUN identifier discovered by each SCSI initiator
        device or particular SCSI initiator port within a particular
        SCSI instance."
   ::= { scsiDscLunIdEntry 1 }

   scsiDscLunIdCodeSet OBJECT-TYPE
      SYNTAX          ScsiIdCodeSet
      MAX-ACCESS      read-only
      STATUS          current
      DESCRIPTION
        "This object specifies the code set in use with this
        identifier.  The value is represented in the same format as
        is contained in the identifier's Identification Descriptor
        within the logical unit's Device Identification Page."
      REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
   ::= { scsiDscLunIdEntry 2 }

   scsiDscLunIdAssociation OBJECT-TYPE
      SYNTAX          ScsiIdAssociation
      MAX-ACCESS      read-only
      STATUS          current
      DESCRIPTION

        "This object specifies what the identifier is associated with
        (e.g., with the addressed physical/logical device or with a
        particular port).  The value is represented in the same format
        as is contained in the identifier's Identification Descriptor
        within the logical unit's Device Identification Page."
      REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
   ::= { scsiDscLunIdEntry 3 }

   scsiDscLunIdType OBJECT-TYPE
      SYNTAX          ScsiIdType
      MAX-ACCESS      read-only
      STATUS          current
      DESCRIPTION
        "This object specifies the type of the identifier.
        The value is represented in the same format as is contained in
        the identifier's Identification Descriptor within the logical
        unit's Device Identification Page."
      REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
   ::= { scsiDscLunIdEntry 4 }

   scsiDscLunIdValue OBJECT-TYPE
      SYNTAX         ScsiIdValue
      MAX-ACCESS     read-only
      STATUS         current
      DESCRIPTION
        "This object represents the actual value of this identifier.
        The format is defined by the objects scsiDscLunIdCodeSet,
        scsiDscLunIdAssociation, scsiDscLunIdType.
        The value is represented in the same format as is contained in
        the identifier's Identification Descriptor within the logical
        unit's Device Identification Page."
        REFERENCE
          "ANSI - SCSI Primary Commands - 2 (SPC-2),
          ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
          Vital Product Data Parameters [SPC2]"
   ::= { scsiDscLunIdEntry 5 }

the LU identifiers are the ID badges for each LUN, with the code set, association, type and value all riding together ๐Ÿชช๐Ÿ’œ every one of them points back to SPC-2 section 8.4.4, so the receipts are there bestie ๐Ÿ“š

   --***** Table of SCSI Target Device Attached to local SCSI
   --***** Initiator Ports
   scsiAttTgtPortTable OBJECT-TYPE
      SYNTAX   SEQUENCE OF ScsiAttTgtPortEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table includes all the remote (not in the local system)
        SCSI target ports that are currently attached to each local
        SCSI initiator port of this SCSI instance."
   ::= { scsiRemoteTgtDev 4 }

   scsiAttTgtPortEntry OBJECT-TYPE
      SYNTAX           ScsiAttTgtPortEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "An entry (row) represents a remote SCSI target port
        (scsiAttTgtPortIndex) currently attached to a particular
        SCSI initiator port (scsiPortIndex) of a particular SCSI
        initiator device within a particular SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiPortIndex,
      scsiAttTgtPortIndex }
   ::= { scsiAttTgtPortTable 1 }

   ScsiAttTgtPortEntry ::= SEQUENCE {
      scsiAttTgtPortIndex     ScsiIndexValue,
      scsiAttTgtPortDscTgtIdx ScsiIndexValueOrZero,
      scsiAttTgtPortName      ScsiName,
      scsiAttTgtPortIdentifier   ScsiIdentifier
   }

   scsiAttTgtPortIndex  OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An arbitrary integer used to uniquely identify a particular
        SCSI target currently attached to a particular SCSI initiator
        port of a particular SCSI initiator device within a particular
        SCSI instance."
   ::= { scsiAttTgtPortEntry 1 }

   scsiAttTgtPortDscTgtIdx OBJECT-TYPE
      SYNTAX      ScsiIndexValueOrZero
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object contains the value of the scsiDscTgtIntrPortIndex
        index variable for the row in the scsiDscTgtTable representing
        this currently attached SCSI target port.  If the currently
        attached SCSI target port is not represented in the
        scsiDscTgtTable, then the value of this object is zero."

   ::= { scsiAttTgtPortEntry 2 }

   scsiAttTgtPortName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object contains the name of the attached SCSI target
        port."
   ::= { scsiAttTgtPortEntry 3 }

   scsiAttTgtPortIdentifier OBJECT-TYPE
      SYNTAX      ScsiIdentifier
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object contains the identifier of the attached SCSI
        target port."
   ::= { scsiAttTgtPortEntry 4 }

the attached-target table is the "who's currently plugged into my initiator port" list ๐Ÿ”Œ๐ŸŒˆ and the scsiAttTgtPortDscTgtIdx is the cute little pointer back to the discovered-target table, with a zero if that target isn't in there ๐Ÿ’… more MIB goodness coming, we're not done yet ๐Ÿฆ‹

Okay bestie, the MIB is where the real magic happens ๐Ÿงšโœจ We're still in the Object Definitions era, and this part is all about the SCSI target device table, the target port table, and the authorized remote initiator table. Every object is spelled out exactly as the spec has it, so your implementation can't be off by a single character ๐Ÿ’…

   -- *****************************************************************
   -- ***** Table of SCSI Target devices
   --
   scsiTgtDevTable OBJECT-TYPE
      SYNTAX   SEQUENCE OF ScsiTgtDevEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "This table contains information about each local SCSI target
        device."
   ::= { scsiTargetDevice 1 }

   scsiTgtDevEntry OBJECT-TYPE
      SYNTAX           ScsiTgtDevEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "An entry (row) containing information applicable to a
        particular local SCSI target device within a particular SCSI
        instance."
      INDEX { scsiInstIndex, scsiDeviceIndex }
   ::= { scsiTgtDevTable 1 }

   ScsiTgtDevEntry ::= SEQUENCE {
      scsiTgtDevNumberOfLUs   Gauge32,
      scsiTgtDeviceStatus     INTEGER,
      scsiTgtDevNonAccessibleLUs Gauge32,
      scsiTgtDevResets        Counter32

   }

   scsiTgtDevNumberOfLUs OBJECT-TYPE
      SYNTAX      Gauge32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object is the number of logical units accessible via this
        local SCSI target device."
   ::= { scsiTgtDevEntry 1 }

   scsiTgtDeviceStatus  OBJECT-TYPE
      SYNTAX      INTEGER {
         unknown(1),
         available(2),
         broken(3),
         readying(4),
         abnormal(5),
         nonAddrFailure(6),
         nonAddrFailReadying(7),
         nonAddrFailAbnormal(8)
      }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the status of this SCSI device,
        summarizing the state of both the addressable devices (i.e.,
        the logical units) and the non-addressable devices within this
        SCSI device:
             - unknown(1): This value is used when the status cannot be
             determined
             - available(2): All addressable and non-addressable
             devices within the SCSI device are fully operational (i.e.,
             no logical units have an abnormal status).
             - broken(3): The SCSI device is not operational and cannot
             be made operational without external intervention.
             - readying(4): One or more logical units within the SCSI
             device are being initialized and access to the SCSI device
             is temporarily limited (i.e., one or more of the logical
             units have a readying status).
             - abnormal(5): One or more addressable devices within the
             SCSI device are indicating a status other than available;
             nevertheless, the SCSI device is operational (i.e., one or
             more of the logical units have an abnormal status).
             - nonAddrFailure(6): One or more non-addressable devices
             within the SCSI device have failed; nevertheless, the SCSI
             device is operational (i.e., no logical units have an
             abnormal or readying status).

             - nonAddrFailReadying(7): One or more non-addressable
             devices within the SCSI device have failed; nevertheless,
             one or more logical units within the SCSI device are being
             initialized and access to the SCSI device is temporarily
             limited.
             - nonAddrFailAbnormal(8): One or more non-addressable
             devices within the SCSI device have failed and one or more
             addressable devices within the SCSI device are indicating a
             status other than available; however, the SCSI device is
             operational.
        "
      REFERENCE
        "SCSI Controller Commands-2 (SCC-2) ANSI INCITS 318-1998
        6.3.1.8 REPORT STATES service action [SCC2]"
   ::= { scsiTgtDevEntry 2}

   scsiTgtDevNonAccessibleLUs OBJECT-TYPE
      SYNTAX      Gauge32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object is the number of logical units existing but not
        currently accessible via this local SCSI target device."
   ::= { scsiTgtDevEntry 3 }

   scsiTgtDevResets     OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object counts the number of hard resets encountered
        by this SCSI target device.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
      REFERENCE
         "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
         T10 Project 1157-D, 12 September 2002 - Chapter 5.9.7 [SAM2]"
   ::= { scsiTgtDevEntry 4 }


   --******************** SCSI Target Port Table *********************
   scsiTgtPortTable OBJECT-TYPE
      SYNTAX   SEQUENCE OF ScsiTgtPortEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table includes all the local SCSI target ports of all the
        local SCSI target devices."

   ::= { scsiTargetDevice 2 }

   scsiTgtPortEntry OBJECT-TYPE
      SYNTAX   ScsiTgtPortEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An entry (row) containing information applicable to a
        particular local SCSI target port of a particular local SCSI
        target device within a particular SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiPortIndex}
   ::= { scsiTgtPortTable 1 }

   ScsiTgtPortEntry ::= SEQUENCE {
      scsiTgtPortName         ScsiName,
      scsiTgtPortIdentifier   ScsiIdentifier,
      scsiTgtPortInCommands   Counter32,
      scsiTgtPortWrittenMegaBytes   Counter32,
      scsiTgtPortReadMegaBytes   Counter32,
      scsiTgtPortHSInCommands Counter64
   }

   scsiTgtPortName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the name of the port assigned for use
        in the SCSI protocol."
   ::= { scsiTgtPortEntry 1 }

   scsiTgtPortIdentifier OBJECT-TYPE
      SYNTAX      ScsiIdentifier
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the identifier of the port in one of
        the format(s) appropriate for the type of transport."
   ::= { scsiTgtPortEntry 2 }

   scsiTgtPortInCommands OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands received by this
        SCSI target port.

        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiTgtPortEntry 3 }

   scsiTgtPortWrittenMegaBytes OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of data written in megabytes
        by this SCSI target port.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiTgtPortEntry 4 }

   scsiTgtPortReadMegaBytes OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of data read in megabytes by
        this SCSI target port.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiTgtPortEntry 5 }

   scsiTgtPortHSInCommands OBJECT-TYPE
      SYNTAX      Counter64
      UNITS    "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands received.  This
        object provides support for systems that can quickly generate a
        large number of commands because they run at high speed.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system."
   ::= { scsiTgtPortEntry 6 }

   scsiRemoteIntrDev OBJECT IDENTIFIER ::= { scsiTargetDevice 3 }

   -- The scsiAuthorizedIntrTable contains the list of remote initiator
   -- ports that are authorized to be attached to specific SCSI target
   -- ports and on which an administrator would like to keep permanent
   -- information and long term statistics even when not currently
   -- attached.

   scsiAuthorizedIntrTable OBJECT-TYPE
      SYNTAX   SEQUENCE OF ScsiAuthorizedIntrEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table includes all the authorized SCSI initiator devices
        or ports that may attach a SCSI target device
        (ScsiAuthIntrTgtPortIndex = 0) or port (ScsiAuthIntrTgtPortIndex
        different than 0) of the local SCSI instance.  Statistics are
        kept for each such authorization; thus, the authorizations
        should be configured in the manner that will cause the desired
        set of statistics to be collected and that will determine the
        correct LUN map."
   ::= { scsiRemoteIntrDev 1 }

   scsiAuthorizedIntrEntry OBJECT-TYPE
      SYNTAX      ScsiAuthorizedIntrEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An entry (row) represents a remote SCSI initiator port or
        remote SCSI initiator device that may attach to the local SCSI
        target port or device within a particular SCSI instance.
        The StorageType of a row in this table is specified by the
        instance of scsiInstStorageType that is INDEXed by the same
        value of scsiInstIndex."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiAuthIntrTgtPortIndex,
      scsiAuthIntrIndex }
   ::= { scsiAuthorizedIntrTable 1 }

   ScsiAuthorizedIntrEntry ::= SEQUENCE {
      scsiAuthIntrTgtPortIndex   ScsiPortIndexValueOrZero,
      scsiAuthIntrIndex          ScsiIndexValue,
      scsiAuthIntrDevOrPort      ScsiDeviceOrPort,
      scsiAuthIntrName           ScsiName,
      scsiAuthIntrLunMapIndex    ScsiIndexValueOrZero,
      scsiAuthIntrAttachedTimes  Counter32,
      scsiAuthIntrOutCommands    Counter32,
      scsiAuthIntrReadMegaBytes  Counter32,
      scsiAuthIntrWrittenMegaBytes  Counter32,
      scsiAuthIntrHSOutCommands  Counter64,
      scsiAuthIntrLastCreation   TimeStamp,
      scsiAuthIntrRowStatus      RowStatus
   }


   scsiAuthIntrTgtPortIndex OBJECT-TYPE
      SYNTAX      ScsiPortIndexValueOrZero
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object contains either the index of the port or zero, to
        indicate any port, on the particular local SCSI target device."
   ::= { scsiAuthorizedIntrEntry 1 }

   scsiAuthIntrIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object is an arbitrary integer used to uniquely identify
        a SCSI initiator device or port that is authorized to attach
        to a particular local SCSI target device or port of a particular
        SCSI instance."
   ::= { scsiAuthorizedIntrEntry 2 }

   scsiAuthIntrDevOrPort OBJECT-TYPE
      SYNTAX      ScsiDeviceOrPort
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object specifies whether this entry refers to a remote
        SCSI initiator port or to a SCSI initiator device.
        A value of device(1) means that the authorized remote initiator
        is a SCSI initiator device and includes all of its ports.
        A value of port(2) means that the authorized remote initiator
        is a SCSI initiator port."
   ::= { scsiAuthorizedIntrEntry 3 }

Next up: the rest of the authorized initiator objects, so stay tuned ๐Ÿฆ‹๐Ÿ’–

okay so we're still deep in the Object Definitions ๐Ÿ’… this is the auth initiator table getting its full glow-up, let's go ๐Ÿซถ

   scsiAuthIntrName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object represents the name of the remote SCSI initiator
        device or port authorized by this row."
   ::= { scsiAuthorizedIntrEntry 4 }

   scsiAuthIntrLunMapIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValueOrZero
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object identifies the set of entries in the
        scsiLunMapTable for which scsiLunMapIndex has the same value as
        the value of this object.  The identified set of entries
        constitutes the LUN map to be used for accessing logical units
        when the remote SCSI initiator port or device corresponding to
        this entry is attached to any local SCSI target port or device
        corresponding to this entry.
        Note that this object has a value of zero if this entry should
        use the default LUN map."
   ::= { scsiAuthorizedIntrEntry 5 }

   scsiAuthIntrAttachedTimes  OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "Times"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates the number of times that this remote
        SCSI initiator device or port has transitioned from unattached
        to attached to this local SCSI target device or port.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiAuthIntrLastCreation."
   ::= { scsiAuthorizedIntrEntry 6 }

   scsiAuthIntrOutCommands OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates the number of commands that the remote
        SCSI initiator device or port corresponding to this entry has
        sent to the local SCSI target device or port corresponding to
        this entry.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiAuthIntrLastCreation."
   ::= { scsiAuthorizedIntrEntry 7 }

   scsiAuthIntrReadMegaBytes  OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates the amount of data in megabytes that
        the remote SCSI initiator device or port corresponding to this
        entry has read from the local SCSI target device or port
        corresponding to this entry.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiAuthIntrLastCreation."
   ::= { scsiAuthorizedIntrEntry 8 }

   scsiAuthIntrWrittenMegaBytes  OBJECT-TYPE
      SYNTAX      Counter32
      UNITS    "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates the amount of data in megabytes that the
        remote SCSI initiator device or port corresponding to this
        entry has written to the local SCSI target device or port
        corresponding to this entry.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiAuthIntrLastCreation."
   ::= { scsiAuthorizedIntrEntry 9}

   scsiAuthIntrHSOutCommands  OBJECT-TYPE
      SYNTAX      Counter64
      UNITS    "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands sent by the
        remote SCSI initiator device or port corresponding to this
        entry to the local SCSI target device or port corresponding to
        this entry.  This object provides support for systems that can
        quickly generate a large number of commands because they run at
        high speed.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiAuthIntrLastCreation."
   ::= { scsiAuthorizedIntrEntry 10 }

   scsiAuthIntrLastCreation OBJECT-TYPE
      SYNTAX      TimeStamp
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates the value of sysUpTime when this row was
        last created."
   ::= { scsiAuthorizedIntrEntry 11 }

   scsiAuthIntrRowStatus OBJECT-TYPE
      SYNTAX      RowStatus
      MAX-ACCESS  read-create
      STATUS      current
      DESCRIPTION
        "This object allows an administrator to create or delete this
        entry.
        A newly created row cannot be made active until a value has
        been set for scsiAuthIntrName.  In this case, the value of the
        corresponding instance of the scsiAuthIntrRowStatus column will
        stay 'notReady'.
        The RowStatus TC [RFC2579] requires that this DESCRIPTION
        clause states under which circumstances other objects in this
        row can be modified:
        The value of this object has no effect on whether other objects
        in this conceptual row can be modified."
   ::= { scsiAuthorizedIntrEntry 12 }

the RowStatus one is kind of a plot twist ๐Ÿ‘€ a brand new row can't go active until scsiAuthIntrName has a value, and until then scsiAuthIntrRowStatus just sits at 'notReady' ๐Ÿ™ˆ and the RFC cites [RFC2579] for the RowStatus TC, which is the whole reason that DESCRIPTION has to spell out when other objects in the row can be changed ๐Ÿ’œ

   -- Table of SCSI initiator devices or ports attached to local
   -- SCSI target ports
   --

   scsiAttIntrPortTable OBJECT-TYPE
      SYNTAX  SEQUENCE OF ScsiAttIntrPortEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "This table includes all the remote SCSI initiator ports that
        are currently attached to a local SCSI target port of all local
        devices within all SCSI instances."
   ::= { scsiRemoteIntrDev 2 }

   scsiAttIntrPortEntry OBJECT-TYPE
      SYNTAX          ScsiAttIntrPortEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "An entry (row) represents a remote SCSI initiator port
        currently attached to a particular local SCSI target port of a
        particular SCSI target device of a particular SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiPortIndex,
      scsiAttIntrPortIndex }
   ::= { scsiAttIntrPortTable 1 }

   ScsiAttIntrPortEntry ::= SEQUENCE {
      scsiAttIntrPortIndex    ScsiIndexValue,
      scsiAttIntrPortAuthIntrIdx ScsiIndexValueOrZero,
      scsiAttIntrPortName     ScsiName,
      scsiAttIntrPortIdentifier       ScsiIdentifier
   }
   scsiAttIntrPortIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object represents an arbitrary integer used to uniquely
        identify a particular attached remote initiator port to a
        particular SCSI target port within a particular SCSI target
        device within a particular SCSI instance."
   ::= { scsiAttIntrPortEntry 1 }

   scsiAttIntrPortAuthIntrIdx OBJECT-TYPE
      SYNTAX      ScsiIndexValueOrZero
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object is the corresponding index in the
        scsiAuthorizedIntrTable for this current attached remote
        SCSI initiator device or zero if this remote attached SCSI
        initiator device is not configured in that table."
   ::= { scsiAttIntrPortEntry 2 }

   scsiAttIntrPortName OBJECT-TYPE
      SYNTAX      ScsiName
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the name of the remote SCSI initiator
        device attached to this local SCSI target port."
   ::= { scsiAttIntrPortEntry 3 }

   scsiAttIntrPortIdentifier OBJECT-TYPE
      SYNTAX      ScsiIdentifier
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the identifier of the remote SCSI
        initiator device attached to this local SCSI target port."
   ::= { scsiAttIntrPortEntry 4 }

the attached initiator table is basically the "who's currently plugged in" list ๐Ÿ”Œ every row is a remote initiator port hooked up to a particular local target port, and scsiAttIntrPortAuthIntrIdx is the link back to the auth table, or zero if that initiator isn't configured there at all ๐Ÿฆ‹

   --****************** Managed Objects regarding logical units *******
   scsiLuTable OBJECT-TYPE
      SYNTAX   SEQUENCE OF ScsiLuEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table contains the logical units exposed by local SCSI
        target devices.

        It includes attributes for the World Wide Name (WWN),
        scsiLuVendorId, scsiLuProductId, and scsiLuRevisionId, which may
        also appear in the scsiLuIdTable.  If an implementation exposes
        a WWN as a LuIdTable entry, it must match the scsiLuWwnName in
        this table.  If an implementation exposes a (vendor, product,
        revision) identifier as an LuIdTable entry, each of these fields
        must match the scsiLuVendorId, scsiLuProductId, and
        scsiLuRevisionId attributes in this table."
   ::= { scsiLogicalUnit 1 }

   scsiLuEntry OBJECT-TYPE
      SYNTAX      ScsiLuEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An entry (row) contains information applicable to a particular
        logical unit of a particular local SCSI target device within a
        particular SCSI instance."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiLuIndex}
   ::= { scsiLuTable 1 }

   ScsiLuEntry ::= SEQUENCE {
      scsiLuIndex          ScsiIndexValue,
      scsiLuDefaultLun     ScsiLUN,
      scsiLuWwnName        ScsiLuNameOrZero,
      scsiLuVendorId       SnmpAdminString,
      scsiLuProductId      SnmpAdminString,
      scsiLuRevisionId     SnmpAdminString,
      scsiLuPeripheralType Unsigned32,
      scsiLuStatus         INTEGER,
      scsiLuState          BITS,
      scsiLuInCommands     Counter32,
      scsiLuReadMegaBytes  Counter32,
      scsiLuWrittenMegaBytes     Counter32,
      scsiLuInResets       Counter32,
      scsiLuOutTaskSetFullStatus    Counter32,
      scsiLuHSInCommands   Counter64,
      scsiLuLastCreation   TimeStamp
   }

   scsiLuIndex OBJECT-TYPE
      SYNTAX      ScsiIndexValue
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This object represents an arbitrary integer used to uniquely
        identify a particular logical unit within a particular SCSI
        target device within a particular SCSI instance."

   ::= { scsiLuEntry 1 }

   scsiLuDefaultLun OBJECT-TYPE
      SYNTAX      ScsiLUN
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the default Logical Unit Number (LUN)
        for this logical unit; if a SCSI initiator device has not been
        configured to view this logical unit via an entry in the
        ScsiLunMapTable, the LU will be visible as scsiLuDefaultLun.
        If this logical unit does not have a default LUN, it will only
        be visible if specified via the ScsiLunMapTable, and this
        object will contain a zero-length string."
   ::= { scsiLuEntry 2 }

   scsiLuWwnName OBJECT-TYPE
      SYNTAX      ScsiLuNameOrZero
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the World Wide Name of this LU that is
        the device identifier of the Vital Product Data (VPD) page name;
        if there is no WWN for this LU, this object will contain a
        zero-length string.  If there is more than one identifier, they
        will be listed in the scsiLuIdTable and this object will contain
        a zero-length string."
   ::= { scsiLuEntry 3 }

   scsiLuVendorId OBJECT-TYPE
      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents a string identifying the vendor of this
        LU as reported in the Standard INQUIRY data."
   ::= { scsiLuEntry 4 }

the logical unit table is where the LUs get their whole identity era ๐Ÿงš the scsiLuTable intro is pretty strict about matching: if an implementation exposes a WWN as an LuIdTable entry, it must match scsiLuWwnName, and if it exposes a (vendor, product, revision) identifier, each field must match its matching scsiLuVendorId, scsiLuProductId, and scsiLuRevisionId attribute ๐Ÿ’… and scsiLuDefaultLun can be a zero-length string if the LU has no default LUN, which means it's only visible when the ScsiLunMapTable says so ๐Ÿซถ

okay so this is where the logical unit gets its whole personality ๐Ÿ’… the next batch of objects covers its product name, revision, and peripheral type, plus its status and state, and then a bunch of counters that keep track of what it's been up to ๐Ÿฆ‹

the first three are all read-only strings and numbers that come straight from the Standard INQUIRY data, so you can literally see who this LU claims to be ๐ŸŽ€

   scsiLuProductId OBJECT-TYPE
      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents a string identifying the product for
        this LU as reported in the Standard INQUIRY data."
   ::= { scsiLuEntry 5 }

   scsiLuRevisionId OBJECT-TYPE

      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents a string defining the product revision
        of this LU as reported in the Standard INQUIRY data."
   ::= { scsiLuEntry 6 }

   scsiLuPeripheralType OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object is the value returned by SCSI Standard INQUIRY
        data.  It can be: direct-access device, sequential-access
        device, printer, communication device and so on.
        The values that can be returned here are defined in SCSI
        Primary Commands -2."
      REFERENCE
        "ANSI - SCSI Primary Commands - 2 (SPC-2),
        ANSI INCITS 351-2001,11 July 2001 [SPC2]- Table 48."
   ::= { scsiLuEntry 7 }

the peripheral type is the number from Standard INQUIRY data, and the values it can take are defined in SCSI Primary Commands -2 (that's [SPC2], Table 48) ๐Ÿงš it covers things like direct-access devices, sequential-access devices, printers, and communication devices, among others ๐Ÿ“

now the status, which is the big "how are you doing" object โœจ it's an INTEGER with six possible answers, and it's read-only like everything else in this group:

   scsiLuStatus   OBJECT-TYPE
      SYNTAX      INTEGER {
         unknown(1),
         available(2),
         notAvailable(3),
         broken(4),
         readying(5),
         abnormal(6)
      }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the status of this logical unit:
          - unknown(1): The status of this logical unit cannot be
          determined.
          - available(2): The logical unit is fully operational (i.e.,
          accepts media access SCSI commands and has no state
          information to report).
          - notAvailable(3): The logical unit is capable of being
          supported but is not available (i.e., no logical unit is
          currently present or the logical unit is present but not
          configured for use).
          - broken(4): The logical unit has failed and cannot respond
          to SCSI commands.
          - readying(5): The logical unit is being initialized and
          access is temporarily limited.
          - abnormal(6): The logical unit has state information
          available that indicates it is operating with limits.  The
          scsiLuState indicates what those limits are.
        "
      REFERENCE
        "SCSI Controller Commands-2 (SCC-2) ANSI INCITS 318-1998
        6.3.1.8 REPORT STATES service action [SCC2]"
   ::= { scsiLuEntry 8 }

so the possible answers are: unknown(1) when the status can't be figured out, available(2) when it's fully operational, notAvailable(3) when it could be supported but isn't around or isn't configured, broken(4) when it's failed and can't respond to SCSI commands, readying(5) when it's being initialized and access is temporarily limited, and abnormal(6) when it's running with limits ๐Ÿ˜ญ for abnormal(6), the scsiLuState object tells you what those limits are ๐Ÿ‘€

and that brings us to scsiLuState, which is a BITS object. each bit is its own little flag, and the description explains what each one means:

   scsiLuState OBJECT-TYPE
      SYNTAX      BITS {
         dataLost(0),
         dynamicReconfigurationInProgress(1),
         exposed(2),
         fractionallyExposed(3),
         partiallyExposed(4),
         protectedRebuild(5),
         protectionDisabled(6),
         rebuild(7),
         recalculate(8),
         spareInUse(9),
         verifyInProgress(10)
      }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the state of a logical unit and its
        meaning according to the bit position:
             0 Data lost: Within the logical unit data has been lost.
             1 Dynamic reconfiguration in progress: The logical unit is
                  being reconfigured.  In this state all data is still
                  protected.
             2 Exposed: Within the logical unit data is not protected.
                  In this state all data is still valid; however, loss
                  of data or data availability is unavoidable in the
                  event of a failure.
             3 Fractionally exposed: Within the logical unit part of
                  the data is not protected.  In this state all data is
                  still valid; however, a failure may cause a loss of
                  data or a loss of data availability.
             4 Partially exposed: Within the logical unit one or more
                  underlying storage devices have failed.  In this state
                  all data is still protected.
             5 Protected rebuild: The logical unit is in the process of
                  a rebuild operation.  In this state all data is
                  protected.
             6 Protection disabled: Within the logical unit the data

                  protection method has been disabled.
                  In this state all data is still valid; however,
                  loss of data or data availability is unavoidable
                  in the event of a failure.
             7 Rebuild: The data protection method is in the process of
                  rebuilding data.  In this state data is not protected.
             8 Recalculate: The logical unit is in the process of a
                  recalculate operation.
             9 Spare in use: Within the logical unit a storage device
                  in full or part is being used to store data.  In this
                  state all data is still protected.
             10 Verify in progress: Within the logical unit data is
                  being verified."
        REFERENCE
         "SCSI Controller Commands-2 (SCC-2) ANSI INCITS 318-1998
          6.3.1.8 REPORT STATES service action [SCC2]"
   ::= { scsiLuEntry 9 }

this one is a whole mood ๐ŸŒˆ bit 0 is data lost, bit 1 is dynamic reconfiguration in progress, bit 2 is exposed, bit 3 is fractionally exposed, bit 4 is partially exposed, bit 5 is protected rebuild, bit 6 is protection disabled, bit 7 is rebuild, bit 8 is recalculate, bit 9 is spare in use, and bit 10 is verify in progress ๐ŸŽ€

the "exposed" family is the one to watch ๐Ÿ™ˆ for exposed, fractionally exposed, and protection disabled, the description says data is still valid but losing it or losing availability is unavoidable if something fails. so, not me having a panic over that ๐Ÿ’€

next up are the counters. they're all read-only and they all share the same discontinuity note, which says the value can jump when the management system re-initializes and at other times shown by scsiLuLastCreation ๐Ÿ“

   scsiLuInCommands OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands received by this
        logical unit.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiLuLastCreation."
   ::= { scsiLuEntry 10 }

   scsiLuReadMegaBytes OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of data in megabytes read
        from this logical unit.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiLuLastCreation."
   ::= { scsiLuEntry 11 }

   scsiLuWrittenMegaBytes OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "Megabytes"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the amount of data in megabytes written
        to this logical unit.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiLuLastCreation."
   ::= { scsiLuEntry 12 }

   scsiLuInResets OBJECT-TYPE
      SYNTAX      Counter32
      UNITS       "resets"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of times that this logical
        unit received
        - a LOGICAL UNIT RESET or TARGET RESET task management request,
        or
        - any other SCSI transport protocol-specific action or event
        that causes a Logical Unit Reset or a Hard Reset at a SCSI
        target port of the containing device
        ([SAM2] Chapters 5.9.6, 5.9.7).
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiLuLastCreation."
      REFERENCE
        "SCSI Architecture Model-2 (SAM-2), ANSI INCITS 366-2003,
        T10 Project 1157-D, 12 September 2002 - Chapter 5.9.7 [SAM2]"
   ::= { scsiLuEntry 13 }

   scsiLuOutTaskSetFullStatus    OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of Task Set full statuses
        issued for this logical unit.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiLuLastCreation."
   ::= { scsiLuEntry 14 }

   scsiLuHSInCommands OBJECT-TYPE
      SYNTAX      Counter64
      UNITS       "commands"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object represents the number of commands received by this
        logical unit.  This object provides support for systems that can
        quickly generate a large number of commands because they run at
        high speed.
        Discontinuities in the value of this counter can occur at re-
        initialization of the management system, and at other times as
        indicated by the value of scsiLuLastCreation."
   ::= { scsiLuEntry 15 }

   scsiLuLastCreation OBJECT-TYPE
      SYNTAX      TimeStamp
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
        "This object indicates the value of sysUpTime when this row was
        last created."
   ::= { scsiLuEntry 16 }

so scsiLuInCommands counts commands received, scsiLuReadMegaBytes and scsiLuWrittenMegaBytes count megabytes read and written, and scsiLuOutTaskSetFullStatus counts the Task Set full statuses issued for this logical unit ๐Ÿฆ‹ scsiLuHSInCommands is the 64-bit version of the commands counter, made for systems that can generate a huge number of commands because they run really fast ๐Ÿš€

scsiLuInResets counts how many times the LU got hit with a LOGICAL UNIT RESET or TARGET RESET task management request, or with any other SCSI transport protocol-specific action or event that causes a Logical Unit Reset or a Hard Reset at a SCSI target port of the containing device. that part points at [SAM2] Chapters 5.9.6 and 5.9.7, and its REFERENCE is the SCSI Architecture Model-2 document (ANSI INCITS 366-2003, T10 Project 1157-D, 12 September 2002, Chapter 5.9.7) ๐ŸŒธ

and finally scsiLuLastCreation is a TimeStamp that tells you the value of sysUpTime when the row was last created โฐ

now we get to the Logical Unit Identifier Table, which is its own little world ๐Ÿงš it's a table of identifiers for all the logical units exposed by the local SCSI target device, and each row is picked out by its scsiInstIndex, scsiDeviceIndex, scsiLuIndex, and scsiLuIdIndex:

   --****************** Logical Unit Identifier Table *****************
   scsiLuIdTable OBJECT-TYPE
      SYNTAX  SEQUENCE OF ScsiLuIdEntry
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
         "A table of identifiers for all logical units exposed by the
         local SCSI target device."
   ::= { scsiLogicalUnit 2 }

   scsiLuIdEntry OBJECT-TYPE
      SYNTAX      ScsiLuIdEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "An entry (row) containing information applicable to a
        particular identifier for a particular logical unit of a
        particular SCSI target device within a particular SCSI
        instance."
      INDEX {scsiInstIndex, scsiDeviceIndex, scsiLuIndex, scsiLuIdIndex}
   ::= { scsiLuIdTable 1 }

   ScsiLuIdEntry ::= SEQUENCE {
      scsiLuIdIndex        ScsiIndexValue,
      scsiLuIdCodeSet      ScsiIdCodeSet,
      scsiLuIdAssociation  ScsiIdAssociation,
      scsiLuIdType         ScsiIdType,
      scsiLuIdValue        ScsiIdValue
   }
   scsiLuIdIndex  OBJECT-TYPE
      SYNTAX          ScsiIndexValue
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "This object represents an arbitrary integer used to uniquely
        identify a particular LU identifier within a particular logical
        unit within a particular SCSI target device within a particular
        SCSI instance."
   ::= { scsiLuIdEntry 1 }

   scsiLuIdCodeSet OBJECT-TYPE
      SYNTAX           ScsiIdCodeSet
      MAX-ACCESS       read-only
      STATUS           current
      DESCRIPTION
        "This object specifies the code set in use with this
        identifier.  The value is represented in the same format as is
        contained in the identifier's Identification Descriptor within
        the logical unit's Device Identification Page."
      REFERENCE
        "ANSI - SCSI Primary Commands - 2 (SPC-2),
        ANSI INCITS 351-2001, 11 July 2001 Chapter 8: section 8.4.4,
        Vital Product Data Parameters [SPC2]"
   ::= { scsiLuIdEntry 2 }

   scsiLuIdAssociation OBJECT-TYPE
      SYNTAX           ScsiIdAssociation
      MAX-ACCESS       read-only
      STATUS           current
      DESCRIPTION
        "This object specifies what the identifier is associated with
        (e.g., with the addressed physical/logical device or with a
        particular port).  The value is represented in the same format
        as is contained in the identifier's Identification Descriptor
        within the logical unit's Device Identification Page."
      REFERENCE
        "ANSI - SCSI Primary Commands - 2 (SPC-2),
        ANSI INCITS 351-2001, 11 July 2001, Chapter 8: section 8.4.4,
        Vital Product Data Parameters [SPC2]"
   ::= { scsiLuIdEntry 3 }

the table itself is marked not-accessible, and so are its entries and the scsiLuIdIndex, which is just an arbitrary integer that uniquely identifies a particular LU identifier within its logical unit, target device, and SCSI instance ๐ŸŽ€ scsiLuIdCodeSet says which code set is in use with the identifier, and scsiLuIdAssociation says what the identifier is tied to, like the addressed physical or logical device or a particular port. both of those use the same format as the identifier's Identification Descriptor in the logical unit's Device Identification Page, and both point back to SPC-2 Chapter 8, section 8.4.4 ๐ŸŒˆ

okay bestie, we're picking up right where the last part left off ๐Ÿ’– this chunk is all about the logical unit ID stuff, the LUN map table, and the notifications, and honestly the MIB syntax is giving main character energy ๐ŸŽ€

First up is the identifier pair. scsiLuIdType tells you what kind of identifier you're looking at, and scsiLuIdValue holds the actual identifier itself. Both point back to the SPC-2 Vital Product Data Parameters, so the format lines up with the logical unit's Identification Descriptor. โœจ

   scsiLuIdType   OBJECT-TYPE
      SYNTAX           ScsiIdType
      MAX-ACCESS       read-only
      STATUS           current
      DESCRIPTION
        "This object specifies the type of the identifier.

        The value is represented in the same format as is contained in
        the identifier's Identification Descriptor within the logical
        unit's Device Identification Page."
      REFERENCE
        "ANSI - SCSI Primary Commands - 2 (SPC-2),
        ANSI INCITS 351-2001, 11 July 2001, Chapter 8: section 8.4.4,
        Vital Product Data Parameters [SPC2]"
   ::= { scsiLuIdEntry 4 }

   scsiLuIdValue OBJECT-TYPE
      SYNTAX         ScsiIdValue
      MAX-ACCESS     read-only
      STATUS         current
      DESCRIPTION
        "This object represents the actual value of this identifier.
        The format is defined by the objects scsiLuIdCodeSet,
        scsiLuIdAssociation, scsiLuIdType.
        The value is represented in the same format as is contained in
        the identifier's Identification Descriptor within the logical
        unit's Device Identification Page."
      REFERENCE
        "ANSI - SCSI Primary Commands - 2 (SPC-2),
        ANSI INCITS 351-2001, 11 July 2001, Chapter 8: section 8.4.4,
        Vital Product Data Parameters [SPC2]"
   ::= { scsiLuIdEntry 5 }

   --******************* The LUN Map Table ****************************

Next up is the LUN map table ๐Ÿฆ‹ It's the bit that lets one logical unit show up under a different Logical Unit Number for each SCSI initiator. The table entries are indexed by instance, device, map index, and LUN, and each row's StorageType comes from the matching instance. It's so good, I'm obsessed. ๐Ÿงš

   scsiLunMapTable OBJECT-TYPE
      SYNTAX   SEQUENCE OF ScsiLunMapEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
        "This table provides the ability to present a logical unit
        using different Logical Unit Numbers for different SCSI
        initiator devices.
        This table provides a mapping between a logical unit and a
        Logical Unit Number, and can be referenced by a
        ScsiAuthorizedIntrEntry to specify the LUN map for that
        initiator."
   ::= { scsiLogicalUnit 3 }

   scsiLunMapEntry OBJECT-TYPE
      SYNTAX          ScsiLunMapEntry
      MAX-ACCESS      not-accessible
      STATUS          current
      DESCRIPTION
        "An entry containing information about the mapping of a
        particular logical unit to a particular LUN.  The set of
        entries that all have the same values of scsiInstIndex,
        scsiDeviceIndex and scsiLunMapIndex constitutes a LUN map
        within a particular SCSI instance.
        The StorageType of a row in this table is specified by
        the instance of scsiInstStorageType that is INDEX-ed by
        the same value of scsiInstIndex."
      INDEX { scsiInstIndex, scsiDeviceIndex, scsiLunMapIndex,
      scsiLunMapLun}
   ::= { scsiLunMapTable 1 }

   ScsiLunMapEntry ::= SEQUENCE {
      scsiLunMapIndex      ScsiIndexValue,
      scsiLunMapLun        ScsiLUN,
      scsiLunMapLuIndex    ScsiIndexValue,
      scsiLunMapRowStatus  RowStatus
   }

   scsiLunMapIndex   OBJECT-TYPE
      SYNTAX           ScsiIndexValue
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "This object represents an arbitrary integer used to uniquely
        identify a particular LunMap within a particular SCSI target
        device within a particular SCSI instance."
   ::= { scsiLunMapEntry 1 }

   scsiLunMapLun     OBJECT-TYPE
      SYNTAX           ScsiLUN
      MAX-ACCESS       not-accessible
      STATUS           current
      DESCRIPTION
        "This object specifies the Logical Unit Number, to which a
        logical unit is mapped by this row."
   ::= { scsiLunMapEntry 2 }


   scsiLunMapLuIndex OBJECT-TYPE
      SYNTAX         ScsiIndexValue
      MAX-ACCESS     read-create
      STATUS         current
      DESCRIPTION
        "This object identifies the logical unit for which the value of
        scsiLuIndex is the same as the value of this object.  The
        identified logical unit is the one mapped to a LUN by this
        row."
   ::= { scsiLunMapEntry 3 }
   scsiLunMapRowStatus  OBJECT-TYPE
      SYNTAX          RowStatus
      MAX-ACCESS      read-create
      STATUS          current
      DESCRIPTION
        "This object allows an administrator to create and delete this
        entry."
   ::= { scsiLunMapEntry 4 }

   --********************** Notifications ******************************
   -- scsiNotifications OBJECT IDENTIFIER ::= { scsiMIB  2 }

   scsiNotificationsPrefix OBJECT IDENTIFIER
                                ::= { scsiNotifications 0 }

   scsiTgtDeviceStatusChanged NOTIFICATION-TYPE
      OBJECTS { scsiTgtDeviceStatus }
      STATUS  current
      DESCRIPTION
        "This notification will be generated for each occurrence of the
        abnormal status (e.g., if the SCSI target device's current
        status is abnormal) providing that the SCSI instance's value of
        scsiInstScsiNotificationsEnable is enabled.
        An SNMP agent implementing the SCSI MIB module should not send
        more than three SCSI identical notifications in any 10-second
        period."
   ::= { scsiNotificationsPrefix 1 }

   scsiLuStatusChanged NOTIFICATION-TYPE
      OBJECTS { scsiLuStatus }
      STATUS  current
      DESCRIPTION
        "This notification will be generated each time that
        scsiLuStatus changes providing that the SCSI instance's value
        of scsiInstScsiNotificationsEnable is enabled.
        An SNMP agent implementing the SCSI MIB module should not send
        more than three SCSI identical notifications in any 10-second
        period."
   ::= { scsiNotificationsPrefix 2 }

The notifications bit is where things get a little spicy ๐ŸŒธ Both of these are about status changes, and each one has a rate-limit note saying an SNMP agent should not send more than three identical notifications in any 10-second period. The text is lowercase in the original, so I'm keeping it exactly as is. ๐Ÿ™ˆ


Last stop in this chunk is the conformance section. It opens the compliance statement, which says that if one implementation can be both a SCSI target device and a SCSI initiator device, all the groups are mandatory. Then it works through the mandatory group, the optional-but-conditional groups for targets, initiators, statistics, and high-speed initiators. The whole thing is a big "if your box does X, include Y" checklist ๐Ÿ’…

   --******************************************************************
   -- The next part defines the conformance groups in use
   -- for SCSI MIB module.
   scsiCompliances OBJECT IDENTIFIER ::= { scsiConformance 1 }

   scsiCompliance MODULE-COMPLIANCE

      STATUS current
      DESCRIPTION
        "Describes the requirements for compliance to this SCSI MIB
         module.
        If an implementation can be both a SCSI target device and a SCSI
        initiator device, all groups are mandatory."
      MODULE  -- this module
         MANDATORY-GROUPS {
            scsiDeviceGroup
        }

        OBJECT scsiInstAlias
        MIN-ACCESS read-only
        DESCRIPTION
           "Write access is not mandatory."

        OBJECT scsiInstScsiNotificationsEnable
        MIN-ACCESS read-only
        DESCRIPTION
           "Write access is not mandatory."

        OBJECT scsiDeviceAlias
        MIN-ACCESS read-only
        DESCRIPTION
           "Write access is not mandatory."

        OBJECT scsiInstStorageType
        MIN-ACCESS   read-only
        DESCRIPTION
           "Write access is not required."

      -- Conditionally mandatory groups to be included with
      -- the mandatory groups when the implementation has
      -- SCSI target device.

        GROUP scsiTargetDeviceGroup
        DESCRIPTION
           "This group is mandatory for all SCSI implementations that
           have SCSI target devices."
        GROUP scsiLunMapGroup
        DESCRIPTION
          "This group is mandatory for systems having the capabilities
           of mapping local SCSI target devices and logical units
           according to remote SCSI initiator devices."

        OBJECT scsiAuthIntrDevOrPort
        MIN-ACCESS   read-only
        DESCRIPTION

         "Write access is not required."

        OBJECT scsiAuthIntrName
        MIN-ACCESS   read-only
        DESCRIPTION
         "Write access is not required."

        OBJECT scsiAuthIntrLunMapIndex
        MIN-ACCESS   read-only
        DESCRIPTION
         "Write access is not required."

        OBJECT scsiAuthIntrRowStatus
        SYNTAX RowStatus { active(1) }
        MIN-ACCESS   read-only
        DESCRIPTION
          "Write access is not required, and only one of the six
          enumerated values for the RowStatus textual convention need
          be supported, specifically: active(1)."

        GROUP scsiTgtDevLuNotificationsGroup
        DESCRIPTION
          "This group is mandatory for all SCSI implementations that
          have SCSI target devices and are able to report status
          changes."


      -- Conditionally mandatory groups to be included with
      -- the mandatory groups when the implementation has
      -- SCSI initiator device.

        GROUP scsiInitiatorDeviceGroup
        DESCRIPTION
          "This group is mandatory for all SCSI implementations that
          have SCSI initiator devices."

         OBJECT scsiIntrDevTgtAccessMode
         MIN-ACCESS read-only
         DESCRIPTION "Write access is not mandatory."

         GROUP scsiDiscoveryGroup
         DESCRIPTION
           "This group is mandatory for systems having the capabilities
           of discovering remote SCSI target devices via local SCSI
           initiator devices."

         OBJECT scsiLunMapLuIndex
         MIN-ACCESS read-only
         DESCRIPTION
           "Write access is not mandatory."

         OBJECT scsiLunMapRowStatus
         SYNTAX RowStatus { active(1) }
         MIN-ACCESS read-only
         DESCRIPTION
           "Write access is not required, and only one of the six
           enumerated values for the RowStatus textual convention need
           be supported, specifically: active(1)."

         OBJECT scsiDscTgtDevOrPort
         MIN-ACCESS read-only
         DESCRIPTION
           "Write access is not mandatory."

         OBJECT scsiDscTgtName
         MIN-ACCESS read-only
         DESCRIPTION "Write access is not mandatory."

         OBJECT scsiDscTgtConfigured
         SYNTAX TruthValue { false(2) }
         MIN-ACCESS read-only
         DESCRIPTION
           "The value of true(1) is not mandatory neither is the write
           access."

         OBJECT scsiDscTgtRowStatus
         SYNTAX RowStatus { active(1) }
         MIN-ACCESS read-only
         DESCRIPTION
           "Write access is not required, and only one of the six
           enumerated values for the RowStatus textual convention need
           be supported, specifically: active(1)."

   -- Conditionally mandatory groups to be included with the mandatory
   -- groups when the implementation can gather statistics.

        GROUP scsiDeviceStatGroup
        DESCRIPTION
          "This group is mandatory for all SCSI implementations that
          can gather statistics."

   -- Conditionally mandatory groups to be included with the mandatory
   -- groups when the implementation can gather statistics at the SCSI
   -- initiator device side.

        GROUP scsiInitiatorDevStatsGroup
        DESCRIPTION
          "This group is mandatory for all SCSI implementations that
          can gather statistics at SCSI initiator device side."

        GROUP scsiDiscoveryStatsGroup
        DESCRIPTION
          "This group is mandatory for system having the capabilities
          of gathering statistics regarding remote SCSI target devices
          via local SCSI initiator devices."

   -- Conditionally mandatory groups to be included with the mandatory
   -- groups when the implementation can gather statistics at the SCSI
   -- target side.

        GROUP scsiTargetDevStatsGroup
        DESCRIPTION
          "This group is mandatory for all SCSI implementations that
          can gather statistics at SCSI target devices."

        GROUP scsiLunMapStatsGroup
        DESCRIPTION
          "This group is mandatory for SCSI implementations able to map
          local SCSI target devices and logical units according to
          remote SCSI initiator devices."

   -- Conditionally mandatory groups to be included with the mandatory
   -- groups when the implementation is running at high speed and can
   -- gather statistics at the SCSI initiator device side.
        GROUP scsiInitiatorDevHSStatsGroup
        DESCRIPTION
          "This group is mandatory for all SCSI implementations that
          can gather statistics at the SCSI initiator device side and
          are running at high speed, meaning speed of 4 Gbit/second or
          higher."

        GROUP scsiDiscoveryHSStatsGroup
        DESCRIPTION
          "This group is mandatory for systems having the capabilities
          of gathering statistics regarding remote SCSI target devices
          via local SCSI initiator devices and are running at high
          speed, meaning speed of 4 Gbit/second or higher."

   -- Conditionally mandatory groups to be included with the mandatory
   -- groups when the implementation is running at high speed and can
   -- gather statistics at the SCSI target side.
        GROUP scsiTargetDevHSStatsGroup
        DESCRIPTION

          "This group is mandatory for all SCSI implementations that
          can gather statistics at SCSI target devices in high speed
          systems, meaning speed of 4 Gbit/second or higher."

        GROUP scsiLunMapHSStatsGroup
        DESCRIPTION
          "This group is mandatory for SCSI implementations able to map
          local SCSI target devices and logical units according to
          remote SCSI initiator devices in a high speed system, meaning
          speed of 4 Gbit/second or higher."
   ::= { scsiCompliances 1 }

   scsiGroups OBJECT IDENTIFIER ::= { scsiConformance 2 }

   scsiDeviceGroup OBJECT-GROUP
      OBJECTS {
         scsiInstAlias,
         scsiInstSoftwareIndex,
         scsiInstVendorVersion,
         scsiInstScsiNotificationsEnable,
         scsiInstStorageType,
         scsiDeviceAlias,
         scsiDeviceRole,
         scsiDevicePortNumber,
         scsiPortRole,
         scsiPortTransportPtr,
         scsiTransportType,
         scsiTransportPointer,
         scsiTransportDevName
      }
      STATUS current
      DESCRIPTION
        "A collection of objects providing information about SCSI
        instances, devices, and ports."
   ::= { scsiGroups 1 }

   scsiInitiatorDeviceGroup OBJECT-GROUP
      OBJECTS {
         scsiIntrDevTgtAccessMode,
         scsiIntrPortName,
         scsiIntrPortIdentifier,
         scsiAttTgtPortDscTgtIdx,
         scsiAttTgtPortName,
         scsiAttTgtPortIdentifier
      }
      STATUS current
      DESCRIPTION
        "This group is relevant for s SCSI initiator device and port."

   ::= { scsiGroups 2 }

   scsiDiscoveryGroup OBJECT-GROUP
      OBJECTS {
         scsiDscTgtDevOrPort,
         scsiDscTgtName,
         scsiDscTgtConfigured,
         scsiDscTgtDiscovered,
         scsiDscTgtRowStatus,
         scsiDscTgtLastCreation,
         scsiDscLunLun,
         scsiDscLunIdCodeSet,
         scsiDscLunIdAssociation,
         scsiDscLunIdType,
         scsiDscLunIdValue
      }
      STATUS current
      DESCRIPTION
        "This group is relevant for the discovered SCSI target devices
        by a SCSI initiator port."
   ::= { scsiGroups 3 }

   scsiTargetDeviceGroup OBJECT-GROUP
      OBJECTS {
         scsiTgtDevNumberOfLUs,
         scsiTgtDeviceStatus,
         scsiTgtDevNonAccessibleLUs,
         scsiTgtPortName,
         scsiTgtPortIdentifier,
         scsiAttIntrPortAuthIntrIdx,
         scsiAttIntrPortName,
         scsiAttIntrPortIdentifier,
         scsiLuDefaultLun,
         scsiLuWwnName,
         scsiLuVendorId,
         scsiLuProductId,
         scsiLuRevisionId,
         scsiLuPeripheralType,
         scsiLuStatus,
         scsiLuState,
         scsiLuLastCreation,
         scsiLuIdCodeSet,
         scsiLuIdAssociation,
         scsiLuIdType,
         scsiLuIdValue
      }
      STATUS current
      DESCRIPTION

        "This group is relevant for a SCSI target device and port."
   ::= { scsiGroups 4 }

   scsiLunMapGroup OBJECT-GROUP
      OBJECTS {
         scsiLunMapLuIndex,
         scsiLunMapRowStatus,
         scsiAuthIntrDevOrPort,
         scsiAuthIntrName,
         scsiAuthIntrLunMapIndex,
         scsiAuthIntrLastCreation,
         scsiAuthIntrRowStatus
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of attributes regarding the mapping
        between Logical Unit Number, logical unit, and target device."
   ::= { scsiGroups 5}

   scsiTargetDevStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiTgtDevResets,
         scsiTgtPortInCommands,
         scsiTgtPortWrittenMegaBytes,
         scsiTgtPortReadMegaBytes,
         scsiLuInCommands,
         scsiLuReadMegaBytes,
         scsiLuWrittenMegaBytes,
         scsiLuInResets,
         scsiLuOutTaskSetFullStatus
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of statistics for all
        implementations of the SCSI MIB module that contain SCSI target
        devices."
   ::= { scsiGroups 6}

   scsiTargetDevHSStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiTgtPortHSInCommands,
         scsiLuHSInCommands
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of high speed statistics for all
        implementations of the SCSI MIB module that contain SCSI target
        devices."

   ::= { scsiGroups 7}

   scsiLunMapStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiAuthIntrAttachedTimes,
         scsiAuthIntrOutCommands,
         scsiAuthIntrReadMegaBytes,
         scsiAuthIntrWrittenMegaBytes
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of statistics regarding SCSI
        initiator devices authorized to attach local logical unit and
        SCSI target device."
   ::= { scsiGroups 8}

   scsiLunMapHSStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiAuthIntrHSOutCommands
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of high speed statistics regarding
        SCSI initiator devices authorized to attach local logical unit
        and SCSI target device."
   ::= { scsiGroups 9}

   scsiInitiatorDevStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiIntrDevOutResets,
         scsiIntrPortOutCommands,
         scsiIntrPortWrittenMegaBytes,
         scsiIntrPortReadMegaBytes
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of statistics for all
        implementations of the SCSI MIB module that contain SCSI
        initiator devices."
   ::= { scsiGroups 10}

   scsiInitiatorDevHSStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiIntrPortHSOutCommands
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of high speed statistics for all
        implementations of the SCSI MIB module that contain SCSI
        initiator devices."
   ::= { scsiGroups 11}

   scsiDiscoveryStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiDscTgtInCommands,
         scsiDscTgtReadMegaBytes,
         scsiDscTgtWrittenMegaBytes
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of statistics for all
        implementations of the SCSI MIB module that contain discovered
        SCSI initiator devices."
   ::= { scsiGroups 12}

   scsiDiscoveryHSStatsGroup OBJECT-GROUP
      OBJECTS {
         scsiDscTgtHSInCommands
      }
      STATUS current
      DESCRIPTION
        "This group is a collection of high speed statistics for all
        implementations of the SCSI MIB module that contain discovered
        SCSI initiator devices."
   ::= { scsiGroups 13}

   scsiDeviceStatGroup OBJECT-GROUP
      OBJECTS {
         scsiPortBusyStatuses
      }
      STATUS current
      DESCRIPTION
        "A collection of statistics regarding SCSI devices and
        ports."
   ::= { scsiGroups 14 }

   scsiTgtDevLuNotificationsGroup NOTIFICATION-GROUP
      NOTIFICATIONS {
         scsiTgtDeviceStatusChanged,
         scsiLuStatusChanged
      }
      STATUS current
      DESCRIPTION
        "A collection of notifications regarding status change of SCSI
        target devices and logical units."
   ::= { scsiGroups 15 }
   END

10. Object Population Example: SCSI Target and Initiator Devices on a pSCSI Bus โœจ

Okay, time for a real-ish walkthrough ๐Ÿงš This section gives a sample set of values for a parallel SCSI setup where a SCSI MIB module could be implemented. Heads up: this example is not a normative part of the document, and it makes some assumptions about the underlying implementation that aren't based on actual implementations ๐Ÿ™ˆ

The sections below go through the order the objects get instantiated, and they try to explain any non-typical values for attributes that are unique to this scenario ๐Ÿ’…

Note: While populating the objects, we are not looking at statistics ๐Ÿ“Š

So the setup is a SCSI target and initiator attached to a parallel SCSI bus, defined by one of the SCSI-3 Parallel Interface standards. The version the MIB module points at is the 4th generation, called SPI-4 ๐Ÿ”ฅ We're pretending the initiator is a Host Bus Adaptor (HBA) and the target is a physical disk ๐Ÿ’พ The disk has one integrated logical unit, identified by a Logical Unit Number (LUN) of 0, which is the default LUN. Parallel SCSI only does port identifiers, no port names ๐Ÿ˜ญ And the transport pointer is set to 0 because there's no MIB module defined for SPI-4, so it's giving "nothing to point at" ๐Ÿ’€

Say it again with me, because it's important: HBA as the initiator, a disk as the target, and one logical unit addressed by LUN0, which is the default. Parallel SCSI has only port identifiers, no port names. The transport pointer is 0 since there's no reference transport (SPI) MIB module โœจ

Once the SCSI system is up and running, an SNMP agent should be able to see the values populated in the ScsiDevice, ScsiInitiatorDevice, ScsiTargetDevice, ScsiPort, ScsiTargetPort, ScsiInitiatorPort, ScsiLogicalUnit and ScsiLUIdentifier objects ๐Ÿ‘€

The ScsiAuthorizedIntr population depends on the transport and the implementation. Since this example is parallel SCSI, we're dealing with ports, so ScsiPortIndexOrZero is the index of the SCSI target port, and ScsiAuthIntrDevOrPort is "port". Same deal for the variables in scsiDscTgtDevOrPort ๐ŸŽ€

Quick reminder: "" means zero-length string ๐ŸŒธ

10.1. scsiInstance Table:

         Attribute                         Value
         ----------                        ------
         scsiInstIndex                      1
         scsiInstAlias                      "pSCSI-1"
         scsiInstSoftwareIndex              1000
         scsiInstVendorVersion              "1.0a"
         scsiInstScsiNotificationsEnable    true
         scsiInstStorageType                nonVolatile

10.2. scsiDevice Table:

         Attribute                Value
         ----------               ------
         scsiInstIndex            1                1
         scsiDeviceIndex          1                2
         scsiDeviceAlias          "pSCSI-HBA"      "pSCSI-Disk1"
         scsiDeviceRole           initiator(1)     target(0)
         scsiDevicePortNumber     1                1

10.3. scsiPort Table:

         Attribute                Value
         ----------               ------
         scsiInstIndex            1                1
         scsiDeviceIndex          1                2
         scsiPortIndex            1                2
         scsiPortRole             initiator(1)     target(0)
         scsiPortTransportPtr     1                2

10.4. scsiTransport Table: ๐ŸšŒ

Next up is the scsiTransport table, and it's giving very "same setup, different row" energy. Both entries are identical except for the index columns ๐Ÿ’…

         Attribute                Value
         ----------               ------
         scsiInstIndex            1                   1
         scsiDeviceIndex          1                   2
         scsiTransportIndex       1                   2
         scsiTransportType        scsiTransportSPI    scsiTransportSPI
         scsiTransportPointer     0.0                 0.0
         scsiTransportDevName     ""                  ""

10.5. scsiIntrDev Table: โœจ

The scsiIntrDev table is short and sweet, bestie ๐ŸŒธ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               1
         scsiIntrDevTgtAccessMode      autoEnable(2)

10.6. scsiInitiatorPort Table: ๐ŸŽ€

This one has a footnote, so pay attention ๐Ÿ‘€

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               1
         scsiPortIndex                 1
         scsiIntrPortName              ""
         scsiIntrPortIdentifier *1     0001b

         *1 Port Identifier for SCSI is represented by 4 bits.

10.7. scsiDscTgt Table: ๐Ÿ”

The discovery target table is where the discovered targets get their details, and the status values are doing a lot here ๐Ÿ™ˆ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               1
         scsiDscTgtIntrPortIndex       1
         scsiDscTgtIndex               1
         scsiDscTgtDevOrPort           port(2)
         scsiDscTgtName                ""
         scsiDscTgtConfigured          false(2)
         scsiDscTgtDiscovered          true(1)
         scsiDscTgtRowStatus           active(1)

10.8. scsiDscLUN: ๐Ÿงš

Okay, the LUN discovery table is next, and it's lowkey iconic ๐Ÿ’œ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               1
         scsiDscTgtIntrPortIndex       1
         scsiDscTgtIndex               1
         scsiDscLunIndex               1
         scsiDscLunLun                 0

10.9. scsiDscLUNIdentifier: ๐Ÿชช

This one has three footnotes, so it's a whole thing, bestie. The identifier value is the star of the show โœจ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               1
         scsiDscLunIndex               1
         scsiDscLunIdIndex             1
         scsiDscLunIdCodeSet *1        2
         scsiDscLunIdAssociation *2    1
         scsiDscLunIdType        *3    1
         scsiDscLunIdValue             ASPENsl318203-001

        *1 - The identifier field will have ASCII graphic codes.
        *2 - The identifier is associated with the port that received
        the request.
         *3 - As defined in SPC.  (This value specifies that the
        scsiDscLunIdValue contains a vendorID in the first 8 bytes
        concatenated with the product identifier field and product
        serial number.)

10.10. scsiAttTgtPort Table: ๐Ÿฆ‹

Here's the attached target port table. It's giving connections, and the port identifier is the main character ๐Ÿ’–

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               1
         scsiPortIndex                 1
         scsiAttTgtPortIndex           1
         scsiAttTgtPortDscTgtIdx       1
         scsiAttTgtPortName            ""
         scsiAttTgtPortId              0011b

10.11. scsiTgtDev Table: ๐ŸŽฏ

Now we switch over to device index 2, which is the target device. Lowkey the sassiest row in the whole example ๐Ÿ’…

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiTgtDevNumberOfLUs         1
         scsiTgtDeviceStatus           available(2)
         scsiTgtDevNonAccessibleLUs    0

10.12. scsiTgtPort Table: ๐ŸŒˆ

The target port table, same device index 2, different vibe ๐Ÿซถ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiPortIndex                 2
         scsiPortName                  ""
         scsiTgtPortIdentifier         0010b

10.13. scsiLU Table: ๐Ÿ’ฟ

The logical unit table is where the disk gets its whole personality: vendor, product, the works ๐Ÿ˜ญ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiLuIndex                   1
         scsiLuDefaultLun              0
         scsiLuWwnName                 ""
         scsiLuVendorId                "xyz-corp"
         scsiLuProductId               "super turbo disk"
         scsiRevisionId                02
         scsiLUPeripheralType          00
         scsiLUStatus                  available(2)
         scsiLuState                   exposed(3)

10.14. scsiLuId Table: ๐Ÿชช

Okay, the LU identifier table is basically the sequel to the last one, and the footnotes are back too ๐Ÿ”ฅ

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiLuIndex                   1
         scsiLuIdIndex                 1
         scsiLuIdCodeSet *1            2
         scsiLuIdAssociation *2        1
         scsiLuIdType *3               1
         scsiLuIdValue                 ASPENsl318203-0004

        *1 - The identifier field will have ASCII graphic codes.
        *2 - The identifier is associated with the port that received
        the request.
        *3 - As defined in SPC.  (This value specifies that the
        LuIdValue contains a vendorID in the first 8 bytes concatenated
        with the product identifier field and product serial number.)

10.15. scsiLunMap Table: ๐Ÿ—บ๏ธ

The LUN map table is where the logical units get mapped, and it's giving organized queen ๐Ÿ‘‘

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiLunMapIndex               1
         scsiLunMapLun                 0
         scsiLunMapLuIndex             1
         scsiLunMapLunRowStatus        active(1)

10.16. scsiAuthorizedIntr Table: ๐Ÿ”

This is the authorized initiator table, and it's where the access rules live. Iconic gatekeeping energy ๐Ÿ’…

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiAuthIntrTgtPortIndex      2
         scsiAuthIntrIndex             1
         scsiAuthIntrDevOrPort         port(2)
         scsiAuthIntrName              ""
         scsiAuthIntrLunMapIndex       1
         scsiAuthIntrRowStatus         active(1)

10.17. scsiAttIntrPort Table: ๐ŸŒธ

Last table of the example, bestie! The attached initiator port closes out the set ๐ŸŽ‰

         Attribute                     Value
         ----------                    ------
         scsiInstIndex                 1
         scsiDeviceIndex               2
         scsiPortIndex                 2
         scsiAttIntrPortIdx            1
         scsiAttIntrPortAuthIntrIdx    1
         scsiAttIntrPortName           ""
         scsiAttIntrPortIdentifier     0011b

11. Security Considerations ๐Ÿ”’

Okay, this section is serious, bestie ๐Ÿ˜ญ There are a bunch of management objects in this MIB module with a MAX-ACCESS of read-write and/or read-create. These can be sketchy in some network environments. SET operations without proper protection in a non-secure environment can really mess with network operations. Here's the list:

  • scsiInstAlias, scsiInstScsiNotificationsEnable, scsiInstStorageType and scsiDeviceAlias: these can be messed with to change how a SCSI instance and its devices are managed. Specifically, that's the instance's administrative alias, whether it generates notifications, whether its non-default parameter settings stick around over restarts, and the administrative alias for each of its devices.
  • scsiIntrDevTgtAccessMode: this one can be changed to let local SCSI initiator devices access discovered SCSI target devices right away, without waiting for administrator approval, even when that approval might never show up ๐Ÿ™…โ€โ™€๏ธ
  • scsiDscTgtTable: the objects here can be changed to remove administrator-set controls on local SCSI initiator devices accessing discovered SCSI target devices.
  • scsiAuthorizedIntrTable: the objects here can be changed to remove administrator-set controls on remote SCSI initiator devices accessing local SCSI target devices.
  • scsiLunMapTable: the objects here can be changed to give a remote SCSI initiator device access to logical units that an administrator set up as not accessible to that initiator.
In each of the last four cases, the objects in the tables can also be messed with to cause a denial of service attack, by blocking access that an administrator already authorized ๐Ÿšซ

Some of the readable objects in this MIB module (that's the ones with a MAX-ACCESS other than not-accessible) can be sensitive or vulnerable in some network environments too. So it's really important to control even GET and/or NOTIFY access to these, and maybe even encrypt the values when they go over the network via SNMP ๐Ÿ” All seventeen of the tables in this MIB module have info that could be sensitive to read access in some environments, for example:

  • the settings of all the read-write/read-create parameter objects mentioned above,
  • scsiInstSoftwareIndex, scsiInstVendorVersion: this tells people which version of which software is running,
  • scsiDeviceRole, scsiPortRole, scsiTransportType, scsiTransportPointer, scsiTransportDevName, scsiDscLunIdCodeSet, scsiDscLunIdAssociation, scsiDscLunIdType, scsiDscLunIdValue plus info in several tables (scsiTgtDevTable, scsiLuTable, scsiLuIdTable, scsiLunMapTable): this is topology info showing which devices and ports are targets, which transport protocols they use, and more specific details about those targets, including the LUNs they expose and how they're mapped onto logical units. Main character info ๐Ÿ‘€
  • scsiIntrPortOutCommands, scsiIntrPortWrittenMegaBytes, scsiIntrPortReadMegaBytes, scsiIntrPortHSOutCommands, scsiDscTgtInCommands, scsiDscTgtWrittenMegaBytes, scsiDscTgtReadMegaBytes, scsiDscTgtHSInCommands, scsiTgtPortInCommands, scsiTgtPortWrittenMegaBytes, scsiTgtPortReadMegaBytes, scsiTgtPortHSInCommands, scsiAuthIntrAttachedTimes, scsiAuthIntrOutCommands, scsiAuthIntrReadMegaBytes, scsiAuthIntrWrittenMegaBytes, scsiAuthIntrHSOutCommands, scsiLuInCommands, scsiLuReadMegaBytes, scsiLuWrittenMegaBytes, scsiLuHSInCommands: these statistics could be used for traffic analysis ๐Ÿ“Š
  • scsiAttTgtPortTable: info on which initiators are connected to which targets, which could also be used for traffic analysis ๐Ÿ•ต๏ธ
  • scsiAuthorizedIntrTable and scsiAttIntrPortTable tables: info on which initiators are authorized to connect to which targets.

This info may need to stay private in sensitive environments, so keep it locked down ๐Ÿคซ

SNMP versions before SNMPv3 didn't include adequate security. Even if the network itself is secure (for example, by using IPsec), there's still no control over who on that secure network can access and GET/SET (read/change/create/delete) the objects in this MIB module. Not it ๐Ÿ™…โ€โ™€๏ธ

It is RECOMMENDED that implementers consider the security features provided by the SNMPv3 framework (see [RFC3410], section 8), including full support for the SNMPv3 cryptographic mechanisms (for authentication and privacy).

Further, deployment of SNMP versions prior to SNMPv3 is NOT RECOMMENDED. Instead, it is RECOMMENDED to deploy SNMPv3 and to enable cryptographic security. It is then a customer/operator responsibility to make sure that the SNMP entity giving access to an instance of this MIB module is properly configured, so the objects are only given to those principals (users) who have legitimate rights to GET or SET (change/create/delete) them ๐Ÿงš๐Ÿ’–

12. Acknowledgements โœจ

Okay bestie, this RFC was cooked by the SCSI MIB Group ๐Ÿ‘‘. Sajay Selvaraj (HCL Technologies), George Penokie (IBM), and Roger Cummings (Veritas Software) were absolutely critical to getting this spec together. Respect to them ๐Ÿซถ.

13. IANA Considerations ๐Ÿฆ‹

IANA made a MIB OID assignment under the mib-2 branch for the SCSI-MIB. So the SCSI-MIB has its own official spot in the tree now, which is honestly iconic ๐Ÿ’….

14. References ๐Ÿ“š

14.1. Normative References

  • [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC2578] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Structure of Management Information Version 2 (SMIv2)", STD 58, RFC 2578, April 1999.
  • [RFC2579] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Textual Conventions for SMIv2", STD 58, RFC 2579, April 1999.
  • [RFC2580] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Conformance Statements for SMIv2", STD 58, RFC 2580, April 1999.
  • [RFC2790] Waldbusser, S. and P. Grillo, "Host Resources MIB", RFC 2790, March 2000.
  • [RFC3411] Harrington, D., Presuhn, R., and B. Wijnen, "An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks", STD 62, RFC 3411, December 2002.
  • [RFC3413] Levi, D., Meyer, P., and B. Stewart, "Simple Network Management Protocol (SNMP) Applications", STD 62, RFC 3413, December 2002.
  • [SAM2] ANSI INCITS 366-2003, "SCSI Architecture Model-2 (SAM-2)", SAM-2 Revision 24, September 2002.
  • [SPC2] ANSI INCITS 351-2001, "SCSI Primary Commands - 2 (SPC-2)", SPC-2 Revision 20, July 2001.

14.2. Informative References

  • [FCP2] ANSI INCITS 350-2003, "Fibre Channel Protocol for SCSI (FCP-2)", FCP-2 Revision 08, September 2002.
  • [ISCSI] Bakke, M., "Definitions of Managed Objects for iSCSI", Work in Progress, October 2005.
  • [RFC3410] Case, J., Mundy, R., Partain, D., and B. Stewart, "Introduction and Applicability Statements for Internet-Standard Management Framework", RFC 3410, December 2002.
  • [RFC3720] Satran, J., Meth, K., Sapuntzakis, C., Chadalapaka, M., and E. Zeidner, "Internet Small Computer Systems Interface (iSCSI)", RFC 3720, April 2004.
  • [RFC4022] Raghunarayan, R., "Management Information Base for the Transmission Control Protocol (TCP)", RFC 4022, March 2005.
  • [RFC4044] McCloghrie, K., "Fibre Channel Management MIB", RFC 4044, May 2005.
  • [SAS-1.1] T10 Project #1601-D, "Serial Attached SCSI - 1.1 (SAS-1.1)", SAS-1.1 Revision 10, September 2005.
  • [SBP3] ANSI INCITS 375-2004, "Serial Bus Protocol 3 (SBP-3)", SBP-3 Revision 05, September 2003.
  • [SCC2] ANSI INCITS 318-1998, "SCSI Controller Commands - 2 (SCC-2)", SCC-2 Revision 04, September 1997.
  • [SPI4] ANSI INCITS 362-2002, "SCSI Parallel Interface-4 (SPI4)", SPI-4 Revision 10, May 2002.
  • [SRP] ANSI INCITS 365-2002, "SCSI RDMA Protocol (SRP)", SRP Revision 16a, July 2002.

Authors' Addresses ๐ŸŒธ

Meet the squad! Here's where to find them ๐Ÿ’–

Michele Hallak-Stamler
Sanrad Intelligent Storage
27 Habarzel Street
Tel Aviv  69710
IL

Phone: +972 3 7674809
EMail: michele@sanrad.com
URI:   http://www.sanrad.com/
Mark Bakke
Cisco Systems, Inc.
7900 International Drive, Suite 400
Bloomington, MN  55425
USA

EMail: mbakke@cisco.com
URI:   http://www.cisco.com/
Yaron Lederman
Siliquent Technologies
21 Etzel Street
Ramat Gan
IL

Phone: +972 54 5308833
EMail: yaronled@bezeqint.net
Marjorie Krueger
Hewlett-Packard
8000 Foothills Blvd
Roseville, CA  95747
US

Phone: +1 916-785-2656
EMail: marjorie_krueger@hp.com
Keith McCloghrie
Cisco Systems, Inc.
170 West Tasman Drive
San Jose, CA  95134
US

Phone: +1 408 526-5260
EMail: kzm@cisco.com

Copyright (C) The Internet Society (2006).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property ๐ŸŒˆ

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

Acknowledgement ๐Ÿ’œ

Funding for the RFC Editor function is provided by the IETF Administrative Support Activity (IASA).

๐Ÿ“ฆ where this page comes from