提交 f05b42ea 编写于 作者: M Mahesh Bandewar 提交者: David S. Miller

bonding: Added bond_tlb_xmit() for tlb mode.

Re-organized the xmit function for the lb mode separating tlb xmit
from the alb mode. This will enable use of the hashing policies
like 802.3ad mode. Also extended use of xmit-hash-policy to tlb mode.

Now the tlb-mode defaults to BOND_XMIT_POLICY_LAYER2 if the xmit policy
module parameter is not set (just like 802.3ad, or Xor mode).

Change-Id: I140257403d272df75f477b380207338d0f04963e
Signed-off-by: NMahesh Bandewar <maheshb@google.com>
Acked-by: NEric Dumazet <edumazet@google.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9a49aba1
...@@ -769,7 +769,7 @@ use_carrier ...@@ -769,7 +769,7 @@ use_carrier
xmit_hash_policy xmit_hash_policy
Selects the transmit hash policy to use for slave selection in Selects the transmit hash policy to use for slave selection in
balance-xor and 802.3ad modes. Possible values are: balance-xor, 802.3ad, and tlb modes. Possible values are:
layer2 layer2
......
...@@ -1381,6 +1381,32 @@ static int bond_do_alb_xmit(struct sk_buff *skb, struct bonding *bond, ...@@ -1381,6 +1381,32 @@ static int bond_do_alb_xmit(struct sk_buff *skb, struct bonding *bond,
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
int bond_tlb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
{
struct bonding *bond = netdev_priv(bond_dev);
struct ethhdr *eth_data;
struct slave *tx_slave = NULL;
u32 hash_index;
skb_reset_mac_header(skb);
eth_data = eth_hdr(skb);
/* Do not TX balance any multicast or broadcast */
if (!is_multicast_ether_addr(eth_data->h_dest)) {
switch (skb->protocol) {
case htons(ETH_P_IP):
case htons(ETH_P_IPX):
/* In case of IPX, it will falback to L2 hash */
case htons(ETH_P_IPV6):
hash_index = bond_xmit_hash(bond, skb);
tx_slave = tlb_choose_channel(bond, hash_index & 0xFF, skb->len);
break;
}
}
return bond_do_alb_xmit(skb, bond, tx_slave);
}
int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
{ {
struct bonding *bond = netdev_priv(bond_dev); struct bonding *bond = netdev_priv(bond_dev);
......
...@@ -175,6 +175,7 @@ void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave); ...@@ -175,6 +175,7 @@ void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave);
void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link); void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link);
void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave); void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave);
int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev); int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
int bond_tlb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
void bond_alb_monitor(struct work_struct *); void bond_alb_monitor(struct work_struct *);
int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr); int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr);
void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id); void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id);
......
...@@ -3774,8 +3774,9 @@ static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -3774,8 +3774,9 @@ static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev
case BOND_MODE_8023AD: case BOND_MODE_8023AD:
return bond_3ad_xmit_xor(skb, dev); return bond_3ad_xmit_xor(skb, dev);
case BOND_MODE_ALB: case BOND_MODE_ALB:
case BOND_MODE_TLB:
return bond_alb_xmit(skb, dev); return bond_alb_xmit(skb, dev);
case BOND_MODE_TLB:
return bond_tlb_xmit(skb, dev);
default: default:
/* Should never happen, mode already checked */ /* Should never happen, mode already checked */
pr_err("%s: Error: Unknown bonding mode %d\n", pr_err("%s: Error: Unknown bonding mode %d\n",
...@@ -3996,7 +3997,8 @@ static int bond_check_params(struct bond_params *params) ...@@ -3996,7 +3997,8 @@ static int bond_check_params(struct bond_params *params)
if (xmit_hash_policy) { if (xmit_hash_policy) {
if ((bond_mode != BOND_MODE_XOR) && if ((bond_mode != BOND_MODE_XOR) &&
(bond_mode != BOND_MODE_8023AD)) { (bond_mode != BOND_MODE_8023AD) &&
(bond_mode != BOND_MODE_TLB)) {
pr_info("xmit_hash_policy param is irrelevant in mode %s\n", pr_info("xmit_hash_policy param is irrelevant in mode %s\n",
bond_mode_name(bond_mode)); bond_mode_name(bond_mode));
} else { } else {
......
...@@ -199,7 +199,7 @@ static const struct bond_option bond_opts[] = { ...@@ -199,7 +199,7 @@ static const struct bond_option bond_opts[] = {
[BOND_OPT_XMIT_HASH] = { [BOND_OPT_XMIT_HASH] = {
.id = BOND_OPT_XMIT_HASH, .id = BOND_OPT_XMIT_HASH,
.name = "xmit_hash_policy", .name = "xmit_hash_policy",
.desc = "balance-xor and 802.3ad hashing method", .desc = "balance-xor, 802.3ad, and tlb hashing method",
.values = bond_xmit_hashtype_tbl, .values = bond_xmit_hashtype_tbl,
.set = bond_option_xmit_hash_policy_set .set = bond_option_xmit_hash_policy_set
}, },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册