diff --git a/zh-cn/network/netmanager_ext/net_trafficfilter/net_trafficfilter_type.h b/zh-cn/network/netmanager_ext/net_trafficfilter/net_trafficfilter_type.h new file mode 100644 index 000000000..3e70d2bed --- /dev/null +++ b/zh-cn/network/netmanager_ext/net_trafficfilter/net_trafficfilter_type.h @@ -0,0 +1,1097 @@ +/* + * Copyright (C) 2026 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup TrafficFilter + * @{ + * + * @brief 声明网络流量过滤与重定向功能所需的通用类型和错误码。 + * + * @since 26.0.0 + */ + +/** + * @file net_trafficfilter_type.h + * @brief 声明网络流量过滤与重定向功能所需的通用类型和错误码。该头文件定义了流量过滤与重定向功能中使用的IP地址、端口、接口等匹配条件结构体,报文过滤规则、重定向规则等配置结构体,以及操作返回的错误码。 + *
适用于调用{@link OH_TrafficFilter_CreateRedirector}等接口时构造参数和解析返回值。 + * + * @library libnet_trafficfilter.so + * @kit NetworkKit + * @syscap SystemCapability.Communication.NetManager.NetFirewall + * @since 26.0.0 + */ + +#ifndef NET_TRAFFICFILTER_TYPE_H +#define NET_TRAFFICFILTER_TYPE_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief IP地址字节数组最大长度(兼容IPv4和IPv6)。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_IP_ADDRLEN 16 + +/** + * @brief 多IP匹配支持的最大IP数量。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_MAX_MULTI_IP_COUNT 16 + +/** + * @brief 多端口匹配支持的最大端口数量。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_MAX_MULTI_PORT_COUNT 64 + +/** + * @brief NFQueue报文拷贝模式:仅拷贝元数据。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_NFQUEUE_COPY_META 0 + +/** + * @brief NFQueue报文拷贝模式:拷贝整个报文。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_NFQUEUE_COPY_PACKET 0xFFFF + +/** + * @brief 默认NFQueue报文拷贝长度(字节)。设置为0xFFFF表示拷贝整个报文,较小的值(如128)仅拷贝报文头。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_DEFAULT_COPY_LEN 0xFFFF + +/** + * @brief 默认NFQueue最大队列长度(报文数量)。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_DEFAULT_QUEUE_MAXLEN 1024 + +/** + * @brief NFQueue队列标志:FAIL-OPEN模式。当用户态进程崩溃时,内核自动放行报文以避免网络中断。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_NFQUEUE_FLAG_FAIL_OPEN 0x1 + +/** + * @brief MAC地址字符串最大长度(XX:XX:XX:XX:XX:XX) + * @since 26.1.0 + */ +#define OH_TRAFFICFILTER_MAC_ADDRSTRLEN 18 + +/** + * @brief 最小优先级值。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_MIN_PRIORITY 1 + +/** + * @brief 最大优先级值。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_MAX_PRIORITY 10000 + +/** + * @brief 最小Group ID值。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_MIN_GROUP_ID 1 + +/** + * @brief 最大Group ID值。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_MAX_GROUP_ID 65535 + +/** + * @brief 网络接口名称最大长度。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_IFNAMSIZ 32 + +/** + * @brief 协议类型常量:任意协议。 + * + * @since 26.0.0 + */ +#define OH_TRAFFICFILTER_PROTO_ANY 0 +#define OH_TRAFFICFILTER_PROTO_TCP 6 +#define OH_TRAFFICFILTER_PROTO_UDP 17 +#define OH_TRAFFICFILTER_PROTO_ICMP 1 +#define OH_TRAFFICFILTER_PROTO_ICMPV6 58 + +/** + * @brief 流量过滤与重定向错误码。 + * + * @since 26.0.0 + */ +typedef enum OH_TrafficFilter_ErrCode { + /** + * @brief 操作成功。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_OK = 0, + + /** + * @brief 错误码基值。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_E_BASE = 29410000, + + /** + * @brief 缺少权限。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED = 201, + + /** + * @brief 参数错误(无效的优先级、IP地址、端口或Group ID)。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_ERROR_INVALID_PARAM = (OH_TRAFFICFILTER_E_BASE + 101), + + /** + * @brief 资源未找到(规则、目标、进程或Group ID未找到)。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_ERROR_NOT_FOUND = (OH_TRAFFICFILTER_E_BASE + 102), + + /** + * @brief 规则数量过多。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_ERROR_TOO_MANY_RULES = (OH_TRAFFICFILTER_E_BASE + 103), + + /** + * @brief Group ID已被占用。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_ERROR_GROUP_ID_IN_USE = (OH_TRAFFICFILTER_E_BASE + 104), + + /** + * @brief NFQueue错误(初始化失败或无可用队列)。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_ERROR_NFQUEUE_ERROR = (OH_TRAFFICFILTER_E_BASE + 105), +} OH_TrafficFilter_ErrCode; + +/** + * @brief IP匹配类型。 + * + * @since 26.0.0 + */ +typedef enum OH_TrafficFilter_IPMatchType { + /** + * @brief 任意IP。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_MATCH_ANY = 0, + /** + * @brief 单个IP。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_MATCH_SINGLE, + /** + * @brief CIDR格式(如192.168.1.0/24,表示匹配该子网内的所有IP)。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_MATCH_CIDR, + /** + * @brief IP范围。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_MATCH_RANGE, + /** + * @brief 多个IP。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_MATCH_MULTI +} OH_TrafficFilter_IPMatchType; + +/** + * @brief IP地址族。 + * + * @since 26.0.0 + */ +typedef enum OH_TrafficFilter_IPFamily { + /** + * @brief 未指定的IP地址族。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_FAMILY_UNSPEC = 0, + /** + * @brief IPv4地址族。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_FAMILY_V4 = 1, + /** + * @brief IPv6地址族。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_IP_FAMILY_V6 = 2 +} OH_TrafficFilter_IPFamily; + +/** + * @brief 端口匹配类型。 + * + * @since 26.0.0 + */ +typedef enum OH_TrafficFilter_PortMatchType { + /** + * @brief 任意端口。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_PORT_MATCH_ANY = 0, + /** + * @brief 单个端口。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_PORT_MATCH_SINGLE, + /** + * @brief 端口范围。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_PORT_MATCH_RANGE, + /** + * @brief 多个端口。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_PORT_MATCH_MULTI +} OH_TrafficFilter_PortMatchType; + +/** + * @brief 钩子点类型,指定规则在网络协议栈中生效的位置。报文经过内核网络协议栈时会在不同阶段触发钩子点,规则在对应钩子点处对报文进行拦截。例如INPUT链处理进入本机的报文,OUTPUT链处理本机发出的报文。 + * + * @since 26.0.0 + */ +typedef enum OH_TrafficFilter_HookPoint { + /** + * @brief INPUT链,处理进入本机的报文。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_HOOK_INPUT = 0, + /** + * @brief OUTPUT链,处理本机发出的报文。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_HOOK_OUTPUT, + /** + * @brief FORWARD链,处理本机转发的报文。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_HOOK_FORWARD, + /** + * @brief PREROUTING链,处理刚到达网卡、尚未路由的报文。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_HOOK_PREROUTING, + /** + * @brief POSTROUTING链,处理即将从网卡发出的报文。 + * + * @since 26.0.0 + */ + OH_TRAFFICFILTER_HOOK_POSTROUTING +} OH_TrafficFilter_HookPoint; + +/** + * @brief 二进制形式的IP地址,支持IPv4和IPv6。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_IPAddress { + /** + * @brief 地址族。若未显式设置,默认使用IPv4。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPFamily family; + /** + * @brief IP地址字节。 + * + * 字节必须以网络字节序存储。 + * 对于IPv4,{@link addr}[0]到{@link addr}[3]存储IPv4地址, + * {@link addr}[4]到{@link addr}[15]必须设置为0。 + * 对于IPv6,{@link addr}[0]到{@link addr}[15]存储IPv6地址。 + * + * 如果字节与{@link family}要求的地址布局不匹配, + * 使用该结构体的接口将返回{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM}。 + * + * @since 26.0.0 + */ + uint8_t addr[OH_TRAFFICFILTER_IP_ADDRLEN]; +} OH_TrafficFilter_IPAddress; + +/** + * @brief CIDR(Classless Inter-Domain Routing,无类别域间路由)匹配的IP匹配值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_IPCidr { + /** + * @brief CIDR块的基IP地址。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress base; + /** + * @brief CIDR前缀长度。 + * @since 26.0.0 + */ + uint8_t prefixLen; +} OH_TrafficFilter_IPCidr; + +/** + * @brief 范围匹配的IP匹配值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_IPRange { + /** + * @brief 范围的起始IP地址。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress start; + /** + * @brief 范围的结束IP地址。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress end; +} OH_TrafficFilter_IPRange; + +/** + * @brief 多IP匹配的IP匹配值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_IPMulti { + /** + * @brief 数组中的IP地址数量。 + * @since 26.0.0 + */ + uint32_t ipCount; + /** + * @brief IP地址数组 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress ips[OH_TRAFFICFILTER_MAX_MULTI_IP_COUNT]; +} OH_TrafficFilter_IPMulti; + +/** + * @brief IP匹配条件。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_IPMatch { + /** + * @brief 匹配类型。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPMatchType type; + /** + * @brief 是否反转匹配结果。 + * @since 26.0.0 + */ + bool invert; + /** + * @brief 匹配规则 + * @since 26.0.0 + */ + union { + /** + * @brief 单个IP地址,当type为OH_TRAFFICFILTER_IP_MATCH_SINGLE时使用 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress single; + /** + * @brief CIDR匹配值,当type为OH_TRAFFICFILTER_IP_MATCH_CIDR时使用 + * @since 26.0.0 + */ + OH_TrafficFilter_IPCidr cidr; + /** + * @brief IP范围匹配值,当type为OH_TRAFFICFILTER_IP_MATCH_RANGE时使用 + * @since 26.0.0 + */ + OH_TrafficFilter_IPRange range; + /** + * @brief 多IP匹配值,当type为OH_TRAFFICFILTER_IP_MATCH_MULTI时使用 + * @since 26.0.0 + */ + OH_TrafficFilter_IPMulti multi; + } value; +} OH_TrafficFilter_IPMatch; + +/** + * @brief 接口匹配条件。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_InterfaceMatch { + /** + * @brief 是否启用接口匹配。 + * @since 26.0.0 + */ + bool enabled; + /** + * @brief 是否反转匹配结果。 + * @since 26.0.0 + */ + bool invert; + /** + * @brief 是否按前缀匹配接口名称。 + * @since 26.0.0 + */ + bool isPrefix; + /** + * @brief 接口名称。 + * + * 该字符串必须以UTF-8编码,且必须以NUL结尾。 + * 该缓冲区的容量为{@link OH_TRAFFICFILTER_IFNAMSIZ}字节, + * 包含结尾的NUL字符。因此,接口名称的最大长度为 + * {@link OH_TRAFFICFILTER_IFNAMSIZ} - 1字节, + * 不包含结尾的NUL字符。 + * + * 如果{@link enabled}为true,该字符串不能为空。 + * 如果该字符串在{@link OH_TRAFFICFILTER_IFNAMSIZ} + * 字节内没有以NUL结尾,或者其长度超过{@link OH_TRAFFICFILTER_IFNAMSIZ} - 1字节, + * 使用该结构体的接口将返回{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM}。 + * + * 如果{@link enabled}为false,该字段将被忽略。建议在禁用接口匹配时 + * 将该缓冲区全部置零。 + * + * @since 26.0.0 + */ + char ifName[OH_TRAFFICFILTER_IFNAMSIZ]; +} OH_TrafficFilter_InterfaceMatch; + +/** + * @brief 范围匹配的端口匹配值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_PortRange { + /** + * @brief 范围的起始端口。 + * @since 26.0.0 + */ + uint16_t startPort; + /** + * @brief 范围的结束端口。 + * @since 26.0.0 + */ + uint16_t endPort; +} OH_TrafficFilter_PortRange; + +/** + * @brief 多端口匹配的端口匹配值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_PortMulti { + /** + * @brief 数组中的端口数量。 + * @since 26.0.0 + */ + uint32_t portCount; + /** + * @brief 端口数组 + * @since 26.0.0 + */ + uint16_t ports[OH_TRAFFICFILTER_MAX_MULTI_PORT_COUNT]; +} OH_TrafficFilter_PortMulti; + +/** + * @brief 端口匹配条件。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_PortMatch { + /** + * @brief 匹配类型。 + * @since 26.0.0 + */ + OH_TrafficFilter_PortMatchType type; + /** + * @brief 是否反转匹配结果。 + * @since 26.0.0 + */ + bool invert; + /** + * @brief 匹配规则 + * @since 26.0.0 + */ + union { + /** + * @brief 单个端口,当type为OH_TRAFFICFILTER_PORT_MATCH_SINGLE时使用 + * @since 26.0.0 + */ + uint16_t single; + /** + * @brief 端口范围匹配值,当type为OH_TRAFFICFILTER_PORT_MATCH_RANGE时使用 + * @since 26.0.0 + */ + OH_TrafficFilter_PortRange range; + /** + * @brief 多端口匹配值,当type为OH_TRAFFICFILTER_PORT_MATCH_MULTI时使用 + * @since 26.0.0 + */ + OH_TrafficFilter_PortMulti multi; + } value; +} OH_TrafficFilter_PortMatch; + +/** + * @brief 连接信息结构体。描述一条网络连接的五元组信息(源IP、目的IP、源端口、目的端口、协议类型),用于查询发起该连接的进程信息。
初始化规则:调用 + * {@link OH_TrafficFilter_QueryProcess}之前,调用者必须将该结构体清零(例如使用memset),然后将{@link size}设置为调用者分配的结构体实际大小,通常为sizeof( + * OH_TrafficFilter_ConnectionInfo)。
二进制兼容规则(ABI,即应用程序二进制接口,保证新旧版本编译的代码能互相识别结构体布局):系统通过{@link size}来确定哪些字段可以被安全读取。 + * 如果{@link size}小于当前接口所需的最小大小,接口将返回{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM}。如果{@link size}大于系统已知的大小,多余的字段将被忽略。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_ConnectionInfo { + /** + * @brief 调用者分配的结构体实际大小。 + * @since 26.0.0 + */ + uint32_t size; + /** + * @brief 源IP地址,支持IPv4和IPv6。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress srcIp; + /** + * @brief 源端口。0表示任意源端口。 + * @since 26.0.0 + */ + uint16_t srcPort; + /** + * @brief 目的IP地址,支持IPv4和IPv6。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress dstIp; + /** + * @brief 目的端口。0表示任意目的端口。 + * @since 26.0.0 + */ + uint16_t dstPort; + /** + * @brief 协议类型。支持的取值:OH_TRAFFICFILTER_PROTO_TCP (6)、OH_TRAFFICFILTER_PROTO_UDP (17)。 + * @since 26.0.0 + */ + uint8_t protocol; +} OH_TrafficFilter_ConnectionInfo; + +/** + * @brief 进程信息结构体。存储{@link OH_TrafficFilter_QueryProcess}返回的进程信息。
初始化规则:调用{@link OH_TrafficFilter_QueryProcess}之前, + * 调用者必须将该结构体清零(例如使用memset),然后将{@link size}设置为调用者分配的结构体实际大小,通常为sizeof(OH_TrafficFilter_ProcessInfo)。
二进制兼容规则(ABI, + * 即应用程序二进制接口,保证新旧版本编译的代码能互相识别结构体布局):系统通过{@link size}来确定哪些输出字段可以被安全写入。只有被{@link size}完全覆盖的字段才会被系统写入。如果{@link size}小于读取 + * {@link size}字段本身所需的最小大小,接口将返回{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM}。如果{@link size}大于系统已知的大小,多余的字段将被忽略。
+ * 输出有效性规则:当{@link OH_TrafficFilter_QueryProcess}返回{@link OH_TRAFFICFILTER_OK}时,被{@link size}覆盖的字段包含有效的输出值。当接口返回错误时, + * 调用者不应依赖{@link size}以外的输出字段的值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_ProcessInfo { + /** + * @brief 调用者分配的结构体实际大小。 + * @since 26.0.0 + */ + uint32_t size; + /** + * @brief 进程ID。 + * @since 26.0.0 + */ + uint32_t pid; + /** + * @brief 用户ID。 + * @since 26.0.0 + */ + uint32_t uid; +} OH_TrafficFilter_ProcessInfo; + +/** + * @brief 流量重定向器。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_Redirector OH_TrafficFilter_Redirector; + +/** + * @brief 流量重定向规则。定义TCP流量重定向规则,将匹配的流量重定向到指定的代理服务器。
初始化规则:调用{@link OH_TrafficFilter_AddRedirectRule}之前,调用者必须将该结构体清零( + * 例如使用memset),然后将{@link size}设置为调用者分配的结构体实际大小,通常为sizeof(OH_TrafficFilter_RedirectRule)。
二进制兼容规则(ABI,即应用程序二进制接口, + * 保证新旧版本编译的代码能互相识别结构体布局):系统通过{@link size}来确定哪些字段可以被安全读取。如果{@link size}小于当前接口所需的最小大小,接口将返回 + * {@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM}。如果{@link size}大于系统已知的大小,多余的字段将被忽略。
失败规则:如果 + * {@link OH_TrafficFilter_AddRedirectRule}返回错误,不保证规则已被添加或生效。调用者应在假设规则生效之前检查返回值。 + * + * @since 26.0.0 + */ +typedef struct OH_TrafficFilter_RedirectRule { + /** + * @brief 调用者分配的结构体实际大小。 + * @since 26.0.0 + */ + uint32_t size; + /** + * @brief 优先级(数值越小优先级越高,规则同报文过滤器)。 + * @since 26.0.0 + */ + uint32_t priority; + /** + * @brief 钩子点(仅支持PREROUTING和OUTPUT)。 + * @since 26.0.0 + */ + OH_TrafficFilter_HookPoint hookPoint; + /** + * @brief 协议(固定为TCP=6)。 + * @since 26.0.0 + */ + uint8_t protocol; + /** + * @brief 源IP匹配条件。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPMatch srcIp; + /** + * @brief 源端口匹配条件。 + * @since 26.0.0 + */ + OH_TrafficFilter_PortMatch srcPort; + /** + * @brief 目的IP匹配条件。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPMatch dstIp; + /** + * @brief 目的端口匹配条件。 + * @since 26.0.0 + */ + OH_TrafficFilter_PortMatch dstPort; + /** + * @brief 入接口匹配条件。 + * @since 26.0.0 + */ + OH_TrafficFilter_InterfaceMatch inInterface; + /** + * @brief 出接口匹配条件。 + * @since 26.0.0 + */ + OH_TrafficFilter_InterfaceMatch outInterface; + /** + * @brief 应用UID范围起始值(UINT32_MAX表示任意)。 + * @since 26.0.0 + */ + uint32_t uidStart; + /** + * @brief 应用UID范围结束值(UINT32_MAX表示任意)。 + * @since 26.0.0 + */ + uint32_t uidEnd; + /** + * @brief 代理服务器IP地址(支持IPv4和IPv6)。 + * @since 26.0.0 + */ + OH_TrafficFilter_IPAddress proxyIp; + /** + * @brief 代理服务器端口。 + * @since 26.0.0 + */ + uint16_t proxyPort; +} OH_TrafficFilter_RedirectRule; + +/** + * @brief 报文描述符 + * + * 包含五元组信息和报文数据 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_PacketDesc { + /** + * @brief 报文ID(报文到达netfilter时由内核分配) + * @since 26.1.0 + */ + uint32_t packetId; + /** + * @brief 协议类型 + * @since 26.1.0 + */ + uint8_t protocol; + /** + * @brief 源IP地址(支持IPv4和IPv6) + * @since 26.1.0 + */ + OH_TrafficFilter_IPAddress srcIp; + /** + * @brief 源端口 + * @since 26.1.0 + */ + uint16_t srcPort; + /** + * @brief 目的IP地址(支持IPv4和IPv6) + * @since 26.1.0 + */ + OH_TrafficFilter_IPAddress dstIp; + /** + * @brief 目的端口 + * @since 26.1.0 + */ + uint16_t dstPort; + /** + * @brief 报文长度 + * @since 26.1.0 + */ + uint32_t packetLen; + /** + * @brief 报文数据指针(用户可修改,内存由系统管理,仅在回调期间有效) + * @since 26.1.0 + */ + uint8_t* data; + /** + * @brief 用户数据(在回调中使用) + * @since 26.1.0 + */ + void* userData; +} OH_TrafficFilter_PacketDesc; + +/** + * @brief 报文决策类型 + * @since 26.1.0 + */ +typedef enum OH_TrafficFilter_PacketDecision { + /** + * @brief 接收报文 + * @since 26.1.0 + */ + OH_TRAFFICFILTER_DECISION_ACCEPT = 0, + /** + * @brief 丢弃报文 + * @since 26.1.0 + */ + OH_TRAFFICFILTER_DECISION_DROP +} OH_TrafficFilter_PacketDecision; + +/** + * @brief 报文回调函数类型 + * + * @param packet 报文描述符 + * @param userData 用户数据 + * @return 报文决策(接收或丢弃) + * @since 26.1.0 + */ +typedef OH_TrafficFilter_PacketDecision (*OH_TrafficFilter_PacketCallback)( + const OH_TrafficFilter_PacketDesc* packet, + void* userData +); + +/** + * @brief 报文拷贝模式枚举 + * @since 26.1.0 + */ +typedef enum OH_TrafficFilter_PacketCopyMode { + /** + * @brief 仅拷贝元数据(不拷贝报文数据) + * @since 26.1.0 + */ + OH_TRAFFICFILTER_COPY_MODE_META = 0, + /** + * @brief 仅拷贝报文头(由packetCopyLen指定) + * @since 26.1.0 + */ + OH_TRAFFICFILTER_COPY_MODE_HEADER = 1, + /** + * @brief 拷贝整个报文 + * @since 26.1.0 + */ + OH_TRAFFICFILTER_COPY_MODE_FULL = 2, + /** + * @brief 按指定最大长度拷贝报文 + * @since 26.1.0 + */ + OH_TRAFFICFILTER_COPY_MODE_MAXLEN = 3 +} OH_TrafficFilter_PacketCopyMode; + +/** + * @brief NFQueue配置结构体 + * - 如果`config`为**NULL**,实现将应用以下默认值: + * - `packetCopyLen` = 0xFFFF(拷贝整个报文) + * - `nfqueueMaxlen` = 0 (使用系统默认值,即1024) + * - `nfqueueFlags` = OH_TRAFFICFILTER_NFQUEUE_FLAG_FAIL_OPEN + * - 如果`config`为**非NULL**,调用者**必须**: + * 1. 将整个结构体零初始化(例如`memset(&cfg, 0, sizeof(cfg))`)。 + * 2. 设置`size` = `sizeof(OH_TrafficFilter_Config)`。 + * 3. 将所有其他字段设置为定义范围内的有效值(见下文)。 + * - **未遵守**此约定(例如`size`不正确、字段值超出范围) + * 将导致接口返回`OH_TRAFFICFILTER_ERROR_INVALID_PARAM`。 + * + * @note 未遵守此初始化约定可能导致未定义行为或跨版本 + * 的二进制不兼容。 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_Config { + /** + * @brief 调用者必须将其设置为`sizeof(OH_TrafficFilter_Config)`。 + * 调用者需要先零初始化结构体,然后设置此字段。 + * 实现使用此值来确定有效数据范围,以实现二进制兼容。 + * @since 26.1.0 + */ + uint32_t size; + /** + * @brief NFQueue报文拷贝模式,参见OH_TrafficFilter_PacketCopyMode + * @since 26.1.0 + */ + uint32_t packetCopyMode; + /** + * @brief NFQueue报文拷贝长度(字节),0xFFFF表示拷贝整个报文,较小的值仅拷贝报文头 + * @since 26.1.0 + */ + uint32_t packetCopyLen; + /** + * @brief NFQueue最大队列长度(报文数量),0表示系统默认值(1024) + * @since 26.1.0 + */ + uint32_t nfqueueMaxlen; + /** + * @brief NFQueue队列标志,参见OH_TRAFFICFILTER_NFQUEUE_FLAG_*定义 + * @since 26.1.0 + */ + uint32_t nfqueueFlags; +} OH_TrafficFilter_Config; + +/** + * @brief MAC地址匹配条件 + * + * 基于MAC地址匹配报文 + * 仅支持源MAC地址 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_MACMatch { + /** + * @brief 启用MAC地址匹配 + * @since 26.1.0 + */ + bool enable; + /** + * @brief 是否反转匹配结果 + * @since 26.1.0 + */ + bool invert; + /** + * @brief 源MAC地址,格式为"XX:XX:XX:XX:XX:XX"。 + * ASCII/UTF-8编码,必须以null结尾。 + * OH_TRAFFICFILTER_MAC_ADDRSTRLEN包含null终止符; + * 最大有效字符串长度为17个字符。 + * 格式无效将导致规则设置接口返回OH_TRAFFICFILTER_ERROR_INVALID_PARAM。 + * @since 26.1.0 + */ + char srcMac[OH_TRAFFICFILTER_MAC_ADDRSTRLEN]; +} OH_TrafficFilter_MACMatch; + +/** + * @brief TCP标志匹配条件 + * + * 基于TCP标志设置匹配TCP报文 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_TCPFlagsMatch { + /** + * @brief 启用TCP标志匹配 + * @since 26.1.0 + */ + bool enable; + /** + * @brief 标志掩码(指定要检查的标志,使用OH_TRAFFICFILTER_TCP_FLAG_*常量) + * @since 26.1.0 + */ + uint8_t flagMask; + /** + * @brief 比较标志(指定必须设置的标志) + * @since 26.1.0 + */ + uint8_t flagComp; +} OH_TrafficFilter_TCPFlagsMatch; + +/** + * @brief 连接跟踪匹配条件 + * + * 基于连接跟踪状态匹配报文 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_ConntrackMatch { + /** + * @brief 启用连接跟踪匹配 + * @since 26.1.0 + */ + bool enable; + /** + * @brief 连接状态(使用OH_TRAFFICFILTER_CT_STATE_*位图) + * @since 26.1.0 + */ + uint8_t stateMask; +} OH_TrafficFilter_ConntrackMatch; + +/** + * @brief 报文过滤规则 + * + * 定义报文匹配条件。 + * 1. **初始化约定(调用方)**: + * - 调用者必须在使用前将整个结构体**零初始化**(例如通过`memset`)。 + * - `size`字段**必须**显式设置为`sizeof(OH_TrafficFilter_FilterRule)`。 + * - 如果`size`小于`sizeof(OH_TrafficFilter_FilterRule)`,实现将仅读取截至`size`的稳定 + * 前缀字段,忽略后续字节。 + * + * 2. **读取约定(实现方)**: + * - 实现严格根据`size`值确定有效字段范围。 + * - 如果`size` < `sizeof(OH_TrafficFilter_FilterRule)`,实现将其视为旧版本,仅读取 + * 与该大小兼容的前缀字段。 + * - 如果`size`为0或指针为NULL,实现必须返回错误。 + * + * @note 未遵守此初始化约定可能导致未定义行为或跨版本 + * 的二进制不兼容。 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_FilterRule { + /** + * @brief 调用者必须将其设置为`sizeof(OH_TrafficFilter_FilterRule)`。 + * 调用者需要先零初始化结构体,然后设置此字段。 + * 实现使用此值来确定有效数据范围,以实现二进制兼容。 + * @since 26.1.0 + */ + uint32_t size; + /** + * @brief 优先级(数值越小优先级越高) + * @since 26.1.0 + */ + uint32_t priority; + /** + * @brief 钩子点 + * @since 26.1.0 + */ + OH_TrafficFilter_HookPoint hookPoint; + /** + * @brief 协议(0=任意,6=TCP,17=UDP) + * @since 26.1.0 + */ + uint8_t protocol; + /** + * @brief 源IP匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_IPMatch srcIp; + /** + * @brief 源端口匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_PortMatch srcPort; + /** + * @brief 目的IP匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_IPMatch dstIp; + /** + * @brief 目的端口匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_PortMatch dstPort; + /** + * @brief 入接口匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_InterfaceMatch inInterface; + /** + * @brief 出接口匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_InterfaceMatch outInterface; + /** + * @brief 应用UID范围起始值(包含)。有效范围:0到UINT32_MAX。 + * 要匹配任意UID,将uidStart和uidEnd都设置为UINT32_MAX。 + * 如果uidStart > uidEnd,规则设置接口返回OH_TRAFFICFILTER_ERROR_INVALID_PARAM。 + * 零初始化后,uidStart=0且uidEnd=0,仅匹配UID 0。 + * @since 26.1.0 + */ + uint32_t uidStart; + /** + * @brief 应用UID范围结束值(包含)。有效范围:0到UINT32_MAX。 + * 使用详情参见uidStart。 + * @since 26.1.0 + */ + uint32_t uidEnd; + /** + * @brief MAC地址匹配条件(仅源MAC) + * @since 26.1.0 + */ + OH_TrafficFilter_MACMatch macMatch; + /** + * @brief TCP标志匹配条件(仅对TCP协议有效) + * @since 26.1.0 + */ + OH_TrafficFilter_TCPFlagsMatch tcpFlagsMatch; + /** + * @brief 连接跟踪匹配条件 + * @since 26.1.0 + */ + OH_TrafficFilter_ConntrackMatch conntrackMatch; +} OH_TrafficFilter_FilterRule; + +/** + * @brief 报文控制器 + * @since 26.1.0 + */ +typedef struct OH_TrafficFilter_PacketController OH_TrafficFilter_PacketController; + +#ifdef __cplusplus +} +#endif + +#endif /* NET_TRAFFICFILTER_TYPE_H */ +/** @} */