123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- #ifndef _IPXE_FIP_H
- #define _IPXE_FIP_H
-
- /*
- * Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
- #include <stdint.h>
- #include <ipxe/fc.h>
- #include <ipxe/fcels.h>
- #include <ipxe/fcoe.h>
-
- /** A FIP frame header */
- struct fip_header {
- /** Frame version */
- uint8_t version;
- /** Reserved */
- uint8_t reserved_a;
- /** Protocol code */
- uint16_t code;
- /** Reserved */
- uint8_t reserved_b;
- /** Subcode */
- uint8_t subcode;
- /** Descriptor list length in 32-bit words */
- uint16_t len;
- /** Flags */
- uint16_t flags;
- } __attribute__ (( packed ));
-
- /** FIP frame version */
- #define FIP_VERSION 0x10
-
- /** FIP protocol code */
- enum fip_code {
- FIP_CODE_DISCOVERY = 0x0001, /**< Discovery */
- FIP_CODE_ELS = 0x0002, /**< Extended link services */
- FIP_CODE_MAINTAIN = 0x0003, /**< Maintain virtual links */
- FIP_CODE_VLAN = 0x0004, /**< VLAN */
- };
-
- /** FIP protocol subcode for discovery */
- enum fip_discovery_subcode {
- FIP_DISCOVERY_SOLICIT = 0x01, /**< Discovery solicitation */
- FIP_DISCOVERY_ADVERTISE = 0x02, /**< Discovery advertisement */
- };
-
- /** FIP protocol subcode for extended link services */
- enum fip_els_subcode {
- FIP_ELS_REQUEST = 0x01, /**< ELS request */
- FIP_ELS_RESPONSE = 0x02, /**< ELS response */
- };
-
- /** FIP protocol subcode for keep alive / clear links */
- enum fip_vitality_subcode {
- FIP_MAINTAIN_KEEP_ALIVE = 0x01, /**< Keep alive */
- FIP_MAINTAIN_CLEAR_LINKS = 0x02,/**< Clear virtual links */
- };
-
- /** FIP protocol subcode for VLAN */
- enum fip_vlan_subcode {
- FIP_VLAN_REQUEST = 0x01, /**< VLAN request */
- FIP_VLAN_NOTIFY = 0x02, /**< VLAN notification */
- };
-
- /** FIP flags */
- enum fip_flags {
- FIP_FP = 0x8000, /**< Fabric-provided MAC address */
- FIP_SP = 0x4000, /**< Server-provided MAC address */
- FIP_A = 0x0004, /**< Available for login */
- FIP_S = 0x0002, /**< Solicited */
- FIP_F = 0x0001, /**< Forwarder */
- };
-
- /** FIP descriptor common fields */
- struct fip_common {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- } __attribute__ (( packed ));
-
- /** FIP descriptor types */
- enum fip_type {
- FIP_RESERVED = 0x00, /**< Reserved */
- FIP_PRIORITY = 0x01, /**< Priority */
- FIP_MAC_ADDRESS = 0x02, /**< MAC address */
- FIP_FC_MAP = 0x03, /**< FC-MAP */
- FIP_NAME_ID = 0x04, /**< Name identifier */
- FIP_FABRIC = 0x05, /**< Fabric */
- FIP_MAX_FCOE_SIZE = 0x06, /**< Max FCoE size */
- FIP_FLOGI = 0x07, /**< FLOGI */
- FIP_NPIV_FDISC = 0x08, /**< NPIV FDISC */
- FIP_LOGO = 0x09, /**< LOGO */
- FIP_ELP = 0x0a, /**< ELP */
- FIP_VX_PORT_ID = 0x0b, /**< Vx port identification */
- FIP_FKA_ADV_P = 0x0c, /**< FKA ADV period */
- FIP_VENDOR_ID = 0x0d, /**< Vendor ID */
- FIP_VLAN = 0x0e, /**< VLAN */
- FIP_NUM_DESCRIPTOR_TYPES
- };
-
- /** FIP descriptor type is critical */
- #define FIP_IS_CRITICAL( type ) ( (type) <= 0x7f )
-
- /** A FIP priority descriptor */
- struct fip_priority {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved;
- /** Priority
- *
- * A higher value indicates a lower priority.
- */
- uint8_t priority;
- } __attribute__ (( packed ));
-
- /** Default FIP priority */
- #define FIP_DEFAULT_PRIORITY 128
-
- /** Lowest FIP priority */
- #define FIP_LOWEST_PRIORITY 255
-
- /** A FIP MAC address descriptor */
- struct fip_mac_address {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** MAC address */
- uint8_t mac[ETH_ALEN];
- } __attribute__ (( packed ));
-
- /** A FIP FC-MAP descriptor */
- struct fip_fc_map {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[3];
- /** FC-MAP */
- struct fcoe_map map;
- } __attribute__ (( packed ));
-
- /** A FIP name identifier descriptor */
- struct fip_name_id {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Name identifier */
- struct fc_name name;
- } __attribute__ (( packed ));
-
- /** A FIP fabric descriptor */
- struct fip_fabric {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Virtual Fabric ID, if any */
- uint16_t vf_id;
- /** Reserved */
- uint8_t reserved;
- /** FC-MAP */
- struct fcoe_map map;
- /** Fabric name */
- struct fc_name name;
- } __attribute__ (( packed ));
-
- /** A FIP max FCoE size descriptor */
- struct fip_max_fcoe_size {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Maximum FCoE size */
- uint16_t mtu;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor containing an encapsulated ELS frame */
- struct fip_els {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Fibre Channel frame header */
- struct fc_frame_header fc;
- /** ELS frame */
- struct fc_els_frame_common els;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor containing an encapsulated login frame */
- struct fip_login {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Fibre Channel frame header */
- struct fc_frame_header fc;
- /** ELS frame */
- struct fc_login_frame els;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor containing an encapsulated LOGO request frame */
- struct fip_logo_request {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Fibre Channel frame header */
- struct fc_frame_header fc;
- /** ELS frame */
- struct fc_logout_request_frame els;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor containing an encapsulated LOGO response frame */
- struct fip_logo_response {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Fibre Channel frame header */
- struct fc_frame_header fc;
- /** ELS frame */
- struct fc_logout_response_frame els;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor containing an encapsulated ELP frame */
- struct fip_elp {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Fibre Channel frame header */
- struct fc_frame_header fc;
- /** ELS frame */
- struct fc_els_frame_common els;
- /** Uninteresting content */
- uint32_t dull[25];
- } __attribute__ (( packed ));
-
- /** A FIP descriptor containing an encapsulated LS_RJT frame */
- struct fip_ls_rjt {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Fibre Channel frame header */
- struct fc_frame_header fc;
- /** ELS frame */
- struct fc_ls_rjt_frame els;
- } __attribute__ (( packed ));
-
- /** A FIP Vx port identification descriptor */
- struct fip_vx_port_id {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** MAC address */
- uint8_t mac[ETH_ALEN];
- /** Reserved */
- uint8_t reserved;
- /** Address identifier */
- struct fc_port_id id;
- /** Port name */
- struct fc_name name;
- } __attribute__ (( packed ));
-
- /** A FIP FKA ADV period descriptor */
- struct fip_fka_adv_p {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved;
- /** Flags */
- uint8_t flags;
- /** Keep alive advertisement period in milliseconds */
- uint32_t period;
- } __attribute__ (( packed ));
-
- /** FIP FKA ADV period flags */
- enum fip_fka_adv_p_flags {
- FIP_NO_KEEPALIVE = 0x01, /**< Do not send keepalives */
- };
-
- /** A FIP vendor ID descriptor */
- struct fip_vendor_id {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** Reserved */
- uint8_t reserved[2];
- /** Vendor ID */
- uint8_t vendor[8];
- } __attribute__ (( packed ));
-
- /** A FIP VLAN descriptor */
- struct fip_vlan {
- /** Type */
- uint8_t type;
- /** Length in 32-bit words */
- uint8_t len;
- /** VLAN ID */
- uint16_t vlan;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor */
- union fip_descriptor {
- /** Common fields */
- struct fip_common common;
- /** Priority descriptor */
- struct fip_priority priority;
- /** MAC address descriptor */
- struct fip_mac_address mac_address;
- /** FC-MAP descriptor */
- struct fip_fc_map fc_map;
- /** Name identifier descriptor */
- struct fip_name_id name_id;
- /** Fabric descriptor */
- struct fip_fabric fabric;
- /** Max FCoE size descriptor */
- struct fip_max_fcoe_size max_fcoe_size;
- /** FLOGI descriptor */
- struct fip_els flogi;
- /** FLOGI request descriptor */
- struct fip_login flogi_request;
- /** FLOGI LS_ACC descriptor */
- struct fip_login flogi_ls_acc;
- /** FLOGI LS_RJT descriptor */
- struct fip_ls_rjt flogi_ls_rjt;
- /** NPIV FDISC descriptor */
- struct fip_els npiv_fdisc;
- /** NPIV FDISC request descriptor */
- struct fip_login npiv_fdisc_request;
- /** NPIV FDISC LS_ACC descriptor */
- struct fip_login npiv_fdisc_ls_acc;
- /** NPIV FDISC LS_RJT descriptor */
- struct fip_ls_rjt npiv_fdisc_ls_rjt;
- /** LOGO descriptor */
- struct fip_els logo;
- /** LOGO request descriptor */
- struct fip_logo_request logo_request;
- /** LOGO LS_ACC descriptor */
- struct fip_logo_response logo_ls_acc;
- /** LOGO LS_RJT descriptor */
- struct fip_ls_rjt logo_ls_rjt;
- /** ELS descriptor */
- struct fip_els elp;
- /** ELP request descriptor */
- struct fip_elp elp_request;
- /** ELP LS_ACC descriptor */
- struct fip_elp elp_ls_acc;
- /** ELP LS_RJT descriptor */
- struct fip_ls_rjt elp_ls_rjt;
- /** Vx port identification descriptor */
- struct fip_vx_port_id vx_port_id;
- /** FKA ADV period descriptor */
- struct fip_fka_adv_p fka_adv_p;
- /** Vendor ID descriptor */
- struct fip_vendor_id vendor_id;
- /** VLAN descriptor */
- struct fip_vlan vlan;
- } __attribute__ (( packed ));
-
- /** A FIP descriptor set */
- struct fip_descriptors {
- /** Descriptors, indexed by type */
- union fip_descriptor *desc[FIP_NUM_DESCRIPTOR_TYPES];
- };
-
- /**
- * Define a function to extract a specific FIP descriptor type from a list
- *
- * @v type Descriptor type
- * @v name Descriptor name
- * @v finder Descriptor finder
- */
- #define FIP_DESCRIPTOR( type, name ) \
- static inline __attribute__ (( always_inline )) \
- typeof ( ( ( union fip_descriptor * ) NULL )->name ) * \
- fip_ ## name ( struct fip_descriptors *descs ) { \
- return &(descs->desc[type]->name); \
- }
- FIP_DESCRIPTOR ( FIP_PRIORITY, priority );
- FIP_DESCRIPTOR ( FIP_MAC_ADDRESS, mac_address );
- FIP_DESCRIPTOR ( FIP_FC_MAP, fc_map );
- FIP_DESCRIPTOR ( FIP_NAME_ID, name_id );
- FIP_DESCRIPTOR ( FIP_FABRIC, fabric );
- FIP_DESCRIPTOR ( FIP_MAX_FCOE_SIZE, max_fcoe_size );
- FIP_DESCRIPTOR ( FIP_FLOGI, flogi );
- FIP_DESCRIPTOR ( FIP_FLOGI, flogi_request );
- FIP_DESCRIPTOR ( FIP_FLOGI, flogi_ls_acc );
- FIP_DESCRIPTOR ( FIP_FLOGI, flogi_ls_rjt );
- FIP_DESCRIPTOR ( FIP_NPIV_FDISC, npiv_fdisc );
- FIP_DESCRIPTOR ( FIP_NPIV_FDISC, npiv_fdisc_request );
- FIP_DESCRIPTOR ( FIP_NPIV_FDISC, npiv_fdisc_ls_acc );
- FIP_DESCRIPTOR ( FIP_NPIV_FDISC, npiv_fdisc_ls_rjt );
- FIP_DESCRIPTOR ( FIP_LOGO, logo );
- FIP_DESCRIPTOR ( FIP_LOGO, logo_request );
- FIP_DESCRIPTOR ( FIP_LOGO, logo_ls_acc );
- FIP_DESCRIPTOR ( FIP_LOGO, logo_ls_rjt );
- FIP_DESCRIPTOR ( FIP_ELP, elp );
- FIP_DESCRIPTOR ( FIP_ELP, elp_request );
- FIP_DESCRIPTOR ( FIP_ELP, elp_ls_acc );
- FIP_DESCRIPTOR ( FIP_ELP, elp_ls_rjt );
- FIP_DESCRIPTOR ( FIP_VX_PORT_ID, vx_port_id );
- FIP_DESCRIPTOR ( FIP_FKA_ADV_P, fka_adv_p );
- FIP_DESCRIPTOR ( FIP_VENDOR_ID, vendor_id );
- FIP_DESCRIPTOR ( FIP_VLAN, vlan );
-
- #endif /* _IPXE_FIP_H */
|