/*
 * Copyright (c) 2000-2021 Apple Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 *
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */
/*
 * Copyright (c) 1982, 1986, 1989, 1993
 *    The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    This product includes software developed by the University of
 *    California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *    From: @(#)if.h    8.1 (Berkeley) 6/10/93
 * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.7 2001/07/24 19:10:18 brooks Exp $
 */

#ifndef _NET_IF_VAR_STATUS_H_
#define _NET_IF_VAR_STATUS_H_

#include <machine/types.h>
#include <stdint.h>

#pragma pack(4)

/*
 * Interface link status report -- includes statistics related to
 * the link layer technology sent by the driver. The driver will monitor
 * these statistics over an interval (3-4 secs) and will generate a report
 * to the network stack. This will give first-hand information about the
 * status of the first hop of the network path. The version and
 * length values should be correct for the data to be processed correctly.
 * The definitions are different for different kind of interfaces like
 * Wifi, Cellular etc,.
 */
#define IF_CELLULAR_STATUS_REPORT_VERSION_1     1
#define IF_WIFI_STATUS_REPORT_VERSION_1         1
#define IF_CELLULAR_STATUS_REPORT_CURRENT_VERSION       \
	                                IF_CELLULAR_STATUS_REPORT_VERSION_1
#define IF_WIFI_STATUS_REPORT_CURRENT_VERSION   IF_WIFI_STATUS_REPORT_VERSION_1
/*
 * For cellular interface --
 * There is no way to share common headers between the Baseband and
 * the kernel. Any changes to this structure will need to be communicated
 * to the Baseband team. It is better to use reserved space instead of
 * changing the size or existing fields in the structure.
 */
struct if_cellular_status_v1 {
	u_int32_t valid_bitmask;     /* indicates which fields are valid */
#define IF_CELL_LINK_QUALITY_METRIC_VALID       0x1
#define IF_CELL_UL_EFFECTIVE_BANDWIDTH_VALID    0x2
#define IF_CELL_UL_MAX_BANDWIDTH_VALID          0x4
#define IF_CELL_UL_MIN_LATENCY_VALID            0x8
#define IF_CELL_UL_EFFECTIVE_LATENCY_VALID      0x10
#define IF_CELL_UL_MAX_LATENCY_VALID            0x20
#define IF_CELL_UL_RETXT_LEVEL_VALID            0x40
#define IF_CELL_UL_BYTES_LOST_VALID             0x80
#define IF_CELL_UL_MIN_QUEUE_SIZE_VALID         0x100
#define IF_CELL_UL_AVG_QUEUE_SIZE_VALID         0x200
#define IF_CELL_UL_MAX_QUEUE_SIZE_VALID         0x400
#define IF_CELL_DL_EFFECTIVE_BANDWIDTH_VALID    0x800
#define IF_CELL_DL_MAX_BANDWIDTH_VALID          0x1000
#define IF_CELL_CONFIG_INACTIVITY_TIME_VALID    0x2000
#define IF_CELL_CONFIG_BACKOFF_TIME_VALID       0x4000
#define IF_CELL_UL_MSS_RECOMMENDED_VALID        0x8000

