|
@@ -1500,6 +1500,7 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
|
|
|
c->mf6c_origin = mfc->mf6cc_origin.sin6_addr;
|
|
|
c->mf6c_mcastgrp = mfc->mf6cc_mcastgrp.sin6_addr;
|
|
|
c->mf6c_parent = mfc->mf6cc_parent;
|
|
|
+ c->mfc_un.res.lastuse = jiffies;
|
|
|
ip6mr_update_thresholds(mrt, c, ttls);
|
|
|
if (!mrtsock)
|
|
|
c->mfc_flags |= MFC_STATIC;
|
|
@@ -2092,6 +2093,7 @@ static void ip6_mr_forward(struct net *net, struct mr6_table *mrt,
|
|
|
vif = cache->mf6c_parent;
|
|
|
cache->mfc_un.res.pkt++;
|
|
|
cache->mfc_un.res.bytes += skb->len;
|
|
|
+ cache->mfc_un.res.lastuse = jiffies;
|
|
|
|
|
|
if (ipv6_addr_any(&cache->mf6c_origin) && true_vifi >= 0) {
|
|
|
struct mfc6_cache *cache_proxy;
|
|
@@ -2234,10 +2236,10 @@ int ip6_mr_input(struct sk_buff *skb)
|
|
|
static int __ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
|
|
|
struct mfc6_cache *c, struct rtmsg *rtm)
|
|
|
{
|
|
|
- int ct;
|
|
|
- struct rtnexthop *nhp;
|
|
|
- struct nlattr *mp_attr;
|
|
|
struct rta_mfc_stats mfcs;
|
|
|
+ struct nlattr *mp_attr;
|
|
|
+ struct rtnexthop *nhp;
|
|
|
+ int ct;
|
|
|
|
|
|
/* If cache is unresolved, don't try to parse IIF and OIF */
|
|
|
if (c->mf6c_parent >= MAXMIFS)
|
|
@@ -2270,7 +2272,10 @@ static int __ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
|
|
|
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_64bit(skb, RTA_MFC_STATS, sizeof(mfcs), &mfcs, RTA_PAD) < 0)
|
|
|
+ if (nla_put_64bit(skb, RTA_MFC_STATS, sizeof(mfcs), &mfcs, RTA_PAD) ||
|
|
|
+ nla_put_u64_64bit(skb, RTA_EXPIRES,
|
|
|
+ jiffies_to_clock_t(c->mfc_un.res.lastuse),
|
|
|
+ RTA_PAD))
|
|
|
return -EMSGSIZE;
|
|
|
|
|
|
rtm->rtm_type = RTN_MULTICAST;
|