xref: /xnu-12377.41.6/bsd/net/dlil_sysctl.c (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
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