diff options
author | bms <bms@FreeBSD.org> | 2006-09-25 10:11:16 +0000 |
---|---|---|
committer | bms <bms@FreeBSD.org> | 2006-09-25 10:11:16 +0000 |
commit | 27d7e8be08d5080b783ef437149fc4f7fc3adfde (patch) | |
tree | 32da2515bec6367ff396b9b72c433ec025da3189 /sys/netinet/in_var.h | |
parent | 7766e0a26b4a6088ea3cd0c32d8450ce1e25535b (diff) | |
download | FreeBSD-src-27d7e8be08d5080b783ef437149fc4f7fc3adfde.zip FreeBSD-src-27d7e8be08d5080b783ef437149fc4f7fc3adfde.tar.gz |
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
Diffstat (limited to 'sys/netinet/in_var.h')
-rw-r--r-- | sys/netinet/in_var.h | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index 319b0dc..9669a1b 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; \ } |