summaryrefslogtreecommitdiffstats
path: root/net/openvswitch/meter.c
diff options
context:
space:
mode:
authorMichal Kubecek <mkubecek@suse.cz>2019-04-26 05:13:06 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-27 17:03:44 -0400
commitae0be8de9a53cda3505865c11826d8ff0640237c (patch)
tree43bc8a0d58965d57e4ed1bedf8d892c3fe72e8b5 /net/openvswitch/meter.c
parentc7881b4a97e21b617b8243094dfa4b62028b956c (diff)
netlink: make nla_nest_start() add NLA_F_NESTED flag
Even if the NLA_F_NESTED flag was introduced more than 11 years ago, most netlink based interfaces (including recently added ones) are still not setting it in kernel generated messages. Without the flag, message parsers not aware of attribute semantics (e.g. wireshark dissector or libmnl's mnl_nlmsg_fprintf()) cannot recognize nested attributes and won't display the structure of their contents. Unfortunately we cannot just add the flag everywhere as there may be userspace applications which check nlattr::nla_type directly rather than through a helper masking out the flags. Therefore the patch renames nla_nest_start() to nla_nest_start_noflag() and introduces nla_nest_start() as a wrapper adding NLA_F_NESTED. The calls which add NLA_F_NESTED manually are rewritten to use nla_nest_start(). Except for changes in include/net/netlink.h, the patch was generated using this semantic patch: @@ expression E1, E2; @@ -nla_nest_start(E1, E2) +nla_nest_start_noflag(E1, E2) @@ expression E1, E2; @@ -nla_nest_start_noflag(E1, E2 | NLA_F_NESTED) +nla_nest_start(E1, E2) Signed-off-by: Michal Kubecek <mkubecek@suse.cz> Acked-by: Jiri Pirko <jiri@mellanox.com> Acked-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch/meter.c')
-rw-r--r--net/openvswitch/meter.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/net/openvswitch/meter.c b/net/openvswitch/meter.c
index 0be3d097ae01..fdc8be7fd8f3 100644
--- a/net/openvswitch/meter.c
+++ b/net/openvswitch/meter.c
@@ -127,7 +127,7 @@ static int ovs_meter_cmd_reply_stats(struct sk_buff *reply, u32 meter_id,
127 OVS_METER_ATTR_PAD)) 127 OVS_METER_ATTR_PAD))
128 goto error; 128 goto error;
129 129
130 nla = nla_nest_start(reply, OVS_METER_ATTR_BANDS); 130 nla = nla_nest_start_noflag(reply, OVS_METER_ATTR_BANDS);
131 if (!nla) 131 if (!nla)
132 goto error; 132 goto error;
133 133
@@ -136,7 +136,7 @@ static int ovs_meter_cmd_reply_stats(struct sk_buff *reply, u32 meter_id,
136 for (i = 0; i < meter->n_bands; ++i, ++band) { 136 for (i = 0; i < meter->n_bands; ++i, ++band) {
137 struct nlattr *band_nla; 137 struct nlattr *band_nla;
138 138
139 band_nla = nla_nest_start(reply, OVS_BAND_ATTR_UNSPEC); 139 band_nla = nla_nest_start_noflag(reply, OVS_BAND_ATTR_UNSPEC);
140 if (!band_nla || nla_put(reply, OVS_BAND_ATTR_STATS, 140 if (!band_nla || nla_put(reply, OVS_BAND_ATTR_STATS,
141 sizeof(struct ovs_flow_stats), 141 sizeof(struct ovs_flow_stats),
142 &band->stats)) 142 &band->stats))
@@ -166,11 +166,11 @@ static int ovs_meter_cmd_features(struct sk_buff *skb, struct genl_info *info)
166 nla_put_u32(reply, OVS_METER_ATTR_MAX_BANDS, DP_MAX_BANDS)) 166 nla_put_u32(reply, OVS_METER_ATTR_MAX_BANDS, DP_MAX_BANDS))
167 goto nla_put_failure; 167 goto nla_put_failure;
168 168
169 nla = nla_nest_start(reply, OVS_METER_ATTR_BANDS); 169 nla = nla_nest_start_noflag(reply, OVS_METER_ATTR_BANDS);
170 if (!nla) 170 if (!nla)
171 goto nla_put_failure; 171 goto nla_put_failure;
172 172
173 band_nla = nla_nest_start(reply, OVS_BAND_ATTR_UNSPEC); 173 band_nla = nla_nest_start_noflag(reply, OVS_BAND_ATTR_UNSPEC);
174 if (!band_nla) 174 if (!band_nla)
175 goto nla_put_failure; 175 goto nla_put_failure;
176 /* Currently only DROP band type is supported. */ 176 /* Currently only DROP band type is supported. */