| 1 |
|
| 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 |
|
| 15 | #define PKT_TYPE_LACPDU cpu_to_be16(ETH_P_SLOW)
|
| 16 | #define AD_TIMER_INTERVAL 100
|
| 17 |
|
| 18 | #define AD_LACP_SLOW 0
|
| 19 | #define AD_LACP_FAST 1
|
| 20 |
|
| 21 | typedef struct mac_addr {
|
| 22 | u8 mac_addr_value[ETH_ALEN];
|
| 23 | } __packed mac_addr_t;
|
| 24 |
|
| 25 | enum {
|
| 26 | BOND_AD_STABLE = 0,
|
| 27 | BOND_AD_BANDWIDTH = 1,
|
| 28 | BOND_AD_COUNT = 2,
|
| 29 | BOND_AD_PRIO = 3,
|
| 30 | };
|
| 31 |
|
| 32 |
|
| 33 | typedef enum {
|
| 34 | AD_RX_DUMMY,
|
| 35 | AD_RX_INITIALIZE,
|
| 36 | AD_RX_PORT_DISABLED,
|
| 37 | AD_RX_LACP_DISABLED,
|
| 38 | AD_RX_EXPIRED,
|
| 39 | AD_RX_DEFAULTED,
|
| 40 | AD_RX_CURRENT
|
| 41 | } rx_states_t;
|
| 42 |
|
| 43 |
|
| 44 | typedef enum {
|
| 45 | AD_PERIODIC_DUMMY,
|
| 46 | AD_NO_PERIODIC,
|
| 47 | AD_FAST_PERIODIC,
|
| 48 | AD_SLOW_PERIODIC,
|
| 49 | AD_PERIODIC_TX
|
| 50 | } periodic_states_t;
|
| 51 |
|
| 52 |
|
| 53 | typedef enum {
|
| 54 | AD_MUX_DUMMY,
|
| 55 | AD_MUX_DETACHED,
|
| 56 | AD_MUX_WAITING,
|
| 57 | AD_MUX_ATTACHED,
|
| 58 | AD_MUX_COLLECTING,
|
| 59 | AD_MUX_DISTRIBUTING,
|
| 60 | AD_MUX_COLLECTING_DISTRIBUTING
|
| 61 | } mux_states_t;
|
| 62 |
|
| 63 |
|
| 64 | typedef enum {
|
| 65 | AD_TX_DUMMY,
|
| 66 | AD_TRANSMIT
|
| 67 | } tx_states_t;
|
| 68 |
|
| 69 |
|
| 70 | typedef enum {
|
| 71 | AD_CHURN_MONITOR,
|
| 72 | AD_CHURN,
|
| 73 | AD_NO_CHURN
|
| 74 | } churn_state_t;
|
| 75 |
|
| 76 |
|
| 77 | typedef enum {
|
| 78 | AD_TYPE_LACPDU = 1,
|
| 79 | AD_TYPE_MARKER
|
| 80 | } pdu_type_t;
|
| 81 |
|
| 82 |
|
| 83 | typedef enum {
|
| 84 | AD_MARKER_INFORMATION_SUBTYPE = 1,
|
| 85 | AD_MARKER_RESPONSE_SUBTYPE
|
| 86 | } bond_marker_subtype_t;
|
| 87 |
|
| 88 |
|
| 89 | typedef enum {
|
| 90 | AD_CURRENT_WHILE_TIMER,
|
| 91 | AD_ACTOR_CHURN_TIMER,
|
| 92 | AD_PERIODIC_TIMER,
|
| 93 | AD_PARTNER_CHURN_TIMER,
|
| 94 | AD_WAIT_WHILE_TIMER
|
| 95 | } ad_timers_t;
|
| 96 |
|
| 97 | #pragma pack(1)
|
| 98 |
|
| 99 |
|
| 100 | typedef struct lacpdu {
|
| 101 | u8 subtype;
|
| 102 | u8 version_number;
|
| 103 | u8 tlv_type_actor_info;
|
| 104 | u8 actor_information_length;
|
| 105 | __be16 actor_system_priority;
|
| 106 | struct mac_addr actor_system;
|
| 107 | __be16 actor_key;
|
| 108 | __be16 actor_port_priority;
|
| 109 | __be16 actor_port;
|
| 110 | u8 actor_state;
|
| 111 | u8 reserved_3_1[3];
|
| 112 | u8 tlv_type_partner_info;
|
| 113 | u8 partner_information_length;
|
| 114 | __be16 partner_system_priority;
|
| 115 | struct mac_addr partner_system;
|
| 116 | __be16 partner_key;
|
| 117 | __be16 partner_port_priority;
|
| 118 | __be16 partner_port;
|
| 119 | u8 partner_state;
|
| 120 | u8 reserved_3_2[3];
|
| 121 | u8 tlv_type_collector_info;
|
| 122 | u8 collector_information_length;
|
| 123 | __be16 collector_max_delay;
|
| 124 | u8 reserved_12[12];
|
| 125 | u8 tlv_type_terminator;
|
| 126 | u8 terminator_length;
|
| 127 | u8 reserved_50[50];
|
| 128 | } __packed lacpdu_t;
|
| 129 |
|
| 130 | typedef struct lacpdu_header {
|
| 131 | struct ethhdr hdr;
|
| 132 | struct lacpdu lacpdu;
|
| 133 | } __packed lacpdu_header_t;
|
| 134 |
|
| 135 |
|
| 136 | typedef struct bond_marker {
|
| 137 | u8 subtype;
|
| 138 | u8 version_number;
|
| 139 | u8 tlv_type;
|
| 140 |
|
| 141 | u8 marker_length;
|
| 142 | u16 requester_port;
|
| 143 | struct mac_addr requester_system;
|
| 144 | u32 requester_transaction_id;
|
| 145 | u16 pad;
|
| 146 | u8 tlv_type_terminator;
|
| 147 | u8 terminator_length;
|
| 148 | u8 reserved_90[90];
|
| 149 | } __packed bond_marker_t;
|
| 150 |
|
| 151 | typedef struct bond_marker_header {
|
| 152 | struct ethhdr hdr;
|
| 153 | struct bond_marker marker;
|
| 154 | } __packed bond_marker_header_t;
|
| 155 |
|
| 156 | #pragma pack()
|
| 157 |
|
| 158 | struct slave;
|
| 159 | struct bonding;
|
| 160 | struct ad_info;
|
| 161 | struct port;
|
| 162 |
|
| 163 | #ifdef __ia64__
|
| 164 | #pragma pack(8)
|
| 165 | #endif
|
| 166 |
|
| 167 | struct bond_3ad_stats {
|
| 168 | atomic64_t lacpdu_rx;
|
| 169 | atomic64_t lacpdu_tx;
|
| 170 | atomic64_t lacpdu_unknown_rx;
|
| 171 | atomic64_t lacpdu_illegal_rx;
|
| 172 |
|
| 173 | atomic64_t marker_rx;
|
| 174 | atomic64_t marker_tx;
|
| 175 | atomic64_t marker_resp_rx;
|
| 176 | atomic64_t marker_resp_tx;
|
| 177 | atomic64_t marker_unknown_rx;
|
| 178 | };
|
| 179 |
|
| 180 |
|
| 181 | typedef struct aggregator {
|
| 182 | struct mac_addr aggregator_mac_address;
|
| 183 | u16 aggregator_identifier;
|
| 184 | bool is_individual;
|
| 185 | u16 actor_admin_aggregator_key;
|
| 186 | u16 actor_oper_aggregator_key;
|
| 187 | struct mac_addr partner_system;
|
| 188 | u16 partner_system_priority;
|
| 189 | u16 partner_oper_aggregator_key;
|
| 190 | u16 receive_state;
|
| 191 | u16 transmit_state;
|
| 192 | struct port *lag_ports;
|
| 193 |
|
| 194 | struct slave *slave;
|
| 195 | u16 is_active;
|
| 196 | u16 num_of_ports;
|
| 197 | } aggregator_t;
|
| 198 |
|
| 199 | struct port_params {
|
| 200 | struct mac_addr system;
|
| 201 | u16 system_priority;
|
| 202 | u16 key;
|
| 203 | u16 port_number;
|
| 204 | u16 port_priority;
|
| 205 | u16 port_state;
|
| 206 | };
|
| 207 |
|
| 208 |
|
| 209 | typedef struct port {
|
| 210 | u16 actor_port_number;
|
| 211 | u16 actor_port_priority;
|
| 212 | struct mac_addr actor_system;
|
| 213 | u16 actor_system_priority;
|
| 214 | u16 actor_port_aggregator_identifier;
|
| 215 | bool ntt;
|
| 216 | u16 actor_admin_port_key;
|
| 217 | u16 actor_oper_port_key;
|
| 218 | u8 actor_admin_port_state;
|
| 219 | u8 actor_oper_port_state;
|
| 220 |
|
| 221 | struct port_params partner_admin;
|
| 222 | struct port_params partner_oper;
|
| 223 |
|
| 224 | bool is_enabled;
|
| 225 |
|
| 226 |
|
| 227 | u16 sm_vars;
|
| 228 | rx_states_t sm_rx_state;
|
| 229 | u16 sm_rx_timer_counter;
|
| 230 | periodic_states_t sm_periodic_state;
|
| 231 | u16 sm_periodic_timer_counter;
|
| 232 | mux_states_t sm_mux_state;
|
| 233 | u16 sm_mux_timer_counter;
|
| 234 | tx_states_t sm_tx_state;
|
| 235 | u16 sm_tx_timer_counter; |
| 236 | * (always on - enter to transmit
|
| 237 | * state 3 time per second)
|
| 238 |
|
| 239 | u16 sm_churn_actor_timer_counter;
|
| 240 | u16 sm_churn_partner_timer_counter;
|
| 241 | u32 churn_actor_count;
|
| 242 | u32 churn_partner_count;
|
| 243 | churn_state_t sm_churn_actor_state;
|
| 244 | churn_state_t sm_churn_partner_state;
|
| 245 | struct slave *slave;
|
| 246 | struct aggregator __rcu *aggregator;
|
| 247 | struct port *next_port_in_aggregator;
|
| 248 | u32 transaction_id;
|
| 249 | struct lacpdu lacpdu;
|
| 250 | } port_t;
|
| 251 |
|
| 252 |
|
| 253 | struct ad_system {
|
| 254 | u16 sys_priority;
|
| 255 | struct mac_addr sys_mac_addr;
|
| 256 | };
|
| 257 |
|
| 258 | #ifdef __ia64__
|
| 259 | #pragma pack()
|
| 260 | #endif
|
| 261 |
|
| 262 | |
| 263 | #define BOND_AD_INFO(bond) ((bond)->ad_info)
|
| 264 | #define SLAVE_AD_INFO(slave) ((slave)->ad_info)
|
| 265 |
|
| 266 | struct ad_bond_info {
|
| 267 | struct ad_system system;
|
| 268 | struct bond_3ad_stats stats;
|
| 269 | atomic_t agg_select_timer;
|
| 270 | u16 aggregator_identifier;
|
| 271 | };
|
| 272 |
|
| 273 | struct ad_slave_info {
|
| 274 | struct aggregator aggregator;
|
| 275 | struct port port;
|
| 276 | struct bond_3ad_stats stats;
|
| 277 | u16 id;
|
| 278 | u16 port_priority;
|
| 279 | };
|
| 280 |
|
| 281 | static inline const char *bond_3ad_churn_desc(churn_state_t state)
|
| 282 | {
|
| 283 | static const char *const churn_description[] = {
|
| 284 | "monitoring",
|
| 285 | "churned",
|
| 286 | "none",
|
| 287 | "unknown"
|
| 288 | };
|
| 289 | int max_size = ARRAY_SIZE(churn_description);
|
| 290 |
|
| 291 | if (state >= max_size)
|
| 292 | state = max_size - 1;
|
| 293 |
|
| 294 | return churn_description[state];
|
| 295 | }
|
| 296 |
|
| 297 | |
| 298 | void bond_3ad_initialize(struct bonding *bond);
|
| 299 | void bond_3ad_bind_slave(struct slave *slave);
|
| 300 | void bond_3ad_unbind_slave(struct slave *slave);
|
| 301 | void bond_3ad_state_machine_handler(struct work_struct *);
|
| 302 | void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout);
|
| 303 | void bond_3ad_adapter_speed_duplex_changed(struct slave *slave);
|
| 304 | void bond_3ad_handle_link_change(struct slave *slave, char link);
|
| 305 | int bond_3ad_get_active_agg_info(const struct bonding *bond, struct ad_info *ad_info);
|
| 306 | int __bond_3ad_get_active_agg_info(const struct bonding *bond,
|
| 307 | struct ad_info *ad_info);
|
| 308 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
|
| 309 | struct slave *slave);
|
| 310 | int bond_3ad_set_carrier(struct bonding *bond);
|
| 311 | void bond_3ad_update_lacp_rate(struct bonding *bond);
|
| 312 | void bond_3ad_update_lacp_active(struct bonding *bond);
|
| 313 | void bond_3ad_update_ad_actor_settings(struct bonding *bond);
|
| 314 | int bond_3ad_stats_fill(struct sk_buff *skb, struct bond_3ad_stats *stats);
|
| 315 | size_t bond_3ad_stats_size(void);
|
| 316 | #endif
|
| 317 |
|