@@ -1053,6 +1053,9 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
OVS_FIND_FIELD_IFELSE([$KSRC/include/net/genetlink.h], [genl_ops],
[policy],
[OVS_DEFINE([HAVE_GENL_OPS_POLICY])])
+ OVS_GREP_IFELSE([$KSRC/include/net/netlink.h],
+ [nla_parse_deprecated_strict],
+ [OVS_DEFINE([HAVE_NLA_PARSE_DEPRECATED_STRICT])])
if cmp -s datapath/linux/kcompat.h.new \
datapath/linux/kcompat.h >/dev/null 2>&1; then
@@ -1401,8 +1401,8 @@ static int ovs_flow_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb)
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]);
@@ -2859,8 +2859,8 @@ static int validate_userspace(const struct nlattr *attr)
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;
@@ -2891,8 +2891,9 @@ static int validate_and_copy_check_pkt_len(struct net *net,
int nested_acts_start;
int start, err;
- err = nla_parse_nested(a, OVS_CHECK_PKT_LEN_ATTR_MAX, 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;
@@ -143,6 +143,11 @@ static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
#endif
+#ifndef HAVE_NLA_PARSE_DEPRECATED_STRICT
+#define nla_parse_nested_deprecated nla_parse_nested
+#define nla_parse_deprecated_strict nla_parse
+#define genlmsg_parse_deprecated genlmsg_parse
+
#ifndef HAVE_NETLINK_EXT_ACK
struct netlink_ext_ack;
@@ -153,7 +158,8 @@ static inline int rpl_nla_parse_nested(struct nlattr *tb[], int maxtype,
{
return nla_parse_nested(tb, maxtype, nla, policy);
}
-#define nla_parse_nested rpl_nla_parse_nested
+#undef nla_parse_nested_deprecated
+#define nla_parse_nested_deprecated rpl_nla_parse_nested
static inline int rpl_nla_parse(struct nlattr **tb, int maxtype,
const struct nlattr *head, int len,
@@ -162,8 +168,10 @@ static inline int rpl_nla_parse(struct nlattr **tb, int maxtype,
{
return nla_parse(tb, maxtype, head, len, policy);
}
-#define nla_parse rpl_nla_parse
+#undef nla_parse_deprecated_strict
+#define nla_parse_deprecated_strict rpl_nla_parse
#endif
+#endif /* HAVE_NLA_PARSE_DEPRECATED_STRICT */
#ifndef HAVE_NLA_NEST_START_NOFLAG
static inline struct nlattr *rpl_nla_nest_start_noflag(struct sk_buff *skb,
@@ -239,9 +239,11 @@ static struct dp_meter *dp_meter_create(struct nlattr **a)
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_strict((struct nlattr **)&attr,
+ OVS_BAND_ATTR_MAX,
+ nla_data(nla),
+ nla_len(nla),
+ band_policy, NULL);
if (err)
goto exit_free_meter;
@@ -99,8 +99,8 @@ static int vxlan_configure_exts(struct vport *vport, struct nlattr *attr,
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;