cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bond_3ad.h (9721B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
      4 */
      5
      6#ifndef _NET_BOND_3AD_H
      7#define _NET_BOND_3AD_H
      8
      9#include <asm/byteorder.h>
     10#include <linux/skbuff.h>
     11#include <linux/netdevice.h>
     12#include <linux/if_ether.h>
     13
     14/* General definitions */
     15#define PKT_TYPE_LACPDU         cpu_to_be16(ETH_P_SLOW)
     16#define AD_TIMER_INTERVAL       100 /*msec*/
     17
     18#define MULTICAST_LACPDU_ADDR    {0x01, 0x80, 0xC2, 0x00, 0x00, 0x02}
     19
     20#define AD_LACP_SLOW 0
     21#define AD_LACP_FAST 1
     22
     23typedef struct mac_addr {
     24	u8 mac_addr_value[ETH_ALEN];
     25} __packed mac_addr_t;
     26
     27enum {
     28	BOND_AD_STABLE = 0,
     29	BOND_AD_BANDWIDTH = 1,
     30	BOND_AD_COUNT = 2,
     31};
     32
     33/* rx machine states(43.4.11 in the 802.3ad standard) */
     34typedef enum {
     35	AD_RX_DUMMY,
     36	AD_RX_INITIALIZE,	/* rx Machine */
     37	AD_RX_PORT_DISABLED,	/* rx Machine */
     38	AD_RX_LACP_DISABLED,	/* rx Machine */
     39	AD_RX_EXPIRED,		/* rx Machine */
     40	AD_RX_DEFAULTED,	/* rx Machine */
     41	AD_RX_CURRENT		/* rx Machine */
     42} rx_states_t;
     43
     44/* periodic machine states(43.4.12 in the 802.3ad standard) */
     45typedef enum {
     46	AD_PERIODIC_DUMMY,
     47	AD_NO_PERIODIC,		/* periodic machine */
     48	AD_FAST_PERIODIC,	/* periodic machine */
     49	AD_SLOW_PERIODIC,	/* periodic machine */
     50	AD_PERIODIC_TX		/* periodic machine */
     51} periodic_states_t;
     52
     53/* mux machine states(43.4.13 in the 802.3ad standard) */
     54typedef enum {
     55	AD_MUX_DUMMY,
     56	AD_MUX_DETACHED,	/* mux machine */
     57	AD_MUX_WAITING,		/* mux machine */
     58	AD_MUX_ATTACHED,	/* mux machine */
     59	AD_MUX_COLLECTING_DISTRIBUTING	/* mux machine */
     60} mux_states_t;
     61
     62/* tx machine states(43.4.15 in the 802.3ad standard) */
     63typedef enum {
     64	AD_TX_DUMMY,
     65	AD_TRANSMIT		/* tx Machine */
     66} tx_states_t;
     67
     68/* churn machine states(43.4.17 in the 802.3ad standard) */
     69typedef enum {
     70	 AD_CHURN_MONITOR, /* monitoring for churn */
     71	 AD_CHURN,         /* churn detected (error) */
     72	 AD_NO_CHURN       /* no churn (no error) */
     73} churn_state_t;
     74
     75/* rx indication types */
     76typedef enum {
     77	AD_TYPE_LACPDU = 1,	/* type lacpdu */
     78	AD_TYPE_MARKER		/* type marker */
     79} pdu_type_t;
     80
     81/* rx marker indication types */
     82typedef enum {
     83	AD_MARKER_INFORMATION_SUBTYPE = 1,	/* marker imformation subtype */
     84	AD_MARKER_RESPONSE_SUBTYPE		/* marker response subtype */
     85} bond_marker_subtype_t;
     86
     87/* timers types(43.4.9 in the 802.3ad standard) */
     88typedef enum {
     89	AD_CURRENT_WHILE_TIMER,
     90	AD_ACTOR_CHURN_TIMER,
     91	AD_PERIODIC_TIMER,
     92	AD_PARTNER_CHURN_TIMER,
     93	AD_WAIT_WHILE_TIMER
     94} ad_timers_t;
     95
     96#pragma pack(1)
     97
     98/* Link Aggregation Control Protocol(LACP) data unit structure(43.4.2.2 in the 802.3ad standard) */
     99typedef struct lacpdu {
    100	u8 subtype;		/* = LACP(= 0x01) */
    101	u8 version_number;
    102	u8 tlv_type_actor_info;	/* = actor information(type/length/value) */
    103	u8 actor_information_length;	/* = 20 */
    104	__be16 actor_system_priority;
    105	struct mac_addr actor_system;
    106	__be16 actor_key;
    107	__be16 actor_port_priority;
    108	__be16 actor_port;
    109	u8 actor_state;
    110	u8 reserved_3_1[3];		/* = 0 */
    111	u8 tlv_type_partner_info;	/* = partner information */
    112	u8 partner_information_length;	/* = 20 */
    113	__be16 partner_system_priority;
    114	struct mac_addr partner_system;
    115	__be16 partner_key;
    116	__be16 partner_port_priority;
    117	__be16 partner_port;
    118	u8 partner_state;
    119	u8 reserved_3_2[3];		/* = 0 */
    120	u8 tlv_type_collector_info;	/* = collector information */
    121	u8 collector_information_length;/* = 16 */
    122	__be16 collector_max_delay;
    123	u8 reserved_12[12];
    124	u8 tlv_type_terminator;		/* = terminator */
    125	u8 terminator_length;		/* = 0 */
    126	u8 reserved_50[50];		/* = 0 */
    127} __packed lacpdu_t;
    128
    129typedef struct lacpdu_header {
    130	struct ethhdr hdr;
    131	struct lacpdu lacpdu;
    132} __packed lacpdu_header_t;
    133
    134/* Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) */
    135typedef struct bond_marker {
    136	u8 subtype;		/* = 0x02  (marker PDU) */
    137	u8 version_number;	/* = 0x01 */
    138	u8 tlv_type;		/* = 0x01  (marker information) */
    139	/* = 0x02  (marker response information) */
    140	u8 marker_length;	/* = 0x16 */
    141	u16 requester_port;	/* The number assigned to the port by the requester */
    142	struct mac_addr requester_system;	/* The requester's system id */
    143	u32 requester_transaction_id;		/* The transaction id allocated by the requester, */
    144	u16 pad;		/* = 0 */
    145	u8 tlv_type_terminator;	/* = 0x00 */
    146	u8 terminator_length;	/* = 0x00 */
    147	u8 reserved_90[90];	/* = 0 */
    148} __packed bond_marker_t;
    149
    150typedef struct bond_marker_header {
    151	struct ethhdr hdr;
    152	struct bond_marker marker;
    153} __packed bond_marker_header_t;
    154
    155#pragma pack()
    156
    157struct slave;
    158struct bonding;
    159struct ad_info;
    160struct port;
    161
    162#ifdef __ia64__
    163#pragma pack(8)
    164#endif
    165
    166struct bond_3ad_stats {
    167	atomic64_t lacpdu_rx;
    168	atomic64_t lacpdu_tx;
    169	atomic64_t lacpdu_unknown_rx;
    170	atomic64_t lacpdu_illegal_rx;
    171
    172	atomic64_t marker_rx;
    173	atomic64_t marker_tx;
    174	atomic64_t marker_resp_rx;
    175	atomic64_t marker_resp_tx;
    176	atomic64_t marker_unknown_rx;
    177};
    178
    179/* aggregator structure(43.4.5 in the 802.3ad standard) */
    180typedef struct aggregator {
    181	struct mac_addr aggregator_mac_address;
    182	u16 aggregator_identifier;
    183	bool is_individual;
    184	u16 actor_admin_aggregator_key;
    185	u16 actor_oper_aggregator_key;
    186	struct mac_addr partner_system;
    187	u16 partner_system_priority;
    188	u16 partner_oper_aggregator_key;
    189	u16 receive_state;	/* BOOLEAN */
    190	u16 transmit_state;	/* BOOLEAN */
    191	struct port *lag_ports;
    192	/* ****** PRIVATE PARAMETERS ****** */
    193	struct slave *slave;	/* pointer to the bond slave that this aggregator belongs to */
    194	u16 is_active;		/* BOOLEAN. Indicates if this aggregator is active */
    195	u16 num_of_ports;
    196} aggregator_t;
    197
    198struct port_params {
    199	struct mac_addr system;
    200	u16 system_priority;
    201	u16 key;
    202	u16 port_number;
    203	u16 port_priority;
    204	u16 port_state;
    205};
    206
    207/* port structure(43.4.6 in the 802.3ad standard) */
    208typedef struct port {
    209	u16 actor_port_number;
    210	u16 actor_port_priority;
    211	struct mac_addr actor_system;	/* This parameter is added here although it is not specified in the standard, just for simplification */
    212	u16 actor_system_priority;	/* This parameter is added here although it is not specified in the standard, just for simplification */
    213	u16 actor_port_aggregator_identifier;
    214	bool ntt;
    215	u16 actor_admin_port_key;
    216	u16 actor_oper_port_key;
    217	u8 actor_admin_port_state;
    218	u8 actor_oper_port_state;
    219
    220	struct port_params partner_admin;
    221	struct port_params partner_oper;
    222
    223	bool is_enabled;
    224
    225	/* ****** PRIVATE PARAMETERS ****** */
    226	u16 sm_vars;		/* all state machines variables for this port */
    227	rx_states_t sm_rx_state;	/* state machine rx state */
    228	u16 sm_rx_timer_counter;	/* state machine rx timer counter */
    229	periodic_states_t sm_periodic_state;	/* state machine periodic state */
    230	u16 sm_periodic_timer_counter;	/* state machine periodic timer counter */
    231	mux_states_t sm_mux_state;	/* state machine mux state */
    232	u16 sm_mux_timer_counter;	/* state machine mux timer counter */
    233	tx_states_t sm_tx_state;	/* state machine tx state */
    234	u16 sm_tx_timer_counter;	/* state machine tx timer counter(allways on - enter to transmit state 3 time per second) */
    235	u16 sm_churn_actor_timer_counter;
    236	u16 sm_churn_partner_timer_counter;
    237	u32 churn_actor_count;
    238	u32 churn_partner_count;
    239	churn_state_t sm_churn_actor_state;
    240	churn_state_t sm_churn_partner_state;
    241	struct slave *slave;		/* pointer to the bond slave that this port belongs to */
    242	struct aggregator *aggregator;	/* pointer to an aggregator that this port related to */
    243	struct port *next_port_in_aggregator;	/* Next port on the linked list of the parent aggregator */
    244	u32 transaction_id;		/* continuous number for identification of Marker PDU's; */
    245	struct lacpdu lacpdu;		/* the lacpdu that will be sent for this port */
    246} port_t;
    247
    248/* system structure */
    249struct ad_system {
    250	u16 sys_priority;
    251	struct mac_addr sys_mac_addr;
    252};
    253
    254#ifdef __ia64__
    255#pragma pack()
    256#endif
    257
    258/* ========== AD Exported structures to the main bonding code ========== */
    259#define BOND_AD_INFO(bond)   ((bond)->ad_info)
    260#define SLAVE_AD_INFO(slave) ((slave)->ad_info)
    261
    262struct ad_bond_info {
    263	struct ad_system system;	/* 802.3ad system structure */
    264	struct bond_3ad_stats stats;
    265	atomic_t agg_select_timer;		/* Timer to select aggregator after all adapter's hand shakes */
    266	u16 aggregator_identifier;
    267};
    268
    269struct ad_slave_info {
    270	struct aggregator aggregator;	/* 802.3ad aggregator structure */
    271	struct port port;		/* 802.3ad port structure */
    272	struct bond_3ad_stats stats;
    273	u16 id;
    274};
    275
    276static inline const char *bond_3ad_churn_desc(churn_state_t state)
    277{
    278	static const char *const churn_description[] = {
    279		"monitoring",
    280		"churned",
    281		"none",
    282		"unknown"
    283	};
    284	int max_size = ARRAY_SIZE(churn_description);
    285
    286	if (state >= max_size)
    287		state = max_size - 1;
    288
    289	return churn_description[state];
    290}
    291
    292/* ========== AD Exported functions to the main bonding code ========== */
    293void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution);
    294void bond_3ad_bind_slave(struct slave *slave);
    295void bond_3ad_unbind_slave(struct slave *slave);
    296void bond_3ad_state_machine_handler(struct work_struct *);
    297void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout);
    298void bond_3ad_adapter_speed_duplex_changed(struct slave *slave);
    299void bond_3ad_handle_link_change(struct slave *slave, char link);
    300int  bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info);
    301int  __bond_3ad_get_active_agg_info(struct bonding *bond,
    302				    struct ad_info *ad_info);
    303int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
    304			 struct slave *slave);
    305int bond_3ad_set_carrier(struct bonding *bond);
    306void bond_3ad_update_lacp_active(struct bonding *bond);
    307void bond_3ad_update_lacp_rate(struct bonding *bond);
    308void bond_3ad_update_ad_actor_settings(struct bonding *bond);
    309int bond_3ad_stats_fill(struct sk_buff *skb, struct bond_3ad_stats *stats);
    310size_t bond_3ad_stats_size(void);
    311#endif /* _NET_BOND_3AD_H */
    312