/* * Generic Link Service TLV Descriptor format * * This structure, as it defines no payload, will also be referred to * as the "tlv header" - which contains the tag and len fields.
*/ struct fc_tlv_desc {
__be32 desc_tag; /* Notification Descriptor Tag */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields.
*/
__u8 desc_value[]; /* Descriptor Value */
};
/* Descriptor tag and len fields are considered the mandatory header * for a descriptor
*/ #define FC_TLV_DESC_HDR_SZ sizeof(struct fc_tlv_desc)
/* * Macro, used when initializing payloads, to return the descriptor length. * Length is size of descriptor minus the tag and len fields.
*/ #define FC_TLV_DESC_LENGTH_FROM_SZ(desc) \
(sizeof(desc) - FC_TLV_DESC_HDR_SZ)
/* Macro, used on received payloads, to return the descriptor length */ #define FC_TLV_DESC_SZ_FROM_LENGTH(tlv) \
(__be32_to_cpu((tlv)->desc_len) + FC_TLV_DESC_HDR_SZ)
/* * This helper is used to walk descriptors in a descriptor list. * Given the address of the current descriptor, which minimally contains a * tag and len field, calculate the address of the next descriptor based * on the len field.
*/ staticinlinevoid *fc_tlv_next_desc(void *desc)
{ struct fc_tlv_desc *tlv = desc;
/* * Link Service Request Information Descriptor
*/ struct fc_els_lsri_desc {
__be32 desc_tag; /* descriptor tag (0x0000 0001) */
__be32 desc_len; /* Length of Descriptor (in bytes) (4). * Size of descriptor excluding * desc_tag and desc_len fields.
*/ struct {
__u8 cmd; /* ELS cmd byte */
__u8 bytes[3]; /* bytes 1..3 */
} rqst_w0; /* Request word 0 */
};
/* * Common service parameters (N ports).
*/ struct fc_els_csp {
__u8 sp_hi_ver; /* highest version supported (obs.) */
__u8 sp_lo_ver; /* highest version supported (obs.) */
__be16 sp_bb_cred; /* buffer-to-buffer credits */
__be16 sp_features; /* common feature flags */
__be16 sp_bb_data; /* b-b state number and data field sz */ union { struct {
__be16 _sp_tot_seq; /* total concurrent sequences */
__be16 _sp_rel_off; /* rel. offset by info cat */
} sp_plogi; struct {
__be32 _sp_r_a_tov; /* resource alloc. timeout msec */
} sp_flogi_acc;
} sp_u;
__be32 sp_e_d_tov; /* error detect timeout value */
}; #define sp_tot_seq sp_u.sp_plogi._sp_tot_seq #define sp_rel_off sp_u.sp_plogi._sp_rel_off #define sp_r_a_tov sp_u.sp_flogi_acc._sp_r_a_tov
#define FC_SP_BB_DATA_MASK 0xfff /* mask for data field size in sp_bb_data */
/* * Minimum and maximum values for max data field size in service parameters.
*/ #define FC_SP_MIN_MAX_PAYLOAD FC_MIN_MAX_PAYLOAD #define FC_SP_MAX_MAX_PAYLOAD FC_MAX_PAYLOAD
/* * ELS_LOGO - process or fabric logout.
*/ struct fc_els_logo {
__u8 fl_cmd; /* command code */
__u8 fl_zero[3]; /* specified as zero - part of cmd */
__u8 fl_resvd; /* reserved */
__u8 fl_n_port_id[3];/* N port ID */
__be64 fl_n_port_wwn; /* port name */
};
/* * ELS_RTV - read timeout value.
*/ struct fc_els_rtv {
__u8 rtv_cmd; /* command code 0x0e */
__u8 rtv_zero[3]; /* specified as zero - part of cmd */
};
/* * LS_ACC for ELS_RTV - read timeout value.
*/ struct fc_els_rtv_acc {
__u8 rtv_cmd; /* command code 0x02 */
__u8 rtv_zero[3]; /* specified as zero - part of cmd */
__be32 rtv_r_a_tov; /* resource allocation timeout value */
__be32 rtv_e_d_tov; /* error detection timeout value */
__be32 rtv_toq; /* timeout qualifier (see below) */
};
/* * rtv_toq bits.
*/ #define FC_ELS_RTV_EDRES (1 << 26) /* E_D_TOV resolution is nS else mS */ #define FC_ELS_RTV_RTTOV (1 << 19) /* R_T_TOV is 100 uS else 100 mS */
enum fc_els_rscn_addr_fmt {
ELS_ADDR_FMT_PORT = 0, /* rscn_fid is a port address */
ELS_ADDR_FMT_AREA = 1, /* rscn_fid is a area address */
ELS_ADDR_FMT_DOM = 2, /* rscn_fid is a domain address */
ELS_ADDR_FMT_FAB = 3, /* anything on fabric may have changed */
};
/* * Node Identification Data formats (rnid_fmt)
*/ enum fc_els_rnid_fmt {
ELS_RNIDF_NONE = 0, /* no specific identification data */
ELS_RNIDF_GEN = 0xdf, /* general topology discovery format */
};
/* * ELS_RNID response.
*/ struct fc_els_rnid_resp {
__u8 rnid_cmd; /* response code (LS_ACC) */
__u8 rnid_resv[3]; /* reserved */
__u8 rnid_fmt; /* data format */
__u8 rnid_cid_len; /* common ID data length */
__u8 rnid_resv2; /* reserved */
__u8 rnid_sid_len; /* specific ID data length */
};
struct fc_els_rnid_cid {
__be64 rnid_wwpn; /* N port name */
__be64 rnid_wwnn; /* node name */
};
struct fc_els_rnid_gen {
__u8 rnid_vend_id[16]; /* vendor-unique ID */
__be32 rnid_atype; /* associated type (see below) */
__be32 rnid_phys_port; /* physical port number */
__be32 rnid_att_nodes; /* number of attached nodes */
__u8 rnid_node_mgmt; /* node management (see below) */
__u8 rnid_ip_ver; /* IP version (see below) */
__be16 rnid_prot_port; /* UDP / TCP port number */
__be32 rnid_ip_addr[4]; /* IP address */
__u8 rnid_resvd[2]; /* reserved */
__be16 rnid_vend_spec; /* vendor-specific field */
};
enum fc_els_rnid_atype {
ELS_RNIDA_UNK = 0x01, /* unknown */
ELS_RNIDA_OTHER = 0x02, /* none of the following */
ELS_RNIDA_HUB = 0x03,
ELS_RNIDA_SWITCH = 0x04,
ELS_RNIDA_GATEWAY = 0x05,
ELS_RNIDA_CONV = 0x06, /* Obsolete, do not use this value */
ELS_RNIDA_HBA = 0x07, /* Obsolete, do not use this value */
ELS_RNIDA_PROXY = 0x08, /* Obsolete, do not use this value */
ELS_RNIDA_STORAGE = 0x09,
ELS_RNIDA_HOST = 0x0a,
ELS_RNIDA_SUBSYS = 0x0b, /* storage subsystem (e.g., RAID) */
ELS_RNIDA_ACCESS = 0x0e, /* access device (e.g. media changer) */
ELS_RNIDA_NAS = 0x11, /* NAS server */
ELS_RNIDA_BRIDGE = 0x12, /* bridge */
ELS_RNIDA_VIRT = 0x13, /* virtualization device */
ELS_RNIDA_MF = 0xff, /* multifunction device (bits below) */
ELS_RNIDA_MF_HUB = 1UL << 31, /* hub */
ELS_RNIDA_MF_SW = 1UL << 30, /* switch */
ELS_RNIDA_MF_GW = 1UL << 29, /* gateway */
ELS_RNIDA_MF_ST = 1UL << 28, /* storage */
ELS_RNIDA_MF_HOST = 1UL << 27, /* host */
ELS_RNIDA_MF_SUB = 1UL << 26, /* storage subsystem */
ELS_RNIDA_MF_ACC = 1UL << 25, /* storage access dev */
ELS_RNIDA_MF_WDM = 1UL << 24, /* wavelength division mux */
ELS_RNIDA_MF_NAS = 1UL << 23, /* NAS server */
ELS_RNIDA_MF_BR = 1UL << 22, /* bridge */
ELS_RNIDA_MF_VIRT = 1UL << 21, /* virtualization device */
};
enum fc_els_rnid_ipver {
ELS_RNIDIP_NONE = 0, /* no IP support or node mgmt. */
ELS_RNIDIP_V4 = 1, /* IPv4 */
ELS_RNIDIP_V6 = 2, /* IPv6 */
};
/* * ELS RPL - Read Port List.
*/ struct fc_els_rpl {
__u8 rpl_cmd; /* command */
__u8 rpl_resv[5]; /* reserved - must be zero */
__be16 rpl_max_size; /* maximum response size or zero */
__u8 rpl_resv1; /* reserved - must be zero */
__u8 rpl_index[3]; /* starting index */
};
/* * Port number block in RPL response.
*/ struct fc_els_pnb {
__be32 pnb_phys_pn; /* physical port number */
__u8 pnb_resv; /* reserved */
__u8 pnb_port_id[3]; /* port ID */
__be64 pnb_wwpn; /* port name */
};
/* * RPL LS_ACC response.
*/ struct fc_els_rpl_resp {
__u8 rpl_cmd; /* ELS_LS_ACC */
__u8 rpl_resv1; /* reserved - must be zero */
__be16 rpl_plen; /* payload length */
__u8 rpl_resv2; /* reserved - must be zero */
__u8 rpl_llen[3]; /* list length */
__u8 rpl_resv3; /* reserved - must be zero */
__u8 rpl_index[3]; /* starting index */ struct fc_els_pnb rpl_pnb[1]; /* variable number of PNBs */
};
/* * Link Error Status Block.
*/ struct fc_els_lesb {
__be32 lesb_link_fail; /* link failure count */
__be32 lesb_sync_loss; /* loss of synchronization count */
__be32 lesb_sig_loss; /* loss of signal count */
__be32 lesb_prim_err; /* primitive sequence error count */
__be32 lesb_inv_word; /* invalid transmission word count */
__be32 lesb_inv_crc; /* invalid CRC count */
};
/* * ELS RPS - Read Port Status Block request.
*/ struct fc_els_rps {
__u8 rps_cmd; /* command */
__u8 rps_resv[2]; /* reserved - must be zero */
__u8 rps_flag; /* flag - see below */
__be64 rps_port_spec; /* port selection */
};
enum fc_els_rps_flag {
FC_ELS_RPS_DID = 0x00, /* port identified by D_ID of req. */
FC_ELS_RPS_PPN = 0x01, /* port_spec is physical port number */
FC_ELS_RPS_WWPN = 0x02, /* port_spec is port WWN */
};
/* * ELS RPS LS_ACC response.
*/ struct fc_els_rps_resp {
__u8 rps_cmd; /* command - LS_ACC */
__u8 rps_resv[2]; /* reserved - must be zero */
__u8 rps_flag; /* flag - see below */
__u8 rps_resv2[2]; /* reserved */
__be16 rps_status; /* port status - see below */ struct fc_els_lesb rps_lesb; /* link error status block */
};
enum fc_els_rps_resp_status {
FC_ELS_RPS_PTP = 1 << 5, /* point-to-point connection */
FC_ELS_RPS_LOOP = 1 << 4, /* loop mode */
FC_ELS_RPS_FAB = 1 << 3, /* fabric present */
FC_ELS_RPS_NO_SIG = 1 << 2, /* loss of signal */
FC_ELS_RPS_NO_SYNC = 1 << 1, /* loss of synchronization */
FC_ELS_RPS_RESET = 1 << 0, /* in link reset protocol */
};
/* * ELS LIRR - Link Incident Record Registration request.
*/ struct fc_els_lirr {
__u8 lirr_cmd; /* command */
__u8 lirr_resv[3]; /* reserved - must be zero */
__u8 lirr_func; /* registration function */
__u8 lirr_fmt; /* FC-4 type of RLIR requested */
__u8 lirr_resv2[2]; /* reserved - must be zero */
};
/* * ELS RLS - Read Link Error Status Block request.
*/ struct fc_els_rls {
__u8 rls_cmd; /* command */
__u8 rls_resv[4]; /* reserved - must be zero */
__u8 rls_port_id[3]; /* port ID */
};
/* * ELS RLS LS_ACC Response.
*/ struct fc_els_rls_resp {
__u8 rls_cmd; /* ELS_LS_ACC */
__u8 rls_resv[3]; /* reserved - must be zero */ struct fc_els_lesb rls_lesb; /* link error status block */
};
/* * ELS RLIR - Registered Link Incident Report. * This is followed by the CLIR and the CLID, described below.
*/ struct fc_els_rlir {
__u8 rlir_cmd; /* command */
__u8 rlir_resv[3]; /* reserved - must be zero */
__u8 rlir_fmt; /* format (FC4-type if type specific) */
__u8 rlir_clr_len; /* common link incident record length */
__u8 rlir_cld_len; /* common link incident desc. length */
__u8 rlir_slr_len; /* spec. link incident record length */
};
/* * CLIR - Common Link Incident Record Data. - Sent via RLIR.
*/ struct fc_els_clir {
__be64 clir_wwpn; /* incident port name */
__be64 clir_wwnn; /* incident port node name */
__u8 clir_port_type; /* incident port type */
__u8 clir_port_id[3]; /* incident port ID */
__be64 clir_conn_wwpn; /* connected port name */
__be64 clir_conn_wwnn; /* connected node name */
__be64 clir_fab_name; /* fabric name */
__be32 clir_phys_port; /* physical port number */
__be32 clir_trans_id; /* transaction ID */
__u8 clir_resv[3]; /* reserved */
__u8 clir_ts_fmt; /* time stamp format */
__be64 clir_timestamp; /* time stamp */
};
/* * CLIR clir_ts_fmt - time stamp format values.
*/ enum fc_els_clir_ts_fmt {
ELS_CLIR_TS_UNKNOWN = 0, /* time stamp field unknown */
ELS_CLIR_TS_SEC_FRAC = 1, /* time in seconds and fractions */
ELS_CLIR_TS_CSU = 2, /* time in clock synch update format */
};
/* * Common Link Incident Descriptor - sent via RLIR.
*/ struct fc_els_clid {
__u8 clid_iq; /* incident qualifier flags */
__u8 clid_ic; /* incident code */
__be16 clid_epai; /* domain/area of ISL */
};
/* * CLID incident qualifier flags.
*/ enum fc_els_clid_iq {
ELS_CLID_SWITCH = 0x20, /* incident port is a switch node */
ELS_CLID_E_PORT = 0x10, /* incident is an ISL (E) port */
ELS_CLID_SEV_MASK = 0x0c, /* severity 2-bit field mask */
ELS_CLID_SEV_INFO = 0x00, /* report is informational */
ELS_CLID_SEV_INOP = 0x08, /* link not operational */
ELS_CLID_SEV_DEG = 0x04, /* link degraded but operational */
ELS_CLID_LASER = 0x02, /* subassembly is a laser */
ELS_CLID_FRU = 0x01, /* format can identify a FRU */
};
/* * Link Integrity Notification Descriptor
*/ struct fc_fn_li_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020001) */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields.
*/
__be64 detecting_wwpn; /* Port Name that detected event */
__be64 attached_wwpn; /* Port Name of device attached to * detecting Port Name
*/
__be16 event_type; /* see enum fc_fpin_li_event_types */
__be16 event_modifier; /* Implementation specific value * describing the event type
*/
__be32 event_threshold;/* duration in ms of the link * integrity detection cycle
*/
__be32 event_count; /* minimum number of event * occurrences during the event * threshold to caause the LI event
*/
__be32 pname_count; /* number of portname_list elements */
__be64 pname_list[]; /* list of N_Port_Names accessible * through the attached port
*/
};
/* * Delivery Notification Descriptor
*/ struct fc_fn_deli_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020002) */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields.
*/
__be64 detecting_wwpn; /* Port Name that detected event */
__be64 attached_wwpn; /* Port Name of device attached to * detecting Port Name
*/
__be32 deli_reason_code;/* see enum fc_fpin_deli_event_types */
};
/* * Peer Congestion Notification Descriptor
*/ struct fc_fn_peer_congn_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020003) */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields.
*/
__be64 detecting_wwpn; /* Port Name that detected event */
__be64 attached_wwpn; /* Port Name of device attached to * detecting Port Name
*/
__be16 event_type; /* see enum fc_fpin_congn_event_types */
__be16 event_modifier; /* Implementation specific value * describing the event type
*/
__be32 event_period; /* duration (ms) of the detected * congestion event
*/
__be32 pname_count; /* number of portname_list elements */
__be64 pname_list[]; /* list of N_Port_Names accessible * through the attached port
*/
};
/* * Congestion Notification Descriptor
*/ struct fc_fn_congn_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020004) */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields.
*/
__be16 event_type; /* see enum fc_fpin_congn_event_types */
__be16 event_modifier; /* Implementation specific value * describing the event type
*/
__be32 event_period; /* duration (ms) of the detected * congestion event
*/
__u8 severity; /* command */
__u8 resv[3]; /* reserved - must be zero */
};
/* * ELS_FPIN - Fabric Performance Impact Notification
*/ struct fc_els_fpin {
__u8 fpin_cmd; /* command (0x16) */
__u8 fpin_zero[3]; /* specified as zero - part of cmd */
__be32 desc_len; /* Length of Descriptor List (in bytes). * Size of ELS excluding fpin_cmd, * fpin_zero and desc_len fields.
*/ struct fc_tlv_desc fpin_desc[]; /* Descriptor list */
};
/* Diagnostic Function Descriptor - FPIN Registration */ struct fc_df_desc_fpin_reg {
__be32 desc_tag; /* FPIN Registration (0x00030001) */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields.
*/
__be32 count; /* Number of desc_tags elements */
__be32 desc_tags[]; /* Array of Descriptor Tags. * Each tag indicates a function * supported by the N_Port (request) * or by the N_Port and Fabric * Controller (reply; may be a subset * of the request). * See ELS_FN_DTAG_xxx for tag values.
*/
};
/* * ELS_RDF - Register Diagnostic Functions
*/ struct fc_els_rdf {
__u8 fpin_cmd; /* command (0x19) */
__u8 fpin_zero[3]; /* specified as zero - part of cmd */
__be32 desc_len; /* Length of Descriptor List (in bytes). * Size of ELS excluding fpin_cmd, * fpin_zero and desc_len fields.
*/ struct fc_tlv_desc desc[]; /* Descriptor list */
};
/* * ELS RDF LS_ACC Response.
*/ struct fc_els_rdf_resp { struct fc_els_ls_acc acc_hdr;
__be32 desc_list_len; /* Length of response (in * bytes). Excludes acc_hdr * and desc_list_len fields.
*/ struct fc_els_lsri_desc lsri; struct fc_tlv_desc desc[]; /* Supported Descriptor list */
};
/* * Diagnostic Capability Descriptors for EDC ELS
*/
/* * Diagnostic: Link Fault Capability Descriptor
*/ struct fc_diag_lnkflt_desc {
__be32 desc_tag; /* Descriptor Tag (0x0001000D) */
__be32 desc_len; /* Length of Descriptor (in bytes). * Size of descriptor excluding * desc_tag and desc_len fields. * 12 bytes
*/
__be32 degrade_activate_threshold;
__be32 degrade_deactivate_threshold;
__be32 fec_degrade_interval;
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.