aboutsummaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/fip.h
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2010-10-07 16:21:56 +0100
committerMichael Brown <mcb30@ipxe.org>2010-10-07 19:20:36 +0100
commit0f4fd09180bc85e3844c0e7b715edad02a8f18e1 (patch)
tree557a88343e3a9ad9393ba4c000a981f96e719a81 /src/include/ipxe/fip.h
parent5e56e5f5a3b1a6e8660623e5829ae8f9ee1c850f (diff)
downloadipxe-0f4fd09180bc85e3844c0e7b715edad02a8f18e1.tar.gz
[fcoe] Add support for the FCoE Initialization Protocol (FIP)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/fip.h')
-rw-r--r--src/include/ipxe/fip.h450
1 files changed, 450 insertions, 0 deletions
diff --git a/src/include/ipxe/fip.h b/src/include/ipxe/fip.h
new file mode 100644
index 000000000..b81e8604e
--- /dev/null
+++ b/src/include/ipxe/fip.h
@@ -0,0 +1,450 @@
+#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., 675 Mass Ave, Cambridge, MA 02139, 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 */