svn commit: r271400 - head/sys/netinet
Andrey V. Elsukov
ae at FreeBSD.org
Wed Sep 10 16:26:19 UTC 2014
Author: ae
Date: Wed Sep 10 16:26:18 2014
New Revision: 271400
URL: http://svnweb.freebsd.org/changeset/base/271400
Log:
Add scope zone id to the in_endpoints and hc_metrics structures.
A non-global IPv6 address can be used in more than one zone of the same
scope. This zone index is used to identify to which zone a non-global
address belongs.
Also we can have many foreign hosts with equal non-global addresses,
but from different zones. So, they can have different metrics in the
host cache.
Obtained from: Yandex LLC
Sponsored by: Yandex LLC
Modified:
head/sys/netinet/in_pcb.h
head/sys/netinet/tcp_hostcache.c
head/sys/netinet/tcp_hostcache.h
Modified: head/sys/netinet/in_pcb.h
==============================================================================
--- head/sys/netinet/in_pcb.h Wed Sep 10 15:45:18 2014 (r271399)
+++ head/sys/netinet/in_pcb.h Wed Sep 10 16:26:18 2014 (r271400)
@@ -94,6 +94,7 @@ struct in_endpoints {
struct in_addr_4in6 ie46_local;
struct in6_addr ie6_local;
} ie_dependladdr;
+ u_int32_t ie6_zoneid; /* scope zone id */
};
#define ie_faddr ie_dependfaddr.ie46_foreign.ia46_addr4
#define ie_laddr ie_dependladdr.ie46_local.ia46_addr4
@@ -124,6 +125,7 @@ struct in_conninfo {
#define inc_laddr inc_ie.ie_laddr
#define inc6_faddr inc_ie.ie6_faddr
#define inc6_laddr inc_ie.ie6_laddr
+#define inc6_zoneid inc_ie.ie6_zoneid
struct icmp6_filter;
@@ -229,6 +231,7 @@ struct inpcb {
#define in6p_faddr inp_inc.inc6_faddr
#define in6p_laddr inp_inc.inc6_laddr
+#define in6p_zoneid inp_inc.inc6_zoneid
#define in6p_hops inp_depend6.inp6_hops /* default hop limit */
#define in6p_flowinfo inp_flow
#define in6p_options inp_depend6.inp6_options
Modified: head/sys/netinet/tcp_hostcache.c
==============================================================================
--- head/sys/netinet/tcp_hostcache.c Wed Sep 10 15:45:18 2014 (r271399)
+++ head/sys/netinet/tcp_hostcache.c Wed Sep 10 16:26:18 2014 (r271400)
@@ -295,6 +295,7 @@ tcp_hc_lookup(struct in_conninfo *inc)
*/
TAILQ_FOREACH(hc_entry, &hc_head->hch_bucket, rmx_q) {
if (inc->inc_flags & INC_ISIPV6) {
+ /* XXX: check ip6_zoneid */
if (memcmp(&inc->inc6_faddr, &hc_entry->ip6,
sizeof(inc->inc6_faddr)) == 0)
return hc_entry;
@@ -386,9 +387,10 @@ tcp_hc_insert(struct in_conninfo *inc)
* Initialize basic information of hostcache entry.
*/
bzero(hc_entry, sizeof(*hc_entry));
- if (inc->inc_flags & INC_ISIPV6)
- bcopy(&inc->inc6_faddr, &hc_entry->ip6, sizeof(hc_entry->ip6));
- else
+ if (inc->inc_flags & INC_ISIPV6) {
+ hc_entry->ip6 = inc->inc6_faddr;
+ hc_entry->ip6_zoneid = inc->inc6_zoneid;
+ } else
hc_entry->ip4 = inc->inc_faddr;
hc_entry->rmx_head = hc_head;
hc_entry->rmx_expire = V_tcp_hostcache.expire;
Modified: head/sys/netinet/tcp_hostcache.h
==============================================================================
--- head/sys/netinet/tcp_hostcache.h Wed Sep 10 15:45:18 2014 (r271399)
+++ head/sys/netinet/tcp_hostcache.h Wed Sep 10 16:26:18 2014 (r271400)
@@ -51,6 +51,7 @@ struct hc_metrics {
struct hc_head *rmx_head; /* head of bucket tail queue */
struct in_addr ip4; /* IP address */
struct in6_addr ip6; /* IP6 address */
+ uint32_t ip6_zoneid; /* IPv6 scope zone id */
/* endpoint specific values for tcp */
u_long rmx_mtu; /* MTU for this path */
u_long rmx_ssthresh; /* outbound gateway buffer limit */
More information about the svn-src-all
mailing list