Skip to content

Commit ef210ec

Browse files
committed
Merge branch 'mlxsw-ttl-tos'
Jiri Pirko says: ==================== mlxsw: offloading matches on ip ttl and tos Or says: Support offloading matches on ip ttl and tos ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents b145425 + 87996f9 commit ef210ec

File tree

4 files changed

+54
-2
lines changed

4 files changed

+54
-2
lines changed

drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ enum mlxsw_afk_element {
5757
MLXSW_AFK_ELEMENT_VID,
5858
MLXSW_AFK_ELEMENT_PCP,
5959
MLXSW_AFK_ELEMENT_TCP_FLAGS,
60+
MLXSW_AFK_ELEMENT_IP_TTL_,
61+
MLXSW_AFK_ELEMENT_IP_ECN,
62+
MLXSW_AFK_ELEMENT_IP_DSCP,
6063
MLXSW_AFK_ELEMENT_MAX,
6164
};
6265

@@ -104,6 +107,9 @@ static const struct mlxsw_afk_element_info mlxsw_afk_element_infos[] = {
104107
MLXSW_AFK_ELEMENT_INFO_U32(VID, 0x10, 8, 12),
105108
MLXSW_AFK_ELEMENT_INFO_U32(PCP, 0x10, 20, 3),
106109
MLXSW_AFK_ELEMENT_INFO_U32(TCP_FLAGS, 0x10, 23, 9),
110+
MLXSW_AFK_ELEMENT_INFO_U32(IP_TTL_, 0x14, 0, 8),
111+
MLXSW_AFK_ELEMENT_INFO_U32(IP_ECN, 0x14, 9, 2),
112+
MLXSW_AFK_ELEMENT_INFO_U32(IP_DSCP, 0x14, 11, 6),
107113
MLXSW_AFK_ELEMENT_INFO_U32(SRC_IP4, 0x18, 0, 32),
108114
MLXSW_AFK_ELEMENT_INFO_U32(DST_IP4, 0x1C, 0, 32),
109115
MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP6_HI, 0x18, 8),

drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_dip[] = {
7070

7171
static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4[] = {
7272
MLXSW_AFK_ELEMENT_INST_U32(SRC_IP4, 0x00, 0, 32),
73+
MLXSW_AFK_ELEMENT_INST_U32(IP_ECN, 0x04, 4, 2),
74+
MLXSW_AFK_ELEMENT_INST_U32(IP_TTL_, 0x04, 24, 8),
75+
MLXSW_AFK_ELEMENT_INST_U32(IP_DSCP, 0x08, 0, 6),
7376
MLXSW_AFK_ELEMENT_INST_U32(TCP_FLAGS, 0x08, 8, 9), /* TCP_CONTROL+TCP_ECN */
7477
};
7578

drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,9 @@ static const enum mlxsw_afk_element mlxsw_sp_acl_tcam_pattern_ipv4[] = {
984984
MLXSW_AFK_ELEMENT_VID,
985985
MLXSW_AFK_ELEMENT_PCP,
986986
MLXSW_AFK_ELEMENT_TCP_FLAGS,
987+
MLXSW_AFK_ELEMENT_IP_TTL_,
988+
MLXSW_AFK_ELEMENT_IP_ECN,
989+
MLXSW_AFK_ELEMENT_IP_DSCP,
987990
};
988991

989992
static const enum mlxsw_afk_element mlxsw_sp_acl_tcam_pattern_ipv6[] = {

drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,46 @@ static int mlxsw_sp_flower_parse_tcp(struct mlxsw_sp *mlxsw_sp,
212212
return 0;
213213
}
214214

215+
static int mlxsw_sp_flower_parse_ip(struct mlxsw_sp *mlxsw_sp,
216+
struct mlxsw_sp_acl_rule_info *rulei,
217+
struct tc_cls_flower_offload *f,
218+
u16 n_proto)
219+
{
220+
struct flow_dissector_key_ip *key, *mask;
221+
222+
if (!dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_IP))
223+
return 0;
224+
225+
if (n_proto != ETH_P_IP && n_proto != ETH_P_IPV6) {
226+
dev_err(mlxsw_sp->bus_info->dev, "IP keys supported only for IPv4/6\n");
227+
return -EINVAL;
228+
}
229+
230+
key = skb_flow_dissector_target(f->dissector,
231+
FLOW_DISSECTOR_KEY_IP,
232+
f->key);
233+
mask = skb_flow_dissector_target(f->dissector,
234+
FLOW_DISSECTOR_KEY_IP,
235+
f->mask);
236+
mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_IP_TTL_,
237+
key->ttl, mask->ttl);
238+
239+
mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_IP_ECN,
240+
key->tos & 0x3, mask->tos & 0x3);
241+
242+
mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_IP_DSCP,
243+
key->tos >> 6, mask->tos >> 6);
244+
245+
return 0;
246+
}
247+
215248
static int mlxsw_sp_flower_parse(struct mlxsw_sp *mlxsw_sp,
216249
struct net_device *dev,
217250
struct mlxsw_sp_acl_rule_info *rulei,
218251
struct tc_cls_flower_offload *f)
219252
{
253+
u16 n_proto_mask = 0;
254+
u16 n_proto_key = 0;
220255
u16 addr_type = 0;
221256
u8 ip_proto = 0;
222257
int err;
@@ -229,6 +264,7 @@ static int mlxsw_sp_flower_parse(struct mlxsw_sp *mlxsw_sp,
229264
BIT(FLOW_DISSECTOR_KEY_IPV6_ADDRS) |
230265
BIT(FLOW_DISSECTOR_KEY_PORTS) |
231266
BIT(FLOW_DISSECTOR_KEY_TCP) |
267+
BIT(FLOW_DISSECTOR_KEY_IP) |
232268
BIT(FLOW_DISSECTOR_KEY_VLAN))) {
233269
dev_err(mlxsw_sp->bus_info->dev, "Unsupported key\n");
234270
return -EOPNOTSUPP;
@@ -253,8 +289,8 @@ static int mlxsw_sp_flower_parse(struct mlxsw_sp *mlxsw_sp,
253289
skb_flow_dissector_target(f->dissector,
254290
FLOW_DISSECTOR_KEY_BASIC,
255291
f->mask);
256-
u16 n_proto_key = ntohs(key->n_proto);
257-
u16 n_proto_mask = ntohs(mask->n_proto);
292+
n_proto_key = ntohs(key->n_proto);
293+
n_proto_mask = ntohs(mask->n_proto);
258294

259295
if (n_proto_key == ETH_P_ALL) {
260296
n_proto_key = 0;
@@ -324,6 +360,10 @@ static int mlxsw_sp_flower_parse(struct mlxsw_sp *mlxsw_sp,
324360
if (err)
325361
return err;
326362

363+
err = mlxsw_sp_flower_parse_ip(mlxsw_sp, rulei, f, n_proto_key & n_proto_mask);
364+
if (err)
365+
return err;
366+
327367
return mlxsw_sp_flower_parse_actions(mlxsw_sp, dev, rulei, f->exts);
328368
}
329369

0 commit comments

Comments
 (0)