6621205 SO_TIMESTAMP missing for IPv6
6621662 IPsec + IPv6 + SCTP causes panic/assertion failure
6621665 IP Instances removed console printing when ndd -set /dev/ip ip_debug 1
diff --git a/usr/src/uts/common/inet/ip.h b/usr/src/uts/common/inet/ip.h
index 05e121a..5819e24 100644
--- a/usr/src/uts/common/inet/ip.h
+++ b/usr/src/uts/common/inet/ip.h
@@ -2824,61 +2824,60 @@
 #define	ips_ip_g_resp_to_timestamp_bcast ips_param_arr[4].ip_param_value
 #define	ips_ip_g_send_redirects		ips_param_arr[5].ip_param_value
 #define	ips_ip_g_forward_directed_bcast	ips_param_arr[6].ip_param_value
-#define	ips_ip_debug			ips_param_arr[7].ip_param_value
-#define	ips_ip_mrtdebug			ips_param_arr[8].ip_param_value
-#define	ips_ip_timer_interval		ips_param_arr[9].ip_param_value
-#define	ips_ip_ire_arp_interval		ips_param_arr[10].ip_param_value
-#define	ips_ip_ire_redir_interval	ips_param_arr[11].ip_param_value
-#define	ips_ip_def_ttl			ips_param_arr[12].ip_param_value
-#define	ips_ip_forward_src_routed	ips_param_arr[13].ip_param_value
-#define	ips_ip_wroff_extra		ips_param_arr[14].ip_param_value
-#define	ips_ip_ire_pathmtu_interval	ips_param_arr[15].ip_param_value
-#define	ips_ip_icmp_return		ips_param_arr[16].ip_param_value
-#define	ips_ip_path_mtu_discovery	ips_param_arr[17].ip_param_value
-#define	ips_ip_ignore_delete_time	ips_param_arr[18].ip_param_value
-#define	ips_ip_ignore_redirect		ips_param_arr[19].ip_param_value
-#define	ips_ip_output_queue		ips_param_arr[20].ip_param_value
-#define	ips_ip_broadcast_ttl		ips_param_arr[21].ip_param_value
-#define	ips_ip_icmp_err_interval	ips_param_arr[22].ip_param_value
-#define	ips_ip_icmp_err_burst		ips_param_arr[23].ip_param_value
-#define	ips_ip_reass_queue_bytes	ips_param_arr[24].ip_param_value
-#define	ips_ip_strict_dst_multihoming	ips_param_arr[25].ip_param_value
-#define	ips_ip_addrs_per_if		ips_param_arr[26].ip_param_value
-#define	ips_ipsec_override_persocket_policy ips_param_arr[27].ip_param_value
-#define	ips_icmp_accept_clear_messages	ips_param_arr[28].ip_param_value
-#define	ips_igmp_accept_clear_messages	ips_param_arr[29].ip_param_value
+#define	ips_ip_mrtdebug			ips_param_arr[7].ip_param_value
+#define	ips_ip_timer_interval		ips_param_arr[8].ip_param_value
+#define	ips_ip_ire_arp_interval		ips_param_arr[9].ip_param_value
+#define	ips_ip_ire_redir_interval	ips_param_arr[10].ip_param_value
+#define	ips_ip_def_ttl			ips_param_arr[11].ip_param_value
+#define	ips_ip_forward_src_routed	ips_param_arr[12].ip_param_value
+#define	ips_ip_wroff_extra		ips_param_arr[13].ip_param_value
+#define	ips_ip_ire_pathmtu_interval	ips_param_arr[14].ip_param_value
+#define	ips_ip_icmp_return		ips_param_arr[15].ip_param_value
+#define	ips_ip_path_mtu_discovery	ips_param_arr[16].ip_param_value
+#define	ips_ip_ignore_delete_time	ips_param_arr[17].ip_param_value
+#define	ips_ip_ignore_redirect		ips_param_arr[18].ip_param_value
+#define	ips_ip_output_queue		ips_param_arr[19].ip_param_value
+#define	ips_ip_broadcast_ttl		ips_param_arr[20].ip_param_value
+#define	ips_ip_icmp_err_interval	ips_param_arr[21].ip_param_value
+#define	ips_ip_icmp_err_burst		ips_param_arr[22].ip_param_value
+#define	ips_ip_reass_queue_bytes	ips_param_arr[23].ip_param_value
+#define	ips_ip_strict_dst_multihoming	ips_param_arr[24].ip_param_value
+#define	ips_ip_addrs_per_if		ips_param_arr[25].ip_param_value
+#define	ips_ipsec_override_persocket_policy ips_param_arr[26].ip_param_value
+#define	ips_icmp_accept_clear_messages	ips_param_arr[27].ip_param_value
+#define	ips_igmp_accept_clear_messages	ips_param_arr[28].ip_param_value
 
 /* IPv6 configuration knobs */
