6935171 in.ndpd/in.mpathd stuck unkillably in close() due to conn_ref leak
authorSowmini Varadhan <Sowmini.Varadhan@Sun.COM>
Tue, 23 Mar 2010 16:21:48 -0400
changeset 11983 15804d064f0c
parent 11982 16e28ad89250
child 11984 632ef778c980
6935171 in.ndpd/in.mpathd stuck unkillably in close() due to conn_ref leak 6935243 IPv6 ND probes are not sent out due to IXAF_VERIFY_SOURCE setting.
usr/src/uts/common/inet/ip/ip_if.c
usr/src/uts/common/inet/ip/ip_ndp.c
usr/src/uts/common/inet/ip/ip_netinfo.c
usr/src/uts/common/inet/iptun/iptun.c
--- a/usr/src/uts/common/inet/ip/ip_if.c	Tue Mar 23 12:32:20 2010 -0700
+++ b/usr/src/uts/common/inet/ip/ip_if.c	Tue Mar 23 16:21:48 2010 -0400
@@ -971,6 +971,7 @@
 		tmp_list = curr->b_next;
 		curr->b_next = NULL;
 		curr->b_prev = NULL;
+		wq = curr->b_queue;
 		curr->b_queue = NULL;
 		if (DB_TYPE(curr) == M_IOCTL || DB_TYPE(curr) == M_IOCDATA) {
 			DTRACE_PROBE4(ipif__ioctl,
@@ -12951,7 +12952,7 @@
 			ixas.ixa_flags = IXAF_BASIC_SIMPLE_V4;
 			ixas.ixa_flags &= ~IXAF_SET_ULP_CKSUM;
 		}
-
+		ixas.ixa_flags &= ~IXAF_VERIFY_SOURCE;
 		ixas.ixa_flags |= IXAF_MULTICAST_LOOP | IXAF_SET_SOURCE;
 		(void) ip_output_simple(mp, &ixas);
 		ixa_cleanup(&ixas);
@@ -13566,7 +13567,6 @@
 
 	bzero(&ixas, sizeof (ixas));
 	ixas.ixa_flags = IXAF_BASIC_SIMPLE_V4;
-	ixas.ixa_flags |= IXAF_SET_SOURCE;
 	ixas.ixa_zoneid = ALL_ZONES;
 	ixas.ixa_ifindex = 0;
 	ixas.ixa_ipst = ipst;
--- a/usr/src/uts/common/inet/ip/ip_ndp.c	Tue Mar 23 12:32:20 2010 -0700
+++ b/usr/src/uts/common/inet/ip/ip_ndp.c	Tue Mar 23 16:21:48 2010 -0400
@@ -2192,7 +2192,7 @@
 	mp->b_wptr = mp->b_rptr + len;
 
 	bzero(&ixas, sizeof (ixas));
-	ixas.ixa_flags = IXAF_BASIC_SIMPLE_V6 | IXAF_NO_HW_CKSUM;
+	ixas.ixa_flags = IXAF_SET_ULP_CKSUM | IXAF_NO_HW_CKSUM;
 
 	ixas.ixa_ifindex = ill->ill_phyint->phyint_ifindex;
 	ixas.ixa_ipst = ipst;
--- a/usr/src/uts/common/inet/ip/ip_netinfo.c	Tue Mar 23 12:32:20 2010 -0700
+++ b/usr/src/uts/common/inet/ip/ip_netinfo.c	Tue Mar 23 16:21:48 2010 -0400
@@ -1509,6 +1509,7 @@
 		} else {
 			ixas.ixa_flags = IXAF_BASIC_SIMPLE_V4;
 		}
+		ixas.ixa_flags &= ~IXAF_VERIFY_SOURCE;
 		(void) ip_output_simple(packet->ni_packet, &ixas);
 		ixa_cleanup(&ixas);
 	}
--- a/usr/src/uts/common/inet/iptun/iptun.c	Tue Mar 23 12:32:20 2010 -0700
+++ b/usr/src/uts/common/inet/iptun/iptun.c	Tue Mar 23 16:21:48 2010 -0400
@@ -2115,8 +2115,10 @@
 
 	bzero(&ixas, sizeof (ixas));
 	ixas.ixa_flags = IXAF_BASIC_SIMPLE_V4;
-	if (new_ipha->ipha_src == INADDR_ANY)
+	if (new_ipha->ipha_src == INADDR_ANY) {
+		ixas.ixa_flags &= ~IXAF_VERIFY_SOURCE;
 		ixas.ixa_flags |= IXAF_SET_SOURCE;
+	}
 
 	ixas.ixa_zoneid = IPCL_ZONEID(connp);
 	ixas.ixa_ipst = connp->conn_netstack->netstack_ip;
@@ -2166,8 +2168,10 @@
 
 	bzero(&ixas, sizeof (ixas));
 	ixas.ixa_flags = IXAF_BASIC_SIMPLE_V6;
-	if (IN6_IS_ADDR_UNSPECIFIED(&new_ip6h->ip6_src))
+	if (IN6_IS_ADDR_UNSPECIFIED(&new_ip6h->ip6_src)) {
+		ixas.ixa_flags &= ~IXAF_VERIFY_SOURCE;
 		ixas.ixa_flags |= IXAF_SET_SOURCE;
+	}
 
 	ixas.ixa_zoneid = IPCL_ZONEID(connp);
 	ixas.ixa_ipst = connp->conn_netstack->netstack_ip;