bond_3ad.h revision f2ccd8fa06c8e302116e71df372f5c1f83432e03
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify it 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * under the terms of the GNU General Public License as published by the Free 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation; either version 2 of the License, or (at your option) 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * any later version. 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, but WITHOUT 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * more details. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License along with 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * this program; if not, write to the Free Software Foundation, Inc., 59 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The full GNU General Public License is included in this distribution in the 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * file called LICENSE. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changes: 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003/05/01 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Amir Noam <amir.noam at intel dot com> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Added support for lacp_rate module param. 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com> 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Renamed bond_3ad_link_status_changed() to 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bond_3ad_handle_link_change() for compatibility with TLB. 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com> 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Code cleanup and style changes 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __BOND_3AD_H__ 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __BOND_3AD_H__ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/byteorder.h> 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/skbuff.h> 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netdevice.h> 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// General definitions 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BOND_ETH_P_LACPDU 0x8809 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PKT_TYPE_LACPDU __constant_htons(BOND_ETH_P_LACPDU) 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AD_TIMER_INTERVAL 100 /*msec*/ 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MULTICAST_LACPDU_ADDR {0x01, 0x80, 0xC2, 0x00, 0x00, 0x02} 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AD_MULTICAST_LACPDU_ADDR {MULTICAST_LACPDU_ADDR} 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AD_LACP_SLOW 0 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AD_LACP_FAST 1 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct mac_addr { 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 mac_addr_value[ETH_ALEN]; 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} mac_addr_t; 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_BANDWIDTH = 0, 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_COUNT 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} agg_selection_t; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// rx machine states(43.4.11 in the 802.3ad standard) 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_DUMMY, 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_INITIALIZE, // rx Machine 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_PORT_DISABLED, // rx Machine 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_LACP_DISABLED, // rx Machine 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_EXPIRED, // rx Machine 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_DEFAULTED, // rx Machine 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_RX_CURRENT // rx Machine 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} rx_states_t; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// periodic machine states(43.4.12 in the 802.3ad standard) 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_PERIODIC_DUMMY, 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_NO_PERIODIC, // periodic machine 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_FAST_PERIODIC, // periodic machine 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_SLOW_PERIODIC, // periodic machine 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_PERIODIC_TX // periodic machine 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} periodic_states_t; 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// mux machine states(43.4.13 in the 802.3ad standard) 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MUX_DUMMY, 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MUX_DETACHED, // mux machine 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MUX_WAITING, // mux machine 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MUX_ATTACHED, // mux machine 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MUX_COLLECTING_DISTRIBUTING // mux machine 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} mux_states_t; 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// tx machine states(43.4.15 in the 802.3ad standard) 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_TX_DUMMY, 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_TRANSMIT // tx Machine 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} tx_states_t; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// rx indication types 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_TYPE_LACPDU = 1, // type lacpdu 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_TYPE_MARKER // type marker 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} pdu_type_t; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// rx marker indication types 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MARKER_INFORMATION_SUBTYPE = 1, // marker imformation subtype 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_MARKER_RESPONSE_SUBTYPE // marker response subtype 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} marker_subtype_t; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// timers types(43.4.9 in the 802.3ad standard) 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum { 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_CURRENT_WHILE_TIMER, 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_ACTOR_CHURN_TIMER, 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_PERIODIC_TIMER, 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_PARTNER_CHURN_TIMER, 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AD_WAIT_WHILE_TIMER 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ad_timers_t; 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ad_header { 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr destination_address; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr source_address; 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 length_type; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ad_header_t; 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Link Aggregation Control Protocol(LACP) data unit structure(43.4.2.2 in the 802.3ad standard) 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct lacpdu { 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 subtype; // = LACP(= 0x01) 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 version_number; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tlv_type_actor_info; // = actor information(type/length/value) 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 actor_information_length; // = 20 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_system_priority; 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr actor_system; 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_key; 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_port_priority; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_port; 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 actor_state; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved_3_1[3]; // = 0 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tlv_type_partner_info; // = partner information 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 partner_information_length; // = 20 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_system_priority; 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr partner_system; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_key; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_port_priority; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_port; 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 partner_state; 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved_3_2[3]; // = 0 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tlv_type_collector_info; // = collector information 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 collector_information_length; // = 16 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 collector_max_delay; 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved_12[12]; 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tlv_type_terminator; // = terminator 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 terminator_length; // = 0 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved_50[50]; // = 0 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} lacpdu_t; 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct lacpdu_header { 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ad_header ad_header; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct lacpdu lacpdu; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} lacpdu_header_t; 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct marker { 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 subtype; // = 0x02 (marker PDU) 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 version_number; // = 0x01 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tlv_type; // = 0x01 (marker information) 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // = 0x02 (marker response information) 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 marker_length; // = 0x16 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 requester_port; // The number assigned to the port by the requester 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr requester_system; // The requester's system id 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 requester_transaction_id; // The transaction id allocated by the requester, 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 pad; // = 0 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 tlv_type_terminator; // = 0x00 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 terminator_length; // = 0x00 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reserved_90[90]; // = 0 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} marker_t; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct marker_header { 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ad_header ad_header; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct marker marker; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} marker_header_t; 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct slave; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct bonding; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ad_info; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct port; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __ia64__ 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(8) 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// aggregator structure(43.4.5 in the 802.3ad standard) 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct aggregator { 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr aggregator_mac_address; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 aggregator_identifier; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 is_individual; // BOOLEAN 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_admin_aggregator_key; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_oper_aggregator_key; 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr partner_system; 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_system_priority; 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_oper_aggregator_key; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 receive_state; // BOOLEAN 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 transmit_state; // BOOLEAN 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct port *lag_ports; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // ****** PRIVATE PARAMETERS ****** 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slave *slave; // pointer to the bond slave that this aggregator belongs to 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 is_active; // BOOLEAN. Indicates if this aggregator is active 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 num_of_ports; 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} aggregator_t; 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// port structure(43.4.6 in the 802.3ad standard) 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct port { 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_port_number; 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_port_priority; 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr actor_system; // This parameter is added here although it is not specified in the standard, just for simplification 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_system_priority; // This parameter is added here although it is not specified in the standard, just for simplification 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_port_aggregator_identifier; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 ntt; // BOOLEAN 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_admin_port_key; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 actor_oper_port_key; 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 actor_admin_port_state; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 actor_oper_port_state; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr partner_admin_system; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr partner_oper_system; 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_admin_system_priority; 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_oper_system_priority; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_admin_key; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_oper_key; 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_admin_port_number; 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_oper_port_number; 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_admin_port_priority; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 partner_oper_port_priority; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 partner_admin_port_state; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 partner_oper_port_state; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 is_enabled; // BOOLEAN 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // ****** PRIVATE PARAMETERS ****** 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 sm_vars; // all state machines variables for this port 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rx_states_t sm_rx_state; // state machine rx state 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 sm_rx_timer_counter; // state machine rx timer counter 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds periodic_states_t sm_periodic_state;// state machine periodic state 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 sm_periodic_timer_counter; // state machine periodic timer counter 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mux_states_t sm_mux_state; // state machine mux state 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 sm_mux_timer_counter; // state machine mux timer counter 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tx_states_t sm_tx_state; // state machine tx state 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 sm_tx_timer_counter; // state machine tx timer counter(allways on - enter to transmit state 3 time per second) 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slave *slave; // pointer to the bond slave that this port belongs to 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aggregator *aggregator; // pointer to an aggregator that this port related to 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct port *next_port_in_aggregator; // Next port on the linked list of the parent aggregator 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 transaction_id; // continuous number for identification of Marker PDU's; 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct lacpdu lacpdu; // the lacpdu that will be sent for this port 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} port_t; 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// system structure 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct ad_system { 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 sys_priority; 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct mac_addr sys_mac_addr; 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ad_system_t; 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __ia64__ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// ================= AD Exported structures to the main bonding code ================== 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BOND_AD_INFO(bond) ((bond)->ad_info) 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SLAVE_AD_INFO(slave) ((slave)->ad_info) 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ad_bond_info { 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ad_system_t system; // 802.3ad system structure 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 agg_select_mode; // Mode of selection of active aggregator(bandwidth/count) 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int lacp_fast; /* whether fast periodic tx should be 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * requested 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct timer_list ad_timer; 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct packet_type ad_pkt_type; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ad_slave_info { 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aggregator aggregator; // 802.3ad aggregator structure 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct port port; // 802.3ad port structure 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t rx_machine_lock; // To avoid race condition between callback and receive interrupt 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 id; 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// ================= AD Exported functions to the main bonding code ================== 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast); 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint bond_3ad_bind_slave(struct slave *slave); 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid bond_3ad_unbind_slave(struct slave *slave); 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid bond_3ad_state_machine_handler(struct bonding *bond); 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid bond_3ad_adapter_speed_changed(struct slave *slave); 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid bond_3ad_adapter_duplex_changed(struct slave *slave); 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid bond_3ad_handle_link_change(struct slave *slave, char link); 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); 298f2ccd8fa06c8e302116e71df372f5c1f83432e03David S. Millerint bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev); 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif //__BOND_3AD_H__ 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301