Commit b04f0f03 authored by Ariel Levkovich's avatar Ariel Levkovich Committed by Jason Gunthorpe

IB/uverbs: Introduce a MPLS steering match filter

Add a new MPLS steering match filter that can match against
a single MPLS tag field.

Since the MPLS header can reside in different locations in the packet's
protocol stack as well as be encapsulated with a tunnel protocol, it
is required to know the exact location of the header in the protocol
stack.

Therefore, when including the MPLS protocol spec in the specs list,
it is mandatory to provide the list in an ordered manner, so
that it represents the actual header order in a matching packet.

Drivers that process the spec list and apply the matching rule
should treat the position of the MPLS spec in the spec list as the
actual location of the MPLS label in the packet's protocol stack.
Reviewed-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarAriel Levkovich <lariel@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 0d86bbec
...@@ -2959,6 +2959,17 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type, ...@@ -2959,6 +2959,17 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
memcpy(&ib_spec->gre.val, kern_spec_val, actual_filter_sz); memcpy(&ib_spec->gre.val, kern_spec_val, actual_filter_sz);
memcpy(&ib_spec->gre.mask, kern_spec_mask, actual_filter_sz); memcpy(&ib_spec->gre.mask, kern_spec_mask, actual_filter_sz);
break; break;
case IB_FLOW_SPEC_MPLS:
ib_filter_sz = offsetof(struct ib_flow_mpls_filter, real_sz);
actual_filter_sz = spec_filter_size(kern_spec_mask,
kern_filter_sz,
ib_filter_sz);
if (actual_filter_sz <= 0)
return -EINVAL;
ib_spec->mpls.size = sizeof(struct ib_flow_spec_mpls);
memcpy(&ib_spec->mpls.val, kern_spec_val, actual_filter_sz);
memcpy(&ib_spec->mpls.mask, kern_spec_mask, actual_filter_sz);
break;
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -3518,6 +3529,7 @@ int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file, ...@@ -3518,6 +3529,7 @@ int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file,
uflow_res); uflow_res);
if (err) if (err)
goto err_free; goto err_free;
flow_attr->size += flow_attr->size +=
((union ib_flow_spec *) ib_spec)->size; ((union ib_flow_spec *) ib_spec)->size;
cmd.flow_attr.size -= ((struct ib_uverbs_flow_spec *)kern_spec)->size; cmd.flow_attr.size -= ((struct ib_uverbs_flow_spec *)kern_spec)->size;
......
...@@ -1853,6 +1853,7 @@ enum ib_flow_spec_type { ...@@ -1853,6 +1853,7 @@ enum ib_flow_spec_type {
IB_FLOW_SPEC_UDP = 0x41, IB_FLOW_SPEC_UDP = 0x41,
IB_FLOW_SPEC_VXLAN_TUNNEL = 0x50, IB_FLOW_SPEC_VXLAN_TUNNEL = 0x50,
IB_FLOW_SPEC_GRE = 0x51, IB_FLOW_SPEC_GRE = 0x51,
IB_FLOW_SPEC_MPLS = 0x60,
IB_FLOW_SPEC_INNER = 0x100, IB_FLOW_SPEC_INNER = 0x100,
/* Actions */ /* Actions */
IB_FLOW_SPEC_ACTION_TAG = 0x1000, IB_FLOW_SPEC_ACTION_TAG = 0x1000,
...@@ -2010,6 +2011,19 @@ struct ib_flow_spec_gre { ...@@ -2010,6 +2011,19 @@ struct ib_flow_spec_gre {
struct ib_flow_gre_filter mask; struct ib_flow_gre_filter mask;
}; };
struct ib_flow_mpls_filter {
__be32 tag;
/* Must be last */
u8 real_sz[0];
};
struct ib_flow_spec_mpls {
u32 type;
u16 size;
struct ib_flow_mpls_filter val;
struct ib_flow_mpls_filter mask;
};
struct ib_flow_spec_action_tag { struct ib_flow_spec_action_tag {
enum ib_flow_spec_type type; enum ib_flow_spec_type type;
u16 size; u16 size;
...@@ -2040,6 +2054,7 @@ union ib_flow_spec { ...@@ -2040,6 +2054,7 @@ union ib_flow_spec {
struct ib_flow_spec_tunnel tunnel; struct ib_flow_spec_tunnel tunnel;
struct ib_flow_spec_esp esp; struct ib_flow_spec_esp esp;
struct ib_flow_spec_gre gre; struct ib_flow_spec_gre gre;
struct ib_flow_spec_mpls mpls;
struct ib_flow_spec_action_tag flow_tag; struct ib_flow_spec_action_tag flow_tag;
struct ib_flow_spec_action_drop drop; struct ib_flow_spec_action_drop drop;
struct ib_flow_spec_action_handle action; struct ib_flow_spec_action_handle action;
......
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