Thread (28 messages) 28 messages, 6 authors, 2004-03-06

Re: PMTU issues due to TOS field manipulation (for DSCP)

From: Julian Anastasov <ja@ssi.bg>
Date: 2004-03-06 16:02:06

	Hello,

On Fri, 5 Mar 2004 kuznet@ms2.inr.ac.ru wrote:
quoted
- do we need to walk all tos values for ip_rt_redirect in the same
way as for ip_rt_frag_needed,
Well, it is just the same thing (except for one thing, that ignored
redirects are harmless)
	A related 3-hunk change (on top of tos-8.diff), more eyes are
needed. The 2nd hunk tries harder to propagate the new_gw. It seems
this 2nd hunk is needed because the first list of checks does not compare
all possible keys and we can not simply exit the hash chain in the
middle. This problem exists also in current kernels, for example, when
fwmark is used. As for hunks 1 and the 3, they are needed if we want
to propagate the new_gw value to all entries in the hash chain
with the cost of some cycles. If we do not apply 1 and 3 then
we will update the next entries in the chain on another redirect
message.

	do_next is still used to avoid deadloops in a chain, do_repeat is 
used only on successful update.

Comments?

Regards

--
Julian Anastasov [off-list ref]
--- linux-tos-8/net/ipv4/route.c	2004-03-06 13:24:03.000000000 +0200
+++ linux/net/ipv4/route.c	2004-03-06 17:28:34.572673040 +0200
@@ -1018,6 +1018,8 @@
 	for (i = 0; i < 2; i++) {
 			unsigned hash = rt_hash_code(daddr, skeys[i], tos_values[j]);

+		do_repeat:
+
 			rthp=&rt_hash_table[hash].chain;

 			rcu_read_lock();
@@ -1039,8 +1041,10 @@
 				    rth->rt_src != saddr ||
 				    rth->u.dst.error ||
 				    rth->rt_gateway != old_gw ||
-				    rth->u.dst.dev != dev)
-					break;
+				    rth->u.dst.dev != dev) {
+					rthp = &rth->u.rt_next;
+					continue;
+				}

 				dst_hold(&rth->u.dst);
 				rcu_read_unlock();
@@ -1089,8 +1093,10 @@
 				}

 				rt_del(hash, rth);
-				if (!rt_intern_hash(hash, rt, &rt))
+				if (!rt_intern_hash(hash, rt, &rt)) {
 					ip_rt_put(rt);
+					goto do_repeat;
+				}
 				goto do_next;
 			}
 			rcu_read_unlock();
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help