parent
e24bbfb30f
commit
34104dbea3
|
|
@ -1,230 +0,0 @@
|
|||
--- linux/include/net/route.h.orig Tue Apr 17 07:25:48 2001
|
||||
+++ linux/include/net/route.h Tue Jul 10 23:35:18 2001
|
||||
@@ -14,6 +14,7 @@
|
||||
* Alan Cox : Support for TCP parameters.
|
||||
* Alexey Kuznetsov: Major changes for new routing code.
|
||||
* Mike McLagan : Routing by source
|
||||
+ * Robert Olsson : Added rt_cache statistics
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -90,6 +91,20 @@
|
||||
__u32 o_packets;
|
||||
__u32 i_bytes;
|
||||
__u32 i_packets;
|
||||
+};
|
||||
+
|
||||
+struct rt_cache_stat
|
||||
+{
|
||||
+ unsigned in_hit;
|
||||
+ unsigned in_slow_tot;
|
||||
+ unsigned in_slow_mc;
|
||||
+ unsigned in_no_route;
|
||||
+ unsigned in_brd;
|
||||
+ unsigned in_martian_dst;
|
||||
+ unsigned in_martian_src;
|
||||
+ unsigned out_hit;
|
||||
+ unsigned out_slow_tot;
|
||||
+ unsigned out_slow_mc;
|
||||
};
|
||||
|
||||
extern struct ip_rt_acct *ip_rt_acct;
|
||||
--- linux/net/ipv4/route.c.orig Wed Mar 28 22:01:15 2001
|
||||
+++ linux/net/ipv4/route.c Tue Jul 10 23:27:51 2001
|
||||
@@ -52,6 +52,7 @@
|
||||
* Tobias Ringstrom : Uninitialized res.type in ip_route_output_slow.
|
||||
* Vladimir V. Ivanov : IP rule info (flowid) is really useful.
|
||||
* Marc Boucher : routing by fwmark
|
||||
+ * Robert Olsson : Added rt_cache statistics
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -201,6 +202,8 @@
|
||||
static unsigned rt_hash_mask;
|
||||
static int rt_hash_log;
|
||||
|
||||
+struct rt_cache_stat rt_cache_stat[NR_CPUS];
|
||||
+
|
||||
static int rt_intern_hash(unsigned hash, struct rtable * rth, struct rtable ** res);
|
||||
|
||||
static __inline__ unsigned rt_hash_code(u32 daddr, u32 saddr, u8 tos)
|
||||
@@ -270,6 +273,44 @@
|
||||
len = length;
|
||||
return len;
|
||||
}
|
||||
+
|
||||
+
|
||||
+#ifdef CONFIG_PROC_FS
|
||||
+static int rt_cache_stat_get_info(char *buffer, char **start, off_t offset, int length)
|
||||
+{
|
||||
+ int i, lcpu;
|
||||
+ int len=0;
|
||||
+ unsigned int dst_entries = atomic_read(&ipv4_dst_ops.entries);
|
||||
+
|
||||
+ for (lcpu=0; lcpu<smp_num_cpus; lcpu++) {
|
||||
+ i = cpu_logical_map(lcpu);
|
||||
+
|
||||
+ len += sprintf(buffer+len, "%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||
+ dst_entries,
|
||||
+ rt_cache_stat[i].in_hit,
|
||||
+ rt_cache_stat[i].in_slow_tot,
|
||||
+ rt_cache_stat[i].in_slow_mc,
|
||||
+ rt_cache_stat[i].in_no_route,
|
||||
+ rt_cache_stat[i].in_brd,
|
||||
+ rt_cache_stat[i].in_martian_dst,
|
||||
+ rt_cache_stat[i].in_martian_src,
|
||||
+
|
||||
+ rt_cache_stat[i].out_hit,
|
||||
+ rt_cache_stat[i].out_slow_tot,
|
||||
+ rt_cache_stat[i].out_slow_mc
|
||||
+ );
|
||||
+ }
|
||||
+ len -= offset;
|
||||
+
|
||||
+ if (len > length)
|
||||
+ len = length;
|
||||
+ if (len < 0)
|
||||
+ len = 0;
|
||||
+
|
||||
+ *start = buffer + offset;
|
||||
+ return len;
|
||||
+}
|
||||
+#endif
|
||||
|
||||
static __inline__ void rt_free(struct rtable *rt)
|
||||
{
|
||||
@@ -1163,6 +1204,8 @@
|
||||
u32 spec_dst;
|
||||
struct in_device *in_dev = in_dev_get(dev);
|
||||
u32 itag = 0;
|
||||
+ int cpu = smp_processor_id();
|
||||
+
|
||||
|
||||
/* Primary sanity checks. */
|
||||
|
||||
@@ -1221,6 +1264,7 @@
|
||||
if (!LOCAL_MCAST(daddr) && IN_DEV_MFORWARD(in_dev))
|
||||
rth->u.dst.input = ip_mr_input;
|
||||
#endif
|
||||
+ rt_cache_stat[cpu].in_slow_mc++;
|
||||
|
||||
in_dev_put(in_dev);
|
||||
hash = rt_hash_code(daddr, saddr^(dev->ifindex<<5), tos);
|
||||
@@ -1259,6 +1303,7 @@
|
||||
u32 spec_dst;
|
||||
int err = -EINVAL;
|
||||
int free_res = 0;
|
||||
+ int cpu = smp_processor_id();
|
||||
|
||||
/*
|
||||
* IP on this device is disabled.
|
||||
@@ -1308,6 +1353,8 @@
|
||||
}
|
||||
free_res = 1;
|
||||
|
||||
+ rt_cache_stat[cpu].in_slow_tot++;
|
||||
+
|
||||
#ifdef CONFIG_IP_ROUTE_NAT
|
||||
/* Policy is applied before mapping destination,
|
||||
but rerouting after map should be made with old source.
|
||||
@@ -1455,6 +1502,7 @@
|
||||
}
|
||||
flags |= RTCF_BROADCAST;
|
||||
res.type = RTN_BROADCAST;
|
||||
+ rt_cache_stat[cpu].in_brd++;
|
||||
|
||||
local_input:
|
||||
rth = dst_alloc(&ipv4_dst_ops);
|
||||
@@ -1498,6 +1546,7 @@
|
||||
goto intern;
|
||||
|
||||
no_route:
|
||||
+ rt_cache_stat[cpu].in_no_route++;
|
||||
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE);
|
||||
res.type = RTN_UNREACHABLE;
|
||||
goto local_input;
|
||||
@@ -1506,6 +1555,7 @@
|
||||
* Do not cache martian addresses: they should be logged (RFC1812)
|
||||
*/
|
||||
martian_destination:
|
||||
+ rt_cache_stat[cpu].in_martian_dst++;
|
||||
#ifdef CONFIG_IP_ROUTE_VERBOSE
|
||||
if (IN_DEV_LOG_MARTIANS(in_dev) && net_ratelimit())
|
||||
printk(KERN_WARNING "martian destination %u.%u.%u.%u from %u.%u.%u.%u, dev %s\n",
|
||||
@@ -1520,6 +1570,8 @@
|
||||
goto done;
|
||||
|
||||
martian_source:
|
||||
+
|
||||
+ rt_cache_stat[cpu].in_martian_src++;
|
||||
#ifdef CONFIG_IP_ROUTE_VERBOSE
|
||||
if (IN_DEV_LOG_MARTIANS(in_dev) && net_ratelimit()) {
|
||||
/*
|
||||
@@ -1550,6 +1602,7 @@
|
||||
struct rtable * rth;
|
||||
unsigned hash;
|
||||
int iif = dev->ifindex;
|
||||
+ int cpu = smp_processor_id();
|
||||
|
||||
tos &= IPTOS_RT_MASK;
|
||||
hash = rt_hash_code(daddr, saddr^(iif<<5), tos);
|
||||
@@ -1567,6 +1620,7 @@
|
||||
rth->u.dst.lastuse = jiffies;
|
||||
dst_hold(&rth->u.dst);
|
||||
rth->u.dst.__use++;
|
||||
+ rt_cache_stat[cpu].in_hit++;
|
||||
read_unlock(&rt_hash_table[hash].lock);
|
||||
skb->dst = (struct dst_entry*)rth;
|
||||
return 0;
|
||||
@@ -1621,6 +1675,7 @@
|
||||
int free_res = 0;
|
||||
int err;
|
||||
u32 tos;
|
||||
+ int cpu = smp_processor_id();
|
||||
|
||||
tos = oldkey->tos & (IPTOS_RT_MASK|RTO_ONLINK);
|
||||
key.dst = oldkey->dst;
|
||||
@@ -1847,14 +1902,18 @@
|
||||
|
||||
rth->u.dst.output=ip_output;
|
||||
|
||||
+ rt_cache_stat[cpu].out_slow_tot++;
|
||||
+
|
||||
if (flags&RTCF_LOCAL) {
|
||||
rth->u.dst.input = ip_local_deliver;
|
||||
rth->rt_spec_dst = key.dst;
|
||||
}
|
||||
if (flags&(RTCF_BROADCAST|RTCF_MULTICAST)) {
|
||||
rth->rt_spec_dst = key.src;
|
||||
- if (flags&RTCF_LOCAL && !(dev_out->flags&IFF_LOOPBACK))
|
||||
+ if (flags&RTCF_LOCAL && !(dev_out->flags&IFF_LOOPBACK)) {
|
||||
rth->u.dst.output = ip_mc_output;
|
||||
+ rt_cache_stat[cpu].out_slow_mc++;
|
||||
+ }
|
||||
#ifdef CONFIG_IP_MROUTE
|
||||
if (res.type == RTN_MULTICAST) {
|
||||
struct in_device *in_dev = in_dev_get(dev_out);
|
||||
@@ -1894,6 +1953,7 @@
|
||||
{
|
||||
unsigned hash;
|
||||
struct rtable *rth;
|
||||
+ int cpu = smp_processor_id();
|
||||
|
||||
hash = rt_hash_code(key->dst, key->src^(key->oif<<5), key->tos);
|
||||
|
||||
@@ -1912,6 +1972,7 @@
|
||||
rth->u.dst.lastuse = jiffies;
|
||||
dst_hold(&rth->u.dst);
|
||||
rth->u.dst.__use++;
|
||||
+ rt_cache_stat[cpu].out_hit++;
|
||||
read_unlock_bh(&rt_hash_table[hash].lock);
|
||||
*rp = rth;
|
||||
return 0;
|
||||
@@ -2339,6 +2400,7 @@
|
||||
add_timer(&rt_periodic_timer);
|
||||
|
||||
proc_net_create ("rt_cache", 0, rt_cache_get_info);
|
||||
+ proc_net_create ("rt_cache_stat", 0, rt_cache_stat_get_info);
|
||||
#ifdef CONFIG_NET_CLS_ROUTE
|
||||
create_proc_read_entry("net/rt_acct", 0, 0, ip_rt_acct_read, NULL);
|
||||
#endif
|
||||
Loading…
Reference in New Issue