17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 58810c16bSdanmcd * Common Development and Distribution License (the "License"). 68810c16bSdanmcd * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22628b0c67SMark Fenwick * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #include <sys/types.h> 277c478bd9Sstevel@tonic-gate #include <sys/stream.h> 287c478bd9Sstevel@tonic-gate #include <sys/strsun.h> 297c478bd9Sstevel@tonic-gate #include <sys/sunddi.h> 307c478bd9Sstevel@tonic-gate #include <sys/kstat.h> 317c478bd9Sstevel@tonic-gate #include <sys/kmem.h> 32bd670b35SErik Nordmark #include <sys/sdt.h> 337c478bd9Sstevel@tonic-gate #include <net/pfkeyv2.h> 347c478bd9Sstevel@tonic-gate #include <inet/common.h> 357c478bd9Sstevel@tonic-gate #include <inet/ip.h> 367c478bd9Sstevel@tonic-gate #include <inet/ip6.h> 37f4b3ec61Sdh155122 #include <inet/ipsec_impl.h> 387c478bd9Sstevel@tonic-gate #include <inet/ipdrop.h> 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate /* 417c478bd9Sstevel@tonic-gate * Packet drop facility. 427c478bd9Sstevel@tonic-gate */ 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate /* 457c478bd9Sstevel@tonic-gate * Initialize drop facility kstats. 467c478bd9Sstevel@tonic-gate */ 477c478bd9Sstevel@tonic-gate void 48f4b3ec61Sdh155122 ip_drop_init(ipsec_stack_t *ipss) 497c478bd9Sstevel@tonic-gate { 50f4b3ec61Sdh155122 ipss->ipsec_ip_drop_kstat = kstat_create_netstack("ip", 0, "ipdrop", 51f4b3ec61Sdh155122 "net", KSTAT_TYPE_NAMED, 52f4b3ec61Sdh155122 sizeof (struct ip_dropstats) / sizeof (kstat_named_t), 53f4b3ec61Sdh155122 KSTAT_FLAG_PERSISTENT, ipss->ipsec_netstack->netstack_stackid); 547c478bd9Sstevel@tonic-gate 55f4b3ec61Sdh155122 if (ipss->ipsec_ip_drop_kstat == NULL || 56f4b3ec61Sdh155122 ipss->ipsec_ip_drop_kstat->ks_data == NULL) 577c478bd9Sstevel@tonic-gate return; 587c478bd9Sstevel@tonic-gate 59f4b3ec61Sdh155122 /* 60f4b3ec61Sdh155122 * Note: here ipss->ipsec_ip_drop_types is initialized, however, 61f4b3ec61Sdh155122 * if the previous kstat_create_netstack failed, it will remain 62f4b3ec61Sdh155122 * NULL. Note this is done for all stack instances, so it *could* 63f4b3ec61Sdh155122 * be NULL. Hence a non-NULL checking is added where 64f4b3ec61Sdh155122 * ipss->ipsec_ip_drop_types is used. This checking is hidden in 65f4b3ec61Sdh155122 * the DROPPER macro. 66f4b3ec61Sdh155122 */ 67f4b3ec61Sdh155122 ipss->ipsec_ip_drop_types = ipss->ipsec_ip_drop_kstat->ks_data; 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate /* TCP IPsec drop statistics. */ 70f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_tcp_clear, 71f4b3ec61Sdh155122 "tcp_clear", KSTAT_DATA_UINT64); 72f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_tcp_secure, 73f4b3ec61Sdh155122 "tcp_secure", KSTAT_DATA_UINT64); 74f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_tcp_mismatch, 75f4b3ec61Sdh155122 "tcp_mismatch", KSTAT_DATA_UINT64); 76f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_tcp_ipsec_alloc, 77f4b3ec61Sdh155122 "tcp_ipsec_alloc", KSTAT_DATA_UINT64); 787c478bd9Sstevel@tonic-gate 797c478bd9Sstevel@tonic-gate /* SADB-specific drop statistics. */ 80f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_inlarval_timeout, 817c478bd9Sstevel@tonic-gate "sadb_inlarval_timeout", KSTAT_DATA_UINT64); 82f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_inlarval_replace, 837c478bd9Sstevel@tonic-gate "sadb_inlarval_replace", KSTAT_DATA_UINT64); 849c2c14abSThejaswini Singarajipura kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_inidle_overflow, 859c2c14abSThejaswini Singarajipura "sadb_inidle_overflow", KSTAT_DATA_UINT64); 869c2c14abSThejaswini Singarajipura kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_inidle_timeout, 879c2c14abSThejaswini Singarajipura "sadb_inidle_timeout", KSTAT_DATA_UINT64); 88f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_acquire_nomem, 897c478bd9Sstevel@tonic-gate "sadb_acquire_nomem", KSTAT_DATA_UINT64); 90f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_acquire_toofull, 917c478bd9Sstevel@tonic-gate "sadb_acquire_toofull", KSTAT_DATA_UINT64); 92f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_sadb_acquire_timeout, 937c478bd9Sstevel@tonic-gate "sadb_acquire_timeout", KSTAT_DATA_UINT64); 947c478bd9Sstevel@tonic-gate 957c478bd9Sstevel@tonic-gate /* SPD drop statistics. */ 96f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_ahesp_diffid, 97f4b3ec61Sdh155122 "spd_ahesp_diffid", KSTAT_DATA_UINT64); 98f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_loopback_mismatch, 997c478bd9Sstevel@tonic-gate "spd_loopback_mismatch", KSTAT_DATA_UINT64); 100f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_explicit, 101f4b3ec61Sdh155122 "spd_explicit", KSTAT_DATA_UINT64); 102f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_got_secure, 103f4b3ec61Sdh155122 "spd_got_secure", KSTAT_DATA_UINT64); 104f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_got_clear, 105f4b3ec61Sdh155122 "spd_got_clear", KSTAT_DATA_UINT64); 106f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_bad_ahalg, 107f4b3ec61Sdh155122 "spd_bad_ahalg", KSTAT_DATA_UINT64); 108f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_got_ah, 109f4b3ec61Sdh155122 "spd_got_ah", KSTAT_DATA_UINT64); 110f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_bad_espealg, 111f4b3ec61Sdh155122 "spd_bad_espealg", KSTAT_DATA_UINT64); 112f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_bad_espaalg, 113f4b3ec61Sdh155122 "spd_bad_espaalg", KSTAT_DATA_UINT64); 114f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_got_esp, 115f4b3ec61Sdh155122 "spd_got_esp", KSTAT_DATA_UINT64); 116f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_got_selfencap, 117f4b3ec61Sdh155122 "spd_got_selfencap", KSTAT_DATA_UINT64); 118f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_bad_selfencap, 119f4b3ec61Sdh155122 "spd_bad_selfencap", KSTAT_DATA_UINT64); 120f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_nomem, 121f4b3ec61Sdh155122 "spd_nomem", KSTAT_DATA_UINT64); 122f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_ah_badid, 123f4b3ec61Sdh155122 "spd_ah_badid", KSTAT_DATA_UINT64); 124f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_ah_innermismatch, 12507b56925Ssommerfe "spd_ah_innermismatch", KSTAT_DATA_UINT64); 126f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_esp_innermismatch, 12707b56925Ssommerfe "spd_esp_innermismatch", KSTAT_DATA_UINT64); 128f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_esp_badid, 129f4b3ec61Sdh155122 "spd_esp_badid", KSTAT_DATA_UINT64); 130f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_no_policy, 131f4b3ec61Sdh155122 "spd_no_policy", KSTAT_DATA_UINT64); 132f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_malformed_packet, 133f4b3ec61Sdh155122 "spd_malformed_packet", KSTAT_DATA_UINT64); 134f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_malformed_frag, 135f4b3ec61Sdh155122 "spd_malformed_frag", KSTAT_DATA_UINT64); 136f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_overlap_frag, 137f4b3ec61Sdh155122 "spd_overlap_frag", KSTAT_DATA_UINT64); 138f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_evil_frag, 139f4b3ec61Sdh155122 "spd_evil_frag", KSTAT_DATA_UINT64); 140f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_max_frags, 141f4b3ec61Sdh155122 "spd_max_frags", KSTAT_DATA_UINT64); 142*d1a98e54SPaul Wernau kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_spd_expired_frags, 143*d1a98e54SPaul Wernau "spd_expired_frags", KSTAT_DATA_UINT64); 1447c478bd9Sstevel@tonic-gate 1457c478bd9Sstevel@tonic-gate /* ESP-specific drop statistics. */ 1467c478bd9Sstevel@tonic-gate 147f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_nomem, 148f4b3ec61Sdh155122 "esp_nomem", KSTAT_DATA_UINT64); 149f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_no_sa, 150f4b3ec61Sdh155122 "esp_no_sa", KSTAT_DATA_UINT64); 151f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_early_replay, 152f4b3ec61Sdh155122 "esp_early_replay", KSTAT_DATA_UINT64); 153f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_replay, 154f4b3ec61Sdh155122 "esp_replay", KSTAT_DATA_UINT64); 155f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_bytes_expire, 156f4b3ec61Sdh155122 "esp_bytes_expire", KSTAT_DATA_UINT64); 157f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_bad_padlen, 158f4b3ec61Sdh155122 "esp_bad_padlen", KSTAT_DATA_UINT64); 159f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_bad_padding, 160f4b3ec61Sdh155122 "esp_bad_padding", KSTAT_DATA_UINT64); 161f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_bad_auth, 162f4b3ec61Sdh155122 "esp_bad_auth", KSTAT_DATA_UINT64); 163f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_crypto_failed, 164f4b3ec61Sdh155122 "esp_crypto_failed", KSTAT_DATA_UINT64); 165f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_icmp, 166f4b3ec61Sdh155122 "esp_icmp", KSTAT_DATA_UINT64); 167437220cdSdanmcd kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_nat_t_ipsec, 168437220cdSdanmcd "esp_nat_t_ipsec", KSTAT_DATA_UINT64); 169437220cdSdanmcd kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_nat_t_ka, 170437220cdSdanmcd "esp_nat_t_ka", KSTAT_DATA_UINT64); 171628b0c67SMark Fenwick kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_esp_iv_wrap, 172628b0c67SMark Fenwick "esp_iv_wrap", KSTAT_DATA_UINT64); 1737c478bd9Sstevel@tonic-gate 1747c478bd9Sstevel@tonic-gate /* AH-specific drop statistics. */ 175f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_nomem, 176f4b3ec61Sdh155122 "ah_nomem", KSTAT_DATA_UINT64); 177f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_bad_v6_hdrs, 178f4b3ec61Sdh155122 "ah_bad_v6_hdrs", KSTAT_DATA_UINT64); 179f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_bad_v4_opts, 180f4b3ec61Sdh155122 "ah_bad_v4_opts", KSTAT_DATA_UINT64); 181f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_no_sa, 182f4b3ec61Sdh155122 "ah_no_sa", KSTAT_DATA_UINT64); 183f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_bad_length, 184f4b3ec61Sdh155122 "ah_bad_length", KSTAT_DATA_UINT64); 185f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_bad_auth, 186f4b3ec61Sdh155122 "ah_bad_auth", KSTAT_DATA_UINT64); 187f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_crypto_failed, 188f4b3ec61Sdh155122 "ah_crypto_failed", KSTAT_DATA_UINT64); 189f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_early_replay, 190f4b3ec61Sdh155122 "ah_early_replay", KSTAT_DATA_UINT64); 191f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_replay, 192f4b3ec61Sdh155122 "ah_replay", KSTAT_DATA_UINT64); 193f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ah_bytes_expire, 194f4b3ec61Sdh155122 "ah_bytes_expire", KSTAT_DATA_UINT64); 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate /* IP-specific drop statistics. */ 197f4b3ec61Sdh155122 kstat_named_init(&ipss->ipsec_ip_drop_types->ipds_ip_ipsec_not_loaded, 198f4b3ec61Sdh155122 "ip_ipsec_not_loaded", KSTAT_DATA_UINT64); 1997c478bd9Sstevel@tonic-gate 200f4b3ec61Sdh155122 kstat_install(ipss->ipsec_ip_drop_kstat); 2017c478bd9Sstevel@tonic-gate } 2027c478bd9Sstevel@tonic-gate 2037c478bd9Sstevel@tonic-gate void 204f4b3ec61Sdh155122 ip_drop_destroy(ipsec_stack_t *ipss) 2057c478bd9Sstevel@tonic-gate { 206f4b3ec61Sdh155122 kstat_delete_netstack(ipss->ipsec_ip_drop_kstat, 207f4b3ec61Sdh155122 ipss->ipsec_netstack->netstack_stackid); 208f4b3ec61Sdh155122 ipss->ipsec_ip_drop_kstat = NULL; 209f4b3ec61Sdh155122 ipss->ipsec_ip_drop_types = NULL; 2107c478bd9Sstevel@tonic-gate } 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate /* 2137c478bd9Sstevel@tonic-gate * Register a packet dropper. 2147c478bd9Sstevel@tonic-gate */ 2157c478bd9Sstevel@tonic-gate void 2167c478bd9Sstevel@tonic-gate ip_drop_register(ipdropper_t *ipd, char *name) 2177c478bd9Sstevel@tonic-gate { 2187c478bd9Sstevel@tonic-gate if (ipd->ipd_name != NULL) { 2197c478bd9Sstevel@tonic-gate cmn_err(CE_WARN, 2207c478bd9Sstevel@tonic-gate "ip_drop_register: ipdropper %s already registered with %s", 2217c478bd9Sstevel@tonic-gate name, ipd->ipd_name); 2227c478bd9Sstevel@tonic-gate return; 2237c478bd9Sstevel@tonic-gate } 2247c478bd9Sstevel@tonic-gate 2257c478bd9Sstevel@tonic-gate /* Assume that name is reasonable in length. This isn't user-land. */ 2267c478bd9Sstevel@tonic-gate ipd->ipd_name = kmem_alloc(strlen(name) + 1, KM_SLEEP); 2277c478bd9Sstevel@tonic-gate (void) strcpy(ipd->ipd_name, name); 2287c478bd9Sstevel@tonic-gate } 2297c478bd9Sstevel@tonic-gate 2307c478bd9Sstevel@tonic-gate /* 2317c478bd9Sstevel@tonic-gate * Un-register a packet dropper. 2327c478bd9Sstevel@tonic-gate */ 2337c478bd9Sstevel@tonic-gate void 2347c478bd9Sstevel@tonic-gate ip_drop_unregister(ipdropper_t *ipd) 2357c478bd9Sstevel@tonic-gate { 236f4b3ec61Sdh155122 if (ipd->ipd_name == NULL) { 237f4b3ec61Sdh155122 cmn_err(CE_WARN, 238f4b3ec61Sdh155122 "ip_drop_unregister: not registered (%p)\n", 239f4b3ec61Sdh155122 (void *)ipd); 240f4b3ec61Sdh155122 return; 241f4b3ec61Sdh155122 } 2427c478bd9Sstevel@tonic-gate kmem_free(ipd->ipd_name, strlen(ipd->ipd_name) + 1); 2437c478bd9Sstevel@tonic-gate 2447c478bd9Sstevel@tonic-gate ipd->ipd_name = NULL; 2457c478bd9Sstevel@tonic-gate } 2467c478bd9Sstevel@tonic-gate 2477c478bd9Sstevel@tonic-gate /* 2487c478bd9Sstevel@tonic-gate * Actually drop a packet. Many things could happen here, but at the least, 2497c478bd9Sstevel@tonic-gate * the packet will be freemsg()ed. 2507c478bd9Sstevel@tonic-gate */ 2517c478bd9Sstevel@tonic-gate void 252bd670b35SErik Nordmark ip_drop_packet(mblk_t *mp, boolean_t inbound, ill_t *ill, 253bd670b35SErik Nordmark struct kstat_named *counter, ipdropper_t *who_called) 2547c478bd9Sstevel@tonic-gate { 255bd670b35SErik Nordmark char *str; 2567c478bd9Sstevel@tonic-gate 2577c478bd9Sstevel@tonic-gate if (mp == NULL) { 2587c478bd9Sstevel@tonic-gate /* 2597c478bd9Sstevel@tonic-gate * Return immediately - NULL packets should not affect any 2607c478bd9Sstevel@tonic-gate * statistics. 2617c478bd9Sstevel@tonic-gate */ 2627c478bd9Sstevel@tonic-gate return; 2637c478bd9Sstevel@tonic-gate } 2647c478bd9Sstevel@tonic-gate 265bd670b35SErik Nordmark ASSERT(mp->b_datap->db_type == M_DATA); 2667c478bd9Sstevel@tonic-gate 2677c478bd9Sstevel@tonic-gate /* Increment the bean counter, if available. */ 2687c478bd9Sstevel@tonic-gate if (counter != NULL) { 2697c478bd9Sstevel@tonic-gate switch (counter->data_type) { 2707c478bd9Sstevel@tonic-gate case KSTAT_DATA_INT32: 2717c478bd9Sstevel@tonic-gate counter->value.i32++; 2727c478bd9Sstevel@tonic-gate break; 2737c478bd9Sstevel@tonic-gate case KSTAT_DATA_UINT32: 2747c478bd9Sstevel@tonic-gate counter->value.ui32++; 2757c478bd9Sstevel@tonic-gate break; 2767c478bd9Sstevel@tonic-gate case KSTAT_DATA_INT64: 2777c478bd9Sstevel@tonic-gate counter->value.i64++; 2787c478bd9Sstevel@tonic-gate break; 2797c478bd9Sstevel@tonic-gate case KSTAT_DATA_UINT64: 2807c478bd9Sstevel@tonic-gate counter->value.ui64++; 2817c478bd9Sstevel@tonic-gate break; 2827c478bd9Sstevel@tonic-gate /* Other types we can't handle for now. */ 2837c478bd9Sstevel@tonic-gate } 2847c478bd9Sstevel@tonic-gate } 2857c478bd9Sstevel@tonic-gate 286bd670b35SErik Nordmark if (counter != NULL) 287bd670b35SErik Nordmark str = counter->name; 288bd670b35SErik Nordmark else if (who_called != NULL) 289bd670b35SErik Nordmark str = who_called->ipd_name; 290bd670b35SErik Nordmark else 291bd670b35SErik Nordmark str = "Unspecified IPsec drop"; 292bd670b35SErik Nordmark 293bd670b35SErik Nordmark if (inbound) 294bd670b35SErik Nordmark ip_drop_input(str, mp, ill); 295bd670b35SErik Nordmark else 296bd670b35SErik Nordmark ip_drop_output(str, mp, ill); 297bd670b35SErik Nordmark 2987c478bd9Sstevel@tonic-gate /* TODO: queue the packet onto a snoop-friendly queue. */ 2997c478bd9Sstevel@tonic-gate 3008810c16bSdanmcd /* 3018810c16bSdanmcd * ASSERT this isn't a b_next linked mblk chain where a 3028810c16bSdanmcd * chained dropper should be used instead 3038810c16bSdanmcd */ 3048810c16bSdanmcd ASSERT(mp->b_prev == NULL && mp->b_next == NULL); 3057c478bd9Sstevel@tonic-gate freemsg(mp); 3067c478bd9Sstevel@tonic-gate } 307bd670b35SErik Nordmark 308bd670b35SErik Nordmark /* 309bd670b35SErik Nordmark * This is just a convinient place for dtrace to see dropped packets 310bd670b35SErik Nordmark */ 311bd670b35SErik Nordmark /*ARGSUSED*/ 312bd670b35SErik Nordmark void 313bd670b35SErik Nordmark ip_drop_input(char *str, mblk_t *mp, ill_t *ill) 314bd670b35SErik Nordmark { 315bd670b35SErik Nordmark if (mp == NULL) 316bd670b35SErik Nordmark return; 317bd670b35SErik Nordmark 318bd670b35SErik Nordmark if (IPH_HDR_VERSION(mp->b_rptr) == IPV4_VERSION) { 319bd670b35SErik Nordmark ipha_t *ipha = (ipha_t *)mp->b_rptr; 320bd670b35SErik Nordmark 321bd670b35SErik Nordmark DTRACE_IP7(drop__in, mblk_t *, mp, conn_t *, NULL, void_ip_t *, 322bd670b35SErik Nordmark ipha, __dtrace_ipsr_ill_t *, ill, ipha_t *, ipha, 323bd670b35SErik Nordmark ip6_t *, NULL, int, 0); 324bd670b35SErik Nordmark } else { 325bd670b35SErik Nordmark ip6_t *ip6h = (ip6_t *)mp->b_rptr; 326bd670b35SErik Nordmark 327bd670b35SErik Nordmark DTRACE_IP7(drop__in, mblk_t *, mp, conn_t *, NULL, void_ip_t *, 328bd670b35SErik Nordmark ip6h, __dtrace_ipsr_ill_t *, ill, ipha_t *, NULL, 329bd670b35SErik Nordmark ip6_t *, ip6h, int, 0); 330bd670b35SErik Nordmark } 331bd670b35SErik Nordmark } 332bd670b35SErik Nordmark 333bd670b35SErik Nordmark /*ARGSUSED*/ 334bd670b35SErik Nordmark void 335bd670b35SErik Nordmark ip_drop_output(char *str, mblk_t *mp, ill_t *ill) 336bd670b35SErik Nordmark { 337bd670b35SErik Nordmark if (mp == NULL) 338bd670b35SErik Nordmark return; 339bd670b35SErik Nordmark 340bd670b35SErik Nordmark if (IPH_HDR_VERSION(mp->b_rptr) == IPV4_VERSION) { 341bd670b35SErik Nordmark ipha_t *ipha = (ipha_t *)mp->b_rptr; 342bd670b35SErik Nordmark 343bd670b35SErik Nordmark DTRACE_IP7(drop__out, mblk_t *, mp, conn_t *, NULL, void_ip_t *, 344bd670b35SErik Nordmark ipha, __dtrace_ipsr_ill_t *, ill, ipha_t *, ipha, 345bd670b35SErik Nordmark ip6_t *, NULL, int, 0); 346bd670b35SErik Nordmark } else { 347bd670b35SErik Nordmark ip6_t *ip6h = (ip6_t *)mp->b_rptr; 348bd670b35SErik Nordmark 349bd670b35SErik Nordmark DTRACE_IP7(drop__out, mblk_t *, mp, conn_t *, NULL, void_ip_t *, 350bd670b35SErik Nordmark ip6h, __dtrace_ipsr_ill_t *, ill, ipha_t *, NULL, 351bd670b35SErik Nordmark ip6_t *, ip6h, int, 0); 352bd670b35SErik Nordmark } 353bd670b35SErik Nordmark } 354