Currently, the netlink skb length only includes metadata and data length. It doesn't include the psample generic netlink header length. Fix it by adding it.
Fixes: 6ae0a6286171 ("net: Introduce psample, a new genetlink channel for packet sampling") CC: Yotam Gigi <yotam...@gmail.com> Reviewed-by: Ido Schimmel <ido...@nvidia.com> Signed-off-by: Chris Mi <c...@nvidia.com> --- net/psample/psample.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/net/psample/psample.c b/net/psample/psample.c index 33e238c965bd..807d75f5a40f 100644 --- a/net/psample/psample.c +++ b/net/psample/psample.c @@ -363,6 +363,7 @@ void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, struct ip_tunnel_info *tun_info; #endif struct sk_buff *nl_skb; + int header_len; int data_len; int meta_len; void *data; @@ -381,12 +382,13 @@ void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, meta_len += psample_tunnel_meta_len(tun_info); #endif + /* psample generic netlink header size */ + header_len = nlmsg_total_size(GENL_HDRLEN + psample_nl_family.hdrsize); data_len = min(skb->len, trunc_size); - if (meta_len + nla_total_size(data_len) > PSAMPLE_MAX_PACKET_SIZE) - data_len = PSAMPLE_MAX_PACKET_SIZE - meta_len - NLA_HDRLEN + if (header_len + meta_len + nla_total_size(data_len) > PSAMPLE_MAX_PACKET_SIZE) + data_len = PSAMPLE_MAX_PACKET_SIZE - header_len - meta_len - NLA_HDRLEN - NLA_ALIGNTO; - - nl_skb = genlmsg_new(meta_len + nla_total_size(data_len), GFP_ATOMIC); + nl_skb = genlmsg_new(header_len + meta_len + nla_total_size(data_len), GFP_ATOMIC); if (unlikely(!nl_skb)) return; -- 2.26.2