	u_int32_t link_quality_metric;
	u_int32_t ul_effective_bandwidth; /* Measured uplink bandwidth based on current activity (bps) */
	u_int32_t ul_max_bandwidth; /* Maximum supported uplink bandwidth (bps) */
	u_int32_t ul_min_latency; /* min expected uplink latency for first hop (ms) */
	u_int32_t ul_effective_latency; /* current expected uplink latency for first hop (ms) */
	u_int32_t ul_max_latency; /* max expected uplink latency first hop (ms) */
	u_int32_t ul_retxt_level; /* Retransmission metric */
#define IF_CELL_UL_RETXT_LEVEL_NONE     1
#define IF_CELL_UL_RETXT_LEVEL_LOW      2
#define IF_CELL_UL_RETXT_LEVEL_MEDIUM   3
#define IF_CELL_UL_RETXT_LEVEL_HIGH     4
	u_int32_t ul_bytes_lost; /* % of total bytes lost on uplink in Q10 format */
	u_int32_t ul_min_queue_size; /* minimum bytes in queue */
	u_int32_t ul_avg_queue_size; /* average bytes in queue */
	u_int32_t ul_max_queue_size; /* maximum bytes in queue */
	u_int32_t dl_effective_bandwidth; /* Measured downlink bandwidth based on current activity (bps) */
	u_int32_t dl_max_bandwidth; /* Maximum supported downlink bandwidth (bps) */
	u_int32_t config_inactivity_time; /* ms */
	u_int32_t config_backoff_time; /* new connections backoff time in ms */
#define IF_CELL_UL_MSS_RECOMMENDED_NONE 0x0 /* Use default */
#define IF_CELL_UL_MSS_RECOMMENDED_MEDIUM 0x1 /* 1200 byte MSS */
#define IF_CELL_UL_MSS_RECOMMENDED_LOW  0x2 /* 512 byte MSS */
	u_int16_t mss_recommended;
	u_int16_t reserved_1;
	u_int32_t reserved_2;
	u_int64_t reserved_3;
	u_int64_t reserved_4;
	u_int64_t reserved_5;
	u_int64_t reserved_6;
} __attribute__((packed));

struct if_cellular_status {
	union {
		struct if_cellular_status_v1 if_status_v1;
	} if_cell_u;
};

/*
 * These statistics will be provided by the Wifi driver periodically.
 * After sending each report, the driver should start computing again
 * for the next report duration so that the values represent the link
 * status for one report duration.
 */

struct if_wifi_status_v1 {
	u_int32_t valid_bitmask;
#define IF_WIFI_LINK_QUALITY_METRIC_VALID       0x1
#define IF_WIFI_UL_EFFECTIVE_BANDWIDTH_VALID    0x2
#define IF_WIFI_UL_MAX_BANDWIDTH_VALID          0x4
#define IF_WIFI_UL_MIN_LATENCY_VALID            0x8
#define IF_WIFI_UL_EFFECTIVE_LATENCY_VALID      0x10
#define IF_WIFI_UL_MAX_LATENCY_VALID            0x20
#define IF_WIFI_UL_RETXT_LEVEL_VALID            0x40
#define IF_WIFI_UL_ERROR_RATE_VALID             0x80
#define IF_WIFI_UL_BYTES_LOST_VALID             0x100
#define IF_WIFI_DL_EFFECTIVE_BANDWIDTH_VALID    0x200
#define IF_WIFI_DL_MAX_BANDWIDTH_VALID          0x400
#define IF_WIFI_DL_MIN_LATENCY_VALID            0x800
#define IF_WIFI_DL_EFFECTIVE_LATENCY_VALID      0x1000
#define IF_WIFI_DL_MAX_LATENCY_VALID            0x2000
#define IF_WIFI_DL_ERROR_RATE_VALID             0x4000
#define IF_WIFI_CONFIG_FREQUENCY_VALID          0x8000
#define IF_WIFI_CONFIG_MULTICAST_RATE_VALID     0x10000
#define IF_WIFI_CONFIG_SCAN_COUNT_VALID         0x20000
#define IF_WIFI_CONFIG_SCAN_DURATION_VALID      0x40000
	u_int32_t link_quality_metric; /* link quality metric */
	u_int32_t ul_effective_bandwidth; /* Measured uplink bandwidth based on current activity (bps) */
	u_int32_t ul_max_bandwidth; /* Maximum supported uplink bandwidth (bps) */
	u_int32_t ul_min_latency; /* min expected uplink latency for first hop (ms) */
	u_int32_t ul_effective_latency; /* current expected uplink latency for first hop (ms) */
	u_int32_t ul_max_latency; /* max expected uplink latency for first hop (ms) */
	u_int32_t ul_retxt_level; /* Retransmission metric */
#define IF_WIFI_UL_RETXT_LEVEL_NONE     1
#define IF_WIFI_UL_RETXT_LEVEL_LOW      2
#define IF_WIFI_UL_RETXT_LEVEL_MEDIUM   3
#define IF_WIFI_UL_RETXT_LEVEL_HIGH     4
	u_int32_t ul_bytes_lost; /* % of total bytes lost on uplink in Q10 format */
	u_int32_t ul_error_rate; /* % of bytes dropped on uplink after many retransmissions in Q10 format */
	u_int32_t dl_effective_bandwidth; /* Measured downlink bandwidth based on current activity (bps) */
	u_int32_t dl_max_bandwidth; /* Maximum supported downlink bandwidth (bps) */
	/*
	 * The download latency values indicate the time AP may have to wait for the
	 * driver to receive the packet. These values give the range of expected latency
	 * mainly due to co-existence events and channel hopping where the interface
	 * becomes unavailable.
	 */
	u_int32_t dl_min_latency; /* min expected latency for first hop in ms */
	u_int32_t dl_effective_latency; /* current expected latency for first hop in ms */
	u_int32_t dl_max_latency; /* max expected latency for first hop in ms */
	u_int32_t dl_error_rate; /* % of CRC or other errors in Q10 format */
	u_int32_t config_frequency; /* 2.4 or 5 GHz */
#define IF_WIFI_CONFIG_FREQUENCY_2_4_GHZ        1
#define IF_WIFI_CONFIG_FREQUENCY_5_0_GHZ        2
	u_int32_t config_multicast_rate; /* bps */
	u_int32_t scan_count; /* scan count during the previous period */
	u_int32_t scan_duration; /* scan duration in ms */
	u_int64_t reserved_1;
	u_int64_t reserved_2;
	u_int64_t reserved_3;
	u_int64_t reserved_4;
} __attribute__((packed));

