From c7752d9d06d632b6cda6d432a9760158d36248d8 Mon Sep 17 00:00:00 2001 From: Nicolas Dichtel Date: Tue, 4 Dec 2012 01:13:37 +0000 Subject: [PATCH] --- yaml --- r: 341871 b: refs/heads/master c: adfa85e45dac616ff4f8bfceff1621ccafc0b1ff h: refs/heads/master i: 341869: 4c71403c3454c7754ef06aacc8bcebdbb279eeb4 341867: 95b00c7ee43128294fad771cd4457ea38a9f533d 341863: 2d79aa36d8cf02f98f4efceecc3e229dc1241501 341855: 1649d9e53b241795f69a4eb407a704632a65b552 v: v3 --- [refs] | 2 +- trunk/include/uapi/linux/rtnetlink.h | 7 +++++++ trunk/net/ipv4/ipmr.c | 7 +++++++ trunk/net/ipv6/ip6mr.c | 7 +++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 8ebfe87a2349..82381026ba72 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 70b386a0cc65041fb01aacf5d4b8d1fa49fc8ce9 +refs/heads/master: adfa85e45dac616ff4f8bfceff1621ccafc0b1ff diff --git a/trunk/include/uapi/linux/rtnetlink.h b/trunk/include/uapi/linux/rtnetlink.h index 3dee071770d5..80abe27dc2a7 100644 --- a/trunk/include/uapi/linux/rtnetlink.h +++ b/trunk/include/uapi/linux/rtnetlink.h @@ -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. ****/ diff --git a/trunk/net/ipv4/ipmr.c b/trunk/net/ipv4/ipmr.c index 0c452e3fdc1b..c5617d646b93 100644 --- a/trunk/net/ipv4/ipmr.c +++ b/trunk/net/ipv4/ipmr.c @@ -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; } diff --git a/trunk/net/ipv6/ip6mr.c b/trunk/net/ipv6/ip6mr.c index 23f364a9efb5..4220a7b93386 100644 --- a/trunk/net/ipv6/ip6mr.c +++ b/trunk/net/ipv6/ip6mr.c @@ -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; }