diff options
| author | nordmark <none@none> | 2007-11-02 15:16:45 -0700 |
|---|---|---|
| committer | nordmark <none@none> | 2007-11-02 15:16:45 -0700 |
| commit | ae43f94f532f9bb12ac36b64580b6fe707d1129f (patch) | |
| tree | c055ed991f0e09a228341da584631b34b9462de9 /usr/src | |
| parent | 1e995cfce563729fbd612e2ee27dbbab4f50dbaa (diff) | |
| download | illumos-joyent-ae43f94f532f9bb12ac36b64580b6fe707d1129f.tar.gz | |
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
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/inet/ip.h | 105 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/ip/icmp.c | 28 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/ip/ip.c | 7 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/ip/ip6.c | 6 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/udp/udp.c | 31 |
5 files changed, 119 insertions, 58 deletions
diff --git a/usr/src/uts/common/inet/ip.h b/usr/src/uts/common/inet/ip.h index 05e121a37c..5819e24504 100644 --- a/usr/src/uts/common/inet/ip.h +++ b/usr/src/uts/common/inet/ip.h @@ -2824,61 +2824,60 @@ extern vmem_t *ip_minor_arena; #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 8cf74a2366..b6fcfbdfba 100644 --- a/usr/src/uts/common/inet/ip/icmp.c +++ b/usr/src/uts/common/inet/ip/icmp.c @@ -3603,6 +3603,17 @@ icmp_input(void *arg1, mblk_t *mp, void *arg2) 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 @@ icmp_input(void *arg1, mblk_t *mp, void *arg2) 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 bc79a299b5..c1d6f8504f 100644 --- a/usr/src/uts/common/inet/ip/ip.c +++ b/usr/src/uts/common/inet/ip/ip.c @@ -819,7 +819,6 @@ static ipparam_t lcl_param_arr[] = { { 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 @@ static ipndp_t lcl_ndp_arr[] = { #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 @@ ip_input_proc_set(queue_t *q, mblk_t *mp, char *value, 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 89dee0c0a1..ad83bdbe85 100644 --- a/usr/src/uts/common/inet/ip/ip6.c +++ b/usr/src/uts/common/inet/ip/ip6.c @@ -903,8 +903,8 @@ icmp_inbound_error_fanout_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, 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 @@ ip_wput_local_v6(queue_t *q, ill_t *ill, ip6_t *ip6h, mblk_t *first_mp, 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 33f2bc1e8a..d3bd3055b1 100644 --- a/usr/src/uts/common/inet/udp/udp.c +++ b/usr/src/uts/common/inet/udp/udp.c @@ -4386,7 +4386,6 @@ udp_input(void *arg1, mblk_t *mp, void *arg2) 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_input(void *arg1, mblk_t *mp, void *arg2) 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 @@ udp_input(void *arg1, mblk_t *mp, void *arg2) 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); } |
