return err;
        }
 
-       err = nlmsg_parse(nlh, crypto_msg_min[type], attrs, CRYPTOCFGA_MAX,
-                         crypto_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, crypto_msg_min[type], attrs,
+                                    CRYPTOCFGA_MAX, crypto_policy, extack);
        if (err < 0)
                return err;
 
 
 
        err = drbd_nla_check_mandatory(maxtype, nla);
        if (!err)
-               err = nla_parse_nested(tb, maxtype, nla, policy, NULL);
+               err = nla_parse_nested_deprecated(tb, maxtype, nla, policy,
+                                                 NULL);
 
        return err;
 }
 
                                ret = -EINVAL;
                                goto out;
                        }
-                       ret = nla_parse_nested(socks, NBD_SOCK_MAX, attr,
-                                              nbd_sock_policy, info->extack);
+                       ret = nla_parse_nested_deprecated(socks, NBD_SOCK_MAX,
+                                                         attr,
+                                                         nbd_sock_policy,
+                                                         info->extack);
                        if (ret != 0) {
                                printk(KERN_ERR "nbd: error processing sock list\n");
                                ret = -EINVAL;
                                ret = -EINVAL;
                                goto out;
                        }
-                       ret = nla_parse_nested(socks, NBD_SOCK_MAX, attr,
-                                              nbd_sock_policy, info->extack);
+                       ret = nla_parse_nested_deprecated(socks, NBD_SOCK_MAX,
+                                                         attr,
+                                                         nbd_sock_policy,
+                                                         info->extack);
                        if (ret != 0) {
                                printk(KERN_ERR "nbd: error processing sock list\n");
                                ret = -EINVAL;
 
        if (nlh->nlmsg_flags & RDMA_NL_LS_F_ERR)
                return false;
 
-       ret = nla_parse(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
-                       nlmsg_len(nlh), ib_nl_addr_policy, NULL);
+       ret = nla_parse_deprecated(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
+                                  nlmsg_len(nlh), ib_nl_addr_policy, NULL);
        if (ret)
                return false;
 
 
        int ret;
        const char *err_str = "";
 
-       ret = nlmsg_validate(cb->nlh, nlh_len, policy_max - 1, nlmsg_policy,
-                            NULL);
+       ret = nlmsg_validate_deprecated(cb->nlh, nlh_len, policy_max - 1,
+                                       nlmsg_policy, NULL);
        if (ret) {
                err_str = "Invalid attribute";
                goto parse_nlmsg_error;
        }
-       ret = nlmsg_parse(cb->nlh, nlh_len, nltb, policy_max - 1,
-                         nlmsg_policy, NULL);
+       ret = nlmsg_parse_deprecated(cb->nlh, nlh_len, nltb, policy_max - 1,
+                                    nlmsg_policy, NULL);
        if (ret) {
                err_str = "Unable to parse the nlmsg";
                goto parse_nlmsg_error;
 
        u32 index;
        int err;
 
-       err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
                return -EINVAL;
 
        u32 index;
        int err;
 
-       err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1, nldev_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
                return -EINVAL;
 
        u32 port;
        int err;
 
-       err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (err ||
            !tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
            !tb[RDMA_NLDEV_ATTR_PORT_INDEX])
        int err;
        unsigned int p;
 
-       err = nlmsg_parse(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, NULL);
+       err = nlmsg_parse_deprecated(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, NULL);
        if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
                return -EINVAL;
 
        u32 index;
        int ret;
 
-       ret = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, extack);
+       ret = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (ret || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
                return -EINVAL;
 
        struct sk_buff *msg;
        int ret;
 
-       ret = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, extack);
+       ret = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (ret || !tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !fe->id || !tb[fe->id])
                return -EINVAL;
 
        u32 index, port = 0;
        bool filled = false;
 
-       err = nlmsg_parse(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, NULL);
+       err = nlmsg_parse_deprecated(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, NULL);
        /*
         * Right now, we are expecting the device index to get res information,
         * but it is possible to extend this code to return all devices in
        char type[IFNAMSIZ];
        int err;
 
-       err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (err || !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
            !tb[RDMA_NLDEV_ATTR_LINK_TYPE] || !tb[RDMA_NLDEV_ATTR_NDEV_NAME])
                return -EINVAL;
        u32 index;
        int err;
 
-       err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
-                         nldev_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
+                                    nldev_policy, extack);
        if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
                return -EINVAL;
 
 
            !(NETLINK_CB(skb).sk))
                return -EPERM;
 
-       ret = nla_parse(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
-                       nlmsg_len(nlh), ib_nl_policy, NULL);
+       ret = nla_parse_deprecated(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
+                                  nlmsg_len(nlh), ib_nl_policy, NULL);
        attr = (const struct nlattr *)tb[LS_NLA_TYPE_TIMEOUT];
        if (ret || !attr)
                goto settimeout_out;
        if (nlh->nlmsg_flags & RDMA_NL_LS_F_ERR)
                return 0;
 
-       ret = nla_parse(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
-                       nlmsg_len(nlh), ib_nl_policy, NULL);
+       ret = nla_parse_deprecated(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
+                                  nlmsg_len(nlh), ib_nl_policy, NULL);
        if (ret)
                return 0;
 
 
            !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
                return -EINVAL;
 
-       if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX,
-                            info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE],
-                            hwsim_edge_policy, NULL))
+       if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
                return -EINVAL;
 
        if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID])
            !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
                return -EINVAL;
 
-       if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX,
-                            info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE],
-                            hwsim_edge_policy, NULL))
+       if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
                return -EINVAL;
 
        if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID])
            !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
                return -EINVAL;
 
-       if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX,
-                            info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE],
-                            hwsim_edge_policy, NULL))
+       if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
                return -EINVAL;
 
        if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID] &&
 
        if (!attrs[MACSEC_ATTR_SA_CONFIG])
                return -EINVAL;
 
-       if (nla_parse_nested(tb_sa, MACSEC_SA_ATTR_MAX,
-                            attrs[MACSEC_ATTR_SA_CONFIG],
-                            macsec_genl_sa_policy, NULL))
+       if (nla_parse_nested_deprecated(tb_sa, MACSEC_SA_ATTR_MAX, attrs[MACSEC_ATTR_SA_CONFIG], macsec_genl_sa_policy, NULL))
                return -EINVAL;
 
        return 0;
        if (!attrs[MACSEC_ATTR_RXSC_CONFIG])
                return -EINVAL;
 
-       if (nla_parse_nested(tb_rxsc, MACSEC_RXSC_ATTR_MAX,
-                            attrs[MACSEC_ATTR_RXSC_CONFIG],
-                            macsec_genl_rxsc_policy, NULL))
+       if (nla_parse_nested_deprecated(tb_rxsc, MACSEC_RXSC_ATTR_MAX, attrs[MACSEC_ATTR_RXSC_CONFIG], macsec_genl_rxsc_policy, NULL))
                return -EINVAL;
 
        return 0;
 
                        err = -EINVAL;
                        goto team_put;
                }
-               err = nla_parse_nested(opt_attrs, TEAM_ATTR_OPTION_MAX,
-                                      nl_option, team_nl_option_policy,
-                                      info->extack);
+               err = nla_parse_nested_deprecated(opt_attrs,
+                                                 TEAM_ATTR_OPTION_MAX,
+                                                 nl_option,
+                                                 team_nl_option_policy,
+                                                 info->extack);
                if (err)
                        goto team_put;
                if (!opt_attrs[TEAM_ATTR_OPTION_NAME] ||
 
        struct nlattr *tb[ATH10K_TM_ATTR_MAX + 1];
        int ret;
 
-       ret = nla_parse(tb, ATH10K_TM_ATTR_MAX, data, len, ath10k_tm_policy,
-                       NULL);
+       ret = nla_parse_deprecated(tb, ATH10K_TM_ATTR_MAX, data, len,
+                                  ath10k_tm_policy, NULL);
        if (ret)
                return ret;
 
 
        int err, buf_len;
        void *buf;
 
-       err = nla_parse(tb, ATH6KL_TM_ATTR_MAX, data, len, ath6kl_tm_policy,
-                       NULL);
+       err = nla_parse_deprecated(tb, ATH6KL_TM_ATTR_MAX, data, len,
+                                  ath6kl_tm_policy, NULL);
        if (err)
                return err;
 
 
        unsigned short attr;
 
        wcn36xx_dbg_dump(WCN36XX_DBG_TESTMODE_DUMP, "Data:", data, len);
-       ret = nla_parse(tb, WCN36XX_TM_ATTR_MAX, data, len,
-                       wcn36xx_tm_policy, NULL);
+       ret = nla_parse_deprecated(tb, WCN36XX_TM_ATTR_MAX, data, len,
+                                  wcn36xx_tm_policy, NULL);
        if (ret)
                return ret;
 
 
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
 
-       rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
-                      wil_rf_sector_policy, NULL);
+       rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
+                                 data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
 
-       rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
-                      wil_rf_sector_policy, NULL);
+       rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
+                                 data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
        cmd.sector_type = sector_type;
        nla_for_each_nested(nl_cfg, tb[QCA_ATTR_DMG_RF_SECTOR_CFG],
                            tmp) {
-               rc = nla_parse_nested(tb2, QCA_ATTR_DMG_RF_SECTOR_CFG_MAX,
-                                     nl_cfg, wil_rf_sector_cfg_policy,
-                                     NULL);
+               rc = nla_parse_nested_deprecated(tb2,
+                                                QCA_ATTR_DMG_RF_SECTOR_CFG_MAX,
+                                                nl_cfg,
+                                                wil_rf_sector_cfg_policy,
+                                                NULL);
                if (rc) {
                        wil_err(wil, "invalid sector cfg\n");
                        return -EINVAL;
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
 
-       rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
-                      wil_rf_sector_policy, NULL);
+       rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
+                                 data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
        if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities))
                return -EOPNOTSUPP;
 
-       rc = nla_parse(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data, data_len,
-                      wil_rf_sector_policy, NULL);
+       rc = nla_parse_deprecated(tb, QCA_ATTR_DMG_RF_SECTOR_MAX, data,
+                                 data_len, wil_rf_sector_policy, NULL);
        if (rc) {
                wil_err(wil, "Invalid rf sector ATTR\n");
                return rc;
 
        int err;
        u32 noa_duration;
 
-       err = nla_parse(tb, IWL_MVM_TM_ATTR_MAX, data, len, iwl_mvm_tm_policy,
-                       NULL);
+       err = nla_parse_deprecated(tb, IWL_MVM_TM_ATTR_MAX, data, len,
+                                  iwl_mvm_tm_policy, NULL);
        if (err)
                return err;
 
 
        int err;
        u32 val;
 
-       err = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len,
-                       hwsim_vendor_test_policy, NULL);
+       err = nla_parse_deprecated(tb, QCA_WLAN_VENDOR_ATTR_MAX, data,
+                                  data_len, hwsim_vendor_test_policy, NULL);
        if (err)
                return err;
        if (!tb[QCA_WLAN_VENDOR_ATTR_TEST])
        struct sk_buff *skb;
        int err, ps;
 
-       err = nla_parse(tb, HWSIM_TM_ATTR_MAX, data, len,
-                       hwsim_testmode_policy, NULL);
+       err = nla_parse_deprecated(tb, HWSIM_TM_ATTR_MAX, data, len,
+                                  hwsim_testmode_policy, NULL);
        if (err)
                return err;
 
 
        if (!priv)
                return -EINVAL;
 
-       err = nla_parse(tb, MWIFIEX_TM_ATTR_MAX, data, len, mwifiex_tm_policy,
-                       NULL);
+       err = nla_parse_deprecated(tb, MWIFIEX_TM_ATTR_MAX, data, len,
+                                  mwifiex_tm_policy, NULL);
        if (err)
                return err;
 
 
        u32 nla_cmd;
        int err;
 
-       err = nla_parse(tb, WL1271_TM_ATTR_MAX, data, len, wl1271_tm_policy,
-                       NULL);
+       err = nla_parse_deprecated(tb, WL1271_TM_ATTR_MAX, data, len,
+                                  wl1271_tm_policy, NULL);
        if (err)
                return err;
 
 
        if (!data)
                return -EINVAL;
 
-       ret = nla_parse(tb, MAX_WLCORE_VENDOR_ATTR, data, data_len,
-                       wlcore_vendor_attr_policy, NULL);
+       ret = nla_parse_deprecated(tb, MAX_WLCORE_VENDOR_ATTR, data, data_len,
+                                  wlcore_vendor_attr_policy, NULL);
        if (ret)
                return ret;
 
        if (!data)
                return -EINVAL;
 
-       ret = nla_parse(tb, MAX_WLCORE_VENDOR_ATTR, data, data_len,
-                       wlcore_vendor_attr_policy, NULL);
+       ret = nla_parse_deprecated(tb, MAX_WLCORE_VENDOR_ATTR, data, data_len,
+                                  wlcore_vendor_attr_policy, NULL);
        if (ret)
                return ret;
 
 
 }
 
 /**
- * genlmsg_parse - parse attributes of a genetlink message
+ * genlmsg_parse_deprecated - parse attributes of a genetlink message
  * @nlh: netlink message header
  * @family: genetlink message family
  * @tb: destination array with maxtype+1 elements
  * @policy: validation policy
  * @extack: extended ACK report struct
  */
-static inline int genlmsg_parse(const struct nlmsghdr *nlh,
-                               const struct genl_family *family,
-                               struct nlattr *tb[], int maxtype,
-                               const struct nla_policy *policy,
-                               struct netlink_ext_ack *extack)
+static inline int genlmsg_parse_deprecated(const struct nlmsghdr *nlh,
+                                          const struct genl_family *family,
+                                          struct nlattr *tb[], int maxtype,
+                                          const struct nla_policy *policy,
+                                          struct netlink_ext_ack *extack)
 {
-       return nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
-                          policy, extack);
+       return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
+                            policy, NL_VALIDATE_LIBERAL, extack);
 }
 
 /**
 
        bool                    skip_notify;
 };
 
+/**
+ * enum netlink_validation - netlink message/attribute validation levels
+ * @NL_VALIDATE_LIBERAL: Old-style "be liberal" validation, not caring about
+ *     extra data at the end of the message, attributes being longer than
+ *     they should be, or unknown attributes being present.
+ * @NL_VALIDATE_TRAILING: Reject junk data encountered after attribute parsing.
+ * @NL_VALIDATE_MAXTYPE: Reject attributes > max type; Together with _TRAILING
+ *     this is equivalent to the old nla_parse_strict()/nlmsg_parse_strict().
+ * @NL_VALIDATE_UNSPEC: Reject attributes with NLA_UNSPEC in the policy.
+ *     This can safely be set by the kernel when the given policy has no
+ *     NLA_UNSPEC anymore, and can thus be used to ensure policy entries
+ *     are enforced going forward.
+ * @NL_VALIDATE_STRICT_ATTRS: strict attribute policy parsing (e.g.
+ *     U8, U16, U32 must have exact size, etc.)
+ */
+enum netlink_validation {
+       NL_VALIDATE_LIBERAL = 0,
+       NL_VALIDATE_TRAILING = BIT(0),
+       NL_VALIDATE_MAXTYPE = BIT(1),
+       NL_VALIDATE_UNSPEC = BIT(2),
+       NL_VALIDATE_STRICT_ATTRS = BIT(3),
+};
+
+#define NL_VALIDATE_DEPRECATED_STRICT (NL_VALIDATE_TRAILING |\
+                                      NL_VALIDATE_MAXTYPE)
+#define NL_VALIDATE_STRICT (NL_VALIDATE_TRAILING |\
+                           NL_VALIDATE_MAXTYPE |\
+                           NL_VALIDATE_UNSPEC |\
+                           NL_VALIDATE_STRICT_ATTRS)
+
 int netlink_rcv_skb(struct sk_buff *skb,
                    int (*cb)(struct sk_buff *, struct nlmsghdr *,
                              struct netlink_ext_ack *));
 int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,
                 unsigned int group, int report, gfp_t flags);
 
-int nla_validate(const struct nlattr *head, int len, int maxtype,
-                const struct nla_policy *policy,
-                struct netlink_ext_ack *extack);
-int nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head,
-             int len, const struct nla_policy *policy,
-             struct netlink_ext_ack *extack);
-int nla_parse_strict(struct nlattr **tb, int maxtype, const struct nlattr *head,
-                    int len, const struct nla_policy *policy,
-                    struct netlink_ext_ack *extack);
+int __nla_validate(const struct nlattr *head, int len, int maxtype,
+                  const struct nla_policy *policy, unsigned int validate,
+                  struct netlink_ext_ack *extack);
+int __nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head,
+               int len, const struct nla_policy *policy, unsigned int validate,
+               struct netlink_ext_ack *extack);
 int nla_policy_len(const struct nla_policy *, int);
 struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype);
 size_t nla_strlcpy(char *dst, const struct nlattr *nla, size_t dstsize);
 }
 
 /**
- * nlmsg_parse - parse attributes of a netlink message
+ * nla_parse_deprecated - Parse a stream of attributes into a tb buffer
+ * @tb: destination array with maxtype+1 elements
+ * @maxtype: maximum attribute type to be expected
+ * @head: head of attribute stream
+ * @len: length of attribute stream
+ * @policy: validation policy
+ * @extack: extended ACK pointer
+ *
+ * Parses a stream of attributes and stores a pointer to each attribute in
+ * the tb array accessible via the attribute type. Attributes with a type
+ * exceeding maxtype will be ignored and attributes from the policy are not
+ * always strictly validated (only for new attributes).
+ *
+ * Returns 0 on success or a negative error code.
+ */
+static inline int nla_parse_deprecated(struct nlattr **tb, int maxtype,
+                                      const struct nlattr *head, int len,
+                                      const struct nla_policy *policy,
+                                      struct netlink_ext_ack *extack)
+{
+       return __nla_parse(tb, maxtype, head, len, policy,
+                          NL_VALIDATE_LIBERAL, extack);
+}
+
+/**
+ * nla_parse_deprecated_strict - Parse a stream of attributes into a tb buffer
+ * @tb: destination array with maxtype+1 elements
+ * @maxtype: maximum attribute type to be expected
+ * @head: head of attribute stream
+ * @len: length of attribute stream
+ * @policy: validation policy
+ * @extack: extended ACK pointer
+ *
+ * Parses a stream of attributes and stores a pointer to each attribute in
+ * the tb array accessible via the attribute type. Attributes with a type
+ * exceeding maxtype will be rejected as well as trailing data, but the
+ * policy is not completely strictly validated (only for new attributes).
+ *
+ * Returns 0 on success or a negative error code.
+ */
+static inline int nla_parse_deprecated_strict(struct nlattr **tb, int maxtype,
+                                             const struct nlattr *head,
+                                             int len,
+                                             const struct nla_policy *policy,
+                                             struct netlink_ext_ack *extack)
+{
+       return __nla_parse(tb, maxtype, head, len, policy,
+                          NL_VALIDATE_DEPRECATED_STRICT, extack);
+}
+
+/**
+ * __nlmsg_parse - parse attributes of a netlink message
  * @nlh: netlink message header
  * @hdrlen: length of family specific header
  * @tb: destination array with maxtype+1 elements
  * @maxtype: maximum attribute type to be expected
  * @policy: validation policy
+ * @validate: validation strictness
  * @extack: extended ACK report struct
  *
  * See nla_parse()
  */
