| version 1.246, 2007/03/12 18:18:36 |
version 1.246.2.1, 2007/07/11 20:11:23 |
|
|
| M_WAITOK, &in_multihash); |
M_WAITOK, &in_multihash); |
| ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout); |
ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout); |
| #ifdef GATEWAY |
#ifdef GATEWAY |
| ipflow_init(); |
ipflow_init(ip_hashsize); |
| #endif |
#endif |
| |
|
| #ifdef PFIL_HOOKS |
#ifdef PFIL_HOOKS |
|
|
| struct in_ifaddr * |
struct in_ifaddr * |
| ip_rtaddr(struct in_addr dst) |
ip_rtaddr(struct in_addr dst) |
| { |
{ |
| if (!in_hosteq(dst, satocsin(rtcache_getdst(&ipforward_rt))->sin_addr)) |
struct rtentry *rt; |
| rtcache_free(&ipforward_rt); |
union { |
| else |
struct sockaddr dst; |
| rtcache_check(&ipforward_rt); |
struct sockaddr_in dst4; |
| |
} u; |
| if (ipforward_rt.ro_rt == NULL) { |
|
| struct sockaddr_in *sin = satosin(&ipforward_rt.ro_dst); |
sockaddr_in_init(&u.dst4, &dst, 0); |
| |
|
| sin->sin_family = AF_INET; |
if ((rt = rtcache_lookup(&ipforward_rt, &u.dst)) == NULL) |
| sin->sin_len = sizeof(*sin); |
return NULL; |
| sin->sin_addr = dst; |
|
| |
return ifatoia(rt->rt_ifa); |
| rtcache_init(&ipforward_rt); |
|
| if (ipforward_rt.ro_rt == NULL) |
|
| return NULL; |
|
| } |
|
| return ifatoia(ipforward_rt.ro_rt->rt_ifa); |
|
| } |
} |
| |
|
| /* |
/* |
| Line 1841 ip_forward(struct mbuf *m, int srcrt) |
|
| Line 1836 ip_forward(struct mbuf *m, int srcrt) |
|
| int error, type = 0, code = 0, destmtu = 0; |
int error, type = 0, code = 0, destmtu = 0; |
| struct mbuf *mcopy; |
struct mbuf *mcopy; |
| n_long dest; |
n_long dest; |
| |
union { |
| |
struct sockaddr dst; |
| |
struct sockaddr_in dst4; |
| |
} u; |
| |
|
| /* |
/* |
| * We are now in the output path. |
* We are now in the output path. |
| Line 1869 ip_forward(struct mbuf *m, int srcrt) |
|
| Line 1868 ip_forward(struct mbuf *m, int srcrt) |
|
| return; |
return; |
| } |
} |
| |
|
| if (!in_hosteq(ip->ip_dst, |
sockaddr_in_init(&u.dst4, &ip->ip_dst, 0); |
| satocsin(rtcache_getdst(&ipforward_rt))->sin_addr)) |
if ((rt = rtcache_lookup(&ipforward_rt, &u.dst)) == NULL) { |
| rtcache_free(&ipforward_rt); |
icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); |
| else |
return; |
| rtcache_check(&ipforward_rt); |
|
| if (ipforward_rt.ro_rt == NULL) { |
|
| struct sockaddr_in *sin = satosin(&ipforward_rt.ro_dst); |
|
| |
|
| sin->sin_family = AF_INET; |
|
| sin->sin_len = sizeof(*sin); |
|
| sin->sin_addr = ip->ip_dst; |
|
| |
|
| rtcache_init(&ipforward_rt); |
|
| if (ipforward_rt.ro_rt == NULL) { |
|
| icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); |
|
| return; |
|
| } |
|
| } |
} |
| rt = ipforward_rt.ro_rt; |
|
| |
|
| /* |
/* |
| * Save at most 68 bytes of the packet in case |
* Save at most 68 bytes of the packet in case |
| Line 2160 sysctl_net_inet_ip_pmtudto(SYSCTLFN_ARGS |
|
| Line 2145 sysctl_net_inet_ip_pmtudto(SYSCTLFN_ARGS |
|
| |
|
| #ifdef GATEWAY |
#ifdef GATEWAY |
| /* |
/* |
| * sysctl helper routine for net.inet.ip.maxflows. apparently if |
* sysctl helper routine for net.inet.ip.maxflows. |
| * maxflows is even looked up, we "reap flows". |
|
| */ |
*/ |
| static int |
static int |
| sysctl_net_inet_ip_maxflows(SYSCTLFN_ARGS) |
sysctl_net_inet_ip_maxflows(SYSCTLFN_ARGS) |
| Line 2169 sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG |
|
| Line 2153 sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG |
|
| int s; |
int s; |
| |
|
| s = sysctl_lookup(SYSCTLFN_CALL(rnode)); |
s = sysctl_lookup(SYSCTLFN_CALL(rnode)); |
| if (s) |
if (s || newp == NULL) |
| return (s); |
return (s); |
| |
|
| s = splsoftnet(); |
s = splsoftnet(); |
| Line 2178 sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG |
|
| Line 2162 sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG |
|
| |
|
| return (0); |
return (0); |
| } |
} |
| |
|
| |
static int |
| |
sysctl_net_inet_ip_hashsize(SYSCTLFN_ARGS) |
| |
{ |
| |
int error, tmp; |
| |
struct sysctlnode node; |
| |
|
| |
node = *rnode; |
| |
tmp = ip_hashsize; |
| |
node.sysctl_data = &tmp; |
| |
error = sysctl_lookup(SYSCTLFN_CALL(&node)); |
| |
if (error || newp == NULL) |
| |
return (error); |
| |
|
| |
if ((tmp & (tmp - 1)) == 0 && tmp != 0) { |
| |
/* |
| |
* Can only fail due to malloc() |
| |
*/ |
| |
if (ipflow_invalidate_all(tmp)) |
| |
return ENOMEM; |
| |
} else { |
| |
/* |
| |
* EINVAL if not a power of 2 |
| |
*/ |
| |
return EINVAL; |
| |
} |
| |
|
| |
return (0); |
| |
} |
| #endif /* GATEWAY */ |
#endif /* GATEWAY */ |
| |
|
| |
|
| Line 2299 SYSCTL_SETUP(sysctl_net_inet_ip_setup, " |
|
| Line 2312 SYSCTL_SETUP(sysctl_net_inet_ip_setup, " |
|
| sysctl_net_inet_ip_maxflows, 0, &ip_maxflows, 0, |
sysctl_net_inet_ip_maxflows, 0, &ip_maxflows, 0, |
| CTL_NET, PF_INET, IPPROTO_IP, |
CTL_NET, PF_INET, IPPROTO_IP, |
| IPCTL_MAXFLOWS, CTL_EOL); |
IPCTL_MAXFLOWS, CTL_EOL); |
| |
sysctl_createv(clog, 0, NULL, NULL, |
| |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
| |
CTLTYPE_INT, "hashsize", |
| |
SYSCTL_DESCR("Size of hash table for fast forwarding (IPv4)"), |
| |
sysctl_net_inet_ip_hashsize, 0, &ip_hashsize, 0, |
| |
CTL_NET, PF_INET, IPPROTO_IP, |
| |
CTL_CREATE, CTL_EOL); |
| #endif /* GATEWAY */ |
#endif /* GATEWAY */ |
| sysctl_createv(clog, 0, NULL, NULL, |
sysctl_createv(clog, 0, NULL, NULL, |
| CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |