Initilize and populate age field
Subsystems (3)
PATCH 2/3 Initilize and populate age field
The age field is filled with the current time at the time of creation of the route. When the routes are dumped
then the age value stored in the route structure is subtracted from the current time value and the difference is the age expressed in secs.
--- net/ipv4/fib_hash.c | 5 +++++ net/ipv4/fib_lookup.h | 3 ++- net/ipv4/fib_semantics.c | 13 ++++++++++--- net/ipv4/fib_trie.c | 1 + 4 files changed, 18 insertions(+), 4 deletions(-)
net/ipv4/fib_hash.c +5 -0
@@ -385,6 +385,7 @@ static int fn_hash_insert(struct fib_tabstruct fib_alias *fa, *new_fa;struct fn_zone *fz;struct fib_info *fi; +struct timeval tv;u8 tos = cfg->fc_tos;__be32 key;int err;
@@ -420,6 +421,7 @@ static int fn_hash_insert(struct fib_tabelse fa =fib_find_alias (&f->fn_alias, tos, fi->fib_priority); +do_gettimeofday (&tv);/* Now fa, if non-NULL, points to the first fib alias * with the same keys [prefix,tos,priority], if such key already * exists or to the node before which we will insert new one.
@@ -448,6 +450,7 @@ static int fn_hash_insert(struct fib_tab fa->fa_info = fi; fa->fa_type = cfg->fc_type; fa->fa_scope = cfg->fc_scope; + fa->fa_age = tv.tv_sec; state = fa->fa_state; fa->fa_state &= ~FA_S_ACCESSED ; fib_hash_genid++;
@@ -507,6 +510,7 @@ static int fn_hash_insert(struct fib_tab new_fa->fa_type = cfg->fc_type; new_fa->fa_scope = cfg->fc_scope; new_fa->fa_state =0 ; + new_fa->fa_age = tv.tv_sec;/* * Insert new entry to the list.
@@ -697,6 +701,7 @@ fn_hash_dump_bucket(struct sk_buff *skb, f->fn_key, fz->fz_order, fa->fa_tos, + fa->fa_age, fa->fa_info, NLM_F_MULTI) < 0) { cb->args[4 ] = i;
net/ipv4/fib_lookup.h +2 -1
@@ -13,6 +13,7 @@ struct fib_alias {u8 fa_type;u8 fa_scope;u8 fa_state; +time_t fa_age; };#define FA_S_ACCESSED 0x01
@@ -27,7 +28,7 @@ extern struct fib_info *fib_create_info(extern int fib_nh_match (struct fib_config *cfg,struct fib_info *fi);extern int fib_dump_info (struct sk_buff *skb,u32 pid,u32 seq,int event,u32 tb_id,u8 type,u8 scope,__be32 dst, -int dst_len,u8 tos,struct fib_info *fi, +int dst_len,u8 tos,time_t age,struct fib_info *fi,unsigned int ); extern void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, int dst_len, u32 tb_id, struct nl_info *info,
net/ipv4/fib_semantics.c +10 -3
@@ -278,7 +278,8 @@ static inline size_t fib_nlmsg_size(stru +nla_total_size (4 )/* RTA_TABLE */ +nla_total_size (4 )/* RTA_DST */ +nla_total_size (4 )/* RTA_PRIORITY */ - +nla_total_size (4 );/* RTA_PREFSRC */ + +nla_total_size (4 )/* RTA_PREFSRC */ + +nla_total_size (4 );/*RTA_AGE*/ /* space for nested metrics */ payload +=nla_total_size ((RTAX_MAX *nla_total_size (4 )));
@@ -313,7 +314,7 @@ void rtmsg_fib(int event, __be32 key, st err =fib_dump_info (skb, info->pid, seq, event, tb_id, fa->fa_type, fa->fa_scope, key, dst_len, - fa->fa_tos, fa->fa_info, nlm_flags); + fa->fa_tos, fa->fa_age, fa->fa_info, nlm_flags);if (err <0 ) {/* -EMSGSIZE implies BUG in fib_nlmsg_size() */ WARN_ON (err == -EMSGSIZE );
@@ -940,11 +941,12 @@ __be32 __fib_res_prefsrc(struct fib_resu }int fib_dump_info (struct sk_buff *skb,u32 pid,u32 seq,int event, -u32 tb_id,u8 type,u8 scope,__be32 dst,int dst_len,u8 tos, +u32 tb_id,u8 type,u8 scope,__be32 dst,int dst_len,u8 tos,time_t age,struct fib_info *fi,unsigned int flags) {struct nlmsghdr *nlh;struct rtmsg *rtm; +struct timeval tv; nlh =nlmsg_put (skb, pid, seq, event,sizeof (*rtm), flags);if (nlh ==NULL )
@@ -985,6 +987,11 @@ int fib_dump_info(struct sk_buff *skb, uNLA_PUT_U32 (skb,RTA_FLOW , fi->fib_nh[0 ].nh_tclassid);#endif } + +do_gettimeofday (&tv); +if (age) { +NLA_PUT_U32 (skb,RTA_AGE , (tv.tv_sec - age)); + }#ifdef CONFIG_IP_ROUTE_MULTIPATH if (fi->fib_nhs >1 ) {struct rtnexthop *rtnh;
net/ipv4/fib_trie.c +1 -0
@@ -1892,6 +1892,7 @@ static int fn_trie_dump_fa(t_key key, in xkey, plen, fa->fa_tos, + fa->fa_age, fa->fa_info, 0) < 0) { cb->args[4 ] = i;return -1 ;
Signature · 1 line
1.4.3.4
David Miller
maintainerFrom: Varun Chandramohan <[email protected]>
Date: Thu, 20 Sep 2007 20:57:51 +0530
net/ipv4/fib_hash.c static int fn_hash_insert(struct fib_tab · line 427
Quoted 8 lines
net/ipv4/fib_hash.c +1
-0@@ -420,6 +421,7 @@ static int fn_hash_insert(struct fib_tabelse fa =fib_find_alias (&f->fn_alias, tos, fi->fib_priority); +do_gettimeofday (&tv);/* Now fa, if non-NULL, points to the first fib alias * with the same keys [prefix,tos,priority], if such key already * exists or to the node before which we will insert new one.
gettimeofday() is expensive, we don't even use it to timestamp every incoming packet and we therefore should not do it every route cache entry we create in order to handle DoS situations efficiently
I honestly don't like these patches. I literally cringe every time you post a new revision. It's either going to add new costs to route management or be so inaccurate as to be useless.
I question it's usefulness even if implemented efficiently and accurately. I really don't see people lining up asking for a route aging metric.
We could report zero and be compliant with the RFC, we don't age our route entries like the model of the SNMP vars seems to suggest, so it's honestly accurate. And this would mean no kernel changes, as the userland program could just report zero in the absense of a kernel provided value.