Make use of in_localip() function and replace previous direct LIST_FOREACH

loops over INADDR_HASH.
This commit is contained in:
Andre Oppermann 2004-08-11 12:32:10 +00:00
parent d6024e35bf
commit 67d0b24ed1

View File

@ -116,7 +116,7 @@ SYSCTL_INT(_net_inet_ip, OID_AUTO, fastforwarding, CTLFLAG_RW,
&ipfastforward_active, 0, "Enable fast IP forwarding");
static struct sockaddr_in *
ip_findroute(struct route *ro, in_addr_t dest, struct mbuf *m)
ip_findroute(struct route *ro, struct in_addr dest, struct mbuf *m)
{
struct sockaddr_in *dst;
struct rtentry *rt;
@ -128,7 +128,7 @@ ip_findroute(struct route *ro, in_addr_t dest, struct mbuf *m)
dst = (struct sockaddr_in *)&ro->ro_dst;
dst->sin_family = AF_INET;
dst->sin_len = sizeof(*dst);
dst->sin_addr.s_addr = dest;
dst->sin_addr.s_addr = dest.s_addr;
rtalloc_ign(ro, RTF_CLONING);
/*
@ -173,7 +173,7 @@ ip_fastforward(struct mbuf *m)
struct ifaddr *ifa = NULL;
struct ifnet *ifp;
struct ip_fw_args args;
in_addr_t odest, dest;
struct in_addr odest, dest;
u_short sum, ip_len;
int error = 0;
int hlen, ipfw, mtu;
@ -330,10 +330,8 @@ ip_fastforward(struct mbuf *m)
/*
* Is it for a local address on this host?
*/
LIST_FOREACH(ia, INADDR_HASH(ip->ip_dst.s_addr), ia_hash) {
if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr)
return 0;
}
if (in_localip(ip->ip_dst))
return 0;
/*
* Or is it for a local IP broadcast address on this host?
@ -363,7 +361,7 @@ ip_fastforward(struct mbuf *m)
ip->ip_len = ntohs(ip->ip_len);
ip->ip_off = ntohs(ip->ip_off);
odest = dest = ip->ip_dst.s_addr;
odest.s_addr = dest.s_addr = ip->ip_dst.s_addr;
#ifdef PFIL_HOOKS
/*
* Run through list of ipfilter hooks for input packets
@ -376,7 +374,7 @@ ip_fastforward(struct mbuf *m)
M_ASSERTPKTHDR(m);
ip = mtod(m, struct ip *); /* m may have changed by pfil hook */
dest = ip->ip_dst.s_addr;
dest.s_addr = ip->ip_dst.s_addr;
#endif
/*
@ -452,7 +450,7 @@ ip_fastforward(struct mbuf *m)
}
#endif
if (ipfw == 0 && args.next_hop != NULL) {
dest = args.next_hop->sin_addr.s_addr;
dest.s_addr = args.next_hop->sin_addr.s_addr;
goto passin;
}
/*
@ -467,14 +465,12 @@ passin:
/*
* Destination address changed?
*/
if (odest != dest) {
if (odest.s_addr != dest.s_addr) {
/*
* Is it now for a local address on this host?
*/
LIST_FOREACH(ia, INADDR_HASH(ip->ip_dst.s_addr), ia_hash) {
if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr)
goto forwardlocal;
}
if (in_localip(dest))
goto forwardlocal;
/*
* Go on with new destination address
*/
@ -531,7 +527,7 @@ passin:
M_ASSERTPKTHDR(m);
ip = mtod(m, struct ip *);
dest = ip->ip_dst.s_addr;
dest.s_addr = ip->ip_dst.s_addr;
#endif
if (fw_enable && IPFW_LOADED && !args.next_hop) {
bzero(&args, sizeof(args));
@ -604,7 +600,7 @@ passin:
}
#endif
if (ipfw == 0 && args.next_hop != NULL) {
dest = args.next_hop->sin_addr.s_addr;
dest.s_addr = args.next_hop->sin_addr.s_addr;
goto passout;
}
/*
@ -619,42 +615,40 @@ passout:
/*
* Destination address changed?
*/
if (odest != dest) {
if (odest.s_addr != dest.s_addr) {
/*
* Is it now for a local address on this host?
*/
LIST_FOREACH(ia, INADDR_HASH(ip->ip_dst.s_addr), ia_hash) {
if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr) {
if (in_localip(dest)) {
forwardlocal:
if (args.next_hop) {
struct m_tag *mtag = m_tag_get(
PACKET_TAG_IPFORWARD,
sizeof(struct sockaddr_in *),
M_NOWAIT);
if (mtag == NULL) {
goto drop;
}
*(struct sockaddr_in **)(mtag+1) =
args.next_hop;
m_tag_prepend(m, mtag);
if (args.next_hop) {
struct m_tag *mtag = m_tag_get(
PACKET_TAG_IPFORWARD,
sizeof(struct sockaddr_in *),
M_NOWAIT);
if (mtag == NULL) {
goto drop;
}
*(struct sockaddr_in **)(mtag+1) =
args.next_hop;
m_tag_prepend(m, mtag);
}
#ifdef IPDIVERT
droptoours: /* Used for DIVERT */
#endif
/* for ip_input */
m->m_flags |= M_FASTFWD_OURS;
/* for ip_input */
m->m_flags |= M_FASTFWD_OURS;
/* ip still points to the real packet */
ip->ip_len = htons(ip->ip_len);
ip->ip_off = htons(ip->ip_off);
/* ip still points to the real packet */
ip->ip_len = htons(ip->ip_len);
ip->ip_off = htons(ip->ip_off);
/*
* Return packet for processing by ip_input
*/
if (ro.ro_rt)
RTFREE(ro.ro_rt);
return 0;
}
/*
* Return packet for processing by ip_input
*/
if (ro.ro_rt)
RTFREE(ro.ro_rt);
return 0;
}
/*
* Redo route lookup with new destination address