struct if_wifi_status {
	union {
		struct if_wifi_status_v1 if_status_v1;
	} if_wifi_u;
};

struct if_link_status {
	u_int32_t       ifsr_version;   /* version of this report */
	u_int32_t       ifsr_len;       /* length of the following struct */
	union {
		struct if_cellular_status ifsr_cell;
		struct if_wifi_status ifsr_wifi;
	} ifsr_u;
};

/*
 * This structure is used to define the parameters for advisory notifications
 * on an interface.
 */
#pragma pack(push, 1)
enum ifnet_interface_advisory_version : uint8_t {
	/*
	 * Initial version with interface advisory report for WiFi interface.
	 */
	IF_INTERFACE_ADVISORY_VERSION_1 = 1,
	/*
	 * Reorganized the interface advisory structure to separate out
	 * WiFi and Cellular interface specific reports.
	 */
	IF_INTERFACE_ADVISORY_VERSION_2 = 2,
	IF_INTERFACE_ADVISORY_VERSION_CURRENT = IF_INTERFACE_ADVISORY_VERSION_2,
};

enum ifnet_interface_advisory_direction : uint8_t {
	IF_INTERFACE_ADVISORY_DIRECTION_TX = 1,
	IF_INTERFACE_ADVISORY_DIRECTION_RX = 2,
};

enum ifnet_interface_advisory_interface_type : uint8_t {
	IF_INTERFACE_ADVISORY_INTERFACE_TYPE_WIFI = 1,
	IF_INTERFACE_ADVISORY_INTERFACE_TYPE_CELL = 2,
};

struct ifnet_interface_advisory_header {
	/* The current structure version */
	enum ifnet_interface_advisory_version         version;
	/*  Specifies if the advisory is for transmit or receive path */
	enum ifnet_interface_advisory_direction       direction;
	/* Interface type */
	enum ifnet_interface_advisory_interface_type  interface_type;
	/* reserved for future use */
	uint8_t                                       reserved;
};

