Re: netlink stats: Ability to get stats for a single device?

Previous thread: [PATCH] fib_rules: __rcu annotates ctarget by Eric Dumazet on Tuesday, October 26, 2010 - 12:24 pm. (2 messages)

Next thread: Unwanted aliasing of UDP checksum failed error counter by Jeremy Jackson on Tuesday, October 26, 2010 - 12:53 pm. (6 messages)
From: Ben Greear
Date: Tuesday, October 26, 2010 - 12:31 pm

From what I can tell, it's impossible to request stats for a single
network device via netlink.  When you have thousands of interfaces,
this means a lot of wasted effort to get stats for a particular
device.

Am I missing something, or do I just need to write up a patch
to have netlink pay attention to the ifindex?

Thanks,
Ben

-- 
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

--

From: Eric Dumazet
Date: Tuesday, October 26, 2010 - 12:35 pm

Its already done

rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, rtnl_dump_ifinfo); 



--

From: David Miller
Date: Tuesday, October 26, 2010 - 12:38 pm

From: Ben Greear <greearb@candelatech.com>

Setting the ->ifi_index or IFLA_IFNAME attribute values appropriately
in the getlink request doesn't work?

That should give you back, amonst other things, the rtnl_link_stats
for the device in the netlink response.
--

From: Eric Dumazet
Date: Tuesday, October 26, 2010 - 12:56 pm

Yep, it should be easy to change iproute2 to not ask a full dump
in ip/ipaddress.c :

if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETLINK) < 0) ...

and instead use rtnl_send() or something like that, if user provided one
specific interface name   (or index)

ip link show dev eth0




--

From: Ben Greear
Date: Tuesday, October 26, 2010 - 1:29 pm

I'm trying to craft my own netlink message...basically:

    memset(&snl, 0, sizeof(snl));
    snl.nl_family = AF_NETLINK;
    snl.nl_pid    = 0;
    snl.nl_groups = 0;

    memset(&buffer, 0, sizeof(buffer));
    nlh->nlmsg_type = msg_type;
    nlh->nlmsg_flags = NLM_F_MATCH|NLM_F_REQUEST;
    static unsigned int nl_seqno = 1;
    nlh->nlmsg_seq = nl_seqno++;
    nlh->nlmsg_pid = nl_pid;



       nlh->nlmsg_len = NLMSG_LENGTH(sizeof(*ifinfomsg));
       ifinfomsg = (struct ifinfomsg*)(NLMSG_DATA(nlh));
       ifinfomsg->ifi_family = AF_UNSPEC;
       ifinfomsg->ifi_type = IFLA_UNSPEC;
       ifinfomsg->ifi_index = if_index;
       ifinfomsg->ifi_flags = 0;
       ifinfomsg->ifi_change = 0xffffffff;


It's possible that I'm somehow messing this up. But, looking at the
static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
method, I cannot see how it would bail out properly after a single dev
has been processed, either.

Thanks,
Ben

-- 
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

--

From: Eric Dumazet
Date: Tuesday, October 26, 2010 - 1:37 pm

dont use F_MATCH : check net/core/rtnetlink.c

vi +1660 net/core/rtnetlink.c

You _dont_ want to call 'dumpit' : so dont use a bit present in
NLM_F_DUMP at all:

        if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
                struct sock *rtnl;
                rtnl_dumpit_func dumpit;

                dumpit = rtnl_get_dumpit(family, type);
                if (dumpit == NULL)
                        return -EOPNOTSUPP;

                __rtnl_unlock();
                rtnl = net->rtnl;
                err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
                rtnl_lock();
                return err;
        }

You want instead to call the 'doit' handler  (one device only)

        doit = rtnl_get_doit(family, type);
        if (doit == NULL)
                return -EOPNOTSUPP;

        return doit(skb, nlh, (void *)&rta_buf[0]);



--

From: Ben Greear
Date: Tuesday, October 26, 2010 - 1:43 pm

That was exactly my problem.  It works as expected with that NLM_F_MATCH
removed.

Thanks!
Ben

-- 
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

--

Previous thread: [PATCH] fib_rules: __rcu annotates ctarget by Eric Dumazet on Tuesday, October 26, 2010 - 12:24 pm. (2 messages)

Next thread: Unwanted aliasing of UDP checksum failed error counter by Jeremy Jackson on Tuesday, October 26, 2010 - 12:53 pm. (6 messages)