lacpdu
static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
if (lacpdu) {
else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) ||
if ((port->sm_rx_state != last_state) || (lacpdu)) {
if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system),
__update_selected(lacpdu, port);
__update_ntt(lacpdu, port);
__record_pdu(lacpdu, port);
static const struct lacpdu lacpdu = {
memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu));
static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave)
switch (lacpdu->subtype) {
ad_rx_machine(lacpdu, port);
marker = (struct bond_marker *)lacpdu;
struct lacpdu *lacpdu, _lacpdu;
lacpdu = skb_header_pointer(skb, 0, sizeof(_lacpdu), &_lacpdu);
if (!lacpdu) {
return bond_3ad_rx_indication(lacpdu, slave);
static void __choose_matched(struct lacpdu *lacpdu, struct port *port)
if (((ntohs(lacpdu->partner_port) == port->actor_port_number) &&
(ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) &&
MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) &&
(ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
(ntohs(lacpdu->partner_key) == port->actor_oper_port_key) &&
((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGGREGATION))) ||
((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0)
static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
if (lacpdu && port) {
__choose_matched(lacpdu, port);
partner->port_number = ntohs(lacpdu->actor_port);
partner->port_priority = ntohs(lacpdu->actor_port_priority);
partner->system = lacpdu->actor_system;
partner->system_priority = ntohs(lacpdu->actor_system_priority);
partner->key = ntohs(lacpdu->actor_key);
partner->port_state = lacpdu->actor_state;
(lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) {
static void __update_selected(struct lacpdu *lacpdu, struct port *port)
if (lacpdu && port) {
if (ntohs(lacpdu->actor_port) != partner->port_number ||
ntohs(lacpdu->actor_port_priority) != partner->port_priority ||
!MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) ||
ntohs(lacpdu->actor_system_priority) != partner->system_priority ||
ntohs(lacpdu->actor_key) != partner->key ||
(lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) {
static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
if (lacpdu && port) {
if ((ntohs(lacpdu->partner_port) != port->actor_port_number) ||
(ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) ||
!MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) ||
(ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
(ntohs(lacpdu->partner_key) != port->actor_oper_port_key) ||
((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY)) ||
((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT)) ||
((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) ||
((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGGREGATION))
struct lacpdu *lacpdu = &port->lacpdu;
lacpdu->actor_system_priority = htons(port->actor_system_priority);
lacpdu->actor_system = port->actor_system;
lacpdu->actor_key = htons(port->actor_oper_port_key);
lacpdu->actor_port_priority = htons(port->actor_port_priority);
lacpdu->actor_port = htons(port->actor_port_number);
lacpdu->actor_state = port->actor_oper_port_state;
lacpdu->partner_system_priority = htons(partner->system_priority);
lacpdu->partner_system = partner->system;
lacpdu->partner_key = htons(partner->key);
lacpdu->partner_port_priority = htons(partner->port_priority);
lacpdu->partner_port = htons(partner->port_number);
lacpdu->partner_state = partner->port_state;
lacpdu_header->lacpdu = port->lacpdu;
static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
struct lacpdu lacpdu;
struct lacpdu lacpdu; /* the lacpdu that will be sent for this port */