patch-2.2.11 linux/net/ipv4/route.c
Next file: linux/net/ipv4/syncookies.c
Previous file: linux/net/ipv4/raw.c
Back to the patch index
Back to the overall index
- Lines: 163
- Date:
Mon Aug 9 12:05:14 1999
- Orig file:
v2.2.10/linux/net/ipv4/route.c
- Orig date:
Mon May 10 09:55:25 1999
diff -u --recursive --new-file v2.2.10/linux/net/ipv4/route.c linux/net/ipv4/route.c
@@ -5,7 +5,7 @@
*
* ROUTE - implementation of the IP router.
*
- * Version: $Id: route.c,v 1.67 1999/05/08 20:00:20 davem Exp $
+ * Version: $Id: route.c,v 1.67.2.3 1999/08/08 08:43:12 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -599,6 +599,22 @@
return 0;
}
+static void rt_del(unsigned hash, struct rtable *rt)
+{
+ struct rtable **rthp;
+
+ start_bh_atomic();
+ ip_rt_put(rt);
+ for (rthp = &rt_hash_table[hash]; *rthp; rthp = &(*rthp)->u.rt_next) {
+ if (*rthp == rt) {
+ *rthp = rt->u.rt_next;
+ rt_free(rt);
+ break;
+ }
+ }
+ end_bh_atomic();
+}
+
void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw,
u32 saddr, u8 tos, struct device *dev)
{
@@ -669,6 +685,7 @@
rt->u.dst.lastuse = jiffies;
rt->u.dst.neighbour = NULL;
rt->u.dst.hh = NULL;
+ rt->u.dst.obsolete = 0;
rt->rt_flags |= RTCF_REDIRECTED;
@@ -687,10 +704,10 @@
break;
}
- *rthp = rth->u.rt_next;
+ rt_del(hash, rth);
+
if (!rt_intern_hash(hash, rt, &rt))
ip_rt_put(rt);
- rt_drop(rth);
break;
}
}
@@ -718,20 +735,10 @@
}
if ((rt->rt_flags&RTCF_REDIRECTED) || rt->u.dst.expires) {
unsigned hash = rt_hash_code(rt->key.dst, rt->key.src^(rt->key.oif<<5), rt->key.tos);
- struct rtable **rthp;
#if RT_CACHE_DEBUG >= 1
printk(KERN_DEBUG "ip_rt_advice: redirect to %d.%d.%d.%d/%02x dropped\n", NIPQUAD(rt->rt_dst), rt->key.tos);
#endif
- start_bh_atomic();
- ip_rt_put(rt);
- for (rthp = &rt_hash_table[hash]; *rthp; rthp = &(*rthp)->u.rt_next) {
- if (*rthp == rt) {
- *rthp = rt->u.rt_next;
- rt_free(rt);
- break;
- }
- }
- end_bh_atomic();
+ rt_del(hash, rt);
return NULL;
}
}
@@ -950,7 +957,7 @@
if (rt->key.iif == 0)
src = rt->rt_src;
- else if (fib_lookup(&rt->key, &res) == 0)
+ else if (fib_lookup(&rt->key, &res) == 0 && res.type != RTN_NAT)
src = FIB_RES_PREFSRC(res);
else
src = inet_select_addr(rt->u.dst.dev, rt->rt_gateway, RT_SCOPE_UNIVERSE);
@@ -980,6 +987,8 @@
rt->u.dst.pmtu = rt->u.dst.dev->mtu;
if (rt->u.dst.pmtu > IP_MAX_MTU)
rt->u.dst.pmtu = IP_MAX_MTU;
+ if (rt->u.dst.pmtu < 68)
+ rt->u.dst.pmtu = 68;
if (rt->u.dst.mxlock&(1<<RTAX_MTU) &&
rt->rt_gateway != rt->rt_dst &&
rt->u.dst.pmtu > 576)
@@ -994,6 +1003,8 @@
rt->u.dst.pmtu = rt->u.dst.dev->mtu;
if (rt->u.dst.pmtu > IP_MAX_MTU)
rt->u.dst.pmtu = IP_MAX_MTU;
+ if (rt->u.dst.pmtu < 68)
+ rt->u.dst.pmtu = 68;
rt->u.dst.window= 0;
rt->u.dst.rtt = TCP_TIMEOUT_INIT;
}
@@ -1916,16 +1927,30 @@
return -EINVAL;
}
+static int ipv4_sysctl_rtcache_flush_strategy(ctl_table *table, int *name, int nlen,
+ void *oldval, size_t *oldlenp,
+ void *newval, size_t newlen,
+ void **context)
+{
+ int delay;
+ if (newlen != sizeof(int))
+ return -EINVAL;
+ if (get_user(delay,(int *)newval))
+ return -EFAULT;
+ rt_cache_flush(delay);
+ return 0;
+}
+
ctl_table ipv4_route_table[] = {
{NET_IPV4_ROUTE_FLUSH, "flush",
- &flush_delay, sizeof(int), 0200, NULL,
- &ipv4_sysctl_rtcache_flush},
+ &flush_delay, sizeof(int), 0644, NULL,
+ &ipv4_sysctl_rtcache_flush, &ipv4_sysctl_rtcache_flush_strategy },
{NET_IPV4_ROUTE_MIN_DELAY, "min_delay",
&ip_rt_min_delay, sizeof(int), 0644, NULL,
- &proc_dointvec_jiffies},
+ &proc_dointvec_jiffies, &sysctl_jiffies},
{NET_IPV4_ROUTE_MAX_DELAY, "max_delay",
&ip_rt_max_delay, sizeof(int), 0644, NULL,
- &proc_dointvec_jiffies},
+ &proc_dointvec_jiffies, &sysctl_jiffies},
{NET_IPV4_ROUTE_GC_THRESH, "gc_thresh",
&ipv4_dst_ops.gc_thresh, sizeof(int), 0644, NULL,
&proc_dointvec},
@@ -1934,13 +1959,13 @@
&proc_dointvec},
{NET_IPV4_ROUTE_GC_MIN_INTERVAL, "gc_min_interval",
&ip_rt_gc_min_interval, sizeof(int), 0644, NULL,
- &proc_dointvec_jiffies},
+ &proc_dointvec_jiffies, &sysctl_jiffies},
{NET_IPV4_ROUTE_GC_TIMEOUT, "gc_timeout",
&ip_rt_gc_timeout, sizeof(int), 0644, NULL,
- &proc_dointvec_jiffies},
+ &proc_dointvec_jiffies, &sysctl_jiffies},
{NET_IPV4_ROUTE_GC_INTERVAL, "gc_interval",
&ip_rt_gc_interval, sizeof(int), 0644, NULL,
- &proc_dointvec_jiffies},
+ &proc_dointvec_jiffies, &sysctl_jiffies},
{NET_IPV4_ROUTE_REDIRECT_LOAD, "redirect_load",
&ip_rt_redirect_load, sizeof(int), 0644, NULL,
&proc_dointvec},
@@ -1961,7 +1986,7 @@
&proc_dointvec},
{NET_IPV4_ROUTE_MTU_EXPIRES, "mtu_expires",
&ip_rt_mtu_expires, sizeof(int), 0644, NULL,
- &proc_dointvec_jiffies},
+ &proc_dointvec_jiffies, &sysctl_jiffies},
{0}
};
#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)