Lines Matching full:port

52 // Port state definitions(43.4.2.2 in the 802.3ad standard)
62 // Port Variables definitions used by the State Machines(43.4.7 in the 802.3ad standard)
74 // Port Key definitions
78 // Port key : | User key | Speed |Duplex|
103 static int ad_lacpdu_send(struct port *port);
104 static int ad_marker_send(struct port *port, struct bond_marker *marker);
105 static void ad_mux_machine(struct port *port);
106 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
107 static void ad_tx_machine(struct port *port);
108 static void ad_periodic_machine(struct port *port);
109 static void ad_port_selection_logic(struct port *port);
113 static void ad_initialize_port(struct port *port, int lacp_fast);
114 static void ad_enable_collecting_distributing(struct port *port);
115 static void ad_disable_collecting_distributing(struct port *port);
116 static void ad_marker_info_received(struct bond_marker *marker_info, struct port *port);
117 static void ad_marker_response_received(struct bond_marker *marker, struct port *port);
125 * __get_bond_by_port - get the port's bonding struct
126 * @port: the port we're looking at
128 * Return @port's bonding struct, or %NULL if it can't be found.
130 static inline struct bonding *__get_bond_by_port(struct port *port) in __get_bond_by_port() argument
132 if (port->slave == NULL) in __get_bond_by_port()
135 return bond_get_bond_by_slave(port->slave); in __get_bond_by_port()
139 * __get_first_port - get the first port in the bond
142 * Return the port of the first slave in @bond, or %NULL if it can't be found.
144 static inline struct port *__get_first_port(struct bonding *bond) in __get_first_port()
149 return &(SLAVE_AD_INFO(bond->first_slave).port); in __get_first_port()
153 * __get_next_port - get the next port in the bond
154 * @port: the port we're looking at
156 * Return the port of the slave that is next in line of @port's slave in the
159 static inline struct port *__get_next_port(struct port *port) in __get_next_port() argument
161 struct bonding *bond = __get_bond_by_port(port); in __get_next_port()
162 struct slave *slave = port->slave; in __get_next_port()
164 // If there's no bond for this port, or this is the last slave in __get_next_port()
168 return &(SLAVE_AD_INFO(slave->next).port); in __get_next_port()
178 static inline struct aggregator *__get_first_agg(struct port *port) in __get_first_agg() argument
180 struct bonding *bond = __get_bond_by_port(port); in __get_first_agg()
182 // If there's no bond for this port, or bond has no slaves in __get_first_agg()
220 * __disable_port - disable the port's slave
221 * @port: the port we're looking at
224 static inline void __disable_port(struct port *port) in __disable_port() argument
226 bond_set_slave_inactive_flags(port->slave); in __disable_port()
230 * __enable_port - enable the port's slave, if it's up
231 * @port: the port we're looking at
234 static inline void __enable_port(struct port *port) in __enable_port() argument
236 struct slave *slave = port->slave; in __enable_port()
243 * __port_is_enabled - check if the port's slave is in active state
244 * @port: the port we're looking at
247 static inline int __port_is_enabled(struct port *port) in __port_is_enabled() argument
249 return bond_is_active_slave(port->slave); in __port_is_enabled()
254 * @port: the port we're looking at
258 static inline u32 __get_agg_selection_mode(struct port *port) in __get_agg_selection_mode() argument
260 struct bonding *bond = __get_bond_by_port(port); in __get_agg_selection_mode()
270 * @port: the port we're looking at
273 static inline int __check_agg_selection_timer(struct port *port) in __check_agg_selection_timer() argument
275 struct bonding *bond = __get_bond_by_port(port); in __check_agg_selection_timer()
284 * __get_state_machine_lock - lock the port's state machines
285 * @port: the port we're looking at
288 static inline void __get_state_machine_lock(struct port *port) in __get_state_machine_lock() argument
290 spin_lock_bh(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); in __get_state_machine_lock()
294 * __release_state_machine_lock - unlock the port's state machines
295 * @port: the port we're looking at
298 static inline void __release_state_machine_lock(struct port *port) in __release_state_machine_lock() argument
300 spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); in __release_state_machine_lock()
304 * __get_link_speed - get a port's speed
305 * @port: the port we're looking at
307 * Return @port's speed in 802.3ad bitmask format. i.e. one of:
314 static u16 __get_link_speed(struct port *port) in __get_link_speed() argument
316 struct slave *slave = port->slave; in __get_link_speed()
349 pr_debug("Port %d Received link speed %d update from adapter\n", in __get_link_speed()
350 port->actor_port_number, speed); in __get_link_speed()
355 * __get_duplex - get a port's duplex
356 * @port: the port we're looking at
358 * Return @port's duplex in 802.3ad bitmask format. i.e.:
362 static u8 __get_duplex(struct port *port) in __get_duplex() argument
364 struct slave *slave = port->slave; in __get_duplex()
376 pr_debug("Port %d Received status full duplex update from adapter\n", in __get_duplex()
377 port->actor_port_number); in __get_duplex()
382 pr_debug("Port %d Received status NOT full duplex update from adapter\n", in __get_duplex()
383 port->actor_port_number); in __get_duplex()
391 * __initialize_port_locks - initialize a port's STATE machine spinlock
392 * @port: the port we're looking at
395 static inline void __initialize_port_locks(struct port *port) in __initialize_port_locks() argument
398 spin_lock_init(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); in __initialize_port_locks()
445 * __choose_matched - update a port's matched variable from a received lacpdu
447 * @port: the port we're looking at
467 static void __choose_matched(struct lacpdu *lacpdu, struct port *port) in __choose_matched() argument
470 if (((ntohs(lacpdu->partner_port) == port->actor_port_number) && in __choose_matched()
471 (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) && in __choose_matched()
472 !MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) && in __choose_matched()
473 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && in __choose_matched()
474 (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && in __choose_matched()
475 …((lacpdu->partner_state & AD_STATE_AGGREGATION) == (port->actor_oper_port_state & AD_STATE_AGGREGA… in __choose_matched()
480 port->sm_vars |= AD_PORT_MATCHED; in __choose_matched()
482 port->sm_vars &= ~AD_PORT_MATCHED; in __choose_matched()
489 * @port: the port we're looking at
495 static void __record_pdu(struct lacpdu *lacpdu, struct port *port) in __record_pdu() argument
497 if (lacpdu && port) { in __record_pdu()
498 struct port_params *partner = &port->partner_oper; in __record_pdu()
500 __choose_matched(lacpdu, port); in __record_pdu()
510 port->actor_oper_port_state &= ~AD_STATE_DEFAULTED; in __record_pdu()
512 // set the partner sync. to on if the partner is sync. and the port is matched in __record_pdu()
513 if ((port->sm_vars & AD_PORT_MATCHED) in __record_pdu()
523 * @port: the port we're looking at
529 static void __record_default(struct port *port) in __record_default() argument
531 if (port) { in __record_default()
533 memcpy(&port->partner_oper, &port->partner_admin, in __record_default()
537 port->actor_oper_port_state |= AD_STATE_DEFAULTED; in __record_default()
542 * __update_selected - update a port's Selected variable from a received lacpdu
544 * @port: the port we're looking at
554 static void __update_selected(struct lacpdu *lacpdu, struct port *port) in __update_selected() argument
556 if (lacpdu && port) { in __update_selected()
557 const struct port_params *partner = &port->partner_oper; in __update_selected()
567 port->sm_vars &= ~AD_PORT_SELECTED; in __update_selected()
573 * __update_default_selected - update a port's Selected variable from Partner
574 * @port: the port we're looking at
584 static void __update_default_selected(struct port *port) in __update_default_selected() argument
586 if (port) { in __update_default_selected()
587 const struct port_params *admin = &port->partner_admin; in __update_default_selected()
588 const struct port_params *oper = &port->partner_oper; in __update_default_selected()
599 port->sm_vars &= ~AD_PORT_SELECTED; in __update_default_selected()
605 * __update_ntt - update a port's ntt variable from a received lacpdu
607 * @port: the port we're looking at
616 static void __update_ntt(struct lacpdu *lacpdu, struct port *port) in __update_ntt() argument
618 // validate lacpdu and port in __update_ntt()
619 if (lacpdu && port) { in __update_ntt()
621 if ((ntohs(lacpdu->partner_port) != port->actor_port_number) || in __update_ntt()
622 (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) || in __update_ntt()
623 MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) || in __update_ntt()
624 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || in __update_ntt()
625 (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || in __update_ntt()
626 …((lacpdu->partner_state & AD_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & AD_STATE_LACP_… in __update_ntt()
627 …((lacpdu->partner_state & AD_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & AD_STATE_LACP_T… in __update_ntt()
628 …((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYN… in __update_ntt()
629 …((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGA… in __update_ntt()
632 port->ntt = true; in __update_ntt()
639 * @port: the port we're looking at
641 * Handle the attaching of the port's control parser/multiplexer and the
645 static void __attach_bond_to_agg(struct port *port) in __attach_bond_to_agg() argument
647 port = NULL; /* just to satisfy the compiler */ in __attach_bond_to_agg()
654 * @port: the port we're looking at
656 * Handle the detaching of the port's control parser/multiplexer from the
660 static void __detach_bond_from_agg(struct port *port) in __detach_bond_from_agg() argument
662 port = NULL; /* just to satisfy the compiler */ in __detach_bond_from_agg()
674 struct port *port; in __agg_ports_are_ready() local
679 for (port = aggregator->lag_ports; in __agg_ports_are_ready()
680 port; in __agg_ports_are_ready()
681 port = port->next_port_in_aggregator) { in __agg_ports_are_ready()
682 if (!(port->sm_vars & AD_PORT_READY_N)) { in __agg_ports_are_ready()
700 struct port *port; in __set_agg_ports_ready() local
702 for (port = aggregator->lag_ports; port; in __set_agg_ports_ready()
703 port = port->next_port_in_aggregator) { in __set_agg_ports_ready()
705 port->sm_vars |= AD_PORT_READY; in __set_agg_ports_ready()
707 port->sm_vars &= ~AD_PORT_READY; in __set_agg_ports_ready()
764 * __update_lacpdu_from_port - update a port's lacpdu fields
765 * @port: the port we're looking at
768 static inline void __update_lacpdu_from_port(struct port *port) in __update_lacpdu_from_port() argument
770 struct lacpdu *lacpdu = &port->lacpdu; in __update_lacpdu_from_port()
771 const struct port_params *partner = &port->partner_oper; in __update_lacpdu_from_port()
780 lacpdu->actor_system_priority = htons(port->actor_system_priority); in __update_lacpdu_from_port()
781 lacpdu->actor_system = port->actor_system; in __update_lacpdu_from_port()
782 lacpdu->actor_key = htons(port->actor_oper_port_key); in __update_lacpdu_from_port()
783 lacpdu->actor_port_priority = htons(port->actor_port_priority); in __update_lacpdu_from_port()
784 lacpdu->actor_port = htons(port->actor_port_number); in __update_lacpdu_from_port()
785 lacpdu->actor_state = port->actor_oper_port_state; in __update_lacpdu_from_port()
815 * ad_lacpdu_send - send out a lacpdu packet on a given port
816 * @port: the port we're looking at
821 static int ad_lacpdu_send(struct port *port) in ad_lacpdu_send() argument
823 struct slave *slave = port->slave; in ad_lacpdu_send()
846 lacpdu_header->lacpdu = port->lacpdu; // struct copy in ad_lacpdu_send()
854 * ad_marker_send - send marker information/response on a given port
855 * @port: the port we're looking at
861 static int ad_marker_send(struct port *port, struct bond_marker *marker) in ad_marker_send() argument
863 struct slave *slave = port->slave; in ad_marker_send()
895 * ad_mux_machine - handle a port's mux state machine
896 * @port: the port we're looking at
899 static void ad_mux_machine(struct port *port) in ad_mux_machine() argument
904 last_state = port->sm_mux_state; in ad_mux_machine()
906 if (port->sm_vars & AD_PORT_BEGIN) { in ad_mux_machine()
907 port->sm_mux_state = AD_MUX_DETACHED; // next state in ad_mux_machine()
909 switch (port->sm_mux_state) { in ad_mux_machine()
911 if ((port->sm_vars & AD_PORT_SELECTED) in ad_mux_machine()
912 || (port->sm_vars & AD_PORT_STANDBY)) in ad_mux_machine()
914 port->sm_mux_state = AD_MUX_WAITING; // next state in ad_mux_machine()
918 if (!(port->sm_vars & AD_PORT_SELECTED)) { // if UNSELECTED in ad_mux_machine()
919 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
922 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
923 port->sm_mux_state = AD_MUX_DETACHED; // next state in ad_mux_machine()
928 if (port->sm_mux_timer_counter in ad_mux_machine()
929 && !(--port->sm_mux_timer_counter)) in ad_mux_machine()
930 port->sm_vars |= AD_PORT_READY_N; in ad_mux_machine()
934 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
936 // if the wait_while_timer expired, and the port is in READY state, move to ATTACHED state in ad_mux_machine()
937 if ((port->sm_vars & AD_PORT_READY) in ad_mux_machine()
938 && !port->sm_mux_timer_counter) in ad_mux_machine()
939 port->sm_mux_state = AD_MUX_ATTACHED; // next state in ad_mux_machine()
942 …// check also if agg_select_timer expired(so the edable port will take place only after this timer) in ad_mux_machine()
943 …if ((port->sm_vars & AD_PORT_SELECTED) && (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATIO… in ad_mux_machine()
944 port->sm_mux_state = AD_MUX_COLLECTING_DISTRIBUTING;// next state in ad_mux_machine()
945 …} else if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY)) { // if UNS… in ad_mux_machine()
946 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
949 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
950 port->sm_mux_state = AD_MUX_DETACHED;// next state in ad_mux_machine()
954 if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY) || in ad_mux_machine()
955 !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) in ad_mux_machine()
957 port->sm_mux_state = AD_MUX_ATTACHED;// next state in ad_mux_machine()
960 // if port state hasn't changed make in ad_mux_machine()
962 // port in an active aggregator is enabled in ad_mux_machine()
963 if (port->aggregator && in ad_mux_machine()
964 port->aggregator->is_active && in ad_mux_machine()
965 !__port_is_enabled(port)) { in ad_mux_machine()
967 __enable_port(port); in ad_mux_machine()
977 if (port->sm_mux_state != last_state) { in ad_mux_machine()
978 pr_debug("Mux Machine: Port=%d, Last State=%d, Curr State=%d\n", in ad_mux_machine()
979 port->actor_port_number, last_state, in ad_mux_machine()
980 port->sm_mux_state); in ad_mux_machine()
981 switch (port->sm_mux_state) { in ad_mux_machine()
983 __detach_bond_from_agg(port); in ad_mux_machine()
984 port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; in ad_mux_machine()
985 ad_disable_collecting_distributing(port); in ad_mux_machine()
986 port->actor_oper_port_state &= ~AD_STATE_COLLECTING; in ad_mux_machine()
987 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; in ad_mux_machine()
988 port->ntt = true; in ad_mux_machine()
991 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0); in ad_mux_machine()
994 __attach_bond_to_agg(port); in ad_mux_machine()
995 port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION; in ad_mux_machine()
996 port->actor_oper_port_state &= ~AD_STATE_COLLECTING; in ad_mux_machine()
997 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; in ad_mux_machine()
998 ad_disable_collecting_distributing(port); in ad_mux_machine()
999 port->ntt = true; in ad_mux_machine()
1002 port->actor_oper_port_state |= AD_STATE_COLLECTING; in ad_mux_machine()
1003 port->actor_oper_port_state |= AD_STATE_DISTRIBUTING; in ad_mux_machine()
1004 ad_enable_collecting_distributing(port); in ad_mux_machine()
1005 port->ntt = true; in ad_mux_machine()
1014 * ad_rx_machine - handle a port's rx State Machine
1016 * @port: the port we're looking at
1022 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) in ad_rx_machine() argument
1027 last_state = port->sm_rx_state; in ad_rx_machine()
1030 // first, check if port was reinitialized in ad_rx_machine()
1031 if (port->sm_vars & AD_PORT_BEGIN) in ad_rx_machine()
1033 port->sm_rx_state = AD_RX_INITIALIZE; in ad_rx_machine()
1034 // check if port is not enabled in ad_rx_machine()
1035 else if (!(port->sm_vars & AD_PORT_BEGIN) in ad_rx_machine()
1036 && !port->is_enabled && !(port->sm_vars & AD_PORT_MOVED)) in ad_rx_machine()
1038 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1040 …else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) || (port->sm_rx_state == AD_RX_DEFAULTED)… in ad_rx_machine()
1041 port->sm_rx_timer_counter = 0; // zero timer in ad_rx_machine()
1042 port->sm_rx_state = AD_RX_CURRENT; in ad_rx_machine()
1045 if (port->sm_rx_timer_counter && !(--port->sm_rx_timer_counter)) { in ad_rx_machine()
1046 switch (port->sm_rx_state) { in ad_rx_machine()
1048 port->sm_rx_state = AD_RX_DEFAULTED; // next state in ad_rx_machine()
1051 port->sm_rx_state = AD_RX_EXPIRED; // next state in ad_rx_machine()
1058 switch (port->sm_rx_state) { in ad_rx_machine()
1060 if (port->sm_vars & AD_PORT_MOVED) in ad_rx_machine()
1061 port->sm_rx_state = AD_RX_INITIALIZE; // next state in ad_rx_machine()
1062 else if (port->is_enabled in ad_rx_machine()
1063 && (port->sm_vars in ad_rx_machine()
1065 port->sm_rx_state = AD_RX_EXPIRED; // next state in ad_rx_machine()
1066 else if (port->is_enabled in ad_rx_machine()
1067 && ((port->sm_vars in ad_rx_machine()
1069 port->sm_rx_state = AD_RX_LACP_DISABLED; // next state in ad_rx_machine()
1079 if ((port->sm_rx_state != last_state) || (lacpdu)) { in ad_rx_machine()
1080 pr_debug("Rx Machine: Port=%d, Last State=%d, Curr State=%d\n", in ad_rx_machine()
1081 port->actor_port_number, last_state, in ad_rx_machine()
1082 port->sm_rx_state); in ad_rx_machine()
1083 switch (port->sm_rx_state) { in ad_rx_machine()
1085 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) in ad_rx_machine()
1086 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_rx_machine()
1088 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_rx_machine()
1089 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1090 __record_default(port); in ad_rx_machine()
1091 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1092 port->sm_vars &= ~AD_PORT_MOVED; in ad_rx_machine()
1093 port->sm_rx_state = AD_RX_PORT_DISABLED; // next state in ad_rx_machine()
1098 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1101 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1102 __record_default(port); in ad_rx_machine()
1103 port->partner_oper.port_state &= ~AD_STATE_AGGREGATION; in ad_rx_machine()
1104 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1105 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1109 //This reset cause to disable this port in the COLLECTING_DISTRIBUTING state of the in ad_rx_machine()
1110 //mux machine in case of EXPIRED even if LINK_DOWN didn't arrive for the port. in ad_rx_machine()
1111 port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION; in ad_rx_machine()
1112 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1113 port->partner_oper.port_state |= in ad_rx_machine()
1115 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); in ad_rx_machine()
1116 port->actor_oper_port_state |= AD_STATE_EXPIRED; in ad_rx_machine()
1119 __update_default_selected(port); in ad_rx_machine()
1120 __record_default(port); in ad_rx_machine()
1121 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1122 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1126 if (!MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->actor_system))) { in ad_rx_machine()
1130 port->slave->dev->master->name, port->slave->dev->name); in ad_rx_machine()
1133 __update_selected(lacpdu, port); in ad_rx_machine()
1134 __update_ntt(lacpdu, port); in ad_rx_machine()
1135 __record_pdu(lacpdu, port); in ad_rx_machine()
1136port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_por… in ad_rx_machine()
1137 port->actor_oper_port_state &= ~AD_STATE_EXPIRED; in ad_rx_machine()
1146 * ad_tx_machine - handle a port's tx state machine
1147 * @port: the port we're looking at
1150 static void ad_tx_machine(struct port *port) in ad_tx_machine() argument
1153 if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) { in ad_tx_machine()
1155 if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) { in ad_tx_machine()
1156 __update_lacpdu_from_port(port); in ad_tx_machine()
1158 if (ad_lacpdu_send(port) >= 0) { in ad_tx_machine()
1159 pr_debug("Sent LACPDU on port %d\n", in ad_tx_machine()
1160 port->actor_port_number); in ad_tx_machine()
1164 port->ntt = false; in ad_tx_machine()
1168 port->sm_tx_timer_counter = in ad_tx_machine()
1174 * ad_periodic_machine - handle a port's periodic state machine
1175 * @port: the port we're looking at
1179 static void ad_periodic_machine(struct port *port) in ad_periodic_machine() argument
1184 last_state = port->sm_periodic_state; in ad_periodic_machine()
1186 // check if port was reinitialized in ad_periodic_machine()
1187 …if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabl… in ad_periodic_machine()
1188 …(!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & AD_S… in ad_periodic_machine()
1190 port->sm_periodic_state = AD_NO_PERIODIC; // next state in ad_periodic_machine()
1193 else if (port->sm_periodic_timer_counter) { in ad_periodic_machine()
1195 if (!(--port->sm_periodic_timer_counter)) { in ad_periodic_machine()
1197 port->sm_periodic_state = AD_PERIODIC_TX; // next state in ad_periodic_machine()
1200 switch (port->sm_periodic_state) { in ad_periodic_machine()
1202 if (!(port->partner_oper.port_state in ad_periodic_machine()
1204 port->sm_periodic_state = AD_SLOW_PERIODIC; // next state in ad_periodic_machine()
1207 if ((port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) { in ad_periodic_machine()
1209 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1210 port->sm_periodic_state = AD_PERIODIC_TX; // next state in ad_periodic_machine()
1218 switch (port->sm_periodic_state) { in ad_periodic_machine()
1220 port->sm_periodic_state = AD_FAST_PERIODIC; // next state in ad_periodic_machine()
1223 if (!(port->partner_oper.port_state in ad_periodic_machine()
1225 port->sm_periodic_state = AD_SLOW_PERIODIC; // next state in ad_periodic_machine()
1227 port->sm_periodic_state = AD_FAST_PERIODIC; // next state in ad_periodic_machine()
1235 if (port->sm_periodic_state != last_state) { in ad_periodic_machine()
1236 pr_debug("Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n", in ad_periodic_machine()
1237 port->actor_port_number, last_state, in ad_periodic_machine()
1238 port->sm_periodic_state); in ad_periodic_machine()
1239 switch (port->sm_periodic_state) { in ad_periodic_machine()
1241 port->sm_periodic_timer_counter = 0; // zero timer in ad_periodic_machine()
1244port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TI… in ad_periodic_machine()
1247port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TI… in ad_periodic_machine()
1250 port->ntt = true; in ad_periodic_machine()
1260 * @port: the port we're looking at
1262 * Select aggregation groups, and assign each port for it's aggregetor. The
1266 static void ad_port_selection_logic(struct port *port) in ad_port_selection_logic() argument
1269 struct port *last_port = NULL, *curr_port; in ad_port_selection_logic()
1272 // if the port is already Selected, do nothing in ad_port_selection_logic()
1273 if (port->sm_vars & AD_PORT_SELECTED) in ad_port_selection_logic()
1276 // if the port is connected to other aggregator, detach it in ad_port_selection_logic()
1277 if (port->aggregator) { in ad_port_selection_logic()
1278 // detach the port from its former aggregator in ad_port_selection_logic()
1279 temp_aggregator = port->aggregator; in ad_port_selection_logic()
1283 if (curr_port == port) { in ad_port_selection_logic()
1285 if (!last_port) {// if it is the first port attached to the aggregator in ad_port_selection_logic()
1287 port->next_port_in_aggregator; in ad_port_selection_logic()
1288 } else {// not the first port attached to the aggregator in ad_port_selection_logic()
1290 port->next_port_in_aggregator; in ad_port_selection_logic()
1293 // clear the port's relations to this aggregator in ad_port_selection_logic()
1294 port->aggregator = NULL; in ad_port_selection_logic()
1295 port->next_port_in_aggregator = NULL; in ad_port_selection_logic()
1296 port->actor_port_aggregator_identifier = 0; in ad_port_selection_logic()
1298 pr_debug("Port %d left LAG %d\n", in ad_port_selection_logic()
1299 port->actor_port_number, in ad_port_selection_logic()
1307 …if (!curr_port) { // meaning: the port was related to an aggregator but was not on the aggregator in ad_port_selection_logic()
1308 …pr_warning("%s: Warning: Port %d (on %s) was related to aggregator %d but was not on its port list… in ad_port_selection_logic()
1309 port->slave->dev->master->name, in ad_port_selection_logic()
1310 port->actor_port_number, in ad_port_selection_logic()
1311 port->slave->dev->name, in ad_port_selection_logic()
1312 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1315 // search on all aggregators for a suitable aggregator for this port in ad_port_selection_logic()
1316 for (aggregator = __get_first_agg(port); aggregator; in ad_port_selection_logic()
1326 …if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && // if all parameters … in ad_port_selection_logic()
1327 !MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper.system)) && in ad_port_selection_logic()
1328 (aggregator->partner_system_priority == port->partner_oper.system_priority) && in ad_port_selection_logic()
1329 (aggregator->partner_oper_aggregator_key == port->partner_oper.key) in ad_port_selection_logic()
1331 ((MAC_ADDRESS_COMPARE(&(port->partner_oper.system), &(null_mac_addr)) && // partner answers in ad_port_selection_logic()
1336 port->aggregator = aggregator; in ad_port_selection_logic()
1337 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1338 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1339 port->next_port_in_aggregator = aggregator->lag_ports; in ad_port_selection_logic()
1340 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1341 aggregator->lag_ports = port; in ad_port_selection_logic()
1342 pr_debug("Port %d joined LAG %d(existing LAG)\n", in ad_port_selection_logic()
1343 port->actor_port_number, in ad_port_selection_logic()
1344 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1346 // mark this port as selected in ad_port_selection_logic()
1347 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1353 // the port couldn't find an aggregator - attach it to a new aggregator in ad_port_selection_logic()
1356 // assign port a new aggregator in ad_port_selection_logic()
1357 port->aggregator = free_aggregator; in ad_port_selection_logic()
1358 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1359 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1362 // if port was responsed from the end-user in ad_port_selection_logic()
1363 if (port->actor_oper_port_key & AD_DUPLEX_KEY_BITS) in ad_port_selection_logic()
1364 /* if port is full duplex */ in ad_port_selection_logic()
1365 port->aggregator->is_individual = false; in ad_port_selection_logic()
1367 port->aggregator->is_individual = true; in ad_port_selection_logic()
1369 port->aggregator->actor_admin_aggregator_key = port->actor_admin_port_key; in ad_port_selection_logic()
1370 port->aggregator->actor_oper_aggregator_key = port->actor_oper_port_key; in ad_port_selection_logic()
1371 port->aggregator->partner_system = in ad_port_selection_logic()
1372 port->partner_oper.system; in ad_port_selection_logic()
1373 port->aggregator->partner_system_priority = in ad_port_selection_logic()
1374 port->partner_oper.system_priority; in ad_port_selection_logic()
1375 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key; in ad_port_selection_logic()
1376 port->aggregator->receive_state = 1; in ad_port_selection_logic()
1377 port->aggregator->transmit_state = 1; in ad_port_selection_logic()
1378 port->aggregator->lag_ports = port; in ad_port_selection_logic()
1379 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1381 // mark this port as selected in ad_port_selection_logic()
1382 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1384 pr_debug("Port %d joined LAG %d(new LAG)\n", in ad_port_selection_logic()
1385 port->actor_port_number, in ad_port_selection_logic()
1386 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1388 pr_err("%s: Port %d (on %s) did not find a suitable aggregator\n", in ad_port_selection_logic()
1389 port->slave->dev->master->name, in ad_port_selection_logic()
1390 port->actor_port_number, port->slave->dev->name); in ad_port_selection_logic()
1395 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_port_selection_logic()
1397 aggregator = __get_first_agg(port); in ad_port_selection_logic()
1476 struct port *port = agg->lag_ports; in agg_device_up() local
1477 if (!port) in agg_device_up()
1479 return (netif_running(port->slave->dev) && in agg_device_up()
1480 netif_carrier_ok(port->slave->dev)); in agg_device_up()
1511 struct port *port; in ad_agg_selection_logic() local
1588 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1589 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1590 __disable_port(port); in ad_agg_selection_logic()
1603 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1604 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1605 __enable_port(port); in ad_agg_selection_logic()
1660 * ad_initialize_port - initialize a given port's parameters
1665 static void ad_initialize_port(struct port *port, int lacp_fast) in ad_initialize_port() argument
1686 if (port) { in ad_initialize_port()
1687 port->actor_port_number = 1; in ad_initialize_port()
1688 port->actor_port_priority = 0xff; in ad_initialize_port()
1689 port->actor_system = null_mac_addr; in ad_initialize_port()
1690 port->actor_system_priority = 0xffff; in ad_initialize_port()
1691 port->actor_port_aggregator_identifier = 0; in ad_initialize_port()
1692 port->ntt = false; in ad_initialize_port()
1693 port->actor_admin_port_key = 1; in ad_initialize_port()
1694 port->actor_oper_port_key = 1; in ad_initialize_port()
1695 port->actor_admin_port_state = AD_STATE_AGGREGATION | AD_STATE_LACP_ACTIVITY; in ad_initialize_port()
1696 port->actor_oper_port_state = AD_STATE_AGGREGATION | AD_STATE_LACP_ACTIVITY; in ad_initialize_port()
1699 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; in ad_initialize_port()
1701 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1702 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1704 port->is_enabled = true; in ad_initialize_port()
1706 port->sm_vars = 0x3; in ad_initialize_port()
1707 port->sm_rx_state = 0; in ad_initialize_port()
1708 port->sm_rx_timer_counter = 0; in ad_initialize_port()
1709 port->sm_periodic_state = 0; in ad_initialize_port()
1710 port->sm_periodic_timer_counter = 0; in ad_initialize_port()
1711 port->sm_mux_state = 0; in ad_initialize_port()
1712 port->sm_mux_timer_counter = 0; in ad_initialize_port()
1713 port->sm_tx_state = 0; in ad_initialize_port()
1714 port->sm_tx_timer_counter = 0; in ad_initialize_port()
1715 port->slave = NULL; in ad_initialize_port()
1716 port->aggregator = NULL; in ad_initialize_port()
1717 port->next_port_in_aggregator = NULL; in ad_initialize_port()
1718 port->transaction_id = 0; in ad_initialize_port()
1720 memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu)); in ad_initialize_port()
1725 * ad_enable_collecting_distributing - enable a port's transmit/receive
1726 * @port: the port we're looking at
1728 * Enable @port if it's in an active aggregator
1730 static void ad_enable_collecting_distributing(struct port *port) in ad_enable_collecting_distributing() argument
1732 if (port->aggregator->is_active) { in ad_enable_collecting_distributing()
1733 pr_debug("Enabling port %d(LAG %d)\n", in ad_enable_collecting_distributing()
1734 port->actor_port_number, in ad_enable_collecting_distributing()
1735 port->aggregator->aggregator_identifier); in ad_enable_collecting_distributing()
1736 __enable_port(port); in ad_enable_collecting_distributing()
1741 * ad_disable_collecting_distributing - disable a port's transmit/receive
1742 * @port: the port we're looking at
1745 static void ad_disable_collecting_distributing(struct port *port) in ad_disable_collecting_distributing() argument
1747 …if (port->aggregator && MAC_ADDRESS_COMPARE(&(port->aggregator->partner_system), &(null_mac_addr))… in ad_disable_collecting_distributing()
1748 pr_debug("Disabling port %d(LAG %d)\n", in ad_disable_collecting_distributing()
1749 port->actor_port_number, in ad_disable_collecting_distributing()
1750 port->aggregator->aggregator_identifier); in ad_disable_collecting_distributing()
1751 __disable_port(port); in ad_disable_collecting_distributing()
1758 * @port: the port we're looking at
1764 static void ad_marker_info_send(struct port *port)
1775 …marker.requester_port = (((port->actor_port_number & 0xFF) << 8) |((u16)(port->actor_port_number &…
1776 marker.requester_system = port->actor_system;
1779 (((++port->transaction_id & 0xFF) << 24)
1780 | ((port->transaction_id & 0xFF00) << 8)
1781 | ((port->transaction_id & 0xFF0000) >> 8)
1782 | ((port->transaction_id & 0xFF000000) >> 24));
1790 if (ad_marker_send(port, &marker) >= 0) {
1791 pr_debug("Sent Marker Information on port %d\n",
1792 port->actor_port_number);
1800 * @port: the port we're looking at
1804 struct port *port) in ad_marker_info_received() argument
1815 if (ad_marker_send(port, &marker) >= 0) { in ad_marker_info_received()
1816 pr_debug("Sent Marker Response on port %d\n", in ad_marker_info_received()
1817 port->actor_port_number); in ad_marker_info_received()
1824 * @port: the port we're looking at
1831 struct port *port) in ad_marker_response_received() argument
1834 port = NULL; /* just to satisfy the compiler */ in ad_marker_response_received()
1887 * bond_3ad_bind_slave - initialize a slave's port
1896 struct port *port; in bond_3ad_bind_slave() local
1906 if (SLAVE_AD_INFO(slave).port.slave != slave) { in bond_3ad_bind_slave()
1908 // port initialization in bond_3ad_bind_slave()
1909 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_bind_slave()
1911 ad_initialize_port(port, bond->params.lacp_fast); in bond_3ad_bind_slave()
1913 port->slave = slave; in bond_3ad_bind_slave()
1914 port->actor_port_number = SLAVE_AD_INFO(slave).id; in bond_3ad_bind_slave()
1917 // Port key : | User key | Speed |Duplex| in bond_3ad_bind_slave()
1920 port->actor_admin_port_key = 0; // initialize this parameter in bond_3ad_bind_slave()
1921 port->actor_admin_port_key |= __get_duplex(port); in bond_3ad_bind_slave()
1922 port->actor_admin_port_key |= (__get_link_speed(port) << 1); in bond_3ad_bind_slave()
1923 port->actor_oper_port_key = port->actor_admin_port_key; in bond_3ad_bind_slave()
1924 // if the port is not full duplex, then the port should be not lacp Enabled in bond_3ad_bind_slave()
1925 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) in bond_3ad_bind_slave()
1926 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in bond_3ad_bind_slave()
1928 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr; in bond_3ad_bind_slave()
1930 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in bond_3ad_bind_slave()
1931 port->aggregator = NULL; in bond_3ad_bind_slave()
1932 port->next_port_in_aggregator = NULL; in bond_3ad_bind_slave()
1934 __disable_port(port); in bond_3ad_bind_slave()
1935 __initialize_port_locks(port); in bond_3ad_bind_slave()
1954 * bond_3ad_unbind_slave - deinitialize a slave's port
1957 * Search for the aggregator that is related to this port, remove the
1958 * aggregator and assign another aggregator for other port related to it
1959 * (if any), and remove the port.
1963 struct port *port, *prev_port, *temp_port; in bond_3ad_unbind_slave() local
1970 // find the port related to this slave in bond_3ad_unbind_slave()
1971 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_unbind_slave()
1973 // if slave is null, the whole port is not initialized in bond_3ad_unbind_slave()
1974 if (!port->slave) { in bond_3ad_unbind_slave()
1975 pr_warning("Warning: %s: Trying to unbind an uninitialized port on %s\n", in bond_3ad_unbind_slave()
1983 /* Tell the partner that this port is not suitable for aggregation */ in bond_3ad_unbind_slave()
1984 port->actor_oper_port_state &= ~AD_STATE_AGGREGATION; in bond_3ad_unbind_slave()
1985 __update_lacpdu_from_port(port); in bond_3ad_unbind_slave()
1986 ad_lacpdu_send(port); in bond_3ad_unbind_slave()
1991 // the port related to this slave(thats ensure us that there is a in bond_3ad_unbind_slave()
1993 if ((aggregator->lag_ports != port) || (aggregator->lag_ports->next_port_in_aggregator)) { in bond_3ad_unbind_slave()
1994 // find new aggregator for the related port(s) in bond_3ad_unbind_slave()
1995 new_aggregator = __get_first_agg(port); in bond_3ad_unbind_slave()
1997 // if the new aggregator is empty, or it is connected to our port only in bond_3ad_unbind_slave()
1999 || ((new_aggregator->lag_ports == port) in bond_3ad_unbind_slave()
2005 …if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !… in bond_3ad_unbind_slave()
2006 pr_debug("Some port(s) related to LAG %d - replaceing with LAG %d\n", in bond_3ad_unbind_slave()
2010 if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) { in bond_3ad_unbind_slave()
2040 ad_agg_selection_logic(__get_first_agg(port)); in bond_3ad_unbind_slave()
2045 } else { // in case that the only port related to this aggregator is the one we want to remove in bond_3ad_unbind_slave()
2053 ad_agg_selection_logic(__get_first_agg(port)); in bond_3ad_unbind_slave()
2058 pr_debug("Unbinding port %d\n", port->actor_port_number); in bond_3ad_unbind_slave()
2059 // find the aggregator that this port is connected to in bond_3ad_unbind_slave()
2060 temp_aggregator = __get_first_agg(port); in bond_3ad_unbind_slave()
2063 // search the port in the aggregator's related ports in bond_3ad_unbind_slave()
2067 if (temp_port == port) { // the aggregator found - detach the port from this aggregator in bond_3ad_unbind_slave()
2081 ad_agg_selection_logic(__get_first_agg(port)); in bond_3ad_unbind_slave()
2088 port->slave = NULL; in bond_3ad_unbind_slave()
2108 struct port *port; in bond_3ad_state_machine_handler() local
2120 if ((port = __get_first_port(bond))) { in bond_3ad_state_machine_handler()
2121 if (!port->slave) { in bond_3ad_state_machine_handler()
2122 pr_warning("%s: Warning: bond's first port is uninitialized\n", in bond_3ad_state_machine_handler()
2127 aggregator = __get_first_agg(port); in bond_3ad_state_machine_handler()
2133 // for each port run the state machines in bond_3ad_state_machine_handler()
2134 for (port = __get_first_port(bond); port; port = __get_next_port(port)) { in bond_3ad_state_machine_handler()
2135 if (!port->slave) { in bond_3ad_state_machine_handler()
2136 pr_warning("%s: Warning: Found an uninitialized port\n", in bond_3ad_state_machine_handler()
2142 * by all (e.g., port->sm_vars). ad_rx_machine may run in bond_3ad_state_machine_handler()
2145 __get_state_machine_lock(port); in bond_3ad_state_machine_handler()
2147 ad_rx_machine(NULL, port); in bond_3ad_state_machine_handler()
2148 ad_periodic_machine(port); in bond_3ad_state_machine_handler()
2149 ad_port_selection_logic(port); in bond_3ad_state_machine_handler()
2150 ad_mux_machine(port); in bond_3ad_state_machine_handler()
2151 ad_tx_machine(port); in bond_3ad_state_machine_handler()
2154 if (port->sm_vars & AD_PORT_BEGIN) in bond_3ad_state_machine_handler()
2155 port->sm_vars &= ~AD_PORT_BEGIN; in bond_3ad_state_machine_handler()
2157 __release_state_machine_lock(port); in bond_3ad_state_machine_handler()
2178 struct port *port; in bond_3ad_rx_indication() local
2182 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_rx_indication()
2184 if (!port->slave) { in bond_3ad_rx_indication()
2185 pr_warning("%s: Warning: port of slave %s is uninitialized\n", in bond_3ad_rx_indication()
2192 pr_debug("Received LACPDU on port %d\n", in bond_3ad_rx_indication()
2193 port->actor_port_number); in bond_3ad_rx_indication()
2195 __get_state_machine_lock(port); in bond_3ad_rx_indication()
2196 ad_rx_machine(lacpdu, port); in bond_3ad_rx_indication()
2197 __release_state_machine_lock(port); in bond_3ad_rx_indication()
2205 pr_debug("Received Marker Information on port %d\n", in bond_3ad_rx_indication()
2206 port->actor_port_number); in bond_3ad_rx_indication()
2207 ad_marker_info_received((struct bond_marker *)lacpdu, port); in bond_3ad_rx_indication()
2211 pr_debug("Received Marker Response on port %d\n", in bond_3ad_rx_indication()
2212 port->actor_port_number); in bond_3ad_rx_indication()
2213 ad_marker_response_received((struct bond_marker *)lacpdu, port); in bond_3ad_rx_indication()
2218 port->actor_port_number); in bond_3ad_rx_indication()
2228 * Handle reselection of aggregator (if needed) for this port.
2232 struct port *port; in bond_3ad_adapter_speed_changed() local
2234 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_adapter_speed_changed()
2236 // if slave is null, the whole port is not initialized in bond_3ad_adapter_speed_changed()
2237 if (!port->slave) { in bond_3ad_adapter_speed_changed()
2238 pr_warning("Warning: %s: speed changed for uninitialized port on %s\n", in bond_3ad_adapter_speed_changed()
2243 port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS; in bond_3ad_adapter_speed_changed()
2244 port->actor_oper_port_key = port->actor_admin_port_key |= in bond_3ad_adapter_speed_changed()
2245 (__get_link_speed(port) << 1); in bond_3ad_adapter_speed_changed()
2246 pr_debug("Port %d changed speed\n", port->actor_port_number); in bond_3ad_adapter_speed_changed()
2249 port->sm_vars |= AD_PORT_BEGIN; in bond_3ad_adapter_speed_changed()
2256 * Handle reselection of aggregator (if needed) for this port.
2260 struct port *port; in bond_3ad_adapter_duplex_changed() local
2262 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_adapter_duplex_changed()
2264 // if slave is null, the whole port is not initialized in bond_3ad_adapter_duplex_changed()
2265 if (!port->slave) { in bond_3ad_adapter_duplex_changed()
2266 pr_warning("%s: Warning: duplex changed for uninitialized port on %s\n", in bond_3ad_adapter_duplex_changed()
2271 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; in bond_3ad_adapter_duplex_changed()
2272 port->actor_oper_port_key = port->actor_admin_port_key |= in bond_3ad_adapter_duplex_changed()
2273 __get_duplex(port); in bond_3ad_adapter_duplex_changed()
2274 pr_debug("Port %d changed duplex\n", port->actor_port_number); in bond_3ad_adapter_duplex_changed()
2277 port->sm_vars |= AD_PORT_BEGIN; in bond_3ad_adapter_duplex_changed()
2285 * Handle reselection of aggregator (if needed) for this port.
2289 struct port *port; in bond_3ad_handle_link_change() local
2291 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_handle_link_change()
2293 // if slave is null, the whole port is not initialized in bond_3ad_handle_link_change()
2294 if (!port->slave) { in bond_3ad_handle_link_change()
2295 pr_warning("Warning: %s: link status changed for uninitialized port on %s\n", in bond_3ad_handle_link_change()
2303 port->is_enabled = true; in bond_3ad_handle_link_change()
2304 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; in bond_3ad_handle_link_change()
2305 port->actor_oper_port_key = port->actor_admin_port_key |= in bond_3ad_handle_link_change()
2306 __get_duplex(port); in bond_3ad_handle_link_change()
2307 port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS; in bond_3ad_handle_link_change()
2308 port->actor_oper_port_key = port->actor_admin_port_key |= in bond_3ad_handle_link_change()
2309 (__get_link_speed(port) << 1); in bond_3ad_handle_link_change()
2312 port->is_enabled = false; in bond_3ad_handle_link_change()
2313 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; in bond_3ad_handle_link_change()
2314 port->actor_oper_port_key = (port->actor_admin_port_key &= in bond_3ad_handle_link_change()
2317 …//BOND_PRINT_DBG(("Port %d changed link status to %s", port->actor_port_number, ((link == BOND_LIN… in bond_3ad_handle_link_change()
2320 port->sm_vars |= AD_PORT_BEGIN; in bond_3ad_handle_link_change()
2370 struct port *port; in bond_3ad_get_active_agg_info() local
2372 for (port = __get_first_port(bond); port; port = __get_next_port(port)) { in bond_3ad_get_active_agg_info()
2373 if (port->aggregator && port->aggregator->is_active) { in bond_3ad_get_active_agg_info()
2374 aggregator = port->aggregator; in bond_3ad_get_active_agg_info()
2420 struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; in bond_3ad_xmit_xor()
2439 struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; in bond_3ad_xmit_xor()
2475 * update actor_oper_port_state of each port.
2478 * so we can modify port->actor_oper_port_state,
2485 struct port *port = NULL; in bond_3ad_update_lacp_rate() local
2492 port = &(SLAVE_AD_INFO(slave).port); in bond_3ad_update_lacp_rate()
2493 __get_state_machine_lock(port); in bond_3ad_update_lacp_rate()
2495 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2497 port->actor_oper_port_state &= ~AD_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2498 __release_state_machine_lock(port); in bond_3ad_update_lacp_rate()