Lines Matching refs:port
110 static int ad_lacpdu_send(struct port *port);
111 static int ad_marker_send(struct port *port, struct bond_marker *marker);
112 static void ad_mux_machine(struct port *port, bool *update_slave_arr);
113 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
114 static void ad_tx_machine(struct port *port);
115 static void ad_periodic_machine(struct port *port);
116 static void ad_port_selection_logic(struct port *port, bool *update_slave_arr);
121 static void ad_initialize_port(struct port *port, int lacp_fast);
122 static void ad_enable_collecting_distributing(struct port *port,
124 static void ad_disable_collecting_distributing(struct port *port,
127 struct port *port);
129 struct port *port);
140 static inline struct bonding *__get_bond_by_port(struct port *port) in __get_bond_by_port() argument
142 if (port->slave == NULL) in __get_bond_by_port()
145 return bond_get_bond_by_slave(port->slave); in __get_bond_by_port()
156 static inline struct aggregator *__get_first_agg(struct port *port) in __get_first_agg() argument
158 struct bonding *bond = __get_bond_by_port(port); in __get_first_agg()
190 static inline void __disable_port(struct port *port) in __disable_port() argument
192 bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER); in __disable_port()
199 static inline void __enable_port(struct port *port) in __enable_port() argument
201 struct slave *slave = port->slave; in __enable_port()
211 static inline int __port_is_enabled(struct port *port) in __port_is_enabled() argument
213 return bond_is_active_slave(port->slave); in __port_is_enabled()
222 static inline u32 __get_agg_selection_mode(struct port *port) in __get_agg_selection_mode() argument
224 struct bonding *bond = __get_bond_by_port(port); in __get_agg_selection_mode()
236 static inline int __check_agg_selection_timer(struct port *port) in __check_agg_selection_timer() argument
238 struct bonding *bond = __get_bond_by_port(port); in __check_agg_selection_timer()
261 static u16 __get_link_speed(struct port *port) in __get_link_speed() argument
263 struct slave *slave = port->slave; in __get_link_speed()
315 port->actor_port_number, speed); in __get_link_speed()
327 static u8 __get_duplex(struct port *port) in __get_duplex() argument
329 struct slave *slave = port->slave; in __get_duplex()
342 port->actor_port_number); in __get_duplex()
348 port->actor_port_number); in __get_duplex()
420 static void __choose_matched(struct lacpdu *lacpdu, struct port *port) in __choose_matched() argument
426 if (((ntohs(lacpdu->partner_port) == port->actor_port_number) && in __choose_matched()
427 (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) && in __choose_matched()
428 MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) && in __choose_matched()
429 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && in __choose_matched()
430 (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && in __choose_matched()
431 …((lacpdu->partner_state & AD_STATE_AGGREGATION) == (port->actor_oper_port_state & AD_STATE_AGGREGA… in __choose_matched()
434 port->sm_vars |= AD_PORT_MATCHED; in __choose_matched()
436 port->sm_vars &= ~AD_PORT_MATCHED; in __choose_matched()
449 static void __record_pdu(struct lacpdu *lacpdu, struct port *port) in __record_pdu() argument
451 if (lacpdu && port) { in __record_pdu()
452 struct port_params *partner = &port->partner_oper; in __record_pdu()
454 __choose_matched(lacpdu, port); in __record_pdu()
466 port->actor_oper_port_state &= ~AD_STATE_DEFAULTED; in __record_pdu()
471 if ((port->sm_vars & AD_PORT_MATCHED) && in __record_pdu()
474 pr_debug("%s partner sync=1\n", port->slave->dev->name); in __record_pdu()
477 pr_debug("%s partner sync=0\n", port->slave->dev->name); in __record_pdu()
490 static void __record_default(struct port *port) in __record_default() argument
492 if (port) { in __record_default()
494 memcpy(&port->partner_oper, &port->partner_admin, in __record_default()
498 port->actor_oper_port_state |= AD_STATE_DEFAULTED; in __record_default()
515 static void __update_selected(struct lacpdu *lacpdu, struct port *port) in __update_selected() argument
517 if (lacpdu && port) { in __update_selected()
518 const struct port_params *partner = &port->partner_oper; in __update_selected()
529 port->sm_vars &= ~AD_PORT_SELECTED; in __update_selected()
546 static void __update_default_selected(struct port *port) in __update_default_selected() argument
548 if (port) { in __update_default_selected()
549 const struct port_params *admin = &port->partner_admin; in __update_default_selected()
550 const struct port_params *oper = &port->partner_oper; in __update_default_selected()
562 port->sm_vars &= ~AD_PORT_SELECTED; in __update_default_selected()
579 static void __update_ntt(struct lacpdu *lacpdu, struct port *port) in __update_ntt() argument
582 if (lacpdu && port) { in __update_ntt()
586 if ((ntohs(lacpdu->partner_port) != port->actor_port_number) || in __update_ntt()
587 (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) || in __update_ntt()
588 !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) || in __update_ntt()
589 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || in __update_ntt()
590 (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || in __update_ntt()
591 …((lacpdu->partner_state & AD_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & AD_STATE_LACP_… in __update_ntt()
592 …((lacpdu->partner_state & AD_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & AD_STATE_LACP_T… in __update_ntt()
593 …((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYN… in __update_ntt()
594 …((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGA… in __update_ntt()
596 port->ntt = true; in __update_ntt()
608 struct port *port; in __agg_ports_are_ready() local
615 for (port = aggregator->lag_ports; in __agg_ports_are_ready()
616 port; in __agg_ports_are_ready()
617 port = port->next_port_in_aggregator) { in __agg_ports_are_ready()
618 if (!(port->sm_vars & AD_PORT_READY_N)) { in __agg_ports_are_ready()
636 struct port *port; in __set_agg_ports_ready() local
638 for (port = aggregator->lag_ports; port; in __set_agg_ports_ready()
639 port = port->next_port_in_aggregator) { in __set_agg_ports_ready()
641 port->sm_vars |= AD_PORT_READY; in __set_agg_ports_ready()
643 port->sm_vars &= ~AD_PORT_READY; in __set_agg_ports_ready()
715 static inline void __update_lacpdu_from_port(struct port *port) in __update_lacpdu_from_port() argument
717 struct lacpdu *lacpdu = &port->lacpdu; in __update_lacpdu_from_port()
718 const struct port_params *partner = &port->partner_oper; in __update_lacpdu_from_port()
727 lacpdu->actor_system_priority = htons(port->actor_system_priority); in __update_lacpdu_from_port()
728 lacpdu->actor_system = port->actor_system; in __update_lacpdu_from_port()
729 lacpdu->actor_key = htons(port->actor_oper_port_key); in __update_lacpdu_from_port()
730 lacpdu->actor_port_priority = htons(port->actor_port_priority); in __update_lacpdu_from_port()
731 lacpdu->actor_port = htons(port->actor_port_number); in __update_lacpdu_from_port()
732 lacpdu->actor_state = port->actor_oper_port_state; in __update_lacpdu_from_port()
734 port->slave->dev->name, port->actor_oper_port_state); in __update_lacpdu_from_port()
768 static int ad_lacpdu_send(struct port *port) in ad_lacpdu_send() argument
770 struct slave *slave = port->slave; in ad_lacpdu_send()
794 lacpdu_header->lacpdu = port->lacpdu; in ad_lacpdu_send()
809 static int ad_marker_send(struct port *port, struct bond_marker *marker) in ad_marker_send() argument
811 struct slave *slave = port->slave; in ad_marker_send()
848 static void ad_mux_machine(struct port *port, bool *update_slave_arr) in ad_mux_machine() argument
855 last_state = port->sm_mux_state; in ad_mux_machine()
857 if (port->sm_vars & AD_PORT_BEGIN) { in ad_mux_machine()
858 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
860 switch (port->sm_mux_state) { in ad_mux_machine()
862 if ((port->sm_vars & AD_PORT_SELECTED) in ad_mux_machine()
863 || (port->sm_vars & AD_PORT_STANDBY)) in ad_mux_machine()
865 port->sm_mux_state = AD_MUX_WAITING; in ad_mux_machine()
869 if (!(port->sm_vars & AD_PORT_SELECTED)) { in ad_mux_machine()
870 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
876 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
877 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
882 if (port->sm_mux_timer_counter in ad_mux_machine()
883 && !(--port->sm_mux_timer_counter)) in ad_mux_machine()
884 port->sm_vars |= AD_PORT_READY_N; in ad_mux_machine()
891 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
896 if ((port->sm_vars & AD_PORT_READY) in ad_mux_machine()
897 && !port->sm_mux_timer_counter) in ad_mux_machine()
898 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
904 if ((port->sm_vars & AD_PORT_SELECTED) && in ad_mux_machine()
905 (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && in ad_mux_machine()
906 !__check_agg_selection_timer(port)) { in ad_mux_machine()
907 if (port->aggregator->is_active) in ad_mux_machine()
908 port->sm_mux_state = in ad_mux_machine()
910 } else if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
911 (port->sm_vars & AD_PORT_STANDBY)) { in ad_mux_machine()
913 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
919 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
920 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
921 } else if (port->aggregator->is_active) { in ad_mux_machine()
922 port->actor_oper_port_state |= in ad_mux_machine()
927 if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
928 (port->sm_vars & AD_PORT_STANDBY) || in ad_mux_machine()
929 !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) || in ad_mux_machine()
930 !(port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) { in ad_mux_machine()
931 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
937 if (port->aggregator && in ad_mux_machine()
938 port->aggregator->is_active && in ad_mux_machine()
939 !__port_is_enabled(port)) { in ad_mux_machine()
941 __enable_port(port); in ad_mux_machine()
951 if (port->sm_mux_state != last_state) { in ad_mux_machine()
953 port->actor_port_number, in ad_mux_machine()
954 port->slave->dev->name, in ad_mux_machine()
956 port->sm_mux_state); in ad_mux_machine()
957 switch (port->sm_mux_state) { in ad_mux_machine()
959 port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; in ad_mux_machine()
960 ad_disable_collecting_distributing(port, in ad_mux_machine()
962 port->actor_oper_port_state &= ~AD_STATE_COLLECTING; in ad_mux_machine()
963 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; in ad_mux_machine()
964 port->ntt = true; in ad_mux_machine()
967 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0); in ad_mux_machine()
970 if (port->aggregator->is_active) in ad_mux_machine()
971 port->actor_oper_port_state |= in ad_mux_machine()
974 port->actor_oper_port_state &= in ad_mux_machine()
976 port->actor_oper_port_state &= ~AD_STATE_COLLECTING; in ad_mux_machine()
977 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; in ad_mux_machine()
978 ad_disable_collecting_distributing(port, in ad_mux_machine()
980 port->ntt = true; in ad_mux_machine()
983 port->actor_oper_port_state |= AD_STATE_COLLECTING; in ad_mux_machine()
984 port->actor_oper_port_state |= AD_STATE_DISTRIBUTING; in ad_mux_machine()
985 port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION; in ad_mux_machine()
986 ad_enable_collecting_distributing(port, in ad_mux_machine()
988 port->ntt = true; in ad_mux_machine()
1005 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) in ad_rx_machine() argument
1012 last_state = port->sm_rx_state; in ad_rx_machine()
1017 if (port->sm_vars & AD_PORT_BEGIN) { in ad_rx_machine()
1018 port->sm_rx_state = AD_RX_INITIALIZE; in ad_rx_machine()
1019 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1021 } else if (!(port->sm_vars & AD_PORT_BEGIN) in ad_rx_machine()
1022 && !port->is_enabled && !(port->sm_vars & AD_PORT_MOVED)) in ad_rx_machine()
1023 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1025 else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) || in ad_rx_machine()
1026 (port->sm_rx_state == AD_RX_DEFAULTED) || in ad_rx_machine()
1027 (port->sm_rx_state == AD_RX_CURRENT))) { in ad_rx_machine()
1028 if (port->sm_rx_state != AD_RX_CURRENT) in ad_rx_machine()
1029 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1030 port->sm_rx_timer_counter = 0; in ad_rx_machine()
1031 port->sm_rx_state = AD_RX_CURRENT; in ad_rx_machine()
1034 if (port->sm_rx_timer_counter && in ad_rx_machine()
1035 !(--port->sm_rx_timer_counter)) { in ad_rx_machine()
1036 switch (port->sm_rx_state) { in ad_rx_machine()
1038 port->sm_rx_state = AD_RX_DEFAULTED; in ad_rx_machine()
1041 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1048 switch (port->sm_rx_state) { in ad_rx_machine()
1050 if (port->sm_vars & AD_PORT_MOVED) in ad_rx_machine()
1051 port->sm_rx_state = AD_RX_INITIALIZE; in ad_rx_machine()
1052 else if (port->is_enabled in ad_rx_machine()
1053 && (port->sm_vars in ad_rx_machine()
1055 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1056 else if (port->is_enabled in ad_rx_machine()
1057 && ((port->sm_vars in ad_rx_machine()
1059 port->sm_rx_state = AD_RX_LACP_DISABLED; in ad_rx_machine()
1069 if ((port->sm_rx_state != last_state) || (lacpdu)) { in ad_rx_machine()
1071 port->actor_port_number, in ad_rx_machine()
1072 port->slave->dev->name, in ad_rx_machine()
1074 port->sm_rx_state); in ad_rx_machine()
1075 switch (port->sm_rx_state) { in ad_rx_machine()
1077 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)) in ad_rx_machine()
1078 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_rx_machine()
1080 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_rx_machine()
1081 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1082 __record_default(port); in ad_rx_machine()
1083 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1084 port->sm_vars &= ~AD_PORT_MOVED; in ad_rx_machine()
1085 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1089 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1092 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1093 __record_default(port); in ad_rx_machine()
1094 port->partner_oper.port_state &= ~AD_STATE_AGGREGATION; in ad_rx_machine()
1095 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1096 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1105 port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION; in ad_rx_machine()
1106 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1107 port->partner_oper.port_state |= AD_STATE_LACP_TIMEOUT; in ad_rx_machine()
1108 port->partner_oper.port_state |= AD_STATE_LACP_ACTIVITY; in ad_rx_machine()
1109 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); in ad_rx_machine()
1110 port->actor_oper_port_state |= AD_STATE_EXPIRED; in ad_rx_machine()
1111 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1114 __update_default_selected(port); in ad_rx_machine()
1115 __record_default(port); in ad_rx_machine()
1116 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1117 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1122 &(port->actor_system))) { in ad_rx_machine()
1123 netdev_err(port->slave->bond->dev, "An illegal loopback occurred on adapter (%s)\n" in ad_rx_machine()
1125 port->slave->dev->name); in ad_rx_machine()
1128 __update_selected(lacpdu, port); in ad_rx_machine()
1129 __update_ntt(lacpdu, port); in ad_rx_machine()
1130 __record_pdu(lacpdu, port); in ad_rx_machine()
1131 …port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_por… in ad_rx_machine()
1132 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1145 static void ad_churn_machine(struct port *port) in ad_churn_machine() argument
1147 if (port->sm_vars & AD_PORT_CHURNED) { in ad_churn_machine()
1148 port->sm_vars &= ~AD_PORT_CHURNED; in ad_churn_machine()
1149 port->sm_churn_actor_state = AD_CHURN_MONITOR; in ad_churn_machine()
1150 port->sm_churn_partner_state = AD_CHURN_MONITOR; in ad_churn_machine()
1151 port->sm_churn_actor_timer_counter = in ad_churn_machine()
1153 port->sm_churn_partner_timer_counter = in ad_churn_machine()
1157 if (port->sm_churn_actor_timer_counter && in ad_churn_machine()
1158 !(--port->sm_churn_actor_timer_counter) && in ad_churn_machine()
1159 port->sm_churn_actor_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1160 if (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1161 port->sm_churn_actor_state = AD_NO_CHURN; in ad_churn_machine()
1163 port->churn_actor_count++; in ad_churn_machine()
1164 port->sm_churn_actor_state = AD_CHURN; in ad_churn_machine()
1167 if (port->sm_churn_partner_timer_counter && in ad_churn_machine()
1168 !(--port->sm_churn_partner_timer_counter) && in ad_churn_machine()
1169 port->sm_churn_partner_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1170 if (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1171 port->sm_churn_partner_state = AD_NO_CHURN; in ad_churn_machine()
1173 port->churn_partner_count++; in ad_churn_machine()
1174 port->sm_churn_partner_state = AD_CHURN; in ad_churn_machine()
1183 static void ad_tx_machine(struct port *port) in ad_tx_machine() argument
1188 if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) { in ad_tx_machine()
1190 if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) { in ad_tx_machine()
1191 __update_lacpdu_from_port(port); in ad_tx_machine()
1193 if (ad_lacpdu_send(port) >= 0) { in ad_tx_machine()
1195 port->actor_port_number); in ad_tx_machine()
1200 port->ntt = false; in ad_tx_machine()
1206 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in ad_tx_machine()
1216 static void ad_periodic_machine(struct port *port) in ad_periodic_machine() argument
1221 last_state = port->sm_periodic_state; in ad_periodic_machine()
1224 …if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabl… in ad_periodic_machine()
1225 …(!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & AD_S… in ad_periodic_machine()
1227 port->sm_periodic_state = AD_NO_PERIODIC; in ad_periodic_machine()
1230 else if (port->sm_periodic_timer_counter) { in ad_periodic_machine()
1232 if (!(--port->sm_periodic_timer_counter)) { in ad_periodic_machine()
1234 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1239 switch (port->sm_periodic_state) { in ad_periodic_machine()
1241 if (!(port->partner_oper.port_state in ad_periodic_machine()
1243 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1246 if ((port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) { in ad_periodic_machine()
1247 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1248 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1256 switch (port->sm_periodic_state) { in ad_periodic_machine()
1258 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1261 if (!(port->partner_oper.port_state & in ad_periodic_machine()
1263 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1265 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1273 if (port->sm_periodic_state != last_state) { in ad_periodic_machine()
1275 port->actor_port_number, last_state, in ad_periodic_machine()
1276 port->sm_periodic_state); in ad_periodic_machine()
1277 switch (port->sm_periodic_state) { in ad_periodic_machine()
1279 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1283 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TI… in ad_periodic_machine()
1287 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TI… in ad_periodic_machine()
1290 port->ntt = true; in ad_periodic_machine()
1307 static void ad_port_selection_logic(struct port *port, bool *update_slave_arr) in ad_port_selection_logic() argument
1310 struct port *last_port = NULL, *curr_port; in ad_port_selection_logic()
1317 if (port->sm_vars & AD_PORT_SELECTED) in ad_port_selection_logic()
1320 bond = __get_bond_by_port(port); in ad_port_selection_logic()
1323 if (port->aggregator) { in ad_port_selection_logic()
1325 temp_aggregator = port->aggregator; in ad_port_selection_logic()
1329 if (curr_port == port) { in ad_port_selection_logic()
1336 port->next_port_in_aggregator; in ad_port_selection_logic()
1342 port->next_port_in_aggregator; in ad_port_selection_logic()
1348 port->aggregator = NULL; in ad_port_selection_logic()
1349 port->next_port_in_aggregator = NULL; in ad_port_selection_logic()
1350 port->actor_port_aggregator_identifier = 0; in ad_port_selection_logic()
1353 port->actor_port_number, in ad_port_selection_logic()
1368 port->slave->bond->dev->name, in ad_port_selection_logic()
1369 port->actor_port_number, in ad_port_selection_logic()
1370 port->slave->dev->name, in ad_port_selection_logic()
1371 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1385 …if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters … in ad_port_selection_logic()
1386 MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) && in ad_port_selection_logic()
1387 (aggregator->partner_system_priority == port->partner_oper.system_priority) && in ad_port_selection_logic()
1388 (aggregator->partner_oper_aggregator_key == port->partner_oper.key) in ad_port_selection_logic()
1390 ((!MAC_ADDRESS_EQUAL(&(port->partner_oper.system), &(null_mac_addr)) && /* partner answers */ in ad_port_selection_logic()
1395 port->aggregator = aggregator; in ad_port_selection_logic()
1396 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1397 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1398 port->next_port_in_aggregator = aggregator->lag_ports; in ad_port_selection_logic()
1399 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1400 aggregator->lag_ports = port; in ad_port_selection_logic()
1402 port->actor_port_number, in ad_port_selection_logic()
1403 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1406 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1418 port->aggregator = free_aggregator; in ad_port_selection_logic()
1419 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1420 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1425 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS) in ad_port_selection_logic()
1427 port->aggregator->is_individual = false; in ad_port_selection_logic()
1429 port->aggregator->is_individual = true; in ad_port_selection_logic()
1431 port->aggregator->actor_admin_aggregator_key = in ad_port_selection_logic()
1432 port->actor_admin_port_key; in ad_port_selection_logic()
1433 port->aggregator->actor_oper_aggregator_key = in ad_port_selection_logic()
1434 port->actor_oper_port_key; in ad_port_selection_logic()
1435 port->aggregator->partner_system = in ad_port_selection_logic()
1436 port->partner_oper.system; in ad_port_selection_logic()
1437 port->aggregator->partner_system_priority = in ad_port_selection_logic()
1438 port->partner_oper.system_priority; in ad_port_selection_logic()
1439 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key; in ad_port_selection_logic()
1440 port->aggregator->receive_state = 1; in ad_port_selection_logic()
1441 port->aggregator->transmit_state = 1; in ad_port_selection_logic()
1442 port->aggregator->lag_ports = port; in ad_port_selection_logic()
1443 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1446 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1449 port->actor_port_number, in ad_port_selection_logic()
1450 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1453 port->actor_port_number, port->slave->dev->name); in ad_port_selection_logic()
1460 __set_agg_ports_ready(port->aggregator, in ad_port_selection_logic()
1461 __agg_ports_are_ready(port->aggregator)); in ad_port_selection_logic()
1463 aggregator = __get_first_agg(port); in ad_port_selection_logic()
1466 if (!port->aggregator->is_active) in ad_port_selection_logic()
1467 port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; in ad_port_selection_logic()
1543 struct port *port = agg->lag_ports; in agg_device_up() local
1545 if (!port) in agg_device_up()
1548 return netif_running(port->slave->dev) && in agg_device_up()
1549 netif_carrier_ok(port->slave->dev); in agg_device_up()
1585 struct port *port; in ad_agg_selection_logic() local
1667 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1668 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1669 __disable_port(port); in ad_agg_selection_logic()
1683 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1684 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1685 __enable_port(port); in ad_agg_selection_logic()
1738 static void ad_initialize_port(struct port *port, int lacp_fast) in ad_initialize_port() argument
1759 if (port) { in ad_initialize_port()
1760 port->actor_port_priority = 0xff; in ad_initialize_port()
1761 port->actor_port_aggregator_identifier = 0; in ad_initialize_port()
1762 port->ntt = false; in ad_initialize_port()
1763 port->actor_admin_port_state = AD_STATE_AGGREGATION | in ad_initialize_port()
1765 port->actor_oper_port_state = AD_STATE_AGGREGATION | in ad_initialize_port()
1769 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; in ad_initialize_port()
1771 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1772 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1774 port->is_enabled = true; in ad_initialize_port()
1776 port->sm_vars = AD_PORT_BEGIN | AD_PORT_LACP_ENABLED; in ad_initialize_port()
1777 port->sm_rx_state = 0; in ad_initialize_port()
1778 port->sm_rx_timer_counter = 0; in ad_initialize_port()
1779 port->sm_periodic_state = 0; in ad_initialize_port()
1780 port->sm_periodic_timer_counter = 0; in ad_initialize_port()
1781 port->sm_mux_state = 0; in ad_initialize_port()
1782 port->sm_mux_timer_counter = 0; in ad_initialize_port()
1783 port->sm_tx_state = 0; in ad_initialize_port()
1784 port->aggregator = NULL; in ad_initialize_port()
1785 port->next_port_in_aggregator = NULL; in ad_initialize_port()
1786 port->transaction_id = 0; in ad_initialize_port()
1788 port->sm_churn_actor_timer_counter = 0; in ad_initialize_port()
1789 port->sm_churn_actor_state = 0; in ad_initialize_port()
1790 port->churn_actor_count = 0; in ad_initialize_port()
1791 port->sm_churn_partner_timer_counter = 0; in ad_initialize_port()
1792 port->sm_churn_partner_state = 0; in ad_initialize_port()
1793 port->churn_partner_count = 0; in ad_initialize_port()
1795 memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu)); in ad_initialize_port()
1806 static void ad_enable_collecting_distributing(struct port *port, in ad_enable_collecting_distributing() argument
1809 if (port->aggregator->is_active) { in ad_enable_collecting_distributing()
1811 port->actor_port_number, in ad_enable_collecting_distributing()
1812 port->aggregator->aggregator_identifier); in ad_enable_collecting_distributing()
1813 __enable_port(port); in ad_enable_collecting_distributing()
1824 static void ad_disable_collecting_distributing(struct port *port, in ad_disable_collecting_distributing() argument
1827 if (port->aggregator && in ad_disable_collecting_distributing()
1828 !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system), in ad_disable_collecting_distributing()
1831 port->actor_port_number, in ad_disable_collecting_distributing()
1832 port->aggregator->aggregator_identifier); in ad_disable_collecting_distributing()
1833 __disable_port(port); in ad_disable_collecting_distributing()
1845 struct port *port) in ad_marker_info_received() argument
1855 if (ad_marker_send(port, &marker) >= 0) { in ad_marker_info_received()
1857 port->actor_port_number); in ad_marker_info_received()
1871 struct port *port) in ad_marker_response_received() argument
1874 port = NULL; in ad_marker_response_received()
1935 struct port *port; in bond_3ad_bind_slave() local
1939 if (SLAVE_AD_INFO(slave)->port.slave != slave) { in bond_3ad_bind_slave()
1942 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_bind_slave()
1944 ad_initialize_port(port, bond->params.lacp_fast); in bond_3ad_bind_slave()
1946 port->slave = slave; in bond_3ad_bind_slave()
1947 port->actor_port_number = SLAVE_AD_INFO(slave)->id; in bond_3ad_bind_slave()
1951 port->actor_admin_port_key = 0; in bond_3ad_bind_slave()
1952 port->actor_admin_port_key |= __get_duplex(port); in bond_3ad_bind_slave()
1953 port->actor_admin_port_key |= (__get_link_speed(port) << 1); in bond_3ad_bind_slave()
1954 port->actor_oper_port_key = port->actor_admin_port_key; in bond_3ad_bind_slave()
1958 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)) in bond_3ad_bind_slave()
1959 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in bond_3ad_bind_slave()
1961 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr; in bond_3ad_bind_slave()
1965 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in bond_3ad_bind_slave()
1967 __disable_port(port); in bond_3ad_bind_slave()
1992 struct port *port, *prev_port, *temp_port; in bond_3ad_unbind_slave() local
2003 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_unbind_slave()
2006 if (!port->slave) { in bond_3ad_unbind_slave()
2016 port->actor_oper_port_state &= ~AD_STATE_AGGREGATION; in bond_3ad_unbind_slave()
2017 __update_lacpdu_from_port(port); in bond_3ad_unbind_slave()
2018 ad_lacpdu_send(port); in bond_3ad_unbind_slave()
2027 if ((aggregator->lag_ports != port) || in bond_3ad_unbind_slave()
2036 ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2047 …if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !… in bond_3ad_unbind_slave()
2052 if ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2082 ad_agg_selection_logic(__get_first_agg(port), in bond_3ad_unbind_slave()
2096 temp_aggregator = __get_first_agg(port); in bond_3ad_unbind_slave()
2104 netdev_dbg(bond->dev, "Unbinding port %d\n", port->actor_port_number); in bond_3ad_unbind_slave()
2114 if (temp_port == port) { in bond_3ad_unbind_slave()
2129 ad_agg_selection_logic(__get_first_agg(port), in bond_3ad_unbind_slave()
2137 port->slave = NULL; in bond_3ad_unbind_slave()
2163 struct port *port; in bond_3ad_state_machine_handler() local
2182 port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; in bond_3ad_state_machine_handler()
2185 if (port) { in bond_3ad_state_machine_handler()
2186 if (!port->slave) { in bond_3ad_state_machine_handler()
2192 aggregator = __get_first_agg(port); in bond_3ad_state_machine_handler()
2200 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_state_machine_handler()
2201 if (!port->slave) { in bond_3ad_state_machine_handler()
2207 ad_rx_machine(NULL, port); in bond_3ad_state_machine_handler()
2208 ad_periodic_machine(port); in bond_3ad_state_machine_handler()
2209 ad_port_selection_logic(port, &update_slave_arr); in bond_3ad_state_machine_handler()
2210 ad_mux_machine(port, &update_slave_arr); in bond_3ad_state_machine_handler()
2211 ad_tx_machine(port); in bond_3ad_state_machine_handler()
2212 ad_churn_machine(port); in bond_3ad_state_machine_handler()
2215 if (port->sm_vars & AD_PORT_BEGIN) in bond_3ad_state_machine_handler()
2216 port->sm_vars &= ~AD_PORT_BEGIN; in bond_3ad_state_machine_handler()
2252 struct port *port; in bond_3ad_rx_indication() local
2257 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_rx_indication()
2259 if (!port->slave) { in bond_3ad_rx_indication()
2270 port->actor_port_number, in bond_3ad_rx_indication()
2274 ad_rx_machine(lacpdu, port); in bond_3ad_rx_indication()
2287 port->actor_port_number); in bond_3ad_rx_indication()
2288 ad_marker_info_received((struct bond_marker *)lacpdu, port); in bond_3ad_rx_indication()
2293 port->actor_port_number); in bond_3ad_rx_indication()
2294 ad_marker_response_received((struct bond_marker *)lacpdu, port); in bond_3ad_rx_indication()
2299 port->actor_port_number); in bond_3ad_rx_indication()
2314 struct port *port; in bond_3ad_adapter_speed_changed() local
2316 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_adapter_speed_changed()
2319 if (!port->slave) { in bond_3ad_adapter_speed_changed()
2327 port->actor_admin_port_key &= ~AD_SPEED_KEY_MASKS; in bond_3ad_adapter_speed_changed()
2328 port->actor_admin_port_key |= __get_link_speed(port) << 1; in bond_3ad_adapter_speed_changed()
2329 port->actor_oper_port_key = port->actor_admin_port_key; in bond_3ad_adapter_speed_changed()
2330 netdev_dbg(slave->bond->dev, "Port %d changed speed\n", port->actor_port_number); in bond_3ad_adapter_speed_changed()
2334 port->sm_vars |= AD_PORT_BEGIN; in bond_3ad_adapter_speed_changed()
2347 struct port *port; in bond_3ad_adapter_duplex_changed() local
2349 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_adapter_duplex_changed()
2352 if (!port->slave) { in bond_3ad_adapter_duplex_changed()
2360 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_MASKS; in bond_3ad_adapter_duplex_changed()
2361 port->actor_admin_port_key |= __get_duplex(port); in bond_3ad_adapter_duplex_changed()
2362 port->actor_oper_port_key = port->actor_admin_port_key; in bond_3ad_adapter_duplex_changed()
2364 port->actor_port_number, slave->dev->name); in bond_3ad_adapter_duplex_changed()
2365 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS) in bond_3ad_adapter_duplex_changed()
2366 port->sm_vars |= AD_PORT_LACP_ENABLED; in bond_3ad_adapter_duplex_changed()
2370 port->sm_vars |= AD_PORT_BEGIN; in bond_3ad_adapter_duplex_changed()
2384 struct port *port; in bond_3ad_handle_link_change() local
2386 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_handle_link_change()
2389 if (!port->slave) { in bond_3ad_handle_link_change()
2403 port->actor_admin_port_key &= ~(AD_DUPLEX_KEY_MASKS|AD_SPEED_KEY_MASKS); in bond_3ad_handle_link_change()
2405 port->is_enabled = true; in bond_3ad_handle_link_change()
2406 port->actor_admin_port_key |= in bond_3ad_handle_link_change()
2407 (__get_link_speed(port) << 1) | __get_duplex(port); in bond_3ad_handle_link_change()
2408 if (port->actor_admin_port_key & AD_DUPLEX_KEY_MASKS) in bond_3ad_handle_link_change()
2409 port->sm_vars |= AD_PORT_LACP_ENABLED; in bond_3ad_handle_link_change()
2412 port->is_enabled = false; in bond_3ad_handle_link_change()
2413 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in bond_3ad_handle_link_change()
2415 port->actor_oper_port_key = port->actor_admin_port_key; in bond_3ad_handle_link_change()
2417 port->actor_port_number, in bond_3ad_handle_link_change()
2422 port->sm_vars |= AD_PORT_BEGIN; in bond_3ad_handle_link_change()
2491 struct port *port; in __bond_3ad_get_active_agg_info() local
2494 port = &(SLAVE_AD_INFO(slave)->port); in __bond_3ad_get_active_agg_info()
2495 if (port->aggregator && port->aggregator->is_active) { in __bond_3ad_get_active_agg_info()
2496 aggregator = port->aggregator; in __bond_3ad_get_active_agg_info()
2555 struct port *port = NULL; in bond_3ad_update_lacp_rate() local
2563 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_update_lacp_rate()
2565 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2567 port->actor_oper_port_state &= ~AD_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()