mirror of https://github.com/ipxe/ipxe.git
452 lines
12 KiB
C
452 lines
12 KiB
C
#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 */
|