-static inline int nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
-                             struct nlattr *tb[], int maxtype,
-                             const struct nla_policy *policy,
-                             struct netlink_ext_ack *extack)
+static inline int __nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
+                               struct nlattr *tb[], int maxtype,
+                               const struct nla_policy *policy,
+                               unsigned int validate,
+                               struct netlink_ext_ack *extack)
 {
        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen)) {
                NL_SET_ERR_MSG(extack, "Invalid header length");
                return -EINVAL;
        }
 
-       return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
-                        nlmsg_attrlen(nlh, hdrlen), policy, extack);
+       return __nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
+                          nlmsg_attrlen(nlh, hdrlen), policy, validate,
+                          extack);
 }
 
-static inline int nlmsg_parse_strict(const struct nlmsghdr *nlh, int hdrlen,
-                                    struct nlattr *tb[], int maxtype,
-                                    const struct nla_policy *policy,
-                                    struct netlink_ext_ack *extack)
+/**
+ * nlmsg_parse_deprecated - parse attributes of a netlink message
+ * @nlh: netlink message header
+ * @hdrlen: length of family specific header
+ * @tb: destination array with maxtype+1 elements
+ * @maxtype: maximum attribute type to be expected
+ * @extack: extended ACK report struct
+ *
+ * See nla_parse_deprecated()
+ */
+static inline int nlmsg_parse_deprecated(const struct nlmsghdr *nlh, int hdrlen,
+                                        struct nlattr *tb[], int maxtype,
+                                        const struct nla_policy *policy,
+                                        struct netlink_ext_ack *extack)
 {
-       if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen)) {
-               NL_SET_ERR_MSG(extack, "Invalid header length");
-               return -EINVAL;
-       }
+       return __nlmsg_parse(nlh, hdrlen, tb, maxtype, policy,
+                            NL_VALIDATE_LIBERAL, extack);
+}
 
-       return nla_parse_strict(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
-                               nlmsg_attrlen(nlh, hdrlen), policy, extack);
+/**
+ * nlmsg_parse_deprecated_strict - parse attributes of a netlink message
+ * @nlh: netlink message header
+ * @hdrlen: length of family specific header
+ * @tb: destination array with maxtype+1 elements
+ * @maxtype: maximum attribute type to be expected
+ * @extack: extended ACK report struct
+ *
+ * See nla_parse_deprecated_strict()
+ */
+static inline int
+nlmsg_parse_deprecated_strict(const struct nlmsghdr *nlh, int hdrlen,
+                             struct nlattr *tb[], int maxtype,
+                             const struct nla_policy *policy,
+                             struct netlink_ext_ack *extack)
+{
+       return __nlmsg_parse(nlh, hdrlen, tb, maxtype, policy,
+                            NL_VALIDATE_DEPRECATED_STRICT, extack);
 }
 
 /**
 }
 
 /**
- * nlmsg_validate - validate a netlink message including attributes
+ * nla_validate_deprecated - Validate a stream of attributes
+ * @head: head of attribute stream
+ * @len: length of attribute stream
+ * @maxtype: maximum attribute type to be expected
+ * @policy: validation policy
+ * @validate: validation strictness
+ * @extack: extended ACK report struct
+ *
+ * Validates all attributes in the specified attribute stream against the
+ * specified policy. Validation is done in liberal mode.
+ * See documenation of struct nla_policy for more details.
+ *
+ * Returns 0 on success or a negative error code.
+ */
+static inline int nla_validate_deprecated(const struct nlattr *head, int len,
+                                         int maxtype,
+                                         const struct nla_policy *policy,
+                                         struct netlink_ext_ack *extack)
+{
+       return __nla_validate(head, len, maxtype, policy, NL_VALIDATE_LIBERAL,
+                             extack);
+}
+
+
+/**
+ * nlmsg_validate_deprecated - validate a netlink message including attributes
  * @nlh: netlinket message header
  * @hdrlen: length of familiy specific header
  * @maxtype: maximum attribute type to be expected
  * @policy: validation policy
  * @extack: extended ACK report struct
  */
-static inline int nlmsg_validate(const struct nlmsghdr *nlh,
-                                int hdrlen, int maxtype,
-                                const struct nla_policy *policy,
-                                struct netlink_ext_ack *extack)
+static inline int nlmsg_validate_deprecated(const struct nlmsghdr *nlh,
+                                           int hdrlen, int maxtype,
+                                           const struct nla_policy *policy,
+                                           struct netlink_ext_ack *extack)
 {
        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
                return -EINVAL;
 
-       return nla_validate(nlmsg_attrdata(nlh, hdrlen),
-                           nlmsg_attrlen(nlh, hdrlen), maxtype, policy,
-                           extack);
+       return __nla_validate(nlmsg_attrdata(nlh, hdrlen),
+                             nlmsg_attrlen(nlh, hdrlen), maxtype,
+                             policy, NL_VALIDATE_LIBERAL, extack);
 }
 
+
+
 /**
  * nlmsg_report - need to report back to application?
  * @nlh: netlink message header
 }
 
 /**
- * nla_parse_nested - parse nested attributes
+ * nla_parse_nested_deprecated - parse nested attributes
  * @tb: destination array with maxtype+1 elements
  * @maxtype: maximum attribute type to be expected
  * @nla: attribute containing the nested attributes
  * @policy: validation policy
  * @extack: extended ACK report struct
  *
- * See nla_parse()
+ * See nla_parse_deprecated()
  */
-static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
-                                  const struct nlattr *nla,
-                                  const struct nla_policy *policy,
-                                  struct netlink_ext_ack *extack)
+static inline int nla_parse_nested_deprecated(struct nlattr *tb[], int maxtype,
+                                             const struct nlattr *nla,
+                                             const struct nla_policy *policy,
+                                             struct netlink_ext_ack *extack)
 {
-       return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy,
-                        extack);
+       return __nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy,
+                          NL_VALIDATE_LIBERAL, extack);
 }
 
 /**
  * @start: container attribute
  * @maxtype: maximum attribute type to be expected
  * @policy: validation policy
+ * @validate: validation strictness
  * @extack: extended ACK report struct
  *
  * Validates all attributes in the nested attribute stream against the
  *
  * Returns 0 on success or a negative error code.
  */
-static inline int nla_validate_nested(const struct nlattr *start, int maxtype,
-                                     const struct nla_policy *policy,
-                                     struct netlink_ext_ack *extack)
+static inline int __nla_validate_nested(const struct nlattr *start, int maxtype,
+                                       const struct nla_policy *policy,
+                                       unsigned int validate,
+                                       struct netlink_ext_ack *extack)
+{
+       return __nla_validate(nla_data(start), nla_len(start), maxtype, policy,
+                             validate, extack);
+}
+
+static inline int
+nla_validate_nested_deprecated(const struct nlattr *start, int maxtype,
+                              const struct nla_policy *policy,
+                              struct netlink_ext_ack *extack)
 {
-       return nla_validate(nla_data(start), nla_len(start), maxtype, policy,
-                           extack);
+       return __nla_validate_nested(start, maxtype, policy,
+                                    NL_VALIDATE_LIBERAL, extack);
 }
 
 /**
 
                return -EINVAL;
        }
 
-       return nlmsg_validate(info->nlhdr, GENL_HDRLEN, TASKSTATS_CMD_ATTR_MAX,
-                             policy, info->extack);
+       return nlmsg_validate_deprecated(info->nlhdr, GENL_HDRLEN,
+                                        TASKSTATS_CMD_ATTR_MAX, policy,
+                                        info->extack);
 }
 
 static struct genl_family family __ro_after_init = {
 
 
 static int nla_validate_array(const struct nlattr *head, int len, int maxtype,
                              const struct nla_policy *policy,
-                             struct netlink_ext_ack *extack)
+                             struct netlink_ext_ack *extack,
+                             unsigned int validate)
 {
        const struct nlattr *entry;
        int rem;
                        return -ERANGE;
                }
 
-               ret = nla_validate(nla_data(entry), nla_len(entry),
-                                  maxtype, policy, extack);
+               ret = __nla_validate(nla_data(entry), nla_len(entry),
+                                    maxtype, policy, validate, extack);
                if (ret < 0)
                        return ret;
        }
 }
 
 static int validate_nla(const struct nlattr *nla, int maxtype,
-                       const struct nla_policy *policy,
+                       const struct nla_policy *policy, unsigned int validate,
                        struct netlink_ext_ack *extack)
 {
        const struct nla_policy *pt;
            (pt->type == NLA_EXACT_LEN_WARN && attrlen != pt->len)) {
                pr_warn_ratelimited("netlink: '%s': attribute type %d has an invalid length.\n",
                                    current->comm, type);
+               if (validate & NL_VALIDATE_STRICT_ATTRS) {
+                       NL_SET_ERR_MSG_ATTR(extack, nla,
+                                           "invalid attribute length");
+                       return -EINVAL;
+               }
        }
 
        switch (pt->type) {
                if (attrlen < NLA_HDRLEN)
                        goto out_err;
                if (pt->validation_data) {
-                       err = nla_validate(nla_data(nla), nla_len(nla), pt->len,
-                                          pt->validation_data, extack);
+                       err = __nla_validate(nla_data(nla), nla_len(nla), pt->len,
+                                            pt->validation_data, validate,
+                                            extack);
                        if (err < 0) {
                                /*
                                 * return directly to preserve the inner
 
                        err = nla_validate_array(nla_data(nla), nla_len(nla),
                                                 pt->len, pt->validation_data,
-                                                extack);
+                                                extack, validate);
                        if (err < 0) {
                                /*
                                 * return directly to preserve the inner
                break;
 
        case NLA_UNSPEC:
+               if (validate & NL_VALIDATE_UNSPEC) {
+                       NL_SET_ERR_MSG_ATTR(extack, nla,
+                                           "Unsupported attribute");
+                       return -EINVAL;
+               }
+               /* fall through */
        case NLA_MIN_LEN:
                if (attrlen < pt->len)
                        goto out_err;
        return err;
 }
 
+static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype,
+                               const struct nla_policy *policy,
+                               unsigned int validate,
+                               struct netlink_ext_ack *extack,
+                               struct nlattr **tb)
+{
+       const struct nlattr *nla;
+       int rem;
+
+       if (tb)
+               memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
+
+       nla_for_each_attr(nla, head, len, rem) {
+               u16 type = nla_type(nla);
+
+               if (type == 0 || type > maxtype) {
+                       if (validate & NL_VALIDATE_MAXTYPE) {
+                               NL_SET_ERR_MSG(extack, "Unknown attribute type");
+                               return -EINVAL;
+                       }
+                       continue;
+               }
+               if (policy) {
+                       int err = validate_nla(nla, maxtype, policy,
+                                              validate, extack);
+
+                       if (err < 0)
+                               return err;
+               }
+
+               if (tb)
+                       tb[type] = (struct nlattr *)nla;
+       }
+
+       if (unlikely(rem > 0)) {
+               pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
+                                   rem, current->comm);
+               NL_SET_ERR_MSG(extack, "bytes leftover after parsing attributes");
+               if (validate & NL_VALIDATE_TRAILING)
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
 /**
- * nla_validate - Validate a stream of attributes
+ * __nla_validate - Validate a stream of attributes
  * @head: head of attribute stream
  * @len: length of attribute stream
  * @maxtype: maximum attribute type to be expected
  * @policy: validation policy
+ * @validate: validation strictness
  * @extack: extended ACK report struct
  *
  * Validates all attributes in the specified attribute stream against the
- * specified policy. Attributes with a type exceeding maxtype will be
- * ignored. See documenation of struct nla_policy for more details.
+ * specified policy. Validation depends on the validate flags passed, see
+ * &enum netlink_validation for more details on that.
+ * See documenation of struct nla_policy for more details.
  *
  * Returns 0 on success or a negative error code.
  */
-int nla_validate(const struct nlattr *head, int len, int maxtype,
-                const struct nla_policy *policy,
-                struct netlink_ext_ack *extack)
+int __nla_validate(const struct nlattr *head, int len, int maxtype,
+                  const struct nla_policy *policy, unsigned int validate,
+                  struct netlink_ext_ack *extack)
 {
-       const struct nlattr *nla;
-       int rem;
-
-       nla_for_each_attr(nla, head, len, rem) {
-               int err = validate_nla(nla, maxtype, policy, extack);
-
-               if (err < 0)
-                       return err;
-       }
-
-       return 0;
+       return __nla_validate_parse(head, len, maxtype, policy, validate,
+                                   extack, NULL);
 }
-EXPORT_SYMBOL(nla_validate);
+EXPORT_SYMBOL(__nla_validate);
 
 /**
  * nla_policy_len - Determin the max. length of a policy
 EXPORT_SYMBOL(nla_policy_len);
 
 /**
- * nla_parse - Parse a stream of attributes into a tb buffer
+ * __nla_parse - Parse a stream of attributes into a tb buffer
  * @tb: destination array with maxtype+1 elements
  * @maxtype: maximum attribute type to be expected
  * @head: head of attribute stream
  * @len: length of attribute stream
  * @policy: validation policy
+ * @validate: validation strictness
+ * @extack: extended ACK pointer
  *
  * Parses a stream of attributes and stores a pointer to each attribute in
- * the tb array accessible via the attribute type. Attributes with a type
- * exceeding maxtype will be silently ignored for backwards compatibility
- * reasons. policy may be set to NULL if no validation is required.
+ * the tb array accessible via the attribute type.
+ * Validation is controlled by the @validate parameter.
  *
  * Returns 0 on success or a negative error code.
  */
-static int __nla_parse(struct nlattr **tb, int maxtype,
-                      const struct nlattr *head, int len,
-                      bool strict, const struct nla_policy *policy,
-                      struct netlink_ext_ack *extack)
-{
-       const struct nlattr *nla;
-       int rem;
-
-       memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
-
-       nla_for_each_attr(nla, head, len, rem) {
-               u16 type = nla_type(nla);
-
-               if (type == 0 || type > maxtype) {
-                       if (strict) {
-                               NL_SET_ERR_MSG(extack, "Unknown attribute type");
-                               return -EINVAL;
-                       }
-                       continue;
-               }
-               if (policy) {
-                       int err = validate_nla(nla, maxtype, policy, extack);
-
-                       if (err < 0)
-                               return err;
-               }
-
-               tb[type] = (struct nlattr *)nla;
-       }
-
-       if (unlikely(rem > 0)) {
-               pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
-                                   rem, current->comm);
-               NL_SET_ERR_MSG(extack, "bytes leftover after parsing attributes");
-               if (strict)
-                       return -EINVAL;
-       }
-
-       return 0;
-}
-
-int nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head,
-             int len, const struct nla_policy *policy,
-             struct netlink_ext_ack *extack)
-{
-       return __nla_parse(tb, maxtype, head, len, false, policy, extack);
-}
-EXPORT_SYMBOL(nla_parse);
-
-int nla_parse_strict(struct nlattr **tb, int maxtype, const struct nlattr *head,
-                    int len, const struct nla_policy *policy,
-                    struct netlink_ext_ack *extack)
+int __nla_parse(struct nlattr **tb, int maxtype,
+               const struct nlattr *head, int len,
+               const struct nla_policy *policy, unsigned int validate,
+               struct netlink_ext_ack *extack)
 {
-       return __nla_parse(tb, maxtype, head, len, true, policy, extack);
+       return __nla_validate_parse(head, len, maxtype, policy, validate,
+                                   extack, tb);
 }
-EXPORT_SYMBOL(nla_parse_strict);
+EXPORT_SYMBOL(__nla_parse);
 
 /**
  * nla_find - Find a specific attribute in a stream of attributes
 
 {
        if (!attr)
                return 0;
-       return nla_validate_nested(attr, IFLA_VLAN_QOS_MAX, vlan_map_policy,
-                                  NULL);
+       return nla_validate_nested_deprecated(attr, IFLA_VLAN_QOS_MAX,
+                                             vlan_map_policy, NULL);
 }
 
 static int vlan_validate(struct nlattr *tb[], struct nlattr *data[],
 
        struct net_device *dev;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*bpm), tb, MDBA_SET_ENTRY_MAX, NULL,
-                         NULL);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*bpm), tb,
+                                    MDBA_SET_ENTRY_MAX, NULL, NULL);
        if (err < 0)
                return err;
 
 
 
        if (p && protinfo) {
                if (protinfo->nla_type & NLA_F_NESTED) {
-                       err = nla_parse_nested(tb, IFLA_BRPORT_MAX, protinfo,
-                                              br_port_policy, NULL);
+                       err = nla_parse_nested_deprecated(tb, IFLA_BRPORT_MAX,
+                                                         protinfo,
+                                                         br_port_policy,
+                                                         NULL);
                        if (err)
                                return err;
 
 
 
        memset(tinfo, 0, sizeof(*tinfo));
 
-       err = nla_parse_nested(tb, IFLA_BRIDGE_VLAN_TUNNEL_MAX, attr,
-                              vlan_tunnel_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, IFLA_BRIDGE_VLAN_TUNNEL_MAX,
+                                         attr, vlan_tunnel_policy, NULL);
        if (err < 0)
                return err;
 
 
        /* initialize modification & checksum data space */
        memset(mod, 0, sizeof(*mod));
 
-       err = nlmsg_parse(nlh, sizeof(struct rtcanmsg), tb, CGW_MAX,
-                         cgw_policy, NULL);
+       err = nlmsg_parse_deprecated(nlh, sizeof(struct rtcanmsg), tb,
+                                    CGW_MAX, cgw_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!attrs)
                return -ENOMEM;
 
-       err = nlmsg_parse(cb->nlh, GENL_HDRLEN + devlink_nl_family.hdrsize,
-                         attrs, DEVLINK_ATTR_MAX, devlink_nl_family.policy,
-                         cb->extack);
+       err = nlmsg_parse_deprecated(cb->nlh,
+                                    GENL_HDRLEN + devlink_nl_family.hdrsize,
+                                    attrs, DEVLINK_ATTR_MAX,
+                                    devlink_nl_family.policy, cb->extack);
        if (err)
                goto out_free;
 
 
                goto errout;
        }
 
-       err = nlmsg_parse(nlh, sizeof(*frh), tb, FRA_MAX, ops->policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*frh), tb, FRA_MAX,
+                                    ops->policy, extack);
        if (err < 0) {
                NL_SET_ERR_MSG(extack, "Error parsing msg");
                goto errout;
                goto errout;
        }
 
-       err = nlmsg_parse(nlh, sizeof(*frh), tb, FRA_MAX, ops->policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*frh), tb, FRA_MAX,
+                                    ops->policy, extack);
        if (err < 0) {
                NL_SET_ERR_MSG(extack, "Error parsing msg");
                goto errout;
 
        int ret;
        u32 fd;
 
-       ret = nla_parse_nested(tb, LWT_BPF_PROG_MAX, attr, bpf_prog_policy,
-                              NULL);
+       ret = nla_parse_nested_deprecated(tb, LWT_BPF_PROG_MAX, attr,
+                                         bpf_prog_policy, NULL);
        if (ret < 0)
                return ret;
 
        if (family != AF_INET && family != AF_INET6)
                return -EAFNOSUPPORT;
 
-       ret = nla_parse_nested(tb, LWT_BPF_MAX, nla, bpf_nl_policy, extack);
+       ret = nla_parse_nested_deprecated(tb, LWT_BPF_MAX, nla, bpf_nl_policy,
+                                         extack);
        if (ret < 0)
                return ret;
 
 
        int err;
 
        ASSERT_RTNL();
-       err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, nda_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX,
+                                    nda_policy, extack);
        if (err < 0)
                goto out;
 
        bool found = false;
        int err, tidx;
 
