aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
authorQing Li <qingli@FreeBSD.org>2010-04-01 20:23:43 +0000
committerQing Li <qingli@FreeBSD.org>2010-04-01 20:23:43 +0000
commit01104d862b4b0a3232ab7094b005a9a14e36e559 (patch)
tree9d35c22477f5d103325fac48508122ea9cf99560 /sys/net
parent618de50c3ffaa2f411010b8aba71b9648ed37c38 (diff)
Notes
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/flowtable.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/net/flowtable.c b/sys/net/flowtable.c
index cbdb8e584ca5..0ad8a66788cd 100644
--- a/sys/net/flowtable.c
+++ b/sys/net/flowtable.c
@@ -598,6 +598,8 @@ flowtable_lookup_mbuf4(struct flowtable *ft, struct mbuf *m)
dsin = (struct sockaddr_in *)&dsa;
ssin = (struct sockaddr_in *)&ssa;
+ bzero(dsin, sizeof(*dsin));
+ bzero(ssin, sizeof(*ssin));
flags = ft->ft_flags;
if (ipv4_mbuf_demarshal(ft, m, ssin, dsin, &flags) != 0)
return (NULL);
@@ -801,6 +803,8 @@ flowtable_lookup_mbuf6(struct flowtable *ft, struct mbuf *m)
dsin6 = (struct sockaddr_in6 *)&dsa;
ssin6 = (struct sockaddr_in6 *)&ssa;
+ bzero(dsin6, sizeof(*dsin6));
+ bzero(ssin6, sizeof(*ssin6));
flags = ft->ft_flags;
if (ipv6_mbuf_demarshal(ft, m, ssin6, dsin6, &flags) != 0)
@@ -1130,6 +1134,14 @@ flowtable_lookup(struct flowtable *ft, struct sockaddr_storage *ssa,
ro = &sro;
memcpy(&ro->ro_dst, dsa, sizeof(struct sockaddr_in));
+ /*
+ * The harvested source and destination addresses
+ * may contain port information if the packet is
+ * from a transport protocol (e.g. TCP/UDP). The
+ * port field must be cleared before performing
+ * a route lookup.
+ */
+ ((struct sockaddr_in *)&ro->ro_dst)->sin_port = 0;
dsin = (struct sockaddr_in *)dsa;
ssin = (struct sockaddr_in *)ssa;
if ((dsin->sin_addr.s_addr == ssin->sin_addr.s_addr) ||
@@ -1147,6 +1159,7 @@ flowtable_lookup(struct flowtable *ft, struct sockaddr_storage *ssa,
ro = (struct route *)&sro6;
memcpy(&sro6.ro_dst, dsa,
sizeof(struct sockaddr_in6));
+ ((struct sockaddr_in6 *)&ro->ro_dst)->sin6_port = 0;
dsin6 = (struct sockaddr_in6 *)dsa;
ssin6 = (struct sockaddr_in6 *)ssa;