Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89cc76f9 authored by Jay Vosburgh's avatar Jay Vosburgh Committed by Jeff Garzik
Browse files

[PATCH] bonding: Don't mangle LACPDUs



	Fixed handling of 802.3ad LACPDUs.  Do not byte swap data in
place in the packet.  Updated nomenclature of "__ntohs_lacpdu" to be
"htons"; it was previously used for both ntohs and htons operations, but
only called ntohs functions.

Signed-off-by: default avatarJay Vosburgh <fubar@us.ibm.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent f5b2b966
Loading
Loading
Loading
Loading
+29 −30
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ static u16 __get_link_speed(struct port *port);
static u8 __get_duplex(struct port *port);
static inline void __initialize_port_locks(struct port *port);
//conversions
static void __ntohs_lacpdu(struct lacpdu *lacpdu);
static void __htons_lacpdu(struct lacpdu *lacpdu);
static u16 __ad_timer_to_ticks(u16 timer_type, u16 Par);


@@ -420,23 +420,23 @@ static inline void __initialize_port_locks(struct port *port)

//conversions
/**
 * __ntohs_lacpdu - convert the contents of a LACPDU to host byte order
 * __htons_lacpdu - convert the contents of a LACPDU to network byte order
 * @lacpdu: the speicifed lacpdu
 *
 * For each multi-byte field in the lacpdu, convert its content
 */
static void __ntohs_lacpdu(struct lacpdu *lacpdu)
static void __htons_lacpdu(struct lacpdu *lacpdu)
{
	if (lacpdu) {
		lacpdu->actor_system_priority =   ntohs(lacpdu->actor_system_priority);
		lacpdu->actor_key =               ntohs(lacpdu->actor_key);
		lacpdu->actor_port_priority =     ntohs(lacpdu->actor_port_priority);
		lacpdu->actor_port =              ntohs(lacpdu->actor_port);
		lacpdu->partner_system_priority = ntohs(lacpdu->partner_system_priority);
		lacpdu->partner_key =             ntohs(lacpdu->partner_key);
		lacpdu->partner_port_priority =   ntohs(lacpdu->partner_port_priority);
		lacpdu->partner_port =            ntohs(lacpdu->partner_port);
		lacpdu->collector_max_delay =     ntohs(lacpdu->collector_max_delay);
		lacpdu->actor_system_priority =   htons(lacpdu->actor_system_priority);
		lacpdu->actor_key =               htons(lacpdu->actor_key);
		lacpdu->actor_port_priority =     htons(lacpdu->actor_port_priority);
		lacpdu->actor_port =              htons(lacpdu->actor_port);
		lacpdu->partner_system_priority = htons(lacpdu->partner_system_priority);
		lacpdu->partner_key =             htons(lacpdu->partner_key);
		lacpdu->partner_port_priority =   htons(lacpdu->partner_port_priority);
		lacpdu->partner_port =            htons(lacpdu->partner_port);
		lacpdu->collector_max_delay =     htons(lacpdu->collector_max_delay);
	}
}

@@ -496,11 +496,11 @@ static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
	// validate lacpdu and port
	if (lacpdu && port) {
		// record the new parameter values for the partner operational
		port->partner_oper_port_number = lacpdu->actor_port;
		port->partner_oper_port_priority = lacpdu->actor_port_priority;
		port->partner_oper_port_number = ntohs(lacpdu->actor_port);
		port->partner_oper_port_priority = ntohs(lacpdu->actor_port_priority);
		port->partner_oper_system = lacpdu->actor_system;
		port->partner_oper_system_priority = lacpdu->actor_system_priority;
		port->partner_oper_key = lacpdu->actor_key;
		port->partner_oper_system_priority = ntohs(lacpdu->actor_system_priority);
		port->partner_oper_key = ntohs(lacpdu->actor_key);
		// zero partener's lase states
		port->partner_oper_port_state = 0;
		port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_LACP_ACTIVITY);
@@ -567,11 +567,11 @@ static void __update_selected(struct lacpdu *lacpdu, struct port *port)
	// validate lacpdu and port
	if (lacpdu && port) {
		// check if any parameter is different
		if ((lacpdu->actor_port != port->partner_oper_port_number) ||
		    (lacpdu->actor_port_priority != port->partner_oper_port_priority) ||
		if ((ntohs(lacpdu->actor_port) != port->partner_oper_port_number) ||
		    (ntohs(lacpdu->actor_port_priority) != port->partner_oper_port_priority) ||
		    MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->partner_oper_system)) ||
		    (lacpdu->actor_system_priority != port->partner_oper_system_priority) ||
		    (lacpdu->actor_key != port->partner_oper_key) ||
		    (ntohs(lacpdu->actor_system_priority) != port->partner_oper_system_priority) ||
		    (ntohs(lacpdu->actor_key) != port->partner_oper_key) ||
		    ((lacpdu->actor_state & AD_STATE_AGGREGATION) != (port->partner_oper_port_state & AD_STATE_AGGREGATION))
		   ) {
			// update the state machine Selected variable
@@ -634,11 +634,11 @@ static void __choose_matched(struct lacpdu *lacpdu, struct port *port)
	// validate lacpdu and port
	if (lacpdu && port) {
		// check if all parameters are alike
		if (((lacpdu->partner_port == port->actor_port_number) &&
		     (lacpdu->partner_port_priority == port->actor_port_priority) &&
		if (((ntohs(lacpdu->partner_port) == port->actor_port_number) &&
		     (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) &&
		     !MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) &&
		     (lacpdu->partner_system_priority == port->actor_system_priority) &&
		     (lacpdu->partner_key == port->actor_oper_port_key) &&
		     (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
		     (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) &&
		     ((lacpdu->partner_state & AD_STATE_AGGREGATION) == (port->actor_oper_port_state & AD_STATE_AGGREGATION))) ||
		    // or this is individual link(aggregation == FALSE)
		    ((lacpdu->actor_state & AD_STATE_AGGREGATION) == 0)
@@ -668,11 +668,11 @@ static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
	// validate lacpdu and port
	if (lacpdu && port) {
		// check if any parameter is different
		if ((lacpdu->partner_port != port->actor_port_number) ||
		    (lacpdu->partner_port_priority != port->actor_port_priority) ||
		if ((ntohs(lacpdu->partner_port) != port->actor_port_number) ||
		    (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) ||
		    MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) ||
		    (lacpdu->partner_system_priority != port->actor_system_priority) ||
		    (lacpdu->partner_key != port->actor_oper_port_key) ||
		    (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
		    (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) ||
		    ((lacpdu->partner_state & AD_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY)) ||
		    ((lacpdu->partner_state & AD_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT)) ||
		    ((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) ||
@@ -856,7 +856,7 @@ static inline void __update_lacpdu_from_port(struct port *port)
	 */

	/* Convert all non u8 parameters to Big Endian for transmit */
	__ntohs_lacpdu(lacpdu);
	__htons_lacpdu(lacpdu);
}

//////////////////////////////////////////////////////////////////////////////////////
@@ -2180,7 +2180,6 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u

		switch (lacpdu->subtype) {
		case AD_TYPE_LACPDU:
			__ntohs_lacpdu(lacpdu);
			dprintk("Received LACPDU on port %d\n", port->actor_port_number);
			ad_rx_machine(lacpdu, port);
			break;