-       err = nlmsg_parse(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
-                         nl_neightbl_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ndtmsg), tb, NDTA_MAX,
+                                    nl_neightbl_policy, extack);
        if (err < 0)
                goto errout;
 
                struct neigh_parms *p;
                int i, ifindex = 0;
 
-               err = nla_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS],
-                                      nl_ntbl_parm_policy, extack);
+               err = nla_parse_nested_deprecated(tbp, NDTPA_MAX,
+                                                 tb[NDTA_PARMS],
+                                                 nl_ntbl_parm_policy, extack);
                if (err < 0)
                        goto errout_tbl_lock;
 
                        return -EINVAL;
                }
 
-               err = nlmsg_parse_strict(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                        nda_policy, extack);
+               err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg),
+                                                   tb, NDA_MAX, nda_policy,
+                                                   extack);
        } else {
-               err = nlmsg_parse(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                 nda_policy, extack);
+               err = nlmsg_parse_deprecated(nlh, sizeof(struct ndmsg), tb,
+                                            NDA_MAX, nda_policy, extack);
        }
        if (err < 0)
                return err;
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                nda_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
+                                           NDA_MAX, nda_policy, extack);
        if (err < 0)
                return err;
 
 
        struct net *peer;
        int nsid, err;
 
-       err = nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, NETNSA_MAX,
-                         rtnl_net_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(struct rtgenmsg), tb,
+                                    NETNSA_MAX, rtnl_net_policy, extack);
        if (err < 0)
                return err;
        if (!tb[NETNSA_NSID]) {
        int i, err;
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, NETNSA_MAX,
-                                  rtnl_net_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(struct rtgenmsg),
+                                             tb, NETNSA_MAX, rtnl_net_policy,
+                                             extack);
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct rtgenmsg), tb, NETNSA_MAX,
-                                rtnl_net_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct rtgenmsg), tb,
+                                           NETNSA_MAX, rtnl_net_policy,
+                                           extack);
        if (err)
                return err;
 
        struct nlattr *tb[NETNSA_MAX + 1];
        int err, i;
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct rtgenmsg), tb, NETNSA_MAX,
-                                rtnl_net_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct rtgenmsg), tb,
+                                           NETNSA_MAX, rtnl_net_policy,
+                                           extack);
        if (err < 0)
                return err;
 
 
        const struct rtnl_link_ops *ops = NULL;
        struct nlattr *linfo[IFLA_INFO_MAX + 1];
 
-       if (nla_parse_nested(linfo, IFLA_INFO_MAX, nla,
-                            ifla_info_policy, NULL) < 0)
+       if (nla_parse_nested_deprecated(linfo, IFLA_INFO_MAX, nla, ifla_info_policy, NULL) < 0)
                return NULL;
 
        if (linfo[IFLA_INFO_KIND]) {
                        return -EINVAL;
                }
 