-#define	ips_delay_first_probe_time	ips_param_arr[30].ip_param_value
-#define	ips_max_unicast_solicit		ips_param_arr[31].ip_param_value
-#define	ips_ipv6_def_hops		ips_param_arr[32].ip_param_value
-#define	ips_ipv6_icmp_return		ips_param_arr[33].ip_param_value
-#define	ips_ipv6_forward_src_routed	ips_param_arr[34].ip_param_value
-#define	ips_ipv6_resp_echo_mcast	ips_param_arr[35].ip_param_value
-#define	ips_ipv6_send_redirects		ips_param_arr[36].ip_param_value
-#define	ips_ipv6_ignore_redirect	ips_param_arr[37].ip_param_value
-#define	ips_ipv6_strict_dst_multihoming	ips_param_arr[38].ip_param_value
-#define	ips_ip_ire_reclaim_fraction	ips_param_arr[39].ip_param_value
-#define	ips_ipsec_policy_log_interval	ips_param_arr[40].ip_param_value
-#define	ips_pim_accept_clear_messages	ips_param_arr[41].ip_param_value
-#define	ips_ip_ndp_unsolicit_interval	ips_param_arr[42].ip_param_value
-#define	ips_ip_ndp_unsolicit_count	ips_param_arr[43].ip_param_value
-#define	ips_ipv6_ignore_home_address_opt ips_param_arr[44].ip_param_value
-#define	ips_ip_policy_mask		ips_param_arr[45].ip_param_value
-#define	ips_ip_multirt_resolution_interval ips_param_arr[46].ip_param_value
-#define	ips_ip_multirt_ttl  		ips_param_arr[47].ip_param_value
-#define	ips_ip_multidata_outbound	ips_param_arr[48].ip_param_value
-#define	ips_ip_ndp_defense_interval	ips_param_arr[49].ip_param_value
-#define	ips_ip_max_temp_idle		ips_param_arr[50].ip_param_value
-#define	ips_ip_max_temp_defend		ips_param_arr[51].ip_param_value
-#define	ips_ip_max_defend		ips_param_arr[52].ip_param_value
-#define	ips_ip_defend_interval		ips_param_arr[53].ip_param_value
-#define	ips_ip_dup_recovery		ips_param_arr[54].ip_param_value
-#define	ips_ip_restrict_interzone_loopback ips_param_arr[55].ip_param_value
-#define	ips_ip_lso_outbound		ips_param_arr[56].ip_param_value
-#define	ips_igmp_max_version		ips_param_arr[57].ip_param_value
-#define	ips_mld_max_version		ips_param_arr[58].ip_param_value
-#define	ips_ipv6_drop_inbound_icmpv6	ips_param_arr[59].ip_param_value
+#define	ips_delay_first_probe_time	ips_param_arr[29].ip_param_value
+#define	ips_max_unicast_solicit		ips_param_arr[30].ip_param_value
+#define	ips_ipv6_def_hops		ips_param_arr[31].ip_param_value
+#define	ips_ipv6_icmp_return		ips_param_arr[32].ip_param_value
+#define	ips_ipv6_forward_src_routed	ips_param_arr[33].ip_param_value
+#define	ips_ipv6_resp_echo_mcast	ips_param_arr[34].ip_param_value
+#define	ips_ipv6_send_redirects		ips_param_arr[35].ip_param_value
+#define	ips_ipv6_ignore_redirect	ips_param_arr[36].ip_param_value
+#define	ips_ipv6_strict_dst_multihoming	ips_param_arr[37].ip_param_value
+#define	ips_ip_ire_reclaim_fraction	ips_param_arr[38].ip_param_value
+#define	ips_ipsec_policy_log_interval	ips_param_arr[39].ip_param_value
+#define	ips_pim_accept_clear_messages	ips_param_arr[40].ip_param_value
+#define	ips_ip_ndp_unsolicit_interval	ips_param_arr[41].ip_param_value
+#define	ips_ip_ndp_unsolicit_count	ips_param_arr[42].ip_param_value
+#define	ips_ipv6_ignore_home_address_opt ips_param_arr[43].ip_param_value
+#define	ips_ip_policy_mask		ips_param_arr[44].ip_param_value
+#define	ips_ip_multirt_resolution_interval ips_param_arr[45].ip_param_value
+#define	ips_ip_multirt_ttl  		ips_param_arr[46].ip_param_value
+#define	ips_ip_multidata_outbound	ips_param_arr[47].ip_param_value
+#define	ips_ip_ndp_defense_interval	ips_param_arr[48].ip_param_value
+#define	ips_ip_max_temp_idle		ips_param_arr[49].ip_param_value
+#define	ips_ip_max_temp_defend		ips_param_arr[50].ip_param_value
+#define	ips_ip_max_defend		ips_param_arr[51].ip_param_value
+#define	ips_ip_defend_interval		ips_param_arr[52].ip_param_value
+#define	ips_ip_dup_recovery		ips_param_arr[53].ip_param_value
+#define	ips_ip_restrict_interzone_loopback ips_param_arr[54].ip_param_value
+#define	ips_ip_lso_outbound		ips_param_arr[55].ip_param_value
+#define	ips_igmp_max_version		ips_param_arr[56].ip_param_value
+#define	ips_mld_max_version		ips_param_arr[57].ip_param_value
+#define	ips_ipv6_drop_inbound_icmpv6	ips_param_arr[58].ip_param_value
 
 extern int	dohwcksum;	/* use h/w cksum if supported by the h/w */
 #ifdef ZC_TEST
