diff options
| author | Qing Li <qingli@FreeBSD.org> | 2010-04-01 20:23:43 +0000 |
|---|---|---|
| committer | Qing Li <qingli@FreeBSD.org> | 2010-04-01 20:23:43 +0000 |
| commit | 01104d862b4b0a3232ab7094b005a9a14e36e559 (patch) | |
| tree | 9d35c22477f5d103325fac48508122ea9cf99560 /sys/net | |
| parent | 618de50c3ffaa2f411010b8aba71b9648ed37c38 (diff) | |
Notes
Diffstat (limited to 'sys/net')
| -rw-r--r-- | sys/net/flowtable.c | 13 |
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; |