-               return nlmsg_parse_strict(nlh, sizeof(*ifm), tb, IFLA_MAX,
-                                         ifla_policy, extack);
+               return nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb,
+                                                    IFLA_MAX, ifla_policy,
+                                                    extack);
        }
 
        /* A hack to preserve kernel<->userspace interface.
        hdrlen = nlmsg_len(nlh) < sizeof(struct ifinfomsg) ?
                 sizeof(struct rtgenmsg) : sizeof(struct ifinfomsg);
 
-       return nlmsg_parse(nlh, hdrlen, tb, IFLA_MAX, ifla_policy, extack);
+       return nlmsg_parse_deprecated(nlh, hdrlen, tb, IFLA_MAX, ifla_policy,
+                                     extack);
 }
 
 static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
 int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len,
                        struct netlink_ext_ack *exterr)
 {
-       return nla_parse(tb, IFLA_MAX, head, len, ifla_policy, exterr);
+       return nla_parse_deprecated(tb, IFLA_MAX, head, len, ifla_policy,
+                                   exterr);
 }
 EXPORT_SYMBOL(rtnl_nla_parse_ifla);
 
                                err = -EINVAL;
                                goto errout;
                        }
-                       err = nla_parse_nested(vfinfo, IFLA_VF_MAX, attr,
-                                              ifla_vf_policy, NULL);
+                       err = nla_parse_nested_deprecated(vfinfo, IFLA_VF_MAX,
+                                                         attr,
+                                                         ifla_vf_policy,
+                                                         NULL);
                        if (err < 0)
                                goto errout;
                        err = do_setvfinfo(dev, vfinfo);
                                err = -EINVAL;
                                goto errout;
                        }
-                       err = nla_parse_nested(port, IFLA_PORT_MAX, attr,
-                                              ifla_port_policy, NULL);
+                       err = nla_parse_nested_deprecated(port, IFLA_PORT_MAX,
+                                                         attr,
+                                                         ifla_port_policy,
+                                                         NULL);
                        if (err < 0)
                                goto errout;
                        if (!port[IFLA_PORT_VF]) {
        if (tb[IFLA_PORT_SELF]) {
                struct nlattr *port[IFLA_PORT_MAX+1];
 
-               err = nla_parse_nested(port, IFLA_PORT_MAX,
-                                      tb[IFLA_PORT_SELF], ifla_port_policy,
-                                      NULL);
+               err = nla_parse_nested_deprecated(port, IFLA_PORT_MAX,
+                                                 tb[IFLA_PORT_SELF],
+                                                 ifla_port_policy, NULL);
                if (err < 0)
                        goto errout;
 
                struct nlattr *xdp[IFLA_XDP_MAX + 1];
                u32 xdp_flags = 0;
 
-               err = nla_parse_nested(xdp, IFLA_XDP_MAX, tb[IFLA_XDP],
-                                      ifla_xdp_policy, NULL);
+               err = nla_parse_nested_deprecated(xdp, IFLA_XDP_MAX,
+                                                 tb[IFLA_XDP],
+                                                 ifla_xdp_policy, NULL);
                if (err < 0)
                        goto errout;
 
        struct nlattr *tb[IFLA_MAX+1];
        char ifname[IFNAMSIZ];
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
+                                    ifla_policy, extack);
        if (err < 0)
                goto errout;
 
        int err;
        int netnsid = -1;
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
+                                    ifla_policy, extack);
        if (err < 0)
                return err;
 
 #ifdef CONFIG_MODULES
 replay:
 #endif
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
+                                    ifla_policy, extack);
        if (err < 0)
                return err;
 
                return err;
 
        if (tb[IFLA_LINKINFO]) {
-               err = nla_parse_nested(linkinfo, IFLA_INFO_MAX,
-                                      tb[IFLA_LINKINFO], ifla_info_policy,
-                                      NULL);
+               err = nla_parse_nested_deprecated(linkinfo, IFLA_INFO_MAX,
+                                                 tb[IFLA_LINKINFO],
+                                                 ifla_info_policy, NULL);
                if (err < 0)
                        return err;
        } else
                        return -EINVAL;
 
                if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) {
-                       err = nla_parse_nested(attr, ops->maxtype,
-                                              linkinfo[IFLA_INFO_DATA],
-                                              ops->policy, extack);
+                       err = nla_parse_nested_deprecated(attr, ops->maxtype,
+                                                         linkinfo[IFLA_INFO_DATA],
+                                                         ops->policy, extack);
                        if (err < 0)
                                return err;
                        data = attr;
 
                if (m_ops->slave_maxtype &&
                    linkinfo[IFLA_INFO_SLAVE_DATA]) {
-                       err = nla_parse_nested(slave_attr, m_ops->slave_maxtype,
-                                              linkinfo[IFLA_INFO_SLAVE_DATA],
-                                              m_ops->slave_policy, extack);
+                       err = nla_parse_nested_deprecated(slave_attr,
+                                                         m_ops->slave_maxtype,
+                                                         linkinfo[IFLA_INFO_SLAVE_DATA],
+                                                         m_ops->slave_policy,
+                                                         extack);
                        if (err < 0)
                                return err;
                        slave_data = slave_attr;
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy,
-                                  extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
+                                             ifla_policy, extack);
 
        ifm = nlmsg_data(nlh);
        if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags ||
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy,
-                                extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFLA_MAX,
+                                           ifla_policy, extack);
        if (err)
                return err;
 
        hdrlen = nlmsg_len(nlh) < sizeof(struct ifinfomsg) ?
                 sizeof(struct rtgenmsg) : sizeof(struct ifinfomsg);
 
-       if (nlmsg_parse(nlh, hdrlen, tb, IFLA_MAX, ifla_policy, NULL) >= 0) {
+       if (nlmsg_parse_deprecated(nlh, hdrlen, tb, IFLA_MAX, ifla_policy, NULL) >= 0) {
                if (tb[IFLA_EXT_MASK])
                        ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
        }
        u16 vid;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX, NULL,
+                                    extack);
        if (err < 0)
                return err;
 
        if (!netlink_capable(skb, CAP_NET_ADMIN))
                return -EPERM;
 
-       err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL, extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX, NULL,
+                                    extack);
        if (err < 0)
                return err;
 
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                NULL, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
+                                           NDA_MAX, NULL, extack);
        if (err < 0)
                return err;
 
             nla_attr_size(sizeof(u32)))) {
                struct ifinfomsg *ifm;
 
-               err = nlmsg_parse(nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX,
-                                 ifla_policy, extack);
+               err = nlmsg_parse_deprecated(nlh, sizeof(struct ifinfomsg),
+                                            tb, IFLA_MAX, ifla_policy,
+                                            extack);
                if (err < 0) {
                        return -EINVAL;
                } else if (err == 0) {
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct ndmsg), tb, NDA_MAX,
-                                nda_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct ndmsg), tb,
+                                           NDA_MAX, nda_policy, extack);
        if (err < 0)
                return err;
 
                        return -EINVAL;
                }
 
-               err = nlmsg_parse_strict(nlh, sizeof(struct ifinfomsg), tb,
-                                        IFLA_MAX, ifla_policy, extack);
+               err = nlmsg_parse_deprecated_strict(nlh,
+                                                   sizeof(struct ifinfomsg),
+                                                   tb, IFLA_MAX, ifla_policy,
+                                                   extack);
        } else {
-               err = nlmsg_parse(nlh, sizeof(struct ifinfomsg), tb,
-                                 IFLA_MAX, ifla_policy, extack);
+               err = nlmsg_parse_deprecated(nlh, sizeof(struct ifinfomsg),
+                                            tb, IFLA_MAX, ifla_policy,
+                                            extack);
        }
        if (err < 0)
                return err;
 
        if (!netdev->dcbnl_ops->getpfccfg)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(data, DCB_PFC_UP_ATTR_MAX,
-                              tb[DCB_ATTR_PFC_CFG], dcbnl_pfc_up_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_PFC_UP_ATTR_MAX,
+                                         tb[DCB_ATTR_PFC_CFG],
+                                         dcbnl_pfc_up_nest, NULL);
        if (ret)
                return ret;
 
        if (!netdev->dcbnl_ops->getcap)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(data, DCB_CAP_ATTR_MAX, tb[DCB_ATTR_CAP],
-                              dcbnl_cap_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_CAP_ATTR_MAX,
+                                         tb[DCB_ATTR_CAP], dcbnl_cap_nest,
+                                         NULL);
        if (ret)
                return ret;
 
        if (!netdev->dcbnl_ops->getnumtcs)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(data, DCB_NUMTCS_ATTR_MAX, tb[DCB_ATTR_NUMTCS],
-                              dcbnl_numtcs_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_NUMTCS_ATTR_MAX,
+                                         tb[DCB_ATTR_NUMTCS],
+                                         dcbnl_numtcs_nest, NULL);
        if (ret)
                return ret;
 
        if (!netdev->dcbnl_ops->setnumtcs)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(data, DCB_NUMTCS_ATTR_MAX, tb[DCB_ATTR_NUMTCS],
-                              dcbnl_numtcs_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_NUMTCS_ATTR_MAX,
+                                         tb[DCB_ATTR_NUMTCS],
+                                         dcbnl_numtcs_nest, NULL);
        if (ret)
                return ret;
 
        if (!tb[DCB_ATTR_APP])
                return -EINVAL;
 
-       ret = nla_parse_nested(app_tb, DCB_APP_ATTR_MAX, tb[DCB_ATTR_APP],
-                              dcbnl_app_nest, NULL);
+       ret = nla_parse_nested_deprecated(app_tb, DCB_APP_ATTR_MAX,
+                                         tb[DCB_ATTR_APP], dcbnl_app_nest,
+                                         NULL);
        if (ret)
                return ret;
 
        if (!tb[DCB_ATTR_APP])
                return -EINVAL;
 
-       ret = nla_parse_nested(app_tb, DCB_APP_ATTR_MAX, tb[DCB_ATTR_APP],
-                              dcbnl_app_nest, NULL);
+       ret = nla_parse_nested_deprecated(app_tb, DCB_APP_ATTR_MAX,
+                                         tb[DCB_ATTR_APP], dcbnl_app_nest,
+                                         NULL);
        if (ret)
                return ret;
 
            !netdev->dcbnl_ops->getpgbwgcfgrx)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(pg_tb, DCB_PG_ATTR_MAX, tb[DCB_ATTR_PG_CFG],
-                              dcbnl_pg_nest, NULL);
+       ret = nla_parse_nested_deprecated(pg_tb, DCB_PG_ATTR_MAX,
+                                         tb[DCB_ATTR_PG_CFG], dcbnl_pg_nest,
+                                         NULL);
        if (ret)
                return ret;
 
                        data = pg_tb[DCB_PG_ATTR_TC_ALL];
                else
                        data = pg_tb[i];
-               ret = nla_parse_nested(param_tb, DCB_TC_ATTR_PARAM_MAX, data,
-                                      dcbnl_tc_param_nest, NULL);
+               ret = nla_parse_nested_deprecated(param_tb,
+                                                 DCB_TC_ATTR_PARAM_MAX, data,
+                                                 dcbnl_tc_param_nest, NULL);
                if (ret)
                        goto err_pg;
 
        if (!netdev->dcbnl_ops->setpfccfg)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(data, DCB_PFC_UP_ATTR_MAX,
-                              tb[DCB_ATTR_PFC_CFG], dcbnl_pfc_up_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_PFC_UP_ATTR_MAX,
+                                         tb[DCB_ATTR_PFC_CFG],
+                                         dcbnl_pfc_up_nest, NULL);
        if (ret)
                return ret;
 
            !netdev->dcbnl_ops->setpgbwgcfgrx)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(pg_tb, DCB_PG_ATTR_MAX, tb[DCB_ATTR_PG_CFG],
-                              dcbnl_pg_nest, NULL);
+       ret = nla_parse_nested_deprecated(pg_tb, DCB_PG_ATTR_MAX,
+                                         tb[DCB_ATTR_PG_CFG], dcbnl_pg_nest,
+                                         NULL);
        if (ret)
                return ret;
 
                if (!pg_tb[i])
                        continue;
 
-               ret = nla_parse_nested(param_tb, DCB_TC_ATTR_PARAM_MAX,
-                                      pg_tb[i], dcbnl_tc_param_nest, NULL);
+               ret = nla_parse_nested_deprecated(param_tb,
+                                                 DCB_TC_ATTR_PARAM_MAX,
+                                                 pg_tb[i],
+                                                 dcbnl_tc_param_nest, NULL);
                if (ret)
                        return ret;
 
            !netdev->dcbnl_ops->getbcncfg)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(bcn_tb, DCB_BCN_ATTR_MAX, tb[DCB_ATTR_BCN],
-                              dcbnl_bcn_nest, NULL);
+       ret = nla_parse_nested_deprecated(bcn_tb, DCB_BCN_ATTR_MAX,
+                                         tb[DCB_ATTR_BCN], dcbnl_bcn_nest,
+                                         NULL);
        if (ret)
                return ret;
 
            !netdev->dcbnl_ops->setbcnrp)
                return -EOPNOTSUPP;
 
-       ret = nla_parse_nested(data, DCB_BCN_ATTR_MAX, tb[DCB_ATTR_BCN],
-                              dcbnl_pfc_up_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_BCN_ATTR_MAX,
+                                         tb[DCB_ATTR_BCN], dcbnl_pfc_up_nest,
+                                         NULL);
        if (ret)
                return ret;
 
        if (!tb[DCB_ATTR_IEEE])
                return -EINVAL;
 
-       err = nla_parse_nested(ieee, DCB_ATTR_IEEE_MAX, tb[DCB_ATTR_IEEE],
-                              dcbnl_ieee_policy, NULL);
+       err = nla_parse_nested_deprecated(ieee, DCB_ATTR_IEEE_MAX,
+                                         tb[DCB_ATTR_IEEE],
+                                         dcbnl_ieee_policy, NULL);
        if (err)
                return err;
 
        if (!tb[DCB_ATTR_IEEE])
                return -EINVAL;
 
-       err = nla_parse_nested(ieee, DCB_ATTR_IEEE_MAX, tb[DCB_ATTR_IEEE],
-                              dcbnl_ieee_policy, NULL);
+       err = nla_parse_nested_deprecated(ieee, DCB_ATTR_IEEE_MAX,
+                                         tb[DCB_ATTR_IEEE],
+                                         dcbnl_ieee_policy, NULL);
        if (err)
                return err;
 
        if (!tb[DCB_ATTR_FEATCFG])
                return -EINVAL;
 
-       ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX,
-                              tb[DCB_ATTR_FEATCFG], dcbnl_featcfg_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_FEATCFG_ATTR_MAX,
+                                         tb[DCB_ATTR_FEATCFG],
+                                         dcbnl_featcfg_nest, NULL);
        if (ret)
                return ret;
 
        if (!tb[DCB_ATTR_FEATCFG])
                return -EINVAL;
 
-       ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX,
-                              tb[DCB_ATTR_FEATCFG], dcbnl_featcfg_nest, NULL);
+       ret = nla_parse_nested_deprecated(data, DCB_FEATCFG_ATTR_MAX,
+                                         tb[DCB_ATTR_FEATCFG],
+                                         dcbnl_featcfg_nest, NULL);
 
        if (ret)
                goto err;
        if ((nlh->nlmsg_type == RTM_SETDCB) && !netlink_capable(skb, CAP_NET_ADMIN))
                return -EPERM;
 
-       ret = nlmsg_parse(nlh, sizeof(*dcb), tb, DCB_ATTR_MAX,
-                         dcbnl_rtnl_policy, extack);
+       ret = nlmsg_parse_deprecated(nlh, sizeof(*dcb), tb, DCB_ATTR_MAX,
+                                    dcbnl_rtnl_policy, extack);
        if (ret < 0)
                return ret;
 
 
        if (!net_eq(net, &init_net))
                goto errout;
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    dn_ifa_policy, extack);
        if (err < 0)
                goto errout;
 
        if (!net_eq(net, &init_net))
                return -EINVAL;
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    dn_ifa_policy, extack);
        if (err < 0)
                return err;
 
 
        if (!net_eq(net, &init_net))
                return -EINVAL;
 
-       err = nlmsg_parse(nlh, sizeof(*r), attrs, RTA_MAX, rtm_dn_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*r), attrs, RTA_MAX,
+                                    rtm_dn_policy, extack);
        if (err < 0)
                return err;
 
        if (!net_eq(net, &init_net))
                return -EINVAL;
 
-       err = nlmsg_parse(nlh, sizeof(*r), attrs, RTA_MAX, rtm_dn_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*r), attrs, RTA_MAX,
+                                    rtm_dn_policy, extack);
        if (err < 0)
                return err;
 
 
        if (!net_eq(net, &init_net))
                return -EINVAL;
 
-       err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_dn_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                    rtm_dn_policy, extack);
        if (err < 0)
                return err;
 
 
        rtnl_lock();
 
        if (!cb->args[0]) {
-               err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl802154_fam.hdrsize,
-                                 genl_family_attrbuf(&nl802154_fam),
-                                 nl802154_fam.maxattr, nl802154_policy, NULL);
+               err = nlmsg_parse_deprecated(cb->nlh,
+                                            GENL_HDRLEN + nl802154_fam.hdrsize,
+                                            genl_family_attrbuf(&nl802154_fam),
+                                            nl802154_fam.maxattr,
+                                            nl802154_policy, NULL);
                if (err)
                        goto out_unlock;
 
                                        struct nl802154_dump_wpan_phy_state *state)
 {
        struct nlattr **tb = genl_family_attrbuf(&nl802154_fam);
-       int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl802154_fam.hdrsize, tb,
-                             nl802154_fam.maxattr, nl802154_policy, NULL);
+       int ret = nlmsg_parse_deprecated(cb->nlh,
+                                        GENL_HDRLEN + nl802154_fam.hdrsize,
+                                        tb, nl802154_fam.maxattr,
+                                        nl802154_policy, NULL);
 
        /* TODO check if we can handle error here,
         * we have no backward compatibility
 {
        struct nlattr *attrs[NL802154_DEV_ADDR_ATTR_MAX + 1];
 
-       if (!nla || nla_parse_nested(attrs, NL802154_DEV_ADDR_ATTR_MAX, nla,
-                                    nl802154_dev_addr_policy, NULL))
+       if (!nla || nla_parse_nested_deprecated(attrs, NL802154_DEV_ADDR_ATTR_MAX, nla, nl802154_dev_addr_policy, NULL))
                return -EINVAL;
 
        if (!attrs[NL802154_DEV_ADDR_ATTR_PAN_ID] ||
 {
        struct nlattr *attrs[NL802154_KEY_ID_ATTR_MAX + 1];
 
-       if (!nla || nla_parse_nested(attrs, NL802154_KEY_ID_ATTR_MAX, nla,
-                                    nl802154_key_id_policy, NULL))
+       if (!nla || nla_parse_nested_deprecated(attrs, NL802154_KEY_ID_ATTR_MAX, nla, nl802154_key_id_policy, NULL))
                return -EINVAL;
 
        if (!attrs[NL802154_KEY_ID_ATTR_MODE])
        struct ieee802154_llsec_key_id id = { };
        u32 commands[NL802154_CMD_FRAME_NR_IDS / 32] = { };
 
-       if (nla_parse_nested(attrs, NL802154_KEY_ATTR_MAX,
-                            info->attrs[NL802154_ATTR_SEC_KEY],
-                            nl802154_key_policy, info->extack))
+       if (nla_parse_nested_deprecated(attrs, NL802154_KEY_ATTR_MAX, info->attrs[NL802154_ATTR_SEC_KEY], nl802154_key_policy, info->extack))
                return -EINVAL;
 
        if (!attrs[NL802154_KEY_ATTR_USAGE_FRAMES] ||
        struct nlattr *attrs[NL802154_KEY_ATTR_MAX + 1];
        struct ieee802154_llsec_key_id id;
 
-       if (nla_parse_nested(attrs, NL802154_KEY_ATTR_MAX,
-                            info->attrs[NL802154_ATTR_SEC_KEY],
-                            nl802154_key_policy, info->extack))
+       if (nla_parse_nested_deprecated(attrs, NL802154_KEY_ATTR_MAX, info->attrs[NL802154_ATTR_SEC_KEY], nl802154_key_policy, info->extack))
                return -EINVAL;
 
        if (ieee802154_llsec_parse_key_id(attrs[NL802154_KEY_ATTR_ID], &id) < 0)
 {
        struct nlattr *attrs[NL802154_DEV_ATTR_MAX + 1];
 
-       if (!nla || nla_parse_nested(attrs, NL802154_DEV_ATTR_MAX,
-                                    nla, nl802154_dev_policy, NULL))
+       if (!nla || nla_parse_nested_deprecated(attrs, NL802154_DEV_ATTR_MAX, nla, nl802154_dev_policy, NULL))
                return -EINVAL;
 
        memset(dev, 0, sizeof(*dev));
        struct nlattr *attrs[NL802154_DEV_ATTR_MAX + 1];
        __le64 extended_addr;
 
-       if (nla_parse_nested(attrs, NL802154_DEV_ATTR_MAX,
-                            info->attrs[NL802154_ATTR_SEC_DEVICE],
-                            nl802154_dev_policy, info->extack))
+       if (nla_parse_nested_deprecated(attrs, NL802154_DEV_ATTR_MAX, info->attrs[NL802154_ATTR_SEC_DEVICE], nl802154_dev_policy, info->extack))
                return -EINVAL;
 
        if (!attrs[NL802154_DEV_ATTR_EXTENDED_ADDR])
        __le64 extended_addr;
 
        if (!info->attrs[NL802154_ATTR_SEC_DEVKEY] ||
-           nla_parse_nested(attrs, NL802154_DEVKEY_ATTR_MAX,
-                            info->attrs[NL802154_ATTR_SEC_DEVKEY],
-                            nl802154_devkey_policy, info->extack) < 0)
+           nla_parse_nested_deprecated(attrs, NL802154_DEVKEY_ATTR_MAX, info->attrs[NL802154_ATTR_SEC_DEVKEY], nl802154_devkey_policy, info->extack) < 0)
                return -EINVAL;
 
        if (!attrs[NL802154_DEVKEY_ATTR_FRAME_COUNTER] ||
        struct ieee802154_llsec_device_key key;
        __le64 extended_addr;
 
-       if (nla_parse_nested(attrs, NL802154_DEVKEY_ATTR_MAX,
-                            info->attrs[NL802154_ATTR_SEC_DEVKEY],
-                            nl802154_devkey_policy, info->extack))
+       if (nla_parse_nested_deprecated(attrs, NL802154_DEVKEY_ATTR_MAX, info->attrs[NL802154_ATTR_SEC_DEVKEY], nl802154_devkey_policy, info->extack))
                return -EINVAL;
 
        if (!attrs[NL802154_DEVKEY_ATTR_EXTENDED_ADDR])
 {
        struct nlattr *attrs[NL802154_SECLEVEL_ATTR_MAX + 1];
 
-       if (!nla || nla_parse_nested(attrs, NL802154_SECLEVEL_ATTR_MAX,
-                                    nla, nl802154_seclevel_policy, NULL))
+       if (!nla || nla_parse_nested_deprecated(attrs, NL802154_SECLEVEL_ATTR_MAX, nla, nl802154_seclevel_policy, NULL))
                return -EINVAL;
 
        memset(sl, 0, sizeof(*sl));
 
 
        ASSERT_RTNL();
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    ifa_ipv4_policy, extack);
        if (err < 0)
                goto errout;
 
        struct in_device *in_dev;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    ifa_ipv4_policy, extack);
        if (err < 0)
                goto errout;
 
                fillargs->flags |= NLM_F_DUMP_FILTERED;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
-                                ifa_ipv4_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                           ifa_ipv4_policy, extack);
        if (err < 0)
                return err;
 
        if (dev && !__in_dev_get_rcu(dev))
                return -EAFNOSUPPORT;
 
-       err = nla_parse_nested(tb, IFLA_INET_MAX, nla, inet_af_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, IFLA_INET_MAX, nla,
+                                         inet_af_policy, NULL);
        if (err < 0)
                return err;
 
        if (!in_dev)
                return -EAFNOSUPPORT;
 
-       if (nla_parse_nested(tb, IFLA_INET_MAX, nla, NULL, NULL) < 0)
+       if (nla_parse_nested_deprecated(tb, IFLA_INET_MAX, nla, NULL, NULL) < 0)
                BUG();
 
        if (tb[IFLA_INET_CONF]) {
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(struct netconfmsg), tb,
-                                  NETCONFA_MAX, devconf_ipv4_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(struct netconfmsg),
+                                             tb, NETCONFA_MAX,
+                                             devconf_ipv4_policy, extack);
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct netconfmsg), tb,
-                                NETCONFA_MAX, devconf_ipv4_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct netconfmsg),
+                                           tb, NETCONFA_MAX,
+                                           devconf_ipv4_policy, extack);
        if (err)
                return err;
 
 
        int err, remaining;
        struct rtmsg *rtm;
 
-       err = nlmsg_validate(nlh, sizeof(*rtm), RTA_MAX, rtm_ipv4_policy,
-                            extack);
+       err = nlmsg_validate_deprecated(nlh, sizeof(*rtm), RTA_MAX,
+                                       rtm_ipv4_policy, extack);
        if (err < 0)
                goto errout;
 
        filter->rt_type  = rtm->rtm_type;
        filter->table_id = rtm->rtm_table;
 
-       err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                rtm_ipv4_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                           rtm_ipv4_policy, extack);
        if (err < 0)
                return err;
 
 
        struct nlattr *tb[LWTUNNEL_IP_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, LWTUNNEL_IP_MAX, attr, ip_tun_policy,
-                              extack);
+       err = nla_parse_nested_deprecated(tb, LWTUNNEL_IP_MAX, attr,
+                                         ip_tun_policy, extack);
        if (err < 0)
                return err;
 
        struct nlattr *tb[LWTUNNEL_IP6_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, LWTUNNEL_IP6_MAX, attr, ip6_tun_policy,
-                              extack);
+       err = nla_parse_nested_deprecated(tb, LWTUNNEL_IP6_MAX, attr,
+                                         ip6_tun_policy, extack);
        if (err < 0)
                return err;
 
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                  rtm_ipv4_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                             rtm_ipv4_policy, extack);
 
        rtm = nlmsg_data(nlh);
        if ((rtm->rtm_src_len && rtm->rtm_src_len != 32) ||
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                rtm_ipv4_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                           rtm_ipv4_policy, extack);
        if (err)
                return err;
 
        struct rtmsg *rtm;
        int ret, rem;
 
-       ret = nlmsg_validate(nlh, sizeof(*rtm), RTA_MAX, rtm_ipmr_policy,
-                            extack);
+       ret = nlmsg_validate_deprecated(nlh, sizeof(*rtm), RTA_MAX,
+                                       rtm_ipmr_policy, extack);
        if (ret < 0)
                goto out;
        rtm = nlmsg_data(nlh);
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                  rtm_ipv4_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                             rtm_ipv4_policy, extack);
 
        rtm = nlmsg_data(nlh);
        if ((rtm->rtm_src_len && rtm->rtm_src_len != 32) ||
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                rtm_ipv4_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                           rtm_ipv4_policy, extack);
        if (err)
                return err;
 
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(struct netconfmsg), tb,
-                                  NETCONFA_MAX, devconf_ipv6_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(struct netconfmsg),
+                                             tb, NETCONFA_MAX,
+                                             devconf_ipv6_policy, extack);
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct netconfmsg), tb,
-                                NETCONFA_MAX, devconf_ipv6_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct netconfmsg),
+                                           tb, NETCONFA_MAX,
+                                           devconf_ipv6_policy, extack);
        if (err)
                return err;
 
        u32 ifa_flags;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv6_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    ifa_ipv6_policy, extack);
        if (err < 0)
                return err;
 
        struct ifa6_config cfg;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv6_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    ifa_ipv6_policy, extack);
        if (err < 0)
                return err;
 
                fillargs->flags |= NLM_F_DUMP_FILTERED;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
-                                ifa_ipv6_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                           ifa_ipv6_policy, extack);
        if (err < 0)
                return err;
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX,
-                                  ifa_ipv6_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                             ifa_ipv6_policy, extack);
 
-       err = nlmsg_parse_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
-                                ifa_ipv6_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                           ifa_ipv6_policy, extack);
        if (err)
                return err;
 
        if (dev && !__in6_dev_get(dev))
                return -EAFNOSUPPORT;
 
-       return nla_parse_nested(tb, IFLA_INET6_MAX, nla, inet6_af_policy,
-                               NULL);
+       return nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla,
+                                          inet6_af_policy, NULL);
 }
 
 static int check_addr_gen_mode(int mode)
        if (!idev)
                return -EAFNOSUPPORT;
 
-       if (nla_parse_nested(tb, IFLA_INET6_MAX, nla, NULL, NULL) < 0)
+       if (nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla, NULL, NULL) < 0)
                BUG();
 
        if (tb[IFLA_INET6_TOKEN]) {
 
        u32 label;
        int err = 0;
 
-       err = nlmsg_parse(nlh, sizeof(*ifal), tb, IFAL_MAX, ifal_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifal), tb, IFAL_MAX,
+                                    ifal_policy, extack);
        if (err < 0)
                return err;
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*ifal), tb, IFAL_MAX,
-                                  ifal_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*ifal), tb,
+                                             IFAL_MAX, ifal_policy, extack);
 
        ifal = nlmsg_data(nlh);
        if (ifal->__ifal_reserved || ifal->ifal_flags || ifal->ifal_seq) {
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*ifal), tb, IFAL_MAX,
-                                ifal_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifal), tb, IFAL_MAX,
+                                           ifal_policy, extack);
        if (err)
                return err;
 
 
        if (family != AF_INET6)
                return -EINVAL;
 
-       ret = nla_parse_nested(tb, ILA_ATTR_MAX, nla, ila_nl_policy, extack);
+       ret = nla_parse_nested_deprecated(tb, ILA_ATTR_MAX, nla,
+                                         ila_nl_policy, extack);
        if (ret < 0)
                return ret;
 
 
        unsigned int pref;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                    rtm_ipv6_policy, extack);
        if (err < 0)
                goto errout;
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                  rtm_ipv6_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                             rtm_ipv6_policy, extack);
 
        rtm = nlmsg_data(nlh);
        if ((rtm->rtm_src_len && rtm->rtm_src_len != 128) ||
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                rtm_ipv6_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                           rtm_ipv6_policy, extack);
        if (err)
                return err;
 
 
        if (family != AF_INET && family != AF_INET6)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, SEG6_IPTUNNEL_MAX, nla,
-                              seg6_iptunnel_policy, extack);
+       err = nla_parse_nested_deprecated(tb, SEG6_IPTUNNEL_MAX, nla,
+                                         seg6_iptunnel_policy, extack);
 
        if (err < 0)
                return err;
 
        int ret;
        u32 fd;
 
-       ret = nla_parse_nested(tb, SEG6_LOCAL_BPF_PROG_MAX,
-                              attrs[SEG6_LOCAL_BPF], bpf_prog_policy, NULL);
+       ret = nla_parse_nested_deprecated(tb, SEG6_LOCAL_BPF_PROG_MAX,
+                                         attrs[SEG6_LOCAL_BPF],
+                                         bpf_prog_policy, NULL);
        if (ret < 0)
                return ret;
 
        if (family != AF_INET6)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, SEG6_LOCAL_MAX, nla, seg6_local_policy,
-                              extack);
+       err = nla_parse_nested_deprecated(tb, SEG6_LOCAL_MAX, nla,
+                                         seg6_local_policy, extack);
 
        if (err < 0)
                return err;
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(struct netconfmsg), tb,
-                                  NETCONFA_MAX, devconf_mpls_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(struct netconfmsg),
+                                             tb, NETCONFA_MAX,
+                                             devconf_mpls_policy, extack);
 
-       err = nlmsg_parse_strict(nlh, sizeof(struct netconfmsg), tb,
-                                NETCONFA_MAX, devconf_mpls_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct netconfmsg),
+                                           tb, NETCONFA_MAX,
+                                           devconf_mpls_policy, extack);
        if (err)
                return err;
 
        int index;
        int err;
 
-       err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_mpls_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                    rtm_mpls_policy, extack);
        if (err < 0)
                goto errout;
 
                cb->answer_flags = NLM_F_DUMP_FILTERED;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                rtm_mpls_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                           rtm_mpls_policy, extack);
        if (err < 0)
                return err;
 
        }
 
        if (!netlink_strict_get_check(skb))
-               return nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                  rtm_mpls_policy, extack);
+               return nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                             rtm_mpls_policy, extack);
 
        rtm = nlmsg_data(nlh);
        if ((rtm->rtm_dst_len && rtm->rtm_dst_len != 20) ||
                return -EINVAL;
        }
 
-       err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
-                                rtm_mpls_policy, extack);
+       err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                           rtm_mpls_policy, extack);
        if (err)
                return err;
 
 
        u8 n_labels;
        int ret;
 
-       ret = nla_parse_nested(tb, MPLS_IPTUNNEL_MAX, nla,
-                              mpls_iptunnel_policy, extack);
+       ret = nla_parse_nested_deprecated(tb, MPLS_IPTUNNEL_MAX, nla,
+                                         mpls_iptunnel_policy, extack);
        if (ret < 0)
                return ret;
 
 
        void *hdr;
        int rc;
 
-       rc = genlmsg_parse(cb->nlh, &ncsi_genl_family, attrs, NCSI_ATTR_MAX,
-                          ncsi_genl_policy, NULL);
+       rc = genlmsg_parse_deprecated(cb->nlh, &ncsi_genl_family, attrs, NCSI_ATTR_MAX,
+                                     ncsi_genl_policy, NULL);
        if (rc)
                return rc;
 
 
 
        if (unlikely(!flag_nested(nla)))
                return -IPSET_ERR_PROTOCOL;
-       if (nla_parse_nested(tb, IPSET_ATTR_IPADDR_MAX, nla,
-                            ipaddr_policy, NULL))
+       if (nla_parse_nested_deprecated(tb, IPSET_ATTR_IPADDR_MAX, nla, ipaddr_policy, NULL))
                return -IPSET_ERR_PROTOCOL;
        if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_IPADDR_IPV4)))
                return -IPSET_ERR_PROTOCOL;
        if (unlikely(!flag_nested(nla)))
                return -IPSET_ERR_PROTOCOL;
 
-       if (nla_parse_nested(tb, IPSET_ATTR_IPADDR_MAX, nla,
-                            ipaddr_policy, NULL))
+       if (nla_parse_nested_deprecated(tb, IPSET_ATTR_IPADDR_MAX, nla, ipaddr_policy, NULL))
                return -IPSET_ERR_PROTOCOL;
        if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_IPADDR_IPV6)))
                return -IPSET_ERR_PROTOCOL;
 
        /* Without holding any locks, create private part. */
        if (attr[IPSET_ATTR_DATA] &&
-           nla_parse_nested(tb, IPSET_ATTR_CREATE_MAX, attr[IPSET_ATTR_DATA],
-                            set->type->create_policy, NULL)) {
+           nla_parse_nested_deprecated(tb, IPSET_ATTR_CREATE_MAX, attr[IPSET_ATTR_DATA], set->type->create_policy, NULL)) {
                ret = -IPSET_ERR_PROTOCOL;
                goto put_out;
        }
        ip_set_id_t index;
 
        /* Second pass, so parser can't fail */
