NLA_S32,
        NLA_S64,
        NLA_BITFIELD32,
+       NLA_REJECT,
        __NLA_TYPE_MAX,
 };
 
  *    NLA_MSECS            Leaving the length field zero will verify the
  *                         given type fits, using it verifies minimum length
  *                         just like "All other"
- *    NLA_BITFIELD32      A 32-bit bitmap/bitselector attribute
+ *    NLA_BITFIELD32       Unused
+ *    NLA_REJECT           Unused
  *    All other            Minimum length of attribute payload
  *
+ * Meaning of `validation_data' field:
+ *    NLA_BITFIELD32       This is a 32-bit bitmap/bitselector attribute and
+ *                         validation data must point to a u32 value of valid
+ *                         flags
+ *    NLA_REJECT           This attribute is always rejected and validation data
+ *                         may point to a string to report as the error instead
+ *                         of the generic one in extended ACK.
+ *    All other            Unused
+ *
  * Example:
  * static const struct nla_policy my_policy[ATTR_MAX+1] = {
  *     [ATTR_FOO] = { .type = NLA_U16 },
 
 }
 
 static int validate_nla(const struct nlattr *nla, int maxtype,
-                       const struct nla_policy *policy)
+                       const struct nla_policy *policy,
+                       const char **error_msg)
 {
        const struct nla_policy *pt;
        int minlen = 0, attrlen = nla_len(nla), type = nla_type(nla);
        }
 
        switch (pt->type) {
+       case NLA_REJECT:
+               if (pt->validation_data && error_msg)
+                       *error_msg = pt->validation_data;
+               return -EINVAL;
+
        case NLA_FLAG:
                if (attrlen > 0)
                        return -ERANGE;
        int rem;
 
        nla_for_each_attr(nla, head, len, rem) {
-               int err = validate_nla(nla, maxtype, policy);
+               int err = validate_nla(nla, maxtype, policy, NULL);
 
                if (err < 0) {
-                       if (extack)
-                               extack->bad_attr = nla;
+                       NL_SET_BAD_ATTR(extack, nla);
                        return err;
                }
        }
                u16 type = nla_type(nla);
 
                if (type > 0 && type <= maxtype) {
+                       static const char _msg[] = "Attribute failed policy validation";
+                       const char *msg = _msg;
+
                        if (policy) {
-                               err = validate_nla(nla, maxtype, policy);
+                               err = validate_nla(nla, maxtype, policy, &msg);
                                if (err < 0) {
-                                       NL_SET_ERR_MSG_ATTR(extack, nla,
-                                                           "Attribute failed policy validation");
+                                       NL_SET_BAD_ATTR(extack, nla);
+                                       if (extack)
+                                               extack->_msg = msg;
                                        goto errout;
                                }
                        }