@@ -738,7 +738,8 @@ static void fl_set_key_val(struct nlattr **tb,
738
738
}
739
739
740
740
static int fl_set_key_port_range (struct nlattr * * tb , struct fl_flow_key * key ,
741
- struct fl_flow_key * mask )
741
+ struct fl_flow_key * mask ,
742
+ struct netlink_ext_ack * extack )
742
743
{
743
744
fl_set_key_val (tb , & key -> tp_range .tp_min .dst ,
744
745
TCA_FLOWER_KEY_PORT_DST_MIN , & mask -> tp_range .tp_min .dst ,
@@ -753,20 +754,30 @@ static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
753
754
TCA_FLOWER_KEY_PORT_SRC_MAX , & mask -> tp_range .tp_max .src ,
754
755
TCA_FLOWER_UNSPEC , sizeof (key -> tp_range .tp_max .src ));
755
756
756
- if (( mask -> tp_range .tp_min .dst && mask -> tp_range .tp_max .dst &&
757
- htons (key -> tp_range .tp_max .dst ) <=
758
- htons (key -> tp_range .tp_min .dst )) ||
759
- ( mask -> tp_range . tp_min . src && mask -> tp_range . tp_max . src &&
760
- htons ( key -> tp_range . tp_max . src ) <=
761
- htons ( key -> tp_range . tp_min . src )))
757
+ if (mask -> tp_range .tp_min .dst && mask -> tp_range .tp_max .dst &&
758
+ htons (key -> tp_range .tp_max .dst ) <=
759
+ htons (key -> tp_range .tp_min .dst )) {
760
+ NL_SET_ERR_MSG_ATTR ( extack ,
761
+ tb [ TCA_FLOWER_KEY_PORT_DST_MIN ],
762
+ "Invalid destination port range (min must be strictly smaller than max)" );
762
763
return - EINVAL ;
764
+ }
765
+ if (mask -> tp_range .tp_min .src && mask -> tp_range .tp_max .src &&
766
+ htons (key -> tp_range .tp_max .src ) <=
767
+ htons (key -> tp_range .tp_min .src )) {
768
+ NL_SET_ERR_MSG_ATTR (extack ,
769
+ tb [TCA_FLOWER_KEY_PORT_SRC_MIN ],
770
+ "Invalid source port range (min must be strictly smaller than max)" );
771
+ return - EINVAL ;
772
+ }
763
773
764
774
return 0 ;
765
775
}
766
776
767
777
static int fl_set_key_mpls (struct nlattr * * tb ,
768
778
struct flow_dissector_key_mpls * key_val ,
769
- struct flow_dissector_key_mpls * key_mask )
779
+ struct flow_dissector_key_mpls * key_mask ,
780
+ struct netlink_ext_ack * extack )
770
781
{
771
782
if (tb [TCA_FLOWER_KEY_MPLS_TTL ]) {
772
783
key_val -> mpls_ttl = nla_get_u8 (tb [TCA_FLOWER_KEY_MPLS_TTL ]);
@@ -775,24 +786,36 @@ static int fl_set_key_mpls(struct nlattr **tb,
775
786
if (tb [TCA_FLOWER_KEY_MPLS_BOS ]) {
776
787
u8 bos = nla_get_u8 (tb [TCA_FLOWER_KEY_MPLS_BOS ]);
777
788
778
- if (bos & ~MPLS_BOS_MASK )
789
+ if (bos & ~MPLS_BOS_MASK ) {
790
+ NL_SET_ERR_MSG_ATTR (extack ,
791
+ tb [TCA_FLOWER_KEY_MPLS_BOS ],
792
+ "Bottom Of Stack (BOS) must be 0 or 1" );
779
793
return - EINVAL ;
794
+ }
780
795
key_val -> mpls_bos = bos ;
781
796
key_mask -> mpls_bos = MPLS_BOS_MASK ;
782
797
}
783
798
if (tb [TCA_FLOWER_KEY_MPLS_TC ]) {
784
799
u8 tc = nla_get_u8 (tb [TCA_FLOWER_KEY_MPLS_TC ]);
785
800
786
- if (tc & ~MPLS_TC_MASK )
801
+ if (tc & ~MPLS_TC_MASK ) {
802
+ NL_SET_ERR_MSG_ATTR (extack ,
803
+ tb [TCA_FLOWER_KEY_MPLS_TC ],
804
+ "Traffic Class (TC) must be between 0 and 7" );
787
805
return - EINVAL ;
806
+ }
788
807
key_val -> mpls_tc = tc ;
789
808
key_mask -> mpls_tc = MPLS_TC_MASK ;
790
809
}
791
810
if (tb [TCA_FLOWER_KEY_MPLS_LABEL ]) {
792
811
u32 label = nla_get_u32 (tb [TCA_FLOWER_KEY_MPLS_LABEL ]);
793
812
794
- if (label & ~MPLS_LABEL_MASK )
813
+ if (label & ~MPLS_LABEL_MASK ) {
814
+ NL_SET_ERR_MSG_ATTR (extack ,
815
+ tb [TCA_FLOWER_KEY_MPLS_LABEL ],
816
+ "Label must be between 0 and 1048575" );
795
817
return - EINVAL ;
818
+ }
796
819
key_val -> mpls_label = label ;
797
820
key_mask -> mpls_label = MPLS_LABEL_MASK ;
798
821
}
@@ -833,14 +856,16 @@ static void fl_set_key_flag(u32 flower_key, u32 flower_mask,
833
856
}
834
857
}
835
858
836
- static int fl_set_key_flags (struct nlattr * * tb ,
837
- u32 * flags_key , u32 * flags_mask )
859
+ static int fl_set_key_flags (struct nlattr * * tb , u32 * flags_key ,
860
+ u32 * flags_mask , struct netlink_ext_ack * extack )
838
861
{
839
862
u32 key , mask ;
840
863
841
864
/* mask is mandatory for flags */
842
- if (!tb [TCA_FLOWER_KEY_FLAGS_MASK ])
865
+ if (!tb [TCA_FLOWER_KEY_FLAGS_MASK ]) {
866
+ NL_SET_ERR_MSG (extack , "Missing flags mask" );
843
867
return - EINVAL ;
868
+ }
844
869
845
870
key = be32_to_cpu (nla_get_u32 (tb [TCA_FLOWER_KEY_FLAGS ]));
846
871
mask = be32_to_cpu (nla_get_u32 (tb [TCA_FLOWER_KEY_FLAGS_MASK ]));
@@ -1364,7 +1389,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
1364
1389
sizeof (key -> icmp .code ));
1365
1390
} else if (key -> basic .n_proto == htons (ETH_P_MPLS_UC ) ||
1366
1391
key -> basic .n_proto == htons (ETH_P_MPLS_MC )) {
1367
- ret = fl_set_key_mpls (tb , & key -> mpls , & mask -> mpls );
1392
+ ret = fl_set_key_mpls (tb , & key -> mpls , & mask -> mpls , extack );
1368
1393
if (ret )
1369
1394
return ret ;
1370
1395
} else if (key -> basic .n_proto == htons (ETH_P_ARP ) ||
@@ -1389,7 +1414,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
1389
1414
if (key -> basic .ip_proto == IPPROTO_TCP ||
1390
1415
key -> basic .ip_proto == IPPROTO_UDP ||
1391
1416
key -> basic .ip_proto == IPPROTO_SCTP ) {
1392
- ret = fl_set_key_port_range (tb , key , mask );
1417
+ ret = fl_set_key_port_range (tb , key , mask , extack );
1393
1418
if (ret )
1394
1419
return ret ;
1395
1420
}
@@ -1451,7 +1476,8 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
1451
1476
return ret ;
1452
1477
1453
1478
if (tb [TCA_FLOWER_KEY_FLAGS ])
1454
- ret = fl_set_key_flags (tb , & key -> control .flags , & mask -> control .flags );
1479
+ ret = fl_set_key_flags (tb , & key -> control .flags ,
1480
+ & mask -> control .flags , extack );
1455
1481
1456
1482
return ret ;
1457
1483
}
0 commit comments