diff --git a/usr/src/uts/common/inet/ip/icmp.c b/usr/src/uts/common/inet/ip/icmp.c
index 8cf74a2..b6fcfbd 100644
--- a/usr/src/uts/common/inet/ip/icmp.c
+++ b/usr/src/uts/common/inet/ip/icmp.c
@@ -3603,6 +3603,17 @@
 	if (icmp->icmp_ipv6_recvtclass)
 		udi_size += sizeof (struct T_opthdr) + sizeof (int);
 
+	/*
+	 * If SO_TIMESTAMP is set allocate the appropriate sized
+	 * buffer. Since gethrestime() expects a pointer aligned
+	 * argument, we allocate space necessary for extra
+	 * alignment (even though it might not be used).
+	 */
+	if (icmp->icmp_timestamp) {
+		udi_size += sizeof (struct T_opthdr) +
+		    sizeof (timestruc_t) + _POINTER_ALIGNMENT;
+	}
+
 	mp1 = allocb(udi_size, BPRI_MED);
 	if (mp1 == NULL) {
 		freemsg(mp);
@@ -3686,6 +3697,23 @@
 			dstopt += sizeof (uint_t);
 			udi_size -= toh->len;
 		}
+		if (icmp->icmp_timestamp) {
+			struct	T_opthdr *toh;
+
+			toh = (struct T_opthdr *)dstopt;
+			toh->level = SOL_SOCKET;
+			toh->name = SCM_TIMESTAMP;
+			toh->len = sizeof (struct T_opthdr) +
+			    sizeof (timestruc_t) + _POINTER_ALIGNMENT;
+			toh->status = 0;
+			dstopt += sizeof (struct T_opthdr);
+			/* Align for gethrestime() */
+			dstopt = (uchar_t *)P2ROUNDUP((intptr_t)dstopt,
+			    sizeof (intptr_t));
+			gethrestime((timestruc_t *)dstopt);
+			dstopt = (uchar_t *)toh + toh->len;
+			udi_size -= toh->len;
+		}
 		if (icmp_opt & IPPF_HOPOPTS) {
 			struct T_opthdr *toh;
 
diff --git a/usr/src/uts/common/inet/ip/ip.c b/usr/src/uts/common/inet/ip/ip.c
index bc79a29..c1d6f85 100644
--- a/usr/src/uts/common/inet/ip/ip.c
+++ b/usr/src/uts/common/inet/ip/ip.c
@@ -819,7 +819,6 @@
 	{  0,	1,	0,	"ip_respond_to_timestamp_broadcast"},
 	{  0,	1,	1,	"ip_send_redirects"},
 	{  0,	1,	0,	"ip_forward_directed_broadcasts"},
-	{  0,	10,	0,	"ip_debug"},
 	{  0,	10,	0,	"ip_mrtdebug"},
 	{  5000, 999999999,	60000, "ip_ire_timer_interval" },
 	{  60000, 999999999,	1200000, "ip_ire_arp_interval" },
@@ -928,6 +927,8 @@
 #define	IPNDP_IPMP_HOOK_OFFSET	16
 	{  ip_param_generic_get, ipmp_hook_emulation_set, NULL,
 	    "ipmp_hook_emulation" },
+	{  ip_param_generic_get, ip_int_set, (caddr_t)&ip_debug,
+	    "ip_debug" },
 };
 
 /*
@@ -29036,6 +29037,10 @@
 	return (0);
 }
 
+/*
+ * Handle ndd set of variables which require PRIV_SYS_NET_CONFIG such as
+ * ip_debug.
+ */
 /* ARGSUSED */
 static int
 ip_int_set(queue_t *q, mblk_t *mp, char *value,
diff --git a/usr/src/uts/common/inet/ip/ip6.c b/usr/src/uts/common/inet/ip/ip6.c
index 89dee0c..ad83bdb 100644
--- a/usr/src/uts/common/inet/ip/ip6.c
+++ b/usr/src/uts/common/inet/ip/ip6.c
@@ -903,8 +903,8 @@
 		up = (uint16_t *)((uchar_t *)ip6h + hdr_length);
 		((uint16_t *)&ports)[0] = up[1];
 		((uint16_t *)&ports)[1] = up[0];
-		ip_fanout_sctp(mp, ill, (ipha_t *)ip6h, ports, 0, mctl_present,
-		    IP6_NO_IPPOLICY, zoneid);
+		ip_fanout_sctp(first_mp, ill, (ipha_t *)ip6h, ports, 0,
+		    mctl_present, IP6_NO_IPPOLICY, zoneid);
 		return;
 	case IPPROTO_ESP:
 	case IPPROTO_AH: {
@@ -10567,7 +10567,7 @@
 		case IPPROTO_SCTP:
 		{
 			ports = *(uint32_t *)(mp->b_rptr + hdr_length);
-			ip_fanout_sctp(mp, ill, (ipha_t *)ip6h, ports,
+			ip_fanout_sctp(first_mp, ill, (ipha_t *)ip6h, ports,
 			    fanout_flags|IP_FF_SEND_ICMP|IP_FF_IPINFO,
 			    mctl_present, IP6_NO_IPPOLICY, ire->ire_zoneid);
 			return;
diff --git a/usr/src/uts/common/inet/udp/udp.c b/usr/src/uts/common/inet/udp/udp.c
index 33f2bc1..d3bd305 100644
--- a/usr/src/uts/common/inet/udp/udp.c
+++ b/usr/src/uts/common/inet/udp/udp.c
@@ -4386,7 +4386,6 @@
 			UDP_STAT(us, udp_in_recvucred);
 		}
 
-		/* XXX FIXME: apply to AF_INET6 as well */
 		/*
 		 * If SO_TIMESTAMP is set allocate the appropriate sized
 		 * buffer. Since gethrestime() expects a pointer aligned
@@ -4662,6 +4661,18 @@
 			UDP_STAT(us, udp_in_recvucred);
 		}
 
+		/*
+		 * If SO_TIMESTAMP is set allocate the appropriate sized
+		 * buffer. Since gethrestime() expects a pointer aligned
+		 * argument, we allocate space necessary for extra
+		 * alignment (even though it might not be used).
+		 */
+		if (udp_bits.udpb_timestamp) {
+			udi_size += sizeof (struct T_opthdr) +
+			    sizeof (timestruc_t) + _POINTER_ALIGNMENT;
+			UDP_STAT(us, udp_in_timestamp);
+		}
+
 		if (udp_bits.udpb_ipv6_recvhoplimit) {
 			udi_size += sizeof (struct T_opthdr) + sizeof (int);
 			UDP_STAT(us, udp_in_recvhoplimit);
@@ -4857,6 +4868,24 @@
 				dstopt += toh->len;
 				udi_size -= toh->len;
 			}
+			if (udp_bits.udpb_timestamp) {
+				struct	T_opthdr *toh;
+
+				toh = (struct T_opthdr *)dstopt;
+				toh->level = SOL_SOCKET;
+				toh->name = SCM_TIMESTAMP;
+				toh->len = sizeof (struct T_opthdr) +
+				    sizeof (timestruc_t) + _POINTER_ALIGNMENT;
+				toh->status = 0;
+				dstopt += sizeof (struct T_opthdr);
+				/* Align for gethrestime() */
+				dstopt = (uchar_t *)P2ROUNDUP((intptr_t)dstopt,
+				    sizeof (intptr_t));
+				gethrestime((timestruc_t *)dstopt);
+				dstopt = (uchar_t *)toh + toh->len;
+				udi_size -= toh->len;
+			}
+
 			/* Consumed all of allocated space */
 			ASSERT(udi_size == 0);
 		}