Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify it | |
5 | * under the terms of the GNU General Public License as published by the Free | |
6 | * Software Foundation; either version 2 of the License, or (at your option) | |
7 | * any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License along with | |
15 | * this program; if not, write to the Free Software Foundation, Inc., 59 | |
16 | * Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
17 | * | |
18 | * The full GNU General Public License is included in this distribution in the | |
19 | * file called LICENSE. | |
20 | * | |
1da177e4 LT |
21 | */ |
22 | ||
23 | #ifndef __BOND_3AD_H__ | |
24 | #define __BOND_3AD_H__ | |
25 | ||
26 | #include <asm/byteorder.h> | |
27 | #include <linux/skbuff.h> | |
28 | #include <linux/netdevice.h> | |
ed9b58bc | 29 | #include <linux/if_ether.h> |
1da177e4 LT |
30 | |
31 | // General definitions | |
ed9b58bc | 32 | #define PKT_TYPE_LACPDU cpu_to_be16(ETH_P_SLOW) |
1da177e4 LT |
33 | #define AD_TIMER_INTERVAL 100 /*msec*/ |
34 | ||
35 | #define MULTICAST_LACPDU_ADDR {0x01, 0x80, 0xC2, 0x00, 0x00, 0x02} | |
1da177e4 LT |
36 | |
37 | #define AD_LACP_SLOW 0 | |
38 | #define AD_LACP_FAST 1 | |
39 | ||
40 | typedef struct mac_addr { | |
41 | u8 mac_addr_value[ETH_ALEN]; | |
42 | } mac_addr_t; | |
43 | ||
fd989c83 JV |
44 | enum { |
45 | BOND_AD_STABLE = 0, | |
46 | BOND_AD_BANDWIDTH = 1, | |
47 | BOND_AD_COUNT = 2, | |
48 | }; | |
1da177e4 LT |
49 | |
50 | // rx machine states(43.4.11 in the 802.3ad standard) | |
51 | typedef enum { | |
52 | AD_RX_DUMMY, | |
53 | AD_RX_INITIALIZE, // rx Machine | |
54 | AD_RX_PORT_DISABLED, // rx Machine | |
55 | AD_RX_LACP_DISABLED, // rx Machine | |
56 | AD_RX_EXPIRED, // rx Machine | |
57 | AD_RX_DEFAULTED, // rx Machine | |
58 | AD_RX_CURRENT // rx Machine | |
59 | } rx_states_t; | |
60 | ||
61 | // periodic machine states(43.4.12 in the 802.3ad standard) | |
62 | typedef enum { | |
63 | AD_PERIODIC_DUMMY, | |
64 | AD_NO_PERIODIC, // periodic machine | |
65 | AD_FAST_PERIODIC, // periodic machine | |
66 | AD_SLOW_PERIODIC, // periodic machine | |
67 | AD_PERIODIC_TX // periodic machine | |
68 | } periodic_states_t; | |
69 | ||
70 | // mux machine states(43.4.13 in the 802.3ad standard) | |
71 | typedef enum { | |
72 | AD_MUX_DUMMY, | |
73 | AD_MUX_DETACHED, // mux machine | |
74 | AD_MUX_WAITING, // mux machine | |
75 | AD_MUX_ATTACHED, // mux machine | |
76 | AD_MUX_COLLECTING_DISTRIBUTING // mux machine | |
77 | } mux_states_t; | |
78 | ||
79 | // tx machine states(43.4.15 in the 802.3ad standard) | |
80 | typedef enum { | |
81 | AD_TX_DUMMY, | |
82 | AD_TRANSMIT // tx Machine | |
83 | } tx_states_t; | |
84 | ||
85 | // rx indication types | |
86 | typedef enum { | |
87 | AD_TYPE_LACPDU = 1, // type lacpdu | |
88 | AD_TYPE_MARKER // type marker | |
89 | } pdu_type_t; | |
90 | ||
91 | // rx marker indication types | |
92 | typedef enum { | |
93 | AD_MARKER_INFORMATION_SUBTYPE = 1, // marker imformation subtype | |
94 | AD_MARKER_RESPONSE_SUBTYPE // marker response subtype | |
1c3f0b8e | 95 | } bond_marker_subtype_t; |
1da177e4 LT |
96 | |
97 | // timers types(43.4.9 in the 802.3ad standard) | |
98 | typedef enum { | |
99 | AD_CURRENT_WHILE_TIMER, | |
100 | AD_ACTOR_CHURN_TIMER, | |
101 | AD_PERIODIC_TIMER, | |
102 | AD_PARTNER_CHURN_TIMER, | |
103 | AD_WAIT_WHILE_TIMER | |
104 | } ad_timers_t; | |
105 | ||
106 | #pragma pack(1) | |
107 | ||
1da177e4 LT |
108 | // Link Aggregation Control Protocol(LACP) data unit structure(43.4.2.2 in the 802.3ad standard) |
109 | typedef struct lacpdu { | |
110 | u8 subtype; // = LACP(= 0x01) | |
111 | u8 version_number; | |
112 | u8 tlv_type_actor_info; // = actor information(type/length/value) | |
113 | u8 actor_information_length; // = 20 | |
d3bb52b0 | 114 | __be16 actor_system_priority; |
1da177e4 | 115 | struct mac_addr actor_system; |
d3bb52b0 AV |
116 | __be16 actor_key; |
117 | __be16 actor_port_priority; | |
118 | __be16 actor_port; | |
1da177e4 LT |
119 | u8 actor_state; |
120 | u8 reserved_3_1[3]; // = 0 | |
121 | u8 tlv_type_partner_info; // = partner information | |
122 | u8 partner_information_length; // = 20 | |
d3bb52b0 | 123 | __be16 partner_system_priority; |
1da177e4 | 124 | struct mac_addr partner_system; |
d3bb52b0 AV |
125 | __be16 partner_key; |
126 | __be16 partner_port_priority; | |
127 | __be16 partner_port; | |
1da177e4 LT |
128 | u8 partner_state; |
129 | u8 reserved_3_2[3]; // = 0 | |
130 | u8 tlv_type_collector_info; // = collector information | |
131 | u8 collector_information_length; // = 16 | |
d3bb52b0 | 132 | __be16 collector_max_delay; |
1da177e4 LT |
133 | u8 reserved_12[12]; |
134 | u8 tlv_type_terminator; // = terminator | |
135 | u8 terminator_length; // = 0 | |
136 | u8 reserved_50[50]; // = 0 | |
137 | } lacpdu_t; | |
138 | ||
139 | typedef struct lacpdu_header { | |
e727149e | 140 | struct ethhdr hdr; |
1da177e4 LT |
141 | struct lacpdu lacpdu; |
142 | } lacpdu_header_t; | |
143 | ||
144 | // Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) | |
1c3f0b8e | 145 | typedef struct bond_marker { |
1da177e4 LT |
146 | u8 subtype; // = 0x02 (marker PDU) |
147 | u8 version_number; // = 0x01 | |
148 | u8 tlv_type; // = 0x01 (marker information) | |
149 | // = 0x02 (marker response information) | |
150 | u8 marker_length; // = 0x16 | |
151 | u16 requester_port; // The number assigned to the port by the requester | |
152 | struct mac_addr requester_system; // The requester's system id | |
153 | u32 requester_transaction_id; // The transaction id allocated by the requester, | |
154 | u16 pad; // = 0 | |
155 | u8 tlv_type_terminator; // = 0x00 | |
156 | u8 terminator_length; // = 0x00 | |
157 | u8 reserved_90[90]; // = 0 | |
1c3f0b8e | 158 | } bond_marker_t; |
1da177e4 | 159 | |
1c3f0b8e | 160 | typedef struct bond_marker_header { |
e727149e | 161 | struct ethhdr hdr; |
1c3f0b8e MD |
162 | struct bond_marker marker; |
163 | } bond_marker_header_t; | |
1da177e4 LT |
164 | |
165 | #pragma pack() | |
166 | ||
167 | struct slave; | |
168 | struct bonding; | |
169 | struct ad_info; | |
170 | struct port; | |
171 | ||
172 | #ifdef __ia64__ | |
173 | #pragma pack(8) | |
174 | #endif | |
175 | ||
176 | // aggregator structure(43.4.5 in the 802.3ad standard) | |
177 | typedef struct aggregator { | |
178 | struct mac_addr aggregator_mac_address; | |
179 | u16 aggregator_identifier; | |
1624db7b | 180 | bool is_individual; |
1da177e4 LT |
181 | u16 actor_admin_aggregator_key; |
182 | u16 actor_oper_aggregator_key; | |
183 | struct mac_addr partner_system; | |
184 | u16 partner_system_priority; | |
185 | u16 partner_oper_aggregator_key; | |
186 | u16 receive_state; // BOOLEAN | |
187 | u16 transmit_state; // BOOLEAN | |
188 | struct port *lag_ports; | |
189 | // ****** PRIVATE PARAMETERS ****** | |
190 | struct slave *slave; // pointer to the bond slave that this aggregator belongs to | |
191 | u16 is_active; // BOOLEAN. Indicates if this aggregator is active | |
192 | u16 num_of_ports; | |
193 | } aggregator_t; | |
194 | ||
1055c9ab HE |
195 | struct port_params { |
196 | struct mac_addr system; | |
197 | u16 system_priority; | |
198 | u16 key; | |
199 | u16 port_number; | |
200 | u16 port_priority; | |
201 | u16 port_state; | |
202 | }; | |
203 | ||
1da177e4 LT |
204 | // port structure(43.4.6 in the 802.3ad standard) |
205 | typedef struct port { | |
206 | u16 actor_port_number; | |
207 | u16 actor_port_priority; | |
208 | struct mac_addr actor_system; // This parameter is added here although it is not specified in the standard, just for simplification | |
209 | u16 actor_system_priority; // This parameter is added here although it is not specified in the standard, just for simplification | |
210 | u16 actor_port_aggregator_identifier; | |
d238d458 | 211 | bool ntt; |
1da177e4 LT |
212 | u16 actor_admin_port_key; |
213 | u16 actor_oper_port_key; | |
214 | u8 actor_admin_port_state; | |
215 | u8 actor_oper_port_state; | |
1055c9ab HE |
216 | |
217 | struct port_params partner_admin; | |
218 | struct port_params partner_oper; | |
219 | ||
f48127b6 HE |
220 | bool is_enabled; |
221 | ||
1da177e4 LT |
222 | // ****** PRIVATE PARAMETERS ****** |
223 | u16 sm_vars; // all state machines variables for this port | |
224 | rx_states_t sm_rx_state; // state machine rx state | |
225 | u16 sm_rx_timer_counter; // state machine rx timer counter | |
226 | periodic_states_t sm_periodic_state;// state machine periodic state | |
227 | u16 sm_periodic_timer_counter; // state machine periodic timer counter | |
228 | mux_states_t sm_mux_state; // state machine mux state | |
229 | u16 sm_mux_timer_counter; // state machine mux timer counter | |
230 | tx_states_t sm_tx_state; // state machine tx state | |
231 | u16 sm_tx_timer_counter; // state machine tx timer counter(allways on - enter to transmit state 3 time per second) | |
232 | struct slave *slave; // pointer to the bond slave that this port belongs to | |
233 | struct aggregator *aggregator; // pointer to an aggregator that this port related to | |
234 | struct port *next_port_in_aggregator; // Next port on the linked list of the parent aggregator | |
235 | u32 transaction_id; // continuous number for identification of Marker PDU's; | |
236 | struct lacpdu lacpdu; // the lacpdu that will be sent for this port | |
237 | } port_t; | |
238 | ||
239 | // system structure | |
87f422f8 | 240 | struct ad_system { |
1da177e4 LT |
241 | u16 sys_priority; |
242 | struct mac_addr sys_mac_addr; | |
87f422f8 | 243 | }; |
1da177e4 LT |
244 | |
245 | #ifdef __ia64__ | |
246 | #pragma pack() | |
247 | #endif | |
248 | ||
249 | // ================= AD Exported structures to the main bonding code ================== | |
250 | #define BOND_AD_INFO(bond) ((bond)->ad_info) | |
251 | #define SLAVE_AD_INFO(slave) ((slave)->ad_info) | |
252 | ||
253 | struct ad_bond_info { | |
87f422f8 | 254 | struct ad_system system; /* 802.3ad system structure */ |
1da177e4 LT |
255 | u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes |
256 | u32 agg_select_mode; // Mode of selection of active aggregator(bandwidth/count) | |
257 | int lacp_fast; /* whether fast periodic tx should be | |
258 | * requested | |
259 | */ | |
260 | struct timer_list ad_timer; | |
261 | struct packet_type ad_pkt_type; | |
262 | }; | |
263 | ||
264 | struct ad_slave_info { | |
265 | struct aggregator aggregator; // 802.3ad aggregator structure | |
266 | struct port port; // 802.3ad port structure | |
267 | spinlock_t rx_machine_lock; // To avoid race condition between callback and receive interrupt | |
268 | u16 id; | |
269 | }; | |
270 | ||
271 | // ================= AD Exported functions to the main bonding code ================== | |
272 | void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast); | |
273 | int bond_3ad_bind_slave(struct slave *slave); | |
274 | void bond_3ad_unbind_slave(struct slave *slave); | |
1b76b316 | 275 | void bond_3ad_state_machine_handler(struct work_struct *); |
fd989c83 | 276 | void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout); |
1da177e4 LT |
277 | void bond_3ad_adapter_speed_changed(struct slave *slave); |
278 | void bond_3ad_adapter_duplex_changed(struct slave *slave); | |
279 | void bond_3ad_handle_link_change(struct slave *slave, char link); | |
280 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | |
281 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | |
f2ccd8fa | 282 | int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev); |
ff59c456 | 283 | int bond_3ad_set_carrier(struct bonding *bond); |
1da177e4 LT |
284 | #endif //__BOND_3AD_H__ |
285 |