enum ifnet_interface_advisory_rate_trend : int32_t {
	IF_INTERFACE_ADVISORY_RATE_SUGGESTION_RAMP_UP = INT32_MAX,
	IF_INTERFACE_ADVISORY_RATE_SUGGESTION_RAMP_DOWN = INT32_MIN,
	IF_INTERFACE_ADVISORY_RATE_SUGGESTION_RAMP_NEUTRAL = 0,
};

struct ifnet_interface_advisory_capacity {
	/*
	 * suggestion for data rate change to keep the latency low.
	 * unit: bits per second (bps)
	 * NOTE: if the interface cannot provide suggestions in
	 * terms of bps, it should use the following values:
	 * INT32_MAX : ramp up
	 * INT32_MIN : ramp down
	 * 0         : neutral
	 */
	enum ifnet_interface_advisory_rate_trend  rate_trend_suggestion;
	/*
	 * Time of the issue of advisory.
	 * Timestamp should be in the host domain.
	 * unit: mach absolute time
	 */
	uint64_t    timestamp;
	/*
	 * Maximum theoretical bandwidth of the interface.
	 * unit: bits per second (bps)
	 */
	uint64_t    max_bandwidth;
	/*
	 * Total bytes sent or received on the interface.
	 * wrap around possible and the application should account for that.
	 * unit: byte
	 */
	uint64_t    total_byte_count;
	/*
	 * average throughput observed at the driver stack.
	 * unit: bits per second (bps)
	 */
	uint64_t    average_throughput;
	/*
	 * flushable queue size at the driver.
	 * should be set to UINT32_MAX if not available.
	 * unit: byte
	 */
	uint32_t    flushable_queue_size;
	/*
	 * non flushable queue size at the driver.
	 * should be set to UINT32_MAX if not available.
	 * unit: byte
	 */
	uint32_t    non_flushable_queue_size;
	/*
	 * average delay observed at the interface.
	 * unit: milliseconds (ms)
	 */
	uint32_t    average_delay;
};

enum ifnet_interface_advisory_wifi_freq_band : uint8_t {
	IF_INTERFACE_ADVISORY_FREQ_BAND_NOT_AVAIL =  0,
	IF_INTERFACE_ADVISORY_FREQ_BAND_WIFI_24GHZ = 1,
	IF_INTERFACE_ADVISORY_FREQ_BAND_WIFI_5GHZ =  2,
	IF_INTERFACE_ADVISORY_FREQ_BAND_WIFI_6GHZ =  3,
};

/*
 * This structure is used to define the parameters for advisory notifications
 * that are specific for WiFi interface.
 */
struct ifnet_interface_advisory_wifi_context {
	/*
	 * Current frequency band (enumeration).
	 */
	enum ifnet_interface_advisory_wifi_freq_band  frequency_band;
	/*
	 * Intermittent WiFi state [true(1)/false(0)]
	 */
	uint8_t     intermittent_state;
	/*
	 * Estimated period for which intermittent state is expected to last.
	 * 1 tick -> 1 ms UNDEF => UINT16_MAX
	 */
	uint16_t    estimated_intermittent_period;
	/*
	 * Expected wifi outage period during intermittent state
	 * 1 tick -> 1 ms UNDEF => UINT16_MAX
	 */
	uint16_t    single_outage_period;
	/*
	 * WiFi-BT coexistence, 1-ON, 0-OFF
	 */
	uint8_t     bt_coex;
	/*
	 * on scale of 1 to 5
	 */
	uint8_t     quality_score_delay;
	/*
	 * on scale of 1 to 5
	 */
	uint8_t     quality_score_loss;
	/*
	 * on scale of 1 to 5
	 */
	uint8_t     quality_score_channel;
	/*
	 * bitmap of all radio contenders.
	 */
#define IF_INTERFACE_ADVISORY_WIFI_RADIO_COEX_BT    0x01
#define IF_INTERFACE_ADVISORY_WIFI_RADIO_COEX_AWDL  0x02
	uint8_t     radio_coex;
	/*
	 * time available to WiFi since last notification (in ms).
	 */
	uint16_t    wlan_duty_cycle;
	/*
	 * bitrate information for each queue (in Kbps).
	 */
#define IF_INTERFACE_ADVISORY_WIFI_TX_QUEUE_COUNT  6
	uint32_t    wifi_observed_tx_bitrate[IF_INTERFACE_ADVISORY_WIFI_TX_QUEUE_COUNT];
};

