Skip to contentSkip to conversation

Initilize and populate age field

PATCH RESEND In review Varun Chandramohan 2 participants 2 messages Sep 19, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH RESEND 3/4 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      |    3 +++
 net/ipv4/fib_lookup.h    |    3 ++-
 net/ipv4/fib_semantics.c |   20 +++++++++++++++++---
 net/ipv4/fib_trie.c      |    1 +
 4 files changed, 23 insertions(+), 4 deletions(-)
net/ipv4/fib_hash.c +3 -0
index 9ad1d9f..228ab27 100644
@@ -448,6 +448,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 = 0;
 			state = fa->fa_state;
 			fa->fa_state &= ~FA_S_ACCESSED;
 			fib_hash_genid++;
@@ -507,6 +508,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 = 0;
 
 	/*
 	 * Insert new entry to the list.
@@ -697,6 +699,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
index eef9eec..c9145b5 100644
@@ -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 +17 -3
index c434119..1e56611 100644
@@ -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,18 @@ int fib_dump_info(struct sk_buff *skb, u
 			NLA_PUT_U32(skb, RTA_FLOW, fi->fib_nh[0].nh_tclassid);
 #endif
 	}
+
+	/* Note: The ideal place to fill up the time value for a newely created route will be
+	** in fn_hash_insert(). But we are delaying the time insert procedure to avoid calling
+	** do_gettimeofday() twice.
+	*/
+	do_gettimeofday(&tv);
+	if (!*age) {
+		*age = timeval_to_sec(&tv);
+		NLA_PUT_U32(skb, RTA_AGE, *age);
+	} else {
+		NLA_PUT_U32(skb, RTA_AGE, timeval_to_sec(&tv) - *age);
+	}
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
 	if (fi->fib_nhs > 1) {
 		struct rtnexthop *rtnh;
net/ipv4/fib_trie.c +1 -0
index 52b2891..82a8bac 100644
@@ -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
maintainer
#1 lore raw

From: Varun Chandramohan <[email protected]>
Date: Wed, 19 Sep 2007 09:24:34 +0530

Quoted 4 lines

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.

This doesn't match what your code does:

net/ipv4/fib_semantics.c int fib_dump_info(struct sk_buff *skb, u · line 1001

Quoted 11 lines
net/ipv4/fib_semantics.c +11 -0
+	/* Note: The ideal place to fill up the time value for a newely created route will be
+	** in fn_hash_insert(). But we are delaying the time insert procedure to avoid calling
+	** do_gettimeofday() twice.
+	*/
+	do_gettimeofday(&tv);
+	if (!*age) {
+		*age = timeval_to_sec(&tv);
+		NLA_PUT_U32(skb, RTA_AGE, *age);
+	} else {
+		NLA_PUT_U32(skb, RTA_AGE, timeval_to_sec(&tv) - *age);
+	}

In avoiding the age initialization at routing cache insertion time, you make the value provided totally inaccurate and essentially useless especially the very first time the value is asked for.

I really don't like these changes, they have had problems every step of the way, and the above proves that we could essentially always return an age value of zero and still be compliant with the standards.