@@ -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
5556struct 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
432437static 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+
531549static 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+
10851119static 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