-       nla_parse(cda, IPSET_ATTR_CMD_MAX, attr, nlh->nlmsg_len - min_len,
-                 ip_set_setname_policy, NULL);
+       nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, attr,
+                            nlh->nlmsg_len - min_len, ip_set_setname_policy,
+                            NULL);
 
        cb->args[IPSET_CB_PROTO] = nla_get_u8(cda[IPSET_ATTR_PROTOCOL]);
        if (cda[IPSET_ATTR_SETNAME]) {
                memcpy(&errmsg->msg, nlh, nlh->nlmsg_len);
                cmdattr = (void *)&errmsg->msg + min_len;
 
-               nla_parse(cda, IPSET_ATTR_CMD_MAX, cmdattr,
-                         nlh->nlmsg_len - min_len, ip_set_adt_policy, NULL);
+               nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, cmdattr,
+                                    nlh->nlmsg_len - min_len,
+                                    ip_set_adt_policy, NULL);
 
                errline = nla_data(cda[IPSET_ATTR_LINENO]);
 
 
        use_lineno = !!attr[IPSET_ATTR_LINENO];
        if (attr[IPSET_ATTR_DATA]) {
-               if (nla_parse_nested(tb, IPSET_ATTR_ADT_MAX,
-                                    attr[IPSET_ATTR_DATA],
-                                    set->type->adt_policy, NULL))
+               if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
                        return -IPSET_ERR_PROTOCOL;
                ret = call_ad(ctnl, skb, set, tb, IPSET_ADD, flags,
                              use_lineno);
                        memset(tb, 0, sizeof(tb));
                        if (nla_type(nla) != IPSET_ATTR_DATA ||
                            !flag_nested(nla) ||
-                           nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, nla,
-                                            set->type->adt_policy, NULL))
+                           nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, nla, set->type->adt_policy, NULL))
                                return -IPSET_ERR_PROTOCOL;
                        ret = call_ad(ctnl, skb, set, tb, IPSET_ADD,
                                      flags, use_lineno);
 
        use_lineno = !!attr[IPSET_ATTR_LINENO];
        if (attr[IPSET_ATTR_DATA]) {
-               if (nla_parse_nested(tb, IPSET_ATTR_ADT_MAX,
-                                    attr[IPSET_ATTR_DATA],
-                                    set->type->adt_policy, NULL))
+               if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
                        return -IPSET_ERR_PROTOCOL;
                ret = call_ad(ctnl, skb, set, tb, IPSET_DEL, flags,
                              use_lineno);
                        memset(tb, 0, sizeof(*tb));
                        if (nla_type(nla) != IPSET_ATTR_DATA ||
                            !flag_nested(nla) ||
-                           nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, nla,
-                                            set->type->adt_policy, NULL))
+                           nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, nla, set->type->adt_policy, NULL))
                                return -IPSET_ERR_PROTOCOL;
                        ret = call_ad(ctnl, skb, set, tb, IPSET_DEL,
                                      flags, use_lineno);
        if (!set)
                return -ENOENT;
 
-       if (nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA],
-                            set->type->adt_policy, NULL))
+       if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
                return -IPSET_ERR_PROTOCOL;
 
        rcu_read_lock_bh();
 
 
        /* Parse mandatory identifying service fields first */
        if (nla == NULL ||
-           nla_parse_nested(attrs, IPVS_SVC_ATTR_MAX, nla,
-                            ip_vs_svc_policy, NULL))
+           nla_parse_nested_deprecated(attrs, IPVS_SVC_ATTR_MAX, nla, ip_vs_svc_policy, NULL))
                return -EINVAL;
 
        nla_af          = attrs[IPVS_SVC_ATTR_AF];
        mutex_lock(&__ip_vs_mutex);
 
        /* Try to find the service for which to dump destinations */
-       if (nlmsg_parse(cb->nlh, GENL_HDRLEN, attrs, IPVS_CMD_ATTR_MAX,
-                       ip_vs_cmd_policy, cb->extack))
+       if (nlmsg_parse_deprecated(cb->nlh, GENL_HDRLEN, attrs, IPVS_CMD_ATTR_MAX, ip_vs_cmd_policy, cb->extack))
                goto out_err;
 
 
 
        /* Parse mandatory identifying destination fields first */
        if (nla == NULL ||
-           nla_parse_nested(attrs, IPVS_DEST_ATTR_MAX, nla,
-                            ip_vs_dest_policy, NULL))
+           nla_parse_nested_deprecated(attrs, IPVS_DEST_ATTR_MAX, nla, ip_vs_dest_policy, NULL))
                return -EINVAL;
 
        nla_addr        = attrs[IPVS_DEST_ATTR_ADDR];
                struct nlattr *daemon_attrs[IPVS_DAEMON_ATTR_MAX + 1];
 
                if (!info->attrs[IPVS_CMD_ATTR_DAEMON] ||
-                   nla_parse_nested(daemon_attrs, IPVS_DAEMON_ATTR_MAX,
-                                    info->attrs[IPVS_CMD_ATTR_DAEMON],
-                                    ip_vs_daemon_policy, info->extack))
+                   nla_parse_nested_deprecated(daemon_attrs, IPVS_DAEMON_ATTR_MAX, info->attrs[IPVS_CMD_ATTR_DAEMON], ip_vs_daemon_policy, info->extack))
                        goto out;
 
                if (cmd == IPVS_CMD_NEW_DAEMON)
 
        struct nlattr *tb[CTA_IP_MAX+1];
        int ret = 0;
 
-       ret = nla_parse_nested(tb, CTA_IP_MAX, attr, NULL, NULL);
+       ret = nla_parse_nested_deprecated(tb, CTA_IP_MAX, attr, NULL, NULL);
        if (ret < 0)
                return ret;
 
-       ret = nla_validate_nested(attr, CTA_IP_MAX,
-                                 cta_ip_nla_policy, NULL);
+       ret = nla_validate_nested_deprecated(attr, CTA_IP_MAX,
+                                            cta_ip_nla_policy, NULL);
        if (ret)
                return ret;
 
        struct nlattr *tb[CTA_PROTO_MAX+1];
        int ret = 0;
 
-       ret = nla_parse_nested(tb, CTA_PROTO_MAX, attr, proto_nla_policy,
-                              NULL);
+       ret = nla_parse_nested_deprecated(tb, CTA_PROTO_MAX, attr,
+                                         proto_nla_policy, NULL);
        if (ret < 0)
                return ret;
 
        l4proto = nf_ct_l4proto_find(tuple->dst.protonum);
 
        if (likely(l4proto->nlattr_to_tuple)) {
-               ret = nla_validate_nested(attr, CTA_PROTO_MAX,
-                                         l4proto->nla_policy, NULL);
+               ret = nla_validate_nested_deprecated(attr, CTA_PROTO_MAX,
+                                                    l4proto->nla_policy,
+                                                    NULL);
                if (ret == 0)
                        ret = l4proto->nlattr_to_tuple(tb, tuple);
        }
 
        memset(tuple, 0, sizeof(*tuple));
 
-       err = nla_parse_nested(tb, CTA_TUPLE_MAX, cda[type], tuple_nla_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_TUPLE_MAX, cda[type],
+                                         tuple_nla_policy, NULL);
        if (err < 0)
                return err;
 
        int err;
        struct nlattr *tb[CTA_HELP_MAX+1];
 
-       err = nla_parse_nested(tb, CTA_HELP_MAX, attr, help_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_HELP_MAX, attr,
+                                         help_nla_policy, NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[CTA_PROTOINFO_MAX+1];
        int err = 0;
 
-       err = nla_parse_nested(tb, CTA_PROTOINFO_MAX, attr, protoinfo_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_PROTOINFO_MAX, attr,
+                                         protoinfo_policy, NULL);
        if (err < 0)
                return err;
 
        int err;
        struct nlattr *cda[CTA_SEQADJ_MAX+1];
 
-       err = nla_parse_nested(cda, CTA_SEQADJ_MAX, attr, seqadj_policy, NULL);
+       err = nla_parse_nested_deprecated(cda, CTA_SEQADJ_MAX, attr,
+                                         seqadj_policy, NULL);
        if (err < 0)
                return err;
 
        if (!synproxy)
                return 0;
 
-       err = nla_parse_nested(tb, CTA_SYNPROXY_MAX, cda[CTA_SYNPROXY],
-                              synproxy_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_SYNPROXY_MAX,
+                                         cda[CTA_SYNPROXY], synproxy_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
        struct nlattr *cda[CTA_MAX+1];
        int ret;
 
-       ret = nla_parse_nested(cda, CTA_MAX, attr, ct_nla_policy, NULL);
+       ret = nla_parse_nested_deprecated(cda, CTA_MAX, attr, ct_nla_policy,
+                                         NULL);
        if (ret < 0)
                return ret;
 
        struct nf_conntrack_expect *exp;
        int err;
 
-       err = nla_parse_nested(cda, CTA_EXPECT_MAX, attr, exp_nla_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(cda, CTA_EXPECT_MAX, attr,
+                                         exp_nla_policy, NULL);
        if (err < 0)
                return err;
 
        struct nf_conntrack_tuple nat_tuple = {};
        int err;
 
-       err = nla_parse_nested(tb, CTA_EXPECT_NAT_MAX, attr,
-                              exp_nat_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_EXPECT_NAT_MAX, attr,
+                                         exp_nat_nla_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!attr)
                return 0;
 
-       err = nla_parse_nested(tb, CTA_PROTOINFO_DCCP_MAX, attr,
-                              dccp_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_PROTOINFO_DCCP_MAX, attr,
+                                         dccp_nla_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!attr)
                return 0;
 
-       err = nla_parse_nested(tb, CTA_PROTOINFO_SCTP_MAX, attr,
-                              sctp_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_PROTOINFO_SCTP_MAX, attr,
+                                         sctp_nla_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!pattr)
                return 0;
 
-       err = nla_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, pattr,
-                              tcp_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_PROTOINFO_TCP_MAX, pattr,
+                                         tcp_nla_policy, NULL);
        if (err < 0)
                return err;
 
 
        struct nlattr *tb[CTA_PROTONAT_MAX+1];
        int err;
 
-       err = nla_parse_nested(tb, CTA_PROTONAT_MAX, attr,
-                              protonat_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_PROTONAT_MAX, attr,
+                                         protonat_nla_policy, NULL);
        if (err < 0)
                return err;
 
 
        memset(range, 0, sizeof(*range));
 
-       err = nla_parse_nested(tb, CTA_NAT_MAX, nat, nat_nla_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, CTA_NAT_MAX, nat,
+                                         nat_nla_policy, NULL);
        if (err < 0)
                return err;
 
 
        struct nft_stats *stats;
        int err;
 
-       err = nla_parse_nested(tb, NFTA_COUNTER_MAX, attr, nft_counter_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_COUNTER_MAX, attr,
+                                         nft_counter_policy, NULL);
        if (err < 0)
                return ERR_PTR(err);
 
        lockdep_assert_held(&net->nft.commit_mutex);
        lockdep_nfnl_nft_mutex_not_held();
 
-       err = nla_parse_nested(ha, NFTA_HOOK_MAX, nla[NFTA_CHAIN_HOOK],
-                              nft_hook_policy, NULL);
+       err = nla_parse_nested_deprecated(ha, NFTA_HOOK_MAX,
+                                         nla[NFTA_CHAIN_HOOK],
+                                         nft_hook_policy, NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[NFTA_EXPR_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFTA_EXPR_MAX, nla, nft_expr_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla,
+                                         nft_expr_policy, NULL);
        if (err < 0)
                return err;
 
                return PTR_ERR(type);
 
        if (tb[NFTA_EXPR_DATA]) {
-               err = nla_parse_nested(info->tb, type->maxattr,
-                                      tb[NFTA_EXPR_DATA], type->policy, NULL);
+               err = nla_parse_nested_deprecated(info->tb, type->maxattr,
+                                                 tb[NFTA_EXPR_DATA],
+                                                 type->policy, NULL);
                if (err < 0)
                        goto err1;
        } else
        struct nlattr *da[NFTA_SET_DESC_MAX + 1];
        int err;
 
-       err = nla_parse_nested(da, NFTA_SET_DESC_MAX, nla,
-                              nft_set_desc_policy, NULL);
+       err = nla_parse_nested_deprecated(da, NFTA_SET_DESC_MAX, nla,
+                                         nft_set_desc_policy, NULL);
        if (err < 0)
                return err;
 
        void *priv;
        int err;
 
-       err = nla_parse_nested(nla, NFTA_SET_ELEM_MAX, attr,
-                              nft_set_elem_policy, NULL);
+       err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
+                                         nft_set_elem_policy, NULL);
        if (err < 0)
                return err;
 
        u8 ulen;
        int err;
 
-       err = nla_parse_nested(nla, NFTA_SET_ELEM_MAX, attr,
-                              nft_set_elem_policy, NULL);
+       err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
+                                         nft_set_elem_policy, NULL);
        if (err < 0)
                return err;
 
        void *priv;
        int err;
 
-       err = nla_parse_nested(nla, NFTA_SET_ELEM_MAX, attr,
-                              nft_set_elem_policy, NULL);
+       err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
+                                         nft_set_elem_policy, NULL);
        if (err < 0)
                goto err1;
 
                goto err1;
 
        if (attr) {
-               err = nla_parse_nested(tb, type->maxattr, attr, type->policy,
-                                      NULL);
+               err = nla_parse_nested_deprecated(tb, type->maxattr, attr,
+                                                 type->policy, NULL);
                if (err < 0)
                        goto err2;
        } else {
        int hooknum, priority;
        int err, n = 0, i;
 
-       err = nla_parse_nested(tb, NFTA_FLOWTABLE_HOOK_MAX, attr,
-                              nft_flowtable_hook_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_FLOWTABLE_HOOK_MAX, attr,
+                                         nft_flowtable_hook_policy, NULL);
        if (err < 0)
                return err;
 
        struct nft_chain *chain;
        int err;
 
-       err = nla_parse_nested(tb, NFTA_VERDICT_MAX, nla, nft_verdict_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_VERDICT_MAX, nla,
+                                         nft_verdict_policy, NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[NFTA_DATA_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFTA_DATA_MAX, nla, nft_data_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_DATA_MAX, nla,
+                                         nft_data_policy, NULL);
        if (err < 0)
                return err;
 
 
                        return -ENOMEM;
                }
 
-               err = nla_parse(cda, ss->cb[cb_id].attr_count, attr, attrlen,
-                               ss->cb[cb_id].policy, extack);
+               err = nla_parse_deprecated(cda, ss->cb[cb_id].attr_count,
+                                          attr, attrlen,
+                                          ss->cb[cb_id].policy, extack);
                if (err < 0) {
                        rcu_read_unlock();
                        return err;
                                goto ack;
                        }
 
-                       err = nla_parse(cda, ss->cb[cb_id].attr_count, attr,
-                                       attrlen, ss->cb[cb_id].policy, NULL);
+                       err = nla_parse_deprecated(cda,
+                                                  ss->cb[cb_id].attr_count,
+                                                  attr, attrlen,
+                                                  ss->cb[cb_id].policy, NULL);
                        if (err < 0)
                                goto ack;
 
        if (skb->len < NLMSG_HDRLEN + sizeof(struct nfgenmsg))
                return;
 
-       err = nla_parse(cda, NFNL_BATCH_MAX, attr, attrlen, nfnl_batch_policy,
-                       NULL);
+       err = nla_parse_deprecated(cda, NFNL_BATCH_MAX, attr, attrlen,
+                                  nfnl_batch_policy, NULL);
        if (err < 0) {
                netlink_ack(skb, nlh, err, NULL);
                return;
 
        if (!attr)
                return 0;
 
-       err = nla_parse_nested(tb, NFACCT_FILTER_MAX, attr, filter_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, NFACCT_FILTER_MAX, attr,
+                                         filter_policy, NULL);
        if (err < 0)
                return err;
 
 
        int err;
        struct nlattr *tb[NFCTH_TUPLE_MAX+1];
 
-       err = nla_parse_nested(tb, NFCTH_TUPLE_MAX, attr,
-                              nfnl_cthelper_tuple_pol, NULL);
+       err = nla_parse_nested_deprecated(tb, NFCTH_TUPLE_MAX, attr,
+                                         nfnl_cthelper_tuple_pol, NULL);
        if (err < 0)
                return err;
 
        int err;
        struct nlattr *tb[NFCTH_POLICY_MAX+1];
 
-       err = nla_parse_nested(tb, NFCTH_POLICY_MAX, attr,
-                              nfnl_cthelper_expect_pol, NULL);
+       err = nla_parse_nested_deprecated(tb, NFCTH_POLICY_MAX, attr,
+                                         nfnl_cthelper_expect_pol, NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[NFCTH_POLICY_SET_MAX+1];
        unsigned int class_max;
 
-       ret = nla_parse_nested(tb, NFCTH_POLICY_SET_MAX, attr,
-                              nfnl_cthelper_expect_policy_set, NULL);
+       ret = nla_parse_nested_deprecated(tb, NFCTH_POLICY_SET_MAX, attr,
+                                         nfnl_cthelper_expect_policy_set,
+                                         NULL);
        if (ret < 0)
                return ret;
 
        struct nlattr *tb[NFCTH_POLICY_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFCTH_POLICY_MAX, attr,
-                              nfnl_cthelper_expect_pol, NULL);
+       err = nla_parse_nested_deprecated(tb, NFCTH_POLICY_MAX, attr,
+                                         nfnl_cthelper_expect_pol, NULL);
        if (err < 0)
                return err;
 
        unsigned int class_max;
        int err;
 
-       err = nla_parse_nested(tb, NFCTH_POLICY_SET_MAX, attr,
-                              nfnl_cthelper_expect_policy_set, NULL);
+       err = nla_parse_nested_deprecated(tb, NFCTH_POLICY_SET_MAX, attr,
+                                         nfnl_cthelper_expect_policy_set,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (!tb)
                return -ENOMEM;
 
-       ret = nla_parse_nested(tb, l4proto->ctnl_timeout.nlattr_max, attr,
-                              l4proto->ctnl_timeout.nla_policy, NULL);
+       ret = nla_parse_nested_deprecated(tb,
+                                         l4proto->ctnl_timeout.nlattr_max,
+                                         attr,
+                                         l4proto->ctnl_timeout.nla_policy,
+                                         NULL);
        if (ret < 0)
                goto err;
 
 
                struct nlattr *tb[NFQA_VLAN_MAX + 1];
                int err;
 
-               err = nla_parse_nested(tb, NFQA_VLAN_MAX, nfqa[NFQA_VLAN],
-                                      nfqa_vlan_policy, NULL);
+               err = nla_parse_nested_deprecated(tb, NFQA_VLAN_MAX,
+                                                 nfqa[NFQA_VLAN],
+                                                 nfqa_vlan_policy, NULL);
                if (err < 0)
                        return err;
 
 
        u32 flags;
        int err;
 
-       err = nla_parse_nested(tb, NFTA_RULE_COMPAT_MAX, attr,
-                              nft_rule_compat_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_RULE_COMPAT_MAX, attr,
+                                         nft_rule_compat_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!tb)
                return -ENOMEM;
 
-       ret = nla_parse_nested(tb, l4proto->ctnl_timeout.nlattr_max,
-                              attr, l4proto->ctnl_timeout.nla_policy,
-                              NULL);
+       ret = nla_parse_nested_deprecated(tb,
+                                         l4proto->ctnl_timeout.nlattr_max,
+                                         attr,
+                                         l4proto->ctnl_timeout.nla_policy,
+                                         NULL);
        if (ret < 0)
                goto err;
 
 
        struct nlattr *tb[NFTA_TUNNEL_KEY_IP_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_IP_MAX, attr,
-                              nft_tunnel_ip_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_TUNNEL_KEY_IP_MAX, attr,
+                                         nft_tunnel_ip_policy, NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[NFTA_TUNNEL_KEY_IP6_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_IP6_MAX, attr,
-                              nft_tunnel_ip6_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_TUNNEL_KEY_IP6_MAX, attr,
+                                         nft_tunnel_ip6_policy, NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[NFTA_TUNNEL_KEY_VXLAN_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_VXLAN_MAX, attr,
-                              nft_tunnel_opts_vxlan_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_TUNNEL_KEY_VXLAN_MAX, attr,
+                                         nft_tunnel_opts_vxlan_policy, NULL);
        if (err < 0)
                return err;
 
        uint8_t hwid, dir;
        int err, version;
 
-       err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_ERSPAN_MAX, attr,
-                              nft_tunnel_opts_erspan_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_TUNNEL_KEY_ERSPAN_MAX,
+                                         attr, nft_tunnel_opts_erspan_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
        struct nlattr *tb[NFTA_TUNNEL_KEY_OPTS_MAX + 1];
        int err;
 
-       err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_OPTS_MAX, attr,
-                              nft_tunnel_opts_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NFTA_TUNNEL_KEY_OPTS_MAX, attr,
+                                         nft_tunnel_opts_policy, NULL);
        if (err < 0)
                return err;
 
 
 
        doi_def->doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]);
 
-       if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_TAGLST],
-                               NLBL_CIPSOV4_A_MAX,
-                               netlbl_cipsov4_genl_policy, NULL) != 0)
+       if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_TAGLST],
+                                          NLBL_CIPSOV4_A_MAX,
+                                          netlbl_cipsov4_genl_policy,
+                                          NULL) != 0)
                return -EINVAL;
 
        nla_for_each_nested(nla, info->attrs[NLBL_CIPSOV4_A_TAGLST], nla_rem)
            !info->attrs[NLBL_CIPSOV4_A_MLSLVLLST])
                return -EINVAL;
 
