static int fl_set_key_mpls(struct nlattr **tb,
                           struct flow_dissector_key_mpls *key_val,
-                          struct flow_dissector_key_mpls *key_mask)
+                          struct flow_dissector_key_mpls *key_mask,
+                          struct netlink_ext_ack *extack)
 {
        if (tb[TCA_FLOWER_KEY_MPLS_TTL]) {
                key_val->mpls_ttl = nla_get_u8(tb[TCA_FLOWER_KEY_MPLS_TTL]);
        if (tb[TCA_FLOWER_KEY_MPLS_BOS]) {
                u8 bos = nla_get_u8(tb[TCA_FLOWER_KEY_MPLS_BOS]);
 
-               if (bos & ~MPLS_BOS_MASK)
+               if (bos & ~MPLS_BOS_MASK) {
+                       NL_SET_ERR_MSG_ATTR(extack,
+                                           tb[TCA_FLOWER_KEY_MPLS_BOS],
+                                           "Bottom Of Stack (BOS) must be 0 or 1");
                        return -EINVAL;
+               }
                key_val->mpls_bos = bos;
                key_mask->mpls_bos = MPLS_BOS_MASK;
        }
        if (tb[TCA_FLOWER_KEY_MPLS_TC]) {
                u8 tc = nla_get_u8(tb[TCA_FLOWER_KEY_MPLS_TC]);
 
-               if (tc & ~MPLS_TC_MASK)
+               if (tc & ~MPLS_TC_MASK) {
+                       NL_SET_ERR_MSG_ATTR(extack,
+                                           tb[TCA_FLOWER_KEY_MPLS_TC],
+                                           "Traffic Class (TC) must be between 0 and 7");
                        return -EINVAL;
+               }
                key_val->mpls_tc = tc;
                key_mask->mpls_tc = MPLS_TC_MASK;
        }
        if (tb[TCA_FLOWER_KEY_MPLS_LABEL]) {
                u32 label = nla_get_u32(tb[TCA_FLOWER_KEY_MPLS_LABEL]);
 
-               if (label & ~MPLS_LABEL_MASK)
+               if (label & ~MPLS_LABEL_MASK) {
+                       NL_SET_ERR_MSG_ATTR(extack,
+                                           tb[TCA_FLOWER_KEY_MPLS_LABEL],
+                                           "Label must be between 0 and 1048575");
                        return -EINVAL;
+               }
                key_val->mpls_label = label;
                key_mask->mpls_label = MPLS_LABEL_MASK;
        }
                               sizeof(key->icmp.code));
        } else if (key->basic.n_proto == htons(ETH_P_MPLS_UC) ||
                   key->basic.n_proto == htons(ETH_P_MPLS_MC)) {
-               ret = fl_set_key_mpls(tb, &key->mpls, &mask->mpls);
+               ret = fl_set_key_mpls(tb, &key->mpls, &mask->mpls, extack);
                if (ret)
                        return ret;
        } else if (key->basic.n_proto == htons(ETH_P_ARP) ||