aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/in_var.h
diff options
context:
space:
mode:
authorBruce M Simpson <bms@FreeBSD.org>2006-09-25 10:11:16 +0000
committerBruce M Simpson <bms@FreeBSD.org>2006-09-25 10:11:16 +0000
commit07ea6709eac917d8ddfca2acef00c75b8d300d38 (patch)
tree32da2515bec6367ff396b9b72c433ec025da3189 /sys/netinet/in_var.h
parent4dc630cdd2f7a790604d2724ecb19c6aa95130a7 (diff)
downloadsrc-07ea6709eac917d8ddfca2acef00c75b8d300d38.tar.gz
src-07ea6709eac917d8ddfca2acef00c75b8d300d38.zip
Account for output IP datagrams on the ifaddr where they originated from,
*not* the first ifaddr on the ifp. This is similar to what NetBSD does. PR: kern/72936 Submitted by: alfred Reviewed by: andre
Notes
Notes: svn path=/head/; revision=162615
Diffstat (limited to 'sys/netinet/in_var.h')
-rw-r--r--sys/netinet/in_var.h17
1 files changed, 14 insertions, 3 deletions
diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h
index 319b0dc5519b..9669a1b8993f 100644
--- a/sys/netinet/in_var.h
+++ b/sys/netinet/in_var.h
@@ -94,6 +94,19 @@ extern u_long in_ifaddrhmask; /* mask for hash table */
#define INADDR_HASH(x) \
(&in_ifaddrhashtbl[INADDR_HASHVAL(x) & in_ifaddrhmask])
+/*
+ * Macro for finding the internet address structure (in_ifaddr) corresponding
+ * corresponding to one of our IP addresses (in_addr).
+ */
+#define INADDR_TO_IFADDR(addr, ia) \
+ /* struct in_addr addr; */ \
+ /* struct in_ifaddr *ia; */ \
+do { \
+\
+ LIST_FOREACH(ia, INADDR_HASH((addr).s_addr), ia_hash) \
+ if (IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \
+ break; \
+} while (0)
/*
* Macro for finding the interface (ifnet structure) corresponding to one
@@ -105,9 +118,7 @@ extern u_long in_ifaddrhmask; /* mask for hash table */
{ \
struct in_ifaddr *ia; \
\
- LIST_FOREACH(ia, INADDR_HASH((addr).s_addr), ia_hash) \
- if (IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \
- break; \
+ INADDR_TO_IFADDR(addr, ia); \
(ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \
}