| #ifndef _IPXE_ETH_SLOW_H |
| #define _IPXE_ETH_SLOW_H |
| |
| /** @file |
| * |
| * Ethernet slow protocols |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); |
| |
| /** Slow protocols header */ |
| struct eth_slow_header { |
| /** Slow protocols subtype */ |
| uint8_t subtype; |
| /** Subtype version number */ |
| uint8_t version; |
| } __attribute__ (( packed )); |
| |
| /** LACP subtype */ |
| #define ETH_SLOW_SUBTYPE_LACP 1 |
| |
| /** LACP version number */ |
| #define ETH_SLOW_LACP_VERSION 1 |
| |
| /** Marker subtype */ |
| #define ETH_SLOW_SUBTYPE_MARKER 2 |
| |
| /** Marker version number */ |
| #define ETH_SLOW_MARKER_VERSION 1 |
| |
| /** TLV (type, length, value) header */ |
| struct eth_slow_tlv_header { |
| /** Type |
| * |
| * This is an ETH_SLOW_TLV_XXX constant. |
| */ |
| uint8_t type; |
| /** Length |
| * |
| * The length includes the TLV header (except for a TLV |
| * terminator, which has a length of zero). |
| */ |
| uint8_t length; |
| } __attribute__ (( packed )); |
| |
| /** Terminator type */ |
| #define ETH_SLOW_TLV_TERMINATOR 0 |
| |
| /** Terminator length */ |
| #define ETH_SLOW_TLV_TERMINATOR_LEN 0 |
| |
| /** LACP actor type */ |
| #define ETH_SLOW_TLV_LACP_ACTOR 1 |
| |
| /** LACP actor length */ |
| #define ETH_SLOW_TLV_LACP_ACTOR_LEN \ |
| ( sizeof ( struct eth_slow_lacp_entity_tlv ) ) |
| |
| /** LACP partner type */ |
| #define ETH_SLOW_TLV_LACP_PARTNER 2 |
| |
| /** LACP partner length */ |
| #define ETH_SLOW_TLV_LACP_PARTNER_LEN \ |
| ( sizeof ( struct eth_slow_lacp_entity_tlv ) ) |
| |
| /** LACP collector type */ |
| #define ETH_SLOW_TLV_LACP_COLLECTOR 3 |
| |
| /** LACP collector length */ |
| #define ETH_SLOW_TLV_LACP_COLLECTOR_LEN \ |
| ( sizeof ( struct eth_slow_lacp_collector_tlv ) ) |
| |
| /** Marker request type */ |
| #define ETH_SLOW_TLV_MARKER_REQUEST 1 |
| |
| /** Marker request length */ |
| #define ETH_SLOW_TLV_MARKER_REQUEST_LEN \ |
| ( sizeof ( struct eth_slow_marker_tlv ) ) |
| |
| /** Marker response type */ |
| #define ETH_SLOW_TLV_MARKER_RESPONSE 2 |
| |
| /** Marker response length */ |
| #define ETH_SLOW_TLV_MARKER_RESPONSE_LEN \ |
| ( sizeof ( struct eth_slow_marker_tlv ) ) |
| |
| /** Terminator TLV */ |
| struct eth_slow_terminator_tlv { |
| /** TLV header */ |
| struct eth_slow_tlv_header tlv; |
| } __attribute__ (( packed )); |
| |
| /** LACP entity (actor or partner) TLV */ |
| struct eth_slow_lacp_entity_tlv { |
| /** TLV header */ |
| struct eth_slow_tlv_header tlv; |
| /** System priority |
| * |
| * Used to determine the order in which ports are selected for |
| * aggregation. |
| */ |
| uint16_t system_priority; |
| /** System identifier |
| * |
| * Used to uniquely identify the system (i.e. the entity with |
| * potentially multiple ports). |
| */ |
| uint8_t system[ETH_ALEN]; |
| /** Key |
| * |
| * Used to uniquely identify a group of aggregatable ports |
| * within a system. |
| */ |
| uint16_t key; |
| /** Port priority |
| * |
| * Used to determine the order in which ports are selected for |
| * aggregation. |
| */ |
| uint16_t port_priority; |
| /** Port identifier |
| * |
| * Used to uniquely identify a port within a system. |
| */ |
| uint16_t port; |
| /** State |
| * |
| * This is the bitwise OR of zero or more LACP_STATE_XXX |
| * constants. |
| */ |
| uint8_t state; |
| /** Reserved */ |
| uint8_t reserved[3]; |
| } __attribute__ (( packed )); |
| |
| /** Maximum system priority */ |
| #define LACP_SYSTEM_PRIORITY_MAX 0xffff |
| |
| /** Maximum port priority */ |
| #define LACP_PORT_PRIORITY_MAX 0xff |
| |
| /** LACP entity is active |
| * |
| * Represented by the state character "A"/"a" |
| */ |
| #define LACP_STATE_ACTIVE 0x01 |
| |
| /** LACP timeout is short |
| * |
| * Short timeout is one second, long timeout is 30s |
| * |
| * Represented by the state character "F"/"f" |
| */ |
| #define LACP_STATE_FAST 0x02 |
| |
| /** LACP link is aggregateable |
| * |
| * Represented by the state characters "G"/"g" |
| */ |
| #define LACP_STATE_AGGREGATABLE 0x04 |
| |
| /** LACP link is in synchronisation |
| * |
| * Represented by the state characters "S"/"s" |
| */ |
| #define LACP_STATE_IN_SYNC 0x08 |
| |
| /** LACP link is collecting (receiving) |
| * |
| * Represented by the state characters "C"/"c" |
| */ |
| #define LACP_STATE_COLLECTING 0x10 |
| |
| /** LACP link is distributing (transmitting) |
| * |
| * Represented by the state characters "D"/"d" |
| */ |
| #define LACP_STATE_DISTRIBUTING 0x20 |
| |
| /** LACP entity is using defaulted partner information |
| * |
| * Represented by the state characters "L"/"l" |
| */ |
| #define LACP_STATE_DEFAULTED 0x40 |
| |
| /** LACP entity receive state machine is in EXPIRED |
| * |
| * Represented by the state characters "X"/"x" |
| */ |
| #define LACP_STATE_EXPIRED 0x80 |
| |
| /** LACP fast interval (1 second) */ |
| #define LACP_INTERVAL_FAST 1 |
| |
| /** LACP slow interval (30 seconds) */ |
| #define LACP_INTERVAL_SLOW 30 |
| |
| /** LACP collector TLV */ |
| struct eth_slow_lacp_collector_tlv { |
| /** TLV header */ |
| struct eth_slow_tlv_header tlv; |
| /** Maximum delay (in 10us increments) */ |
| uint16_t max_delay; |
| /** Reserved */ |
| uint8_t reserved[12]; |
| } __attribute__ (( packed )); |
| |
| /** Marker TLV */ |
| struct eth_slow_marker_tlv { |
| /** TLV header */ |
| struct eth_slow_tlv_header tlv; |
| /** Requester port */ |
| uint16_t port; |
| /** Requester system */ |
| uint8_t system[ETH_ALEN]; |
| /** Requester transaction ID */ |
| uint32_t xact; |
| /** Padding */ |
| uint16_t pad; |
| } __attribute__ (( packed )); |
| |
| /** LACP packet */ |
| struct eth_slow_lacp { |
| /** Slow protocols header */ |
| struct eth_slow_header header; |
| /** Actor information */ |
| struct eth_slow_lacp_entity_tlv actor; |
| /** Partner information */ |
| struct eth_slow_lacp_entity_tlv partner; |
| /** Collector information */ |
| struct eth_slow_lacp_collector_tlv collector; |
| /** Terminator */ |
| struct eth_slow_terminator_tlv terminator; |
| /** Reserved */ |
| uint8_t reserved[50]; |
| } __attribute__ (( packed )); |
| |
| /** Marker packet */ |
| struct eth_slow_marker { |
| /** Slow protocols header */ |
| struct eth_slow_header header; |
| /** Marker information */ |
| struct eth_slow_marker_tlv marker; |
| /** Terminator */ |
| struct eth_slow_terminator_tlv terminator; |
| /** Reserved */ |
| uint8_t reserved[90]; |
| } __attribute__ (( packed )); |
| |
| /** Slow protocols packet */ |
| union eth_slow_packet { |
| /** Slow protocols header */ |
| struct eth_slow_header header; |
| /** LACP packet */ |
| struct eth_slow_lacp lacp; |
| /** Marker packet */ |
| struct eth_slow_marker marker; |
| } __attribute__ (( packed )); |
| |
| #endif /* _IPXE_ETH_SLOW_H */ |