diff options
| -rw-r--r-- | include/uapi/linux/rtnetlink.h | 7 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 7 | ||||
| -rw-r--r-- | net/ipv6/ip6mr.c | 7 | 
3 files changed, 21 insertions, 0 deletions
diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 3dee071770d..80abe27dc2a 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/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/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 0c452e3fdc1..c5617d646b9 100644 --- a/net/ipv4/ipmr.c +++ b/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/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 23f364a9efb..4220a7b9338 100644 --- a/net/ipv6/ip6mr.c +++ b/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;  }  |