-       if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
-                               NLBL_CIPSOV4_A_MAX,
-                               netlbl_cipsov4_genl_policy, NULL) != 0)
+       if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
+                                          NLBL_CIPSOV4_A_MAX,
+                                          netlbl_cipsov4_genl_policy,
+                                          NULL) != 0)
                return -EINVAL;
 
        doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL);
                            info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
                            nla_a_rem)
                if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) {
-                       if (nla_validate_nested(nla_a, NLBL_CIPSOV4_A_MAX,
-                                               netlbl_cipsov4_genl_policy,
-                                               NULL) != 0)
+                       if (nla_validate_nested_deprecated(nla_a,
+                                                          NLBL_CIPSOV4_A_MAX,
+                                                          netlbl_cipsov4_genl_policy,
+                                                          NULL) != 0)
                                goto add_std_failure;
                        nla_for_each_nested(nla_b, nla_a, nla_b_rem)
                                switch (nla_type(nla_b)) {
                }
 
        if (info->attrs[NLBL_CIPSOV4_A_MLSCATLST]) {
-               if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
-                                       NLBL_CIPSOV4_A_MAX,
-                                       netlbl_cipsov4_genl_policy, NULL) != 0)
+               if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
+                                                  NLBL_CIPSOV4_A_MAX,
+                                                  netlbl_cipsov4_genl_policy,
+                                                  NULL) != 0)
                        goto add_std_failure;
 
                nla_for_each_nested(nla_a,
                                    info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
                                    nla_a_rem)
                        if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) {
-                               if (nla_validate_nested(nla_a,
-                                                       NLBL_CIPSOV4_A_MAX,
-                                                       netlbl_cipsov4_genl_policy,
-                                                       NULL) != 0)
+                               if (nla_validate_nested_deprecated(nla_a,
+                                                                  NLBL_CIPSOV4_A_MAX,
+                                                                  netlbl_cipsov4_genl_policy,
+                                                                  NULL) != 0)
                                        goto add_std_failure;
                                nla_for_each_nested(nla_b, nla_a, nla_b_rem)
                                        switch (nla_type(nla_b)) {
 
                attrbuf = family->attrbuf;
 
        if (attrbuf) {
-               err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
-                                 family->policy, extack);
+               err = nlmsg_parse_deprecated(nlh, hdrlen, attrbuf,
+                                            family->maxattr, family->policy,
+                                            extack);
                if (err < 0)
                        goto out;
        }
 
        int rc;
        u32 idx;
 
-       rc = nlmsg_parse(cb->nlh, GENL_HDRLEN + nfc_genl_family.hdrsize,
-                        attrbuf, nfc_genl_family.maxattr, nfc_genl_policy,
-                        NULL);
+       rc = nlmsg_parse_deprecated(cb->nlh,
+                                   GENL_HDRLEN + nfc_genl_family.hdrsize,
+                                   attrbuf, nfc_genl_family.maxattr,
+                                   nfc_genl_policy, NULL);
        if (rc < 0)
                return ERR_PTR(rc);
 
        tlvs_len = 0;
 
        nla_for_each_nested(attr, info->attrs[NFC_ATTR_LLC_SDP], rem) {
-               rc = nla_parse_nested(sdp_attrs, NFC_SDP_ATTR_MAX, attr,
-                                     nfc_sdp_genl_policy, info->extack);
+               rc = nla_parse_nested_deprecated(sdp_attrs, NFC_SDP_ATTR_MAX,
+                                                attr, nfc_sdp_genl_policy,
+                                                info->extack);
 
                if (rc != 0) {
                        rc = -EINVAL;
 
        u32 ufid_flags;
        int err;
 
-       err = genlmsg_parse(cb->nlh, &dp_flow_genl_family, a,
-                           OVS_FLOW_ATTR_MAX, flow_policy, NULL);
+       err = genlmsg_parse_deprecated(cb->nlh, &dp_flow_genl_family, a,
+                                      OVS_FLOW_ATTR_MAX, flow_policy, NULL);
        if (err)
                return err;
        ufid_flags = ovs_nla_get_ufid_flags(a[OVS_FLOW_ATTR_UFID_FLAGS]);
 
        struct nlattr *a[OVS_USERSPACE_ATTR_MAX + 1];
        int error;
 
-       error = nla_parse_nested(a, OVS_USERSPACE_ATTR_MAX, attr,
-                                userspace_policy, NULL);
+       error = nla_parse_nested_deprecated(a, OVS_USERSPACE_ATTR_MAX, attr,
+                                           userspace_policy, NULL);
        if (error)
                return error;
 
        int nested_acts_start;
        int start, err;
 
-       err = nla_parse_strict(a, OVS_CHECK_PKT_LEN_ATTR_MAX, nla_data(attr),
-                              nla_len(attr), cpl_policy, NULL);
+       err = nla_parse_deprecated_strict(a, OVS_CHECK_PKT_LEN_ATTR_MAX,
+                                         nla_data(attr), nla_len(attr),
+                                         cpl_policy, NULL);
        if (err)
                return err;
 
 
                struct nlattr *attr[OVS_BAND_ATTR_MAX + 1];
                u32 band_max_delta_t;
 
-               err = nla_parse((struct nlattr **)&attr, OVS_BAND_ATTR_MAX,
-                               nla_data(nla), nla_len(nla), band_policy,
-                               NULL);
+               err = nla_parse_deprecated((struct nlattr **)&attr,
+                                          OVS_BAND_ATTR_MAX, nla_data(nla),
+                                          nla_len(nla), band_policy, NULL);
                if (err)
                        goto exit_free_meter;
 
 
        if (nla_len(attr) < sizeof(struct nlattr))
                return -EINVAL;
 
-       err = nla_parse_nested(exts, OVS_VXLAN_EXT_MAX, attr, exts_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(exts, OVS_VXLAN_EXT_MAX, attr,
+                                         exts_policy, NULL);
        if (err < 0)
                return err;
 
 
 
        ASSERT_RTNL();
 
-       err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_phonet_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                    ifa_phonet_policy, extack);
        if (err < 0)
                return err;
 
 
        ASSERT_RTNL();
 
-       err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_phonet_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
+                                    rtm_phonet_policy, extack);
        if (err < 0)
                return err;
 
 
 
        ASSERT_RTNL();
 
-       rc = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, qrtr_policy, extack);
+       rc = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
+                                   qrtr_policy, extack);
        if (rc < 0)
                return rc;
 
 
        int err;
 
        if (name == NULL) {
-               err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, extack);
+               err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL,
+                                                 extack);
                if (err < 0)
                        goto err_out;
                err = -EINVAL;
        int err;
        int i;
 
-       err = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX_PRIO, nla, NULL,
+                                         extack);
        if (err < 0)
                return err;
 
        int index;
        int err;
 
-       err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, extack);
        if (err < 0)
                goto err_out;
 
 
        b = skb_tail_pointer(skb);
 
-       err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, extack);
        if (err < 0)
                goto err_out;
 
        size_t attr_size = 0;
        struct tc_action *actions[TCA_ACT_MAX_PRIO] = {};
 
-       ret = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL, extack);
+       ret = nla_parse_nested_deprecated(tb, TCA_ACT_MAX_PRIO, nla, NULL,
+                                         extack);
        if (ret < 0)
                return ret;
 
            !netlink_capable(skb, CAP_NET_ADMIN))
                return -EPERM;
 
-       ret = nlmsg_parse(n, sizeof(struct tcamsg), tca, TCA_ROOT_MAX, NULL,
-                         extack);
+       ret = nlmsg_parse_deprecated(n, sizeof(struct tcamsg), tca,
+                                    TCA_ROOT_MAX, NULL, extack);
        if (ret < 0)
                return ret;
 
        if (tb1 == NULL)
                return NULL;
 
-       if (nla_parse(tb, TCA_ACT_MAX_PRIO, nla_data(tb1),
-                     NLMSG_ALIGN(nla_len(tb1)), NULL, NULL) < 0)
+       if (nla_parse_deprecated(tb, TCA_ACT_MAX_PRIO, nla_data(tb1), NLMSG_ALIGN(nla_len(tb1)), NULL, NULL) < 0)
                return NULL;
 
        if (tb[1] == NULL)
                return NULL;
-       if (nla_parse_nested(tb2, TCA_ACT_MAX, tb[1], NULL, NULL) < 0)
+       if (nla_parse_nested_deprecated(tb2, TCA_ACT_MAX, tb[1], NULL, NULL) < 0)
                return NULL;
        kind = tb2[TCA_ACT_KIND];
 
        u32 msecs_since = 0;
        u32 act_count = 0;
 
-       ret = nlmsg_parse(cb->nlh, sizeof(struct tcamsg), tb, TCA_ROOT_MAX,
-                         tcaa_policy, cb->extack);
+       ret = nlmsg_parse_deprecated(cb->nlh, sizeof(struct tcamsg), tb,
+                                    TCA_ROOT_MAX, tcaa_policy, cb->extack);
        if (ret < 0)
                return ret;
 
 
        if (!nla)
                return -EINVAL;
 
-       ret = nla_parse_nested(tb, TCA_ACT_BPF_MAX, nla, act_bpf_policy, NULL);
+       ret = nla_parse_nested_deprecated(tb, TCA_ACT_BPF_MAX, nla,
+                                         act_bpf_policy, NULL);
        if (ret < 0)
                return ret;
 
 
        if (!nla)
                return -EINVAL;
 
-       ret = nla_parse_nested(tb, TCA_CONNMARK_MAX, nla, connmark_policy,
-                              NULL);
+       ret = nla_parse_nested_deprecated(tb, TCA_CONNMARK_MAX, nla,
+                                         connmark_policy, NULL);
        if (ret < 0)
                return ret;
 
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_CSUM_MAX, nla, csum_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_CSUM_MAX, nla, csum_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_GACT_MAX, nla, gact_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_GACT_MAX, nla, gact_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        int ret = 0;
        int err;
 
-       err = nla_parse_nested(tb, TCA_IFE_MAX, nla, ife_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_IFE_MAX, nla, ife_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
                INIT_LIST_HEAD(&ife->metalist);
 
        if (tb[TCA_IFE_METALST]) {
-               err = nla_parse_nested(tb2, IFE_META_MAX, tb[TCA_IFE_METALST],
-                                      NULL, NULL);
+               err = nla_parse_nested_deprecated(tb2, IFE_META_MAX,
+                                                 tb[TCA_IFE_METALST], NULL,
+                                                 NULL);
                if (err)
                        goto metadata_parse_err;
                err = populate_metalist(ife, tb2, exists, rtnl_held);
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_IPT_MAX, nla, ipt_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_IPT_MAX, nla, ipt_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
                NL_SET_ERR_MSG_MOD(extack, "Mirred requires attributes to be passed");
                return -EINVAL;
        }
-       ret = nla_parse_nested(tb, TCA_MIRRED_MAX, nla, mirred_policy, extack);
+       ret = nla_parse_nested_deprecated(tb, TCA_MIRRED_MAX, nla,
+                                         mirred_policy, extack);
        if (ret < 0)
                return ret;
        if (!tb[TCA_MIRRED_PARMS]) {
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_NAT_MAX, nla, nat_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_NAT_MAX, nla, nat_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
                        goto err_out;
                }
 
-               err = nla_parse_nested(tb, TCA_PEDIT_KEY_EX_MAX, ka,
-                                      pedit_key_ex_policy, NULL);
+               err = nla_parse_nested_deprecated(tb, TCA_PEDIT_KEY_EX_MAX,
+                                                 ka, pedit_key_ex_policy,
+                                                 NULL);
                if (err)
                        goto err_out;
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_PEDIT_MAX, nla, pedit_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_PEDIT_MAX, nla,
+                                         pedit_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_POLICE_MAX, nla, police_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_POLICE_MAX, nla,
+                                         police_policy, NULL);
        if (err < 0)
                return err;
 
 
 
        if (!nla)
                return -EINVAL;
-       ret = nla_parse_nested(tb, TCA_SAMPLE_MAX, nla, sample_policy, NULL);
+       ret = nla_parse_nested_deprecated(tb, TCA_SAMPLE_MAX, nla,
+                                         sample_policy, NULL);
        if (ret < 0)
                return ret;
        if (!tb[TCA_SAMPLE_PARMS] || !tb[TCA_SAMPLE_RATE] ||
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_DEF_MAX, nla, simple_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_DEF_MAX, nla, simple_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (nla == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_SKBEDIT_MAX, nla, skbedit_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_SKBEDIT_MAX, nla,
+                                         skbedit_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!nla)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_SKBMOD_MAX, nla, skbmod_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_SKBMOD_MAX, nla,
+                                         skbmod_policy, NULL);
        if (err < 0)
                return err;
 
 
        int err, data_len, opt_len;
        u8 *data;
 
-       err = nla_parse_nested(tb, TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX,
-                              nla, geneve_opt_policy, extack);
+       err = nla_parse_nested_deprecated(tb,
+                                         TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX,
+                                         nla, geneve_opt_policy, extack);
        if (err < 0)
                return err;
 
        int err, rem, opt_len, len = nla_len(nla), opts_len = 0;
        const struct nlattr *attr, *head = nla_data(nla);
 
-       err = nla_validate(head, len, TCA_TUNNEL_KEY_ENC_OPTS_MAX,
-                          enc_opts_policy, extack);
+       err = nla_validate_deprecated(head, len, TCA_TUNNEL_KEY_ENC_OPTS_MAX,
+                                     enc_opts_policy, extack);
        if (err)
                return err;
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_TUNNEL_KEY_MAX, nla, tunnel_key_policy,
-                              extack);
+       err = nla_parse_nested_deprecated(tb, TCA_TUNNEL_KEY_MAX, nla,
+                                         tunnel_key_policy, extack);
        if (err < 0) {
                NL_SET_ERR_MSG(extack, "Failed to parse nested tunnel key attributes");
                return err;
 
        if (!nla)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_VLAN_MAX, nla, vlan_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_VLAN_MAX, nla, vlan_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
 replay:
        tp_created = 0;
 
-       err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*t), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
        if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN))
                return -EPERM;
 
-       err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*t), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
        int err;
        bool rtnl_held = false;
 
-       err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*t), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
        if (nlmsg_len(cb->nlh) < sizeof(*tcm))
                return skb->len;
 
-       err = nlmsg_parse(cb->nlh, sizeof(*tcm), tca, TCA_MAX, NULL,
-                         cb->extack);
+       err = nlmsg_parse_deprecated(cb->nlh, sizeof(*tcm), tca, TCA_MAX,
+                                    NULL, cb->extack);
        if (err)
                return err;
 
                return -EPERM;
 
 replay:
-       err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*t), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
        if (nlmsg_len(cb->nlh) < sizeof(*tcm))
                return skb->len;
 
