diff options
author | David S. Miller <davem@davemloft.net> | 2014-05-24 00:32:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-24 00:32:30 -0400 |
commit | 54e5c4def0614ab540fbdf68e45342a4af141702 (patch) | |
tree | 95a2f61c72336932e83d9e4180cd9739106d624b /drivers/net/bonding/bond_alb.c | |
parent | be65de7174123e02477bd488db1a657caf0f9947 (diff) | |
parent | 1ee1ceafb572f1a925809168267a7962a4289de8 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/bonding/bond_alb.c
drivers/net/ethernet/altera/altera_msgdma.c
drivers/net/ethernet/altera/altera_sgdma.c
net/ipv6/xfrm6_output.c
Several cases of overlapping changes.
The xfrm6_output.c has a bug fix which overlaps the renaming
of skb->local_df to skb->ignore_df.
In the Altera TSE driver cases, the register access cleanups
in net-next overlapped with bug fixes done in net.
Similarly a bug fix to send ALB packets in the bonding driver using
the right source address overlaps with cleanups in net-next.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding/bond_alb.c')
-rw-r--r-- | drivers/net/bonding/bond_alb.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index 03e0bcade234..7bbbf1ca0887 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -82,7 +82,8 @@ static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb) | |||
82 | } | 82 | } |
83 | 83 | ||
84 | /* Forward declaration */ | 84 | /* Forward declaration */ |
85 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]); | 85 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], |
86 | bool strict_match); | ||
86 | static void rlb_purge_src_ip(struct bonding *bond, struct arp_pkt *arp); | 87 | static void rlb_purge_src_ip(struct bonding *bond, struct arp_pkt *arp); |
87 | static void rlb_src_unlink(struct bonding *bond, u32 index); | 88 | static void rlb_src_unlink(struct bonding *bond, u32 index); |
88 | static void rlb_src_link(struct bonding *bond, u32 ip_src_hash, | 89 | static void rlb_src_link(struct bonding *bond, u32 ip_src_hash, |
@@ -459,7 +460,7 @@ static void rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[]) | |||
459 | 460 | ||
460 | bond->alb_info.rlb_promisc_timeout_counter = 0; | 461 | bond->alb_info.rlb_promisc_timeout_counter = 0; |
461 | 462 | ||
462 | alb_send_learning_packets(bond->curr_active_slave, addr); | 463 | alb_send_learning_packets(bond->curr_active_slave, addr, true); |
463 | } | 464 | } |
464 | 465 | ||
465 | /* slave being removed should not be active at this point | 466 | /* slave being removed should not be active at this point |
@@ -995,7 +996,7 @@ static void rlb_clear_vlan(struct bonding *bond, unsigned short vlan_id) | |||
995 | /*********************** tlb/rlb shared functions *********************/ | 996 | /*********************** tlb/rlb shared functions *********************/ |
996 | 997 | ||
997 | static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], | 998 | static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], |
998 | u16 vid) | 999 | __be16 vlan_proto, u16 vid) |
999 | { | 1000 | { |
1000 | struct learning_pkt pkt; | 1001 | struct learning_pkt pkt; |
1001 | struct sk_buff *skb; | 1002 | struct sk_buff *skb; |
@@ -1021,7 +1022,7 @@ static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], | |||
1021 | skb->dev = slave->dev; | 1022 | skb->dev = slave->dev; |
1022 | 1023 | ||
1023 | if (vid) { | 1024 | if (vid) { |
1024 | skb = vlan_put_tag(skb, htons(ETH_P_8021Q), vid); | 1025 | skb = vlan_put_tag(skb, vlan_proto, vid); |
1025 | if (!skb) { | 1026 | if (!skb) { |
1026 | pr_err("%s: Error: failed to insert VLAN tag\n", | 1027 | pr_err("%s: Error: failed to insert VLAN tag\n", |
1027 | slave->bond->dev->name); | 1028 | slave->bond->dev->name); |
@@ -1032,22 +1033,32 @@ static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], | |||
1032 | dev_queue_xmit(skb); | 1033 | dev_queue_xmit(skb); |
1033 | } | 1034 | } |
1034 | 1035 | ||
1035 | 1036 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], | |
1036 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]) | 1037 | bool strict_match) |
1037 | { | 1038 | { |
1038 | struct bonding *bond = bond_get_bond_by_slave(slave); | 1039 | struct bonding *bond = bond_get_bond_by_slave(slave); |
1039 | struct net_device *upper; | 1040 | struct net_device *upper; |
1040 | struct list_head *iter; | 1041 | struct list_head *iter; |
1041 | 1042 | ||
1042 | /* send untagged */ | 1043 | /* send untagged */ |
1043 | alb_send_lp_vid(slave, mac_addr, 0); | 1044 | alb_send_lp_vid(slave, mac_addr, 0, 0); |
1044 | 1045 | ||
1045 | /* loop through vlans and send one packet for each */ | 1046 | /* loop through vlans and send one packet for each */ |
1046 | rcu_read_lock(); | 1047 | rcu_read_lock(); |
1047 | netdev_for_each_all_upper_dev_rcu(bond->dev, upper, iter) { | 1048 | netdev_for_each_all_upper_dev_rcu(bond->dev, upper, iter) { |
1048 | if (upper->priv_flags & IFF_802_1Q_VLAN) | 1049 | if (is_vlan_dev(upper) && vlan_get_encap_level(upper) == 0) { |
1049 | alb_send_lp_vid(slave, mac_addr, | 1050 | if (strict_match && |
1050 | vlan_dev_vlan_id(upper)); | 1051 | ether_addr_equal_64bits(mac_addr, |
1052 | upper->dev_addr)) { | ||
1053 | alb_send_lp_vid(slave, mac_addr, | ||
1054 | vlan_dev_vlan_proto(upper), | ||
1055 | vlan_dev_vlan_id(upper)); | ||
1056 | } else if (!strict_match) { | ||
1057 | alb_send_lp_vid(slave, upper->dev_addr, | ||
1058 | vlan_dev_vlan_proto(upper), | ||
1059 | vlan_dev_vlan_id(upper)); | ||
1060 | } | ||
1061 | } | ||
1051 | } | 1062 | } |
1052 | rcu_read_unlock(); | 1063 | rcu_read_unlock(); |
1053 | } | 1064 | } |
@@ -1107,7 +1118,7 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1, | |||
1107 | 1118 | ||
1108 | /* fasten the change in the switch */ | 1119 | /* fasten the change in the switch */ |
1109 | if (bond_slave_can_tx(slave1)) { | 1120 | if (bond_slave_can_tx(slave1)) { |
1110 | alb_send_learning_packets(slave1, slave1->dev->dev_addr); | 1121 | alb_send_learning_packets(slave1, slave1->dev->dev_addr, false); |
1111 | if (bond->alb_info.rlb_enabled) { | 1122 | if (bond->alb_info.rlb_enabled) { |
1112 | /* inform the clients that the mac address | 1123 | /* inform the clients that the mac address |
1113 | * has changed | 1124 | * has changed |
@@ -1119,7 +1130,7 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1, | |||
1119 | } | 1130 | } |
1120 | 1131 | ||
1121 | if (bond_slave_can_tx(slave2)) { | 1132 | if (bond_slave_can_tx(slave2)) { |
1122 | alb_send_learning_packets(slave2, slave2->dev->dev_addr); | 1133 | alb_send_learning_packets(slave2, slave2->dev->dev_addr, false); |
1123 | if (bond->alb_info.rlb_enabled) { | 1134 | if (bond->alb_info.rlb_enabled) { |
1124 | /* inform the clients that the mac address | 1135 | /* inform the clients that the mac address |
1125 | * has changed | 1136 | * has changed |
@@ -1536,6 +1547,8 @@ void bond_alb_monitor(struct work_struct *work) | |||
1536 | 1547 | ||
1537 | /* send learning packets */ | 1548 | /* send learning packets */ |
1538 | if (bond_info->lp_counter >= BOND_ALB_LP_TICKS(bond)) { | 1549 | if (bond_info->lp_counter >= BOND_ALB_LP_TICKS(bond)) { |
1550 | bool strict_match; | ||
1551 | |||
1539 | /* change of curr_active_slave involves swapping of mac addresses. | 1552 | /* change of curr_active_slave involves swapping of mac addresses. |
1540 | * in order to avoid this swapping from happening while | 1553 | * in order to avoid this swapping from happening while |
1541 | * sending the learning packets, the curr_slave_lock must be held for | 1554 | * sending the learning packets, the curr_slave_lock must be held for |
@@ -1543,8 +1556,15 @@ void bond_alb_monitor(struct work_struct *work) | |||
1543 | */ | 1556 | */ |
1544 | read_lock(&bond->curr_slave_lock); | 1557 | read_lock(&bond->curr_slave_lock); |
1545 | 1558 | ||
1546 | bond_for_each_slave_rcu(bond, slave, iter) | 1559 | bond_for_each_slave_rcu(bond, slave, iter) { |
1547 | alb_send_learning_packets(slave, slave->dev->dev_addr); | 1560 | /* If updating current_active, use all currently |
1561 | * user mac addreses (!strict_match). Otherwise, only | ||
1562 | * use mac of the slave device. | ||
1563 | */ | ||
1564 | strict_match = (slave != bond->curr_active_slave); | ||
1565 | alb_send_learning_packets(slave, slave->dev->dev_addr, | ||
1566 | strict_match); | ||
1567 | } | ||
1548 | 1568 | ||
1549 | read_unlock(&bond->curr_slave_lock); | 1569 | read_unlock(&bond->curr_slave_lock); |
1550 | 1570 | ||
@@ -1767,7 +1787,8 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave | |||
1767 | } else { | 1787 | } else { |
1768 | /* set the new_slave to the bond mac address */ | 1788 | /* set the new_slave to the bond mac address */ |
1769 | alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr); | 1789 | alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr); |
1770 | alb_send_learning_packets(new_slave, bond->dev->dev_addr); | 1790 | alb_send_learning_packets(new_slave, bond->dev->dev_addr, |
1791 | false); | ||
1771 | } | 1792 | } |
1772 | 1793 | ||
1773 | write_lock_bh(&bond->curr_slave_lock); | 1794 | write_lock_bh(&bond->curr_slave_lock); |
@@ -1810,7 +1831,8 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) | |||
1810 | alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr); | 1831 | alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr); |
1811 | 1832 | ||
1812 | read_lock(&bond->lock); | 1833 | read_lock(&bond->lock); |
1813 | alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); | 1834 | alb_send_learning_packets(bond->curr_active_slave, |
1835 | bond_dev->dev_addr, false); | ||
1814 | if (bond->alb_info.rlb_enabled) { | 1836 | if (bond->alb_info.rlb_enabled) { |
1815 | /* inform clients mac address has changed */ | 1837 | /* inform clients mac address has changed */ |
1816 | rlb_req_update_slave_clients(bond, bond->curr_active_slave); | 1838 | rlb_req_update_slave_clients(bond, bond->curr_active_slave); |