123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- #ifndef _IPXE_FCNS_H
- #define _IPXE_FCNS_H
-
- /**
- * @file
- *
- * Fibre Channel name server lookups
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <stdint.h>
- #include <ipxe/fc.h>
-
- /** A Fibre Channel Common Transport header */
- struct fc_ct_header {
- /** Revision */
- uint8_t revision;
- /** Original requestor ID */
- struct fc_port_id in_id;
- /** Generic service type */
- uint8_t type;
- /** Generic service subtype */
- uint8_t subtype;
- /** Options */
- uint8_t options;
- /** Reserved */
- uint8_t reserved;
- /** Command/response code */
- uint16_t code;
- /** Maximum/residual size */
- uint16_t size;
- /** Fragment ID */
- uint8_t fragment;
- /** Reason code */
- uint8_t reason;
- /** Reason code explanation */
- uint8_t explanation;
- /** Vendor specific */
- uint8_t vendor;
- } __attribute__ (( packed ));
-
- /** Fibre Channel Common Transport revision */
- #define FC_CT_REVISION 1
-
- /** Fibre Channel generic service type */
- enum fc_gs_type {
- /** Directory service */
- FC_GS_TYPE_DS = 0xfc,
- };
-
- /** Fibre Channel generic service response codes */
- enum fc_gs_response_code {
- /** Accepted */
- FC_GS_ACCEPT = 0x8002,
- /** Rejected */
- FC_GS_REJECT = 0x8001,
- };
-
- /** Fibre Channel generic service rejection reason codes */
- enum fc_gs_reason_code {
- /** Invalid command code */
- FC_GS_BAD_COMMAND = 0x01,
- /** Invalid version level */
- FC_GS_BAD_VERSION = 0x02,
- /** Logical error */
- FC_GS_ERROR = 0x03,
- /** Invalid CT_IU size */
- FC_GS_BAD_SIZE = 0x04,
- /** Logical busy */
- FC_GS_BUSY = 0x05,
- /** Protocol error */
- FC_GS_EPROTO = 0x07,
- /** Unable to perform command request */
- FC_GS_UNABLE = 0x09,
- /** Command not supported */
- FC_GS_ENOTSUP = 0x0b,
- /** Server not available */
- FC_GS_UNAVAILABLE = 0x0d,
- /** Session could not be established */
- FC_GS_SESSION = 0x0e,
- };
-
- /** Fibre Channel directory service subtype */
- enum fc_ds_subtype {
- /** Name server */
- FC_DS_SUBTYPE_NAME = 0x02,
- };
-
- /** Fibre Channel name server commands */
- enum fc_ns_command_nibble {
- /** Get */
- FC_NS_GET = 0x1,
- /** Register */
- FC_NS_REGISTER = 0x2,
- /** De-register */
- FC_NS_DEREGISTER = 0x3,
- };
-
- /** Fibre Channel name server objects */
- enum fc_ns_object_nibble {
- /** Port ID */
- FC_NS_PORT_ID = 0x1,
- /** Port name */
- FC_NS_PORT_NAME = 0x2,
- /** Node name */
- FC_NS_NODE_NAME = 0x3,
- /** FC-4 types */
- FC_NS_FC4_TYPES = 0x7,
- /** Symbolic port name */
- FC_NS_SYM_PORT_NAME = 0x8,
- /** Symbolic node name */
- FC_NS_SYM_NODE_NAME = 0x9,
- /** FC-4 features */
- FC_NS_FC4_FEATURES = 0xf,
- };
-
- /** Construct Fibre Channel name server command code
- *
- * @v command Name server command
- * @v key Name server key
- * @v value Name server value
- * @ret code Name server command code
- */
- #define FC_NS_CODE( command, key, value ) \
- ( ( (command) << 8 ) | ( (key) << 4 ) | ( (value) << 0 ) )
-
- /** Construct Fibre Channel name server "get" command code
- *
- * @v key Name server key
- * @v value Name server value to get
- * @ret code Name server command code
- */
- #define FC_NS_GET( key, value ) FC_NS_CODE ( FC_NS_GET, key, value )
-
- /** Construct Fibre Channel name server "register" command code
- *
- * @v key Name server key
- * @v value Name server value to register
- * @ret code Name server command code
- */
- #define FC_NS_REGISTER( key, value ) FC_NS_CODE ( FC_NS_REGISTER, key, value )
-
- /** Extract Fibre Channel name server command
- *
- * @v code Name server command code
- * @ret command Name server command
- */
- #define FC_NS_COMMAND( code ) ( ( (code) >> 8 ) & 0xf )
-
- /** Extract Fibre Channel name server key
- *
- * @v code Name server command code
- * @ret key Name server key
- */
- #define FC_NS_KEY( code ) ( ( (code) >> 4 ) & 0xf )
-
- /** Extract Fibre Channel name server value
- *
- * @v code Name server command code
- * @ret value NAme server value
- */
- #define FC_NS_VALUE( code ) ( ( (code) >> 0 ) & 0xf )
-
- /** A Fibre Channel name server port ID */
- struct fc_ns_port_id {
- /** Reserved */
- uint8_t reserved;
- /** Port ID */
- struct fc_port_id port_id;
- } __attribute__ (( packed ));
-
- /** A Fibre Channel name server GID_PN request */
- struct fc_ns_gid_pn_request {
- /** Common Transport header */
- struct fc_ct_header ct;
- /** Port name */
- struct fc_name port_wwn;
- } __attribute__ (( packed ));
-
- /** A Fibre Channel name server request */
- union fc_ns_request {
- /** Get ID by port name */
- struct fc_ns_gid_pn_request gid_pn;
- };
-
- /** A Fibre Channel name server rejection response */
- struct fc_ns_reject_response {
- /** Common Transport header */
- struct fc_ct_header ct;
- } __attribute__ (( packed ));
-
- /** A Fibre Channel name server GID_PN response */
- struct fc_ns_gid_pn_response {
- /** Common Transport header */
- struct fc_ct_header ct;
- /** Port ID */
- struct fc_ns_port_id port_id;
- } __attribute__ (( packed ));
-
- /** A Fibre Channel name server response */
- union fc_ns_response {
- /** Common Transport header */
- struct fc_ct_header ct;
- /** Rejection */
- struct fc_ns_reject_response reject;
- /** Get ID by port name */
- struct fc_ns_gid_pn_response gid_pn;
- };
-
- extern int fc_ns_query ( struct fc_peer *peer, struct fc_port *port,
- int ( * done ) ( struct fc_peer *peer,
- struct fc_port *port,
- struct fc_port_id *peer_port_id ) );
-
- #endif /* _IPXE_FCNS_H */
|