Commit 2bda0a5e authored by Louis Peens's avatar Louis Peens Committed by David S. Miller
Browse files

nfp: flower: move non-zero chain check



This is in preparation for conntrack offload support which makes
used of different chains. Add explicit checks for conntrack and
non-zero chains in the add_offload path.

Signed-off-by: default avatarLouis Peens <louis.peens@corigine.com>
Signed-off-by: default avatarYinjun Zhang <yinjun.zhang@corigine.com>
Signed-off-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5debe0b3
Loading
Loading
Loading
Loading
+19 −5
Original line number Original line Diff line number Diff line
@@ -1276,6 +1276,20 @@ nfp_flower_validate_pre_tun_rule(struct nfp_app *app,
	return 0;
	return 0;
}
}


static bool offload_pre_check(struct flow_cls_offload *flow)
{
	struct flow_rule *rule = flow_cls_offload_flow_rule(flow);
	struct flow_dissector *dissector = rule->match.dissector;

	if (dissector->used_keys & BIT(FLOW_DISSECTOR_KEY_CT))
		return false;

	if (flow->common.chain_index)
		return false;

	return true;
}

/**
/**
 * nfp_flower_add_offload() - Adds a new flow to hardware.
 * nfp_flower_add_offload() - Adds a new flow to hardware.
 * @app:	Pointer to the APP handle
 * @app:	Pointer to the APP handle
@@ -1302,6 +1316,9 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
	if (nfp_netdev_is_nfp_repr(netdev))
	if (nfp_netdev_is_nfp_repr(netdev))
		port = nfp_port_from_netdev(netdev);
		port = nfp_port_from_netdev(netdev);


	if (!offload_pre_check(flow))
		return -EOPNOTSUPP;

	key_layer = kmalloc(sizeof(*key_layer), GFP_KERNEL);
	key_layer = kmalloc(sizeof(*key_layer), GFP_KERNEL);
	if (!key_layer)
	if (!key_layer)
		return -ENOMEM;
		return -ENOMEM;
@@ -1646,9 +1663,10 @@ nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
					void *type_data, void *cb_priv)
					void *type_data, void *cb_priv)
{
{
	struct flow_cls_common_offload *common = type_data;
	struct nfp_repr *repr = cb_priv;
	struct nfp_repr *repr = cb_priv;


	if (!tc_cls_can_offload_and_chain0(repr->netdev, type_data))
	if (!tc_can_offload_extack(repr->netdev, common->extack))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	switch (type) {
	switch (type) {
@@ -1746,10 +1764,6 @@ static int nfp_flower_setup_indr_block_cb(enum tc_setup_type type,
					  void *type_data, void *cb_priv)
					  void *type_data, void *cb_priv)
{
{
	struct nfp_flower_indr_block_cb_priv *priv = cb_priv;
	struct nfp_flower_indr_block_cb_priv *priv = cb_priv;
	struct flow_cls_offload *flower = type_data;

	if (flower->common.chain_index)
		return -EOPNOTSUPP;


	switch (type) {
	switch (type) {
	case TC_SETUP_CLSFLOWER:
	case TC_SETUP_CLSFLOWER: