diff options
author | sommerfe <none@none> | 2006-09-29 14:33:05 -0700 |
---|---|---|
committer | sommerfe <none@none> | 2006-09-29 14:33:05 -0700 |
commit | e78eaa4108d07decebe362a2a54acb49c00bd7a1 (patch) | |
tree | b4efd1366685e814823873aa6f34d290004e2210 /usr/src | |
parent | a255420765b0b2d93935f09709ebad35f6aa7ee3 (diff) | |
download | illumos-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.c | 13 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip/ip6.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp.c | 7 |
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); |