]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/bonding/bond_3ad.c
Merge branch 'i2c-next' of git://aeryn.fluff.org.uk/bjdooks/linux
[linux-2.6-omap-h63xx.git] / drivers / net / bonding / bond_3ad.c
index 6f3655d3934f8bd0aae85fead2ffa93b3165d5af..8c2e5ab51f08fd35265eacd0b8881998fae8e6a8 100644 (file)
@@ -95,33 +95,7 @@ static struct mac_addr null_mac_addr = {{0, 0, 0, 0, 0, 0}};
 static u16 ad_ticks_per_sec;
 static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000;
 
-// ================= 3AD api to bonding and kernel code ==================
-static u16 __get_link_speed(struct port *port);
-static u8 __get_duplex(struct port *port);
-static inline void __initialize_port_locks(struct port *port);
-//conversions
-static u16 __ad_timer_to_ticks(u16 timer_type, u16 Par);
-
-
-// ================= ad code helper functions ==================
-//needed by ad_rx_machine(...)
-static void __record_pdu(struct lacpdu *lacpdu, struct port *port);
-static void __record_default(struct port *port);
-static void __update_selected(struct lacpdu *lacpdu, struct port *port);
-static void __update_default_selected(struct port *port);
-static void __choose_matched(struct lacpdu *lacpdu, struct port *port);
-static void __update_ntt(struct lacpdu *lacpdu, struct port *port);
-
-//needed for ad_mux_machine(..)
-static void __attach_bond_to_agg(struct port *port);
-static void __detach_bond_from_agg(struct port *port);
-static int __agg_ports_are_ready(struct aggregator *aggregator);
-static void __set_agg_ports_ready(struct aggregator *aggregator, int val);
-
-//needed for ad_agg_selection_logic(...)
-static u32 __get_agg_bandwidth(struct aggregator *aggregator);
-static struct aggregator *__get_active_agg(struct aggregator *aggregator);
-
+static const u8 lacpdu_mcast_addr[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
 
 // ================= main 802.3ad protocol functions ==================
 static int ad_lacpdu_send(struct port *port);
@@ -135,7 +109,6 @@ static void ad_agg_selection_logic(struct aggregator *aggregator);
 static void ad_clear_agg(struct aggregator *aggregator);
 static void ad_initialize_agg(struct aggregator *aggregator);
 static void ad_initialize_port(struct port *port, int lacp_fast);
-static void ad_initialize_lacpdu(struct lacpdu *Lacpdu);
 static void ad_enable_collecting_distributing(struct port *port);
 static void ad_disable_collecting_distributing(struct port *port);
 static void ad_marker_info_received(struct bond_marker *marker_info, struct port *port);
@@ -483,33 +456,25 @@ static u16 __ad_timer_to_ticks(u16 timer_type, u16 par)
  */
 static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
 {
-       // validate lacpdu and port
        if (lacpdu && port) {
+               struct port_params *partner = &port->partner_oper;
+
                // record the new parameter values for the partner operational
-               port->partner_oper_port_number = ntohs(lacpdu->actor_port);
-               port->partner_oper_port_priority = ntohs(lacpdu->actor_port_priority);
-               port->partner_oper_system = lacpdu->actor_system;
-               port->partner_oper_system_priority = ntohs(lacpdu->actor_system_priority);
-               port->partner_oper_key = ntohs(lacpdu->actor_key);
-               // zero partener's lase states
-               port->partner_oper_port_state = 0;
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_LACP_ACTIVITY);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_LACP_TIMEOUT);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_AGGREGATION);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_COLLECTING);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_DISTRIBUTING);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_DEFAULTED);
-               port->partner_oper_port_state |= (lacpdu->actor_state & AD_STATE_EXPIRED);
+               partner->port_number = ntohs(lacpdu->actor_port);
+               partner->port_priority = ntohs(lacpdu->actor_port_priority);
+               partner->system = lacpdu->actor_system;
+               partner->system_priority = ntohs(lacpdu->actor_system_priority);
+               partner->key = ntohs(lacpdu->actor_key);
+               partner->port_state = lacpdu->actor_state;
 
                // set actor_oper_port_state.defaulted to FALSE
                port->actor_oper_port_state &= ~AD_STATE_DEFAULTED;
 
                // set the partner sync. to on if the partner is sync. and the port is matched
                if ((port->sm_vars & AD_PORT_MATCHED) && (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) {
-                       port->partner_oper_port_state |= AD_STATE_SYNCHRONIZATION;
+                       partner->port_state |= AD_STATE_SYNCHRONIZATION;
                } else {
-                       port->partner_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
+                       partner->port_state &= ~AD_STATE_SYNCHRONIZATION;
                }
        }
 }
