mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 22:24:09 +08:00
i40e: Add bridge FDB add/del/dump ops
Add the netdev ops to support addition of static FDB entries in the physical function (PF) MAC/VLAN filter table so that virtual functions (VFs) can communicate with bridged virtual Ethernet ports such as those provided by the virtio driver. Change-ID: Ifbd6817a75074e3b5cdf945a5635f26440bf15df Signed-off-by: Greg Rose <gregory.v.rose@intel.com> Signed-off-by: Catherine Sullivan <catherine.sullivan@intel.com> Tested-by: Kavindya Deegala <kavindya.s.deegala@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
5a9d19ab76
commit
4ba0dea5b1
@ -6644,6 +6644,96 @@ static void i40e_del_vxlan_port(struct net_device *netdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_FDB_OPS
|
||||||
|
#ifdef USE_CONST_DEV_UC_CHAR
|
||||||
|
static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
|
||||||
|
struct net_device *dev,
|
||||||
|
const unsigned char *addr,
|
||||||
|
u16 flags)
|
||||||
|
#else
|
||||||
|
static int i40e_ndo_fdb_add(struct ndmsg *ndm,
|
||||||
|
struct net_device *dev,
|
||||||
|
unsigned char *addr,
|
||||||
|
u16 flags)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
struct i40e_netdev_priv *np = netdev_priv(dev);
|
||||||
|
struct i40e_pf *pf = np->vsi->back;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (!(pf->flags & I40E_FLAG_SRIOV_ENABLED))
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
/* Hardware does not support aging addresses so if a
|
||||||
|
* ndm_state is given only allow permanent addresses
|
||||||
|
*/
|
||||||
|
if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) {
|
||||||
|
netdev_info(dev, "FDB only supports static addresses\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr))
|
||||||
|
err = dev_uc_add_excl(dev, addr);
|
||||||
|
else if (is_multicast_ether_addr(addr))
|
||||||
|
err = dev_mc_add_excl(dev, addr);
|
||||||
|
else
|
||||||
|
err = -EINVAL;
|
||||||
|
|
||||||
|
/* Only return duplicate errors if NLM_F_EXCL is set */
|
||||||
|
if (err == -EEXIST && !(flags & NLM_F_EXCL))
|
||||||
|
err = 0;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef USE_DEFAULT_FDB_DEL_DUMP
|
||||||
|
#ifdef USE_CONST_DEV_UC_CHAR
|
||||||
|
static int i40e_ndo_fdb_del(struct ndmsg *ndm,
|
||||||
|
struct net_device *dev,
|
||||||
|
const unsigned char *addr)
|
||||||
|
#else
|
||||||
|
static int i40e_ndo_fdb_del(struct ndmsg *ndm,
|
||||||
|
struct net_device *dev,
|
||||||
|
unsigned char *addr)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
struct i40e_netdev_priv *np = netdev_priv(dev);
|
||||||
|
struct i40e_pf *pf = np->vsi->back;
|
||||||
|
int err = -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (ndm->ndm_state & NUD_PERMANENT) {
|
||||||
|
netdev_info(dev, "FDB only supports static addresses\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pf->flags & I40E_FLAG_SRIOV_ENABLED) {
|
||||||
|
if (is_unicast_ether_addr(addr))
|
||||||
|
err = dev_uc_del(dev, addr);
|
||||||
|
else if (is_multicast_ether_addr(addr))
|
||||||
|
err = dev_mc_del(dev, addr);
|
||||||
|
else
|
||||||
|
err = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int i40e_ndo_fdb_dump(struct sk_buff *skb,
|
||||||
|
struct netlink_callback *cb,
|
||||||
|
struct net_device *dev,
|
||||||
|
int idx)
|
||||||
|
{
|
||||||
|
struct i40e_netdev_priv *np = netdev_priv(dev);
|
||||||
|
struct i40e_pf *pf = np->vsi->back;
|
||||||
|
|
||||||
|
if (pf->flags & I40E_FLAG_SRIOV_ENABLED)
|
||||||
|
idx = ndo_dflt_fdb_dump(skb, cb, dev, idx);
|
||||||
|
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* USE_DEFAULT_FDB_DEL_DUMP */
|
||||||
|
#endif /* HAVE_FDB_OPS */
|
||||||
static const struct net_device_ops i40e_netdev_ops = {
|
static const struct net_device_ops i40e_netdev_ops = {
|
||||||
.ndo_open = i40e_open,
|
.ndo_open = i40e_open,
|
||||||
.ndo_stop = i40e_close,
|
.ndo_stop = i40e_close,
|
||||||
@ -6671,6 +6761,13 @@ static const struct net_device_ops i40e_netdev_ops = {
|
|||||||
.ndo_add_vxlan_port = i40e_add_vxlan_port,
|
.ndo_add_vxlan_port = i40e_add_vxlan_port,
|
||||||
.ndo_del_vxlan_port = i40e_del_vxlan_port,
|
.ndo_del_vxlan_port = i40e_del_vxlan_port,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_FDB_OPS
|
||||||
|
.ndo_fdb_add = i40e_ndo_fdb_add,
|
||||||
|
#ifndef USE_DEFAULT_FDB_DEL_DUMP
|
||||||
|
.ndo_fdb_del = i40e_ndo_fdb_del,
|
||||||
|
.ndo_fdb_dump = i40e_ndo_fdb_dump,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user