aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
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/ipv4
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/ipv4')
-rw-r--r--net/ipv4/fib_semantics.c2
-rw-r--r--net/ipv4/ipmr.c6
-rw-r--r--net/ipv4/ipmr_base.c2
-rw-r--r--net/ipv4/tcp_metrics.c2
4 files changed, 6 insertions, 6 deletions
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index 4336f1ec8ab0..71c2165a2ce3 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -1550,7 +1550,7 @@ static int fib_add_multipath(struct sk_buff *skb, struct fib_info *fi)
1550{ 1550{
1551 struct nlattr *mp; 1551 struct nlattr *mp;
1552 1552
1553 mp = nla_nest_start(skb, RTA_MULTIPATH); 1553 mp = nla_nest_start_noflag(skb, RTA_MULTIPATH);
1554 if (!mp) 1554 if (!mp)
1555 goto nla_put_failure; 1555 goto nla_put_failure;
1556 1556
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index a8eb97777c0a..1322573b8228 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -2783,7 +2783,7 @@ static bool ipmr_fill_vif(struct mr_table *mrt, u32 vifid, struct sk_buff *skb)
2783 return true; 2783 return true;
2784 2784
2785 vif = &mrt->vif_table[vifid]; 2785 vif = &mrt->vif_table[vifid];
2786 vif_nest = nla_nest_start(skb, IPMRA_VIF); 2786 vif_nest = nla_nest_start_noflag(skb, IPMRA_VIF);
2787 if (!vif_nest) 2787 if (!vif_nest)
2788 return false; 2788 return false;
2789 if (nla_put_u32(skb, IPMRA_VIFA_IFINDEX, vif->dev->ifindex) || 2789 if (nla_put_u32(skb, IPMRA_VIFA_IFINDEX, vif->dev->ifindex) ||
@@ -2867,7 +2867,7 @@ static int ipmr_rtm_dumplink(struct sk_buff *skb, struct netlink_callback *cb)
2867 memset(hdr, 0, sizeof(*hdr)); 2867 memset(hdr, 0, sizeof(*hdr));
2868 hdr->ifi_family = RTNL_FAMILY_IPMR; 2868 hdr->ifi_family = RTNL_FAMILY_IPMR;
2869 2869
2870 af = nla_nest_start(skb, IFLA_AF_SPEC); 2870 af = nla_nest_start_noflag(skb, IFLA_AF_SPEC);
2871 if (!af) { 2871 if (!af) {
2872 nlmsg_cancel(skb, nlh); 2872 nlmsg_cancel(skb, nlh);
2873 goto out; 2873 goto out;
@@ -2878,7 +2878,7 @@ static int ipmr_rtm_dumplink(struct sk_buff *skb, struct netlink_callback *cb)
2878 goto out; 2878 goto out;
2879 } 2879 }
2880 2880
2881 vifs = nla_nest_start(skb, IPMRA_TABLE_VIFS); 2881 vifs = nla_nest_start_noflag(skb, IPMRA_TABLE_VIFS);
2882 if (!vifs) { 2882 if (!vifs) {
2883 nla_nest_end(skb, af); 2883 nla_nest_end(skb, af);
2884 nlmsg_end(skb, nlh); 2884 nlmsg_end(skb, nlh);
diff --git a/net/ipv4/ipmr_base.c b/net/ipv4/ipmr_base.c
index 3e614cc824f7..278834d4babc 100644
--- a/net/ipv4/ipmr_base.c
+++ b/net/ipv4/ipmr_base.c
@@ -228,7 +228,7 @@ int mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
228 if (c->mfc_flags & MFC_OFFLOAD) 228 if (c->mfc_flags & MFC_OFFLOAD)
229 rtm->rtm_flags |= RTNH_F_OFFLOAD; 229 rtm->rtm_flags |= RTNH_F_OFFLOAD;
230 230
231 mp_attr = nla_nest_start(skb, RTA_MULTIPATH); 231 mp_attr = nla_nest_start_noflag(skb, RTA_MULTIPATH);
232 if (!mp_attr) 232 if (!mp_attr)
233 return -EMSGSIZE; 233 return -EMSGSIZE;
234 234
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c
index 4ccec4c705f7..9a08bfb0672c 100644
--- a/net/ipv4/tcp_metrics.c
+++ b/net/ipv4/tcp_metrics.c
@@ -658,7 +658,7 @@ static int tcp_metrics_fill_info(struct sk_buff *msg,
658 { 658 {
659 int n = 0; 659 int n = 0;
660 660
661 nest = nla_nest_start(msg, TCP_METRICS_ATTR_VALS); 661 nest = nla_nest_start_noflag(msg, TCP_METRICS_ATTR_VALS);
662 if (!nest) 662 if (!nest)
663 goto nla_put_failure; 663 goto nla_put_failure;
664 for (i = 0; i < TCP_METRIC_MAX_KERNEL + 1; i++) { 664 for (i = 0; i < TCP_METRIC_MAX_KERNEL + 1; i++) {