summaryrefslogtreecommitdiffstats
path: root/net/openvswitch/datapath.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/datapath.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/datapath.c')
-rw-r--r--net/openvswitch/datapath.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index a64d3eb1f9a9..356677c3a0c2 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -463,7 +463,8 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
463 nla_data(upcall_info->userdata)); 463 nla_data(upcall_info->userdata));
464 464
465 if (upcall_info->egress_tun_info) { 465 if (upcall_info->egress_tun_info) {
466 nla = nla_nest_start(user_skb, OVS_PACKET_ATTR_EGRESS_TUN_KEY); 466 nla = nla_nest_start_noflag(user_skb,
467 OVS_PACKET_ATTR_EGRESS_TUN_KEY);
467 if (!nla) { 468 if (!nla) {
468 err = -EMSGSIZE; 469 err = -EMSGSIZE;
469 goto out; 470 goto out;
@@ -475,7 +476,7 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
475 } 476 }
476 477
477 if (upcall_info->actions_len) { 478 if (upcall_info->actions_len) {
478 nla = nla_nest_start(user_skb, OVS_PACKET_ATTR_ACTIONS); 479 nla = nla_nest_start_noflag(user_skb, OVS_PACKET_ATTR_ACTIONS);
479 if (!nla) { 480 if (!nla) {
480 err = -EMSGSIZE; 481 err = -EMSGSIZE;
481 goto out; 482 goto out;
@@ -776,7 +777,7 @@ static int ovs_flow_cmd_fill_actions(const struct sw_flow *flow,
776 * This can only fail for dump operations because the skb is always 777 * This can only fail for dump operations because the skb is always
777 * properly sized for single flows. 778 * properly sized for single flows.
778 */ 779 */
779 start = nla_nest_start(skb, OVS_FLOW_ATTR_ACTIONS); 780 start = nla_nest_start_noflag(skb, OVS_FLOW_ATTR_ACTIONS);
780 if (start) { 781 if (start) {
781 const struct sw_flow_actions *sf_acts; 782 const struct sw_flow_actions *sf_acts;
782 783