bnxt_tc: update indirect block support
Register ndo callback via flow_indr_dev_register() and flow_indr_dev_unregister(). Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
50c1b1c938
commit
e445e30cf7
@@ -1870,7 +1870,6 @@ struct bnxt {
|
|||||||
u8 dsn[8];
|
u8 dsn[8];
|
||||||
struct bnxt_tc_info *tc_info;
|
struct bnxt_tc_info *tc_info;
|
||||||
struct list_head tc_indr_block_list;
|
struct list_head tc_indr_block_list;
|
||||||
struct notifier_block tc_netdev_nb;
|
|
||||||
struct dentry *debugfs_pdev;
|
struct dentry *debugfs_pdev;
|
||||||
struct device *hwmon_dev;
|
struct device *hwmon_dev;
|
||||||
};
|
};
|
||||||
|
@@ -1939,53 +1939,25 @@ static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bnxt_tc_setup_indr_cb(struct net_device *netdev, void *cb_priv,
|
|
||||||
enum tc_setup_type type, void *type_data)
|
|
||||||
{
|
|
||||||
switch (type) {
|
|
||||||
case TC_SETUP_BLOCK:
|
|
||||||
return bnxt_tc_setup_indr_block(netdev, cb_priv, type_data);
|
|
||||||
default:
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool bnxt_is_netdev_indr_offload(struct net_device *netdev)
|
static bool bnxt_is_netdev_indr_offload(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
return netif_is_vxlan(netdev);
|
return netif_is_vxlan(netdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bnxt_tc_indr_block_event(struct notifier_block *nb,
|
static int bnxt_tc_setup_indr_cb(struct net_device *netdev, void *cb_priv,
|
||||||
unsigned long event, void *ptr)
|
enum tc_setup_type type, void *type_data)
|
||||||
{
|
{
|
||||||
struct net_device *netdev;
|
|
||||||
struct bnxt *bp;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
netdev = netdev_notifier_info_to_dev(ptr);
|
|
||||||
if (!bnxt_is_netdev_indr_offload(netdev))
|
if (!bnxt_is_netdev_indr_offload(netdev))
|
||||||
return NOTIFY_OK;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
bp = container_of(nb, struct bnxt, tc_netdev_nb);
|
switch (type) {
|
||||||
|
case TC_SETUP_BLOCK:
|
||||||
switch (event) {
|
return bnxt_tc_setup_indr_block(netdev, cb_priv, type_data);
|
||||||
case NETDEV_REGISTER:
|
default:
|
||||||
rc = __flow_indr_block_cb_register(netdev, bp,
|
|
||||||
bnxt_tc_setup_indr_cb,
|
|
||||||
bp);
|
|
||||||
if (rc)
|
|
||||||
netdev_info(bp->dev,
|
|
||||||
"Failed to register indirect blk: dev: %s\n",
|
|
||||||
netdev->name);
|
|
||||||
break;
|
|
||||||
case NETDEV_UNREGISTER:
|
|
||||||
__flow_indr_block_cb_unregister(netdev,
|
|
||||||
bnxt_tc_setup_indr_cb,
|
|
||||||
bp);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NOTIFY_DONE;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct rhashtable_params bnxt_tc_flow_ht_params = {
|
static const struct rhashtable_params bnxt_tc_flow_ht_params = {
|
||||||
@@ -2074,8 +2046,8 @@ int bnxt_init_tc(struct bnxt *bp)
|
|||||||
|
|
||||||
/* init indirect block notifications */
|
/* init indirect block notifications */
|
||||||
INIT_LIST_HEAD(&bp->tc_indr_block_list);
|
INIT_LIST_HEAD(&bp->tc_indr_block_list);
|
||||||
bp->tc_netdev_nb.notifier_call = bnxt_tc_indr_block_event;
|
|
||||||
rc = register_netdevice_notifier(&bp->tc_netdev_nb);
|
rc = flow_indr_dev_register(bnxt_tc_setup_indr_cb, bp);
|
||||||
if (!rc)
|
if (!rc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -2101,7 +2073,8 @@ void bnxt_shutdown_tc(struct bnxt *bp)
|
|||||||
if (!bnxt_tc_flower_enabled(bp))
|
if (!bnxt_tc_flower_enabled(bp))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unregister_netdevice_notifier(&bp->tc_netdev_nb);
|
flow_indr_dev_unregister(bnxt_tc_setup_indr_cb, bp,
|
||||||
|
bnxt_tc_setup_indr_block_cb);
|
||||||
rhashtable_destroy(&tc_info->flow_table);
|
rhashtable_destroy(&tc_info->flow_table);
|
||||||
rhashtable_destroy(&tc_info->l2_table);
|
rhashtable_destroy(&tc_info->l2_table);
|
||||||
rhashtable_destroy(&tc_info->decap_l2_table);
|
rhashtable_destroy(&tc_info->decap_l2_table);
|
||||||
|
Reference in New Issue
Block a user