xref: /xnu-10002.61.3/bsd/net/if_var_status.h (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
1 /*
2  * Copyright (c) 2000-2021 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * Copyright (c) 1982, 1986, 1989, 1993
30  *    The Regents of the University of California.  All rights reserved.
31  *
32  * Redistribution and use in source and binary forms, with or without
33  * modification, are permitted provided that the following conditions
34  * are met:
35  * 1. Redistributions of source code must retain the above copyright
36  *    notice, this list of conditions and the following disclaimer.
37  * 2. Redistributions in binary form must reproduce the above copyright
38  *    notice, this list of conditions and the following disclaimer in the
39  *    documentation and/or other materials provided with the distribution.
40  * 3. All advertising materials mentioning features or use of this software
41  *    must display the following acknowledgement:
42  *    This product includes software developed by the University of
43  *    California, Berkeley and its contributors.
44  * 4. Neither the name of the University nor the names of its contributors
45  *    may be used to endorse or promote products derived from this software
46  *    without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58  * SUCH DAMAGE.
59  *
60  *    From: @(#)if.h    8.1 (Berkeley) 6/10/93
61  * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.7 2001/07/24 19:10:18 brooks Exp $
62  */
63 
64 #ifndef _NET_IF_VAR_STATUS_H_
65 #define _NET_IF_VAR_STATUS_H_
66 
67 #include <machine/types.h>
68 #include <stdint.h>
69 
70 #pragma pack(4)
71 
72 /*
73  * Interface link status report -- includes statistics related to
74  * the link layer technology sent by the driver. The driver will monitor
75  * these statistics over an interval (3-4 secs) and will generate a report
76  * to the network stack. This will give first-hand information about the
77  * status of the first hop of the network path. The version and
78  * length values should be correct for the data to be processed correctly.
79  * The definitions are different for different kind of interfaces like
80  * Wifi, Cellular etc,.
81  */
82 #define IF_CELLULAR_STATUS_REPORT_VERSION_1     1
83 #define IF_WIFI_STATUS_REPORT_VERSION_1         1
84 #define IF_CELLULAR_STATUS_REPORT_CURRENT_VERSION       \
85 	                                IF_CELLULAR_STATUS_REPORT_VERSION_1
86 #define IF_WIFI_STATUS_REPORT_CURRENT_VERSION   IF_WIFI_STATUS_REPORT_VERSION_1
87 /*
88  * For cellular interface --
89  * There is no way to share common headers between the Baseband and
90  * the kernel. Any changes to this structure will need to be communicated
91  * to the Baseband team. It is better to use reserved space instead of
92  * changing the size or existing fields in the structure.
93  */
94 struct if_cellular_status_v1 {
95 	u_int32_t valid_bitmask;     /* indicates which fields are valid */
96 #define IF_CELL_LINK_QUALITY_METRIC_VALID       0x1
97 #define IF_CELL_UL_EFFECTIVE_BANDWIDTH_VALID    0x2
98 #define IF_CELL_UL_MAX_BANDWIDTH_VALID          0x4
99 #define IF_CELL_UL_MIN_LATENCY_VALID            0x8
100 #define IF_CELL_UL_EFFECTIVE_LATENCY_VALID      0x10
101 #define IF_CELL_UL_MAX_LATENCY_VALID            0x20
102 #define IF_CELL_UL_RETXT_LEVEL_VALID            0x40
103 #define IF_CELL_UL_BYTES_LOST_VALID             0x80
104 #define IF_CELL_UL_MIN_QUEUE_SIZE_VALID         0x100
105 #define IF_CELL_UL_AVG_QUEUE_SIZE_VALID         0x200
106 #define IF_CELL_UL_MAX_QUEUE_SIZE_VALID         0x400
107 #define IF_CELL_DL_EFFECTIVE_BANDWIDTH_VALID    0x800
108 #define IF_CELL_DL_MAX_BANDWIDTH_VALID          0x1000
109 #define IF_CELL_CONFIG_INACTIVITY_TIME_VALID    0x2000
110 #define IF_CELL_CONFIG_BACKOFF_TIME_VALID       0x4000
111 #define IF_CELL_UL_MSS_RECOMMENDED_VALID        0x8000
112 
113 	u_int32_t link_quality_metric;
114 	u_int32_t ul_effective_bandwidth; /* Measured uplink bandwidth based on current activity (bps) */
115 	u_int32_t ul_max_bandwidth; /* Maximum supported uplink bandwidth (bps) */
116 	u_int32_t ul_min_latency; /* min expected uplink latency for first hop (ms) */
117 	u_int32_t ul_effective_latency; /* current expected uplink latency for first hop (ms) */
118 	u_int32_t ul_max_latency; /* max expected uplink latency first hop (ms) */
119 	u_int32_t ul_retxt_level; /* Retransmission metric */
120 #define IF_CELL_UL_RETXT_LEVEL_NONE     1
121 #define IF_CELL_UL_RETXT_LEVEL_LOW      2
122 #define IF_CELL_UL_RETXT_LEVEL_MEDIUM   3
123 #define IF_CELL_UL_RETXT_LEVEL_HIGH     4
124 	u_int32_t ul_bytes_lost; /* % of total bytes lost on uplink in Q10 format */
125 	u_int32_t ul_min_queue_size; /* minimum bytes in queue */
126 	u_int32_t ul_avg_queue_size; /* average bytes in queue */
127 	u_int32_t ul_max_queue_size; /* maximum bytes in queue */
128 	u_int32_t dl_effective_bandwidth; /* Measured downlink bandwidth based on current activity (bps) */
129 	u_int32_t dl_max_bandwidth; /* Maximum supported downlink bandwidth (bps) */
130 	u_int32_t config_inactivity_time; /* ms */
131 	u_int32_t config_backoff_time; /* new connections backoff time in ms */
132 #define IF_CELL_UL_MSS_RECOMMENDED_NONE 0x0 /* Use default */
133 #define IF_CELL_UL_MSS_RECOMMENDED_MEDIUM 0x1 /* 1200 byte MSS */
134 #define IF_CELL_UL_MSS_RECOMMENDED_LOW  0x2 /* 512 byte MSS */
135 	u_int16_t mss_recommended;
136 	u_int16_t reserved_1;
137 	u_int32_t reserved_2;
138 	u_int64_t reserved_3;
139 	u_int64_t reserved_4;
140 	u_int64_t reserved_5;
141 	u_int64_t reserved_6;
142 } __attribute__((packed));
143 
144 struct if_cellular_status {
145 	union {
146 		struct if_cellular_status_v1 if_status_v1;
147 	} if_cell_u;
148 };
149 
150 /*
151  * These statistics will be provided by the Wifi driver periodically.
152  * After sending each report, the driver should start computing again
153  * for the next report duration so that the values represent the link
154  * status for one report duration.
155  */
156 
157 struct if_wifi_status_v1 {
158 	u_int32_t valid_bitmask;
159 #define IF_WIFI_LINK_QUALITY_METRIC_VALID       0x1
160 #define IF_WIFI_UL_EFFECTIVE_BANDWIDTH_VALID    0x2
161 #define IF_WIFI_UL_MAX_BANDWIDTH_VALID          0x4
162 #define IF_WIFI_UL_MIN_LATENCY_VALID            0x8
163 #define IF_WIFI_UL_EFFECTIVE_LATENCY_VALID      0x10
164 #define IF_WIFI_UL_MAX_LATENCY_VALID            0x20
165 #define IF_WIFI_UL_RETXT_LEVEL_VALID            0x40
166 #define IF_WIFI_UL_ERROR_RATE_VALID             0x80
167 #define IF_WIFI_UL_BYTES_LOST_VALID             0x100
168 #define IF_WIFI_DL_EFFECTIVE_BANDWIDTH_VALID    0x200
169 #define IF_WIFI_DL_MAX_BANDWIDTH_VALID          0x400
170 #define IF_WIFI_DL_MIN_LATENCY_VALID            0x800
171 #define IF_WIFI_DL_EFFECTIVE_LATENCY_VALID      0x1000
172 #define IF_WIFI_DL_MAX_LATENCY_VALID            0x2000
173 #define IF_WIFI_DL_ERROR_RATE_VALID             0x4000
174 #define IF_WIFI_CONFIG_FREQUENCY_VALID          0x8000
175 #define IF_WIFI_CONFIG_MULTICAST_RATE_VALID     0x10000
176 #define IF_WIFI_CONFIG_SCAN_COUNT_VALID         0x20000
177 #define IF_WIFI_CONFIG_SCAN_DURATION_VALID      0x40000
178 	u_int32_t link_quality_metric; /* link quality metric */
179 	u_int32_t ul_effective_bandwidth; /* Measured uplink bandwidth based on current activity (bps) */
180 	u_int32_t ul_max_bandwidth; /* Maximum supported uplink bandwidth (bps) */
181 	u_int32_t ul_min_latency; /* min expected uplink latency for first hop (ms) */
182 	u_int32_t ul_effective_latency; /* current expected uplink latency for first hop (ms) */
183 	u_int32_t ul_max_latency; /* max expected uplink latency for first hop (ms) */
184 	u_int32_t ul_retxt_level; /* Retransmission metric */
185 #define IF_WIFI_UL_RETXT_LEVEL_NONE     1
186 #define IF_WIFI_UL_RETXT_LEVEL_LOW      2
187 #define IF_WIFI_UL_RETXT_LEVEL_MEDIUM   3
188 #define IF_WIFI_UL_RETXT_LEVEL_HIGH     4
189 	u_int32_t ul_bytes_lost; /* % of total bytes lost on uplink in Q10 format */
190 	u_int32_t ul_error_rate; /* % of bytes dropped on uplink after many retransmissions in Q10 format */
191 	u_int32_t dl_effective_bandwidth; /* Measured downlink bandwidth based on current activity (bps) */
192 	u_int32_t dl_max_bandwidth; /* Maximum supported downlink bandwidth (bps) */
193 	/*
194 	 * The download latency values indicate the time AP may have to wait for the
195 	 * driver to receive the packet. These values give the range of expected latency
196 	 * mainly due to co-existence events and channel hopping where the interface
197 	 * becomes unavailable.
198 	 */
199 	u_int32_t dl_min_latency; /* min expected latency for first hop in ms */
200 	u_int32_t dl_effective_latency; /* current expected latency for first hop in ms */
201 	u_int32_t dl_max_latency; /* max expected latency for first hop in ms */
202 	u_int32_t dl_error_rate; /* % of CRC or other errors in Q10 format */
203 	u_int32_t config_frequency; /* 2.4 or 5 GHz */
204 #define IF_WIFI_CONFIG_FREQUENCY_2_4_GHZ        1
205 #define IF_WIFI_CONFIG_FREQUENCY_5_0_GHZ        2
206 	u_int32_t config_multicast_rate; /* bps */
207 	u_int32_t scan_count; /* scan count during the previous period */
208 	u_int32_t scan_duration; /* scan duration in ms */
209 	u_int64_t reserved_1;
210 	u_int64_t reserved_2;
211 	u_int64_t reserved_3;
212 	u_int64_t reserved_4;
213 } __attribute__((packed));
214 
215 struct if_wifi_status {
216 	union {
217 		struct if_wifi_status_v1 if_status_v1;
218 	} if_wifi_u;
219 };
220 
221 struct if_link_status {
222 	u_int32_t       ifsr_version;   /* version of this report */
223 	u_int32_t       ifsr_len;       /* length of the following struct */
224 	union {
225 		struct if_cellular_status ifsr_cell;
226 		struct if_wifi_status ifsr_wifi;
227 	} ifsr_u;
228 };
229 
230 /*
231  * This structure is used to define the parameters for advisory notifications
232  * on an interface.
233  */
234 #pragma pack(push, 1)
235 enum ifnet_interface_advisory_version : uint8_t {
236 	/*
237 	 * Initial version with interface advisory report for WiFi interface.
238 	 */
239 	IF_INTERFACE_ADVISORY_VERSION_1 = 1,
240 #if XNU_KERNEL_PRIVATE
241 	IF_INTERFACE_ADVISORY_VERSION_MIN = IF_INTERFACE_ADVISORY_VERSION_1,
242 #endif /* XNU_KERNEL_PRIVATE */
243 	/*
244 	 * Reorganized the interface advisory structure to separate out
245 	 * WiFi and Cellular interface specific reports.
246 	 */
247 	IF_INTERFACE_ADVISORY_VERSION_2 = 2,
248 	IF_INTERFACE_ADVISORY_VERSION_CURRENT = IF_INTERFACE_ADVISORY_VERSION_2,
249 #if XNU_KERNEL_PRIVATE
250 	IF_INTERFACE_ADVISORY_VERSION_MAX = IF_INTERFACE_ADVISORY_VERSION_2,
251 #endif /* XNU_KERNEL_PRIVATE */
252 };
253 
254 enum ifnet_interface_advisory_direction : uint8_t {
255 	IF_INTERFACE_ADVISORY_DIRECTION_TX = 1,
256 	IF_INTERFACE_ADVISORY_DIRECTION_RX = 2,
257 };
258 
259 enum ifnet_interface_advisory_interface_type : uint8_t {
260 	IF_INTERFACE_ADVISORY_INTERFACE_TYPE_WIFI = 1,
261 #if XNU_KERNEL_PRIVATE
262 	IF_INTERFACE_ADVISORY_INTERFACE_TYPE_MIN =
263 	    IF_INTERFACE_ADVISORY_INTERFACE_TYPE_WIFI,
264 #endif /* XNU_KERNEL_PRIVATE */
265 	IF_INTERFACE_ADVISORY_INTERFACE_TYPE_CELL = 2,
266 #if XNU_KERNEL_PRIVATE
267 	IF_INTERFACE_ADVISORY_INTERFACE_TYPE_MAX =
268 	    IF_INTERFACE_ADVISORY_INTERFACE_TYPE_CELL,
269 #endif /* XNU_KERNEL_PRIVATE */
270 };
271 
272 struct ifnet_interface_advisory_header {
273 	/* The current structure version */
274 	enum ifnet_interface_advisory_version         version;
275 	/*  Specifies if the advisory is for transmit or receive path */
276 	enum ifnet_interface_advisory_direction       direction;
277 	/* Interface type */
278 	enum ifnet_interface_advisory_interface_type  interface_type;
279 	/* reserved for future use */
280 	uint8_t                                       reserved;
281 };
282 
283 enum ifnet_interface_advisory_rate_trend : int32_t {
284 	IF_INTERFACE_ADVISORY_RATE_SUGGESTION_RAMP_UP = INT32_MAX,
285 	IF_INTERFACE_ADVISORY_RATE_SUGGESTION_RAMP_DOWN = INT32_MIN,
286 	IF_INTERFACE_ADVISORY_RATE_SUGGESTION_RAMP_NEUTRAL = 0,
287 };
288 
289 struct ifnet_interface_advisory_capacity {
290 	/*
291 	 * suggestion for data rate change to keep the latency low.
292 	 * unit: bits per second (bps)
293 	 * NOTE: if the interface cannot provide suggestions in
294 	 * terms of bps, it should use the following values:
295 	 * INT32_MAX : ramp up
296 	 * INT32_MIN : ramp down
297 	 * 0         : neutral
298 	 */
299 	enum ifnet_interface_advisory_rate_trend  rate_trend_suggestion;
300 	/*
301 	 * Time of the issue of advisory.
302 	 * Timestamp should be in the host domain.
303 	 * unit: mach absolute time
304 	 */
305 	uint64_t    timestamp;
306 	/*
307 	 * Maximum theoretical bandwidth of the interface.
308 	 * unit: bits per second (bps)
309 	 */
310 	uint64_t    max_bandwidth;
311 	/*
312 	 * Total bytes sent or received on the interface.
313 	 * wrap around possible and the application should account for that.
314 	 * unit: byte
315 	 */
316 	uint64_t    total_byte_count;
317 	/*
318 	 * average throughput observed at the driver stack.
319 	 * unit: bits per second (bps)
320 	 */
321 	uint64_t    average_throughput;
322 	/*
323 	 * flushable queue size at the driver.
324 	 * should be set to UINT32_MAX if not available.
325 	 * unit: byte
326 	 */
327 	uint32_t    flushable_queue_size;
328 	/*
329 	 * non flushable queue size at the driver.
330 	 * should be set to UINT32_MAX if not available.
331 	 * unit: byte
332 	 */
333 	uint32_t    non_flushable_queue_size;
334 	/*
335 	 * average delay observed at the interface.
336 	 * unit: milliseconds (ms)
337 	 */
338 	uint32_t    average_delay;
339 };
340 
341 enum ifnet_interface_advisory_wifi_freq_band : uint8_t {
342 	IF_INTERFACE_ADVISORY_FREQ_BAND_NOT_AVAIL =  0,
343 	IF_INTERFACE_ADVISORY_FREQ_BAND_WIFI_24GHZ = 1,
344 	IF_INTERFACE_ADVISORY_FREQ_BAND_WIFI_5GHZ =  2,
345 	IF_INTERFACE_ADVISORY_FREQ_BAND_WIFI_6GHZ =  3,
346 };
347 
348 /*
349  * This structure is used to define the parameters for advisory notifications
350  * that are specific for WiFi interface.
351  */
352 struct ifnet_interface_advisory_wifi_context {
353 	/*
354 	 * Current frequency band (enumeration).
355 	 */
356 	enum ifnet_interface_advisory_wifi_freq_band  frequency_band;
357 	/*
358 	 * Intermittent WiFi state [true(1)/false(0)]
359 	 */
360 	uint8_t     intermittent_state;
361 	/*
362 	 * Estimated period for which intermittent state is expected to last.
363 	 * 1 tick -> 1 ms UNDEF => UINT16_MAX
364 	 */
365 	uint16_t    estimated_intermittent_period;
366 	/*
367 	 * Expected wifi outage period during intermittent state
368 	 * 1 tick -> 1 ms UNDEF => UINT16_MAX
369 	 */
370 	uint16_t    single_outage_period;
371 	/*
372 	 * WiFi-BT coexistence, 1-ON, 0-OFF
373 	 */
374 	uint8_t     bt_coex;
375 	/*
376 	 * on scale of 1 to 5
377 	 */
378 	uint8_t     quality_score_delay;
379 	/*
380 	 * on scale of 1 to 5
381 	 */
382 	uint8_t     quality_score_loss;
383 	/*
384 	 * on scale of 1 to 5
385 	 */
386 	uint8_t     quality_score_channel;
387 	/*
388 	 * bitmap of all radio contenders.
389 	 */
390 #define IF_INTERFACE_ADVISORY_WIFI_RADIO_COEX_BT    0x01
391 #define IF_INTERFACE_ADVISORY_WIFI_RADIO_COEX_AWDL  0x02
392 	uint8_t     radio_coex;
393 	/*
394 	 * time available to WiFi since last notification (in ms).
395 	 */
396 	uint16_t    wlan_duty_cycle;
397 	/*
398 	 * bitrate information for each queue (in Kbps).
399 	 */
400 #define IF_INTERFACE_ADVISORY_WIFI_TX_QUEUE_COUNT  6
401 	uint32_t    wifi_observed_tx_bitrate[IF_INTERFACE_ADVISORY_WIFI_TX_QUEUE_COUNT];
402 };
403 
404 /*
405  * This structure is used to define the parameters for advisory notifications
406  * that are specific for Cellular interface.
407  */
408 struct ifnet_interface_advisory_cell_context {
409 	/*
410 	 * Radio Access Technology
411 	 */
412 	uint8_t     radio_access_technology;
413 	/*
414 	 * Received Reference Signal Received level (RSRP dBm)
415 	 */
416 	int16_t     reference_signal_level;
417 	/*
418 	 * Received Signal strength level (RSSI dBm)
419 	 */
420 	int16_t     signal_level;
421 	/*
422 	 * Received signal quality (SNR dB).
423 	 */
424 	int8_t      signal_quality;
425 	/*
426 	 * Uplink Block Error Rate %
427 	 */
428 	uint8_t     uplink_bler;
429 	/*
430 	 * Downlink Block Error Rate %
431 	 */
432 	uint8_t     downlink_bler;
433 	/*
434 	 * Bandwidth Limitation Type. I.e. TTI-B.
435 	 */
436 	uint8_t     bandwidth_limitation_indication;
437 	/*
438 	 * Discontinuous reception state: CDRX on/off.
439 	 */
440 	uint8_t     cdrx_state;
441 	/*
442 	 * Discontinuous reception cycle in ms.
443 	 */
444 	uint16_t    cdrx_cycle;
445 	/*
446 	 * Approximate outage period when not known
447 	 */
448 	uint16_t    estimated_outage_period;
449 	/*
450 	 * Cellular outage state: i.e. handover in progress.
451 	 *     0 - no outage
452 	 *     1 - outage.
453 	 */
454 #define IF_INTERFACE_ADVISORY_CELL_OUTAGE_STATE_NO     0
455 #define IF_INTERFACE_ADVISORY_CELL_OUTAGE_STATE_YES    1
456 	uint8_t     outage_state;
457 	/*
458 	 * padding for alignment.
459 	 */
460 	uint8_t     __pad;
461 };
462 
463 struct ifnet_interface_advisory {
464 	union {
465 		struct { /* version 1 structure (to be deprecated) */
466 			/* The current structure version */
467 			uint8_t     version;
468 			/*  Specifies if the advisory is for transmit or receive path */
469 			uint8_t     direction;
470 			/* reserved for future use */
471 			uint16_t    _reserved;
472 			/*
473 			 * suggestion for data rate change to keep the latency low.
474 			 * unit: bits per second (bps)
475 			 * NOTE: if the interface cannot provide suggestions in terms of bps,
476 			 * it should use the following values:
477 			 * INT32_MAX : ramp up
478 			 * INT32_MIN : ramp down
479 			 * 0         : neutral
480 			 */
481 			int32_t     rate_trend_suggestion;
482 			/*
483 			 * Time of the issue of advisory.
484 			 * Timestamp should be in the host domain.
485 			 * unit: mach absolute time
486 			 */
487 			uint64_t    timestamp;
488 			/*
489 			 * Maximum theoretical bandwidth of the interface.
490 			 * unit: bits per second (bps)
491 			 */
492 			uint64_t    max_bandwidth;
493 			/*
494 			 * Total bytes sent or received on the interface.
495 			 * wrap around possible and the application should account for that.
496 			 * unit: byte
497 			 */
498 			uint64_t    total_byte_count;
499 			/*
500 			 * average throughput observed at the driver stack.
501 			 * unit: bits per second (bps)
502 			 */
503 			uint64_t    average_throughput;
504 			/*
505 			 * flushable queue size at the driver.
506 			 * should be set to UINT32_MAX if not available.
507 			 * unit: byte
508 			 */
509 			uint32_t    flushable_queue_size;
510 			/*
511 			 * non flushable queue size at the driver.
512 			 * should be set to UINT32_MAX if not available.
513 			 * unit: byte
514 			 */
515 			uint32_t    non_flushable_queue_size;
516 			/*
517 			 * average delay observed at the interface.
518 			 * unit: milliseconds (ms)
519 			 */
520 			uint32_t    average_delay;
521 			/*
522 			 * Current frequency band (enumeration).
523 			 */
524 			uint8_t    frequency_band;
525 			/*
526 			 * Intermittent WiFi state [true(1)/false(0)]
527 			 */
528 			uint8_t     intermittent_state;
529 			/*
530 			 * Estimated period for which intermittent state is expected to last.
531 			 * 1 tick -> 1 ms UNDEF => UINT16_MAX
532 			 */
533 			uint16_t    estimated_intermittent_period;
534 			/*
535 			 * Expected wifi outage period during intermittent state
536 			 * 1 tick -> 1 ms UNDEF => UINT16_MAX
537 			 */
538 			uint16_t    single_outage_period;
539 
540 			/*
541 			 * WiFi-BT coexistence, 1-ON, 0-OFF
542 			 */
543 			uint8_t     bt_coex;
544 			/*
545 			 * on scale of 1 to 5
546 			 */
547 			uint8_t     quality_score_delay;
548 			/*
549 			 * on scale of 1 to 5
550 			 */
551 			uint8_t     quality_score_loss;
552 			/*
553 			 * on scale of 1 to 5
554 			 */
555 			uint8_t     quality_score_channel;
556 		};
557 
558 		struct { /* version 2 structure */
559 			struct ifnet_interface_advisory_header    header;
560 			struct ifnet_interface_advisory_capacity  capacity;
561 			union {
562 				struct ifnet_interface_advisory_wifi_context    wifi_context;
563 				struct ifnet_interface_advisory_cell_context    cell_context;
564 			};
565 		};
566 	};
567 } __attribute__((aligned(sizeof(uint64_t))));
568 #pragma pack(pop)
569 
570 /*
571  * Definitions related to traffic steering
572  */
573 #pragma pack(push, 1)
574 
575 /* Supported types */
576 /* Reserving 1 for link layer */
577 #define IFNET_TRAFFIC_DESCRIPTOR_TYPE_INET 2
578 
579 /* Supported flags */
580 #define IFNET_TRAFFIC_DESCRIPTOR_FLAG_INBOUND  0x0001
581 #define IFNET_TRAFFIC_DESCRIPTOR_FLAG_OUTBOUND 0x0002
582 
583 struct ifnet_traffic_descriptor_common {
584 	uint8_t     itd_type;
585 	uint8_t     _reserved;
586 	uint16_t    itd_len; /* length of entire struct (common + td-specific) */
587 	uint32_t    itd_flags;
588 };
589 
590 #define IFNET_TRAFFIC_DESCRIPTOR_INET_IPVER 0x01
591 #define IFNET_TRAFFIC_DESCRIPTOR_INET_PROTO 0x02
592 #define IFNET_TRAFFIC_DESCRIPTOR_INET_LADDR 0x04
593 #define IFNET_TRAFFIC_DESCRIPTOR_INET_RADDR 0x08
594 #define IFNET_TRAFFIC_DESCRIPTOR_INET_LPORT 0x10
595 #define IFNET_TRAFFIC_DESCRIPTOR_INET_RPORT 0x20
596 
597 struct ifnet_ip_addr {
598 	union {
599 		uint8_t  addr8[16];
600 		uint16_t addr16[8];
601 		uint32_t addr32[4];
602 	};
603 };
604 #define iia_v4addr addr32[3]
605 
606 struct ifnet_traffic_descriptor_inet {
607 	struct ifnet_traffic_descriptor_common inet_common;
608 	uint8_t     inet_mask;
609 	uint8_t     inet_ipver; /* IPVERSION or IPV6_VERSION */
610 	uint8_t     inet_proto; /* IPPROTO_TCP or IPPROTO_UDP */
611 	uint8_t     _reserved;
612 	struct ifnet_ip_addr inet_laddr;
613 	struct ifnet_ip_addr inet_raddr;
614 	uint16_t    inet_lport;
615 	uint16_t    inet_rport;
616 };
617 
618 #define IFNET_TRAFFIC_RULE_ACTION_STEER 1
619 struct ifnet_traffic_rule_action {
620 	uint8_t     ra_type;
621 	uint8_t     _reserved;
622 	uint16_t    ra_len;
623 };
624 
625 struct ifnet_traffic_rule_action_steer {
626 	struct ifnet_traffic_rule_action ras_common;
627 	uint64_t    ras_qset_id;
628 };
629 #pragma pack(pop)
630 
631 #pragma pack()
632 
633 #endif /* !_NET_IF_VAR_STATUS_H_ */
634