]>
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 | * | |
21 | * | |
22 | * Changes: | |
23 | * | |
24 | * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and | |
25 | * Amir Noam <amir.noam at intel dot com> | |
26 | * - Added support for lacp_rate module param. | |
27 | * | |
28 | * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com> | |
29 | * - Renamed bond_3ad_link_status_changed() to | |
30 | * bond_3ad_handle_link_change() for compatibility with TLB. | |
31 | * | |
32 | * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com> | |
33 | * - Code cleanup and style changes | |
34 | */ | |
35 | ||
36 | #ifndef __BOND_3AD_H__ | |
37 | #define __BOND_3AD_H__ | |
38 | ||
39 | #include <asm/byteorder.h> | |
40 | #include <linux/skbuff.h> | |
41 | #include <linux/netdevice.h> | |
42 | ||
43 | // General definitions | |
44 | #define BOND_ETH_P_LACPDU 0x8809 | |
45 | #define PKT_TYPE_LACPDU __constant_htons(BOND_ETH_P_LACPDU) | |
46 | #define AD_TIMER_INTERVAL 100 /*msec*/ | |
47 | ||
48 | #define MULTICAST_LACPDU_ADDR {0x01, 0x80, 0xC2, 0x00, 0x00, 0x02} | |
49 | #define AD_MULTICAST_LACPDU_ADDR {MULTICAST_LACPDU_ADDR} | |
50 | ||
51 | #define AD_LACP_SLOW 0 | |
52 | #define AD_LACP_FAST 1 | |
53 | ||
54 | typedef struct mac_addr { | |
55 | u8 mac_addr_value[ETH_ALEN]; | |
56 | } mac_addr_t; | |
57 | ||
58 | typedef enum { | |
59 | AD_BANDWIDTH = 0, | |
60 | AD_COUNT | |
61 | } agg_selection_t; | |
62 | ||
63 | // rx machine states(43.4.11 in the 802.3ad standard) | |
64 | typedef enum { | |
65 | AD_RX_DUMMY, | |
66 | AD_RX_INITIALIZE, // rx Machine | |
67 | AD_RX_PORT_DISABLED, // rx Machine | |
68 | AD_RX_LACP_DISABLED, // rx Machine | |
69 | AD_RX_EXPIRED, // rx Machine | |
70 | AD_RX_DEFAULTED, // rx Machine | |
71 | AD_RX_CURRENT // rx Machine | |
72 | } rx_states_t; | |
73 | ||
74 | // periodic machine states(43.4.12 in the 802.3ad standard) | |
75 | typedef enum { | |
76 | AD_PERIODIC_DUMMY, | |
77 | AD_NO_PERIODIC, // periodic machine | |
78 | AD_FAST_PERIODIC, // periodic machine | |
79 | AD_SLOW_PERIODIC, // periodic machine | |
80 | AD_PERIODIC_TX // periodic machine | |
81 | } periodic_states_t; | |
82 | ||
83 | // mux machine states(43.4.13 in the 802.3ad standard) | |
84 | typedef enum { | |
85 | AD_MUX_DUMMY, | |
86 | AD_MUX_DETACHED, // mux machine | |
87 | AD_MUX_WAITING, // mux machine | |
88 | AD_MUX_ATTACHED, // mux machine | |
89 | AD_MUX_COLLECTING_DISTRIBUTING // mux machine | |
90 | } mux_states_t; | |
91 | ||
92 | // tx machine states(43.4.15 in the 802.3ad standard) | |
93 | typedef enum { | |
94 | AD_TX_DUMMY, | |
95 | AD_TRANSMIT // tx Machine | |
96 | } tx_states_t; | |
97 | ||
98 | // rx indication types | |
99 | typedef enum { | |
100 | AD_TYPE_LACPDU = 1, // type lacpdu | |
101 | AD_TYPE_MARKER // type marker | |
102 | } pdu_type_t; | |
103 | ||
104 | // rx marker indication types | |
105 | typedef enum { | |
106 | AD_MARKER_INFORMATION_SUBTYPE = 1, // marker imformation subtype | |
107 | AD_MARKER_RESPONSE_SUBTYPE // marker response subtype | |
108 | } marker_subtype_t; | |
109 | ||
110 | // timers types(43.4.9 in the 802.3ad standard) | |
111 | typedef enum { | |
112 | AD_CURRENT_WHILE_TIMER, | |
113 | AD_ACTOR_CHURN_TIMER, | |
114 | AD_PERIODIC_TIMER, | |
115 | AD_PARTNER_CHURN_TIMER, | |
116 | AD_WAIT_WHILE_TIMER | |
117 | } ad_timers_t; | |
118 | ||
119 | #pragma pack(1) | |
120 | ||
121 | typedef struct ad_header { | |
122 | struct mac_addr destination_address; | |
123 | struct mac_addr source_address; | |
124 | u16 length_type; | |
125 | } ad_header_t; | |
126 | ||
127 | // Link Aggregation Control Protocol(LACP) data unit structure(43.4.2.2 in the 802.3ad standard) | |
128 | typedef struct lacpdu { | |
129 | u8 subtype; // = LACP(= 0x01) | |
130 | u8 version_number; | |
131 | u8 tlv_type_actor_info; // = actor information(type/length/value) | |
132 | u8 actor_information_length; // = 20 | |
133 | u16 actor_system_priority; | |
134 | struct mac_addr actor_system; | |
135 | u16 actor_key; | |
136 | u16 actor_port_priority; | |
137 | u16 actor_port; | |
138 | u8 actor_state; | |
139 | u8 reserved_3_1[3]; // = 0 | |
140 | u8 tlv_type_partner_info; // = partner information | |
141 | u8 partner_information_length; // = 20 | |
142 | u16 partner_system_priority; | |
143 | struct mac_addr partner_system; | |
144 | u16 partner_key; | |
145 | u16 partner_port_priority; | |
146 | u16 partner_port; | |
147 | u8 partner_state; | |
148 | u8 reserved_3_2[3]; // = 0 | |
149 | u8 tlv_type_collector_info; // = collector information | |
150 | u8 collector_information_length; // = 16 | |
151 | u16 collector_max_delay; | |
152 | u8 reserved_12[12]; | |
153 | u8 tlv_type_terminator; // = terminator | |
154 | u8 terminator_length; // = 0 | |
155 | u8 reserved_50[50]; // = 0 | |
156 | } lacpdu_t; | |
157 | ||
158 | typedef struct lacpdu_header { | |
159 | struct ad_header ad_header; | |
160 | struct lacpdu lacpdu; | |
161 | } lacpdu_header_t; | |
162 | ||
163 | // Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) | |
164 | typedef struct marker { | |
165 | u8 subtype; // = 0x02 (marker PDU) | |
166 | u8 version_number; // = 0x01 | |
167 | u8 tlv_type; // = 0x01 (marker information) | |
168 | // = 0x02 (marker response information) | |
169 | u8 marker_length; // = 0x16 | |
170 | u16 requester_port; // The number assigned to the port by the requester | |
171 | struct mac_addr requester_system; // The requester's system id | |
172 | u32 requester_transaction_id; // The transaction id allocated by the requester, | |
173 | u16 pad; // = 0 | |
174 | u8 tlv_type_terminator; // = 0x00 | |
175 | u8 terminator_length; // = 0x00 | |
176 | u8 reserved_90[90]; // = 0 | |
177 | } marker_t; | |
178 | ||
179 | typedef struct marker_header { | |
180 | struct ad_header ad_header; | |
181 | struct marker marker; | |
182 | } marker_header_t; | |
183 | ||
184 | #pragma pack() | |
185 | ||
186 | struct slave; | |
187 | struct bonding; | |
188 | struct ad_info; | |
189 | struct port; | |
190 | ||
191 | #ifdef __ia64__ | |
192 | #pragma pack(8) | |
193 | #endif | |
194 | ||
195 | // aggregator structure(43.4.5 in the 802.3ad standard) | |
196 | typedef struct aggregator { | |
197 | struct mac_addr aggregator_mac_address; | |
198 | u16 aggregator_identifier; | |
199 | u16 is_individual; // BOOLEAN | |
200 | u16 actor_admin_aggregator_key; | |
201 | u16 actor_oper_aggregator_key; | |
202 | struct mac_addr partner_system; | |
203 | u16 partner_system_priority; | |
204 | u16 partner_oper_aggregator_key; | |
205 | u16 receive_state; // BOOLEAN | |
206 | u16 transmit_state; // BOOLEAN | |
207 | struct port *lag_ports; | |
208 | // ****** PRIVATE PARAMETERS ****** | |
209 | struct slave *slave; // pointer to the bond slave that this aggregator belongs to | |
210 | u16 is_active; // BOOLEAN. Indicates if this aggregator is active | |
211 | u16 num_of_ports; | |
212 | } aggregator_t; | |
213 | ||
214 | // port structure(43.4.6 in the 802.3ad standard) | |
215 | typedef struct port { | |
216 | u16 actor_port_number; | |
217 | u16 actor_port_priority; | |
218 | struct mac_addr actor_system; // This parameter is added here although it is not specified in the standard, just for simplification | |
219 | u16 actor_system_priority; // This parameter is added here although it is not specified in the standard, just for simplification | |
220 | u16 actor_port_aggregator_identifier; | |
221 | u16 ntt; // BOOLEAN | |
222 | u16 actor_admin_port_key; | |
223 | u16 actor_oper_port_key; | |
224 | u8 actor_admin_port_state; | |
225 | u8 actor_oper_port_state; | |
226 | struct mac_addr partner_admin_system; | |
227 | struct mac_addr partner_oper_system; | |
228 | u16 partner_admin_system_priority; | |
229 | u16 partner_oper_system_priority; | |
230 | u16 partner_admin_key; | |
231 | u16 partner_oper_key; | |
232 | u16 partner_admin_port_number; | |
233 | u16 partner_oper_port_number; | |
234 | u16 partner_admin_port_priority; | |
235 | u16 partner_oper_port_priority; | |
236 | u8 partner_admin_port_state; | |
237 | u8 partner_oper_port_state; | |
238 | u16 is_enabled; // BOOLEAN | |
239 | // ****** PRIVATE PARAMETERS ****** | |
240 | u16 sm_vars; // all state machines variables for this port | |
241 | rx_states_t sm_rx_state; // state machine rx state | |
242 | u16 sm_rx_timer_counter; // state machine rx timer counter | |
243 | periodic_states_t sm_periodic_state;// state machine periodic state | |
244 | u16 sm_periodic_timer_counter; // state machine periodic timer counter | |
245 | mux_states_t sm_mux_state; // state machine mux state | |
246 | u16 sm_mux_timer_counter; // state machine mux timer counter | |
247 | tx_states_t sm_tx_state; // state machine tx state | |
248 | u16 sm_tx_timer_counter; // state machine tx timer counter(allways on - enter to transmit state 3 time per second) | |
249 | struct slave *slave; // pointer to the bond slave that this port belongs to | |
250 | struct aggregator *aggregator; // pointer to an aggregator that this port related to | |
251 | struct port *next_port_in_aggregator; // Next port on the linked list of the parent aggregator | |
252 | u32 transaction_id; // continuous number for identification of Marker PDU's; | |
253 | struct lacpdu lacpdu; // the lacpdu that will be sent for this port | |
254 | } port_t; | |
255 | ||
256 | // system structure | |
257 | typedef struct ad_system { | |
258 | u16 sys_priority; | |
259 | struct mac_addr sys_mac_addr; | |
260 | } ad_system_t; | |
261 | ||
262 | #ifdef __ia64__ | |
263 | #pragma pack() | |
264 | #endif | |
265 | ||
266 | // ================= AD Exported structures to the main bonding code ================== | |
267 | #define BOND_AD_INFO(bond) ((bond)->ad_info) | |
268 | #define SLAVE_AD_INFO(slave) ((slave)->ad_info) | |
269 | ||
270 | struct ad_bond_info { | |
271 | ad_system_t system; // 802.3ad system structure | |
272 | u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes | |
273 | u32 agg_select_mode; // Mode of selection of active aggregator(bandwidth/count) | |
274 | int lacp_fast; /* whether fast periodic tx should be | |
275 | * requested | |
276 | */ | |
277 | struct timer_list ad_timer; | |
278 | struct packet_type ad_pkt_type; | |
279 | }; | |
280 | ||
281 | struct ad_slave_info { | |
282 | struct aggregator aggregator; // 802.3ad aggregator structure | |
283 | struct port port; // 802.3ad port structure | |
284 | spinlock_t rx_machine_lock; // To avoid race condition between callback and receive interrupt | |
285 | u16 id; | |
286 | }; | |
287 | ||
288 | // ================= AD Exported functions to the main bonding code ================== | |
289 | void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast); | |
290 | int bond_3ad_bind_slave(struct slave *slave); | |
291 | void bond_3ad_unbind_slave(struct slave *slave); | |
292 | void bond_3ad_state_machine_handler(struct bonding *bond); | |
293 | void bond_3ad_adapter_speed_changed(struct slave *slave); | |
294 | void bond_3ad_adapter_duplex_changed(struct slave *slave); | |
295 | void bond_3ad_handle_link_change(struct slave *slave, char link); | |
296 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | |
297 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | |
298 | int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype); | |
299 | #endif //__BOND_3AD_H__ | |
300 |