-       err = nlmsg_parse(cb->nlh, sizeof(*tcm), tca, TCA_MAX, rtm_tca_policy,
-                         cb->extack);
+       err = nlmsg_parse_deprecated(cb->nlh, sizeof(*tcm), tca, TCA_MAX,
+                                    rtm_tca_policy, cb->extack);
        if (err)
                return err;
 
 
        if (tca[TCA_OPTIONS] == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_BASIC_MAX, tca[TCA_OPTIONS],
-                              basic_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_BASIC_MAX, tca[TCA_OPTIONS],
+                                         basic_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (tca[TCA_OPTIONS] == NULL)
                return -EINVAL;
 
-       ret = nla_parse_nested(tb, TCA_BPF_MAX, tca[TCA_OPTIONS], bpf_policy,
-                              NULL);
+       ret = nla_parse_nested_deprecated(tb, TCA_BPF_MAX, tca[TCA_OPTIONS],
+                                         bpf_policy, NULL);
        if (ret < 0)
                return ret;
 
 
                goto errout;
        new->handle = handle;
        new->tp = tp;
-       err = nla_parse_nested(tb, TCA_CGROUP_MAX, tca[TCA_OPTIONS],
-                              cgroup_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_CGROUP_MAX,
+                                         tca[TCA_OPTIONS], cgroup_policy,
+                                         NULL);
        if (err < 0)
                goto errout;
 
 
        if (opt == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_FLOW_MAX, opt, flow_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_FLOW_MAX, opt, flow_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX,
-                              nla, geneve_opt_policy, extack);
+       err = nla_parse_nested_deprecated(tb,
+                                         TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX,
+                                         nla, geneve_opt_policy, extack);
        if (err < 0)
                return err;
 
        const struct nlattr *nla_enc_key, *nla_opt_key, *nla_opt_msk = NULL;
        int err, option_len, key_depth, msk_depth = 0;
 
-       err = nla_validate_nested(tb[TCA_FLOWER_KEY_ENC_OPTS],
-                                 TCA_FLOWER_KEY_ENC_OPTS_MAX,
-                                 enc_opts_policy, extack);
+       err = nla_validate_nested_deprecated(tb[TCA_FLOWER_KEY_ENC_OPTS],
+                                            TCA_FLOWER_KEY_ENC_OPTS_MAX,
+                                            enc_opts_policy, extack);
        if (err)
                return err;
 
        nla_enc_key = nla_data(tb[TCA_FLOWER_KEY_ENC_OPTS]);
 
        if (tb[TCA_FLOWER_KEY_ENC_OPTS_MASK]) {
-               err = nla_validate_nested(tb[TCA_FLOWER_KEY_ENC_OPTS_MASK],
-                                         TCA_FLOWER_KEY_ENC_OPTS_MAX,
-                                         enc_opts_policy, extack);
+               err = nla_validate_nested_deprecated(tb[TCA_FLOWER_KEY_ENC_OPTS_MASK],
+                                                    TCA_FLOWER_KEY_ENC_OPTS_MAX,
+                                                    enc_opts_policy, extack);
                if (err)
                        return err;
 
                goto errout_mask_alloc;
        }
 
-       err = nla_parse_nested(tb, TCA_FLOWER_MAX, tca[TCA_OPTIONS],
-                              fl_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_FLOWER_MAX,
+                                         tca[TCA_OPTIONS], fl_policy, NULL);
        if (err < 0)
                goto errout_tb;
 
        tb = kcalloc(TCA_FLOWER_MAX + 1, sizeof(struct nlattr *), GFP_KERNEL);
        if (!tb)
                return ERR_PTR(-ENOBUFS);
-       err = nla_parse_nested(tb, TCA_FLOWER_MAX, tca[TCA_OPTIONS],
-                              fl_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_FLOWER_MAX,
+                                         tca[TCA_OPTIONS], fl_policy, NULL);
        if (err)
                goto errout_tb;
 
 
        if (!opt)
                return handle ? -EINVAL : 0; /* Succeed if it is old method. */
 
-       err = nla_parse_nested(tb, TCA_FW_MAX, opt, fw_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_FW_MAX, opt, fw_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (head)
                return -EEXIST;
 
-       err = nla_parse_nested(tb, TCA_MATCHALL_MAX, tca[TCA_OPTIONS],
-                              mall_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_MATCHALL_MAX,
+                                         tca[TCA_OPTIONS], mall_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (opt == NULL)
                return handle ? -EINVAL : 0;
 
-       err = nla_parse_nested(tb, TCA_ROUTE4_MAX, opt, route4_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_ROUTE4_MAX, opt,
+                                         route4_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (opt == NULL)
                return handle ? -EINVAL : 0;
 
-       err = nla_parse_nested(tb, TCA_RSVP_MAX, opt, rsvp_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_RSVP_MAX, opt, rsvp_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (!opt)
                return 0;
 
-       err = nla_parse_nested(tb, TCA_TCINDEX_MAX, opt, tcindex_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_TCINDEX_MAX, opt,
+                                         tcindex_policy, NULL);
        if (err < 0)
                return err;
 
 
                }
        }
 
-       err = nla_parse_nested(tb, TCA_U32_MAX, opt, u32_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_U32_MAX, opt, u32_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
        struct xt_match *match;
        int mdata_len, ret;
 
-       ret = nla_parse(tb, TCA_EM_IPT_MAX, data, data_len, em_ipt_policy,
-                       NULL);
+       ret = nla_parse_deprecated(tb, TCA_EM_IPT_MAX, data, data_len,
+                                  em_ipt_policy, NULL);
        if (ret < 0)
                return ret;
 
 
        struct tcf_meta_hdr *hdr;
        struct meta_match *meta = NULL;
 
-       err = nla_parse(tb, TCA_EM_META_MAX, data, len, meta_policy, NULL);
+       err = nla_parse_deprecated(tb, TCA_EM_META_MAX, data, len,
+                                  meta_policy, NULL);
        if (err < 0)
                goto errout;
 
 
        if (!nla)
                return 0;
 
-       err = nla_parse_nested(tb, TCA_EMATCH_TREE_MAX, nla, em_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_EMATCH_TREE_MAX, nla,
+                                         em_policy, NULL);
        if (err < 0)
                goto errout;
 
 
        u16 *tab = NULL;
        int err;
 
-       err = nla_parse_nested(tb, TCA_STAB_MAX, opt, stab_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_STAB_MAX, opt, stab_policy,
+                                         extack);
        if (err < 0)
                return ERR_PTR(err);
        if (!tb[TCA_STAB_BASE]) {
            !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN))
                return -EPERM;
 
-       err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, rtm_tca_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*tcm), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
 
 replay:
        /* Reinit, just in case something touches this. */
-       err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, rtm_tca_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*tcm), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
        idx = 0;
        ASSERT_RTNL();
 
-       err = nlmsg_parse(nlh, sizeof(struct tcmsg), tca, TCA_MAX,
-                         rtm_tca_policy, cb->extack);
+       err = nlmsg_parse_deprecated(nlh, sizeof(struct tcmsg), tca, TCA_MAX,
+                                    rtm_tca_policy, cb->extack);
        if (err < 0)
                return err;
 
            !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN))
                return -EPERM;
 
-       err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, rtm_tca_policy,
-                         extack);
+       err = nlmsg_parse_deprecated(n, sizeof(*tcm), tca, TCA_MAX,
+                                    rtm_tca_policy, extack);
        if (err < 0)
                return err;
 
 
        if (opt == NULL)
                return -EINVAL;
 
-       error = nla_parse_nested(tb, TCA_ATM_MAX, opt, atm_policy, NULL);
+       error = nla_parse_nested_deprecated(tb, TCA_ATM_MAX, opt, atm_policy,
+                                           NULL);
        if (error < 0)
                return error;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_CAKE_MAX, opt, cake_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_CAKE_MAX, opt, cake_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_CBQ_MAX, opt, cbq_policy,
+                                         extack);
        if (err < 0)
                return err;
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_CBQ_MAX, opt, cbq_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
        struct tc_cbs_qopt *qopt;
        int err;
 
-       err = nla_parse_nested(tb, TCA_CBS_MAX, opt, cbs_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_CBS_MAX, opt, cbs_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
        if (opt == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_CHOKE_MAX, opt, choke_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_CHOKE_MAX, opt,
+                                         choke_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_CODEL_MAX, opt, codel_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_CODEL_MAX, opt,
+                                         codel_policy, NULL);
        if (err < 0)
                return err;
 
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_DRR_MAX, opt, drr_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_DRR_MAX, opt, drr_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
        if (!opt)
                goto errout;
 
-       err = nla_parse_nested(tb, TCA_DSMARK_MAX, opt, dsmark_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_DSMARK_MAX, opt,
+                                         dsmark_policy, NULL);
        if (err < 0)
                goto errout;
 
        if (err)
                return err;
 
-       err = nla_parse_nested(tb, TCA_DSMARK_MAX, opt, dsmark_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_DSMARK_MAX, opt,
+                                         dsmark_policy, NULL);
        if (err < 0)
                goto errout;
 
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_ETF_MAX, opt, etf_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_ETF_MAX, opt, etf_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_FQ_MAX, opt, fq_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_FQ_MAX, opt, fq_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_FQ_CODEL_MAX, opt, fq_codel_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_FQ_CODEL_MAX, opt,
+                                         fq_codel_policy, NULL);
        if (err < 0)
                return err;
        if (tb[TCA_FQ_CODEL_FLOWS]) {
 
        struct nlattr *tb[TCA_GRED_VQ_MAX + 1];
        u32 dp;
 
-       nla_parse_nested(tb, TCA_GRED_VQ_MAX, entry, gred_vq_policy, NULL);
+       nla_parse_nested_deprecated(tb, TCA_GRED_VQ_MAX, entry,
+                                   gred_vq_policy, NULL);
 
        dp = nla_get_u32(tb[TCA_GRED_VQ_DP]);
 
        int err;
        u32 dp;
 
-       err = nla_parse_nested(tb, TCA_GRED_VQ_MAX, entry, gred_vq_policy,
-                              extack);
+       err = nla_parse_nested_deprecated(tb, TCA_GRED_VQ_MAX, entry,
+                                         gred_vq_policy, extack);
        if (err < 0)
                return err;
 
        const struct nlattr *attr;
        int rem, err;
 
-       err = nla_validate_nested(vqs, TCA_GRED_VQ_ENTRY_MAX,
-                                 gred_vqe_policy, extack);
+       err = nla_validate_nested_deprecated(vqs, TCA_GRED_VQ_ENTRY_MAX,
+                                            gred_vqe_policy, extack);
        if (err < 0)
                return err;
 
        if (opt == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_GRED_MAX, opt, gred_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_GRED_MAX, opt, gred_policy,
+                                         extack);
        if (err < 0)
                return err;
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_GRED_MAX, opt, gred_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_GRED_MAX, opt, gred_policy,
+                                         extack);
        if (err < 0)
                return err;
 
 
        if (opt == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_HFSC_MAX, opt, hfsc_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_HFSC_MAX, opt, hfsc_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_HHF_MAX, opt, hhf_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_HHF_MAX, opt, hhf_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (err)
                return err;
 
-       err = nla_parse_nested(tb, TCA_HTB_MAX, opt, htb_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_HTB_MAX, opt, htb_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
        if (!opt)
                goto failure;
 
-       err = nla_parse_nested(tb, TCA_HTB_MAX, opt, htb_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_HTB_MAX, opt, htb_policy,
+                                         NULL);
        if (err < 0)
                goto failure;
 
 
        int nested_len = nla_len(nla) - NLA_ALIGN(len);
 
        if (nested_len >= nla_attr_size(0))
-               return nla_parse(tb, maxtype, nla_data(nla) + NLA_ALIGN(len),
-                                nested_len, policy, NULL);
+               return nla_parse_deprecated(tb, maxtype,
+                                           nla_data(nla) + NLA_ALIGN(len),
+                                           nested_len, policy, NULL);
 
        memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
        return 0;
 
        }
 
        if (nested_len >= nla_attr_size(0))
-               return nla_parse(tb, maxtype, nla_data(nla) + NLA_ALIGN(len),
-                                nested_len, policy, NULL);
+               return nla_parse_deprecated(tb, maxtype,
+                                           nla_data(nla) + NLA_ALIGN(len),
+                                           nested_len, policy, NULL);
 
        memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
        return 0;
 
        if (!opt)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_PIE_MAX, opt, pie_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_PIE_MAX, opt, pie_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb, TCA_QFQ_MAX, tca[TCA_OPTIONS], qfq_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_QFQ_MAX, tca[TCA_OPTIONS],
+                                         qfq_policy, NULL);
        if (err < 0)
                return err;
 
 
        if (opt == NULL)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, TCA_RED_MAX, opt, red_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_RED_MAX, opt, red_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        int err;
 
        if (opt) {
-               err = nla_parse_nested(tb, TCA_SFB_MAX, opt, sfb_policy, NULL);
+               err = nla_parse_nested_deprecated(tb, TCA_SFB_MAX, opt,
+                                                 sfb_policy, NULL);
                if (err < 0)
                        return -EINVAL;
 
 
        struct nlattr *tb[TCA_TAPRIO_SCHED_ENTRY_MAX + 1] = { };
        int err;
 
-       err = nla_parse_nested(tb, TCA_TAPRIO_SCHED_ENTRY_MAX, n,
-                              entry_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_TAPRIO_SCHED_ENTRY_MAX, n,
+                                         entry_policy, NULL);
        if (err < 0) {
                NL_SET_ERR_MSG(extack, "Could not parse nested entry");
                return -EINVAL;
        u32 index;
        int err;
 
-       err = nla_parse_nested(tb_list, TCA_TAPRIO_SCHED_MAX,
-                              n, entry_list_policy, NULL);
+       err = nla_parse_nested_deprecated(tb_list, TCA_TAPRIO_SCHED_MAX, n,
+                                         entry_list_policy, NULL);
        if (err < 0) {
                NL_SET_ERR_MSG(extack, "Could not parse nested entry");
                return -EINVAL;
                return -EINVAL;
        }
 
-       err = nla_parse_nested(tb_entry, TCA_TAPRIO_SCHED_ENTRY_MAX,
-                              tb_list[TCA_TAPRIO_SCHED_ENTRY],
-                              entry_policy, NULL);
+       err = nla_parse_nested_deprecated(tb_entry,
+                                         TCA_TAPRIO_SCHED_ENTRY_MAX,
+                                         tb_list[TCA_TAPRIO_SCHED_ENTRY],
+                                         entry_policy, NULL);
        if (err < 0) {
                NL_SET_ERR_MSG(extack, "Could not parse nested entry");
                return -EINVAL;
        int i, err, size;
        ktime_t start;
 
-       err = nla_parse_nested(tb, TCA_TAPRIO_ATTR_MAX, opt,
-                              taprio_policy, extack);
+       err = nla_parse_nested_deprecated(tb, TCA_TAPRIO_ATTR_MAX, opt,
+                                         taprio_policy, extack);
        if (err < 0)
                return err;
 
 
        s64 buffer, mtu;
        u64 rate64 = 0, prate64 = 0;
 
-       err = nla_parse_nested(tb, TCA_TBF_MAX, opt, tbf_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, TCA_TBF_MAX, opt, tbf_policy,
+                                         NULL);
        if (err < 0)
                return err;
 
 
        if (!info->attrs[TIPC_NLA_BEARER])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
-                              info->attrs[TIPC_NLA_BEARER],
-                              tipc_nl_bearer_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
+                                         info->attrs[TIPC_NLA_BEARER],
+                                         tipc_nl_bearer_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_BEARER])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
-                              info->attrs[TIPC_NLA_BEARER],
-                              tipc_nl_bearer_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
+                                         info->attrs[TIPC_NLA_BEARER],
+                                         tipc_nl_bearer_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_BEARER])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
-                              info->attrs[TIPC_NLA_BEARER],
-                              tipc_nl_bearer_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
+                                         info->attrs[TIPC_NLA_BEARER],
+                                         tipc_nl_bearer_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_BEARER])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
-                              info->attrs[TIPC_NLA_BEARER],
-                              tipc_nl_bearer_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
+                                         info->attrs[TIPC_NLA_BEARER],
+                                         tipc_nl_bearer_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_BEARER])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
-                              info->attrs[TIPC_NLA_BEARER],
-                              tipc_nl_bearer_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
+                                         info->attrs[TIPC_NLA_BEARER],
+                                         tipc_nl_bearer_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_MEDIA])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
-                              info->attrs[TIPC_NLA_MEDIA],
-                              tipc_nl_media_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_MEDIA_MAX,
+                                         info->attrs[TIPC_NLA_MEDIA],
+                                         tipc_nl_media_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_MEDIA])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
-                              info->attrs[TIPC_NLA_MEDIA],
-                              tipc_nl_media_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_MEDIA_MAX,
+                                         info->attrs[TIPC_NLA_MEDIA],
+                                         tipc_nl_media_policy, info->extack);
 
        if (!attrs[TIPC_NLA_MEDIA_NAME])
                return -EINVAL;
 
 {
        int err;
 
-       err = nla_parse_nested(props, TIPC_NLA_PROP_MAX, prop,
-                              tipc_nl_prop_policy, NULL);
+       err = nla_parse_nested_deprecated(props, TIPC_NLA_PROP_MAX, prop,
+                                         tipc_nl_prop_policy, NULL);
        if (err)
                return err;
 
 
        if (!info->attrs[TIPC_NLA_NET])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX,
-                              info->attrs[TIPC_NLA_NET], tipc_nl_net_policy,
-                              info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_NET_MAX,
+                                         info->attrs[TIPC_NLA_NET],
+                                         tipc_nl_net_policy, info->extack);
 
        if (err)
                return err;
 
        if (!*attr)
                return -EOPNOTSUPP;
 
-       return nlmsg_parse(nlh, GENL_HDRLEN, *attr, maxattr, tipc_nl_policy,
-                          NULL);
+       return nlmsg_parse_deprecated(nlh, GENL_HDRLEN, *attr, maxattr,
+                                     tipc_nl_policy, NULL);
 }
 
 int __init tipc_netlink_start(void)
 
        if (err)
                goto doit_out;
 
-       err = nla_parse(attrbuf, tipc_genl_family.maxattr,
-                       (const struct nlattr *)trans_buf->data,
-                       trans_buf->len, NULL, NULL);
+       err = nla_parse_deprecated(attrbuf, tipc_genl_family.maxattr,
+                                  (const struct nlattr *)trans_buf->data,
+                                  trans_buf->len, NULL, NULL);
        if (err)
                goto doit_out;
 
        if (!attrs[TIPC_NLA_BEARER])
                return -EINVAL;
 
-       err = nla_parse_nested(bearer, TIPC_NLA_BEARER_MAX,
-                              attrs[TIPC_NLA_BEARER], NULL, NULL);
+       err = nla_parse_nested_deprecated(bearer, TIPC_NLA_BEARER_MAX,
+                                         attrs[TIPC_NLA_BEARER], NULL, NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_LINK])
                return -EINVAL;
 
-       err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK],
-                              NULL, NULL);
+       err = nla_parse_nested_deprecated(link, TIPC_NLA_LINK_MAX,
+                                         attrs[TIPC_NLA_LINK], NULL, NULL);
        if (err)
                return err;
 
        if (!link[TIPC_NLA_LINK_PROP])
                return -EINVAL;
 
-       err = nla_parse_nested(prop, TIPC_NLA_PROP_MAX,
-                              link[TIPC_NLA_LINK_PROP], NULL, NULL);
+       err = nla_parse_nested_deprecated(prop, TIPC_NLA_PROP_MAX,
+                                         link[TIPC_NLA_LINK_PROP], NULL,
+                                         NULL);
        if (err)
                return err;
 
        if (!link[TIPC_NLA_LINK_STATS])
                return -EINVAL;
 
-       err = nla_parse_nested(stats, TIPC_NLA_STATS_MAX,
-                              link[TIPC_NLA_LINK_STATS], NULL, NULL);
+       err = nla_parse_nested_deprecated(stats, TIPC_NLA_STATS_MAX,
+                                         link[TIPC_NLA_LINK_STATS], NULL,
+                                         NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_LINK])
                return -EINVAL;
 
-       err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK],
-                              NULL, NULL);
+       err = nla_parse_nested_deprecated(link, TIPC_NLA_LINK_MAX,
+                                         attrs[TIPC_NLA_LINK], NULL, NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_NAME_TABLE])
                return -EINVAL;
 
-       err = nla_parse_nested(nt, TIPC_NLA_NAME_TABLE_MAX,
-                              attrs[TIPC_NLA_NAME_TABLE], NULL, NULL);
+       err = nla_parse_nested_deprecated(nt, TIPC_NLA_NAME_TABLE_MAX,
+                                         attrs[TIPC_NLA_NAME_TABLE], NULL,
+                                         NULL);
        if (err)
                return err;
 
        if (!nt[TIPC_NLA_NAME_TABLE_PUBL])
                return -EINVAL;
 
-       err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX,
-                              nt[TIPC_NLA_NAME_TABLE_PUBL], NULL, NULL);
+       err = nla_parse_nested_deprecated(publ, TIPC_NLA_PUBL_MAX,
+                                         nt[TIPC_NLA_NAME_TABLE_PUBL], NULL,
+                                         NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_PUBL])
                return -EINVAL;
 
-       err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX, attrs[TIPC_NLA_PUBL],
-                              NULL, NULL);
+       err = nla_parse_nested_deprecated(publ, TIPC_NLA_PUBL_MAX,
+                                         attrs[TIPC_NLA_PUBL], NULL, NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_SOCK])
                return -EINVAL;
 
-       err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX, attrs[TIPC_NLA_SOCK],
-                              NULL, NULL);
+       err = nla_parse_nested_deprecated(sock, TIPC_NLA_SOCK_MAX,
+                                         attrs[TIPC_NLA_SOCK], NULL, NULL);
        if (err)
                return err;
 
                u32 node;
                struct nlattr *con[TIPC_NLA_CON_MAX + 1];
 
-               err = nla_parse_nested(con, TIPC_NLA_CON_MAX,
-                                      sock[TIPC_NLA_SOCK_CON], NULL, NULL);
+               err = nla_parse_nested_deprecated(con, TIPC_NLA_CON_MAX,
+                                                 sock[TIPC_NLA_SOCK_CON],
+                                                 NULL, NULL);
 
                if (err)
                        return err;
        if (!attrs[TIPC_NLA_MEDIA])
                return -EINVAL;
 
-       err = nla_parse_nested(media, TIPC_NLA_MEDIA_MAX,
-                              attrs[TIPC_NLA_MEDIA], NULL, NULL);
+       err = nla_parse_nested_deprecated(media, TIPC_NLA_MEDIA_MAX,
+                                         attrs[TIPC_NLA_MEDIA], NULL, NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_NODE])
                return -EINVAL;
 