@@ -524,15 +489,10 @@ static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
  */
 static void __record_default(struct port *port)
 {
-       // validate the port
        if (port) {
                // record the partner admin parameters
-               port->partner_oper_port_number = port->partner_admin_port_number;
-               port->partner_oper_port_priority = port->partner_admin_port_priority;
-               port->partner_oper_system = port->partner_admin_system;
-               port->partner_oper_system_priority = port->partner_admin_system_priority;
-               port->partner_oper_key = port->partner_admin_key;
-               port->partner_oper_port_state = port->partner_admin_port_state;
+               memcpy(&port->partner_oper, &port->partner_admin,
+                      sizeof(struct port_params));
 
                // set actor_oper_port_state.defaulted to true
                port->actor_oper_port_state |= AD_STATE_DEFAULTED;
@@ -554,16 +514,16 @@ static void __record_default(struct port *port)
  */
 static void __update_selected(struct lacpdu *lacpdu, struct port *port)
 {
-       // validate lacpdu and port
        if (lacpdu && port) {
+               const struct port_params *partner = &port->partner_oper;
+
                // check if any parameter is different
-               if ((ntohs(lacpdu->actor_port) != port->partner_oper_port_number) ||
-                   (ntohs(lacpdu->actor_port_priority) != port->partner_oper_port_priority) ||
-                   MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->partner_oper_system)) ||
-                   (ntohs(lacpdu->actor_system_priority) != port->partner_oper_system_priority) ||
-                   (ntohs(lacpdu->actor_key) != port->partner_oper_key) ||
-                   ((lacpdu->actor_state & AD_STATE_AGGREGATION) != (port->partner_oper_port_state & AD_STATE_AGGREGATION))
-                  ) {
+               if (ntohs(lacpdu->actor_port) != partner->port_number
+                   || ntohs(lacpdu->actor_port_priority) != partner->port_priority
+                   || MAC_ADDRESS_COMPARE(&lacpdu->actor_system, &partner->system)
+                   || ntohs(lacpdu->actor_system_priority) != partner->system_priority
+                   || ntohs(lacpdu->actor_key) != partner->key
+                   || (lacpdu->actor_state & AD_STATE_AGGREGATION) != (partner->port_state & AD_STATE_AGGREGATION)) {
                        // update the state machine Selected variable
                        port->sm_vars &= ~AD_PORT_SELECTED;
                }
@@ -584,16 +544,18 @@ static void __update_selected(struct lacpdu *lacpdu, struct port *port)
  */
 static void __update_default_selected(struct port *port)
 {
-       // validate the port
        if (port) {
+               const struct port_params *admin = &port->partner_admin;
+               const struct port_params *oper = &port->partner_oper;
+
                // check if any parameter is different
-               if ((port->partner_admin_port_number != port->partner_oper_port_number) ||
-                   (port->partner_admin_port_priority != port->partner_oper_port_priority) ||
-                   MAC_ADDRESS_COMPARE(&(port->partner_admin_system), &(port->partner_oper_system)) ||
-                   (port->partner_admin_system_priority != port->partner_oper_system_priority) ||
-                   (port->partner_admin_key != port->partner_oper_key) ||
-                   ((port->partner_admin_port_state & AD_STATE_AGGREGATION) != (port->partner_oper_port_state & AD_STATE_AGGREGATION))
-                  ) {
+               if (admin->port_number != oper->port_number
+                   || admin->port_priority != oper->port_priority
+                   || MAC_ADDRESS_COMPARE(&admin->system, &oper->system)
+                   || admin->system_priority != oper->system_priority
+                   || admin->key != oper->key
+                   || (admin->port_state & AD_STATE_AGGREGATION)
+                       != (oper->port_state & AD_STATE_AGGREGATION)) {
                        // update the state machine Selected variable
                        port->sm_vars &= ~AD_PORT_SELECTED;
                }
@@ -668,8 +630,8 @@ static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
                    ((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) ||
                    ((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGATION))
                   ) {
-                       // set ntt to be TRUE
-                       port->ntt = 1;
+
+                       port->ntt = true;
                }
        }
 }
@@ -808,6 +770,7 @@ static struct aggregator *__get_active_agg(struct aggregator *aggregator)
 static inline void __update_lacpdu_from_port(struct port *port)
 {
        struct lacpdu *lacpdu = &port->lacpdu;
+       const struct port_params *partner = &port->partner_oper;
 
        /* update current actual Actor parameters */
        /* lacpdu->subtype                   initialized
@@ -828,12 +791,12 @@ static inline void __update_lacpdu_from_port(struct port *port)
         * lacpdu->partner_information_length initialized
         */
 
-       lacpdu->partner_system_priority = htons(port->partner_oper_system_priority);
-       lacpdu->partner_system = port->partner_oper_system;
-       lacpdu->partner_key = htons(port->partner_oper_key);
-       lacpdu->partner_port_priority = htons(port->partner_oper_port_priority);
-       lacpdu->partner_port = htons(port->partner_oper_port_number);
-       lacpdu->partner_state = port->partner_oper_port_state;
+       lacpdu->partner_system_priority = htons(partner->system_priority);
+       lacpdu->partner_system = partner->system;
+       lacpdu->partner_key = htons(partner->key);
+       lacpdu->partner_port_priority = htons(partner->port_priority);
+       lacpdu->partner_port = htons(partner->port_number);
+       lacpdu->partner_state = partner->port_state;
 
        /* lacpdu->reserved_3_2              initialized
         * lacpdu->tlv_type_collector_info   initialized
@@ -863,7 +826,6 @@ static int ad_lacpdu_send(struct port *port)
        struct sk_buff *skb;
        struct lacpdu_header *lacpdu_header;
        int length = sizeof(struct lacpdu_header);
-       struct mac_addr lacpdu_multicast_address = AD_MULTICAST_LACPDU_ADDR;
 
        skb = dev_alloc_skb(length);
        if (!skb) {
@@ -878,11 +840,11 @@ static int ad_lacpdu_send(struct port *port)
 
        lacpdu_header = (struct lacpdu_header *)skb_put(skb, length);
 
-       lacpdu_header->ad_header.destination_address = lacpdu_multicast_address;
-       /* Note: source addres is set to be the member's PERMANENT address, because we use it
-          to identify loopback lacpdus in receive. */
-       lacpdu_header->ad_header.source_address = *((struct mac_addr *)(slave->perm_hwaddr));
-       lacpdu_header->ad_header.length_type = PKT_TYPE_LACPDU;
+       memcpy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr, ETH_ALEN);
+       /* Note: source addres is set to be the member's PERMANENT address,
+          because we use it to identify loopback lacpdus in receive. */
+       memcpy(lacpdu_header->hdr.h_source, slave->perm_hwaddr, ETH_ALEN);
+       lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU;
 
        lacpdu_header->lacpdu = port->lacpdu; // struct copy
 
@@ -905,7 +867,6 @@ static int ad_marker_send(struct port *port, struct bond_marker *marker)
        struct sk_buff *skb;
        struct bond_marker_header *marker_header;
        int length = sizeof(struct bond_marker_header);
-       struct mac_addr lacpdu_multicast_address = AD_MULTICAST_LACPDU_ADDR;
 
        skb = dev_alloc_skb(length + 16);
        if (!skb) {
@@ -921,11 +882,11 @@ static int ad_marker_send(struct port *port, struct bond_marker *marker)
 
        marker_header = (struct bond_marker_header *)skb_put(skb, length);
 
-       marker_header->ad_header.destination_address = lacpdu_multicast_address;
-       /* Note: source addres is set to be the member's PERMANENT address, because we use it
-          to identify loopback MARKERs in receive. */
-       marker_header->ad_header.source_address = *((struct mac_addr *)(slave->perm_hwaddr));
-       marker_header->ad_header.length_type = PKT_TYPE_LACPDU;
+       memcpy(marker_header->hdr.h_dest, lacpdu_mcast_addr, ETH_ALEN);
+       /* Note: source addres is set to be the member's PERMANENT address,
+          because we use it to identify loopback MARKERs in receive. */
+       memcpy(marker_header->hdr.h_source, slave->perm_hwaddr, ETH_ALEN);
+       marker_header->hdr.h_proto = PKT_TYPE_LACPDU;
 
        marker_header->marker = *marker; // struct copy
 
@@ -982,7 +943,7 @@ static void ad_mux_machine(struct port *port)
                        break;
                case AD_MUX_ATTACHED:
                        // check also if agg_select_timer expired(so the edable port will take place only after this timer)
-                       if ((port->sm_vars & AD_PORT_SELECTED) && (port->partner_oper_port_state & AD_STATE_SYNCHRONIZATION) && !__check_agg_selection_timer(port)) {
+                       if ((port->sm_vars & AD_PORT_SELECTED) && (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && !__check_agg_selection_timer(port)) {
                                port->sm_mux_state = AD_MUX_COLLECTING_DISTRIBUTING;// next state
                        } else if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY)) {    // if UNSELECTED or STANDBY
                                port->sm_vars &= ~AD_PORT_READY_N;
@@ -994,7 +955,7 @@ static void ad_mux_machine(struct port *port)
                        break;
                case AD_MUX_COLLECTING_DISTRIBUTING:
                        if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY) ||
-                           !(port->partner_oper_port_state & AD_STATE_SYNCHRONIZATION)
+                           !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION)
                           ) {
                                port->sm_mux_state = AD_MUX_ATTACHED;// next state
 
@@ -1025,7 +986,7 @@ static void ad_mux_machine(struct port *port)
                        ad_disable_collecting_distributing(port);
                        port->actor_oper_port_state &= ~AD_STATE_COLLECTING;
                        port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING;
-                       port->ntt = 1;
+                       port->ntt = true;
                        break;
                case AD_MUX_WAITING:
                        port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0);
@@ -1036,13 +997,13 @@ static void ad_mux_machine(struct port *port)
                        port->actor_oper_port_state &= ~AD_STATE_COLLECTING;
                        port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING;
                        ad_disable_collecting_distributing(port);
-                       port->ntt = 1;
+                       port->ntt = true;
                        break;
                case AD_MUX_COLLECTING_DISTRIBUTING:
                        port->actor_oper_port_state |= AD_STATE_COLLECTING;
                        port->actor_oper_port_state |= AD_STATE_DISTRIBUTING;
                        ad_enable_collecting_distributing(port);
-                       port->ntt = 1;
+                       port->ntt = true;
                        break;
                default:    //to silence the compiler
                        break;
@@ -1138,7 +1099,7 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
                case AD_RX_LACP_DISABLED:
                        port->sm_vars &= ~AD_PORT_SELECTED;
                        __record_default(port);
-                       port->partner_oper_port_state &= ~AD_STATE_AGGREGATION;
+                       port->partner_oper.port_state &= ~AD_STATE_AGGREGATION;
                        port->sm_vars |= AD_PORT_MATCHED;
                        port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
                        break;
@@ -1146,9 +1107,9 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
                        //Reset of the Synchronization flag. (Standard 43.4.12)
                        //This reset cause to disable this port in the COLLECTING_DISTRIBUTING state of the
                        //mux machine in case of EXPIRED even if LINK_DOWN didn't arrive for the port.
-                       port->partner_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
+                       port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION;
                        port->sm_vars &= ~AD_PORT_MATCHED;
-                       port->partner_oper_port_state |= AD_SHORT_TIMEOUT;
+                       port->partner_oper.port_state |= AD_SHORT_TIMEOUT;
                        port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT));
                        port->actor_oper_port_state |= AD_STATE_EXPIRED;
                        break;
@@ -1201,11 +1162,13 @@ static void ad_tx_machine(struct port *port)
                // check if there is something to send
                if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) {
                        __update_lacpdu_from_port(port);
-                       // send the lacpdu
+
                        if (ad_lacpdu_send(port) >= 0) {
                                pr_debug("Sent LACPDU on port %d\n", port->actor_port_number);
-                               // mark ntt as false, so it will not be sent again until demanded
-                               port->ntt = 0;
+
+                               /* mark ntt as false, so it will not be sent again until
+                                  demanded */
+                               port->ntt = false;
                        }
                }
                // restart tx timer(to verify that we will not exceed AD_MAX_TX_IN_SECOND
