Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / fip.h
diff --git a/qemu/roms/ipxe/src/include/ipxe/fip.h b/qemu/roms/ipxe/src/include/ipxe/fip.h
new file mode 100644 (file)
index 0000000..8729233
--- /dev/null
@@ -0,0 +1,451 @@
+#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 */