aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r--drivers/net/bonding/bond_3ad.c120
-rw-r--r--drivers/net/bonding/bond_3ad.h25
2 files changed, 73 insertions, 72 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index 7a108fa24a6..d02e852afbd 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -486,21 +486,21 @@ static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
486 // validate lacpdu and port 486 // validate lacpdu and port
487 if (lacpdu && port) { 487 if (lacpdu && port) {
488 // record the new parameter values for the partner operational 488 // record the new parameter values for the partner operational
489 port->partner_oper_port_number = ntohs(lacpdu->actor_port); 489 port->partner_oper.port_number = ntohs(lacpdu->actor_port);
490 port->partner_oper_port_priority = ntohs(lacpdu->actor_port_priority); 490 port->partner_oper.port_priority = ntohs(lacpdu->actor_port_priority);
491 port->partner_oper_system = lacpdu->actor_system; 491 port->partner_oper.system = lacpdu->actor_system;
492 port->partner_oper_system_priority = ntohs(lacpdu->actor_system_priority); 492 port->partner_oper.system_priority = ntohs(lacpdu->actor_system_priority);
493 port->partner_oper_key = ntohs(lacpdu->actor_key); 493 port->partner_oper.key = ntohs(lacpdu->actor_key);
494 port->partner_oper_port_state = lacpdu->actor_state; 494 port->partner_oper.port_state = lacpdu->actor_state;
495 495
496 // set actor_oper_port_state.defaulted to FALSE 496 // set actor_oper_port_state.defaulted to FALSE
497 port->actor_oper_port_state &= ~AD_STATE_DEFAULTED; 497 port->actor_oper_port_state &= ~AD_STATE_DEFAULTED;
498 498
499 // set the partner sync. to on if the partner is sync. and the port is matched 499 // set the partner sync. to on if the partner is sync. and the port is matched
500 if ((port->sm_vars & AD_PORT_MATCHED) && (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) { 500 if ((port->sm_vars & AD_PORT_MATCHED) && (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) {
501 port->partner_oper_port_state |= AD_STATE_SYNCHRONIZATION; 501 port->partner_oper.port_state |= AD_STATE_SYNCHRONIZATION;
502 } else { 502 } else {
503 port->partner_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; 503 port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION;
504 } 504 }
505 } 505 }
506} 506}
@@ -518,12 +518,12 @@ static void __record_default(struct port *port)
518 // validate the port 518 // validate the port
519 if (port) { 519 if (port) {
520 // record the partner admin parameters 520 // record the partner admin parameters
521 port->partner_oper_port_number = port->partner_admin_port_number; 521 port->partner_oper.port_number = port->partner_admin.port_number;
522 port->partner_oper_port_priority = port->partner_admin_port_priority; 522 port->partner_oper.port_priority = port->partner_admin.port_priority;
523 port->partner_oper_system = port->partner_admin_system; 523 port->partner_oper.system = port->partner_admin.system;
524 port->partner_oper_system_priority = port->partner_admin_system_priority; 524 port->partner_oper.system_priority = port->partner_admin.system_priority;
525 port->partner_oper_key = port->partner_admin_key; 525 port->partner_oper.key = port->partner_admin.key;
526 port->partner_oper_port_state = port->partner_admin_port_state; 526 port->partner_oper.port_state = port->partner_admin.port_state;
527 527
528 // set actor_oper_port_state.defaulted to true 528 // set actor_oper_port_state.defaulted to true
529 port->actor_oper_port_state |= AD_STATE_DEFAULTED; 529 port->actor_oper_port_state |= AD_STATE_DEFAULTED;
@@ -548,12 +548,12 @@ static void __update_selected(struct lacpdu *lacpdu, struct port *port)
548 // validate lacpdu and port 548 // validate lacpdu and port
549 if (lacpdu && port) { 549 if (lacpdu && port) {
550 // check if any parameter is different 550 // check if any parameter is different
551 if ((ntohs(lacpdu->actor_port) != port->partner_oper_port_number) || 551 if ((ntohs(lacpdu->actor_port) != port->partner_oper.port_number) ||
552 (ntohs(lacpdu->actor_port_priority) != port->partner_oper_port_priority) || 552 (ntohs(lacpdu->actor_port_priority) != port->partner_oper.port_priority) ||
553 MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->partner_oper_system)) || 553 MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->partner_oper.system)) ||
554 (ntohs(lacpdu->actor_system_priority) != port->partner_oper_system_priority) || 554 (ntohs(lacpdu->actor_system_priority) != port->partner_oper.system_priority) ||
555 (ntohs(lacpdu->actor_key) != port->partner_oper_key) || 555 (ntohs(lacpdu->actor_key) != port->partner_oper.key) ||
556 ((lacpdu->actor_state & AD_STATE_AGGREGATION) != (port->partner_oper_port_state & AD_STATE_AGGREGATION)) 556 ((lacpdu->actor_state & AD_STATE_AGGREGATION) != (port->partner_oper.port_state & AD_STATE_AGGREGATION))
557 ) { 557 ) {
558 // update the state machine Selected variable 558 // update the state machine Selected variable
559 port->sm_vars &= ~AD_PORT_SELECTED; 559 port->sm_vars &= ~AD_PORT_SELECTED;
@@ -578,12 +578,12 @@ static void __update_default_selected(struct port *port)
578 // validate the port 578 // validate the port
579 if (port) { 579 if (port) {
580 // check if any parameter is different 580 // check if any parameter is different
581 if ((port->partner_admin_port_number != port->partner_oper_port_number) || 581 if ((port->partner_admin.port_number != port->partner_oper.port_number) ||
582 (port->partner_admin_port_priority != port->partner_oper_port_priority) || 582 (port->partner_admin.port_priority != port->partner_oper.port_priority) ||
583 MAC_ADDRESS_COMPARE(&(port->partner_admin_system), &(port->partner_oper_system)) || 583 MAC_ADDRESS_COMPARE(&(port->partner_admin.system), &(port->partner_oper.system)) ||
584 (port->partner_admin_system_priority != port->partner_oper_system_priority) || 584 (port->partner_admin.system_priority != port->partner_oper.system_priority) ||
585 (port->partner_admin_key != port->partner_oper_key) || 585 (port->partner_admin.key != port->partner_oper.key) ||
586 ((port->partner_admin_port_state & AD_STATE_AGGREGATION) != (port->partner_oper_port_state & AD_STATE_AGGREGATION)) 586 ((port->partner_admin.port_state & AD_STATE_AGGREGATION) != (port->partner_oper.port_state & AD_STATE_AGGREGATION))
587 ) { 587 ) {
588 // update the state machine Selected variable 588 // update the state machine Selected variable
589 port->sm_vars &= ~AD_PORT_SELECTED; 589 port->sm_vars &= ~AD_PORT_SELECTED;
@@ -819,12 +819,12 @@ static inline void __update_lacpdu_from_port(struct port *port)
819 * lacpdu->partner_information_length initialized 819 * lacpdu->partner_information_length initialized
820 */ 820 */
821 821
822 lacpdu->partner_system_priority = htons(port->partner_oper_system_priority); 822 lacpdu->partner_system_priority = htons(port->partner_oper.system_priority);
823 lacpdu->partner_system = port->partner_oper_system; 823 lacpdu->partner_system = port->partner_oper.system;
824 lacpdu->partner_key = htons(port->partner_oper_key); 824 lacpdu->partner_key = htons(port->partner_oper.key);
825 lacpdu->partner_port_priority = htons(port->partner_oper_port_priority); 825 lacpdu->partner_port_priority = htons(port->partner_oper.port_priority);
826 lacpdu->partner_port = htons(port->partner_oper_port_number); 826 lacpdu->partner_port = htons(port->partner_oper.port_number);
827 lacpdu->partner_state = port->partner_oper_port_state; 827 lacpdu->partner_state = port->partner_oper.port_state;
828 828
829 /* lacpdu->reserved_3_2 initialized 829 /* lacpdu->reserved_3_2 initialized
830 * lacpdu->tlv_type_collector_info initialized 830 * lacpdu->tlv_type_collector_info initialized
@@ -973,7 +973,7 @@ static void ad_mux_machine(struct port *port)
973 break; 973 break;
974 case AD_MUX_ATTACHED: 974 case AD_MUX_ATTACHED:
975 // check also if agg_select_timer expired(so the edable port will take place only after this timer) 975 // check also if agg_select_timer expired(so the edable port will take place only after this timer)
976 if ((port->sm_vars & AD_PORT_SELECTED) && (port->partner_oper_port_state & AD_STATE_SYNCHRONIZATION) && !__check_agg_selection_timer(port)) { 976 if ((port->sm_vars & AD_PORT_SELECTED) && (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && !__check_agg_selection_timer(port)) {
977 port->sm_mux_state = AD_MUX_COLLECTING_DISTRIBUTING;// next state 977 port->sm_mux_state = AD_MUX_COLLECTING_DISTRIBUTING;// next state
978 } else if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY)) { // if UNSELECTED or STANDBY 978 } else if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY)) { // if UNSELECTED or STANDBY
979 port->sm_vars &= ~AD_PORT_READY_N; 979 port->sm_vars &= ~AD_PORT_READY_N;
@@ -985,7 +985,7 @@ static void ad_mux_machine(struct port *port)
985 break; 985 break;
986 case AD_MUX_COLLECTING_DISTRIBUTING: 986 case AD_MUX_COLLECTING_DISTRIBUTING:
987 if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY) || 987 if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY) ||
988 !(port->partner_oper_port_state & AD_STATE_SYNCHRONIZATION) 988 !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION)
989 ) { 989 ) {
990 port->sm_mux_state = AD_MUX_ATTACHED;// next state 990 port->sm_mux_state = AD_MUX_ATTACHED;// next state
991 991
@@ -1129,7 +1129,7 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1129 case AD_RX_LACP_DISABLED: 1129 case AD_RX_LACP_DISABLED:
1130 port->sm_vars &= ~AD_PORT_SELECTED; 1130 port->sm_vars &= ~AD_PORT_SELECTED;
1131 __record_default(port); 1131 __record_default(port);
1132 port->partner_oper_port_state &= ~AD_STATE_AGGREGATION; 1132 port->partner_oper.port_state &= ~AD_STATE_AGGREGATION;
1133 port->sm_vars |= AD_PORT_MATCHED; 1133 port->sm_vars |= AD_PORT_MATCHED;
1134 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; 1134 port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1135 break; 1135 break;
@@ -1137,9 +1137,9 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1137 //Reset of the Synchronization flag. (Standard 43.4.12) 1137 //Reset of the Synchronization flag. (Standard 43.4.12)
1138 //This reset cause to disable this port in the COLLECTING_DISTRIBUTING state of the 1138 //This reset cause to disable this port in the COLLECTING_DISTRIBUTING state of the
1139 //mux machine in case of EXPIRED even if LINK_DOWN didn't arrive for the port. 1139 //mux machine in case of EXPIRED even if LINK_DOWN didn't arrive for the port.
1140 port->partner_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; 1140 port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION;
1141 port->sm_vars &= ~AD_PORT_MATCHED; 1141 port->sm_vars &= ~AD_PORT_MATCHED;
1142 port->partner_oper_port_state |= AD_SHORT_TIMEOUT; 1142 port->partner_oper.port_state |= AD_SHORT_TIMEOUT;
1143 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); 1143 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT));
1144 port->actor_oper_port_state |= AD_STATE_EXPIRED; 1144 port->actor_oper_port_state |= AD_STATE_EXPIRED;
1145 break; 1145 break;
@@ -1219,7 +1219,7 @@ static void ad_periodic_machine(struct port *port)
1219 1219
1220 // check if port was reinitialized 1220 // check if port was reinitialized
1221 if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) || 1221 if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) ||
1222 (!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper_port_state & AD_STATE_LACP_ACTIVITY)) 1222 (!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & AD_STATE_LACP_ACTIVITY))
1223 ) { 1223 ) {
1224 port->sm_periodic_state = AD_NO_PERIODIC; // next state 1224 port->sm_periodic_state = AD_NO_PERIODIC; // next state
1225 } 1225 }
@@ -1233,12 +1233,12 @@ static void ad_periodic_machine(struct port *port)
1233 // If not expired, check if there is some new timeout parameter from the partner state 1233 // If not expired, check if there is some new timeout parameter from the partner state
1234 switch (port->sm_periodic_state) { 1234 switch (port->sm_periodic_state) {
1235 case AD_FAST_PERIODIC: 1235 case AD_FAST_PERIODIC:
1236 if (!(port->partner_oper_port_state & AD_STATE_LACP_TIMEOUT)) { 1236 if (!(port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
1237 port->sm_periodic_state = AD_SLOW_PERIODIC; // next state 1237 port->sm_periodic_state = AD_SLOW_PERIODIC; // next state
1238 } 1238 }
1239 break; 1239 break;
1240 case AD_SLOW_PERIODIC: 1240 case AD_SLOW_PERIODIC:
1241 if ((port->partner_oper_port_state & AD_STATE_LACP_TIMEOUT)) { 1241 if ((port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
1242 // stop current timer 1242 // stop current timer
1243 port->sm_periodic_timer_counter = 0; 1243 port->sm_periodic_timer_counter = 0;
1244 port->sm_periodic_state = AD_PERIODIC_TX; // next state 1244 port->sm_periodic_state = AD_PERIODIC_TX; // next state
@@ -1254,7 +1254,7 @@ static void ad_periodic_machine(struct port *port)
1254 port->sm_periodic_state = AD_FAST_PERIODIC; // next state 1254 port->sm_periodic_state = AD_FAST_PERIODIC; // next state
1255 break; 1255 break;
1256 case AD_PERIODIC_TX: 1256 case AD_PERIODIC_TX:
1257 if (!(port->partner_oper_port_state & AD_STATE_LACP_TIMEOUT)) { 1257 if (!(port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
1258 port->sm_periodic_state = AD_SLOW_PERIODIC; // next state 1258 port->sm_periodic_state = AD_SLOW_PERIODIC; // next state
1259 } else { 1259 } else {
1260 port->sm_periodic_state = AD_FAST_PERIODIC; // next state 1260 port->sm_periodic_state = AD_FAST_PERIODIC; // next state
@@ -1353,11 +1353,11 @@ static void ad_port_selection_logic(struct port *port)
1353 } 1353 }
1354 // check if current aggregator suits us 1354 // check if current aggregator suits us
1355 if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && // if all parameters match AND 1355 if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && // if all parameters match AND
1356 !MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper_system)) && 1356 !MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper.system)) &&
1357 (aggregator->partner_system_priority == port->partner_oper_system_priority) && 1357 (aggregator->partner_system_priority == port->partner_oper.system_priority) &&
1358 (aggregator->partner_oper_aggregator_key == port->partner_oper_key) 1358 (aggregator->partner_oper_aggregator_key == port->partner_oper.key)
1359 ) && 1359 ) &&
1360 ((MAC_ADDRESS_COMPARE(&(port->partner_oper_system), &(null_mac_addr)) && // partner answers 1360 ((MAC_ADDRESS_COMPARE(&(port->partner_oper.system), &(null_mac_addr)) && // partner answers
1361 !aggregator->is_individual) // but is not individual OR 1361 !aggregator->is_individual) // but is not individual OR
1362 ) 1362 )
1363 ) { 1363 ) {
@@ -1393,9 +1393,9 @@ static void ad_port_selection_logic(struct port *port)
1393 1393
1394 port->aggregator->actor_admin_aggregator_key = port->actor_admin_port_key; 1394 port->aggregator->actor_admin_aggregator_key = port->actor_admin_port_key;
1395 port->aggregator->actor_oper_aggregator_key = port->actor_oper_port_key; 1395 port->aggregator->actor_oper_aggregator_key = port->actor_oper_port_key;
1396 port->aggregator->partner_system=port->partner_oper_system; 1396 port->aggregator->partner_system=port->partner_oper.system;
1397 port->aggregator->partner_system_priority = port->partner_oper_system_priority; 1397 port->aggregator->partner_system_priority = port->partner_oper.system_priority;
1398 port->aggregator->partner_oper_aggregator_key = port->partner_oper_key; 1398 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key;
1399 port->aggregator->receive_state = 1; 1399 port->aggregator->receive_state = 1;
1400 port->aggregator->transmit_state = 1; 1400 port->aggregator->transmit_state = 1;
1401 port->aggregator->lag_ports = port; 1401 port->aggregator->lag_ports = port;
@@ -1695,18 +1695,18 @@ static void ad_initialize_port(struct port *port, int lacp_fast)
1695 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; 1695 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
1696 } 1696 }
1697 1697
1698 port->partner_admin_system = null_mac_addr; 1698 port->partner_admin.system = null_mac_addr;
1699 port->partner_oper_system = null_mac_addr; 1699 port->partner_oper.system = null_mac_addr;
1700 port->partner_admin_system_priority = 0xffff; 1700 port->partner_admin.system_priority = 0xffff;
1701 port->partner_oper_system_priority = 0xffff; 1701 port->partner_oper.system_priority = 0xffff;
1702 port->partner_admin_key = 1; 1702 port->partner_admin.key = 1;
1703 port->partner_oper_key = 1; 1703 port->partner_oper.key = 1;
1704 port->partner_admin_port_number = 1; 1704 port->partner_admin.port_number = 1;
1705 port->partner_oper_port_number = 1; 1705 port->partner_oper.port_number = 1;
1706 port->partner_admin_port_priority = 0xff; 1706 port->partner_admin.port_priority = 0xff;
1707 port->partner_oper_port_priority = 0xff; 1707 port->partner_oper.port_priority = 0xff;
1708 port->partner_admin_port_state = 1; 1708 port->partner_admin.port_state = 1;
1709 port->partner_oper_port_state = 1; 1709 port->partner_oper.port_state = 1;
1710 port->is_enabled = 1; 1710 port->is_enabled = 1;
1711 // ****** private parameters ****** 1711 // ****** private parameters ******
1712 port->sm_vars = 0x3; 1712 port->sm_vars = 0x3;
diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h
index a803fe05f63..d5332cc6dee 100644
--- a/drivers/net/bonding/bond_3ad.h
+++ b/drivers/net/bonding/bond_3ad.h
@@ -199,6 +199,15 @@ typedef struct aggregator {
199 u16 num_of_ports; 199 u16 num_of_ports;
200} aggregator_t; 200} aggregator_t;
201 201
202struct port_params {
203 struct mac_addr system;
204 u16 system_priority;
205 u16 key;
206 u16 port_number;
207 u16 port_priority;
208 u16 port_state;
209};
210
202// port structure(43.4.6 in the 802.3ad standard) 211// port structure(43.4.6 in the 802.3ad standard)
203typedef struct port { 212typedef struct port {
204 u16 actor_port_number; 213 u16 actor_port_number;
@@ -211,18 +220,10 @@ typedef struct port {
211 u16 actor_oper_port_key; 220 u16 actor_oper_port_key;
212 u8 actor_admin_port_state; 221 u8 actor_admin_port_state;
213 u8 actor_oper_port_state; 222 u8 actor_oper_port_state;
214 struct mac_addr partner_admin_system; 223
215 struct mac_addr partner_oper_system; 224 struct port_params partner_admin;
216 u16 partner_admin_system_priority; 225 struct port_params partner_oper;
217 u16 partner_oper_system_priority; 226
218 u16 partner_admin_key;
219 u16 partner_oper_key;
220 u16 partner_admin_port_number;
221 u16 partner_oper_port_number;
222 u16 partner_admin_port_priority;
223 u16 partner_oper_port_priority;
224 u8 partner_admin_port_state;
225 u8 partner_oper_port_state;
226 u16 is_enabled; // BOOLEAN 227 u16 is_enabled; // BOOLEAN
227 // ****** PRIVATE PARAMETERS ****** 228 // ****** PRIVATE PARAMETERS ******
228 u16 sm_vars; // all state machines variables for this port 229 u16 sm_vars; // all state machines variables for this port