#ifndef _IPXE_XSIGO_H #define _IPXE_XSIGO_H /** @file * * Xsigo virtual Ethernet devices * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include /** Xsigo directory service record name */ #define XDS_SERVICE_NAME "XSIGOXDS" /** Xsigo configuration manager service ID */ #define XCM_SERVICE_ID { 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x97, 0x01 } /** Xsigo management class */ #define XSIGO_MGMT_CLASS 0x0b /** Xsigo management class version */ #define XSIGO_MGMT_CLASS_VERSION 2 /** Xsigo configuration manager request MAD */ #define XSIGO_ATTR_XCM_REQUEST 0xb002 /** Generic operating system type */ #define XSIGO_OS_TYPE_GENERIC 0x40 /** Xsigo virtual Ethernet broadcast GID prefix */ #define XVE_PREFIX 0xff15101cUL /** Xsigo resource types */ enum xsigo_resource_type { /** Virtual Ethernet resource type */ XSIGO_RESOURCE_XVE = ( 1 << 6 ), /** Absence-of-high-availability "resource" type */ XSIGO_RESOURCE_NO_HA = ( 1 << 4 ), }; /** A Xsigo server identifier */ struct xsigo_server_id { /** Virtual machine ID */ uint32_t vm; /** Port GUID */ union ib_guid guid; } __attribute__ (( packed )); /** A Xsigo configuration manager identifier */ struct xsigo_manager_id { /** Port GUID */ union ib_guid guid; /** LID */ uint16_t lid; /** Reserved */ uint8_t reserved[10]; } __attribute__ (( packed )); /** A Xsigo configuration manager request MAD */ struct xsigo_managers_request { /** MAD header */ struct ib_mad_hdr mad_hdr; /** Reserved */ uint8_t reserved0[32]; /** Server ID */ struct xsigo_server_id server; /** Hostname */ char hostname[ 65 /* Seriously, guys? */ ]; /** OS version */ char os_version[32]; /** CPU architecture */ char arch[16]; /** OS type */ uint8_t os_type; /** Reserved */ uint8_t reserved1[3]; /** Firmware version */ uint64_t firmware_version; /** Hardware version */ uint32_t hardware_version; /** Driver version */ uint32_t driver_version; /** System ID */ union ib_gid system_id; /** Resource types */ uint16_t resources; /** Reserved */ uint8_t reserved2[2]; /** Build version */ char build[16]; /** Reserved */ uint8_t reserved3[19]; } __attribute__ (( packed )); /** Resource types are present */ #define XSIGO_RESOURCES_PRESENT 0x8000 /** A Xsigo configuration manager reply MAD */ struct xsigo_managers_reply { /** MAD header */ struct ib_mad_hdr mad_hdr; /** Reserved */ uint8_t reserved0[32]; /** Server ID */ struct xsigo_server_id server; /** Number of XCM records */ uint8_t count; /** Version */ uint8_t version; /** Reserved */ uint8_t reserved1[2]; /** Managers */ struct xsigo_manager_id manager[8]; /** Reserved */ uint8_t reserved2[24]; } __attribute__ (( packed )); /** A Xsigo MAD */ union xsigo_mad { /** Generic MAD */ union ib_mad mad; /** Configuration manager request */ struct xsigo_managers_request request; /** Configuration manager reply */ struct xsigo_managers_reply reply; } __attribute__ (( packed )); /** An XSMP node identifier */ struct xsmp_node_id { /** Auxiliary ID (never used) */ uint32_t aux; /** Port GUID */ union ib_guid guid; } __attribute__ (( packed )); /** An XSMP message header */ struct xsmp_message_header { /** Message type */ uint8_t type; /** Reason code */ uint8_t code; /** Length */ uint16_t len; /** Sequence number */ uint32_t seq; /** Source node ID */ struct xsmp_node_id src; /** Destination node ID */ struct xsmp_node_id dst; } __attribute__ (( packed )); /** XSMP message types */ enum xsmp_message_type { /** Session message type */ XSMP_TYPE_SESSION = 1, /** Virtual Ethernet message type */ XSMP_TYPE_XVE = 6, }; /** An XSMP session message */ struct xsmp_session_message { /** Message header */ struct xsmp_message_header hdr; /** Message type */ uint8_t type; /** Reason code */ uint8_t code; /** Length (excluding message header) */ uint16_t len; /** Operating system type */ uint8_t os_type; /** Reserved */ uint8_t reserved0; /** Resource types */ uint16_t resources; /** Driver version */ uint32_t driver_version; /** Required chassis version */ uint32_t chassis_version; /** Boot flags */ uint32_t boot; /** Firmware version */ uint64_t firmware_version; /** Hardware version */ uint32_t hardware_version; /** Vendor part ID */ uint32_t vendor; /** Protocol version */ uint32_t xsmp_version; /** Chassis name */ char chassis[32]; /** Session name */ char session[32]; /** Reserved */ uint8_t reserved1[120]; } __attribute__ (( packed )); /** XSMP session message types */ enum xsmp_session_type { /** Keepalive message */ XSMP_SESSION_TYPE_HELLO = 1, /** Initial registration message */ XSMP_SESSION_TYPE_REGISTER = 2, /** Registration confirmation message */ XSMP_SESSION_TYPE_CONFIRM = 3, /** Registration rejection message */ XSMP_SESSION_TYPE_REJECT = 4, /** Shutdown message */ XSMP_SESSION_TYPE_SHUTDOWN = 5, }; /** XSMP boot flags */ enum xsmp_session_boot { /** PXE boot */ XSMP_BOOT_PXE = ( 1 << 0 ), }; /** XSMP virtual Ethernet channel adapter parameters */ struct xsmp_xve_ca { /** Subnet prefix (little-endian) */ union ib_guid prefix_le; /** Control queue pair number */ uint32_t ctrl; /** Data queue pair number */ uint32_t data; /** Partition key */ uint16_t pkey; /** Queue key */ uint16_t qkey; } __attribute__ (( packed )); /** XSMP virtual Ethernet MAC address */ struct xsmp_xve_mac { /** High 16 bits */ uint16_t high; /** Low 32 bits */ uint32_t low; } __attribute__ (( packed )); /** An XSMP virtual Ethernet message */ struct xsmp_xve_message { /** Message header */ struct xsmp_message_header hdr; /** Message type */ uint8_t type; /** Reason code */ uint8_t code; /** Length (excluding message header) */ uint16_t len; /** Update bitmask */ uint32_t update; /** Resource identifier */ union ib_guid resource; /** TCA GUID (little-endian) */ union ib_guid guid_le; /** TCA LID */ uint16_t lid; /** MAC address (little-endian) */ struct xsmp_xve_mac mac_le; /** Rate */ uint16_t rate; /** Administrative state (non-zero = "up") */ uint16_t state; /** Encapsulation (apparently obsolete and unused) */ uint16_t encap; /** MTU */ uint16_t mtu; /** Installation flags (apparently obsolete and unused) */ uint32_t install; /** Interface name */ char name[16]; /** Service level */ uint16_t sl; /** Flow control enabled (apparently obsolete and unused) */ uint16_t flow; /** Committed rate (in Mbps) */ uint16_t committed_mbps; /** Peak rate (in Mbps) */ uint16_t peak_mbps; /** Committed burst size (in bytes) */ uint32_t committed_burst; /** Peak burst size (in bytes) */ uint32_t peak_burst; /** VMware index */ uint8_t vmware; /** Reserved */ uint8_t reserved0; /** Multipath flags */ uint16_t multipath; /** Multipath group name */ char group[48]; /** Link aggregation flag */ uint8_t agg; /** Link aggregation policy */ uint8_t policy; /** Network ID */ uint32_t network; /** Mode */ uint8_t mode; /** Uplink type */ uint8_t uplink; /** Target channel adapter parameters */ struct xsmp_xve_ca tca; /** Host channel adapter parameters */ struct xsmp_xve_ca hca; /** Reserved */ uint8_t reserved1[336]; } __attribute__ (( packed )); /** XSMP virtual Ethernet message types */ enum xsmp_xve_type { /** Install virtual NIC */ XSMP_XVE_TYPE_INSTALL = 1, /** Delete virtual NIC */ XSMP_XVE_TYPE_DELETE = 2, /** Update virtual NIC */ XSMP_XVE_TYPE_UPDATE = 3, /** Set operational state up */ XSMP_XVE_TYPE_OPER_UP = 6, /** Set operational state down */ XSMP_XVE_TYPE_OPER_DOWN = 7, /** Get operational state */ XSMP_XVE_TYPE_OPER_REQ = 15, /** Virtual NIC is ready */ XSMP_XVE_TYPE_READY = 20, }; /** XSMP virtual Ethernet message codes */ enum xsmp_xve_code { /* Something went wrong */ XSMP_XVE_CODE_ERROR = 0x84, }; /** XSMP virtual Ethernet update bitmask */ enum xsmp_xve_update { /** Update MTU */ XSMP_XVE_UPDATE_MTU = ( 1 << 2 ), /** Update administrative state */ XSMP_XVE_UPDATE_STATE = ( 1 << 6 ), /** Update gateway to mark as down */ XSMP_XVE_UPDATE_GW_DOWN = ( 1 << 30 ), /** Update gateway information */ XSMP_XVE_UPDATE_GW_CHANGE = ( 1 << 31 ), }; /** XSMP virtual Ethernet modes */ enum xsmp_xve_mode { /** Reliable Connected */ XSMP_XVE_MODE_RC = 1, /** Unreliable Datagram */ XSMP_XVE_MODE_UD = 2, }; /** XSMP virtual Ethernet uplink types */ enum xsmp_xve_uplink { /** No uplink */ XSMP_XVE_NO_UPLINK = 1, /** Has uplink */ XSMP_XVE_UPLINK = 2, }; /** An XSMP message */ union xsmp_message { /** Message header */ struct xsmp_message_header hdr; /** Session message */ struct xsmp_session_message sess; /** Virtual Ethernet message */ struct xsmp_xve_message xve; }; /** Delay between attempts to open the Infiniband device * * This is a policy decision. */ #define XSIGO_OPEN_RETRY_DELAY ( 2 * TICKS_PER_SEC ) /** Delay between unsuccessful discovery attempts * * This is a policy decision. */ #define XSIGO_DISCOVERY_FAILURE_DELAY ( 10 * TICKS_PER_SEC ) /** Delay between successful discovery attempts * * This is a policy decision. */ #define XSIGO_DISCOVERY_SUCCESS_DELAY ( 20 * TICKS_PER_SEC ) /** Delay between keepalive requests * * This is a policy decision. */ #define XSIGO_KEEPALIVE_INTERVAL ( 10 * TICKS_PER_SEC ) /** Maximum time to wait for a keepalive response * * This is a policy decision. */ #define XSIGO_KEEPALIVE_MAX_WAIT ( 2 * TICKS_PER_SEC ) #endif /* _IPXE_XSIGO_H */