From patchwork Wed Oct 10 15:00:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 981939 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42VckL24pXz9s7T for ; Thu, 11 Oct 2018 02:01:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727344AbeJJWYD (ORCPT ); Wed, 10 Oct 2018 18:24:03 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:33996 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726663AbeJJWYC (ORCPT ); Wed, 10 Oct 2018 18:24:02 -0400 Received: by mail-wr1-f65.google.com with SMTP id l6-v6so5708225wrt.1 for ; Wed, 10 Oct 2018 08:01:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LI9yCZMMePRrIaoHOucfPmPF5+Bi01mEg7tr4xc+sLM=; b=JgVvxMmPERYxLYVaMut1bmR0Y1IwWfhkvTT5b5KYCrCnG0AbGkdRdm58qNztXU1NUE 3pakTgONLtzSOgN3BlDZFYE601bboV3/bOejvg/KmjQ73BawiB8GcAFYNwpvm+G9epmM d8ng15CPvdKHEuHwXGwdgRAuIuSrkDoNvN/av6ySQwfW8+WoI2OPeU+gjs47ndsnZeF+ Jj2u0HDduce6rjYeyAIH52pms4Vga8IVgQcgDT81Ksgn4vQB1vlC1FUGeaWPlUd3c6tD 8UXDqb7iHA5DDKHi5n9yyJLgLA58NSegXAsrhajYPxEYydnDvtT2qXTLaVNNVWoJI/4p Ha1w== X-Gm-Message-State: ABuFfohuW2HRe0qN9VQtsT3tb+rGW+CtlhkON9WTb/BlZgsi8J0OA3tI VpyA4c1zhPjH/YFwXwXF0SJFGTJOLbk= X-Google-Smtp-Source: ACcGV63GENM5Oz2xP5SEXV8y2MfvEh/Ant+dDHndPr8WvivwLCEHpRyazrlYce0wtHDLAc49b863ow== X-Received: by 2002:adf:a3d0:: with SMTP id m16-v6mr24506257wrb.312.1539183686893; Wed, 10 Oct 2018 08:01:26 -0700 (PDT) Received: from localhost.localdomain.com (nat-pool-mxp-t.redhat.com. [149.6.153.186]) by smtp.gmail.com with ESMTPSA id n11-v6sm18568612wrx.17.2018.10.10.08.01.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 10 Oct 2018 08:01:25 -0700 (PDT) From: Lorenzo Bianconi To: stephen@networkplumber.org Cc: netdev@vger.kernel.org Subject: [PATCH iproute 2/2] utils: fix get_rtnl_link_stats_rta stats parsing Date: Wed, 10 Oct 2018 17:00:58 +0200 Message-Id: <8b8bb899db6c8ce78d91aa8b192e6c697daf4e27.1539182623.git.lorenzo.bianconi@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org iproute2 walks through the list of available tunnels using netlink protocol in order to get device info instead of reading them from proc filesystem. However the kernel reports device statistics using IFLA_INET6_STATS/IFLA_INET6_ICMP6STATS attributes nested in IFLA_PROTINFO one but iproutes expects these info in IFLA_STATS64/IFLA_STATS attributes. The issue can be triggered with the following reproducer: $ip link add ip6d0 type ip6tnl mode ip6ip6 local 1111::1 remote 2222::1 $ip -6 -d -s tunnel show ip6d0 ip6d0: ipv6/ipv6 remote 2222::1 local 1111::1 encaplimit 4 hoplimit 64 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) Dump terminated Fix the issue introducing IFLA_INET6_STATS attribute parsing Fixes: 3e953938717f ("iptunnel/ip6tunnel: Use netlink to walk through tunnels list") Signed-off-by: Lorenzo Bianconi --- lib/utils.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/utils.c b/lib/utils.c index e87ecf31..7be2d6be 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -1549,6 +1550,24 @@ static void copy_rtnl_link_stats64(struct rtnl_link_stats64 *stats64, *a++ = *b++; } +#define IPSTATS_MIB_MAX_LEN (__IPSTATS_MIB_MAX * sizeof(__u64)) +static void get_snmp_counters(struct rtnl_link_stats64 *stats64, + struct rtattr *s) +{ + __u64 *mib = (__u64 *)RTA_DATA(s); + + memset(stats64, 0, sizeof(*stats64)); + + stats64->rx_packets = mib[IPSTATS_MIB_INPKTS]; + stats64->rx_bytes = mib[IPSTATS_MIB_INOCTETS]; + stats64->tx_packets = mib[IPSTATS_MIB_OUTPKTS]; + stats64->tx_bytes = mib[IPSTATS_MIB_OUTOCTETS]; + stats64->rx_errors = mib[IPSTATS_MIB_INDISCARDS]; + stats64->tx_errors = mib[IPSTATS_MIB_OUTDISCARDS]; + stats64->multicast = mib[IPSTATS_MIB_INMCASTPKTS]; + stats64->rx_frame_errors = mib[IPSTATS_MIB_CSUMERRORS]; +} + int get_rtnl_link_stats_rta(struct rtnl_link_stats64 *stats64, struct rtattr *tb[]) { @@ -1565,6 +1584,14 @@ int get_rtnl_link_stats_rta(struct rtnl_link_stats64 *stats64, rta = tb[IFLA_STATS]; size = sizeof(struct rtnl_link_stats); s = &stats; + } else if (tb[IFLA_PROTINFO]) { + struct rtattr *ptb[IPSTATS_MIB_MAX_LEN + 1]; + + parse_rtattr_nested(ptb, IPSTATS_MIB_MAX_LEN, + tb[IFLA_PROTINFO]); + if (ptb[IFLA_INET6_STATS]) + get_snmp_counters(stats64, ptb[IFLA_INET6_STATS]); + return sizeof(*stats64); } else { return -1; }