1 #ifndef _IPXE_XSIGO_H 2 #define _IPXE_XSIGO_H 3 4 /** @file 5 * 6 * Xsigo virtual Ethernet devices 7 * 8 */ 9 10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); 11 12 #include <stdint.h> 13 #include <ipxe/infiniband.h> 14 #include <ipxe/eoib.h> 15 16 /** Xsigo directory service record name */ 17 #define XDS_SERVICE_NAME "XSIGOXDS" 18 19 /** Xsigo configuration manager service ID */ 20 #define XCM_SERVICE_ID { 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x97, 0x01 } 21 22 /** Xsigo management class */ 23 #define XSIGO_MGMT_CLASS 0x0b 24 25 /** Xsigo management class version */ 26 #define XSIGO_MGMT_CLASS_VERSION 2 27 28 /** Xsigo configuration manager request MAD */ 29 #define XSIGO_ATTR_XCM_REQUEST 0xb002 30 31 /** Generic operating system type */ 32 #define XSIGO_OS_TYPE_GENERIC 0x40 33 34 /** Xsigo virtual Ethernet broadcast GID prefix */ 35 #define XVE_PREFIX 0xff15101cUL 36 37 /** Xsigo resource types */ 38 enum xsigo_resource_type { 39 /** Virtual Ethernet resource type */ 40 XSIGO_RESOURCE_XVE = ( 1 << 6 ), 41 /** Absence-of-high-availability "resource" type */ 42 XSIGO_RESOURCE_NO_HA = ( 1 << 4 ), 43 }; 44 45 /** A Xsigo server identifier */ 46 struct xsigo_server_id { 47 /** Virtual machine ID */ 48 uint32_t vm; 49 /** Port GUID */ 50 union ib_guid guid; 51 } __attribute__ (( packed )); 52 53 /** A Xsigo configuration manager identifier */ 54 struct xsigo_manager_id { 55 /** Port GUID */ 56 union ib_guid guid; 57 /** LID */ 58 uint16_t lid; 59 /** Reserved */ 60 uint8_t reserved[10]; 61 } __attribute__ (( packed )); 62 63 /** A Xsigo configuration manager request MAD */ 64 struct xsigo_managers_request { 65 /** MAD header */ 66 struct ib_mad_hdr mad_hdr; 67 /** Reserved */ 68 uint8_t reserved0[32]; 69 /** Server ID */ 70 struct xsigo_server_id server; 71 /** Hostname */ 72 char hostname[ 65 /* Seriously, guys? */ ]; 73 /** OS version */ 74 char os_version[32]; 75 /** CPU architecture */ 76 char arch[16]; 77 /** OS type */ 78 uint8_t os_type; 79 /** Reserved */ 80 uint8_t reserved1[3]; 81 /** Firmware version */ 82 uint64_t firmware_version; 83 /** Hardware version */ 84 uint32_t hardware_version; 85 /** Driver version */ 86 uint32_t driver_version; 87 /** System ID */ 88 union ib_gid system_id; 89 /** Resource types */ 90 uint16_t resources; 91 /** Reserved */ 92 uint8_t reserved2[2]; 93 /** Build version */ 94 char build[16]; 95 /** Reserved */ 96 uint8_t reserved3[19]; 97 } __attribute__ (( packed )); 98 99 /** Resource types are present */ 100 #define XSIGO_RESOURCES_PRESENT 0x8000 101 102 /** A Xsigo configuration manager reply MAD */ 103 struct xsigo_managers_reply { 104 /** MAD header */ 105 struct ib_mad_hdr mad_hdr; 106 /** Reserved */ 107 uint8_t reserved0[32]; 108 /** Server ID */ 109 struct xsigo_server_id server; 110 /** Number of XCM records */ 111 uint8_t count; 112 /** Version */ 113 uint8_t version; 114 /** Reserved */ 115 uint8_t reserved1[2]; 116 /** Managers */ 117 struct xsigo_manager_id manager[8]; 118 /** Reserved */ 119 uint8_t reserved2[24]; 120 } __attribute__ (( packed )); 121 122 /** A Xsigo MAD */ 123 union xsigo_mad { 124 /** Generic MAD */ 125 union ib_mad mad; 126 /** Configuration manager request */ 127 struct xsigo_managers_request request; 128 /** Configuration manager reply */ 129 struct xsigo_managers_reply reply; 130 } __attribute__ (( packed )); 131 132 /** An XSMP node identifier */ 133 struct xsmp_node_id { 134 /** Auxiliary ID (never used) */ 135 uint32_t aux; 136 /** Port GUID */ 137 union ib_guid guid; 138 } __attribute__ (( packed )); 139 140 /** An XSMP message header */ 141 struct xsmp_message_header { 142 /** Message type */ 143 uint8_t type; 144 /** Reason code */ 145 uint8_t code; 146 /** Length */ 147 uint16_t len; 148 /** Sequence number */ 149 uint32_t seq; 150 /** Source node ID */ 151 struct xsmp_node_id src; 152 /** Destination node ID */ 153 struct xsmp_node_id dst; 154 } __attribute__ (( packed )); 155 156 /** XSMP message types */ 157 enum xsmp_message_type { 158 /** Session message type */ 159 XSMP_TYPE_SESSION = 1, 160 /** Virtual Ethernet message type */ 161 XSMP_TYPE_XVE = 6, 162 }; 163 164 /** An XSMP session message */ 165 struct xsmp_session_message { 166 /** Message header */ 167 struct xsmp_message_header hdr; 168 /** Message type */ 169 uint8_t type; 170 /** Reason code */ 171 uint8_t code; 172 /** Length (excluding message header) */ 173 uint16_t len; 174 /** Operating system type */ 175 uint8_t os_type; 176 /** Reserved */ 177 uint8_t reserved0; 178 /** Resource types */ 179 uint16_t resources; 180 /** Driver version */ 181 uint32_t driver_version; 182 /** Required chassis version */ 183 uint32_t chassis_version; 184 /** Boot flags */ 185 uint32_t boot; 186 /** Firmware version */ 187 uint64_t firmware_version; 188 /** Hardware version */ 189 uint32_t hardware_version; 190 /** Vendor part ID */ 191 uint32_t vendor; 192 /** Protocol version */ 193 uint32_t xsmp_version; 194 /** Chassis name */ 195 char chassis[32]; 196 /** Session name */ 197 char session[32]; 198 /** Reserved */ 199 uint8_t reserved1[120]; 200 } __attribute__ (( packed )); 201 202 /** XSMP session message types */ 203 enum xsmp_session_type { 204 /** Keepalive message */ 205 XSMP_SESSION_TYPE_HELLO = 1, 206 /** Initial registration message */ 207 XSMP_SESSION_TYPE_REGISTER = 2, 208 /** Registration confirmation message */ 209 XSMP_SESSION_TYPE_CONFIRM = 3, 210 /** Registration rejection message */ 211 XSMP_SESSION_TYPE_REJECT = 4, 212 /** Shutdown message */ 213 XSMP_SESSION_TYPE_SHUTDOWN = 5, 214 }; 215 216 /** XSMP boot flags */ 217 enum xsmp_session_boot { 218 /** PXE boot */ 219 XSMP_BOOT_PXE = ( 1 << 0 ), 220 }; 221 222 /** XSMP virtual Ethernet channel adapter parameters */ 223 struct xsmp_xve_ca { 224 /** Subnet prefix (little-endian) */ 225 union ib_guid prefix_le; 226 /** Control queue pair number */ 227 uint32_t ctrl; 228 /** Data queue pair number */ 229 uint32_t data; 230 /** Partition key */ 231 uint16_t pkey; 232 /** Queue key */ 233 uint16_t qkey; 234 } __attribute__ (( packed )); 235 236 /** XSMP virtual Ethernet MAC address */ 237 struct xsmp_xve_mac { 238 /** High 16 bits */ 239 uint16_t high; 240 /** Low 32 bits */ 241 uint32_t low; 242 } __attribute__ (( packed )); 243 244 /** An XSMP virtual Ethernet message */ 245 struct xsmp_xve_message { 246 /** Message header */ 247 struct xsmp_message_header hdr; 248 /** Message type */ 249 uint8_t type; 250 /** Reason code */ 251 uint8_t code; 252 /** Length (excluding message header) */ 253 uint16_t len; 254 /** Update bitmask */ 255 uint32_t update; 256 /** Resource identifier */ 257 union ib_guid resource; 258 /** TCA GUID (little-endian) */ 259 union ib_guid guid_le; 260 /** TCA LID */ 261 uint16_t lid; 262 /** MAC address (little-endian) */ 263 struct xsmp_xve_mac mac_le; 264 /** Rate */ 265 uint16_t rate; 266 /** Administrative state (non-zero = "up") */ 267 uint16_t state; 268 /** Encapsulation (apparently obsolete and unused) */ 269 uint16_t encap; 270 /** MTU */ 271 uint16_t mtu; 272 /** Installation flags (apparently obsolete and unused) */ 273 uint32_t install; 274 /** Interface name */ 275 char name[16]; 276 /** Service level */ 277 uint16_t sl; 278 /** Flow control enabled (apparently obsolete and unused) */ 279 uint16_t flow; 280 /** Committed rate (in Mbps) */ 281 uint16_t committed_mbps; 282 /** Peak rate (in Mbps) */ 283 uint16_t peak_mbps; 284 /** Committed burst size (in bytes) */ 285 uint32_t committed_burst; 286 /** Peak burst size (in bytes) */ 287 uint32_t peak_burst; 288 /** VMware index */ 289 uint8_t vmware; 290 /** Reserved */ 291 uint8_t reserved0; 292 /** Multipath flags */ 293 uint16_t multipath; 294 /** Multipath group name */ 295 char group[48]; 296 /** Link aggregation flag */ 297 uint8_t agg; 298 /** Link aggregation policy */ 299 uint8_t policy; 300 /** Network ID */ 301 uint32_t network; 302 /** Mode */ 303 uint8_t mode; 304 /** Uplink type */ 305 uint8_t uplink; 306 /** Target channel adapter parameters */ 307 struct xsmp_xve_ca tca; 308 /** Host channel adapter parameters */ 309 struct xsmp_xve_ca hca; 310 /** Reserved */ 311 uint8_t reserved1[336]; 312 } __attribute__ (( packed )); 313 314 /** XSMP virtual Ethernet message types */ 315 enum xsmp_xve_type { 316 /** Install virtual NIC */ 317 XSMP_XVE_TYPE_INSTALL = 1, 318 /** Delete virtual NIC */ 319 XSMP_XVE_TYPE_DELETE = 2, 320 /** Update virtual NIC */ 321 XSMP_XVE_TYPE_UPDATE = 3, 322 /** Set operational state up */ 323 XSMP_XVE_TYPE_OPER_UP = 6, 324 /** Set operational state down */ 325 XSMP_XVE_TYPE_OPER_DOWN = 7, 326 /** Get operational state */ 327 XSMP_XVE_TYPE_OPER_REQ = 15, 328 /** Virtual NIC is ready */ 329 XSMP_XVE_TYPE_READY = 20, 330 }; 331 332 /** XSMP virtual Ethernet message codes */ 333 enum xsmp_xve_code { 334 /* Something went wrong */ 335 XSMP_XVE_CODE_ERROR = 0x84, 336 }; 337 338 /** XSMP virtual Ethernet update bitmask */ 339 enum xsmp_xve_update { 340 /** Update MTU */ 341 XSMP_XVE_UPDATE_MTU = ( 1 << 2 ), 342 /** Update administrative state */ 343 XSMP_XVE_UPDATE_STATE = ( 1 << 6 ), 344 /** Update gateway to mark as down */ 345 XSMP_XVE_UPDATE_GW_DOWN = ( 1 << 30 ), 346 /** Update gateway information */ 347 XSMP_XVE_UPDATE_GW_CHANGE = ( 1 << 31 ), 348 }; 349 350 /** XSMP virtual Ethernet modes */ 351 enum xsmp_xve_mode { 352 /** Reliable Connected */ 353 XSMP_XVE_MODE_RC = 1, 354 /** Unreliable Datagram */ 355 XSMP_XVE_MODE_UD = 2, 356 }; 357 358 /** XSMP virtual Ethernet uplink types */ 359 enum xsmp_xve_uplink { 360 /** No uplink */ 361 XSMP_XVE_NO_UPLINK = 1, 362 /** Has uplink */ 363 XSMP_XVE_UPLINK = 2, 364 }; 365 366 /** An XSMP message */ 367 union xsmp_message { 368 /** Message header */ 369 struct xsmp_message_header hdr; 370 /** Session message */ 371 struct xsmp_session_message sess; 372 /** Virtual Ethernet message */ 373 struct xsmp_xve_message xve; 374 }; 375 376 /** Delay between attempts to open the Infiniband device 377 * 378 * This is a policy decision. 379 */ 380 #define XSIGO_OPEN_RETRY_DELAY ( 2 * TICKS_PER_SEC ) 381 382 /** Delay between unsuccessful discovery attempts 383 * 384 * This is a policy decision. 385 */ 386 #define XSIGO_DISCOVERY_FAILURE_DELAY ( 10 * TICKS_PER_SEC ) 387 388 /** Delay between successful discovery attempts 389 * 390 * This is a policy decision. 391 */ 392 #define XSIGO_DISCOVERY_SUCCESS_DELAY ( 20 * TICKS_PER_SEC ) 393 394 /** Delay between keepalive requests 395 * 396 * This is a policy decision. 397 */ 398 #define XSIGO_KEEPALIVE_INTERVAL ( 10 * TICKS_PER_SEC ) 399 400 /** Maximum time to wait for a keepalive response 401 * 402 * This is a policy decision. 403 */ 404 #define XSIGO_KEEPALIVE_MAX_WAIT ( 2 * TICKS_PER_SEC ) 405 406 #endif /* _IPXE_XSIGO_H */ 407