@@ -1228,7 +1191,7 @@ static void ad_periodic_machine(struct port *port)
 
        // check if port was reinitialized
        if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) ||
-           (!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper_port_state & AD_STATE_LACP_ACTIVITY))
+           (!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & AD_STATE_LACP_ACTIVITY))
           ) {
                port->sm_periodic_state = AD_NO_PERIODIC;            // next state
        }
@@ -1242,12 +1205,12 @@ static void ad_periodic_machine(struct port *port)
                        // If not expired, check if there is some new timeout parameter from the partner state
                        switch (port->sm_periodic_state) {
                        case AD_FAST_PERIODIC:
-                               if (!(port->partner_oper_port_state & AD_STATE_LACP_TIMEOUT)) {
+                               if (!(port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
                                        port->sm_periodic_state = AD_SLOW_PERIODIC;  // next state
                                }
                                break;
                        case AD_SLOW_PERIODIC:
-                               if ((port->partner_oper_port_state & AD_STATE_LACP_TIMEOUT)) {
+                               if ((port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
                                        // stop current timer
                                        port->sm_periodic_timer_counter = 0;
                                        port->sm_periodic_state = AD_PERIODIC_TX;        // next state
@@ -1263,7 +1226,7 @@ static void ad_periodic_machine(struct port *port)
                        port->sm_periodic_state = AD_FAST_PERIODIC;      // next state
                        break;
                case AD_PERIODIC_TX:
-                       if (!(port->partner_oper_port_state & AD_STATE_LACP_TIMEOUT)) {
+                       if (!(port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
                                port->sm_periodic_state = AD_SLOW_PERIODIC;  // next state
                        } else {
                                port->sm_periodic_state = AD_FAST_PERIODIC;  // next state
@@ -1288,7 +1251,7 @@ static void ad_periodic_machine(struct port *port)
                        port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TIME))-1; // decrement 1 tick we lost in the PERIODIC_TX cycle
                        break;
                case AD_PERIODIC_TX:
-                       port->ntt = 1;
+                       port->ntt = true;
                        break;
                default:    //to silence the compiler
                        break;
@@ -1362,11 +1325,11 @@ static void ad_port_selection_logic(struct port *port)
                }
                // check if current aggregator suits us
                if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && // if all parameters match AND
-                    !MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper_system)) &&
-                    (aggregator->partner_system_priority == port->partner_oper_system_priority) &&
-                    (aggregator->partner_oper_aggregator_key == port->partner_oper_key)
+                    !MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper.system)) &&
+                    (aggregator->partner_system_priority == port->partner_oper.system_priority) &&
+                    (aggregator->partner_oper_aggregator_key == port->partner_oper.key)
                    ) &&
-                   ((MAC_ADDRESS_COMPARE(&(port->partner_oper_system), &(null_mac_addr)) && // partner answers
+                   ((MAC_ADDRESS_COMPARE(&(port->partner_oper.system), &(null_mac_addr)) && // partner answers
                      !aggregator->is_individual)  // but is not individual OR
                    )
                   ) {
@@ -1395,16 +1358,16 @@ static void ad_port_selection_logic(struct port *port)
                        // update the new aggregator's parameters
                        // if port was responsed from the end-user
                        if (port->actor_oper_port_key & AD_DUPLEX_KEY_BITS) {// if port is full duplex
-                               port->aggregator->is_individual = 0;
+                               port->aggregator->is_individual = false;
                        } else {
-                               port->aggregator->is_individual = 1;
+                               port->aggregator->is_individual = true;
                        }
 
                        port->aggregator->actor_admin_aggregator_key = port->actor_admin_port_key;
                        port->aggregator->actor_oper_aggregator_key = port->actor_oper_port_key;
-                       port->aggregator->partner_system=port->partner_oper_system;
-                       port->aggregator->partner_system_priority = port->partner_oper_system_priority;
-                       port->aggregator->partner_oper_aggregator_key = port->partner_oper_key;
+                       port->aggregator->partner_system=port->partner_oper.system;
+                       port->aggregator->partner_system_priority = port->partner_oper.system_priority;
+                       port->aggregator->partner_oper_aggregator_key = port->partner_oper.key;
                        port->aggregator->receive_state = 1;
                        port->aggregator->transmit_state = 1;
                        port->aggregator->lag_ports = port;
@@ -1649,7 +1612,7 @@ static void ad_agg_selection_logic(struct aggregator *agg)
 static void ad_clear_agg(struct aggregator *aggregator)
 {
        if (aggregator) {
-               aggregator->is_individual = 0;
+               aggregator->is_individual = false;
                aggregator->actor_admin_aggregator_key = 0;
                aggregator->actor_oper_aggregator_key = 0;
                aggregator->partner_system = null_mac_addr;
@@ -1688,13 +1651,32 @@ static void ad_initialize_agg(struct aggregator *aggregator)
  */
 static void ad_initialize_port(struct port *port, int lacp_fast)
 {
+       static const struct port_params tmpl = {
+               .system_priority = 0xffff,
+               .key             = 1,
+               .port_number     = 1,
+               .port_priority   = 0xff,
+               .port_state      = 1,
+       };
+       static const struct lacpdu lacpdu = {
+               .subtype                = 0x01,
+               .version_number = 0x01,
+               .tlv_type_actor_info = 0x01,
+               .actor_information_length = 0x14,
+               .tlv_type_partner_info = 0x02,
+               .partner_information_length = 0x14,
+               .tlv_type_collector_info = 0x03,
+               .collector_information_length = 0x10,
+               .collector_max_delay = htons(AD_COLLECTOR_MAX_DELAY),
+       };
+
        if (port) {
                port->actor_port_number = 1;
                port->actor_port_priority = 0xff;
                port->actor_system = null_mac_addr;
                port->actor_system_priority = 0xffff;
                port->actor_port_aggregator_identifier = 0;
-               port->ntt = 0;
+               port->ntt = false;
                port->actor_admin_port_key = 1;
                port->actor_oper_port_key  = 1;
                port->actor_admin_port_state = AD_STATE_AGGREGATION | AD_STATE_LACP_ACTIVITY;
@@ -1704,19 +1686,10 @@ static void ad_initialize_port(struct port *port, int lacp_fast)
                        port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
                }
 
-               port->partner_admin_system = null_mac_addr;
-               port->partner_oper_system  = null_mac_addr;
-               port->partner_admin_system_priority = 0xffff;
-               port->partner_oper_system_priority  = 0xffff;
-               port->partner_admin_key = 1;
-               port->partner_oper_key  = 1;
-               port->partner_admin_port_number = 1;
-               port->partner_oper_port_number  = 1;
-               port->partner_admin_port_priority = 0xff;
-               port->partner_oper_port_priority  = 0xff;
-               port->partner_admin_port_state = 1;
-               port->partner_oper_port_state  = 1;
-               port->is_enabled = 1;
+               memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
+               memcpy(&port->partner_oper, &tmpl, sizeof(tmpl));
+
+               port->is_enabled = true;
                // ****** private parameters ******
                port->sm_vars = 0x3;
                port->sm_rx_state = 0;
@@ -1732,7 +1705,7 @@ static void ad_initialize_port(struct port *port, int lacp_fast)
                port->next_port_in_aggregator = NULL;
                port->transaction_id = 0;
 
-               ad_initialize_lacpdu(&(port->lacpdu));
+               memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu));
        }
 }
 
@@ -1841,53 +1814,6 @@ static void ad_marker_response_received(struct bond_marker *marker,
        // DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW
 }
 
-/**
- * ad_initialize_lacpdu - initialize a given lacpdu structure
- * @lacpdu: lacpdu structure to initialize
- *
- */
-static void ad_initialize_lacpdu(struct lacpdu *lacpdu)
-{
-       u16 index;
-
-       // initialize lacpdu data
-       lacpdu->subtype = 0x01;
-       lacpdu->version_number = 0x01;
-       lacpdu->tlv_type_actor_info = 0x01;
-       lacpdu->actor_information_length = 0x14;
-       // lacpdu->actor_system_priority    updated on send
-       // lacpdu->actor_system             updated on send
-       // lacpdu->actor_key                updated on send
-       // lacpdu->actor_port_priority      updated on send
-       // lacpdu->actor_port               updated on send
-       // lacpdu->actor_state              updated on send
-       lacpdu->tlv_type_partner_info = 0x02;
-       lacpdu->partner_information_length = 0x14;
-       for (index=0; index<=2; index++) {
-               lacpdu->reserved_3_1[index]=0;
-       }
-       // lacpdu->partner_system_priority  updated on send
-       // lacpdu->partner_system           updated on send
-       // lacpdu->partner_key              updated on send
-       // lacpdu->partner_port_priority    updated on send
-       // lacpdu->partner_port             updated on send
-       // lacpdu->partner_state            updated on send
-       for (index=0; index<=2; index++) {
-               lacpdu->reserved_3_2[index]=0;
-       }
-       lacpdu->tlv_type_collector_info = 0x03;
-       lacpdu->collector_information_length= 0x10;
-       lacpdu->collector_max_delay = htons(AD_COLLECTOR_MAX_DELAY);
-       for (index=0; index<=11; index++) {
-               lacpdu->reserved_12[index]=0;
-       }
-       lacpdu->tlv_type_terminator = 0x00;
-       lacpdu->terminator_length = 0;
-       for (index=0; index<=49; index++) {
-               lacpdu->reserved_50[index]=0;
-       }
-}
-
 //////////////////////////////////////////////////////////////////////////////////////
 // ================= AD exported functions to the main bonding code ==================
 //////////////////////////////////////////////////////////////////////////////////////
@@ -2345,14 +2271,14 @@ void bond_3ad_handle_link_change(struct slave *slave, char link)
        // on link down we are zeroing duplex and speed since some of the adaptors(ce1000.lan) report full duplex/speed instead of N/A(duplex) / 0(speed)
        // on link up we are forcing recheck on the duplex and speed since some of he adaptors(ce1000.lan) report
        if (link == BOND_LINK_UP) {
-               port->is_enabled = 1;
+               port->is_enabled = true;
                port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS;
                port->actor_oper_port_key=port->actor_admin_port_key |= __get_duplex(port);
                port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS;
                port->actor_oper_port_key=port->actor_admin_port_key |= (__get_link_speed(port) << 1);
        } else {
                /* link has failed */
-               port->is_enabled = 0;
+               port->is_enabled = false;
                port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS;
                port->actor_oper_port_key= (port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS);
        }