mirror of
https://github.com/ipxe/ipxe
synced 2025-12-22 21:11:03 +03:00
[lacp] Add simple LACP implementation
Some switch configurations will refuse to enable our port unless we can speak LACP to inform the switch that we are alive. Add a very simple passive LACP implementation that is sufficient to convince at least Linux's bonding driver (when tested using qemu attached to a tap device enslaved to a bond device configured as "mode=802.3ad"). Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -171,6 +171,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||
#define ERRFILE_wpa_psk ( ERRFILE_NET | 0x00270000 )
|
||||
#define ERRFILE_wpa_tkip ( ERRFILE_NET | 0x00280000 )
|
||||
#define ERRFILE_wpa_ccmp ( ERRFILE_NET | 0x00290000 )
|
||||
#define ERRFILE_eth_slow ( ERRFILE_NET | 0x002a0000 )
|
||||
|
||||
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
|
||||
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
|
||||
|
||||
255
src/include/ipxe/eth_slow.h
Normal file
255
src/include/ipxe/eth_slow.h
Normal file
@@ -0,0 +1,255 @@
|
||||
#ifndef _IPXE_ETH_SLOW_H
|
||||
#define _IPXE_ETH_SLOW_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Ethernet slow protocols
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER );
|
||||
|
||||
/** 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 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 */
|
||||
Reference in New Issue
Block a user