]>
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> | |
29 | ||
30 | // General definitions | |
31 | #define BOND_ETH_P_LACPDU 0x8809 | |
32 | #define PKT_TYPE_LACPDU __constant_htons(BOND_ETH_P_LACPDU) | |
33 | #define AD_TIMER_INTERVAL 100 /*msec*/ | |
34 | ||
35 | #define MULTICAST_LACPDU_ADDR {0x01, 0x80, 0xC2, 0x00, 0x00, 0x02} | |
36 | #define AD_MULTICAST_LACPDU_ADDR {MULTICAST_LACPDU_ADDR} | |
37 | ||
38 | #define AD_LACP_SLOW 0 | |
39 | #define AD_LACP_FAST 1 | |
40 | ||
41 | typedef struct mac_addr { | |
42 | u8 mac_addr_value[ETH_ALEN]; | |
43 | } mac_addr_t; | |
44 | ||
45 | typedef enum { | |
46 | AD_BANDWIDTH = 0, | |
47 | AD_COUNT | |
48 | } agg_selection_t; | |
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 | |
95 | } marker_subtype_t; | |
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 | ||
108 | typedef struct ad_header { | |
109 | struct mac_addr destination_address; | |
110 | struct mac_addr source_address; | |
111 | u16 length_type; | |
112 | } ad_header_t; | |
113 | ||
114 | // Link Aggregation Control Protocol(LACP) data unit structure(43.4.2.2 in the 802.3ad standard) | |
115 | typedef struct lacpdu { | |
116 | u8 subtype; // = LACP(= 0x01) | |
117 | u8 version_number; | |
118 | u8 tlv_type_actor_info; // = actor information(type/length/value) | |
119 | u8 actor_information_length; // = 20 | |
120 | u16 actor_system_priority; | |
121 | struct mac_addr actor_system; | |
122 | u16 actor_key; | |
123 | u16 actor_port_priority; | |
124 | u16 actor_port; | |
125 | u8 actor_state; | |
126 | u8 reserved_3_1[3]; // = 0 | |
127 | u8 tlv_type_partner_info; // = partner information | |
128 | u8 partner_information_length; // = 20 | |
129 | u16 partner_system_priority; | |
130 | struct mac_addr partner_system; | |
131 | u16 partner_key; | |
132 | u16 partner_port_priority; | |
133 | u16 partner_port; | |
134 | u8 partner_state; | |
135 | u8 reserved_3_2[3]; // = 0 | |
136 | u8 tlv_type_collector_info; // = collector information | |
137 | u8 collector_information_length; // = 16 | |
138 | u16 collector_max_delay; | |
139 | u8 reserved_12[12]; | |
140 | u8 tlv_type_terminator; // = terminator | |
141 | u8 terminator_length; // = 0 | |
142 | u8 reserved_50[50]; // = 0 | |
143 | } lacpdu_t; | |
144 | ||
145 | typedef struct lacpdu_header { | |
146 | struct ad_header ad_header; | |
147 | struct lacpdu lacpdu; | |
148 | } lacpdu_header_t; | |
149 | ||
150 | // Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) | |
151 | typedef struct marker { | |
152 | u8 subtype; // = 0x02 (marker PDU) | |
153 | u8 version_number; // = 0x01 | |
154 | u8 tlv_type; // = 0x01 (marker information) | |
155 | // = 0x02 (marker response information) | |
156 | u8 marker_length; // = 0x16 | |
157 | u16 requester_port; // The number assigned to the port by the requester | |
158 | struct mac_addr requester_system; // The requester's system id | |
159 | u32 requester_transaction_id; // The transaction id allocated by the requester, | |
160 | u16 pad; // = 0 | |
161 | u8 tlv_type_terminator; // = 0x00 | |
162 | u8 terminator_length; // = 0x00 | |
163 | u8 reserved_90[90]; // = 0 | |
164 | } marker_t; | |
165 | ||
166 | typedef struct marker_header { | |
167 | struct ad_header ad_header; | |
168 | struct marker marker; | |
169 | } marker_header_t; | |
170 | ||
171 | #pragma pack() | |
172 | ||
173 | struct slave; | |
174 | struct bonding; | |
175 | struct ad_info; | |
176 | struct port; | |
177 | ||
178 | #ifdef __ia64__ | |
179 | #pragma pack(8) | |
180 | #endif | |
181 | ||
182 | // aggregator structure(43.4.5 in the 802.3ad standard) | |
183 | typedef struct aggregator { | |
184 | struct mac_addr aggregator_mac_address; | |
185 | u16 aggregator_identifier; | |
186 | u16 is_individual; // BOOLEAN | |
187 | u16 actor_admin_aggregator_key; | |
188 | u16 actor_oper_aggregator_key; | |
189 | struct mac_addr partner_system; | |
190 | u16 partner_system_priority; | |
191 | u16 partner_oper_aggregator_key; | |
192 | u16 receive_state; // BOOLEAN | |
193 | u16 transmit_state; // BOOLEAN | |
194 | struct port *lag_ports; | |
195 | // ****** PRIVATE PARAMETERS ****** | |
196 | struct slave *slave; // pointer to the bond slave that this aggregator belongs to | |
197 | u16 is_active; // BOOLEAN. Indicates if this aggregator is active | |
198 | u16 num_of_ports; | |
199 | } aggregator_t; | |
200 | ||
201 | // port structure(43.4.6 in the 802.3ad standard) | |
202 | typedef struct port { | |
203 | u16 actor_port_number; | |
204 | u16 actor_port_priority; | |
205 | struct mac_addr actor_system; // This parameter is added here although it is not specified in the standard, just for simplification | |
206 | u16 actor_system_priority; // This parameter is added here although it is not specified in the standard, just for simplification | |
207 | u16 actor_port_aggregator_identifier; | |
208 | u16 ntt; // BOOLEAN | |
209 | u16 actor_admin_port_key; | |
210 | u16 actor_oper_port_key; | |
211 | u8 actor_admin_port_state; | |
212 | u8 actor_oper_port_state; | |
213 | struct mac_addr partner_admin_system; | |
214 | struct mac_addr partner_oper_system; | |
215 | u16 partner_admin_system_priority; | |
216 | u16 partner_oper_system_priority; | |
217 | u16 partner_admin_key; | |
218 | u16 partner_oper_key; | |
219 | u16 partner_admin_port_number; | |
220 | u16 partner_oper_port_number; | |
221 | u16 partner_admin_port_priority; | |
222 | u16 partner_oper_port_priority; | |
223 | u8 partner_admin_port_state; | |
224 | u8 partner_oper_port_state; | |
225 | u16 is_enabled; // BOOLEAN | |
226 | // ****** PRIVATE PARAMETERS ****** | |
227 | u16 sm_vars; // all state machines variables for this port | |
228 | rx_states_t sm_rx_state; // state machine rx state | |
229 | u16 sm_rx_timer_counter; // state machine rx timer counter | |
230 | periodic_states_t sm_periodic_state;// state machine periodic state | |
231 | u16 sm_periodic_timer_counter; // state machine periodic timer counter | |
232 | mux_states_t sm_mux_state; // state machine mux state | |
233 | u16 sm_mux_timer_counter; // state machine mux timer counter | |
234 | tx_states_t sm_tx_state; // state machine tx state | |
235 | u16 sm_tx_timer_counter; // state machine tx timer counter(allways on - enter to transmit state 3 time per second) | |
236 | struct slave *slave; // pointer to the bond slave that this port belongs to | |
237 | struct aggregator *aggregator; // pointer to an aggregator that this port related to | |
238 | struct port *next_port_in_aggregator; // Next port on the linked list of the parent aggregator | |
239 | u32 transaction_id; // continuous number for identification of Marker PDU's; | |
240 | struct lacpdu lacpdu; // the lacpdu that will be sent for this port | |
241 | } port_t; | |
242 | ||
243 | // system structure | |
244 | typedef struct ad_system { | |
245 | u16 sys_priority; | |
246 | struct mac_addr sys_mac_addr; | |
247 | } ad_system_t; | |
248 | ||
249 | #ifdef __ia64__ | |
250 | #pragma pack() | |
251 | #endif | |
252 | ||
253 | // ================= AD Exported structures to the main bonding code ================== | |
254 | #define BOND_AD_INFO(bond) ((bond)->ad_info) | |
255 | #define SLAVE_AD_INFO(slave) ((slave)->ad_info) | |
256 | ||
257 | struct ad_bond_info { | |
258 | ad_system_t system; // 802.3ad system structure | |
259 | u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes | |
260 | u32 agg_select_mode; // Mode of selection of active aggregator(bandwidth/count) | |
261 | int lacp_fast; /* whether fast periodic tx should be | |
262 | * requested | |
263 | */ | |
264 | struct timer_list ad_timer; | |
265 | struct packet_type ad_pkt_type; | |
266 | }; | |
267 | ||
268 | struct ad_slave_info { | |
269 | struct aggregator aggregator; // 802.3ad aggregator structure | |
270 | struct port port; // 802.3ad port structure | |
271 | spinlock_t rx_machine_lock; // To avoid race condition between callback and receive interrupt | |
272 | u16 id; | |
273 | }; | |
274 | ||
275 | // ================= AD Exported functions to the main bonding code ================== | |
276 | void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast); | |
277 | int bond_3ad_bind_slave(struct slave *slave); | |
278 | void bond_3ad_unbind_slave(struct slave *slave); | |
279 | void bond_3ad_state_machine_handler(struct bonding *bond); | |
280 | void bond_3ad_adapter_speed_changed(struct slave *slave); | |
281 | void bond_3ad_adapter_duplex_changed(struct slave *slave); | |
282 | void bond_3ad_handle_link_change(struct slave *slave, char link); | |
283 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | |
284 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | |
f2ccd8fa | 285 | int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev); |
ff59c456 | 286 | int bond_3ad_set_carrier(struct bonding *bond); |
1da177e4 LT |
287 | #endif //__BOND_3AD_H__ |
288 |