summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorsommerfe <none@none>2006-09-29 14:33:05 -0700
committersommerfe <none@none>2006-09-29 14:33:05 -0700
commite78eaa4108d07decebe362a2a54acb49c00bd7a1 (patch)
treeb4efd1366685e814823873aa6f34d290004e2210 /usr/src
parenta255420765b0b2d93935f09709ebad35f6aa7ee3 (diff)
downloadillumos-joyent-e78eaa4108d07decebe362a2a54acb49c00bd7a1.tar.gz
6446620 SO_ALLZONES doesn't seem to work for IPv6
6461365 SO_ALLZONES doesn't get along with SO_DONTROUTE and IP_NEXTHOP
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/inet/ip/ip.c13
-rw-r--r--usr/src/uts/common/inet/ip/ip6.c4
-rw-r--r--usr/src/uts/common/inet/tcp/tcp.c7
3 files changed, 15 insertions, 9 deletions
diff --git a/usr/src/uts/common/inet/ip/ip.c b/usr/src/uts/common/inet/ip/ip.c
index a1aa5c19ef..82e965af29 100644
--- a/usr/src/uts/common/inet/ip/ip.c
+++ b/usr/src/uts/common/inet/ip/ip.c
@@ -2224,7 +2224,7 @@ icmp_get_nexthop_addr(ipha_t *ipha, ill_t *ill, zoneid_t zoneid, mblk_t *mp)
while ((connp != NULL) &&
(!IPCL_UDP_MATCH(connp, dstport,
ipha->ipha_src, srcport, ipha->ipha_dst) ||
- connp->conn_zoneid != zoneid)) {
+ !IPCL_ZONE_MATCH(connp, zoneid))) {
connp = connp->conn_next;
}
if (connp != NULL)
@@ -4788,7 +4788,8 @@ ip_bind_connected(conn_t *connp, mblk_t *mp, ipaddr_t *src_addrp,
ipif_t *ipif;
ipif = ipif_lookup_onlink_addr(connp->conn_dontroute ?
- dst_addr : connp->conn_nexthop_v4, zoneid);
+ dst_addr : connp->conn_nexthop_v4,
+ connp->conn_zoneid);
if (ipif == NULL) {
error = ENETUNREACH;
goto bad_addr;
@@ -6723,9 +6724,8 @@ ip_fanout_udp(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha,
* IPv4 unicast packets.
*/
while ((connp != NULL) &&
- (!IPCL_UDP_MATCH(connp, dstport, dst,
- srcport, src) ||
- (connp->conn_zoneid != zoneid && !connp->conn_allzones))) {
+ (!IPCL_UDP_MATCH(connp, dstport, dst, srcport, src) ||
+ !IPCL_ZONE_MATCH(connp, zoneid))) {
connp = connp->conn_next;
}
@@ -10078,7 +10078,8 @@ ip_opt_set_ipif(conn_t *connp, ipaddr_t addr, boolean_t checkonly, int option,
ASSERT(connp != NULL);
zoneid = IPCL_ZONEID(connp);
if (option == IP_NEXTHOP) {
- ipif = ipif_lookup_onlink_addr(addr, zoneid);
+ ipif = ipif_lookup_onlink_addr(addr,
+ connp->conn_zoneid);
} else {
ipif = ipif_lookup_addr(addr, NULL, zoneid,
CONNP_TO_WQ(connp), first_mp, ip_restart_optmgmt,
diff --git a/usr/src/uts/common/inet/ip/ip6.c b/usr/src/uts/common/inet/ip/ip6.c
index 41c3f62846..2e9cc4afc6 100644
--- a/usr/src/uts/common/inet/ip/ip6.c
+++ b/usr/src/uts/common/inet/ip/ip6.c
@@ -3783,7 +3783,7 @@ ip_fanout_udp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, uint32_t ports,
*/
while (connp != NULL) {
if (IPCL_UDP_MATCH_V6(connp, dstport, dst, srcport,
- src) && connp->conn_zoneid == zoneid &&
+ src) && IPCL_ZONE_MATCH(connp, zoneid) &&
conn_wantpacket_v6(connp, ill, ip6h,
flags, zoneid)) {
break;
@@ -11826,7 +11826,7 @@ conn_wantpacket_v6(conn_t *connp, ill_t *ill, ip6_t *ip6h, int fanout_flags,
* Unicast case: we match the conn only if it's in the specified
* zone.
*/
- return (connp->conn_zoneid == zoneid || zoneid == ALL_ZONES);
+ return (IPCL_ZONE_MATCH(connp, zoneid));
}
if ((fanout_flags & IP_FF_NO_MCAST_LOOP) &&
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c
index e382675cf9..533f69b5d7 100644
--- a/usr/src/uts/common/inet/tcp/tcp.c
+++ b/usr/src/uts/common/inet/tcp/tcp.c
@@ -2426,9 +2426,11 @@ tcp_accept_swap(tcp_t *listener, tcp_t *acceptor, tcp_t *eager)
if (eager->tcp_cred != NULL)
crfree(eager->tcp_cred);
eager->tcp_cred = econnp->conn_cred = aconnp->conn_cred;
- econnp->conn_zoneid = aconnp->conn_zoneid;
aconnp->conn_cred = NULL;
+ econnp->conn_zoneid = aconnp->conn_zoneid;
+ econnp->conn_allzones = aconnp->conn_allzones;
+
econnp->conn_mac_exempt = aconnp->conn_mac_exempt;
aconnp->conn_mac_exempt = B_FALSE;
@@ -5574,6 +5576,7 @@ tcp_conn_request(void *arg, mblk_t *mp, void *arg2)
* zone id before the accept is completed in tcp_wput_accept().
*/
econnp->conn_zoneid = connp->conn_zoneid;
+ econnp->conn_allzones = connp->conn_allzones;
/* Copy nexthop information from listener to eager */
if (connp->conn_nexthop_set) {
@@ -17726,7 +17729,9 @@ tcp_wput_accept(queue_t *q, mblk_t *mp)
q->q_qinfo = &tcp_winit;
listener = eager->tcp_listener;
eager->tcp_issocket = B_TRUE;
+
econnp->conn_zoneid = listener->tcp_connp->conn_zoneid;
+ econnp->conn_allzones = listener->tcp_connp->conn_allzones;
/* Put the ref for IP */
CONN_INC_REF(econnp);