@@ -766,7 +766,8 @@ static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
766
766
767
767
static int fl_set_key_mpls (struct nlattr * * tb ,
768
768
struct flow_dissector_key_mpls * key_val ,
769
- struct flow_dissector_key_mpls * key_mask )
769
+ struct flow_dissector_key_mpls * key_mask ,
770
+ struct netlink_ext_ack * extack )
770
771
{
771
772
if (tb [TCA_FLOWER_KEY_MPLS_TTL ]) {
772
773
key_val -> mpls_ttl = nla_get_u8 (tb [TCA_FLOWER_KEY_MPLS_TTL ]);
@@ -775,24 +776,36 @@ static int fl_set_key_mpls(struct nlattr **tb,
775
776
if (tb [TCA_FLOWER_KEY_MPLS_BOS ]) {
776
777
u8 bos = nla_get_u8 (tb [TCA_FLOWER_KEY_MPLS_BOS ]);
777
778
778
- if (bos & ~MPLS_BOS_MASK )
779
+ if (bos & ~MPLS_BOS_MASK ) {
780
+ NL_SET_ERR_MSG_ATTR (extack ,
781
+ tb [TCA_FLOWER_KEY_MPLS_BOS ],
782
+ "Bottom Of Stack (BOS) must be 0 or 1" );
779
783
return - EINVAL ;
784
+ }
780
785
key_val -> mpls_bos = bos ;
781
786
key_mask -> mpls_bos = MPLS_BOS_MASK ;
782
787
}
783
788
if (tb [TCA_FLOWER_KEY_MPLS_TC ]) {
784
789
u8 tc = nla_get_u8 (tb [TCA_FLOWER_KEY_MPLS_TC ]);
785
790
786
- if (tc & ~MPLS_TC_MASK )
791
+ if (tc & ~MPLS_TC_MASK ) {
792
+ NL_SET_ERR_MSG_ATTR (extack ,
793
+ tb [TCA_FLOWER_KEY_MPLS_TC ],
794
+ "Traffic Class (TC) must be between 0 and 7" );
787
795
return - EINVAL ;
796
+ }
788
797
key_val -> mpls_tc = tc ;
789
798
key_mask -> mpls_tc = MPLS_TC_MASK ;
790
799
}
791
800
if (tb [TCA_FLOWER_KEY_MPLS_LABEL ]) {
792
801
u32 label = nla_get_u32 (tb [TCA_FLOWER_KEY_MPLS_LABEL ]);
793
802
794
- if (label & ~MPLS_LABEL_MASK )
803
+ if (label & ~MPLS_LABEL_MASK ) {
804
+ NL_SET_ERR_MSG_ATTR (extack ,
805
+ tb [TCA_FLOWER_KEY_MPLS_LABEL ],
806
+ "Label must be between 0 and 1048575" );
795
807
return - EINVAL ;
808
+ }
796
809
key_val -> mpls_label = label ;
797
810
key_mask -> mpls_label = MPLS_LABEL_MASK ;
798
811
}
@@ -1364,7 +1377,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
1364
1377
sizeof (key -> icmp .code ));
1365
1378
} else if (key -> basic .n_proto == htons (ETH_P_MPLS_UC ) ||
1366
1379
key -> basic .n_proto == htons (ETH_P_MPLS_MC )) {
1367
- ret = fl_set_key_mpls (tb , & key -> mpls , & mask -> mpls );
1380
+ ret = fl_set_key_mpls (tb , & key -> mpls , & mask -> mpls , extack );
1368
1381
if (ret )
1369
1382
return ret ;
1370
1383
} else if (key -> basic .n_proto == htons (ETH_P_ARP ) ||
0 commit comments