@@ -43,6 +43,7 @@ struct fl_flow_key {
43
43
struct flow_dissector_key_ipv4_addrs enc_ipv4 ;
44
44
struct flow_dissector_key_ipv6_addrs enc_ipv6 ;
45
45
};
46
+ struct flow_dissector_key_ports enc_tp ;
46
47
} __aligned (BITS_PER_LONG / 8 ); /* Ensure that we can do comparisons as longs. */
47
48
48
49
struct fl_flow_mask_range {
@@ -155,6 +156,8 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp,
155
156
}
156
157
157
158
skb_key .enc_key_id .keyid = tunnel_id_to_key32 (key -> tun_id );
159
+ skb_key .enc_tp .src = key -> tp_src ;
160
+ skb_key .enc_tp .dst = key -> tp_dst ;
158
161
}
159
162
160
163
skb_key .indev_ifindex = skb -> skb_iif ;
@@ -348,6 +351,10 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = {
348
351
[TCA_FLOWER_KEY_SCTP_DST_MASK ] = { .type = NLA_U16 },
349
352
[TCA_FLOWER_KEY_SCTP_SRC ] = { .type = NLA_U16 },
350
353
[TCA_FLOWER_KEY_SCTP_DST ] = { .type = NLA_U16 },
354
+ [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT ] = { .type = NLA_U16 },
355
+ [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK ] = { .type = NLA_U16 },
356
+ [TCA_FLOWER_KEY_ENC_UDP_DST_PORT ] = { .type = NLA_U16 },
357
+ [TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK ] = { .type = NLA_U16 },
351
358
};
352
359
353
360
static void fl_set_key_val (struct nlattr * * tb ,
@@ -500,6 +507,14 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
500
507
& mask -> enc_key_id .keyid , TCA_FLOWER_UNSPEC ,
501
508
sizeof (key -> enc_key_id .keyid ));
502
509
510
+ fl_set_key_val (tb , & key -> enc_tp .src , TCA_FLOWER_KEY_ENC_UDP_SRC_PORT ,
511
+ & mask -> enc_tp .src , TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK ,
512
+ sizeof (key -> enc_tp .src ));
513
+
514
+ fl_set_key_val (tb , & key -> enc_tp .dst , TCA_FLOWER_KEY_ENC_UDP_DST_PORT ,
515
+ & mask -> enc_tp .dst , TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK ,
516
+ sizeof (key -> enc_tp .dst ));
517
+
503
518
return 0 ;
504
519
}
505
520
@@ -577,6 +592,8 @@ static void fl_init_dissector(struct cls_fl_head *head,
577
592
FL_KEY_IS_MASKED (& mask -> key , enc_ipv6 ))
578
593
FL_KEY_SET (keys , cnt , FLOW_DISSECTOR_KEY_ENC_CONTROL ,
579
594
enc_control );
595
+ FL_KEY_SET_IF_MASKED (& mask -> key , keys , cnt ,
596
+ FLOW_DISSECTOR_KEY_ENC_PORTS , enc_tp );
580
597
581
598
skb_flow_dissector_init (& head -> dissector , keys , cnt );
582
599
}
@@ -951,7 +968,17 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
951
968
952
969
if (fl_dump_key_val (skb , & key -> enc_key_id , TCA_FLOWER_KEY_ENC_KEY_ID ,
953
970
& mask -> enc_key_id , TCA_FLOWER_UNSPEC ,
954
- sizeof (key -> enc_key_id )))
971
+ sizeof (key -> enc_key_id )) ||
972
+ fl_dump_key_val (skb , & key -> enc_tp .src ,
973
+ TCA_FLOWER_KEY_ENC_UDP_SRC_PORT ,
974
+ & mask -> enc_tp .src ,
975
+ TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK ,
976
+ sizeof (key -> enc_tp .src )) ||
977
+ fl_dump_key_val (skb , & key -> enc_tp .dst ,
978
+ TCA_FLOWER_KEY_ENC_UDP_DST_PORT ,
979
+ & mask -> enc_tp .dst ,
980
+ TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK ,
981
+ sizeof (key -> enc_tp .dst )))
955
982
goto nla_put_failure ;
956
983
957
984
nla_put_u32 (skb , TCA_FLOWER_FLAGS , f -> flags );
0 commit comments