Commit 815117ad authored by dingtianhong's avatar dingtianhong Committed by David S. Miller

bonding: use ether_addr_equal_unaligned for bond addr compare

Use possibly more efficient ether_addr_equal_64bits
to instead of memcmp.

Modify the MAC_ADDR_COMPARE to MAC_ADDR_EQUAL, this looks more
appropriate.

The comments for the bond 3ad is too old, cleanup some errors
and warming.
Suggested-by: default avatarJoe Perches <joe@perches.com>
Signed-off-by: default avatarDing Tianhong <dingtianhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4b903e30
...@@ -90,8 +90,9 @@ ...@@ -90,8 +90,9 @@
#define AD_LINK_SPEED_BITMASK_10000MBPS 0x10 #define AD_LINK_SPEED_BITMASK_10000MBPS 0x10
//endalloun //endalloun
// compare MAC addresses /* compare MAC addresses */
#define MAC_ADDRESS_COMPARE(A, B) memcmp(A, B, ETH_ALEN) #define MAC_ADDRESS_EQUAL(A, B) \
ether_addr_equal_64bits((const u8 *)A, (const u8 *)B)
static struct mac_addr null_mac_addr = { { 0, 0, 0, 0, 0, 0 } }; static struct mac_addr null_mac_addr = { { 0, 0, 0, 0, 0, 0 } };
static u16 ad_ticks_per_sec; static u16 ad_ticks_per_sec;
...@@ -417,17 +418,18 @@ static u16 __ad_timer_to_ticks(u16 timer_type, u16 par) ...@@ -417,17 +418,18 @@ static u16 __ad_timer_to_ticks(u16 timer_type, u16 par)
*/ */
static void __choose_matched(struct lacpdu *lacpdu, struct port *port) static void __choose_matched(struct lacpdu *lacpdu, struct port *port)
{ {
// check if all parameters are alike /* check if all parameters are alike
* or this is individual link(aggregation == FALSE)
* then update the state machine Matched variable.
*/
if (((ntohs(lacpdu->partner_port) == port->actor_port_number) && if (((ntohs(lacpdu->partner_port) == port->actor_port_number) &&
(ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) && (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) &&
!MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) && MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) &&
(ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
(ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) &&
((lacpdu->partner_state & AD_STATE_AGGREGATION) == (port->actor_oper_port_state & AD_STATE_AGGREGATION))) || ((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) ((lacpdu->actor_state & AD_STATE_AGGREGATION) == 0)
) { ) {
// update the state machine Matched variable
port->sm_vars |= AD_PORT_MATCHED; port->sm_vars |= AD_PORT_MATCHED;
} else { } else {
port->sm_vars &= ~AD_PORT_MATCHED; port->sm_vars &= ~AD_PORT_MATCHED;
...@@ -507,14 +509,15 @@ static void __update_selected(struct lacpdu *lacpdu, struct port *port) ...@@ -507,14 +509,15 @@ static void __update_selected(struct lacpdu *lacpdu, struct port *port)
if (lacpdu && port) { if (lacpdu && port) {
const struct port_params *partner = &port->partner_oper; const struct port_params *partner = &port->partner_oper;
// check if any parameter is different /* check if any parameter is different then
* update the state machine selected variable.
*/
if (ntohs(lacpdu->actor_port) != partner->port_number || if (ntohs(lacpdu->actor_port) != partner->port_number ||
ntohs(lacpdu->actor_port_priority) != partner->port_priority || ntohs(lacpdu->actor_port_priority) != partner->port_priority ||
MAC_ADDRESS_COMPARE(&lacpdu->actor_system, &partner->system) || !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) ||
ntohs(lacpdu->actor_system_priority) != partner->system_priority || ntohs(lacpdu->actor_system_priority) != partner->system_priority ||
ntohs(lacpdu->actor_key) != partner->key || ntohs(lacpdu->actor_key) != partner->key ||
(lacpdu->actor_state & AD_STATE_AGGREGATION) != (partner->port_state & AD_STATE_AGGREGATION)) { (lacpdu->actor_state & AD_STATE_AGGREGATION) != (partner->port_state & AD_STATE_AGGREGATION)) {
// update the state machine Selected variable
port->sm_vars &= ~AD_PORT_SELECTED; port->sm_vars &= ~AD_PORT_SELECTED;
} }
} }
...@@ -538,15 +541,16 @@ static void __update_default_selected(struct port *port) ...@@ -538,15 +541,16 @@ static void __update_default_selected(struct port *port)
const struct port_params *admin = &port->partner_admin; const struct port_params *admin = &port->partner_admin;
const struct port_params *oper = &port->partner_oper; const struct port_params *oper = &port->partner_oper;
// check if any parameter is different /* check if any parameter is different then
* update the state machine selected variable.
*/
if (admin->port_number != oper->port_number || if (admin->port_number != oper->port_number ||
admin->port_priority != oper->port_priority || admin->port_priority != oper->port_priority ||
MAC_ADDRESS_COMPARE(&admin->system, &oper->system) || !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) ||
admin->system_priority != oper->system_priority || admin->system_priority != oper->system_priority ||
admin->key != oper->key || admin->key != oper->key ||
(admin->port_state & AD_STATE_AGGREGATION) (admin->port_state & AD_STATE_AGGREGATION)
!= (oper->port_state & AD_STATE_AGGREGATION)) { != (oper->port_state & AD_STATE_AGGREGATION)) {
// update the state machine Selected variable
port->sm_vars &= ~AD_PORT_SELECTED; port->sm_vars &= ~AD_PORT_SELECTED;
} }
} }
...@@ -566,12 +570,14 @@ static void __update_default_selected(struct port *port) ...@@ -566,12 +570,14 @@ static void __update_default_selected(struct port *port)
*/ */
static void __update_ntt(struct lacpdu *lacpdu, struct port *port) static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
{ {
// validate lacpdu and port /* validate lacpdu and port */
if (lacpdu && port) { if (lacpdu && port) {
// check if any parameter is different /* check if any parameter is different then
* update the port->ntt.
*/
if ((ntohs(lacpdu->partner_port) != port->actor_port_number) || if ((ntohs(lacpdu->partner_port) != port->actor_port_number) ||
(ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) || (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) ||
MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) || !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) ||
(ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
(ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || (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_ACTIVITY) != (port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY)) ||
...@@ -579,7 +585,6 @@ static void __update_ntt(struct lacpdu *lacpdu, struct port *port) ...@@ -579,7 +585,6 @@ static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) || ((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) ||
((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGATION)) ((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGATION))
) { ) {
port->ntt = true; port->ntt = true;
} }
} }
...@@ -1076,9 +1081,8 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) ...@@ -1076,9 +1081,8 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
port->actor_oper_port_state &= ~AD_STATE_EXPIRED; port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
break; break;
case AD_RX_CURRENT: case AD_RX_CURRENT:
// detect loopback situation /* detect loopback situation */
if (!MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->actor_system))) { if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system), &(port->actor_system))) {
// INFO_RECEIVED_LOOPBACK_FRAMES
pr_err("%s: An illegal loopback occurred on adapter (%s).\n" pr_err("%s: An illegal loopback occurred on adapter (%s).\n"
"Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n",
port->slave->bond->dev->name, port->slave->dev->name); port->slave->bond->dev->name, port->slave->dev->name);
...@@ -1090,7 +1094,7 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) ...@@ -1090,7 +1094,7 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT)); port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT));
port->actor_oper_port_state &= ~AD_STATE_EXPIRED; port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
break; break;
default: //to silence the compiler default: /* to silence the compiler */
break; break;
} }
} }
...@@ -1281,17 +1285,17 @@ static void ad_port_selection_logic(struct port *port) ...@@ -1281,17 +1285,17 @@ static void ad_port_selection_logic(struct port *port)
free_aggregator = aggregator; free_aggregator = aggregator;
continue; continue;
} }
// check if current aggregator suits us /* check if current aggregator suits us */
if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && // if all parameters match AND if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters match AND */
!MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper.system)) && MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) &&
(aggregator->partner_system_priority == port->partner_oper.system_priority) && (aggregator->partner_system_priority == port->partner_oper.system_priority) &&
(aggregator->partner_oper_aggregator_key == port->partner_oper.key) (aggregator->partner_oper_aggregator_key == port->partner_oper.key)
) && ) &&
((MAC_ADDRESS_COMPARE(&(port->partner_oper.system), &(null_mac_addr)) && // partner answers ((!MAC_ADDRESS_EQUAL(&(port->partner_oper.system), &(null_mac_addr)) && /* partner answers */
!aggregator->is_individual) // but is not individual OR !aggregator->is_individual) /* but is not individual OR */
) )
) { ) {
// attach to the founded aggregator /* attach to the founded aggregator */
port->aggregator = aggregator; port->aggregator = aggregator;
port->actor_port_aggregator_identifier = port->actor_port_aggregator_identifier =
port->aggregator->aggregator_identifier; port->aggregator->aggregator_identifier;
...@@ -1705,7 +1709,7 @@ static void ad_enable_collecting_distributing(struct port *port) ...@@ -1705,7 +1709,7 @@ static void ad_enable_collecting_distributing(struct port *port)
*/ */
static void ad_disable_collecting_distributing(struct port *port) static void ad_disable_collecting_distributing(struct port *port)
{ {
if (port->aggregator && MAC_ADDRESS_COMPARE(&(port->aggregator->partner_system), &(null_mac_addr))) { if (port->aggregator && !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system), &(null_mac_addr))) {
pr_debug("Disabling port %d(LAG %d)\n", pr_debug("Disabling port %d(LAG %d)\n",
port->actor_port_number, port->actor_port_number,
port->aggregator->aggregator_identifier); port->aggregator->aggregator_identifier);
...@@ -1826,8 +1830,8 @@ static u16 aggregator_identifier; ...@@ -1826,8 +1830,8 @@ static u16 aggregator_identifier;
*/ */
void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution) void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution)
{ {
// check that the bond is not initialized yet /* check that the bond is not initialized yet */
if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr), if (!MAC_ADDRESS_EQUAL(&(BOND_AD_INFO(bond).system.sys_mac_addr),
bond->dev->dev_addr)) { bond->dev->dev_addr)) {
aggregator_identifier = 0; aggregator_identifier = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment