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);
}