-       err = nla_parse_nested(node, TIPC_NLA_NODE_MAX, attrs[TIPC_NLA_NODE],
-                              NULL, NULL);
+       err = nla_parse_nested_deprecated(node, TIPC_NLA_NODE_MAX,
+                                         attrs[TIPC_NLA_NODE], NULL, NULL);
        if (err)
                return err;
 
        if (!attrs[TIPC_NLA_NET])
                return -EINVAL;
 
-       err = nla_parse_nested(net, TIPC_NLA_NET_MAX, attrs[TIPC_NLA_NET],
-                              NULL, NULL);
+       err = nla_parse_nested_deprecated(net, TIPC_NLA_NET_MAX,
+                                         attrs[TIPC_NLA_NET], NULL, NULL);
        if (err)
                return err;
 
 
        if (!info->attrs[TIPC_NLA_NET])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX,
-                              info->attrs[TIPC_NLA_NET], tipc_nl_net_policy,
-                              info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_NET_MAX,
+                                         info->attrs[TIPC_NLA_NET],
+                                         tipc_nl_net_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_LINK])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX,
-                              info->attrs[TIPC_NLA_LINK],
-                              tipc_nl_link_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_LINK_MAX,
+                                         info->attrs[TIPC_NLA_LINK],
+                                         tipc_nl_link_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_LINK])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX,
-                              info->attrs[TIPC_NLA_LINK],
-                              tipc_nl_link_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_LINK_MAX,
+                                         info->attrs[TIPC_NLA_LINK],
+                                         tipc_nl_link_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_LINK])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX,
-                              info->attrs[TIPC_NLA_LINK],
-                              tipc_nl_link_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_LINK_MAX,
+                                         info->attrs[TIPC_NLA_LINK],
+                                         tipc_nl_link_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[TIPC_NLA_MON])
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, TIPC_NLA_MON_MAX,
-                              info->attrs[TIPC_NLA_MON],
-                              tipc_nl_monitor_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, TIPC_NLA_MON_MAX,
+                                         info->attrs[TIPC_NLA_MON],
+                                         tipc_nl_monitor_policy,
+                                         info->extack);
        if (err)
                return err;
 
                if (!attrs[TIPC_NLA_MON])
                        return -EINVAL;
 
-               err = nla_parse_nested(mon, TIPC_NLA_MON_MAX,
-                                      attrs[TIPC_NLA_MON],
-                                      tipc_nl_monitor_policy, NULL);
+               err = nla_parse_nested_deprecated(mon, TIPC_NLA_MON_MAX,
+                                                 attrs[TIPC_NLA_MON],
+                                                 tipc_nl_monitor_policy,
+                                                 NULL);
                if (err)
                        return err;
 
 
                if (!attrs[TIPC_NLA_SOCK])
                        return -EINVAL;
 
-               err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX,
-                                      attrs[TIPC_NLA_SOCK],
-                                      tipc_nl_sock_policy, NULL);
+               err = nla_parse_nested_deprecated(sock, TIPC_NLA_SOCK_MAX,
+                                                 attrs[TIPC_NLA_SOCK],
+                                                 tipc_nl_sock_policy, NULL);
                if (err)
                        return err;
 
 
                if (!attrs[TIPC_NLA_BEARER])
                        return -EINVAL;
 
-               err = nla_parse_nested(battrs, TIPC_NLA_BEARER_MAX,
-                                      attrs[TIPC_NLA_BEARER],
-                                      tipc_nl_bearer_policy, NULL);
+               err = nla_parse_nested_deprecated(battrs, TIPC_NLA_BEARER_MAX,
+                                                 attrs[TIPC_NLA_BEARER],
+                                                 tipc_nl_bearer_policy, NULL);
                if (err)
                        return err;
 
        struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
        struct udp_media_addr *dst;
 
-       if (nla_parse_nested(opts, TIPC_NLA_UDP_MAX, attr,
-                            tipc_nl_udp_policy, NULL))
+       if (nla_parse_nested_deprecated(opts, TIPC_NLA_UDP_MAX, attr, tipc_nl_udp_policy, NULL))
                return -EINVAL;
 
        if (!opts[TIPC_NLA_UDP_REMOTE])
        if (!attrs[TIPC_NLA_BEARER_UDP_OPTS])
                goto err;
 
-       if (nla_parse_nested(opts, TIPC_NLA_UDP_MAX,
-                            attrs[TIPC_NLA_BEARER_UDP_OPTS],
-                            tipc_nl_udp_policy, NULL))
+       if (nla_parse_nested_deprecated(opts, TIPC_NLA_UDP_MAX, attrs[TIPC_NLA_BEARER_UDP_OPTS], tipc_nl_udp_policy, NULL))
                goto err;
 
        if (!opts[TIPC_NLA_UDP_LOCAL] || !opts[TIPC_NLA_UDP_REMOTE]) {
 
        int err;
 
        if (!cb->args[0]) {
-               err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
-                                 genl_family_attrbuf(&nl80211_fam),
-                                 nl80211_fam.maxattr, nl80211_policy, NULL);
+               err = nlmsg_parse_deprecated(cb->nlh,
+                                            GENL_HDRLEN + nl80211_fam.hdrsize,
+                                            genl_family_attrbuf(&nl80211_fam),
+                                            nl80211_fam.maxattr,
+                                            nl80211_policy, NULL);
                if (err)
                        return err;
 
                                 struct key_parse *k)
 {
        struct nlattr *tb[NL80211_KEY_MAX + 1];
-       int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
-                                  nl80211_key_policy, info->extack);
+       int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key,
+                                             nl80211_key_policy,
+                                             info->extack);
        if (err)
                return err;
 
        if (tb[NL80211_KEY_DEFAULT_TYPES]) {
                struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
 
-               err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
-                                      tb[NL80211_KEY_DEFAULT_TYPES],
-                                      nl80211_key_default_policy,
-                                      info->extack);
+               err = nla_parse_nested_deprecated(kdt,
+                                                 NUM_NL80211_KEY_DEFAULT_TYPES - 1,
+                                                 tb[NL80211_KEY_DEFAULT_TYPES],
+                                                 nl80211_key_default_policy,
+                                                 info->extack);
                if (err)
                        return err;
 
 
        if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
                struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
-               int err = nla_parse_nested(kdt,
-                                          NUM_NL80211_KEY_DEFAULT_TYPES - 1,
-                                          info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
-                                          nl80211_key_default_policy,
-                                          info->extack);
+               int err = nla_parse_nested_deprecated(kdt,
+                                                     NUM_NL80211_KEY_DEFAULT_TYPES - 1,
+                                                     info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
+                                                     nl80211_key_default_policy,
+                                                     info->extack);
                if (err)
                        return err;
 
                                    struct nl80211_dump_wiphy_state *state)
 {
        struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
-       int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, tb,
-                             nl80211_fam.maxattr, nl80211_policy, NULL);
+       int ret = nlmsg_parse_deprecated(cb->nlh,
+                                        GENL_HDRLEN + nl80211_fam.hdrsize,
+                                        tb, nl80211_fam.maxattr,
+                                        nl80211_policy, NULL);
        /* ignore parse errors for backward compatibility */
        if (ret)
                return 0;
                nla_for_each_nested(nl_txq_params,
                                    info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
                                    rem_txq_params) {
-                       result = nla_parse_nested(tb, NL80211_TXQ_ATTR_MAX,
-                                                 nl_txq_params,
-                                                 txq_params_policy,
-                                                 info->extack);
+                       result = nla_parse_nested_deprecated(tb,
+                                                            NL80211_TXQ_ATTR_MAX,
+                                                            nl_txq_params,
+                                                            txq_params_policy,
+                                                            info->extack);
                        if (result)
                                return result;
                        result = parse_txq_params(tb, &txq_params);
        if (!nla)
                return -EINVAL;
 
-       if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX, nla,
-                            mntr_flags_policy, NULL))
+       if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL))
                return -EINVAL;
 
        for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
                sband = rdev->wiphy.bands[band];
                if (sband == NULL)
                        return -EINVAL;
-               err = nla_parse_nested(tb, NL80211_TXRATE_MAX, tx_rates,
-                                      nl80211_txattr_policy, info->extack);
+               err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX,
+                                                 tx_rates,
+                                                 nl80211_txattr_policy,
+                                                 info->extack);
                if (err)
                        return err;
                if (tb[NL80211_TXRATE_LEGACY]) {
        if (attrs[NL80211_ATTR_FTM_RESPONDER]) {
                struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1];
 
-               err = nla_parse_nested(tb, NL80211_FTM_RESP_ATTR_MAX,
-                                      attrs[NL80211_ATTR_FTM_RESPONDER],
-                                      NULL, NULL);
+               err = nla_parse_nested_deprecated(tb,
+                                                 NL80211_FTM_RESP_ATTR_MAX,
+                                                 attrs[NL80211_ATTR_FTM_RESPONDER],
+                                                 NULL, NULL);
                if (err)
                        return err;
 
        if (!nla)
                return 0;
 
-       if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX, nla,
-                            sta_flags_policy, info->extack))
+       if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack))
                return -EINVAL;
 
        /*
                return 0;
 
        nla = info->attrs[NL80211_ATTR_STA_WME];
-       err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla,
-                              nl80211_sta_wme_policy, info->extack);
+       err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla,
+                                         nl80211_sta_wme_policy,
+                                         info->extack);
        if (err)
                return err;
 
 
        if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
                return -EINVAL;
-       if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
-                            info->attrs[NL80211_ATTR_MESH_CONFIG],
-                            nl80211_meshconf_params_policy, info->extack))
+       if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack))
                return -EINVAL;
 
        /* This makes sure that there aren't more than 32 mesh config
 
        if (!info->attrs[NL80211_ATTR_MESH_SETUP])
                return -EINVAL;
-       if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX,
-                            info->attrs[NL80211_ATTR_MESH_SETUP],
-                            nl80211_mesh_setup_params_policy, info->extack))
+       if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack))
                return -EINVAL;
 
        if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
 
        nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
                            rem_reg_rules) {
-               r = nla_parse_nested(tb, NL80211_REG_RULE_ATTR_MAX,
-                                    nl_reg_rule, reg_rule_policy,
-                                    info->extack);
+               r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX,
+                                               nl_reg_rule, reg_rule_policy,
+                                               info->extack);
                if (r)
                        goto bad_reg;
                r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
        if (!nla_ok(nest, nla_len(nest)))
                return -EINVAL;
 
-       err = nla_parse_nested(attr, NL80211_BSS_SELECT_ATTR_MAX, nest,
-                              nl80211_bss_select_policy, NULL);
+       err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX,
+                                         nest, nl80211_bss_select_policy,
+                                         NULL);
        if (err)
                return err;
 
                if (WARN_ON(i >= n_plans))
                        return -EINVAL;
 
-               err = nla_parse_nested(plan, NL80211_SCHED_SCAN_PLAN_MAX,
-                                      attr, nl80211_plan_policy, NULL);
+               err = nla_parse_nested_deprecated(plan,
+                                                 NL80211_SCHED_SCAN_PLAN_MAX,
+                                                 attr, nl80211_plan_policy,
+                                                 NULL);
                if (err)
                        return err;
 
                                    tmp) {
                        struct nlattr *rssi;
 
-                       err = nla_parse_nested(tb,
-                                              NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
-                                              attr, nl80211_match_policy,
-                                              NULL);
+                       err = nla_parse_nested_deprecated(tb,
+                                                         NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
+                                                         attr,
+                                                         nl80211_match_policy,
+                                                         NULL);
                        if (err)
                                return ERR_PTR(err);
 
                                    tmp) {
                        struct nlattr *ssid, *bssid, *rssi;
 
-                       err = nla_parse_nested(tb,
-                                              NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
-                                              attr, nl80211_match_policy,
-                                              NULL);
+                       err = nla_parse_nested_deprecated(tb,
+                                                         NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
+                                                         attr,
+                                                         nl80211_match_policy,
+                                                         NULL);
                        if (err)
                                goto out_free;
                        ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
        if (err)
                return err;
 
-       err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
-                              info->attrs[NL80211_ATTR_CSA_IES],
-                              nl80211_policy, info->extack);
+       err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
+                                         info->attrs[NL80211_ATTR_CSA_IES],
+                                         nl80211_policy, info->extack);
        if (err)
                return err;
 
        } else {
                struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
 
-               err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
-                                 attrbuf, nl80211_fam.maxattr,
-                                 nl80211_policy, NULL);
+               err = nlmsg_parse_deprecated(cb->nlh,
+                                            GENL_HDRLEN + nl80211_fam.hdrsize,
+                                            attrbuf, nl80211_fam.maxattr,
+                                            nl80211_policy, NULL);
                if (err)
                        goto out_err;
 
        if (!cqm)
                return -EINVAL;
 
-       err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
-                              nl80211_attr_cqm_policy, info->extack);
+       err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm,
+                                         nl80211_attr_cqm_policy,
+                                         info->extack);
        if (err)
                return err;
 
        if (!rdev->wiphy.wowlan->tcp)
                return -EINVAL;
 
-       err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TCP, attr,
-                              nl80211_wowlan_tcp_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr,
+                                         nl80211_wowlan_tcp_policy, NULL);
        if (err)
                return err;
 
                goto out;
        }
 
-       err = nla_parse_nested(tb, NL80211_ATTR_MAX, attr, nl80211_policy,
-                              NULL);
+       err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr,
+                                         nl80211_policy, NULL);
        if (err)
                goto out;
 
                goto set_wakeup;
        }
 
-       err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TRIG,
-                              info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
-                              nl80211_wowlan_policy, info->extack);
+       err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG,
+                                         info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
+                                         nl80211_wowlan_policy, info->extack);
        if (err)
                return err;
 
                                    rem) {
                        u8 *mask_pat;
 
-                       err = nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat,
-                                              nl80211_packet_pattern_policy,
-                                              info->extack);
+                       err = nla_parse_nested_deprecated(pat_tb,
+                                                         MAX_NL80211_PKTPAT,
+                                                         pat,
+                                                         nl80211_packet_pattern_policy,
+                                                         info->extack);
                        if (err)
                                goto error;
 
        int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
        struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
 
-       err = nla_parse_nested(tb, NL80211_ATTR_COALESCE_RULE_MAX, rule,
-                              nl80211_coalesce_policy, NULL);
+       err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX,
+                                         rule, nl80211_coalesce_policy, NULL);
        if (err)
                return err;
 
                            rem) {
                u8 *mask_pat;
 
-               err = nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat,
-                                      nl80211_packet_pattern_policy, NULL);
+               err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT,
+                                                 pat,
+                                                 nl80211_packet_pattern_policy,
+                                                 NULL);
                if (err)
                        return err;
 
        if (!info->attrs[NL80211_ATTR_REKEY_DATA])
                return -EINVAL;
 
-       err = nla_parse_nested(tb, MAX_NL80211_REKEY_DATA,
-                              info->attrs[NL80211_ATTR_REKEY_DATA],
-                              nl80211_rekey_policy, info->extack);
+       err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA,
+                                         info->attrs[NL80211_ATTR_REKEY_DATA],
+                                         nl80211_rekey_policy, info->extack);
        if (err)
                return err;
 
        if (!info->attrs[NL80211_ATTR_NAN_FUNC])
                return -EINVAL;
 
-       err = nla_parse_nested(tb, NL80211_NAN_FUNC_ATTR_MAX,
-                              info->attrs[NL80211_ATTR_NAN_FUNC],
-                              nl80211_nan_func_policy, info->extack);
+       err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX,
+                                         info->attrs[NL80211_ATTR_NAN_FUNC],
+                                         nl80211_nan_func_policy,
+                                         info->extack);
        if (err)
                return err;
 
        if (tb[NL80211_NAN_FUNC_SRF]) {
                struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
 
-               err = nla_parse_nested(srf_tb, NL80211_NAN_SRF_ATTR_MAX,
-                                      tb[NL80211_NAN_FUNC_SRF],
-                                      nl80211_nan_srf_policy, info->extack);
+               err = nla_parse_nested_deprecated(srf_tb,
+                                                 NL80211_NAN_SRF_ATTR_MAX,
+                                                 tb[NL80211_NAN_FUNC_SRF],
+                                                 nl80211_nan_srf_policy,
+                                                 info->extack);
                if (err)
                        goto out;
 
                return 0;
        }
 
-       err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, attrbuf,
-                         nl80211_fam.maxattr, nl80211_policy, NULL);
+       err = nlmsg_parse_deprecated(cb->nlh,
+                                    GENL_HDRLEN + nl80211_fam.hdrsize,
+                                    attrbuf, nl80211_fam.maxattr,
+                                    nl80211_policy, NULL);
        if (err)
                return err;
 
 
        }
 
        /* no validation needed - was already done via nested policy */
-       nla_parse_nested(tb, NL80211_PMSR_FTM_REQ_ATTR_MAX, ftmreq, NULL, NULL);
+       nla_parse_nested_deprecated(tb, NL80211_PMSR_FTM_REQ_ATTR_MAX, ftmreq,
+                                   NULL, NULL);
 
        if (tb[NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE])
                preamble = nla_get_u32(tb[NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE]);
        int err, rem;
 
        /* no validation needed - was already done via nested policy */
-       nla_parse_nested(tb, NL80211_PMSR_PEER_ATTR_MAX, peer, NULL, NULL);
+       nla_parse_nested_deprecated(tb, NL80211_PMSR_PEER_ATTR_MAX, peer,
+                                   NULL, NULL);
 
        if (!tb[NL80211_PMSR_PEER_ATTR_ADDR] ||
            !tb[NL80211_PMSR_PEER_ATTR_CHAN] ||
        /* reuse info->attrs */
        memset(info->attrs, 0, sizeof(*info->attrs) * (NL80211_ATTR_MAX + 1));
        /* need to validate here, we don't want to have validation recursion */
-       err = nla_parse_nested(info->attrs, NL80211_ATTR_MAX,
-                              tb[NL80211_PMSR_PEER_ATTR_CHAN],
-                              nl80211_policy, info->extack);
+       err = nla_parse_nested_deprecated(info->attrs, NL80211_ATTR_MAX,
+                                         tb[NL80211_PMSR_PEER_ATTR_CHAN],
+                                         nl80211_policy, info->extack);
        if (err)
                return err;
 
                return err;
 
        /* no validation needed - was already done via nested policy */
-       nla_parse_nested(req, NL80211_PMSR_REQ_ATTR_MAX,
-                        tb[NL80211_PMSR_PEER_ATTR_REQ],
-                        NULL, NULL);
+       nla_parse_nested_deprecated(req, NL80211_PMSR_REQ_ATTR_MAX,
+                                   tb[NL80211_PMSR_PEER_ATTR_REQ], NULL,
+                                   NULL);
 
        if (!req[NL80211_PMSR_REQ_ATTR_DATA]) {
                NL_SET_ERR_MSG_ATTR(info->extack,
 
                u8 proto = 0;
                int err;
 
-               err = nlmsg_parse(cb->nlh, 0, attrs, XFRMA_MAX, xfrma_policy,
-                                 cb->extack);
+               err = nlmsg_parse_deprecated(cb->nlh, 0, attrs, XFRMA_MAX,
+                                            xfrma_policy, cb->extack);
                if (err < 0)
                        return err;
 
                }
        }
 
-       err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs,
-                         link->nla_max ? : XFRMA_MAX,
-                         link->nla_pol ? : xfrma_policy, extack);
+       err = nlmsg_parse_deprecated(nlh, xfrm_msg_min[type], attrs,
+                                    link->nla_max ? : XFRMA_MAX,
+                                    link->nla_pol ? : xfrma_policy, extack);
        if (err < 0)
                return err;