ipmr/ip6mr: advertise mfc stats via rtnetlink
authorNicolas Dichtel <nicolas.dichtel@6wind.com>
Tue, 4 Dec 2012 01:13:37 +0000 (01:13 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Dec 2012 18:08:10 +0000 (13:08 -0500)
These statistics can be checked only via /proc/net/ip_mr_cache or
SIOCGETSGCNT[_IN6] and thus only for the table RT_TABLE_DEFAULT.
Advertising them via rtnetlink allows to get statistics for all cache entries,
whatever the table is.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/rtnetlink.h
net/ipv4/ipmr.c
net/ipv6/ip6mr.c

index 3dee071770d5dc091cee51d5c629d08db5050c22..80abe27dc2a7cb2f1fea6547d8e08ba5de23abda 100644 (file)
@@ -288,6 +288,7 @@ enum rtattr_type_t {
        RTA_MP_ALGO, /* no longer used */
        RTA_TABLE,
        RTA_MARK,
+       RTA_MFC_STATS,
        __RTA_MAX
 };
 
@@ -408,6 +409,12 @@ struct rta_session {
        } u;
 };
 
+struct rta_mfc_stats {
+       __u64   mfcs_packets;
+       __u64   mfcs_bytes;
+       __u64   mfcs_wrong_if;
+};
+
 /****
  *             General form of address family dependent message.
  ****/
index 0c452e3fdc1b80404fe47a141098a45940490d50..c5617d646b93956b0df1400ca1dad7f2336ba8e0 100644 (file)
@@ -2046,6 +2046,7 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
        int ct;
        struct rtnexthop *nhp;
        struct nlattr *mp_attr;
+       struct rta_mfc_stats mfcs;
 
        /* If cache is unresolved, don't try to parse IIF and OIF */
        if (c->mfc_parent >= MAXVIFS)
@@ -2074,6 +2075,12 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
 
        nla_nest_end(skb, mp_attr);
 
+       mfcs.mfcs_packets = c->mfc_un.res.pkt;
+       mfcs.mfcs_bytes = c->mfc_un.res.bytes;
+       mfcs.mfcs_wrong_if = c->mfc_un.res.wrong_if;
+       if (nla_put(skb, RTA_MFC_STATS, sizeof(mfcs), &mfcs) < 0)
+               return -EMSGSIZE;
+
        rtm->rtm_type = RTN_MULTICAST;
        return 1;
 }
index 23f364a9efb5f0304f9202ce5c53797f8d43d103..4220a7b93386bd88fec4f80e0409429c057c8ff4 100644 (file)
@@ -2120,6 +2120,7 @@ static int __ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
        int ct;
        struct rtnexthop *nhp;
        struct nlattr *mp_attr;
+       struct rta_mfc_stats mfcs;
 
        /* If cache is unresolved, don't try to parse IIF and OIF */
        if (c->mf6c_parent >= MAXMIFS)
@@ -2149,6 +2150,12 @@ static int __ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
 
        nla_nest_end(skb, mp_attr);
 
+       mfcs.mfcs_packets = c->mfc_un.res.pkt;
+       mfcs.mfcs_bytes = c->mfc_un.res.bytes;
+       mfcs.mfcs_wrong_if = c->mfc_un.res.wrong_if;
+       if (nla_put(skb, RTA_MFC_STATS, sizeof(mfcs), &mfcs) < 0)
+               return -EMSGSIZE;
+
        rtm->rtm_type = RTN_MULTICAST;
        return 1;
 }