Skip to content

Commit 4d80cc0

Browse files
ogerlitzdavem330
authored andcommitted
net/sched: cls_flower: add support for matching on ip tos and ttl
Benefit from the support of ip header fields dissection and allow users to set rules matching on ipv4 tos and ttl or ipv6 traffic-class and hoplimit. Signed-off-by: Or Gerlitz <[email protected]> Reviewed-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 518d8a2 commit 4d80cc0

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

include/uapi/linux/pkt_cls.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,11 @@ enum {
454454
TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */
455455
TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */
456456

457+
TCA_FLOWER_KEY_IP_TOS, /* u8 */
458+
TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */
459+
TCA_FLOWER_KEY_IP_TTL, /* u8 */
460+
TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */
461+
457462
__TCA_FLOWER_MAX,
458463
};
459464

net/sched/cls_flower.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct fl_flow_key {
5050
struct flow_dissector_key_ports enc_tp;
5151
struct flow_dissector_key_mpls mpls;
5252
struct flow_dissector_key_tcp tcp;
53+
struct flow_dissector_key_ip ip;
5354
} __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */
5455

5556
struct fl_flow_mask_range {
@@ -427,6 +428,10 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = {
427428
[TCA_FLOWER_KEY_MPLS_LABEL] = { .type = NLA_U32 },
428429
[TCA_FLOWER_KEY_TCP_FLAGS] = { .type = NLA_U16 },
429430
[TCA_FLOWER_KEY_TCP_FLAGS_MASK] = { .type = NLA_U16 },
431+
[TCA_FLOWER_KEY_IP_TOS] = { .type = NLA_U8 },
432+
[TCA_FLOWER_KEY_IP_TOS_MASK] = { .type = NLA_U8 },
433+
[TCA_FLOWER_KEY_IP_TTL] = { .type = NLA_U8 },
434+
[TCA_FLOWER_KEY_IP_TTL_MASK] = { .type = NLA_U8 },
430435
};
431436

432437
static void fl_set_key_val(struct nlattr **tb,
@@ -528,6 +533,19 @@ static int fl_set_key_flags(struct nlattr **tb,
528533
return 0;
529534
}
530535

536+
static void fl_set_key_ip(struct nlattr **tb,
537+
struct flow_dissector_key_ip *key,
538+
struct flow_dissector_key_ip *mask)
539+
{
540+
fl_set_key_val(tb, &key->tos, TCA_FLOWER_KEY_IP_TOS,
541+
&mask->tos, TCA_FLOWER_KEY_IP_TOS_MASK,
542+
sizeof(key->tos));
543+
544+
fl_set_key_val(tb, &key->ttl, TCA_FLOWER_KEY_IP_TTL,
545+
&mask->ttl, TCA_FLOWER_KEY_IP_TTL_MASK,
546+
sizeof(key->ttl));
547+
}
548+
531549
static int fl_set_key(struct net *net, struct nlattr **tb,
532550
struct fl_flow_key *key, struct fl_flow_key *mask)
533551
{
@@ -570,6 +588,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
570588
fl_set_key_val(tb, &key->basic.ip_proto, TCA_FLOWER_KEY_IP_PROTO,
571589
&mask->basic.ip_proto, TCA_FLOWER_UNSPEC,
572590
sizeof(key->basic.ip_proto));
591+
fl_set_key_ip(tb, &key->ip, &mask->ip);
573592
}
574593

575594
if (tb[TCA_FLOWER_KEY_IPV4_SRC] || tb[TCA_FLOWER_KEY_IPV4_DST]) {
@@ -772,6 +791,8 @@ static void fl_init_dissector(struct cls_fl_head *head,
772791
FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6);
773792
FL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,
774793
FLOW_DISSECTOR_KEY_PORTS, tp);
794+
FL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,
795+
FLOW_DISSECTOR_KEY_IP, ip);
775796
FL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,
776797
FLOW_DISSECTOR_KEY_TCP, tcp);
777798
FL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,
@@ -1082,6 +1103,19 @@ static int fl_dump_key_mpls(struct sk_buff *skb,
10821103
return 0;
10831104
}
10841105

1106+
static int fl_dump_key_ip(struct sk_buff *skb,
1107+
struct flow_dissector_key_ip *key,
1108+
struct flow_dissector_key_ip *mask)
1109+
{
1110+
if (fl_dump_key_val(skb, &key->tos, TCA_FLOWER_KEY_IP_TOS, &mask->tos,
1111+
TCA_FLOWER_KEY_IP_TOS_MASK, sizeof(key->tos)) ||
1112+
fl_dump_key_val(skb, &key->ttl, TCA_FLOWER_KEY_IP_TTL, &mask->ttl,
1113+
TCA_FLOWER_KEY_IP_TTL_MASK, sizeof(key->ttl)))
1114+
return -1;
1115+
1116+
return 0;
1117+
}
1118+
10851119
static int fl_dump_key_vlan(struct sk_buff *skb,
10861120
struct flow_dissector_key_vlan *vlan_key,
10871121
struct flow_dissector_key_vlan *vlan_mask)
@@ -1195,9 +1229,10 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
11951229

11961230
if ((key->basic.n_proto == htons(ETH_P_IP) ||
11971231
key->basic.n_proto == htons(ETH_P_IPV6)) &&
1198-
fl_dump_key_val(skb, &key->basic.ip_proto, TCA_FLOWER_KEY_IP_PROTO,
1232+
(fl_dump_key_val(skb, &key->basic.ip_proto, TCA_FLOWER_KEY_IP_PROTO,
11991233
&mask->basic.ip_proto, TCA_FLOWER_UNSPEC,
1200-
sizeof(key->basic.ip_proto)))
1234+
sizeof(key->basic.ip_proto)) ||
1235+
fl_dump_key_ip(skb, &key->ip, &mask->ip)))
12011236
goto nla_put_failure;
12021237

12031238
if (key->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS &&

0 commit comments

Comments
 (0)