/*
 * This structure is used to define the parameters for advisory notifications
 * that are specific for Cellular interface.
 */
struct ifnet_interface_advisory_cell_context {
	/*
	 * Radio Access Technology
	 */
	uint8_t     radio_access_technology;
	/*
	 * Received Reference Signal Received level (RSRP dBm)
	 */
	int16_t     reference_signal_level;
	/*
	 * Received Signal strength level (RSSI dBm)
	 */
	int16_t     signal_level;
	/*
	 * Received signal quality (SNR dB).
	 */
	int8_t      signal_quality;
	/*
	 * Uplink Block Error Rate %
	 */
	uint8_t     uplink_bler;
	/*
	 * Downlink Block Error Rate %
	 */
	uint8_t     downlink_bler;
	/*
	 * Bandwidth Limitation Type. I.e. TTI-B.
	 */
	uint8_t     bandwidth_limitation_indication;
	/*
	 * Discontinuous reception state: CDRX on/off.
	 */
	uint8_t     cdrx_state;
	/*
	 * Discontinuous reception cycle in ms.
	 */
	uint16_t    cdrx_cycle;
	/*
	 * Approximate outage period when not known
	 */
	uint16_t    estimated_outage_period;
	/*
	 * Cellular outage state: i.e. handover in progress.
	 *     0 - no outage
	 *     1 - outage.
	 */
#define IF_INTERFACE_ADVISORY_CELL_OUTAGE_STATE_NO     0
#define IF_INTERFACE_ADVISORY_CELL_OUTAGE_STATE_YES    1
	uint8_t     outage_state;
	/*
	 * padding for alignment.
	 */
	uint8_t     __pad;
};

struct ifnet_interface_advisory {
	union {
		struct { /* version 1 structure (to be deprecated) */
			/* The current structure version */
			uint8_t     version;
			/*  Specifies if the advisory is for transmit or receive path */
			uint8_t     direction;
			/* reserved for future use */
			uint16_t    _reserved;
			/*
			 * suggestion for data rate change to keep the latency low.
			 * unit: bits per second (bps)
			 * NOTE: if the interface cannot provide suggestions in terms of bps,
			 * it should use the following values:
			 * INT32_MAX : ramp up
			 * INT32_MIN : ramp down
			 * 0         : neutral
			 */
			int32_t     rate_trend_suggestion;
			/*
			 * Time of the issue of advisory.
			 * Timestamp should be in the host domain.
			 * unit: mach absolute time
			 */
			uint64_t    timestamp;
			/*
			 * Maximum theoretical bandwidth of the interface.
			 * unit: bits per second (bps)
			 */
			uint64_t    max_bandwidth;
			/*
			 * Total bytes sent or received on the interface.
			 * wrap around possible and the application should account for that.
			 * unit: byte
			 */
			uint64_t    total_byte_count;
			/*
			 * average throughput observed at the driver stack.
			 * unit: bits per second (bps)
			 */
			uint64_t    average_throughput;
			/*
			 * flushable queue size at the driver.
			 * should be set to UINT32_MAX if not available.
			 * unit: byte
			 */
			uint32_t    flushable_queue_size;
			/*
			 * non flushable queue size at the driver.
			 * should be set to UINT32_MAX if not available.
			 * unit: byte
			 */
			uint32_t    non_flushable_queue_size;
			/*
			 * average delay observed at the interface.
			 * unit: milliseconds (ms)
			 */
			uint32_t    average_delay;
			/*
			 * Current frequency band (enumeration).
			 */
			uint8_t    frequency_band;
			/*
			 * Intermittent WiFi state [true(1)/false(0)]
			 */
			uint8_t     intermittent_state;
			/*
			 * Estimated period for which intermittent state is expected to last.
			 * 1 tick -> 1 ms UNDEF => UINT16_MAX
			 */
			uint16_t    estimated_intermittent_period;
			/*
			 * Expected wifi outage period during intermittent state
			 * 1 tick -> 1 ms UNDEF => UINT16_MAX
			 */
			uint16_t    single_outage_period;

