linux/drivers/net/bonding/bond_3ad.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
   4 */
   5
   6#include <linux/skbuff.h>
   7#include <linux/if_ether.h>
   8#include <linux/netdevice.h>
   9#include <linux/spinlock.h>
  10#include <linux/ethtool.h>
  11#include <linux/etherdevice.h>
  12#include <linux/if_bonding.h>
  13#include <linux/pkt_sched.h>
  14#include <net/net_namespace.h>
  15#include <net/bonding.h>
  16#include <net/bond_3ad.h>
  17#include <net/netlink.h>
  18
  19/* General definitions */
  20#define AD_SHORT_TIMEOUT           1
  21#define AD_LONG_TIMEOUT            0
  22#define AD_STANDBY                 0x2
  23#define AD_MAX_TX_IN_SECOND        3
  24#define AD_COLLECTOR_MAX_DELAY     0
  25
  26/* Timer definitions (43.4.4 in the 802.3ad standard) */
  27#define AD_FAST_PERIODIC_TIME      1
  28#define AD_SLOW_PERIODIC_TIME      30
  29#define AD_SHORT_TIMEOUT_TIME      (3*AD_FAST_PERIODIC_TIME)
  30#define AD_LONG_TIMEOUT_TIME       (3*AD_SLOW_PERIODIC_TIME)
  31#define AD_CHURN_DETECTION_TIME    60
  32#define AD_AGGREGATE_WAIT_TIME     2
  33
  34/* Port Variables definitions used by the State Machines (43.4.7 in the
  35 * 802.3ad standard)
  36 */
  37#define AD_PORT_BEGIN           0x1
  38#define AD_PORT_LACP_ENABLED    0x2
  39#define AD_PORT_ACTOR_CHURN     0x4
  40#define AD_PORT_PARTNER_CHURN   0x8
  41#define AD_PORT_READY           0x10
  42#define AD_PORT_READY_N         0x20
  43#define AD_PORT_MATCHED         0x40
  44#define AD_PORT_STANDBY         0x80
  45#define AD_PORT_SELECTED        0x100
  46#define AD_PORT_MOVED           0x200
  47#define AD_PORT_CHURNED         (AD_PORT_ACTOR_CHURN | AD_PORT_PARTNER_CHURN)
  48
  49/* Port Key definitions
  50 * key is determined according to the link speed, duplex and
  51 * user key (which is yet not supported)
  52 *           --------------------------------------------------------------
  53 * Port key  | User key (10 bits)           | Speed (5 bits)      | Duplex|
  54 *           --------------------------------------------------------------
  55 *           |15                           6|5                   1|0
  56 */
  57#define  AD_DUPLEX_KEY_MASKS    0x1
  58#define  AD_SPEED_KEY_MASKS     0x3E
  59#define  AD_USER_KEY_MASKS      0xFFC0
  60
  61enum ad_link_speed_type {
  62        AD_LINK_SPEED_1MBPS = 1,
  63        AD_LINK_SPEED_10MBPS,
  64        AD_LINK_SPEED_100MBPS,
  65        AD_LINK_SPEED_1000MBPS,
  66        AD_LINK_SPEED_2500MBPS,
  67        AD_LINK_SPEED_5000MBPS,
  68        AD_LINK_SPEED_10000MBPS,
  69        AD_LINK_SPEED_14000MBPS,
  70        AD_LINK_SPEED_20000MBPS,
  71        AD_LINK_SPEED_25000MBPS,
  72        AD_LINK_SPEED_40000MBPS,
  73        AD_LINK_SPEED_50000MBPS,
  74        AD_LINK_SPEED_56000MBPS,
  75        AD_LINK_SPEED_100000MBPS,
  76        AD_LINK_SPEED_200000MBPS,
  77        AD_LINK_SPEED_400000MBPS,
  78};
  79
  80/* compare MAC addresses */
  81#define MAC_ADDRESS_EQUAL(A, B) \
  82        ether_addr_equal_64bits((const u8 *)A, (const u8 *)B)
  83
  84static const u8 null_mac_addr[ETH_ALEN + 2] __long_aligned = {
  85        0, 0, 0, 0, 0, 0
  86};
  87static u16 ad_ticks_per_sec;
  88static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000;
  89
  90static const u8 lacpdu_mcast_addr[ETH_ALEN + 2] __long_aligned =
  91        MULTICAST_LACPDU_ADDR;
  92
  93/* ================= main 802.3ad protocol functions ================== */
  94static int ad_lacpdu_send(struct port *port);
  95static int ad_marker_send(struct port *port, struct bond_marker *marker);
  96static void ad_mux_machine(struct port *port, bool *update_slave_arr);
  97static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
  98static void ad_tx_machine(struct port *port);
  99static void ad_periodic_machine(struct port *port, struct bond_params *bond_params);
 100static void ad_port_selection_logic(struct port *port, bool *update_slave_arr);
 101static void ad_agg_selection_logic(struct aggregator *aggregator,
 102                                   bool *update_slave_arr);
 103static void ad_clear_agg(struct aggregator *aggregator);
 104static void ad_initialize_agg(struct aggregator *aggregator);
 105static void ad_initialize_port(struct port *port, int lacp_fast);
 106static void ad_enable_collecting_distributing(struct port *port,
 107                                              bool *update_slave_arr);
 108static void ad_disable_collecting_distributing(struct port *port,
 109                                               bool *update_slave_arr);
 110static void ad_marker_info_received(struct bond_marker *marker_info,
 111                                    struct port *port);
 112static void ad_marker_response_received(struct bond_marker *marker,
 113                                        struct port *port);
 114static void ad_update_actor_keys(struct port *port, bool reset);
 115
 116
 117/* ================= api to bonding and kernel code ================== */
 118
 119/**
 120 * __get_bond_by_port - get the port's bonding struct
 121 * @port: the port we're looking at
 122 *
 123 * Return @port's bonding struct, or %NULL if it can't be found.
 124 */
 125static inline struct bonding *__get_bond_by_port(struct port *port)
 126{
 127        if (port->slave == NULL)
 128                return NULL;
 129
 130        return bond_get_bond_by_slave(port->slave);
 131}
 132
 133/**
 134 * __get_first_agg - get the first aggregator in the bond
 135 * @port: the port we're looking at
 136 *
 137 * Return the aggregator of the first slave in @bond, or %NULL if it can't be
 138 * found.
 139 * The caller must hold RCU or RTNL lock.
 140 */
 141static inline struct aggregator *__get_first_agg(struct port *port)
 142{
 143        struct bonding *bond = __get_bond_by_port(port);
 144        struct slave *first_slave;
 145        struct aggregator *agg;
 146
 147        /* If there's no bond for this port, or bond has no slaves */
 148        if (bond == NULL)
 149                return NULL;
 150
 151        rcu_read_lock();
 152        first_slave = bond_first_slave_rcu(bond);
 153        agg = first_slave ? &(SLAVE_AD_INFO(first_slave)->aggregator) : NULL;
 154        rcu_read_unlock();
 155
 156        return agg;
 157}
 158
 159/**
 160 * __agg_has_partner - see if we have a partner
 161 * @agg: the agregator we're looking at
 162 *
 163 * Return nonzero if aggregator has a partner (denoted by a non-zero ether
 164 * address for the partner). Return 0 if not.
 165 */
 166static inline int __agg_has_partner(struct aggregator *agg)
 167{
 168        return !is_zero_ether_addr(agg->partner_system.mac_addr_value);
 169}
 170
 171/**
 172 * __disable_port - disable the port's slave
 173 * @port: the port we're looking at
 174 */
 175static inline void __disable_port(struct port *port)
 176{
 177        bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER);
 178}
 179
 180/**
 181 * __enable_port - enable the port's slave, if it's up
 182 * @port: the port we're looking at
 183 */
 184static inline void __enable_port(struct port *port)
 185{
 186        struct slave *slave = port->slave;
 187
 188        if ((slave->link == BOND_LINK_UP) && bond_slave_is_up(slave))
 189                bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER);
 190}
 191
 192/**
 193 * __port_is_enabled - check if the port's slave is in active state
 194 * @port: the port we're looking at
 195 */
 196static inline int __port_is_enabled(struct port *port)
 197{
 198        return bond_is_active_slave(port->slave);
 199}
 200
 201/**
 202 * __get_agg_selection_mode - get the aggregator selection mode
 203 * @port: the port we're looking at
 204 *
 205 * Get the aggregator selection mode. Can be %STABLE, %BANDWIDTH or %COUNT.
 206 */
 207static inline u32 __get_agg_selection_mode(struct port *port)
 208{
 209        struct bonding *bond = __get_bond_by_port(port);
 210
 211        if (bond == NULL)
 212                return BOND_AD_STABLE;
 213
 214        return bond->params.ad_select;
 215}
 216
 217/**
 218 * __check_agg_selection_timer - check if the selection timer has expired
 219 * @port: the port we're looking at
 220 */
 221static inline int __check_agg_selection_timer(struct port *port)
 222{
 223        struct bonding *bond = __get_bond_by_port(port);
 224
 225        if (bond == NULL)
 226                return 0;
 227
 228        return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0;
 229}
 230
 231/**
 232 * __get_link_speed - get a port's speed
 233 * @port: the port we're looking at
 234 *
 235 * Return @port's speed in 802.3ad enum format. i.e. one of:
 236 *     0,
 237 *     %AD_LINK_SPEED_10MBPS,
 238 *     %AD_LINK_SPEED_100MBPS,
 239 *     %AD_LINK_SPEED_1000MBPS,
 240 *     %AD_LINK_SPEED_2500MBPS,
 241 *     %AD_LINK_SPEED_5000MBPS,
 242 *     %AD_LINK_SPEED_10000MBPS
 243 *     %AD_LINK_SPEED_14000MBPS,
 244 *     %AD_LINK_SPEED_20000MBPS
 245 *     %AD_LINK_SPEED_25000MBPS
 246 *     %AD_LINK_SPEED_40000MBPS
 247 *     %AD_LINK_SPEED_50000MBPS
 248 *     %AD_LINK_SPEED_56000MBPS
 249 *     %AD_LINK_SPEED_100000MBPS
 250 *     %AD_LINK_SPEED_200000MBPS
 251 *     %AD_LINK_SPEED_400000MBPS
 252 */
 253static u16 __get_link_speed(struct port *port)
 254{
 255        struct slave *slave = port->slave;
 256        u16 speed;
 257
 258        /* this if covers only a special case: when the configuration starts
 259         * with link down, it sets the speed to 0.
 260         * This is done in spite of the fact that the e100 driver reports 0
 261         * to be compatible with MVT in the future.
 262         */
 263        if (slave->link != BOND_LINK_UP)
 264                speed = 0;
 265        else {
 266                switch (slave->speed) {
 267                case SPEED_10:
 268                        speed = AD_LINK_SPEED_10MBPS;
 269                        break;
 270
 271                case SPEED_100:
 272                        speed = AD_LINK_SPEED_100MBPS;
 273                        break;
 274
 275                case SPEED_1000:
 276                        speed = AD_LINK_SPEED_1000MBPS;
 277                        break;
 278
 279                case SPEED_2500:
 280                        speed = AD_LINK_SPEED_2500MBPS;
 281                        break;
 282
 283                case SPEED_5000:
 284                        speed = AD_LINK_SPEED_5000MBPS;
 285                        break;
 286
 287                case SPEED_10000:
 288                        speed = AD_LINK_SPEED_10000MBPS;
 289                        break;
 290
 291                case SPEED_14000:
 292                        speed = AD_LINK_SPEED_14000MBPS;
 293                        break;
 294
 295                case SPEED_20000:
 296                        speed = AD_LINK_SPEED_20000MBPS;
 297                        break;
 298
 299                case SPEED_25000:
 300                        speed = AD_LINK_SPEED_25000MBPS;
 301                        break;
 302
 303                case SPEED_40000:
 304                        speed = AD_LINK_SPEED_40000MBPS;
 305                        break;
 306
 307                case SPEED_50000:
 308                        speed = AD_LINK_SPEED_50000MBPS;
 309                        break;
 310
 311                case SPEED_56000:
 312                        speed = AD_LINK_SPEED_56000MBPS;
 313                        break;
 314
 315                case SPEED_100000:
 316                        speed = AD_LINK_SPEED_100000MBPS;
 317                        break;
 318
 319                case SPEED_200000:
 320                        speed = AD_LINK_SPEED_200000MBPS;
 321                        break;
 322
 323                case SPEED_400000:
 324                        speed = AD_LINK_SPEED_400000MBPS;
 325                        break;
 326
 327                default:
 328                        /* unknown speed value from ethtool. shouldn't happen */
 329                        if (slave->speed != SPEED_UNKNOWN)
 330                                pr_err_once("%s: (slave %s): unknown ethtool speed (%d) for port %d (set it to 0)\n",
 331                                            slave->bond->dev->name,
 332                                            slave->dev->name, slave->speed,
 333                                            port->actor_port_number);
 334                        speed = 0;
 335                        break;
 336                }
 337        }
 338
 339        slave_dbg(slave->bond->dev, slave->dev, "Port %d Received link speed %d update from adapter\n",
 340                  port->actor_port_number, speed);
 341        return speed;
 342}
 343
 344/**
 345 * __get_duplex - get a port's duplex
 346 * @port: the port we're looking at
 347 *
 348 * Return @port's duplex in 802.3ad bitmask format. i.e.:
 349 *     0x01 if in full duplex
 350 *     0x00 otherwise
 351 */
 352static u8 __get_duplex(struct port *port)
 353{
 354        struct slave *slave = port->slave;
 355        u8 retval = 0x0;
 356
 357        /* handling a special case: when the configuration starts with
 358         * link down, it sets the duplex to 0.
 359         */
 360        if (slave->link == BOND_LINK_UP) {
 361                switch (slave->duplex) {
 362                case DUPLEX_FULL:
 363                        retval = 0x1;
 364                        slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status full duplex update from adapter\n",
 365                                  port->actor_port_number);
 366                        break;
 367                case DUPLEX_HALF:
 368                default:
 369                        retval = 0x0;
 370                        slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status NOT full duplex update from adapter\n",
 371                                  port->actor_port_number);
 372                        break;
 373                }
 374        }
 375        return retval;
 376}
 377
 378static void __ad_actor_update_port(struct port *port)
 379{
 380        const struct bonding *bond = bond_get_bond_by_slave(port->slave);
 381
 382        port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr;
 383        port->actor_system_priority = BOND_AD_INFO(bond).system.sys_priority;
 384}
 385
 386/* Conversions */
 387
 388/**
 389 * __ad_timer_to_ticks - convert a given timer type to AD module ticks
 390 * @timer_type: which timer to operate
 391 * @par: timer parameter. see below
 392 *
 393 * If @timer_type is %current_while_timer, @par indicates long/short timer.
 394 * If @timer_type is %periodic_timer, @par is one of %FAST_PERIODIC_TIME,
 395 *                                                   %SLOW_PERIODIC_TIME.
 396 */
 397static u16 __ad_timer_to_ticks(u16 timer_type, u16 par)
 398{
 399        u16 retval = 0; /* to silence the compiler */
 400
 401        switch (timer_type) {
 402        case AD_CURRENT_WHILE_TIMER:    /* for rx machine usage */
 403                if (par)
 404                        retval = (AD_SHORT_TIMEOUT_TIME*ad_ticks_per_sec);
 405                else
 406                        retval = (AD_LONG_TIMEOUT_TIME*ad_ticks_per_sec);
 407                break;
 408        case AD_ACTOR_CHURN_TIMER:      /* for local churn machine */
 409                retval = (AD_CHURN_DETECTION_TIME*ad_ticks_per_sec);
 410                break;
 411        case AD_PERIODIC_TIMER:         /* for periodic machine */
 412                retval = (par*ad_ticks_per_sec); /* long timeout */
 413                break;
 414        case AD_PARTNER_CHURN_TIMER:    /* for remote churn machine */
 415                retval = (AD_CHURN_DETECTION_TIME*ad_ticks_per_sec);
 416                break;
 417        case AD_WAIT_WHILE_TIMER:       /* for selection machine */
 418                retval = (AD_AGGREGATE_WAIT_TIME*ad_ticks_per_sec);
 419                break;
 420        }
 421
 422        return retval;
 423}
 424
 425
 426/* ================= ad_rx_machine helper functions ================== */
 427
 428/**
 429 * __choose_matched - update a port's matched variable from a received lacpdu
 430 * @lacpdu: the lacpdu we've received
 431 * @port: the port we're looking at
 432 *
 433 * Update the value of the matched variable, using parameter values from a
 434 * newly received lacpdu. Parameter values for the partner carried in the
 435 * received PDU are compared with the corresponding operational parameter
 436 * values for the actor. Matched is set to TRUE if all of these parameters
 437 * match and the PDU parameter partner_state.aggregation has the same value as
 438 * actor_oper_port_state.aggregation and lacp will actively maintain the link
 439 * in the aggregation. Matched is also set to TRUE if the value of
 440 * actor_state.aggregation in the received PDU is set to FALSE, i.e., indicates
 441 * an individual link and lacp will actively maintain the link. Otherwise,
 442 * matched is set to FALSE. LACP is considered to be actively maintaining the
 443 * link if either the PDU's actor_state.lacp_activity variable is TRUE or both
 444 * the actor's actor_oper_port_state.lacp_activity and the PDU's
 445 * partner_state.lacp_activity variables are TRUE.
 446 *
 447 * Note: the AD_PORT_MATCHED "variable" is not specified by 802.3ad; it is
 448 * used here to implement the language from 802.3ad 43.4.9 that requires
 449 * recordPDU to "match" the LACPDU parameters to the stored values.
 450 */
 451static void __choose_matched(struct lacpdu *lacpdu, struct port *port)
 452{
 453        /* check if all parameters are alike
 454         * or this is individual link(aggregation == FALSE)
 455         * then update the state machine Matched variable.
 456         */
 457        if (((ntohs(lacpdu->partner_port) == port->actor_port_number) &&
 458             (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) &&
 459             MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) &&
 460             (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
 461             (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) &&
 462             ((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGGREGATION))) ||
 463            ((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0)
 464                ) {
 465                port->sm_vars |= AD_PORT_MATCHED;
 466        } else {
 467                port->sm_vars &= ~AD_PORT_MATCHED;
 468        }
 469}
 470
 471/**
 472 * __record_pdu - record parameters from a received lacpdu
 473 * @lacpdu: the lacpdu we've received
 474 * @port: the port we're looking at
 475 *
 476 * Record the parameter values for the Actor carried in a received lacpdu as
 477 * the current partner operational parameter values and sets
 478 * actor_oper_port_state.defaulted to FALSE.
 479 */
 480static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
 481{
 482        if (lacpdu && port) {
 483                struct port_params *partner = &port->partner_oper;
 484
 485                __choose_matched(lacpdu, port);
 486                /* record the new parameter values for the partner
 487                 * operational
 488                 */
 489                partner->port_number = ntohs(lacpdu->actor_port);
 490                partner->port_priority = ntohs(lacpdu->actor_port_priority);
 491                partner->system = lacpdu->actor_system;
 492                partner->system_priority = ntohs(lacpdu->actor_system_priority);
 493                partner->key = ntohs(lacpdu->actor_key);
 494                partner->port_state = lacpdu->actor_state;
 495
 496                /* set actor_oper_port_state.defaulted to FALSE */
 497                port->actor_oper_port_state &= ~LACP_STATE_DEFAULTED;
 498
 499                /* set the partner sync. to on if the partner is sync,
 500                 * and the port is matched
 501                 */
 502                if ((port->sm_vars & AD_PORT_MATCHED) &&
 503                    (lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) {
 504                        partner->port_state |= LACP_STATE_SYNCHRONIZATION;
 505                        slave_dbg(port->slave->bond->dev, port->slave->dev,
 506                                  "partner sync=1\n");
 507                } else {
 508                        partner->port_state &= ~LACP_STATE_SYNCHRONIZATION;
 509                        slave_dbg(port->slave->bond->dev, port->slave->dev,
 510                                  "partner sync=0\n");
 511                }
 512        }
 513}
 514
 515/**
 516 * __record_default - record default parameters
 517 * @port: the port we're looking at
 518 *
 519 * This function records the default parameter values for the partner carried
 520 * in the Partner Admin parameters as the current partner operational parameter
 521 * values and sets actor_oper_port_state.defaulted to TRUE.
 522 */
 523static void __record_default(struct port *port)
 524{
 525        if (port) {
 526                /* record the partner admin parameters */
 527                memcpy(&port->partner_oper, &port->partner_admin,
 528                       sizeof(struct port_params));
 529
 530                /* set actor_oper_port_state.defaulted to true */
 531                port->actor_oper_port_state |= LACP_STATE_DEFAULTED;
 532        }
 533}
 534
 535/**
 536 * __update_selected - update a port's Selected variable from a received lacpdu
 537 * @lacpdu: the lacpdu we've received
 538 * @port: the port we're looking at
 539 *
 540 * Update the value of the selected variable, using parameter values from a
 541 * newly received lacpdu. The parameter values for the Actor carried in the
 542 * received PDU are compared with the corresponding operational parameter
 543 * values for the ports partner. If one or more of the comparisons shows that
 544 * the value(s) received in the PDU differ from the current operational values,
 545 * then selected is set to FALSE and actor_oper_port_state.synchronization is
 546 * set to out_of_sync. Otherwise, selected remains unchanged.
 547 */
 548static void __update_selected(struct lacpdu *lacpdu, struct port *port)
 549{
 550        if (lacpdu && port) {
 551                const struct port_params *partner = &port->partner_oper;
 552
 553                /* check if any parameter is different then
 554                 * update the state machine selected variable.
 555                 */
 556                if (ntohs(lacpdu->actor_port) != partner->port_number ||
 557                    ntohs(lacpdu->actor_port_priority) != partner->port_priority ||
 558                    !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) ||
 559                    ntohs(lacpdu->actor_system_priority) != partner->system_priority ||
 560                    ntohs(lacpdu->actor_key) != partner->key ||
 561                    (lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) {
 562                        port->sm_vars &= ~AD_PORT_SELECTED;
 563                }
 564        }
 565}
 566
 567/**
 568 * __update_default_selected - update a port's Selected variable from Partner
 569 * @port: the port we're looking at
 570 *
 571 * This function updates the value of the selected variable, using the partner
 572 * administrative parameter values. The administrative values are compared with
 573 * the corresponding operational parameter values for the partner. If one or
 574 * more of the comparisons shows that the administrative value(s) differ from
 575 * the current operational values, then Selected is set to FALSE and
 576 * actor_oper_port_state.synchronization is set to OUT_OF_SYNC. Otherwise,
 577 * Selected remains unchanged.
 578 */
 579static void __update_default_selected(struct port *port)
 580{
 581        if (port) {
 582                const struct port_params *admin = &port->partner_admin;
 583                const struct port_params *oper = &port->partner_oper;
 584
 585                /* check if any parameter is different then
 586                 * update the state machine selected variable.
 587                 */
 588                if (admin->port_number != oper->port_number ||
 589                    admin->port_priority != oper->port_priority ||
 590                    !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) ||
 591                    admin->system_priority != oper->system_priority ||
 592                    admin->key != oper->key ||
 593                    (admin->port_state & LACP_STATE_AGGREGATION)
 594                        != (oper->port_state & LACP_STATE_AGGREGATION)) {
 595                        port->sm_vars &= ~AD_PORT_SELECTED;
 596                }
 597        }
 598}
 599
 600/**
 601 * __update_ntt - update a port's ntt variable from a received lacpdu
 602 * @lacpdu: the lacpdu we've received
 603 * @port: the port we're looking at
 604 *
 605 * Updates the value of the ntt variable, using parameter values from a newly
 606 * received lacpdu. The parameter values for the partner carried in the
 607 * received PDU are compared with the corresponding operational parameter
 608 * values for the Actor. If one or more of the comparisons shows that the
 609 * value(s) received in the PDU differ from the current operational values,
 610 * then ntt is set to TRUE. Otherwise, ntt remains unchanged.
 611 */
 612static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
 613{
 614        /* validate lacpdu and port */
 615        if (lacpdu && port) {
 616                /* check if any parameter is different then
 617                 * update the port->ntt.
 618                 */
 619                if ((ntohs(lacpdu->partner_port) != port->actor_port_number) ||
 620                    (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) ||
 621                    !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) ||
 622                    (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
 623                    (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) ||
 624                    ((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY)) ||
 625                    ((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT)) ||
 626                    ((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) ||
 627                    ((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGGREGATION))
 628                   ) {
 629                        port->ntt = true;
 630                }
 631        }
 632}
 633
 634/**
 635 * __agg_ports_are_ready - check if all ports in an aggregator are ready
 636 * @aggregator: the aggregator we're looking at
 637 *
 638 */
 639static int __agg_ports_are_ready(struct aggregator *aggregator)
 640{
 641        struct port *port;
 642        int retval = 1;
 643
 644        if (aggregator) {
 645                /* scan all ports in this aggregator to verfy if they are
 646                 * all ready.
 647                 */
 648                for (port = aggregator->lag_ports;
 649                     port;
 650                     port = port->next_port_in_aggregator) {
 651                        if (!(port->sm_vars & AD_PORT_READY_N)) {
 652                                retval = 0;
 653                                break;
 654                        }
 655                }
 656        }
 657
 658        return retval;
 659}
 660
 661/**
 662 * __set_agg_ports_ready - set value of Ready bit in all ports of an aggregator
 663 * @aggregator: the aggregator we're looking at
 664 * @val: Should the ports' ready bit be set on or off
 665 *
 666 */
 667static void __set_agg_ports_ready(struct aggregator *aggregator, int val)
 668{
 669        struct port *port;
 670
 671        for (port = aggregator->lag_ports; port;
 672             port = port->next_port_in_aggregator) {
 673                if (val)
 674                        port->sm_vars |= AD_PORT_READY;
 675                else
 676                        port->sm_vars &= ~AD_PORT_READY;
 677        }
 678}
 679
 680static int __agg_active_ports(struct aggregator *agg)
 681{
 682        struct port *port;
 683        int active = 0;
 684
 685        for (port = agg->lag_ports; port;
 686             port = port->next_port_in_aggregator) {
 687                if (port->is_enabled)
 688                        active++;
 689        }
 690
 691        return active;
 692}
 693
 694/**
 695 * __get_agg_bandwidth - get the total bandwidth of an aggregator
 696 * @aggregator: the aggregator we're looking at
 697 *
 698 */
 699static u32 __get_agg_bandwidth(struct aggregator *aggregator)
 700{
 701        int nports = __agg_active_ports(aggregator);
 702        u32 bandwidth = 0;
 703
 704        if (nports) {
 705                switch (__get_link_speed(aggregator->lag_ports)) {
 706                case AD_LINK_SPEED_1MBPS:
 707                        bandwidth = nports;
 708                        break;
 709                case AD_LINK_SPEED_10MBPS:
 710                        bandwidth = nports * 10;
 711                        break;
 712                case AD_LINK_SPEED_100MBPS:
 713                        bandwidth = nports * 100;
 714                        break;
 715                case AD_LINK_SPEED_1000MBPS:
 716                        bandwidth = nports * 1000;
 717                        break;
 718                case AD_LINK_SPEED_2500MBPS:
 719                        bandwidth = nports * 2500;
 720                        break;
 721                case AD_LINK_SPEED_5000MBPS:
 722                        bandwidth = nports * 5000;
 723                        break;
 724                case AD_LINK_SPEED_10000MBPS:
 725                        bandwidth = nports * 10000;
 726                        break;
 727                case AD_LINK_SPEED_14000MBPS:
 728                        bandwidth = nports * 14000;
 729                        break;
 730                case AD_LINK_SPEED_20000MBPS:
 731                        bandwidth = nports * 20000;
 732                        break;
 733                case AD_LINK_SPEED_25000MBPS:
 734                        bandwidth = nports * 25000;
 735                        break;
 736                case AD_LINK_SPEED_40000MBPS:
 737                        bandwidth = nports * 40000;
 738                        break;
 739                case AD_LINK_SPEED_50000MBPS:
 740                        bandwidth = nports * 50000;
 741                        break;
 742                case AD_LINK_SPEED_56000MBPS:
 743                        bandwidth = nports * 56000;
 744                        break;
 745                case AD_LINK_SPEED_100000MBPS:
 746                        bandwidth = nports * 100000;
 747                        break;
 748                case AD_LINK_SPEED_200000MBPS:
 749                        bandwidth = nports * 200000;
 750                        break;
 751                case AD_LINK_SPEED_400000MBPS:
 752                        bandwidth = nports * 400000;
 753                        break;
 754                default:
 755                        bandwidth = 0; /* to silence the compiler */
 756                }
 757        }
 758        return bandwidth;
 759}
 760
 761/**
 762 * __get_active_agg - get the current active aggregator
 763 * @aggregator: the aggregator we're looking at
 764 *
 765 * Caller must hold RCU lock.
 766 */
 767static struct aggregator *__get_active_agg(struct aggregator *aggregator)
 768{
 769        struct bonding *bond = aggregator->slave->bond;
 770        struct list_head *iter;
 771        struct slave *slave;
 772
 773        bond_for_each_slave_rcu(bond, slave, iter)
 774                if (SLAVE_AD_INFO(slave)->aggregator.is_active)
 775                        return &(SLAVE_AD_INFO(slave)->aggregator);
 776
 777        return NULL;
 778}
 779
 780/**
 781 * __update_lacpdu_from_port - update a port's lacpdu fields
 782 * @port: the port we're looking at
 783 */
 784static inline void __update_lacpdu_from_port(struct port *port)
 785{
 786        struct lacpdu *lacpdu = &port->lacpdu;
 787        const struct port_params *partner = &port->partner_oper;
 788
 789        /* update current actual Actor parameters
 790         * lacpdu->subtype                   initialized
 791         * lacpdu->version_number            initialized
 792         * lacpdu->tlv_type_actor_info       initialized
 793         * lacpdu->actor_information_length  initialized
 794         */
 795
 796        lacpdu->actor_system_priority = htons(port->actor_system_priority);
 797        lacpdu->actor_system = port->actor_system;
 798        lacpdu->actor_key = htons(port->actor_oper_port_key);
 799        lacpdu->actor_port_priority = htons(port->actor_port_priority);
 800        lacpdu->actor_port = htons(port->actor_port_number);
 801        lacpdu->actor_state = port->actor_oper_port_state;
 802        slave_dbg(port->slave->bond->dev, port->slave->dev,
 803                  "update lacpdu: actor port state %x\n",
 804                  port->actor_oper_port_state);
 805
 806        /* lacpdu->reserved_3_1              initialized
 807         * lacpdu->tlv_type_partner_info     initialized
 808         * lacpdu->partner_information_length initialized
 809         */
 810
 811        lacpdu->partner_system_priority = htons(partner->system_priority);
 812        lacpdu->partner_system = partner->system;
 813        lacpdu->partner_key = htons(partner->key);
 814        lacpdu->partner_port_priority = htons(partner->port_priority);
 815        lacpdu->partner_port = htons(partner->port_number);
 816        lacpdu->partner_state = partner->port_state;
 817
 818        /* lacpdu->reserved_3_2              initialized
 819         * lacpdu->tlv_type_collector_info   initialized
 820         * lacpdu->collector_information_length initialized
 821         * collector_max_delay                initialized
 822         * reserved_12[12]                   initialized
 823         * tlv_type_terminator               initialized
 824         * terminator_length                 initialized
 825         * reserved_50[50]                   initialized
 826         */
 827}
 828
 829/* ================= main 802.3ad protocol code ========================= */
 830
 831/**
 832 * ad_lacpdu_send - send out a lacpdu packet on a given port
 833 * @port: the port we're looking at
 834 *
 835 * Returns:   0 on success
 836 *          < 0 on error
 837 */
 838static int ad_lacpdu_send(struct port *port)
 839{
 840        struct slave *slave = port->slave;
 841        struct sk_buff *skb;
 842        struct lacpdu_header *lacpdu_header;
 843        int length = sizeof(struct lacpdu_header);
 844
 845        skb = dev_alloc_skb(length);
 846        if (!skb)
 847                return -ENOMEM;
 848
 849        atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx);
 850        atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx);
 851
 852        skb->dev = slave->dev;
 853        skb_reset_mac_header(skb);
 854        skb->network_header = skb->mac_header + ETH_HLEN;
 855        skb->protocol = PKT_TYPE_LACPDU;
 856        skb->priority = TC_PRIO_CONTROL;
 857
 858        lacpdu_header = skb_put(skb, length);
 859
 860        ether_addr_copy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr);
 861        /* Note: source address is set to be the member's PERMANENT address,
 862         * because we use it to identify loopback lacpdus in receive.
 863         */
 864        ether_addr_copy(lacpdu_header->hdr.h_source, slave->perm_hwaddr);
 865        lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU;
 866
 867        lacpdu_header->lacpdu = port->lacpdu;
 868
 869        dev_queue_xmit(skb);
 870
 871        return 0;
 872}
 873
 874/**
 875 * ad_marker_send - send marker information/response on a given port
 876 * @port: the port we're looking at
 877 * @marker: marker data to send
 878 *
 879 * Returns:   0 on success
 880 *          < 0 on error
 881 */
 882static int ad_marker_send(struct port *port, struct bond_marker *marker)
 883{
 884        struct slave *slave = port->slave;
 885        struct sk_buff *skb;
 886        struct bond_marker_header *marker_header;
 887        int length = sizeof(struct bond_marker_header);
 888
 889        skb = dev_alloc_skb(length + 16);
 890        if (!skb)
 891                return -ENOMEM;
 892
 893        switch (marker->tlv_type) {
 894        case AD_MARKER_INFORMATION_SUBTYPE:
 895                atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_tx);
 896                atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_tx);
 897                break;
 898        case AD_MARKER_RESPONSE_SUBTYPE:
 899                atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_resp_tx);
 900                atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_resp_tx);
 901                break;
 902        }
 903
 904        skb_reserve(skb, 16);
 905
 906        skb->dev = slave->dev;
 907        skb_reset_mac_header(skb);
 908        skb->network_header = skb->mac_header + ETH_HLEN;
 909        skb->protocol = PKT_TYPE_LACPDU;
 910
 911        marker_header = skb_put(skb, length);
 912
 913        ether_addr_copy(marker_header->hdr.h_dest, lacpdu_mcast_addr);
 914        /* Note: source address is set to be the member's PERMANENT address,
 915         * because we use it to identify loopback MARKERs in receive.
 916         */
 917        ether_addr_copy(marker_header->hdr.h_source, slave->perm_hwaddr);
 918        marker_header->hdr.h_proto = PKT_TYPE_LACPDU;
 919
 920        marker_header->marker = *marker;
 921
 922        dev_queue_xmit(skb);
 923
 924        return 0;
 925}
 926
 927/**
 928 * ad_mux_machine - handle a port's mux state machine
 929 * @port: the port we're looking at
 930 * @update_slave_arr: Does slave array need update?
 931 */
 932static void ad_mux_machine(struct port *port, bool *update_slave_arr)
 933{
 934        mux_states_t last_state;
 935
 936        /* keep current State Machine state to compare later if it was
 937         * changed
 938         */
 939        last_state = port->sm_mux_state;
 940
 941        if (port->sm_vars & AD_PORT_BEGIN) {
 942                port->sm_mux_state = AD_MUX_DETACHED;
 943        } else {
 944                switch (port->sm_mux_state) {
 945                case AD_MUX_DETACHED:
 946                        if ((port->sm_vars & AD_PORT_SELECTED)
 947                            || (port->sm_vars & AD_PORT_STANDBY))
 948                                /* if SELECTED or STANDBY */
 949                                port->sm_mux_state = AD_MUX_WAITING;
 950                        break;
 951                case AD_MUX_WAITING:
 952                        /* if SELECTED == FALSE return to DETACH state */
 953                        if (!(port->sm_vars & AD_PORT_SELECTED)) {
 954                                port->sm_vars &= ~AD_PORT_READY_N;
 955                                /* in order to withhold the Selection Logic to
 956                                 * check all ports READY_N value every callback
 957                                 * cycle to update ready variable, we check
 958                                 * READY_N and update READY here
 959                                 */
 960                                __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
 961                                port->sm_mux_state = AD_MUX_DETACHED;
 962                                break;
 963                        }
 964
 965                        /* check if the wait_while_timer expired */
 966                        if (port->sm_mux_timer_counter
 967                            && !(--port->sm_mux_timer_counter))
 968                                port->sm_vars |= AD_PORT_READY_N;
 969
 970                        /* in order to withhold the selection logic to check
 971                         * all ports READY_N value every callback cycle to
 972                         * update ready variable, we check READY_N and update
 973                         * READY here
 974                         */
 975                        __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
 976
 977                        /* if the wait_while_timer expired, and the port is
 978                         * in READY state, move to ATTACHED state
 979                         */
 980                        if ((port->sm_vars & AD_PORT_READY)
 981                            && !port->sm_mux_timer_counter)
 982                                port->sm_mux_state = AD_MUX_ATTACHED;
 983                        break;
 984                case AD_MUX_ATTACHED:
 985                        /* check also if agg_select_timer expired (so the
 986                         * edable port will take place only after this timer)
 987                         */
 988                        if ((port->sm_vars & AD_PORT_SELECTED) &&
 989                            (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) &&
 990                            !__check_agg_selection_timer(port)) {
 991                                if (port->aggregator->is_active)
 992                                        port->sm_mux_state =
 993                                            AD_MUX_COLLECTING_DISTRIBUTING;
 994                        } else if (!(port->sm_vars & AD_PORT_SELECTED) ||
 995                                   (port->sm_vars & AD_PORT_STANDBY)) {
 996                                /* if UNSELECTED or STANDBY */
 997                                port->sm_vars &= ~AD_PORT_READY_N;
 998                                /* in order to withhold the selection logic to
 999                                 * check all ports READY_N value every callback
1000                                 * cycle to update ready variable, we check
1001                                 * READY_N and update READY here
1002                                 */
1003                                __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
1004                                port->sm_mux_state = AD_MUX_DETACHED;
1005                        } else if (port->aggregator->is_active) {
1006                                port->actor_oper_port_state |=
1007                                    LACP_STATE_SYNCHRONIZATION;
1008                        }
1009                        break;
1010                case AD_MUX_COLLECTING_DISTRIBUTING:
1011                        if (!(port->sm_vars & AD_PORT_SELECTED) ||
1012                            (port->sm_vars & AD_PORT_STANDBY) ||
1013                            !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) ||
1014                            !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) {
1015                                port->sm_mux_state = AD_MUX_ATTACHED;
1016                        } else {
1017                                /* if port state hasn't changed make
1018                                 * sure that a collecting distributing
1019                                 * port in an active aggregator is enabled
1020                                 */
1021                                if (port->aggregator &&
1022                                    port->aggregator->is_active &&
1023                                    !__port_is_enabled(port)) {
1024
1025                                        __enable_port(port);
1026                                }
1027                        }
1028                        break;
1029                default:
1030                        break;
1031                }
1032        }
1033
1034        /* check if the state machine was changed */
1035        if (port->sm_mux_state != last_state) {
1036                slave_dbg(port->slave->bond->dev, port->slave->dev,
1037                          "Mux Machine: Port=%d, Last State=%d, Curr State=%d\n",
1038                          port->actor_port_number,
1039                          last_state,
1040                          port->sm_mux_state);
1041                switch (port->sm_mux_state) {
1042                case AD_MUX_DETACHED:
1043                        port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
1044                        ad_disable_collecting_distributing(port,
1045                                                           update_slave_arr);
1046                        port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
1047                        port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
1048                        port->ntt = true;
1049                        break;
1050                case AD_MUX_WAITING:
1051                        port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0);
1052                        break;
1053                case AD_MUX_ATTACHED:
1054                        if (port->aggregator->is_active)
1055                                port->actor_oper_port_state |=
1056                                    LACP_STATE_SYNCHRONIZATION;
1057                        else
1058                                port->actor_oper_port_state &=
1059                                    ~LACP_STATE_SYNCHRONIZATION;
1060                        port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
1061                        port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
1062                        ad_disable_collecting_distributing(port,
1063                                                           update_slave_arr);
1064                        port->ntt = true;
1065                        break;
1066                case AD_MUX_COLLECTING_DISTRIBUTING:
1067                        port->actor_oper_port_state |= LACP_STATE_COLLECTING;
1068                        port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING;
1069                        port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION;
1070                        ad_enable_collecting_distributing(port,
1071                                                          update_slave_arr);
1072                        port->ntt = true;
1073                        break;
1074                default:
1075                        break;
1076                }
1077        }
1078}
1079
1080/**
1081 * ad_rx_machine - handle a port's rx State Machine
1082 * @lacpdu: the lacpdu we've received
1083 * @port: the port we're looking at
1084 *
1085 * If lacpdu arrived, stop previous timer (if exists) and set the next state as
1086 * CURRENT. If timer expired set the state machine in the proper state.
1087 * In other cases, this function checks if we need to switch to other state.
1088 */
1089static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1090{
1091        rx_states_t last_state;
1092
1093        /* keep current State Machine state to compare later if it was
1094         * changed
1095         */
1096        last_state = port->sm_rx_state;
1097
1098        if (lacpdu) {
1099                atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.lacpdu_rx);
1100                atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.lacpdu_rx);
1101        }
1102        /* check if state machine should change state */
1103
1104        /* first, check if port was reinitialized */
1105        if (port->sm_vars & AD_PORT_BEGIN) {
1106                port->sm_rx_state = AD_RX_INITIALIZE;
1107                port->sm_vars |= AD_PORT_CHURNED;
1108        /* check if port is not enabled */
1109        } else if (!(port->sm_vars & AD_PORT_BEGIN) && !port->is_enabled)
1110                port->sm_rx_state = AD_RX_PORT_DISABLED;
1111        /* check if new lacpdu arrived */
1112        else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) ||
1113                 (port->sm_rx_state == AD_RX_DEFAULTED) ||
1114                 (port->sm_rx_state == AD_RX_CURRENT))) {
1115                if (port->sm_rx_state != AD_RX_CURRENT)
1116                        port->sm_vars |= AD_PORT_CHURNED;
1117                port->sm_rx_timer_counter = 0;
1118                port->sm_rx_state = AD_RX_CURRENT;
1119        } else {
1120                /* if timer is on, and if it is expired */
1121                if (port->sm_rx_timer_counter &&
1122                    !(--port->sm_rx_timer_counter)) {
1123                        switch (port->sm_rx_state) {
1124                        case AD_RX_EXPIRED:
1125                                port->sm_rx_state = AD_RX_DEFAULTED;
1126                                break;
1127                        case AD_RX_CURRENT:
1128                                port->sm_rx_state = AD_RX_EXPIRED;
1129                                break;
1130                        default:
1131                                break;
1132                        }
1133                } else {
1134                        /* if no lacpdu arrived and no timer is on */
1135                        switch (port->sm_rx_state) {
1136                        case AD_RX_PORT_DISABLED:
1137                                if (port->is_enabled &&
1138                                    (port->sm_vars & AD_PORT_LACP_ENABLED))
1139                                        port->sm_rx_state = AD_RX_EXPIRED;
1140                                else if (port->is_enabled
1141                                         && ((port->sm_vars
1142                                              & AD_PORT_LACP_ENABLED) == 0))
1143                                        port->sm_rx_state = AD_RX_LACP_DISABLED;
1144                                break;
1145                        default:
1146                                break;
1147
1148                        }
1149                }
1150        }
1151
1152        /* check if the State machine was changed or new lacpdu arrived */
1153        if ((port->sm_rx_state != last_state) || (lacpdu)) {
1154                slave_dbg(port->slave->bond->dev, port->slave->dev,
1155                          "Rx Machine: Port=%d, Last State=%d, Curr State=%d\n",
1156                          port->actor_port_number,
1157                          last_state,
1158                          port->sm_rx_state);
1159                switch (port->sm_rx_state) {
1160                case AD_RX_INITIALIZE:
1161                        if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS))
1162                                port->sm_vars &= ~AD_PORT_LACP_ENABLED;
1163                        else
1164                                port->sm_vars |= AD_PORT_LACP_ENABLED;
1165                        port->sm_vars &= ~AD_PORT_SELECTED;
1166                        __record_default(port);
1167                        port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1168                        port->sm_rx_state = AD_RX_PORT_DISABLED;
1169
1170                        fallthrough;
1171                case AD_RX_PORT_DISABLED:
1172                        port->sm_vars &= ~AD_PORT_MATCHED;
1173                        break;
1174                case AD_RX_LACP_DISABLED:
1175                        port->sm_vars &= ~AD_PORT_SELECTED;
1176                        __record_default(port);
1177                        port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION;
1178                        port->sm_vars |= AD_PORT_MATCHED;
1179                        port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1180                        break;
1181                case AD_RX_EXPIRED:
1182                        /* Reset of the Synchronization flag (Standard 43.4.12)
1183                         * This reset cause to disable this port in the
1184                         * COLLECTING_DISTRIBUTING state of the mux machine in
1185                         * case of EXPIRED even if LINK_DOWN didn't arrive for
1186                         * the port.
1187                         */
1188                        port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION;
1189                        port->sm_vars &= ~AD_PORT_MATCHED;
1190                        port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT;
1191                        port->partner_oper.port_state |= LACP_STATE_LACP_ACTIVITY;
1192                        port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT));
1193                        port->actor_oper_port_state |= LACP_STATE_EXPIRED;
1194                        port->sm_vars |= AD_PORT_CHURNED;
1195                        break;
1196                case AD_RX_DEFAULTED:
1197                        __update_default_selected(port);
1198                        __record_default(port);
1199                        port->sm_vars |= AD_PORT_MATCHED;
1200                        port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1201                        break;
1202                case AD_RX_CURRENT:
1203                        /* detect loopback situation */
1204                        if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system),
1205                                              &(port->actor_system))) {
1206                                slave_err(port->slave->bond->dev, port->slave->dev, "An illegal loopback occurred on slave\n"
1207                                          "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n");
1208                                return;
1209                        }
1210                        __update_selected(lacpdu, port);
1211                        __update_ntt(lacpdu, port);
1212                        __record_pdu(lacpdu, port);
1213                        port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT));
1214                        port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1215                        break;
1216                default:
1217                        break;
1218                }
1219        }
1220}
1221
1222/**
1223 * ad_churn_machine - handle port churn's state machine
1224 * @port: the port we're looking at
1225 *
1226 */
1227static void ad_churn_machine(struct port *port)
1228{
1229        if (port->sm_vars & AD_PORT_CHURNED) {
1230                port->sm_vars &= ~AD_PORT_CHURNED;
1231                port->sm_churn_actor_state = AD_CHURN_MONITOR;
1232                port->sm_churn_partner_state = AD_CHURN_MONITOR;
1233                port->sm_churn_actor_timer_counter =
1234                        __ad_timer_to_ticks(AD_ACTOR_CHURN_TIMER, 0);
1235                port->sm_churn_partner_timer_counter =
1236                         __ad_timer_to_ticks(AD_PARTNER_CHURN_TIMER, 0);
1237                return;
1238        }
1239        if (port->sm_churn_actor_timer_counter &&
1240            !(--port->sm_churn_actor_timer_counter) &&
1241            port->sm_churn_actor_state == AD_CHURN_MONITOR) {
1242                if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) {
1243                        port->sm_churn_actor_state = AD_NO_CHURN;
1244                } else {
1245                        port->churn_actor_count++;
1246                        port->sm_churn_actor_state = AD_CHURN;
1247                }
1248        }
1249        if (port->sm_churn_partner_timer_counter &&
1250            !(--port->sm_churn_partner_timer_counter) &&
1251            port->sm_churn_partner_state == AD_CHURN_MONITOR) {
1252                if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) {
1253                        port->sm_churn_partner_state = AD_NO_CHURN;
1254                } else {
1255                        port->churn_partner_count++;
1256                        port->sm_churn_partner_state = AD_CHURN;
1257                }
1258        }
1259}
1260
1261/**
1262 * ad_tx_machine - handle a port's tx state machine
1263 * @port: the port we're looking at
1264 */
1265static void ad_tx_machine(struct port *port)
1266{
1267        /* check if tx timer expired, to verify that we do not send more than
1268         * 3 packets per second
1269         */
1270        if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) {
1271                /* check if there is something to send */
1272                if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) {
1273                        __update_lacpdu_from_port(port);
1274
1275                        if (ad_lacpdu_send(port) >= 0) {
1276                                slave_dbg(port->slave->bond->dev,
1277                                          port->slave->dev,
1278                                          "Sent LACPDU on port %d\n",
1279                                          port->actor_port_number);
1280
1281                                /* mark ntt as false, so it will not be sent
1282                                 * again until demanded
1283                                 */
1284                                port->ntt = false;
1285                        }
1286                }
1287                /* restart tx timer(to verify that we will not exceed
1288                 * AD_MAX_TX_IN_SECOND
1289                 */
1290                port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND;
1291        }
1292}
1293
1294/**
1295 * ad_periodic_machine - handle a port's periodic state machine
1296 * @port: the port we're looking at
1297 * @bond_params: bond parameters we will use
1298 *
1299 * Turn ntt flag on priodically to perform periodic transmission of lacpdu's.
1300 */
1301static void ad_periodic_machine(struct port *port, struct bond_params *bond_params)
1302{
1303        periodic_states_t last_state;
1304
1305        /* keep current state machine state to compare later if it was changed */
1306        last_state = port->sm_periodic_state;
1307
1308        /* check if port was reinitialized */
1309        if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) ||
1310            (!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LACP_STATE_LACP_ACTIVITY)) ||
1311            !bond_params->lacp_active) {
1312                port->sm_periodic_state = AD_NO_PERIODIC;
1313        }
1314        /* check if state machine should change state */
1315        else if (port->sm_periodic_timer_counter) {
1316                /* check if periodic state machine expired */
1317                if (!(--port->sm_periodic_timer_counter)) {
1318                        /* if expired then do tx */
1319                        port->sm_periodic_state = AD_PERIODIC_TX;
1320                } else {
1321                        /* If not expired, check if there is some new timeout
1322                         * parameter from the partner state
1323                         */
1324                        switch (port->sm_periodic_state) {
1325                        case AD_FAST_PERIODIC:
1326                                if (!(port->partner_oper.port_state
1327                                      & LACP_STATE_LACP_TIMEOUT))
1328                                        port->sm_periodic_state = AD_SLOW_PERIODIC;
1329                                break;
1330                        case AD_SLOW_PERIODIC:
1331                                if ((port->partner_oper.port_state & LACP_STATE_LACP_TIMEOUT)) {
1332                                        port->sm_periodic_timer_counter = 0;
1333                                        port->sm_periodic_state = AD_PERIODIC_TX;
1334                                }
1335                                break;
1336                        default:
1337                                break;
1338                        }
1339                }
1340        } else {
1341                switch (port->sm_periodic_state) {
1342                case AD_NO_PERIODIC:
1343                        port->sm_periodic_state = AD_FAST_PERIODIC;
1344                        break;
1345                case AD_PERIODIC_TX:
1346                        if (!(port->partner_oper.port_state &
1347                            LACP_STATE_LACP_TIMEOUT))
1348                                port->sm_periodic_state = AD_SLOW_PERIODIC;
1349                        else
1350                                port->sm_periodic_state = AD_FAST_PERIODIC;
1351                        break;
1352                default:
1353                        break;
1354                }
1355        }
1356
1357        /* check if the state machine was changed */
1358        if (port->sm_periodic_state != last_state) {
1359                slave_dbg(port->slave->bond->dev, port->slave->dev,
1360                          "Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n",
1361                          port->actor_port_number, last_state,
1362                          port->sm_periodic_state);
1363                switch (port->sm_periodic_state) {
1364                case AD_NO_PERIODIC:
1365                        port->sm_periodic_timer_counter = 0;
1366                        break;
1367                case AD_FAST_PERIODIC:
1368                        /* decrement 1 tick we lost in the PERIODIC_TX cycle */
1369                        port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TIME))-1;
1370                        break;
1371                case AD_SLOW_PERIODIC:
1372                        /* decrement 1 tick we lost in the PERIODIC_TX cycle */
1373                        port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TIME))-1;
1374                        break;
1375                case AD_PERIODIC_TX:
1376                        port->ntt = true;
1377                        break;
1378                default:
1379                        break;
1380                }
1381        }
1382}
1383
1384/**
1385 * ad_port_selection_logic - select aggregation groups
1386 * @port: the port we're looking at
1387 * @update_slave_arr: Does slave array need update?
1388 *
1389 * Select aggregation groups, and assign each port for it's aggregetor. The
1390 * selection logic is called in the inititalization (after all the handshkes),
1391 * and after every lacpdu receive (if selected is off).
1392 */
1393static void ad_port_selection_logic(struct port *port, bool *update_slave_arr)
1394{
1395        struct aggregator *aggregator, *free_aggregator = NULL, *temp_aggregator;
1396        struct port *last_port = NULL, *curr_port;
1397        struct list_head *iter;
1398        struct bonding *bond;
1399        struct slave *slave;
1400        int found = 0;
1401
1402        /* if the port is already Selected, do nothing */
1403        if (port->sm_vars & AD_PORT_SELECTED)
1404                return;
1405
1406        bond = __get_bond_by_port(port);
1407
1408        /* if the port is connected to other aggregator, detach it */
1409        if (port->aggregator) {
1410                /* detach the port from its former aggregator */
1411                temp_aggregator = port->aggregator;
1412                for (curr_port = temp_aggregator->lag_ports; curr_port;
1413                     last_port = curr_port,
1414                     curr_port = curr_port->next_port_in_aggregator) {
1415                        if (curr_port == port) {
1416                                temp_aggregator->num_of_ports--;
1417                                /* if it is the first port attached to the
1418                                 * aggregator
1419                                 */
1420                                if (!last_port) {
1421                                        temp_aggregator->lag_ports =
1422                                                port->next_port_in_aggregator;
1423                                } else {
1424                                        /* not the first port attached to the
1425                                         * aggregator
1426                                         */
1427                                        last_port->next_port_in_aggregator =
1428                                                port->next_port_in_aggregator;
1429                                }
1430
1431                                /* clear the port's relations to this
1432                                 * aggregator
1433                                 */
1434                                port->aggregator = NULL;
1435                                port->next_port_in_aggregator = NULL;
1436                                port->actor_port_aggregator_identifier = 0;
1437
1438                                slave_dbg(bond->dev, port->slave->dev, "Port %d left LAG %d\n",
1439                                          port->actor_port_number,
1440                                          temp_aggregator->aggregator_identifier);
1441                                /* if the aggregator is empty, clear its
1442                                 * parameters, and set it ready to be attached
1443                                 */
1444                                if (!temp_aggregator->lag_ports)
1445                                        ad_clear_agg(temp_aggregator);
1446                                break;
1447                        }
1448                }
1449                if (!curr_port) {
1450                        /* meaning: the port was related to an aggregator
1451                         * but was not on the aggregator port list
1452                         */
1453                        net_warn_ratelimited("%s: (slave %s): Warning: Port %d was related to aggregator %d but was not on its port list\n",
1454                                             port->slave->bond->dev->name,
1455                                             port->slave->dev->name,
1456                                             port->actor_port_number,
1457                                             port->aggregator->aggregator_identifier);
1458                }
1459        }
1460        /* search on all aggregators for a suitable aggregator for this port */
1461        bond_for_each_slave(bond, slave, iter) {
1462                aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
1463
1464                /* keep a free aggregator for later use(if needed) */
1465                if (!aggregator->lag_ports) {
1466                        if (!free_aggregator)
1467                                free_aggregator = aggregator;
1468                        continue;
1469                }
1470                /* check if current aggregator suits us */
1471                if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters match AND */
1472                     MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) &&
1473                     (aggregator->partner_system_priority == port->partner_oper.system_priority) &&
1474                     (aggregator->partner_oper_aggregator_key == port->partner_oper.key)
1475                    ) &&
1476                    ((!MAC_ADDRESS_EQUAL(&(port->partner_oper.system), &(null_mac_addr)) && /* partner answers */
1477                      !aggregator->is_individual)  /* but is not individual OR */
1478                    )
1479                   ) {
1480                        /* attach to the founded aggregator */
1481                        port->aggregator = aggregator;
1482                        port->actor_port_aggregator_identifier =
1483                                port->aggregator->aggregator_identifier;
1484                        port->next_port_in_aggregator = aggregator->lag_ports;
1485                        port->aggregator->num_of_ports++;
1486                        aggregator->lag_ports = port;
1487                        slave_dbg(bond->dev, slave->dev, "Port %d joined LAG %d (existing LAG)\n",
1488                                  port->actor_port_number,
1489                                  port->aggregator->aggregator_identifier);
1490
1491                        /* mark this port as selected */
1492                        port->sm_vars |= AD_PORT_SELECTED;
1493                        found = 1;
1494                        break;
1495                }
1496        }
1497
1498        /* the port couldn't find an aggregator - attach it to a new
1499         * aggregator
1500         */
1501        if (!found) {
1502                if (free_aggregator) {
1503                        /* assign port a new aggregator */
1504                        port->aggregator = free_aggregator;
1505                        port->actor_port_aggregator_identifier =
1506                                port->aggregator->aggregator_identifier;
1507
1508                        /* update the new aggregator's parameters
1509                         * if port was responsed from the end-user
1510                         */
1511                        if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)
1512                                /* if port is full duplex */
1513                                port->aggregator->is_individual = false;
1514                        else
1515                                port->aggregator->is_individual = true;
1516
1517                        port->aggregator->actor_admin_aggregator_key =
1518                                port->actor_admin_port_key;
1519                        port->aggregator->actor_oper_aggregator_key =
1520                                port->actor_oper_port_key;
1521                        port->aggregator->partner_system =
1522                                port->partner_oper.system;
1523                        port->aggregator->partner_system_priority =
1524                                port->partner_oper.system_priority;
1525                        port->aggregator->partner_oper_aggregator_key = port->partner_oper.key;
1526                        port->aggregator->receive_state = 1;
1527                        port->aggregator->transmit_state = 1;
1528                        port->aggregator->lag_ports = port;
1529                        port->aggregator->num_of_ports++;
1530
1531                        /* mark this port as selected */
1532                        port->sm_vars |= AD_PORT_SELECTED;
1533
1534                        slave_dbg(bond->dev, port->slave->dev, "Port %d joined LAG %d (new LAG)\n",
1535                                  port->actor_port_number,
1536                                  port->aggregator->aggregator_identifier);
1537                } else {
1538                        slave_err(bond->dev, port->slave->dev,
1539                                  "Port %d did not find a suitable aggregator\n",
1540                                  port->actor_port_number);
1541                }
1542        }
1543        /* if all aggregator's ports are READY_N == TRUE, set ready=TRUE
1544         * in all aggregator's ports, else set ready=FALSE in all
1545         * aggregator's ports
1546         */
1547        __set_agg_ports_ready(port->aggregator,
1548                              __agg_ports_are_ready(port->aggregator));
1549
1550        aggregator = __get_first_agg(port);
1551        ad_agg_selection_logic(aggregator, update_slave_arr);
1552
1553        if (!port->aggregator->is_active)
1554                port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
1555}
1556
1557/* Decide if "agg" is a better choice for the new active aggregator that
1558 * the current best, according to the ad_select policy.
1559 */
1560static struct aggregator *ad_agg_selection_test(struct aggregator *best,
1561                                                struct aggregator *curr)
1562{
1563        /* 0. If no best, select current.
1564         *
1565         * 1. If the current agg is not individual, and the best is
1566         *    individual, select current.
1567         *
1568         * 2. If current agg is individual and the best is not, keep best.
1569         *
1570         * 3. Therefore, current and best are both individual or both not
1571         *    individual, so:
1572         *
1573         * 3a. If current agg partner replied, and best agg partner did not,
1574         *     select current.
1575         *
1576         * 3b. If current agg partner did not reply and best agg partner
1577         *     did reply, keep best.
1578         *
1579         * 4.  Therefore, current and best both have partner replies or
1580         *     both do not, so perform selection policy:
1581         *
1582         * BOND_AD_COUNT: Select by count of ports.  If count is equal,
1583         *     select by bandwidth.
1584         *
1585         * BOND_AD_STABLE, BOND_AD_BANDWIDTH: Select by bandwidth.
1586         */
1587        if (!best)
1588                return curr;
1589
1590        if (!curr->is_individual && best->is_individual)
1591                return curr;
1592
1593        if (curr->is_individual && !best->is_individual)
1594                return best;
1595
1596        if (__agg_has_partner(curr) && !__agg_has_partner(best))
1597                return curr;
1598
1599        if (!__agg_has_partner(curr) && __agg_has_partner(best))
1600                return best;
1601
1602        switch (__get_agg_selection_mode(curr->lag_ports)) {
1603        case BOND_AD_COUNT:
1604                if (__agg_active_ports(curr) > __agg_active_ports(best))
1605                        return curr;
1606
1607                if (__agg_active_ports(curr) < __agg_active_ports(best))
1608                        return best;
1609
1610                fallthrough;
1611        case BOND_AD_STABLE:
1612        case BOND_AD_BANDWIDTH:
1613                if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best))
1614                        return curr;
1615
1616                break;
1617
1618        default:
1619                net_warn_ratelimited("%s: (slave %s): Impossible agg select mode %d\n",
1620                                     curr->slave->bond->dev->name,
1621                                     curr->slave->dev->name,
1622                                     __get_agg_selection_mode(curr->lag_ports));
1623                break;
1624        }
1625
1626        return best;
1627}
1628
1629static int agg_device_up(const struct aggregator *agg)
1630{
1631        struct port *port = agg->lag_ports;
1632
1633        if (!port)
1634                return 0;
1635
1636        for (port = agg->lag_ports; port;
1637             port = port->next_port_in_aggregator) {
1638                if (netif_running(port->slave->dev) &&
1639                    netif_carrier_ok(port->slave->dev))
1640                        return 1;
1641        }
1642
1643        return 0;
1644}
1645
1646/**
1647 * ad_agg_selection_logic - select an aggregation group for a team
1648 * @agg: the aggregator we're looking at
1649 * @update_slave_arr: Does slave array need update?
1650 *
1651 * It is assumed that only one aggregator may be selected for a team.
1652 *
1653 * The logic of this function is to select the aggregator according to
1654 * the ad_select policy:
1655 *
1656 * BOND_AD_STABLE: select the aggregator with the most ports attached to
1657 * it, and to reselect the active aggregator only if the previous
1658 * aggregator has no more ports related to it.
1659 *
1660 * BOND_AD_BANDWIDTH: select the aggregator with the highest total
1661 * bandwidth, and reselect whenever a link state change takes place or the
1662 * set of slaves in the bond changes.
1663 *
1664 * BOND_AD_COUNT: select the aggregator with largest number of ports
1665 * (slaves), and reselect whenever a link state change takes place or the
1666 * set of slaves in the bond changes.
1667 *
1668 * FIXME: this function MUST be called with the first agg in the bond, or
1669 * __get_active_agg() won't work correctly. This function should be better
1670 * called with the bond itself, and retrieve the first agg from it.
1671 */
1672static void ad_agg_selection_logic(struct aggregator *agg,
1673                                   bool *update_slave_arr)
1674{
1675        struct aggregator *best, *active, *origin;
1676        struct bonding *bond = agg->slave->bond;
1677        struct list_head *iter;
1678        struct slave *slave;
1679        struct port *port;
1680
1681        rcu_read_lock();
1682        origin = agg;
1683        active = __get_active_agg(agg);
1684        best = (active && agg_device_up(active)) ? active : NULL;
1685
1686        bond_for_each_slave_rcu(bond, slave, iter) {
1687                agg = &(SLAVE_AD_INFO(slave)->aggregator);
1688
1689                agg->is_active = 0;
1690
1691                if (__agg_active_ports(agg) && agg_device_up(agg))
1692                        best = ad_agg_selection_test(best, agg);
1693        }
1694
1695        if (best &&
1696            __get_agg_selection_mode(best->lag_ports) == BOND_AD_STABLE) {
1697                /* For the STABLE policy, don't replace the old active
1698                 * aggregator if it's still active (it has an answering
1699                 * partner) or if both the best and active don't have an
1700                 * answering partner.
1701                 */
1702                if (active && active->lag_ports &&
1703                    __agg_active_ports(active) &&
1704                    (__agg_has_partner(active) ||
1705                     (!__agg_has_partner(active) &&
1706                     !__agg_has_partner(best)))) {
1707                        if (!(!active->actor_oper_aggregator_key &&
1708                              best->actor_oper_aggregator_key)) {
1709                                best = NULL;
1710                                active->is_active = 1;
1711                        }
1712                }
1713        }
1714
1715        if (best && (best == active)) {
1716                best = NULL;
1717                active->is_active = 1;
1718        }
1719
1720        /* if there is new best aggregator, activate it */
1721        if (best) {
1722                netdev_dbg(bond->dev, "(slave %s): best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1723                           best->slave ? best->slave->dev->name : "NULL",
1724                           best->aggregator_identifier, best->num_of_ports,
1725                           best->actor_oper_aggregator_key,
1726                           best->partner_oper_aggregator_key,
1727                           best->is_individual, best->is_active);
1728                netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n",
1729                           best->slave ? best->slave->dev->name : "NULL",
1730                           best->lag_ports, best->slave);
1731
1732                bond_for_each_slave_rcu(bond, slave, iter) {
1733                        agg = &(SLAVE_AD_INFO(slave)->aggregator);
1734
1735                        slave_dbg(bond->dev, slave->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1736                                  agg->aggregator_identifier, agg->num_of_ports,
1737                                  agg->actor_oper_aggregator_key,
1738                                  agg->partner_oper_aggregator_key,
1739                                  agg->is_individual, agg->is_active);
1740                }
1741
1742                /* check if any partner replies */
1743                if (best->is_individual)
1744                        net_warn_ratelimited("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n",
1745                                             bond->dev->name);
1746
1747                best->is_active = 1;
1748                netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n",
1749                           best->slave ? best->slave->dev->name : "NULL",
1750                           best->aggregator_identifier);
1751                netdev_dbg(bond->dev, "(slave %s): Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1752                           best->slave ? best->slave->dev->name : "NULL",
1753                           best->aggregator_identifier, best->num_of_ports,
1754                           best->actor_oper_aggregator_key,
1755                           best->partner_oper_aggregator_key,
1756                           best->is_individual, best->is_active);
1757
1758                /* disable the ports that were related to the former
1759                 * active_aggregator
1760                 */
1761                if (active) {
1762                        for (port = active->lag_ports; port;
1763                             port = port->next_port_in_aggregator) {
1764                                __disable_port(port);
1765                        }
1766                }
1767                /* Slave array needs update. */
1768                *update_slave_arr = true;
1769        }
1770
1771        /* if the selected aggregator is of join individuals
1772         * (partner_system is NULL), enable their ports
1773         */
1774        active = __get_active_agg(origin);
1775
1776        if (active) {
1777                if (!__agg_has_partner(active)) {
1778                        for (port = active->lag_ports; port;
1779                             port = port->next_port_in_aggregator) {
1780                                __enable_port(port);
1781                        }
1782                }
1783        }
1784
1785        rcu_read_unlock();
1786
1787        bond_3ad_set_carrier(bond);
1788}
1789
1790/**
1791 * ad_clear_agg - clear a given aggregator's parameters
1792 * @aggregator: the aggregator we're looking at
1793 */
1794static void ad_clear_agg(struct aggregator *aggregator)
1795{
1796        if (aggregator) {
1797                aggregator->is_individual = false;
1798                aggregator->actor_admin_aggregator_key = 0;
1799                aggregator->actor_oper_aggregator_key = 0;
1800                eth_zero_addr(aggregator->partner_system.mac_addr_value);
1801                aggregator->partner_system_priority = 0;
1802                aggregator->partner_oper_aggregator_key = 0;
1803                aggregator->receive_state = 0;
1804                aggregator->transmit_state = 0;
1805                aggregator->lag_ports = NULL;
1806                aggregator->is_active = 0;
1807                aggregator->num_of_ports = 0;
1808                pr_debug("%s: LAG %d was cleared\n",
1809                         aggregator->slave ?
1810                         aggregator->slave->dev->name : "NULL",
1811                         aggregator->aggregator_identifier);
1812        }
1813}
1814
1815/**
1816 * ad_initialize_agg - initialize a given aggregator's parameters
1817 * @aggregator: the aggregator we're looking at
1818 */
1819static void ad_initialize_agg(struct aggregator *aggregator)
1820{
1821        if (aggregator) {
1822                ad_clear_agg(aggregator);
1823
1824                eth_zero_addr(aggregator->aggregator_mac_address.mac_addr_value);
1825                aggregator->aggregator_identifier = 0;
1826                aggregator->slave = NULL;
1827        }
1828}
1829
1830/**
1831 * ad_initialize_port - initialize a given port's parameters
1832 * @port: the port we're looking at
1833 * @lacp_fast: boolean. whether fast periodic should be used
1834 */
1835static void ad_initialize_port(struct port *port, int lacp_fast)
1836{
1837        static const struct port_params tmpl = {
1838                .system_priority = 0xffff,
1839                .key             = 1,
1840                .port_number     = 1,
1841                .port_priority   = 0xff,
1842                .port_state      = 1,
1843        };
1844        static const struct lacpdu lacpdu = {
1845                .subtype                = 0x01,
1846                .version_number = 0x01,
1847                .tlv_type_actor_info = 0x01,
1848                .actor_information_length = 0x14,
1849                .tlv_type_partner_info = 0x02,
1850                .partner_information_length = 0x14,
1851                .tlv_type_collector_info = 0x03,
1852                .collector_information_length = 0x10,
1853                .collector_max_delay = htons(AD_COLLECTOR_MAX_DELAY),
1854        };
1855
1856        if (port) {
1857                port->actor_port_priority = 0xff;
1858                port->actor_port_aggregator_identifier = 0;
1859                port->ntt = false;
1860                port->actor_admin_port_state = LACP_STATE_AGGREGATION |
1861                                               LACP_STATE_LACP_ACTIVITY;
1862                port->actor_oper_port_state  = LACP_STATE_AGGREGATION |
1863                                               LACP_STATE_LACP_ACTIVITY;
1864
1865                if (lacp_fast)
1866                        port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
1867
1868                memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
1869                memcpy(&port->partner_oper, &tmpl, sizeof(tmpl));
1870
1871                port->is_enabled = true;
1872                /* private parameters */
1873                port->sm_vars = AD_PORT_BEGIN | AD_PORT_LACP_ENABLED;
1874                port->sm_rx_state = 0;
1875                port->sm_rx_timer_counter = 0;
1876                port->sm_periodic_state = 0;
1877                port->sm_periodic_timer_counter = 0;
1878                port->sm_mux_state = 0;
1879                port->sm_mux_timer_counter = 0;
1880                port->sm_tx_state = 0;
1881                port->aggregator = NULL;
1882                port->next_port_in_aggregator = NULL;
1883                port->transaction_id = 0;
1884
1885                port->sm_churn_actor_timer_counter = 0;
1886                port->sm_churn_actor_state = 0;
1887                port->churn_actor_count = 0;
1888                port->sm_churn_partner_timer_counter = 0;
1889                port->sm_churn_partner_state = 0;
1890                port->churn_partner_count = 0;
1891
1892                memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu));
1893        }
1894}
1895
1896/**
1897 * ad_enable_collecting_distributing - enable a port's transmit/receive
1898 * @port: the port we're looking at
1899 * @update_slave_arr: Does slave array need update?
1900 *
1901 * Enable @port if it's in an active aggregator
1902 */
1903static void ad_enable_collecting_distributing(struct port *port,
1904                                              bool *update_slave_arr)
1905{
1906        if (port->aggregator->is_active) {
1907                slave_dbg(port->slave->bond->dev, port->slave->dev,
1908                          "Enabling port %d (LAG %d)\n",
1909                          port->actor_port_number,
1910                          port->aggregator->aggregator_identifier);
1911                __enable_port(port);
1912                /* Slave array needs update */
1913                *update_slave_arr = true;
1914        }
1915}
1916
1917/**
1918 * ad_disable_collecting_distributing - disable a port's transmit/receive
1919 * @port: the port we're looking at
1920 * @update_slave_arr: Does slave array need update?
1921 */
1922static void ad_disable_collecting_distributing(struct port *port,
1923                                               bool *update_slave_arr)
1924{
1925        if (port->aggregator &&
1926            !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system),
1927                               &(null_mac_addr))) {
1928                slave_dbg(port->slave->bond->dev, port->slave->dev,
1929                          "Disabling port %d (LAG %d)\n",
1930                          port->actor_port_number,
1931                          port->aggregator->aggregator_identifier);
1932                __disable_port(port);
1933                /* Slave array needs an update */
1934                *update_slave_arr = true;
1935        }
1936}
1937
1938/**
1939 * ad_marker_info_received - handle receive of a Marker information frame
1940 * @marker_info: Marker info received
1941 * @port: the port we're looking at
1942 */
1943static void ad_marker_info_received(struct bond_marker *marker_info,
1944                                    struct port *port)
1945{
1946        struct bond_marker marker;
1947
1948        atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx);
1949        atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx);
1950
1951        /* copy the received marker data to the response marker */
1952        memcpy(&marker, marker_info, sizeof(struct bond_marker));
1953        /* change the marker subtype to marker response */
1954        marker.tlv_type = AD_MARKER_RESPONSE_SUBTYPE;
1955
1956        /* send the marker response */
1957        if (ad_marker_send(port, &marker) >= 0)
1958                slave_dbg(port->slave->bond->dev, port->slave->dev,
1959                          "Sent Marker Response on port %d\n",
1960                          port->actor_port_number);
1961}
1962
1963/**
1964 * ad_marker_response_received - handle receive of a marker response frame
1965 * @marker: marker PDU received
1966 * @port: the port we're looking at
1967 *
1968 * This function does nothing since we decided not to implement send and handle
1969 * response for marker PDU's, in this stage, but only to respond to marker
1970 * information.
1971 */
1972static void ad_marker_response_received(struct bond_marker *marker,
1973                                        struct port *port)
1974{
1975        atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx);
1976        atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx);
1977
1978        /* DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW */
1979}
1980
1981/* ========= AD exported functions to the main bonding code ========= */
1982
1983/* Check aggregators status in team every T seconds */
1984#define AD_AGGREGATOR_SELECTION_TIMER  8
1985
1986/**
1987 * bond_3ad_initiate_agg_selection - initate aggregator selection
1988 * @bond: bonding struct
1989 * @timeout: timeout value to set
1990 *
1991 * Set the aggregation selection timer, to initiate an agg selection in
1992 * the very near future.  Called during first initialization, and during
1993 * any down to up transitions of the bond.
1994 */
1995void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)
1996{
1997        BOND_AD_INFO(bond).agg_select_timer = timeout;
1998}
1999
2000/**
2001 * bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
2002 * @bond: bonding struct to work on
2003 * @tick_resolution: tick duration (millisecond resolution)
2004 *
2005 * Can be called only after the mac address of the bond is set.
2006 */
2007void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution)
2008{
2009        /* check that the bond is not initialized yet */
2010        if (!MAC_ADDRESS_EQUAL(&(BOND_AD_INFO(bond).system.sys_mac_addr),
2011                                bond->dev->dev_addr)) {
2012
2013                BOND_AD_INFO(bond).aggregator_identifier = 0;
2014
2015                BOND_AD_INFO(bond).system.sys_priority =
2016                        bond->params.ad_actor_sys_prio;
2017                if (is_zero_ether_addr(bond->params.ad_actor_system))
2018                        BOND_AD_INFO(bond).system.sys_mac_addr =
2019                            *((struct mac_addr *)bond->dev->dev_addr);
2020                else
2021                        BOND_AD_INFO(bond).system.sys_mac_addr =
2022                            *((struct mac_addr *)bond->params.ad_actor_system);
2023
2024                /* initialize how many times this module is called in one
2025                 * second (should be about every 100ms)
2026                 */
2027                ad_ticks_per_sec = tick_resolution;
2028
2029                bond_3ad_initiate_agg_selection(bond,
2030                                                AD_AGGREGATOR_SELECTION_TIMER *
2031                                                ad_ticks_per_sec);
2032        }
2033}
2034
2035/**
2036 * bond_3ad_bind_slave - initialize a slave's port
2037 * @slave: slave struct to work on
2038 *
2039 * Returns:   0 on success
2040 *          < 0 on error
2041 */
2042void bond_3ad_bind_slave(struct slave *slave)
2043{
2044        struct bonding *bond = bond_get_bond_by_slave(slave);
2045        struct port *port;
2046        struct aggregator *aggregator;
2047
2048        /* check that the slave has not been initialized yet. */
2049        if (SLAVE_AD_INFO(slave)->port.slave != slave) {
2050
2051                /* port initialization */
2052                port = &(SLAVE_AD_INFO(slave)->port);
2053
2054                ad_initialize_port(port, bond->params.lacp_fast);
2055
2056                port->slave = slave;
2057                port->actor_port_number = SLAVE_AD_INFO(slave)->id;
2058                /* key is determined according to the link speed, duplex and
2059                 * user key
2060                 */
2061                port->actor_admin_port_key = bond->params.ad_user_port_key << 6;
2062                ad_update_actor_keys(port, false);
2063                /* actor system is the bond's system */
2064                __ad_actor_update_port(port);
2065                /* tx timer(to verify that no more than MAX_TX_IN_SECOND
2066                 * lacpdu's are sent in one second)
2067                 */
2068                port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND;
2069
2070                __disable_port(port);
2071
2072                /* aggregator initialization */
2073                aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
2074
2075                ad_initialize_agg(aggregator);
2076
2077                aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr);
2078                aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier;
2079                aggregator->slave = slave;
2080                aggregator->is_active = 0;
2081                aggregator->num_of_ports = 0;
2082        }
2083}
2084
2085/**
2086 * bond_3ad_unbind_slave - deinitialize a slave's port
2087 * @slave: slave struct to work on
2088 *
2089 * Search for the aggregator that is related to this port, remove the
2090 * aggregator and assign another aggregator for other port related to it
2091 * (if any), and remove the port.
2092 */
2093void bond_3ad_unbind_slave(struct slave *slave)
2094{
2095        struct port *port, *prev_port, *temp_port;
2096        struct aggregator *aggregator, *new_aggregator, *temp_aggregator;
2097        int select_new_active_agg = 0;
2098        struct bonding *bond = slave->bond;
2099        struct slave *slave_iter;
2100        struct list_head *iter;
2101        bool dummy_slave_update; /* Ignore this value as caller updates array */
2102
2103        /* Sync against bond_3ad_state_machine_handler() */
2104        spin_lock_bh(&bond->mode_lock);
2105        aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
2106        port = &(SLAVE_AD_INFO(slave)->port);
2107
2108        /* if slave is null, the whole port is not initialized */
2109        if (!port->slave) {
2110                slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n");
2111                goto out;
2112        }
2113
2114        slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n",
2115                  aggregator->aggregator_identifier);
2116
2117        /* Tell the partner that this port is not suitable for aggregation */
2118        port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
2119        port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
2120        port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
2121        port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION;
2122        __update_lacpdu_from_port(port);
2123        ad_lacpdu_send(port);
2124
2125        /* check if this aggregator is occupied */
2126        if (aggregator->lag_ports) {
2127                /* check if there are other ports related to this aggregator
2128                 * except the port related to this slave(thats ensure us that
2129                 * there is a reason to search for new aggregator, and that we
2130                 * will find one
2131                 */
2132                if ((aggregator->lag_ports != port) ||
2133                    (aggregator->lag_ports->next_port_in_aggregator)) {
2134                        /* find new aggregator for the related port(s) */
2135                        bond_for_each_slave(bond, slave_iter, iter) {
2136                                new_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator);
2137                                /* if the new aggregator is empty, or it is
2138                                 * connected to our port only
2139                                 */
2140                                if (!new_aggregator->lag_ports ||
2141                                    ((new_aggregator->lag_ports == port) &&
2142                                     !new_aggregator->lag_ports->next_port_in_aggregator))
2143                                        break;
2144                        }
2145                        if (!slave_iter)
2146                                new_aggregator = NULL;
2147
2148                        /* if new aggregator found, copy the aggregator's
2149                         * parameters and connect the related lag_ports to the
2150                         * new aggregator
2151                         */
2152                        if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator))) {
2153                                slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n",
2154                                          aggregator->aggregator_identifier,
2155                                          new_aggregator->aggregator_identifier);
2156
2157                                if ((new_aggregator->lag_ports == port) &&
2158                                    new_aggregator->is_active) {
2159                                        slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2160                                        select_new_active_agg = 1;
2161                                }
2162
2163                                new_aggregator->is_individual = aggregator->is_individual;
2164                                new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key;
2165                                new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key;
2166                                new_aggregator->partner_system = aggregator->partner_system;
2167                                new_aggregator->partner_system_priority = aggregator->partner_system_priority;
2168                                new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key;
2169                                new_aggregator->receive_state = aggregator->receive_state;
2170                                new_aggregator->transmit_state = aggregator->transmit_state;
2171                                new_aggregator->lag_ports = aggregator->lag_ports;
2172                                new_aggregator->is_active = aggregator->is_active;
2173                                new_aggregator->num_of_ports = aggregator->num_of_ports;
2174
2175                                /* update the information that is written on
2176                                 * the ports about the aggregator
2177                                 */
2178                                for (temp_port = aggregator->lag_ports; temp_port;
2179                                     temp_port = temp_port->next_port_in_aggregator) {
2180                                        temp_port->aggregator = new_aggregator;
2181                                        temp_port->actor_port_aggregator_identifier = new_aggregator->aggregator_identifier;
2182                                }
2183
2184                                ad_clear_agg(aggregator);
2185
2186                                if (select_new_active_agg)
2187                                        ad_agg_selection_logic(__get_first_agg(port),
2188                                                               &dummy_slave_update);
2189                        } else {
2190                                slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for its ports\n");
2191                        }
2192                } else {
2193                        /* in case that the only port related to this
2194                         * aggregator is the one we want to remove
2195                         */
2196                        select_new_active_agg = aggregator->is_active;
2197                        ad_clear_agg(aggregator);
2198                        if (select_new_active_agg) {
2199                                slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2200                                /* select new active aggregator */
2201                                temp_aggregator = __get_first_agg(port);
2202                                if (temp_aggregator)
2203                                        ad_agg_selection_logic(temp_aggregator,
2204                                                               &dummy_slave_update);
2205                        }
2206                }
2207        }
2208
2209        slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number);
2210
2211        /* find the aggregator that this port is connected to */
2212        bond_for_each_slave(bond, slave_iter, iter) {
2213                temp_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator);
2214                prev_port = NULL;
2215                /* search the port in the aggregator's related ports */
2216                for (temp_port = temp_aggregator->lag_ports; temp_port;
2217                     prev_port = temp_port,
2218                     temp_port = temp_port->next_port_in_aggregator) {
2219                        if (temp_port == port) {
2220                                /* the aggregator found - detach the port from
2221                                 * this aggregator
2222                                 */
2223                                if (prev_port)
2224                                        prev_port->next_port_in_aggregator = temp_port->next_port_in_aggregator;
2225                                else
2226                                        temp_aggregator->lag_ports = temp_port->next_port_in_aggregator;
2227                                temp_aggregator->num_of_ports--;
2228                                if (__agg_active_ports(temp_aggregator) == 0) {
2229                                        select_new_active_agg = temp_aggregator->is_active;
2230                                        ad_clear_agg(temp_aggregator);
2231                                        if (select_new_active_agg) {
2232                                                slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2233                                                /* select new active aggregator */
2234                                                ad_agg_selection_logic(__get_first_agg(port),
2235                                                                       &dummy_slave_update);
2236                                        }
2237                                }
2238                                break;
2239                        }
2240                }
2241        }
2242        port->slave = NULL;
2243
2244out:
2245        spin_unlock_bh(&bond->mode_lock);
2246}
2247
2248/**
2249 * bond_3ad_update_ad_actor_settings - reflect change of actor settings to ports
2250 * @bond: bonding struct to work on
2251 *
2252 * If an ad_actor setting gets changed we need to update the individual port
2253 * settings so the bond device will use the new values when it gets upped.
2254 */
2255void bond_3ad_update_ad_actor_settings(struct bonding *bond)
2256{
2257        struct list_head *iter;
2258        struct slave *slave;
2259
2260        ASSERT_RTNL();
2261
2262        BOND_AD_INFO(bond).system.sys_priority = bond->params.ad_actor_sys_prio;
2263        if (is_zero_ether_addr(bond->params.ad_actor_system))
2264                BOND_AD_INFO(bond).system.sys_mac_addr =
2265                    *((struct mac_addr *)bond->dev->dev_addr);
2266        else
2267                BOND_AD_INFO(bond).system.sys_mac_addr =
2268                    *((struct mac_addr *)bond->params.ad_actor_system);
2269
2270        spin_lock_bh(&bond->mode_lock);
2271        bond_for_each_slave(bond, slave, iter) {
2272                struct port *port = &(SLAVE_AD_INFO(slave))->port;
2273
2274                __ad_actor_update_port(port);
2275                port->ntt = true;
2276        }
2277        spin_unlock_bh(&bond->mode_lock);
2278}
2279
2280/**
2281 * bond_3ad_state_machine_handler - handle state machines timeout
2282 * @work: work context to fetch bonding struct to work on from
2283 *
2284 * The state machine handling concept in this module is to check every tick
2285 * which state machine should operate any function. The execution order is
2286 * round robin, so when we have an interaction between state machines, the
2287 * reply of one to each other might be delayed until next tick.
2288 *
2289 * This function also complete the initialization when the agg_select_timer
2290 * times out, and it selects an aggregator for the ports that are yet not
2291 * related to any aggregator, and selects the active aggregator for a bond.
2292 */
2293void bond_3ad_state_machine_handler(struct work_struct *work)
2294{
2295        struct bonding *bond = container_of(work, struct bonding,
2296                                            ad_work.work);
2297        struct aggregator *aggregator;
2298        struct list_head *iter;
2299        struct slave *slave;
2300        struct port *port;
2301        bool should_notify_rtnl = BOND_SLAVE_NOTIFY_LATER;
2302        bool update_slave_arr = false;
2303
2304        /* Lock to protect data accessed by all (e.g., port->sm_vars) and
2305         * against running with bond_3ad_unbind_slave. ad_rx_machine may run
2306         * concurrently due to incoming LACPDU as well.
2307         */
2308        spin_lock_bh(&bond->mode_lock);
2309        rcu_read_lock();
2310
2311        /* check if there are any slaves */
2312        if (!bond_has_slaves(bond))
2313                goto re_arm;
2314
2315        /* check if agg_select_timer timer after initialize is timed out */
2316        if (BOND_AD_INFO(bond).agg_select_timer &&
2317            !(--BOND_AD_INFO(bond).agg_select_timer)) {
2318                slave = bond_first_slave_rcu(bond);
2319                port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL;
2320
2321                /* select the active aggregator for the bond */
2322                if (port) {
2323                        if (!port->slave) {
2324                                net_warn_ratelimited("%s: Warning: bond's first port is uninitialized\n",
2325                                                     bond->dev->name);
2326                                goto re_arm;
2327                        }
2328
2329                        aggregator = __get_first_agg(port);
2330                        ad_agg_selection_logic(aggregator, &update_slave_arr);
2331                }
2332                bond_3ad_set_carrier(bond);
2333        }
2334
2335        /* for each port run the state machines */
2336        bond_for_each_slave_rcu(bond, slave, iter) {
2337                port = &(SLAVE_AD_INFO(slave)->port);
2338                if (!port->slave) {
2339                        net_warn_ratelimited("%s: Warning: Found an uninitialized port\n",
2340                                            bond->dev->name);
2341                        goto re_arm;
2342                }
2343
2344                ad_rx_machine(NULL, port);
2345                ad_periodic_machine(port, &bond->params);
2346                ad_port_selection_logic(port, &update_slave_arr);
2347                ad_mux_machine(port, &update_slave_arr);
2348                ad_tx_machine(port);
2349                ad_churn_machine(port);
2350
2351                /* turn off the BEGIN bit, since we already handled it */
2352                if (port->sm_vars & AD_PORT_BEGIN)
2353                        port->sm_vars &= ~AD_PORT_BEGIN;
2354        }
2355
2356re_arm:
2357        bond_for_each_slave_rcu(bond, slave, iter) {
2358                if (slave->should_notify) {
2359                        should_notify_rtnl = BOND_SLAVE_NOTIFY_NOW;
2360                        break;
2361                }
2362        }
2363        rcu_read_unlock();
2364        spin_unlock_bh(&bond->mode_lock);
2365
2366        if (update_slave_arr)
2367                bond_slave_arr_work_rearm(bond, 0);
2368
2369        if (should_notify_rtnl && rtnl_trylock()) {
2370                bond_slave_state_notify(bond);
2371                rtnl_unlock();
2372        }
2373        queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);
2374}
2375
2376/**
2377 * bond_3ad_rx_indication - handle a received frame
2378 * @lacpdu: received lacpdu
2379 * @slave: slave struct to work on
2380 *
2381 * It is assumed that frames that were sent on this NIC don't returned as new
2382 * received frames (loopback). Since only the payload is given to this
2383 * function, it check for loopback.
2384 */
2385static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave)
2386{
2387        struct bonding *bond = slave->bond;
2388        int ret = RX_HANDLER_ANOTHER;
2389        struct bond_marker *marker;
2390        struct port *port;
2391        atomic64_t *stat;
2392
2393        port = &(SLAVE_AD_INFO(slave)->port);
2394        if (!port->slave) {
2395                net_warn_ratelimited("%s: Warning: port of slave %s is uninitialized\n",
2396                                     slave->dev->name, slave->bond->dev->name);
2397                return ret;
2398        }
2399
2400        switch (lacpdu->subtype) {
2401        case AD_TYPE_LACPDU:
2402                ret = RX_HANDLER_CONSUMED;
2403                slave_dbg(slave->bond->dev, slave->dev,
2404                          "Received LACPDU on port %d\n",
2405                          port->actor_port_number);
2406                /* Protect against concurrent state machines */
2407                spin_lock(&slave->bond->mode_lock);
2408                ad_rx_machine(lacpdu, port);
2409                spin_unlock(&slave->bond->mode_lock);
2410                break;
2411        case AD_TYPE_MARKER:
2412                ret = RX_HANDLER_CONSUMED;
2413                /* No need to convert fields to Little Endian since we
2414                 * don't use the marker's fields.
2415                 */
2416                marker = (struct bond_marker *)lacpdu;
2417                switch (marker->tlv_type) {
2418                case AD_MARKER_INFORMATION_SUBTYPE:
2419                        slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n",
2420                                  port->actor_port_number);
2421                        ad_marker_info_received(marker, port);
2422                        break;
2423                case AD_MARKER_RESPONSE_SUBTYPE:
2424                        slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n",
2425                                  port->actor_port_number);
2426                        ad_marker_response_received(marker, port);
2427                        break;
2428                default:
2429                        slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n",
2430                                  port->actor_port_number);
2431                        stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx;
2432                        atomic64_inc(stat);
2433                        stat = &BOND_AD_INFO(bond).stats.marker_unknown_rx;
2434                        atomic64_inc(stat);
2435                }
2436                break;
2437        default:
2438                atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx);
2439                atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_unknown_rx);
2440        }
2441
2442        return ret;
2443}
2444
2445/**
2446 * ad_update_actor_keys - Update the oper / admin keys for a port based on
2447 * its current speed and duplex settings.
2448 *
2449 * @port: the port we'are looking at
2450 * @reset: Boolean to just reset the speed and the duplex part of the key
2451 *
2452 * The logic to change the oper / admin keys is:
2453 * (a) A full duplex port can participate in LACP with partner.
2454 * (b) When the speed is changed, LACP need to be reinitiated.
2455 */
2456static void ad_update_actor_keys(struct port *port, bool reset)
2457{
2458        u8 duplex = 0;
2459        u16 ospeed = 0, speed = 0;
2460        u16 old_oper_key = port->actor_oper_port_key;
2461
2462        port->actor_admin_port_key &= ~(AD_SPEED_KEY_MASKS|AD_DUPLEX_KEY_MASKS);
2463        if (!reset) {
2464                speed = __get_link_speed(port);
2465                ospeed = (old_oper_key & AD_SPEED_KEY_MASKS) >> 1;
2466                duplex = __get_duplex(port);
2467                port->actor_admin_port_key |= (speed << 1) | duplex;
2468        }
2469        port->actor_oper_port_key = port->actor_admin_port_key;
2470
2471        if (old_oper_key != port->actor_oper_port_key) {
2472                /* Only 'duplex' port participates in LACP */
2473                if (duplex)
2474                        port->sm_vars |= AD_PORT_LACP_ENABLED;
2475                else
2476                        port->sm_vars &= ~AD_PORT_LACP_ENABLED;
2477
2478                if (!reset) {
2479                        if (!speed) {
2480                                slave_err(port->slave->bond->dev,
2481                                          port->slave->dev,
2482                                          "speed changed to 0 on port %d\n",
2483                                          port->actor_port_number);
2484                        } else if (duplex && ospeed != speed) {
2485                                /* Speed change restarts LACP state-machine */
2486                                port->sm_vars |= AD_PORT_BEGIN;
2487                        }
2488                }
2489        }
2490}
2491
2492/**
2493 * bond_3ad_adapter_speed_duplex_changed - handle a slave's speed / duplex
2494 * change indication
2495 *
2496 * @slave: slave struct to work on
2497 *
2498 * Handle reselection of aggregator (if needed) for this port.
2499 */
2500void bond_3ad_adapter_speed_duplex_changed(struct slave *slave)
2501{
2502        struct port *port;
2503
2504        port = &(SLAVE_AD_INFO(slave)->port);
2505
2506        /* if slave is null, the whole port is not initialized */
2507        if (!port->slave) {
2508                slave_warn(slave->bond->dev, slave->dev,
2509                           "speed/duplex changed for uninitialized port\n");
2510                return;
2511        }
2512
2513        spin_lock_bh(&slave->bond->mode_lock);
2514        ad_update_actor_keys(port, false);
2515        spin_unlock_bh(&slave->bond->mode_lock);
2516        slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n",
2517                  port->actor_port_number);
2518}
2519
2520/**
2521 * bond_3ad_handle_link_change - handle a slave's link status change indication
2522 * @slave: slave struct to work on
2523 * @link: whether the link is now up or down
2524 *
2525 * Handle reselection of aggregator (if needed) for this port.
2526 */
2527void bond_3ad_handle_link_change(struct slave *slave, char link)
2528{
2529        struct aggregator *agg;
2530        struct port *port;
2531        bool dummy;
2532
2533        port = &(SLAVE_AD_INFO(slave)->port);
2534
2535        /* if slave is null, the whole port is not initialized */
2536        if (!port->slave) {
2537                slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n");
2538                return;
2539        }
2540
2541        spin_lock_bh(&slave->bond->mode_lock);
2542        /* on link down we are zeroing duplex and speed since
2543         * some of the adaptors(ce1000.lan) report full duplex/speed
2544         * instead of N/A(duplex) / 0(speed).
2545         *
2546         * on link up we are forcing recheck on the duplex and speed since
2547         * some of he adaptors(ce1000.lan) report.
2548         */
2549        if (link == BOND_LINK_UP) {
2550                port->is_enabled = true;
2551                ad_update_actor_keys(port, false);
2552        } else {
2553                /* link has failed */
2554                port->is_enabled = false;
2555                ad_update_actor_keys(port, true);
2556        }
2557        agg = __get_first_agg(port);
2558        ad_agg_selection_logic(agg, &dummy);
2559
2560        spin_unlock_bh(&slave->bond->mode_lock);
2561
2562        slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n",
2563                  port->actor_port_number,
2564                  link == BOND_LINK_UP ? "UP" : "DOWN");
2565
2566        /* RTNL is held and mode_lock is released so it's safe
2567         * to update slave_array here.
2568         */
2569        bond_update_slave_arr(slave->bond, NULL);
2570}
2571
2572/**
2573 * bond_3ad_set_carrier - set link state for bonding master
2574 * @bond: bonding structure
2575 *
2576 * if we have an active aggregator, we're up, if not, we're down.
2577 * Presumes that we cannot have an active aggregator if there are
2578 * no slaves with link up.
2579 *
2580 * This behavior complies with IEEE 802.3 section 43.3.9.
2581 *
2582 * Called by bond_set_carrier(). Return zero if carrier state does not
2583 * change, nonzero if it does.
2584 */
2585int bond_3ad_set_carrier(struct bonding *bond)
2586{
2587        struct aggregator *active;
2588        struct slave *first_slave;
2589        int ret = 1;
2590
2591        rcu_read_lock();
2592        first_slave = bond_first_slave_rcu(bond);
2593        if (!first_slave) {
2594                ret = 0;
2595                goto out;
2596        }
2597        active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator));
2598        if (active) {
2599                /* are enough slaves available to consider link up? */
2600                if (__agg_active_ports(active) < bond->params.min_links) {
2601                        if (netif_carrier_ok(bond->dev)) {
2602                                netif_carrier_off(bond->dev);
2603                                goto out;
2604                        }
2605                } else if (!netif_carrier_ok(bond->dev)) {
2606                        netif_carrier_on(bond->dev);
2607                        goto out;
2608                }
2609        } else if (netif_carrier_ok(bond->dev)) {
2610                netif_carrier_off(bond->dev);
2611        }
2612out:
2613        rcu_read_unlock();
2614        return ret;
2615}
2616
2617/**
2618 * __bond_3ad_get_active_agg_info - get information of the active aggregator
2619 * @bond: bonding struct to work on
2620 * @ad_info: ad_info struct to fill with the bond's info
2621 *
2622 * Returns:   0 on success
2623 *          < 0 on error
2624 */
2625int __bond_3ad_get_active_agg_info(struct bonding *bond,
2626                                   struct ad_info *ad_info)
2627{
2628        struct aggregator *aggregator = NULL;
2629        struct list_head *iter;
2630        struct slave *slave;
2631        struct port *port;
2632
2633        bond_for_each_slave_rcu(bond, slave, iter) {
2634                port = &(SLAVE_AD_INFO(slave)->port);
2635                if (port->aggregator && port->aggregator->is_active) {
2636                        aggregator = port->aggregator;
2637                        break;
2638                }
2639        }
2640
2641        if (!aggregator)
2642                return -1;
2643
2644        ad_info->aggregator_id = aggregator->aggregator_identifier;
2645        ad_info->ports = __agg_active_ports(aggregator);
2646        ad_info->actor_key = aggregator->actor_oper_aggregator_key;
2647        ad_info->partner_key = aggregator->partner_oper_aggregator_key;
2648        ether_addr_copy(ad_info->partner_system,
2649                        aggregator->partner_system.mac_addr_value);
2650        return 0;
2651}
2652
2653int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info)
2654{
2655        int ret;
2656
2657        rcu_read_lock();
2658        ret = __bond_3ad_get_active_agg_info(bond, ad_info);
2659        rcu_read_unlock();
2660
2661        return ret;
2662}
2663
2664int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
2665                         struct slave *slave)
2666{
2667        struct lacpdu *lacpdu, _lacpdu;
2668
2669        if (skb->protocol != PKT_TYPE_LACPDU)
2670                return RX_HANDLER_ANOTHER;
2671
2672        if (!MAC_ADDRESS_EQUAL(eth_hdr(skb)->h_dest, lacpdu_mcast_addr))
2673                return RX_HANDLER_ANOTHER;
2674
2675        lacpdu = skb_header_pointer(skb, 0, sizeof(_lacpdu), &_lacpdu);
2676        if (!lacpdu) {
2677                atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx);
2678                atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_illegal_rx);
2679                return RX_HANDLER_ANOTHER;
2680        }
2681
2682        return bond_3ad_rx_indication(lacpdu, slave);
2683}
2684
2685/**
2686 * bond_3ad_update_lacp_rate - change the lacp rate
2687 * @bond: bonding struct
2688 *
2689 * When modify lacp_rate parameter via sysfs,
2690 * update actor_oper_port_state of each port.
2691 *
2692 * Hold bond->mode_lock,
2693 * so we can modify port->actor_oper_port_state,
2694 * no matter bond is up or down.
2695 */
2696void bond_3ad_update_lacp_rate(struct bonding *bond)
2697{
2698        struct port *port = NULL;
2699        struct list_head *iter;
2700        struct slave *slave;
2701        int lacp_fast;
2702
2703        lacp_fast = bond->params.lacp_fast;
2704        spin_lock_bh(&bond->mode_lock);
2705        bond_for_each_slave(bond, slave, iter) {
2706                port = &(SLAVE_AD_INFO(slave)->port);
2707                if (lacp_fast)
2708                        port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
2709                else
2710                        port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT;
2711        }
2712        spin_unlock_bh(&bond->mode_lock);
2713}
2714
2715size_t bond_3ad_stats_size(void)
2716{
2717        return nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_RX */
2718               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_TX */
2719               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_UNKNOWN_RX */
2720               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_ILLEGAL_RX */
2721               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RX */
2722               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_TX */
2723               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_RX */
2724               nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_TX */
2725               nla_total_size_64bit(sizeof(u64)); /* BOND_3AD_STAT_MARKER_UNKNOWN_RX */
2726}
2727
2728int bond_3ad_stats_fill(struct sk_buff *skb, struct bond_3ad_stats *stats)
2729{
2730        u64 val;
2731
2732        val = atomic64_read(&stats->lacpdu_rx);
2733        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_RX, val,
2734                              BOND_3AD_STAT_PAD))
2735                return -EMSGSIZE;
2736        val = atomic64_read(&stats->lacpdu_tx);
2737        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_TX, val,
2738                              BOND_3AD_STAT_PAD))
2739                return -EMSGSIZE;
2740        val = atomic64_read(&stats->lacpdu_unknown_rx);
2741        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_UNKNOWN_RX, val,
2742                              BOND_3AD_STAT_PAD))
2743                return -EMSGSIZE;
2744        val = atomic64_read(&stats->lacpdu_illegal_rx);
2745        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_ILLEGAL_RX, val,
2746                              BOND_3AD_STAT_PAD))
2747                return -EMSGSIZE;
2748
2749        val = atomic64_read(&stats->marker_rx);
2750        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RX, val,
2751                              BOND_3AD_STAT_PAD))
2752                return -EMSGSIZE;
2753        val = atomic64_read(&stats->marker_tx);
2754        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_TX, val,
2755                              BOND_3AD_STAT_PAD))
2756                return -EMSGSIZE;
2757        val = atomic64_read(&stats->marker_resp_rx);
2758        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_RX, val,
2759                              BOND_3AD_STAT_PAD))
2760                return -EMSGSIZE;
2761        val = atomic64_read(&stats->marker_resp_tx);
2762        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_TX, val,
2763                              BOND_3AD_STAT_PAD))
2764                return -EMSGSIZE;
2765        val = atomic64_read(&stats->marker_unknown_rx);
2766        if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_UNKNOWN_RX, val,
2767                              BOND_3AD_STAT_PAD))
2768                return -EMSGSIZE;
2769
2770        return 0;
2771}
2772