1*bbb1b6f9SApple OSS Distributions /* 2*bbb1b6f9SApple OSS Distributions * Copyright (c) 1999-2024 Apple Inc. All rights reserved. 3*bbb1b6f9SApple OSS Distributions * 4*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*bbb1b6f9SApple OSS Distributions * 6*bbb1b6f9SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*bbb1b6f9SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*bbb1b6f9SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*bbb1b6f9SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*bbb1b6f9SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*bbb1b6f9SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*bbb1b6f9SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*bbb1b6f9SApple OSS Distributions * terms of an Apple operating system software license agreement. 14*bbb1b6f9SApple OSS Distributions * 15*bbb1b6f9SApple OSS Distributions * Please obtain a copy of the License at 16*bbb1b6f9SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*bbb1b6f9SApple OSS Distributions * 18*bbb1b6f9SApple OSS Distributions * The Original Code and all software distributed under the License are 19*bbb1b6f9SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*bbb1b6f9SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*bbb1b6f9SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*bbb1b6f9SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*bbb1b6f9SApple OSS Distributions * Please see the License for the specific language governing rights and 24*bbb1b6f9SApple OSS Distributions * limitations under the License. 25*bbb1b6f9SApple OSS Distributions * 26*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*bbb1b6f9SApple OSS Distributions */ 28*bbb1b6f9SApple OSS Distributions /* 29*bbb1b6f9SApple OSS Distributions * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce 30*bbb1b6f9SApple OSS Distributions * support for mandatory and extensible security protections. This notice 31*bbb1b6f9SApple OSS Distributions * is included in support of clause 2.2 (b) of the Apple Public License, 32*bbb1b6f9SApple OSS Distributions * Version 2.0. 33*bbb1b6f9SApple OSS Distributions */ 34*bbb1b6f9SApple OSS Distributions 35*bbb1b6f9SApple OSS Distributions #include <stdint.h> 36*bbb1b6f9SApple OSS Distributions 37*bbb1b6f9SApple OSS Distributions #include <net/dlil_sysctl.h> 38*bbb1b6f9SApple OSS Distributions #include <net/dlil_var_private.h> 39*bbb1b6f9SApple OSS Distributions #include <net/net_api_stats.h> 40*bbb1b6f9SApple OSS Distributions #include <net/net_sysctl.h> 41*bbb1b6f9SApple OSS Distributions 42*bbb1b6f9SApple OSS Distributions #if SKYWALK 43*bbb1b6f9SApple OSS Distributions #include <skywalk/os_skywalk_private.h> 44*bbb1b6f9SApple OSS Distributions #endif /* SKYWALK */ 45*bbb1b6f9SApple OSS Distributions 46*bbb1b6f9SApple OSS Distributions static int sysctl_rxpoll SYSCTL_HANDLER_ARGS; 47*bbb1b6f9SApple OSS Distributions static int sysctl_rxpoll_mode_holdtime SYSCTL_HANDLER_ARGS; 48*bbb1b6f9SApple OSS Distributions static int sysctl_rxpoll_sample_holdtime SYSCTL_HANDLER_ARGS; 49*bbb1b6f9SApple OSS Distributions static int sysctl_rxpoll_interval_time SYSCTL_HANDLER_ARGS; 50*bbb1b6f9SApple OSS Distributions static int sysctl_rxpoll_wlowat SYSCTL_HANDLER_ARGS; 51*bbb1b6f9SApple OSS Distributions static int sysctl_rxpoll_whiwat SYSCTL_HANDLER_ARGS; 52*bbb1b6f9SApple OSS Distributions static int sysctl_sndq_maxlen SYSCTL_HANDLER_ARGS; 53*bbb1b6f9SApple OSS Distributions static int sysctl_rcvq_maxlen SYSCTL_HANDLER_ARGS; 54*bbb1b6f9SApple OSS Distributions static int sysctl_rcvq_burst_limit SYSCTL_HANDLER_ARGS; 55*bbb1b6f9SApple OSS Distributions static int sysctl_rcvq_trim_pct SYSCTL_HANDLER_ARGS; 56*bbb1b6f9SApple OSS Distributions static int sysctl_hwcksum_dbg_mode SYSCTL_HANDLER_ARGS; 57*bbb1b6f9SApple OSS Distributions static int sysctl_hwcksum_dbg_partial_rxoff_forced SYSCTL_HANDLER_ARGS; 58*bbb1b6f9SApple OSS Distributions static int sysctl_hwcksum_dbg_partial_rxoff_adj SYSCTL_HANDLER_ARGS; 59*bbb1b6f9SApple OSS Distributions static int sysctl_tx_chain_len_stats SYSCTL_HANDLER_ARGS; 60*bbb1b6f9SApple OSS Distributions static int if_enable_fsw_transport_netagent_sysctl SYSCTL_HANDLER_ARGS; 61*bbb1b6f9SApple OSS Distributions 62*bbb1b6f9SApple OSS Distributions #if TEST_INPUT_THREAD_TERMINATION 63*bbb1b6f9SApple OSS Distributions static int sysctl_input_thread_termination_spin SYSCTL_HANDLER_ARGS; 64*bbb1b6f9SApple OSS Distributions #endif /* TEST_INPUT_THREAD_TERMINATION */ 65*bbb1b6f9SApple OSS Distributions 66*bbb1b6f9SApple OSS Distributions #if (DEVELOPMENT || DEBUG) 67*bbb1b6f9SApple OSS Distributions static int sysctl_get_kao_frames SYSCTL_HANDLER_ARGS; 68*bbb1b6f9SApple OSS Distributions static int if_attach_nx_sysctl SYSCTL_HANDLER_ARGS; 69*bbb1b6f9SApple OSS Distributions #endif /* DEVELOPMENT | DEBUG */ 70*bbb1b6f9SApple OSS Distributions 71*bbb1b6f9SApple OSS Distributions 72*bbb1b6f9SApple OSS Distributions 73*bbb1b6f9SApple OSS Distributions SYSCTL_DECL(_net_link_generic_system); 74*bbb1b6f9SApple OSS Distributions 75*bbb1b6f9SApple OSS Distributions /****************************************************************************** 76*bbb1b6f9SApple OSS Distributions * Section: DLIL send and receive queues. * 77*bbb1b6f9SApple OSS Distributions ******************************************************************************/ 78*bbb1b6f9SApple OSS Distributions #define IF_SNDQ_MINLEN 32 79*bbb1b6f9SApple OSS Distributions uint32_t if_sndq_maxlen = IFQ_MAXLEN; /* should it be IFQ_SNDQ_MAXLEN ? */ 80*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, sndq_maxlen, 81*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_sndq_maxlen, IFQ_MAXLEN, 82*bbb1b6f9SApple OSS Distributions sysctl_sndq_maxlen, "I", "Default transmit queue max length"); 83*bbb1b6f9SApple OSS Distributions 84*bbb1b6f9SApple OSS Distributions uint32_t if_rcvq_maxlen = IF_RCVQ_MAXLEN; 85*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rcvq_maxlen, 86*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rcvq_maxlen, IFQ_MAXLEN, 87*bbb1b6f9SApple OSS Distributions sysctl_rcvq_maxlen, "I", "Default receive queue max length"); 88*bbb1b6f9SApple OSS Distributions 89*bbb1b6f9SApple OSS Distributions uint32_t if_delaybased_queue = 1; 90*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, delaybased_queue, 91*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_delaybased_queue, 1, 92*bbb1b6f9SApple OSS Distributions "enable delay based dynamic queue sizing"); 93*bbb1b6f9SApple OSS Distributions 94*bbb1b6f9SApple OSS Distributions uint32_t ifnet_start_delayed = 0; 95*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, start_delayed, 96*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &ifnet_start_delayed, 0, 97*bbb1b6f9SApple OSS Distributions "number of times start was delayed"); 98*bbb1b6f9SApple OSS Distributions 99*bbb1b6f9SApple OSS Distributions uint32_t ifnet_delay_start_disabled = 0; 100*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, start_delay_disabled, 101*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &ifnet_delay_start_disabled, 0, 102*bbb1b6f9SApple OSS Distributions "number of times start was delayed"); 103*bbb1b6f9SApple OSS Distributions 104*bbb1b6f9SApple OSS Distributions /* 105*bbb1b6f9SApple OSS Distributions * Protect against possible memory starvation that may happen 106*bbb1b6f9SApple OSS Distributions * when the driver is pushing data faster than the AP can process. 107*bbb1b6f9SApple OSS Distributions * 108*bbb1b6f9SApple OSS Distributions * If at any point during DLIL input phase any of the input queues 109*bbb1b6f9SApple OSS Distributions * exceeds the burst limit, DLIL will start to trim the queue, 110*bbb1b6f9SApple OSS Distributions * by returning mbufs in the input queue to the cache from which 111*bbb1b6f9SApple OSS Distributions * the mbufs were originally allocated, starting from the oldest 112*bbb1b6f9SApple OSS Distributions * mbuf and continuing until the new limit (see below) is reached. 113*bbb1b6f9SApple OSS Distributions * 114*bbb1b6f9SApple OSS Distributions * In order to avoid a steplocked equilibrium, the trimming 115*bbb1b6f9SApple OSS Distributions * will continue PAST the burst limit, until the corresponding 116*bbb1b6f9SApple OSS Distributions * input queue is reduced to `if_rcvq_trim_pct' %. 117*bbb1b6f9SApple OSS Distributions * 118*bbb1b6f9SApple OSS Distributions * For example, if the input queue limit is 1024 packets, 119*bbb1b6f9SApple OSS Distributions * and the trim percentage (`if_rcvq_trim_pct') is 80 %, 120*bbb1b6f9SApple OSS Distributions * the trimming will continue until the queue contains 819 packets 121*bbb1b6f9SApple OSS Distributions * (1024 * 80 / 100 == 819). 122*bbb1b6f9SApple OSS Distributions * 123*bbb1b6f9SApple OSS Distributions * Setting the burst limit too low can hurt the throughput, 124*bbb1b6f9SApple OSS Distributions * while setting the burst limit too high can defeat the purpose. 125*bbb1b6f9SApple OSS Distributions */ 126*bbb1b6f9SApple OSS Distributions #define IF_RCVQ_BURST_LIMIT_MIN 1024 127*bbb1b6f9SApple OSS Distributions #define IF_RCVQ_BURST_LIMIT_DEFAULT 8192 128*bbb1b6f9SApple OSS Distributions #define IF_RCVQ_BURST_LIMIT_MAX 32768 129*bbb1b6f9SApple OSS Distributions uint32_t if_rcvq_burst_limit = IF_RCVQ_BURST_LIMIT_DEFAULT; 130*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rcvq_burst_limit, 131*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rcvq_burst_limit, IF_RCVQ_BURST_LIMIT_DEFAULT, 132*bbb1b6f9SApple OSS Distributions sysctl_rcvq_burst_limit, "I", "Upper memory limit for inbound data"); 133*bbb1b6f9SApple OSS Distributions 134*bbb1b6f9SApple OSS Distributions #define IF_RCVQ_TRIM_PCT_MIN 20 135*bbb1b6f9SApple OSS Distributions #define IF_RCVQ_TRIM_PCT_DEFAULT 80 136*bbb1b6f9SApple OSS Distributions #define IF_RCVQ_TRIM_PCT_MAX 100 137*bbb1b6f9SApple OSS Distributions uint32_t if_rcvq_trim_pct = IF_RCVQ_TRIM_PCT_DEFAULT; 138*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rcvq_trim_pct, 139*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rcvq_trim_pct, IF_RCVQ_TRIM_PCT_DEFAULT, 140*bbb1b6f9SApple OSS Distributions sysctl_rcvq_trim_pct, "I", 141*bbb1b6f9SApple OSS Distributions "Percentage (0 - 100) of the queue limit to keep after detecting an overflow burst"); 142*bbb1b6f9SApple OSS Distributions 143*bbb1b6f9SApple OSS Distributions struct chain_len_stats tx_chain_len_stats; 144*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, tx_chain_len_stats, 145*bbb1b6f9SApple OSS Distributions CTLFLAG_RD | CTLFLAG_LOCKED, 0, 9, 146*bbb1b6f9SApple OSS Distributions sysctl_tx_chain_len_stats, "S", ""); 147*bbb1b6f9SApple OSS Distributions 148*bbb1b6f9SApple OSS Distributions uint32_t tx_chain_len_count = 0; 149*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, tx_chain_len_count, 150*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &tx_chain_len_count, 0, ""); 151*bbb1b6f9SApple OSS Distributions 152*bbb1b6f9SApple OSS Distributions /****************************************************************************** 153*bbb1b6f9SApple OSS Distributions * Section: DLIL opportunistic rx polling. * 154*bbb1b6f9SApple OSS Distributions ******************************************************************************/ 155*bbb1b6f9SApple OSS Distributions 156*bbb1b6f9SApple OSS Distributions uint32_t if_rxpoll = 1; 157*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rxpoll, 158*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll, 0, 159*bbb1b6f9SApple OSS Distributions sysctl_rxpoll, "I", "enable opportunistic input polling"); 160*bbb1b6f9SApple OSS Distributions 161*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_DECAY 2 /* ilog2 of EWMA decay rate (4) */ 162*bbb1b6f9SApple OSS Distributions uint32_t if_rxpoll_decay = IF_RXPOLL_DECAY; 163*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, rxpoll_decay, 164*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll_decay, IF_RXPOLL_DECAY, 165*bbb1b6f9SApple OSS Distributions "ilog2 of EWMA decay rate of avg inbound packets"); 166*bbb1b6f9SApple OSS Distributions 167*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_MODE_HOLDTIME_MIN (10ULL * 1000 * 1000) /* 10 ms */ 168*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_MODE_HOLDTIME (1000ULL * 1000 * 1000) /* 1 sec */ 169*bbb1b6f9SApple OSS Distributions uint64_t if_rxpoll_mode_holdtime = IF_RXPOLL_MODE_HOLDTIME; 170*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rxpoll_freeze_time, 171*bbb1b6f9SApple OSS Distributions CTLTYPE_QUAD | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll_mode_holdtime, 172*bbb1b6f9SApple OSS Distributions IF_RXPOLL_MODE_HOLDTIME, sysctl_rxpoll_mode_holdtime, 173*bbb1b6f9SApple OSS Distributions "Q", "input poll mode freeze time"); 174*bbb1b6f9SApple OSS Distributions 175*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_SAMPLETIME_MIN (1ULL * 1000 * 1000) /* 1 ms */ 176*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_SAMPLETIME (10ULL * 1000 * 1000) /* 10 ms */ 177*bbb1b6f9SApple OSS Distributions uint64_t if_rxpoll_sample_holdtime = IF_RXPOLL_SAMPLETIME; 178*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rxpoll_sample_time, 179*bbb1b6f9SApple OSS Distributions CTLTYPE_QUAD | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll_sample_holdtime, 180*bbb1b6f9SApple OSS Distributions IF_RXPOLL_SAMPLETIME, sysctl_rxpoll_sample_holdtime, 181*bbb1b6f9SApple OSS Distributions "Q", "input poll sampling time"); 182*bbb1b6f9SApple OSS Distributions 183*bbb1b6f9SApple OSS Distributions /* Input poll interval definitions */ 184*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_INTERVALTIME_MIN (1ULL * 1000) /* 1 us */ 185*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_INTERVALTIME (1ULL * 1000 * 1000) /* 1 ms */ 186*bbb1b6f9SApple OSS Distributions uint64_t if_rxpoll_interval_time = IF_RXPOLL_INTERVALTIME; 187*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rxpoll_interval_time, 188*bbb1b6f9SApple OSS Distributions CTLTYPE_QUAD | CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll_interval_time, 189*bbb1b6f9SApple OSS Distributions IF_RXPOLL_INTERVALTIME, sysctl_rxpoll_interval_time, 190*bbb1b6f9SApple OSS Distributions "Q", "input poll interval (time)"); 191*bbb1b6f9SApple OSS Distributions 192*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_INTERVAL_PKTS 0 /* 0 (disabled) */ 193*bbb1b6f9SApple OSS Distributions uint32_t if_rxpoll_interval_pkts = IF_RXPOLL_INTERVAL_PKTS; 194*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, rxpoll_interval_pkts, 195*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll_interval_pkts, 196*bbb1b6f9SApple OSS Distributions IF_RXPOLL_INTERVAL_PKTS, "input poll interval (packets)"); 197*bbb1b6f9SApple OSS Distributions 198*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_WLOWAT 10 199*bbb1b6f9SApple OSS Distributions uint32_t if_sysctl_rxpoll_wlowat = IF_RXPOLL_WLOWAT; 200*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rxpoll_wakeups_lowat, 201*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_sysctl_rxpoll_wlowat, 202*bbb1b6f9SApple OSS Distributions IF_RXPOLL_WLOWAT, sysctl_rxpoll_wlowat, 203*bbb1b6f9SApple OSS Distributions "I", "input poll wakeup low watermark"); 204*bbb1b6f9SApple OSS Distributions 205*bbb1b6f9SApple OSS Distributions #define IF_RXPOLL_WHIWAT 100 206*bbb1b6f9SApple OSS Distributions uint32_t if_sysctl_rxpoll_whiwat = IF_RXPOLL_WHIWAT; 207*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, rxpoll_wakeups_hiwat, 208*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &if_sysctl_rxpoll_whiwat, 209*bbb1b6f9SApple OSS Distributions IF_RXPOLL_WHIWAT, sysctl_rxpoll_whiwat, 210*bbb1b6f9SApple OSS Distributions "I", "input poll wakeup high watermark"); 211*bbb1b6f9SApple OSS Distributions 212*bbb1b6f9SApple OSS Distributions uint32_t if_rxpoll_max = 0; /* automatic */ 213*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, rxpoll_max, 214*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_rxpoll_max, 0, 215*bbb1b6f9SApple OSS Distributions "max packets per poll call"); 216*bbb1b6f9SApple OSS Distributions 217*bbb1b6f9SApple OSS Distributions #if TEST_INPUT_THREAD_TERMINATION 218*bbb1b6f9SApple OSS Distributions uint32_t if_input_thread_termination_spin = 0 /* disabled */; 219*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, input_thread_termination_spin, 220*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, 221*bbb1b6f9SApple OSS Distributions &if_input_thread_termination_spin, 0, 222*bbb1b6f9SApple OSS Distributions sysctl_input_thread_termination_spin, 223*bbb1b6f9SApple OSS Distributions "I", "input thread termination spin limit"); 224*bbb1b6f9SApple OSS Distributions #endif /* TEST_INPUT_THREAD_TERMINATION */ 225*bbb1b6f9SApple OSS Distributions 226*bbb1b6f9SApple OSS Distributions uint32_t cur_dlil_input_threads = 0; 227*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, dlil_input_threads, 228*bbb1b6f9SApple OSS Distributions CTLFLAG_RD | CTLFLAG_LOCKED, &cur_dlil_input_threads, 0, 229*bbb1b6f9SApple OSS Distributions "Current number of DLIL input threads"); 230*bbb1b6f9SApple OSS Distributions 231*bbb1b6f9SApple OSS Distributions 232*bbb1b6f9SApple OSS Distributions /****************************************************************************** 233*bbb1b6f9SApple OSS Distributions * Section: hardware-assisted checksum mechanism. * 234*bbb1b6f9SApple OSS Distributions ******************************************************************************/ 235*bbb1b6f9SApple OSS Distributions 236*bbb1b6f9SApple OSS Distributions uint32_t hwcksum_tx = 1; 237*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, hwcksum_tx, 238*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &hwcksum_tx, 0, 239*bbb1b6f9SApple OSS Distributions "enable transmit hardware checksum offload"); 240*bbb1b6f9SApple OSS Distributions 241*bbb1b6f9SApple OSS Distributions uint32_t hwcksum_rx = 1; 242*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, hwcksum_rx, 243*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &hwcksum_rx, 0, 244*bbb1b6f9SApple OSS Distributions "enable receive hardware checksum offload"); 245*bbb1b6f9SApple OSS Distributions 246*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_in_invalidated = 0; 247*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 248*bbb1b6f9SApple OSS Distributions hwcksum_in_invalidated, CTLFLAG_RD | CTLFLAG_LOCKED, 249*bbb1b6f9SApple OSS Distributions &hwcksum_in_invalidated, "inbound packets with invalidated hardware cksum"); 250*bbb1b6f9SApple OSS Distributions 251*bbb1b6f9SApple OSS Distributions uint32_t hwcksum_dbg = 0; 252*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, hwcksum_dbg, 253*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &hwcksum_dbg, 0, 254*bbb1b6f9SApple OSS Distributions "enable hardware cksum debugging"); 255*bbb1b6f9SApple OSS Distributions 256*bbb1b6f9SApple OSS Distributions uint32_t hwcksum_dbg_mode = 0; 257*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, hwcksum_dbg_mode, 258*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &hwcksum_dbg_mode, 259*bbb1b6f9SApple OSS Distributions 0, sysctl_hwcksum_dbg_mode, "I", "hardware cksum debugging mode"); 260*bbb1b6f9SApple OSS Distributions 261*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_partial_forced = 0; 262*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 263*bbb1b6f9SApple OSS Distributions hwcksum_dbg_partial_forced, CTLFLAG_RD | CTLFLAG_LOCKED, 264*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_partial_forced, "packets forced using partial cksum"); 265*bbb1b6f9SApple OSS Distributions 266*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_partial_forced_bytes = 0; 267*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 268*bbb1b6f9SApple OSS Distributions hwcksum_dbg_partial_forced_bytes, CTLFLAG_RD | CTLFLAG_LOCKED, 269*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_partial_forced_bytes, "bytes forced using partial cksum"); 270*bbb1b6f9SApple OSS Distributions 271*bbb1b6f9SApple OSS Distributions uint32_t hwcksum_dbg_partial_rxoff_forced = 0; 272*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, 273*bbb1b6f9SApple OSS Distributions hwcksum_dbg_partial_rxoff_forced, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, 274*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_partial_rxoff_forced, 0, 275*bbb1b6f9SApple OSS Distributions sysctl_hwcksum_dbg_partial_rxoff_forced, "I", 276*bbb1b6f9SApple OSS Distributions "forced partial cksum rx offset"); 277*bbb1b6f9SApple OSS Distributions 278*bbb1b6f9SApple OSS Distributions uint32_t hwcksum_dbg_partial_rxoff_adj = 0; 279*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, hwcksum_dbg_partial_rxoff_adj, 280*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, &hwcksum_dbg_partial_rxoff_adj, 281*bbb1b6f9SApple OSS Distributions 0, sysctl_hwcksum_dbg_partial_rxoff_adj, "I", 282*bbb1b6f9SApple OSS Distributions "adjusted partial cksum rx offset"); 283*bbb1b6f9SApple OSS Distributions 284*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_verified = 0; 285*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 286*bbb1b6f9SApple OSS Distributions hwcksum_dbg_verified, CTLFLAG_RD | CTLFLAG_LOCKED, 287*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_verified, "packets verified for having good checksum"); 288*bbb1b6f9SApple OSS Distributions 289*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_bad_cksum = 0; 290*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 291*bbb1b6f9SApple OSS Distributions hwcksum_dbg_bad_cksum, CTLFLAG_RD | CTLFLAG_LOCKED, 292*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_bad_cksum, "packets with bad hardware calculated checksum"); 293*bbb1b6f9SApple OSS Distributions 294*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_bad_rxoff = 0; 295*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 296*bbb1b6f9SApple OSS Distributions hwcksum_dbg_bad_rxoff, CTLFLAG_RD | CTLFLAG_LOCKED, 297*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_bad_rxoff, "packets with invalid rxoff"); 298*bbb1b6f9SApple OSS Distributions 299*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_adjusted = 0; 300*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 301*bbb1b6f9SApple OSS Distributions hwcksum_dbg_adjusted, CTLFLAG_RD | CTLFLAG_LOCKED, 302*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_adjusted, "packets with rxoff adjusted"); 303*bbb1b6f9SApple OSS Distributions 304*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_finalized_hdr = 0; 305*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 306*bbb1b6f9SApple OSS Distributions hwcksum_dbg_finalized_hdr, CTLFLAG_RD | CTLFLAG_LOCKED, 307*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_finalized_hdr, "finalized headers"); 308*bbb1b6f9SApple OSS Distributions 309*bbb1b6f9SApple OSS Distributions uint64_t hwcksum_dbg_finalized_data = 0; 310*bbb1b6f9SApple OSS Distributions SYSCTL_QUAD(_net_link_generic_system, OID_AUTO, 311*bbb1b6f9SApple OSS Distributions hwcksum_dbg_finalized_data, CTLFLAG_RD | CTLFLAG_LOCKED, 312*bbb1b6f9SApple OSS Distributions &hwcksum_dbg_finalized_data, "finalized payloads"); 313*bbb1b6f9SApple OSS Distributions 314*bbb1b6f9SApple OSS Distributions 315*bbb1b6f9SApple OSS Distributions /****************************************************************************** 316*bbb1b6f9SApple OSS Distributions * Section: DLIL debugging, notifications and sanity checks * 317*bbb1b6f9SApple OSS Distributions ******************************************************************************/ 318*bbb1b6f9SApple OSS Distributions 319*bbb1b6f9SApple OSS Distributions uint32_t if_flowadv = 1; 320*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, flow_advisory, 321*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_flowadv, 1, 322*bbb1b6f9SApple OSS Distributions "enable flow-advisory mechanism"); 323*bbb1b6f9SApple OSS Distributions 324*bbb1b6f9SApple OSS Distributions uint32_t threshold_notify = 1; /* enable/disable */ 325*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, threshold_notify, 326*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &threshold_notify, 0, ""); 327*bbb1b6f9SApple OSS Distributions 328*bbb1b6f9SApple OSS Distributions uint32_t threshold_interval = 2; /* in seconds */; 329*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, threshold_interval, 330*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &threshold_interval, 0, ""); 331*bbb1b6f9SApple OSS Distributions 332*bbb1b6f9SApple OSS Distributions struct net_api_stats net_api_stats; 333*bbb1b6f9SApple OSS Distributions SYSCTL_STRUCT(_net, OID_AUTO, api_stats, CTLFLAG_RD | CTLFLAG_LOCKED, 334*bbb1b6f9SApple OSS Distributions &net_api_stats, net_api_stats, ""); 335*bbb1b6f9SApple OSS Distributions 336*bbb1b6f9SApple OSS Distributions #if DEBUG 337*bbb1b6f9SApple OSS Distributions int dlil_verbose = 1; 338*bbb1b6f9SApple OSS Distributions #else 339*bbb1b6f9SApple OSS Distributions int dlil_verbose = 0; 340*bbb1b6f9SApple OSS Distributions #endif /* DEBUG */ 341*bbb1b6f9SApple OSS Distributions 342*bbb1b6f9SApple OSS Distributions SYSCTL_INT(_net_link_generic_system, OID_AUTO, dlil_verbose, 343*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &dlil_verbose, 0, "Log DLIL error messages"); 344*bbb1b6f9SApple OSS Distributions 345*bbb1b6f9SApple OSS Distributions uint32_t net_wake_pkt_debug = 0; 346*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, wake_pkt_debug, 347*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &net_wake_pkt_debug, 0, ""); 348*bbb1b6f9SApple OSS Distributions 349*bbb1b6f9SApple OSS Distributions #if IFNET_INPUT_SANITY_CHK 350*bbb1b6f9SApple OSS Distributions uint32_t dlil_input_sanity_check = 0; 351*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, dlil_input_sanity_check, 352*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &dlil_input_sanity_check, 0, 353*bbb1b6f9SApple OSS Distributions "Turn on sanity checking in DLIL input"); 354*bbb1b6f9SApple OSS Distributions #endif /* IFNET_INPUT_SANITY_CHK */ 355*bbb1b6f9SApple OSS Distributions 356*bbb1b6f9SApple OSS Distributions 357*bbb1b6f9SApple OSS Distributions #if (DEVELOPMENT || DEBUG) 358*bbb1b6f9SApple OSS Distributions 359*bbb1b6f9SApple OSS Distributions static int sysctl_get_kao_frames SYSCTL_HANDLER_ARGS; 360*bbb1b6f9SApple OSS Distributions SYSCTL_NODE(_net_link_generic_system, OID_AUTO, get_kao_frames, 361*bbb1b6f9SApple OSS Distributions CTLFLAG_RD | CTLFLAG_LOCKED, sysctl_get_kao_frames, ""); 362*bbb1b6f9SApple OSS Distributions 363*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, if_attach_nx, 364*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, 365*bbb1b6f9SApple OSS Distributions 0, 0, &if_attach_nx_sysctl, "IU", "attach nexus"); 366*bbb1b6f9SApple OSS Distributions 367*bbb1b6f9SApple OSS Distributions #endif /* DEVELOPMENT || DEBUG */ 368*bbb1b6f9SApple OSS Distributions 369*bbb1b6f9SApple OSS Distributions SYSCTL_PROC(_net_link_generic_system, OID_AUTO, enable_netagent, 370*bbb1b6f9SApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED, 371*bbb1b6f9SApple OSS Distributions 0, 0, &if_enable_fsw_transport_netagent_sysctl, "IU", 372*bbb1b6f9SApple OSS Distributions "enable flowswitch netagent"); 373*bbb1b6f9SApple OSS Distributions 374*bbb1b6f9SApple OSS Distributions #define DEFAULT_IF_LINK_HEURISTIC \ 375*bbb1b6f9SApple OSS Distributions (IF_LINK_HEURISTICS_CELLULAR | IF_LINK_HEURISTICS_LINK_CONGESTED) 376*bbb1b6f9SApple OSS Distributions uint32_t if_link_heuristics_flags = DEFAULT_IF_LINK_HEURISTIC; 377*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, link_heuristics_flags, 378*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_link_heuristics_flags, DEFAULT_IF_LINK_HEURISTIC, ""); 379*bbb1b6f9SApple OSS Distributions 380*bbb1b6f9SApple OSS Distributions int if_link_heuristics_lqm_max = 0; 381*bbb1b6f9SApple OSS Distributions SYSCTL_INT(_net_link_generic_system, OID_AUTO, link_heuristics_lqm_max, 382*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_link_heuristics_lqm_max, 0, "Max value to enable link heuristics"); 383*bbb1b6f9SApple OSS Distributions 384*bbb1b6f9SApple OSS Distributions uint32_t if_link_heuristics_delay = IF_LINK_HEURISTICS_DELAY_MSECS; 385*bbb1b6f9SApple OSS Distributions SYSCTL_UINT(_net_link_generic_system, OID_AUTO, link_heuristics_delay, 386*bbb1b6f9SApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &if_link_heuristics_delay, IF_LINK_HEURISTICS_DELAY_MSECS, ""); 387*bbb1b6f9SApple OSS Distributions 388*bbb1b6f9SApple OSS Distributions 389*bbb1b6f9SApple OSS Distributions #if TEST_INPUT_THREAD_TERMINATION 390*bbb1b6f9SApple OSS Distributions static int 391*bbb1b6f9SApple OSS Distributions sysctl_input_thread_termination_spin SYSCTL_HANDLER_ARGS 392*bbb1b6f9SApple OSS Distributions { 393*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 394*bbb1b6f9SApple OSS Distributions uint32_t i; 395*bbb1b6f9SApple OSS Distributions int err; 396*bbb1b6f9SApple OSS Distributions 397*bbb1b6f9SApple OSS Distributions i = if_input_thread_termination_spin; 398*bbb1b6f9SApple OSS Distributions 399*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 400*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 401*bbb1b6f9SApple OSS Distributions return err; 402*bbb1b6f9SApple OSS Distributions } 403*bbb1b6f9SApple OSS Distributions 404*bbb1b6f9SApple OSS Distributions if (net_rxpoll == 0) { 405*bbb1b6f9SApple OSS Distributions return ENXIO; 406*bbb1b6f9SApple OSS Distributions } 407*bbb1b6f9SApple OSS Distributions 408*bbb1b6f9SApple OSS Distributions if_input_thread_termination_spin = i; 409*bbb1b6f9SApple OSS Distributions return err; 410*bbb1b6f9SApple OSS Distributions } 411*bbb1b6f9SApple OSS Distributions #endif /* TEST_INPUT_THREAD_TERMINATION */ 412*bbb1b6f9SApple OSS Distributions 413*bbb1b6f9SApple OSS Distributions static int 414*bbb1b6f9SApple OSS Distributions sysctl_rxpoll SYSCTL_HANDLER_ARGS 415*bbb1b6f9SApple OSS Distributions { 416*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 417*bbb1b6f9SApple OSS Distributions uint32_t i; 418*bbb1b6f9SApple OSS Distributions int err; 419*bbb1b6f9SApple OSS Distributions 420*bbb1b6f9SApple OSS Distributions i = if_rxpoll; 421*bbb1b6f9SApple OSS Distributions 422*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 423*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 424*bbb1b6f9SApple OSS Distributions return err; 425*bbb1b6f9SApple OSS Distributions } 426*bbb1b6f9SApple OSS Distributions 427*bbb1b6f9SApple OSS Distributions if (net_rxpoll == 0) { 428*bbb1b6f9SApple OSS Distributions return ENXIO; 429*bbb1b6f9SApple OSS Distributions } 430*bbb1b6f9SApple OSS Distributions 431*bbb1b6f9SApple OSS Distributions if_rxpoll = i; 432*bbb1b6f9SApple OSS Distributions return err; 433*bbb1b6f9SApple OSS Distributions } 434*bbb1b6f9SApple OSS Distributions 435*bbb1b6f9SApple OSS Distributions static int 436*bbb1b6f9SApple OSS Distributions sysctl_rxpoll_mode_holdtime SYSCTL_HANDLER_ARGS 437*bbb1b6f9SApple OSS Distributions { 438*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 439*bbb1b6f9SApple OSS Distributions uint64_t q; 440*bbb1b6f9SApple OSS Distributions int err; 441*bbb1b6f9SApple OSS Distributions 442*bbb1b6f9SApple OSS Distributions q = if_rxpoll_mode_holdtime; 443*bbb1b6f9SApple OSS Distributions 444*bbb1b6f9SApple OSS Distributions err = sysctl_handle_quad(oidp, &q, 0, req); 445*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 446*bbb1b6f9SApple OSS Distributions return err; 447*bbb1b6f9SApple OSS Distributions } 448*bbb1b6f9SApple OSS Distributions 449*bbb1b6f9SApple OSS Distributions if (q < IF_RXPOLL_MODE_HOLDTIME_MIN) { 450*bbb1b6f9SApple OSS Distributions q = IF_RXPOLL_MODE_HOLDTIME_MIN; 451*bbb1b6f9SApple OSS Distributions } 452*bbb1b6f9SApple OSS Distributions 453*bbb1b6f9SApple OSS Distributions if_rxpoll_mode_holdtime = q; 454*bbb1b6f9SApple OSS Distributions 455*bbb1b6f9SApple OSS Distributions return err; 456*bbb1b6f9SApple OSS Distributions } 457*bbb1b6f9SApple OSS Distributions 458*bbb1b6f9SApple OSS Distributions static int 459*bbb1b6f9SApple OSS Distributions sysctl_rxpoll_sample_holdtime SYSCTL_HANDLER_ARGS 460*bbb1b6f9SApple OSS Distributions { 461*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 462*bbb1b6f9SApple OSS Distributions uint64_t q; 463*bbb1b6f9SApple OSS Distributions int err; 464*bbb1b6f9SApple OSS Distributions 465*bbb1b6f9SApple OSS Distributions q = if_rxpoll_sample_holdtime; 466*bbb1b6f9SApple OSS Distributions 467*bbb1b6f9SApple OSS Distributions err = sysctl_handle_quad(oidp, &q, 0, req); 468*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 469*bbb1b6f9SApple OSS Distributions return err; 470*bbb1b6f9SApple OSS Distributions } 471*bbb1b6f9SApple OSS Distributions 472*bbb1b6f9SApple OSS Distributions if (q < IF_RXPOLL_SAMPLETIME_MIN) { 473*bbb1b6f9SApple OSS Distributions q = IF_RXPOLL_SAMPLETIME_MIN; 474*bbb1b6f9SApple OSS Distributions } 475*bbb1b6f9SApple OSS Distributions 476*bbb1b6f9SApple OSS Distributions if_rxpoll_sample_holdtime = q; 477*bbb1b6f9SApple OSS Distributions 478*bbb1b6f9SApple OSS Distributions return err; 479*bbb1b6f9SApple OSS Distributions } 480*bbb1b6f9SApple OSS Distributions 481*bbb1b6f9SApple OSS Distributions static int 482*bbb1b6f9SApple OSS Distributions sysctl_rxpoll_interval_time SYSCTL_HANDLER_ARGS 483*bbb1b6f9SApple OSS Distributions { 484*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 485*bbb1b6f9SApple OSS Distributions uint64_t q; 486*bbb1b6f9SApple OSS Distributions int err; 487*bbb1b6f9SApple OSS Distributions 488*bbb1b6f9SApple OSS Distributions q = if_rxpoll_interval_time; 489*bbb1b6f9SApple OSS Distributions 490*bbb1b6f9SApple OSS Distributions err = sysctl_handle_quad(oidp, &q, 0, req); 491*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 492*bbb1b6f9SApple OSS Distributions return err; 493*bbb1b6f9SApple OSS Distributions } 494*bbb1b6f9SApple OSS Distributions 495*bbb1b6f9SApple OSS Distributions if (q < IF_RXPOLL_INTERVALTIME_MIN) { 496*bbb1b6f9SApple OSS Distributions q = IF_RXPOLL_INTERVALTIME_MIN; 497*bbb1b6f9SApple OSS Distributions } 498*bbb1b6f9SApple OSS Distributions 499*bbb1b6f9SApple OSS Distributions if_rxpoll_interval_time = q; 500*bbb1b6f9SApple OSS Distributions 501*bbb1b6f9SApple OSS Distributions return err; 502*bbb1b6f9SApple OSS Distributions } 503*bbb1b6f9SApple OSS Distributions 504*bbb1b6f9SApple OSS Distributions static int 505*bbb1b6f9SApple OSS Distributions sysctl_rxpoll_wlowat SYSCTL_HANDLER_ARGS 506*bbb1b6f9SApple OSS Distributions { 507*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 508*bbb1b6f9SApple OSS Distributions uint32_t i; 509*bbb1b6f9SApple OSS Distributions int err; 510*bbb1b6f9SApple OSS Distributions 511*bbb1b6f9SApple OSS Distributions i = if_sysctl_rxpoll_wlowat; 512*bbb1b6f9SApple OSS Distributions 513*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 514*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 515*bbb1b6f9SApple OSS Distributions return err; 516*bbb1b6f9SApple OSS Distributions } 517*bbb1b6f9SApple OSS Distributions 518*bbb1b6f9SApple OSS Distributions if (i == 0 || i >= if_sysctl_rxpoll_whiwat) { 519*bbb1b6f9SApple OSS Distributions return EINVAL; 520*bbb1b6f9SApple OSS Distributions } 521*bbb1b6f9SApple OSS Distributions 522*bbb1b6f9SApple OSS Distributions if_sysctl_rxpoll_wlowat = i; 523*bbb1b6f9SApple OSS Distributions return err; 524*bbb1b6f9SApple OSS Distributions } 525*bbb1b6f9SApple OSS Distributions 526*bbb1b6f9SApple OSS Distributions static int 527*bbb1b6f9SApple OSS Distributions sysctl_rxpoll_whiwat SYSCTL_HANDLER_ARGS 528*bbb1b6f9SApple OSS Distributions { 529*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 530*bbb1b6f9SApple OSS Distributions uint32_t i; 531*bbb1b6f9SApple OSS Distributions int err; 532*bbb1b6f9SApple OSS Distributions 533*bbb1b6f9SApple OSS Distributions i = if_sysctl_rxpoll_whiwat; 534*bbb1b6f9SApple OSS Distributions 535*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 536*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 537*bbb1b6f9SApple OSS Distributions return err; 538*bbb1b6f9SApple OSS Distributions } 539*bbb1b6f9SApple OSS Distributions 540*bbb1b6f9SApple OSS Distributions if (i <= if_sysctl_rxpoll_wlowat) { 541*bbb1b6f9SApple OSS Distributions return EINVAL; 542*bbb1b6f9SApple OSS Distributions } 543*bbb1b6f9SApple OSS Distributions 544*bbb1b6f9SApple OSS Distributions if_sysctl_rxpoll_whiwat = i; 545*bbb1b6f9SApple OSS Distributions return err; 546*bbb1b6f9SApple OSS Distributions } 547*bbb1b6f9SApple OSS Distributions 548*bbb1b6f9SApple OSS Distributions static int 549*bbb1b6f9SApple OSS Distributions sysctl_sndq_maxlen SYSCTL_HANDLER_ARGS 550*bbb1b6f9SApple OSS Distributions { 551*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 552*bbb1b6f9SApple OSS Distributions int i, err; 553*bbb1b6f9SApple OSS Distributions 554*bbb1b6f9SApple OSS Distributions i = if_sndq_maxlen; 555*bbb1b6f9SApple OSS Distributions 556*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 557*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 558*bbb1b6f9SApple OSS Distributions return err; 559*bbb1b6f9SApple OSS Distributions } 560*bbb1b6f9SApple OSS Distributions 561*bbb1b6f9SApple OSS Distributions if (i < IF_SNDQ_MINLEN) { 562*bbb1b6f9SApple OSS Distributions i = IF_SNDQ_MINLEN; 563*bbb1b6f9SApple OSS Distributions } 564*bbb1b6f9SApple OSS Distributions 565*bbb1b6f9SApple OSS Distributions if_sndq_maxlen = i; 566*bbb1b6f9SApple OSS Distributions return err; 567*bbb1b6f9SApple OSS Distributions } 568*bbb1b6f9SApple OSS Distributions 569*bbb1b6f9SApple OSS Distributions static int 570*bbb1b6f9SApple OSS Distributions sysctl_rcvq_maxlen SYSCTL_HANDLER_ARGS 571*bbb1b6f9SApple OSS Distributions { 572*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 573*bbb1b6f9SApple OSS Distributions int i, err; 574*bbb1b6f9SApple OSS Distributions 575*bbb1b6f9SApple OSS Distributions i = if_rcvq_maxlen; 576*bbb1b6f9SApple OSS Distributions 577*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 578*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 579*bbb1b6f9SApple OSS Distributions return err; 580*bbb1b6f9SApple OSS Distributions } 581*bbb1b6f9SApple OSS Distributions 582*bbb1b6f9SApple OSS Distributions if (i < IF_RCVQ_MINLEN) { 583*bbb1b6f9SApple OSS Distributions i = IF_RCVQ_MINLEN; 584*bbb1b6f9SApple OSS Distributions } 585*bbb1b6f9SApple OSS Distributions 586*bbb1b6f9SApple OSS Distributions if_rcvq_maxlen = i; 587*bbb1b6f9SApple OSS Distributions return err; 588*bbb1b6f9SApple OSS Distributions } 589*bbb1b6f9SApple OSS Distributions 590*bbb1b6f9SApple OSS Distributions static int 591*bbb1b6f9SApple OSS Distributions sysctl_rcvq_burst_limit SYSCTL_HANDLER_ARGS 592*bbb1b6f9SApple OSS Distributions { 593*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 594*bbb1b6f9SApple OSS Distributions int i, err; 595*bbb1b6f9SApple OSS Distributions 596*bbb1b6f9SApple OSS Distributions i = if_rcvq_burst_limit; 597*bbb1b6f9SApple OSS Distributions 598*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 599*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 600*bbb1b6f9SApple OSS Distributions return err; 601*bbb1b6f9SApple OSS Distributions } 602*bbb1b6f9SApple OSS Distributions 603*bbb1b6f9SApple OSS Distributions /* 604*bbb1b6f9SApple OSS Distributions * Safeguard the burst limit to "sane" values on customer builds. 605*bbb1b6f9SApple OSS Distributions */ 606*bbb1b6f9SApple OSS Distributions #if !(DEVELOPMENT || DEBUG) 607*bbb1b6f9SApple OSS Distributions if (i < IF_RCVQ_BURST_LIMIT_MIN) { 608*bbb1b6f9SApple OSS Distributions i = IF_RCVQ_BURST_LIMIT_MIN; 609*bbb1b6f9SApple OSS Distributions } 610*bbb1b6f9SApple OSS Distributions 611*bbb1b6f9SApple OSS Distributions if (IF_RCVQ_BURST_LIMIT_MAX < i) { 612*bbb1b6f9SApple OSS Distributions i = IF_RCVQ_BURST_LIMIT_MAX; 613*bbb1b6f9SApple OSS Distributions } 614*bbb1b6f9SApple OSS Distributions #endif 615*bbb1b6f9SApple OSS Distributions 616*bbb1b6f9SApple OSS Distributions if_rcvq_burst_limit = i; 617*bbb1b6f9SApple OSS Distributions return err; 618*bbb1b6f9SApple OSS Distributions } 619*bbb1b6f9SApple OSS Distributions 620*bbb1b6f9SApple OSS Distributions static int 621*bbb1b6f9SApple OSS Distributions sysctl_rcvq_trim_pct SYSCTL_HANDLER_ARGS 622*bbb1b6f9SApple OSS Distributions { 623*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 624*bbb1b6f9SApple OSS Distributions int i, err; 625*bbb1b6f9SApple OSS Distributions 626*bbb1b6f9SApple OSS Distributions i = if_rcvq_burst_limit; 627*bbb1b6f9SApple OSS Distributions 628*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 629*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 630*bbb1b6f9SApple OSS Distributions return err; 631*bbb1b6f9SApple OSS Distributions } 632*bbb1b6f9SApple OSS Distributions 633*bbb1b6f9SApple OSS Distributions if (IF_RCVQ_TRIM_PCT_MAX < i) { 634*bbb1b6f9SApple OSS Distributions i = IF_RCVQ_TRIM_PCT_MAX; 635*bbb1b6f9SApple OSS Distributions } 636*bbb1b6f9SApple OSS Distributions 637*bbb1b6f9SApple OSS Distributions if (i < IF_RCVQ_TRIM_PCT_MIN) { 638*bbb1b6f9SApple OSS Distributions i = IF_RCVQ_TRIM_PCT_MIN; 639*bbb1b6f9SApple OSS Distributions } 640*bbb1b6f9SApple OSS Distributions 641*bbb1b6f9SApple OSS Distributions if_rcvq_trim_pct = i; 642*bbb1b6f9SApple OSS Distributions return err; 643*bbb1b6f9SApple OSS Distributions } 644*bbb1b6f9SApple OSS Distributions 645*bbb1b6f9SApple OSS Distributions static int 646*bbb1b6f9SApple OSS Distributions sysctl_hwcksum_dbg_mode SYSCTL_HANDLER_ARGS 647*bbb1b6f9SApple OSS Distributions { 648*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 649*bbb1b6f9SApple OSS Distributions uint32_t i; 650*bbb1b6f9SApple OSS Distributions int err; 651*bbb1b6f9SApple OSS Distributions 652*bbb1b6f9SApple OSS Distributions i = hwcksum_dbg_mode; 653*bbb1b6f9SApple OSS Distributions 654*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 655*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 656*bbb1b6f9SApple OSS Distributions return err; 657*bbb1b6f9SApple OSS Distributions } 658*bbb1b6f9SApple OSS Distributions 659*bbb1b6f9SApple OSS Distributions if (hwcksum_dbg == 0) { 660*bbb1b6f9SApple OSS Distributions return ENODEV; 661*bbb1b6f9SApple OSS Distributions } 662*bbb1b6f9SApple OSS Distributions 663*bbb1b6f9SApple OSS Distributions if ((i & ~HWCKSUM_DBG_MASK) != 0) { 664*bbb1b6f9SApple OSS Distributions return EINVAL; 665*bbb1b6f9SApple OSS Distributions } 666*bbb1b6f9SApple OSS Distributions 667*bbb1b6f9SApple OSS Distributions hwcksum_dbg_mode = (i & HWCKSUM_DBG_MASK); 668*bbb1b6f9SApple OSS Distributions 669*bbb1b6f9SApple OSS Distributions return err; 670*bbb1b6f9SApple OSS Distributions } 671*bbb1b6f9SApple OSS Distributions 672*bbb1b6f9SApple OSS Distributions static int 673*bbb1b6f9SApple OSS Distributions sysctl_hwcksum_dbg_partial_rxoff_forced SYSCTL_HANDLER_ARGS 674*bbb1b6f9SApple OSS Distributions { 675*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 676*bbb1b6f9SApple OSS Distributions u_int32_t i; 677*bbb1b6f9SApple OSS Distributions int err; 678*bbb1b6f9SApple OSS Distributions 679*bbb1b6f9SApple OSS Distributions i = hwcksum_dbg_partial_rxoff_forced; 680*bbb1b6f9SApple OSS Distributions 681*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 682*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 683*bbb1b6f9SApple OSS Distributions return err; 684*bbb1b6f9SApple OSS Distributions } 685*bbb1b6f9SApple OSS Distributions 686*bbb1b6f9SApple OSS Distributions if (!(hwcksum_dbg_mode & HWCKSUM_DBG_PARTIAL_FORCED)) { 687*bbb1b6f9SApple OSS Distributions return ENODEV; 688*bbb1b6f9SApple OSS Distributions } 689*bbb1b6f9SApple OSS Distributions 690*bbb1b6f9SApple OSS Distributions hwcksum_dbg_partial_rxoff_forced = i; 691*bbb1b6f9SApple OSS Distributions 692*bbb1b6f9SApple OSS Distributions return err; 693*bbb1b6f9SApple OSS Distributions } 694*bbb1b6f9SApple OSS Distributions 695*bbb1b6f9SApple OSS Distributions static int 696*bbb1b6f9SApple OSS Distributions sysctl_hwcksum_dbg_partial_rxoff_adj SYSCTL_HANDLER_ARGS 697*bbb1b6f9SApple OSS Distributions { 698*bbb1b6f9SApple OSS Distributions #pragma unused(arg1, arg2) 699*bbb1b6f9SApple OSS Distributions u_int32_t i; 700*bbb1b6f9SApple OSS Distributions int err; 701*bbb1b6f9SApple OSS Distributions 702*bbb1b6f9SApple OSS Distributions i = hwcksum_dbg_partial_rxoff_adj; 703*bbb1b6f9SApple OSS Distributions 704*bbb1b6f9SApple OSS Distributions err = sysctl_handle_int(oidp, &i, 0, req); 705*bbb1b6f9SApple OSS Distributions if (err != 0 || req->newptr == USER_ADDR_NULL) { 706*bbb1b6f9SApple OSS Distributions return err; 707*bbb1b6f9SApple OSS Distributions } 708*bbb1b6f9SApple OSS Distributions 709*bbb1b6f9SApple OSS Distributions if (!(hwcksum_dbg_mode & HWCKSUM_DBG_PARTIAL_RXOFF_ADJ)) { 710*bbb1b6f9SApple OSS Distributions return ENODEV; 711*bbb1b6f9SApple OSS Distributions } 712*bbb1b6f9SApple OSS Distributions 713*bbb1b6f9SApple OSS Distributions hwcksum_dbg_partial_rxoff_adj = i; 714*bbb1b6f9SApple OSS Distributions 715*bbb1b6f9SApple OSS Distributions return err; 716*bbb1b6f9SApple OSS Distributions } 717*bbb1b6f9SApple OSS Distributions 718*bbb1b6f9SApple OSS Distributions static int 719*bbb1b6f9SApple OSS Distributions sysctl_tx_chain_len_stats SYSCTL_HANDLER_ARGS 720*bbb1b6f9SApple OSS Distributions { 721*bbb1b6f9SApple OSS Distributions #pragma unused(oidp, arg1, arg2) 722*bbb1b6f9SApple OSS Distributions int err; 723*bbb1b6f9SApple OSS Distributions 724*bbb1b6f9SApple OSS Distributions if (req->oldptr == USER_ADDR_NULL) { 725*bbb1b6f9SApple OSS Distributions } 726*bbb1b6f9SApple OSS Distributions if (req->newptr != USER_ADDR_NULL) { 727*bbb1b6f9SApple OSS Distributions return EPERM; 728*bbb1b6f9SApple OSS Distributions } 729*bbb1b6f9SApple OSS Distributions err = SYSCTL_OUT(req, &tx_chain_len_stats, 730*bbb1b6f9SApple OSS Distributions sizeof(struct chain_len_stats)); 731*bbb1b6f9SApple OSS Distributions 732*bbb1b6f9SApple OSS Distributions return err; 733*bbb1b6f9SApple OSS Distributions } 734*bbb1b6f9SApple OSS Distributions 735*bbb1b6f9SApple OSS Distributions #if (DEVELOPMENT || DEBUG) 736*bbb1b6f9SApple OSS Distributions /* 737*bbb1b6f9SApple OSS Distributions * The sysctl variable name contains the input parameters of 738*bbb1b6f9SApple OSS Distributions * ifnet_get_keepalive_offload_frames() 739*bbb1b6f9SApple OSS Distributions * ifp (interface index): name[0] 740*bbb1b6f9SApple OSS Distributions * frames_array_count: name[1] 741*bbb1b6f9SApple OSS Distributions * frame_data_offset: name[2] 742*bbb1b6f9SApple OSS Distributions * The return length gives used_frames_count 743*bbb1b6f9SApple OSS Distributions */ 744*bbb1b6f9SApple OSS Distributions static int 745*bbb1b6f9SApple OSS Distributions sysctl_get_kao_frames SYSCTL_HANDLER_ARGS 746*bbb1b6f9SApple OSS Distributions { 747*bbb1b6f9SApple OSS Distributions #pragma unused(oidp) 748*bbb1b6f9SApple OSS Distributions DECLARE_SYSCTL_HANDLER_ARG_ARRAY(int, 3, name, namelen); 749*bbb1b6f9SApple OSS Distributions int idx; 750*bbb1b6f9SApple OSS Distributions ifnet_t ifp = NULL; 751*bbb1b6f9SApple OSS Distributions u_int32_t frames_array_count; 752*bbb1b6f9SApple OSS Distributions size_t frame_data_offset; 753*bbb1b6f9SApple OSS Distributions u_int32_t used_frames_count; 754*bbb1b6f9SApple OSS Distributions struct ifnet_keepalive_offload_frame *frames_array = NULL; 755*bbb1b6f9SApple OSS Distributions int error = 0; 756*bbb1b6f9SApple OSS Distributions u_int32_t i; 757*bbb1b6f9SApple OSS Distributions 758*bbb1b6f9SApple OSS Distributions /* 759*bbb1b6f9SApple OSS Distributions * Only root can get look at other people TCP frames 760*bbb1b6f9SApple OSS Distributions */ 761*bbb1b6f9SApple OSS Distributions error = proc_suser(current_proc()); 762*bbb1b6f9SApple OSS Distributions if (error != 0) { 763*bbb1b6f9SApple OSS Distributions goto done; 764*bbb1b6f9SApple OSS Distributions } 765*bbb1b6f9SApple OSS Distributions /* 766*bbb1b6f9SApple OSS Distributions * Validate the input parameters 767*bbb1b6f9SApple OSS Distributions */ 768*bbb1b6f9SApple OSS Distributions if (req->newptr != USER_ADDR_NULL) { 769*bbb1b6f9SApple OSS Distributions error = EPERM; 770*bbb1b6f9SApple OSS Distributions goto done; 771*bbb1b6f9SApple OSS Distributions } 772*bbb1b6f9SApple OSS Distributions if (req->oldptr == USER_ADDR_NULL) { 773*bbb1b6f9SApple OSS Distributions error = EINVAL; 774*bbb1b6f9SApple OSS Distributions goto done; 775*bbb1b6f9SApple OSS Distributions } 776*bbb1b6f9SApple OSS Distributions if (req->oldlen == 0) { 777*bbb1b6f9SApple OSS Distributions error = EINVAL; 778*bbb1b6f9SApple OSS Distributions goto done; 779*bbb1b6f9SApple OSS Distributions } 780*bbb1b6f9SApple OSS Distributions idx = name[0]; 781*bbb1b6f9SApple OSS Distributions frames_array_count = name[1]; 782*bbb1b6f9SApple OSS Distributions frame_data_offset = name[2]; 783*bbb1b6f9SApple OSS Distributions 784*bbb1b6f9SApple OSS Distributions /* Make sure the passed buffer is large enough */ 785*bbb1b6f9SApple OSS Distributions if (frames_array_count * sizeof(struct ifnet_keepalive_offload_frame) > 786*bbb1b6f9SApple OSS Distributions req->oldlen) { 787*bbb1b6f9SApple OSS Distributions error = ENOMEM; 788*bbb1b6f9SApple OSS Distributions goto done; 789*bbb1b6f9SApple OSS Distributions } 790*bbb1b6f9SApple OSS Distributions 791*bbb1b6f9SApple OSS Distributions ifnet_head_lock_shared(); 792*bbb1b6f9SApple OSS Distributions if (!IF_INDEX_IN_RANGE(idx)) { 793*bbb1b6f9SApple OSS Distributions ifnet_head_done(); 794*bbb1b6f9SApple OSS Distributions error = ENOENT; 795*bbb1b6f9SApple OSS Distributions goto done; 796*bbb1b6f9SApple OSS Distributions } 797*bbb1b6f9SApple OSS Distributions ifp = ifindex2ifnet[idx]; 798*bbb1b6f9SApple OSS Distributions ifnet_head_done(); 799*bbb1b6f9SApple OSS Distributions 800*bbb1b6f9SApple OSS Distributions frames_array = (struct ifnet_keepalive_offload_frame *)kalloc_data( 801*bbb1b6f9SApple OSS Distributions frames_array_count * sizeof(struct ifnet_keepalive_offload_frame), 802*bbb1b6f9SApple OSS Distributions Z_WAITOK); 803*bbb1b6f9SApple OSS Distributions if (frames_array == NULL) { 804*bbb1b6f9SApple OSS Distributions error = ENOMEM; 805*bbb1b6f9SApple OSS Distributions goto done; 806*bbb1b6f9SApple OSS Distributions } 807*bbb1b6f9SApple OSS Distributions 808*bbb1b6f9SApple OSS Distributions error = ifnet_get_keepalive_offload_frames(ifp, frames_array, 809*bbb1b6f9SApple OSS Distributions frames_array_count, frame_data_offset, &used_frames_count); 810*bbb1b6f9SApple OSS Distributions if (error != 0) { 811*bbb1b6f9SApple OSS Distributions DLIL_PRINTF("%s: ifnet_get_keepalive_offload_frames error %d\n", 812*bbb1b6f9SApple OSS Distributions __func__, error); 813*bbb1b6f9SApple OSS Distributions goto done; 814*bbb1b6f9SApple OSS Distributions } 815*bbb1b6f9SApple OSS Distributions 816*bbb1b6f9SApple OSS Distributions for (i = 0; i < used_frames_count; i++) { 817*bbb1b6f9SApple OSS Distributions error = SYSCTL_OUT(req, frames_array + i, 818*bbb1b6f9SApple OSS Distributions sizeof(struct ifnet_keepalive_offload_frame)); 819*bbb1b6f9SApple OSS Distributions if (error != 0) { 820*bbb1b6f9SApple OSS Distributions goto done; 821*bbb1b6f9SApple OSS Distributions } 822*bbb1b6f9SApple OSS Distributions } 823*bbb1b6f9SApple OSS Distributions done: 824*bbb1b6f9SApple OSS Distributions if (frames_array != NULL) { 825*bbb1b6f9SApple OSS Distributions kfree_data(frames_array, frames_array_count * 826*bbb1b6f9SApple OSS Distributions sizeof(struct ifnet_keepalive_offload_frame)); 827*bbb1b6f9SApple OSS Distributions } 828*bbb1b6f9SApple OSS Distributions return error; 829*bbb1b6f9SApple OSS Distributions } 830*bbb1b6f9SApple OSS Distributions 831*bbb1b6f9SApple OSS Distributions static int 832*bbb1b6f9SApple OSS Distributions if_attach_nx_sysctl SYSCTL_HANDLER_ARGS 833*bbb1b6f9SApple OSS Distributions { 834*bbb1b6f9SApple OSS Distributions #pragma unused(oidp, arg1, arg2) 835*bbb1b6f9SApple OSS Distributions unsigned int new_value; 836*bbb1b6f9SApple OSS Distributions int changed; 837*bbb1b6f9SApple OSS Distributions int error = sysctl_io_number(req, if_attach_nx, sizeof(if_attach_nx), 838*bbb1b6f9SApple OSS Distributions &new_value, &changed); 839*bbb1b6f9SApple OSS Distributions if (error) { 840*bbb1b6f9SApple OSS Distributions return error; 841*bbb1b6f9SApple OSS Distributions } 842*bbb1b6f9SApple OSS Distributions if (changed) { 843*bbb1b6f9SApple OSS Distributions if ((new_value & IF_ATTACH_NX_FSW_TRANSPORT_NETAGENT) != 844*bbb1b6f9SApple OSS Distributions (if_attach_nx & IF_ATTACH_NX_FSW_TRANSPORT_NETAGENT)) { 845*bbb1b6f9SApple OSS Distributions return ENOTSUP; 846*bbb1b6f9SApple OSS Distributions } 847*bbb1b6f9SApple OSS Distributions if_attach_nx = new_value; 848*bbb1b6f9SApple OSS Distributions } 849*bbb1b6f9SApple OSS Distributions return 0; 850*bbb1b6f9SApple OSS Distributions } 851*bbb1b6f9SApple OSS Distributions 852*bbb1b6f9SApple OSS Distributions #endif /* DEVELOPMENT || DEBUG */ 853*bbb1b6f9SApple OSS Distributions 854*bbb1b6f9SApple OSS Distributions static int 855*bbb1b6f9SApple OSS Distributions if_enable_fsw_transport_netagent_sysctl SYSCTL_HANDLER_ARGS 856*bbb1b6f9SApple OSS Distributions { 857*bbb1b6f9SApple OSS Distributions #pragma unused(oidp, arg1, arg2) 858*bbb1b6f9SApple OSS Distributions unsigned int new_value; 859*bbb1b6f9SApple OSS Distributions int changed; 860*bbb1b6f9SApple OSS Distributions int error; 861*bbb1b6f9SApple OSS Distributions 862*bbb1b6f9SApple OSS Distributions error = sysctl_io_number(req, if_enable_fsw_transport_netagent, 863*bbb1b6f9SApple OSS Distributions sizeof(if_enable_fsw_transport_netagent), 864*bbb1b6f9SApple OSS Distributions &new_value, &changed); 865*bbb1b6f9SApple OSS Distributions if (error == 0 && changed != 0) { 866*bbb1b6f9SApple OSS Distributions if (new_value != 0 && new_value != 1) { 867*bbb1b6f9SApple OSS Distributions /* only allow 0 or 1 */ 868*bbb1b6f9SApple OSS Distributions error = EINVAL; 869*bbb1b6f9SApple OSS Distributions } else if ((if_attach_nx & IF_ATTACH_NX_FSW_TRANSPORT_NETAGENT) != 0) { 870*bbb1b6f9SApple OSS Distributions /* netagent can be enabled/disabled */ 871*bbb1b6f9SApple OSS Distributions if_enable_fsw_transport_netagent = new_value; 872*bbb1b6f9SApple OSS Distributions if (new_value == 0) { 873*bbb1b6f9SApple OSS Distributions kern_nexus_deregister_netagents(); 874*bbb1b6f9SApple OSS Distributions } else { 875*bbb1b6f9SApple OSS Distributions kern_nexus_register_netagents(); 876*bbb1b6f9SApple OSS Distributions } 877*bbb1b6f9SApple OSS Distributions } else { 878*bbb1b6f9SApple OSS Distributions /* netagent can't be enabled */ 879*bbb1b6f9SApple OSS Distributions error = ENOTSUP; 880*bbb1b6f9SApple OSS Distributions } 881*bbb1b6f9SApple OSS Distributions } 882*bbb1b6f9SApple OSS Distributions return error; 883*bbb1b6f9SApple OSS Distributions } 884