			/*
			 * WiFi-BT coexistence, 1-ON, 0-OFF
			 */
			uint8_t     bt_coex;
			/*
			 * on scale of 1 to 5
			 */
			uint8_t     quality_score_delay;
			/*
			 * on scale of 1 to 5
			 */
			uint8_t     quality_score_loss;
			/*
			 * on scale of 1 to 5
			 */
			uint8_t     quality_score_channel;
		};

		struct { /* version 2 structure */
			struct ifnet_interface_advisory_header    header;
			struct ifnet_interface_advisory_capacity  capacity;
			union {
				struct ifnet_interface_advisory_wifi_context    wifi_context;
				struct ifnet_interface_advisory_cell_context    cell_context;
			};
		};
	};
} __attribute__((aligned(sizeof(uint64_t))));
#pragma pack(pop)

/*
 * Definitions related to traffic steering
 */
#pragma pack(push, 1)

/* Supported types */
/* Reserving 1 for link layer */
#define IFNET_TRAFFIC_DESCRIPTOR_TYPE_INET 2

/* Supported flags */
#define IFNET_TRAFFIC_DESCRIPTOR_FLAG_INBOUND  0x0001
#define IFNET_TRAFFIC_DESCRIPTOR_FLAG_OUTBOUND 0x0002

struct ifnet_traffic_descriptor_common {
	uint8_t     itd_type;
	uint8_t     _reserved;
	uint16_t    itd_len; /* length of entire struct (common + td-specific) */
	uint32_t    itd_flags;
};

#define IFNET_TRAFFIC_DESCRIPTOR_INET_IPVER 0x01
#define IFNET_TRAFFIC_DESCRIPTOR_INET_PROTO 0x02
#define IFNET_TRAFFIC_DESCRIPTOR_INET_LADDR 0x04
#define IFNET_TRAFFIC_DESCRIPTOR_INET_RADDR 0x08
#define IFNET_TRAFFIC_DESCRIPTOR_INET_LPORT 0x10
#define IFNET_TRAFFIC_DESCRIPTOR_INET_RPORT 0x20

struct ifnet_ip_addr {
	union {
		uint8_t  addr8[16];
		uint16_t addr16[8];
		uint32_t addr32[4];
	};
};
#define iia_v4addr addr32[3]

struct ifnet_traffic_descriptor_inet {
	struct ifnet_traffic_descriptor_common inet_common;
	uint8_t     inet_mask;
	uint8_t     inet_ipver; /* IPVERSION or IPV6_VERSION */
	uint8_t     inet_proto; /* IPPROTO_TCP or IPPROTO_UDP */
	uint8_t     _reserved;
	struct ifnet_ip_addr inet_laddr;
	struct ifnet_ip_addr inet_raddr;
	uint16_t    inet_lport;
	uint16_t    inet_rport;
};

#define IFNET_TRAFFIC_RULE_ACTION_STEER 1
struct ifnet_traffic_rule_action {
	uint8_t     ra_type;
	uint8_t     _reserved;
	uint16_t    ra_len;
};

struct ifnet_traffic_rule_action_steer {
	struct ifnet_traffic_rule_action ras_common;
	uint64_t    ras_qset_id;
};
#pragma pack(pop)

#pragma pack()

#endif /* !_NET_IF_VAR_STATUS_H_ */
