Commit 520dfe3a authored by Yan Burman's avatar Yan Burman Committed by David S. Miller

net/mlx4_en: Add support for destination MAC in steering rules

Implement destination MAC rule extension for L3/L4 rules in
flow steering. Usefull for vSwitch/macvlan configurations.
Signed-off-by: default avatarYan Burman <yanb@mellanox.com>
Signed-off-by: default avatarAmir Vadai <amirv@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c402b947
...@@ -617,7 +617,13 @@ static int mlx4_en_validate_flow(struct net_device *dev, ...@@ -617,7 +617,13 @@ static int mlx4_en_validate_flow(struct net_device *dev,
if (cmd->fs.location >= MAX_NUM_OF_FS_RULES) if (cmd->fs.location >= MAX_NUM_OF_FS_RULES)
return -EINVAL; return -EINVAL;
switch (cmd->fs.flow_type & ~FLOW_EXT) { if (cmd->fs.flow_type & FLOW_MAC_EXT) {
/* dest mac mask must be ff:ff:ff:ff:ff:ff */
if (!is_broadcast_ether_addr(cmd->fs.m_ext.h_dest))
return -EINVAL;
}
switch (cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
case TCP_V4_FLOW: case TCP_V4_FLOW:
case UDP_V4_FLOW: case UDP_V4_FLOW:
if (cmd->fs.m_u.tcp_ip4_spec.tos) if (cmd->fs.m_u.tcp_ip4_spec.tos)
...@@ -745,7 +751,6 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev, ...@@ -745,7 +751,6 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev,
struct list_head *rule_list_h) struct list_head *rule_list_h)
{ {
int err; int err;
u64 mac;
__be64 be_mac; __be64 be_mac;
struct ethhdr *eth_spec; struct ethhdr *eth_spec;
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
...@@ -760,12 +765,16 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev, ...@@ -760,12 +765,16 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev,
if (!spec_l2) if (!spec_l2)
return -ENOMEM; return -ENOMEM;
mac = priv->mac & MLX4_MAC_MASK; if (cmd->fs.flow_type & FLOW_MAC_EXT) {
be_mac = cpu_to_be64(mac << 16); memcpy(&be_mac, cmd->fs.h_ext.h_dest, ETH_ALEN);
} else {
u64 mac = priv->mac & MLX4_MAC_MASK;
be_mac = cpu_to_be64(mac << 16);
}
spec_l2->id = MLX4_NET_TRANS_RULE_ID_ETH; spec_l2->id = MLX4_NET_TRANS_RULE_ID_ETH;
memcpy(spec_l2->eth.dst_mac_msk, &mac_msk, ETH_ALEN); memcpy(spec_l2->eth.dst_mac_msk, &mac_msk, ETH_ALEN);
if ((cmd->fs.flow_type & ~FLOW_EXT) != ETHER_FLOW) if ((cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) != ETHER_FLOW)
memcpy(spec_l2->eth.dst_mac, &be_mac, ETH_ALEN); memcpy(spec_l2->eth.dst_mac, &be_mac, ETH_ALEN);
if ((cmd->fs.flow_type & FLOW_EXT) && cmd->fs.m_ext.vlan_tci) { if ((cmd->fs.flow_type & FLOW_EXT) && cmd->fs.m_ext.vlan_tci) {
...@@ -775,7 +784,7 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev, ...@@ -775,7 +784,7 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev,
list_add_tail(&spec_l2->list, rule_list_h); list_add_tail(&spec_l2->list, rule_list_h);
switch (cmd->fs.flow_type & ~FLOW_EXT) { switch (cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
case ETHER_FLOW: case ETHER_FLOW:
eth_spec = &cmd->fs.h_u.ether_spec; eth_spec = &cmd->fs.h_u.ether_spec;
memcpy(&spec_l2->eth.dst_mac, eth_spec->h_dest, ETH_ALEN); memcpy(&spec_l2->eth.dst_mac, eth_spec->h_dest, ETH_ALEN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment