已合并
添加包过滤规则接口 #3673
添加包过滤规则接口 #3673
已合并
panjie创建于 7月3日
2 个文件变更+494-0
@@ -156,6 +156,121 @@ int32_t OH_TrafficFilter_QueryProcess(
156 OH_TrafficFilter_ProcessInfo* process_info156 OH_TrafficFilter_ProcessInfo* process_info
157);157);
158 158 
159+/**
160+ * @brief 创建报文控制器实例。
161+ *
162+ * 用于拦截和过滤网络报文。
163+ * 资源管理:该实例占用系统资源,必须调用{@link OH_TrafficFilter_DestroyPacketController}释放资源。
164+ * 如果该函数失败,不会返回有效的控制器。
165+ *
166+ * @param group_id 过滤链标识符。同一应用内的多个控制器可以使用不同的group_id。不同应用的相同group_id会自动隔离。
167+ * 取值范围为[{@link OH_TRAFFICFILTER_MIN_GROUP_ID}, {@link OH_TRAFFICFILTER_MAX_GROUP_ID}],
168+ * @param priority 优先级(决定不同group_id链之间的执行顺序,数值越小执行优先级越高)。
169+ * 取值范围为[{@link OH_TRAFFICFILTER_MIN_PRIORITY}, {@link OH_TRAFFICFILTER_MAX_PRIORITY}],
170+ * @param config 配置参数(配置为NULL时表示使用默认配置)。
171+ * @param controller 出参,成功时为报文控制器句柄。失败时为NULL,句柄不可用。
172+ * @return <ul><li>{@link OH_TRAFFICFILTER_OK} 成功。</li>
173+ * <li>{@link OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED} 缺少权限。</li>
174+ * <li>{@link OH_TRAFFICFILTER_ERROR_GROUP_ID_IN_USE} group_id已存在。</li>
175+ * <li>{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM} group_id或priority无效。</li>
176+ * <li>{@link OH_TRAFFICFILTER_ERROR_NFQUEUE_ERROR} NFQueue初始化失败。</li></ul>
177+ *
178+ * @permission ohos.permission.kernel.TRAFFIC_FILTER
179+ * @since 26.1.0
180+ */
181+int32_t OH_TrafficFilter_CreatePacketController(
182+ uint32_t group_id,
183+ uint32_t priority,
184+ const OH_TrafficFilter_Config* config,
185+ OH_TrafficFilter_PacketController** controller
186+);
187+ 
188+/**
189+ * @brief 销毁报文控制器实例。
190+ *
191+ * 销毁控制器实例并释放相关资源(包括规则),调用后句柄将失效。
192+ *
193+ * @param controller OH_TrafficFilter_PacketController句柄。
194+ * @return <ul><li>{@link OH_TRAFFICFILTER_OK} 成功。</li>
195+ * <li>{@link OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED} 缺少权限。</li>
196+ * <li>{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM} controller为NULL。</li>
197+ * <li>{@link OH_TRAFFICFILTER_ERROR_NOT_FOUND} 未找到指定的控制器句柄。</li></ul>
198+ *
199+ * @permission ohos.permission.kernel.TRAFFIC_FILTER
200+ * @since 26.1.0
201+ */
202+int32_t OH_TrafficFilter_DestroyPacketController(OH_TrafficFilter_PacketController* controller);
203+ 
204+/**
205+ * @brief 注册报文回调函数。
206+ *
207+ * 注册一个回调函数用于处理拦截到的报文,当报文匹配到过滤规则时,将触发该回调。
208+ *
209+ * @note 如需释放回调,需调用{@link OH_TrafficFilter_UnregisterPacketCallback}。
210+ * @param controller {@link OH_TrafficFilter_PacketController}句柄。
211+ * @param callback 回调函数指针。不能为NULL
212+ * @param userData 用户数据(将在回调中回传)。
213+ * @return <ul><li>{@link OH_TRAFFICFILTER_OK} 成功。</li>
214+ * <li>{@link OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED} 缺少权限。</li>
215+ * <li>{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM} controller或callback为NULL。</li></ul>
216+ *
217+ * @permission ohos.permission.kernel.TRAFFIC_FILTER
218+ * @since 26.1.0
219+ */
220+int32_t OH_TrafficFilter_RegisterPacketCallback(
221+ OH_TrafficFilter_PacketController* controller,
222+ OH_TrafficFilter_PacketCallback callback,
223+ void* userData
224+);
225+ 
226+/**
227+ * @brief 注销报文回调函数。
228+ *
229+ * @param controller {@link OH_TrafficFilter_PacketController}句柄。
230+ * @return <ul><li>{@link OH_TRAFFICFILTER_OK} 成功。</li>
231+ * <li>{@link OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED} 缺少权限。</li>
232+ * <li>{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM} controller为NULL。</li></ul>
233+ *
234+ * @permission ohos.permission.kernel.TRAFFIC_FILTER
235+ * @since 26.1.0
236+ */
237+int32_t OH_TrafficFilter_UnregisterPacketCallback(OH_TrafficFilter_PacketController* controller);
238+ 
239+/**
240+ * @brief 设置报文过滤规则。
241+ *
242+ * @note 逻辑关系:
243+ * - 单个{@link OH_TrafficFilter_FilterRule}结构内的条件为逻辑与关系。
244+ * - 添加到同一{@link OH_TrafficFilter_PacketController}的多个规则为逻辑或关系。
245+ * 如需清除过滤规则,需调用{@link OH_TrafficFilter_ClearPacketRule}。
246+ * @param controller {@link OH_TrafficFilter_PacketController}句柄。
247+ * @param rule 过滤规则。不能为NULL
248+ * @return <ul><li>{@link OH_TRAFFICFILTER_OK} 成功。</li>
249+ * <li>{@link OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED} 缺少权限。</li>
250+ * <li>{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM} controller或rule为NULL。</li>
251+ * <li>{@link OH_TRAFFICFILTER_ERROR_TOO_MANY_RULES} 添加的规则过多。</li></ul>
252+ *
253+ * @permission ohos.permission.kernel.TRAFFIC_FILTER
254+ * @since 26.1.0
255+ */
256+int32_t OH_TrafficFilter_AddPacketRule(
257+ OH_TrafficFilter_PacketController* controller,
258+ const OH_TrafficFilter_FilterRule* rule
259+);
260+ 
261+/**
262+ * @brief 清除报文过滤规则。
263+ *
264+ * @param controller {@link OH_TrafficFilter_PacketController}句柄。
265+ * @return <ul><li>{@link OH_TRAFFICFILTER_OK} 成功。</li>
266+ * <li>{@link OH_TRAFFICFILTER_ERROR_PERMISSION_DENIED} 缺少权限。</li>
267+ * <li>{@link OH_TRAFFICFILTER_ERROR_INVALID_PARAM} controller为NULL。</li></ul>
268+ *
269+ * @permission ohos.permission.kernel.TRAFFIC_FILTER
270+ * @since 26.1.0
271+ */
272+int32_t OH_TrafficFilter_ClearPacketRule(OH_TrafficFilter_PacketController* controller);
273+ 
159#ifdef __cplusplus274#ifdef __cplusplus
160}275}
161#endif276#endif
@@ -144,6 +144,96 @@ extern "C" {
144#define OH_TRAFFICFILTER_PROTO_ICMP 1144#define OH_TRAFFICFILTER_PROTO_ICMP 1
145#define OH_TRAFFICFILTER_PROTO_ICMPV6 58145#define OH_TRAFFICFILTER_PROTO_ICMPV6 58
146 146 
147+/**
148+ * @brief TCP 同步标志。
149+ * @since 26.1.0
150+ */
151+#define OH_TRAFFICFILTER_TCP_FLAG_SYN 0x01
152+ 
153+/**
154+ * @brief TCP 确认标志。
155+ * @since 26.1.0
156+ */
157+#define OH_TRAFFICFILTER_TCP_FLAG_ACK 0x02
158+ 
159+/**
160+ * @brief TCP 结束标志。
161+ * @since 26.1.0
162+ */
163+#define OH_TRAFFICFILTER_TCP_FLAG_FIN 0x04
164+ 
165+/**
166+ * @brief TCP 复位标志。
167+ * @since 26.1.0
168+ */
169+#define OH_TRAFFICFILTER_TCP_FLAG_RST 0x08
170+ 
171+/**
172+ * @brief TCP 推送标志。
173+ * @since 26.1.0
174+ */
175+#define OH_TRAFFICFILTER_TCP_FLAG_PSH 0x10
176+ 
177+/**
178+ * @brief TCP 紧急标志。
179+ * @since 26.1.0
180+ */
181+#define OH_TRAFFICFILTER_TCP_FLAG_URG 0x20
182+ 
183+/**
184+ * @brief 所有 TCP 标志位掩码。
185+ * @since 26.1.0
186+ */
187+#define OH_TRAFFICFILTER_TCP_FLAG_ALL 0x3F
188+ 
189+/**
190+ * @brief 无 TCP 标志。
191+ * @since 26.1.0
192+ */
193+#define OH_TRAFFICFILTER_TCP_FLAG_NONE 0x00
194+ 
195+/**
196+ * @brief 任意连接状态。
197+ * @since 26.1.0
198+ */
199+#define OH_TRAFFICFILTER_CT_STATE_ANY 0x00
200+ 
201+/**
202+ * @brief 新连接。
203+ * @since 26.1.0
204+ */
205+#define OH_TRAFFICFILTER_CT_STATE_NEW 0x01
206+ 
207+/**
208+ * @brief 已建立的连接。
209+ * @since 26.1.0
210+ */
211+#define OH_TRAFFICFILTER_CT_STATE_ESTABLISHED 0x02
212+ 
213+/**
214+ * @brief 关联连接(如 FTP 数据连接)。
215+ * @since 26.1.0
216+ */
217+#define OH_TRAFFICFILTER_CT_STATE_RELATED 0x04
218+ 
219+/**
220+ * @brief 无效连接。
221+ * @since 26.1.0
222+ */
223+#define OH_TRAFFICFILTER_CT_STATE_INVALID 0x08
224+ 
225+/**
226+ * @brief 未跟踪的连接。
227+ * @since 26.1.0
228+ */
229+#define OH_TRAFFICFILTER_CT_STATE_UNTRACKED 0x10
230+ 
231+/**
232+ * @brief MAC地址字符串的最大长度(XX:XX:XX:XX:XX:XX格式)。
233+ * @since 26.1.0
234+ */
235+#define OH_TRAFFICFILTER_MAC_ADDRSTRLEN 18
236+ 
147/**237/**
148 * @brief 流量过滤与重定向错误码。238 * @brief 流量过滤与重定向错误码。
149 * @since 26.0.0239 * @since 26.0.0
@@ -745,6 +835,295 @@ typedef struct OH_TrafficFilter_RedirectRule {
745 uint16_t proxyPort;835 uint16_t proxyPort;
746} OH_TrafficFilter_RedirectRule;836} OH_TrafficFilter_RedirectRule;
747 837 
838+/**
839+ * @brief MAC地址匹配条件。
840+ * @since 26.1.0
841+ */
842+typedef struct OH_TrafficFilter_MACMatch {
843+ /**
844+ * @brief 是否启用MAC地址匹配,true表示启用MAC地址匹配,false表示不启用MAC地址匹配。
845+ * @since 26.1.0
846+ */
847+ bool enable;
848+ /**
849+ * @brief 是否反转匹配结果。true表示反转匹配结果,false表示不反转匹配结果。
850+ * @since 26.1.0
851+ */
852+ bool invert;
853+ /**
854+ * @brief 源MAC地址(XX:XX:XX:XX:XX:XX格式)。
855+ * @since 26.1.0
856+ */
857+ char srcMac[OH_TRAFFICFILTER_MAC_ADDRSTRLEN];
858+} OH_TrafficFilter_MACMatch;
859+ 
860+/**
861+ * @brief TCP标志位匹配条件。
862+ * @since 26.1.0
863+ */
864+typedef struct OH_TrafficFilter_TCPFlagsMatch {
865+ /**
866+ * @brief 是否启用TCP标志位匹配,true表示启用TCP标志位匹配,false表示不启用TCP标志位匹配。
867+ * @since 26.1.0
868+ */
869+ bool enable;
870+ /**
871+ * @brief 标志位掩码(指定检查哪些标志位,使用TCP标志位常量)。
872+ * @since 26.1.0
873+ */
874+ uint8_t flagMask;
875+ /**
876+ * @brief 标志位比较值(指定哪些标志位必须置位)。
877+ * @since 26.1.0
878+ */
879+ uint8_t flagComp;
880+} OH_TrafficFilter_TCPFlagsMatch;
881+ 
882+/**
883+ * @brief 连接跟踪(conntrack)匹配条件。
884+ * @since 26.1.0
885+ */
886+typedef struct OH_TrafficFilter_ConntrackMatch {
887+ /**
888+ * @brief 是否启用连接跟踪匹配,true表示启用连接跟踪匹配,false表示不启用连接跟踪匹配。
889+ * @since 26.1.0
890+ */
891+ bool enable;
892+ /**
893+ * @brief 连接状态(使用OH_TRAFFICFILTER_CT_STATE_*位图)。
894+ * @since 26.1.0
895+ */
896+ uint8_t stateMask;
897+} OH_TrafficFilter_ConntrackMatch;
898+ 
899+/**
900+ * @brief 报文复制模式枚举。
901+ * @since 26.1.0
902+ */
903+typedef enum OH_TrafficFilter_PacketCopyMode {
904+ /**
905+ * @brief 仅复制元数据(不复制报文数据)。
906+ * @since 26.1.0
907+ */
908+ OH_TRAFFICFILTER_COPY_MODE_META = 0,
909+ /**
910+ * @brief 仅复制报文头部(由 packetCopyLen 指定)。
911+ * @since 26.1.0
912+ */
913+ OH_TRAFFICFILTER_COPY_MODE_HEADER = 1,
914+ /**
915+ * @brief 复制整个报文。
916+ * @since 26.1.0
917+ */
918+ OH_TRAFFICFILTER_COPY_MODE_FULL = 2,
919+ /**
920+ * @brief 复制指定最大长度的报文。
921+ * @since 26.1.0
922+ */
923+ OH_TRAFFICFILTER_COPY_MODE_MAXLEN = 3
924+} OH_TrafficFilter_PacketCopyMode;
925+ 
926+/**
927+ * @brief NFQueue配置结构体。
928+ * @since 26.1.0
929+ */
930+typedef struct OH_TrafficFilter_Config {
931+ /**
932+ * @brief 调用者分配的结构体实际大小。
933+ * @since 26.1.0
934+ */
935+ uint32_t size;
936+ /**
937+ * @brief NFQueue 报文拷贝模式,请参考OH_TrafficFilter_PacketCopyMode。
938+ * @since 26.1.0
939+ */
940+ uint32_t packetCopyMode;
941+ /**
942+ * @brief NFQueue报文拷贝长度(字节),0xFFFF表示拷贝整个报文,较小的值仅拷贝报文头。
943+ * @since 26.1.0
944+ */
945+ uint32_t packetCopyLen;
946+ /**
947+ * @brief NFQueue最大队列长度(报文数量),0表示使用系统默认值(1024)。
948+ * @since 26.1.0
949+ */
950+ uint32_t nfqueueMaxlen;
951+ /**
952+ * @brief NFQueue队列标志,参见{@link OH_TRAFFICFILTER_NFQUEUE_FLAG_FAIL_OPEN}。
953+ * @since 26.1.0
954+ */
955+ uint32_t nfqueueFlags;
956+} OH_TrafficFilter_Config;
957+ 
958+/**
959+ * @brief 报文过滤规则。
960+ * @since 26.1.0
961+ */
962+typedef struct OH_TrafficFilter_FilterRule {
963+ /**
964+ * @brief 调用者分配的结构体实际大小。
965+ * @since 26.1.0
966+ */
967+ uint32_t size;
968+ /**
969+ * @brief 优先级(数值越小优先级越高)。
970+ * @since 26.1.0
971+ */
972+ uint32_t priority;
973+ /**
974+ * @brief 钩子点。
975+ * @since 26.1.0
976+ */
977+ OH_TrafficFilter_HookPoint hookPoint;
978+ /**
979+ * @brief 协议类型(0=任意,6=TCP,17=UDP)。
980+ * @since 26.1.0
981+ */
982+ uint8_t protocol;
983+ /**
984+ * @brief 源IP匹配条件。
985+ * @since 26.1.0
986+ */
987+ OH_TrafficFilter_IPMatch srcIp;
988+ /**
989+ * @brief 源端口匹配条件。
990+ * @since 26.1.0
991+ */
992+ OH_TrafficFilter_PortMatch srcPort;
993+ /**
994+ * @brief 目的IP匹配条件。
995+ * @since 26.1.0
996+ */
997+ OH_TrafficFilter_IPMatch dstIp;
998+ /**
999+ * @brief 目的端口匹配条件。
1000+ * @since 26.1.0
1001+ */
1002+ OH_TrafficFilter_PortMatch dstPort;
1003+ /**
1004+ * @brief 入接口匹配条件。
1005+ * @since 26.1.0
1006+ */
1007+ OH_TrafficFilter_InterfaceMatch inInterface;
1008+ /**
1009+ * @brief 出接口匹配条件。
1010+ * @since 26.1.0
1011+ */
1012+ OH_TrafficFilter_InterfaceMatch outInterface;
1013+ /**
1014+ * @brief 应用UID范围起始值(UINT32_MAX表示任意)。
1015+ * @since 26.1.0
1016+ */
1017+ uint32_t uidStart;
1018+ /**
1019+ * @brief 应用UID范围结束值(UINT32_MAX表示任意)。
1020+ * @since 26.1.0
1021+ */
1022+ uint32_t uidEnd;
1023+ /**
1024+ * @brief MAC地址匹配条件(仅源MAC地址)。
1025+ * @since 26.1.0
1026+ */
1027+ OH_TrafficFilter_MACMatch macMatch;
1028+ /**
1029+ * @brief TCP标志位匹配条件(仅对TCP协议有效)。
1030+ * @since 26.1.0
1031+ */
1032+ OH_TrafficFilter_TCPFlagsMatch tcpFlagsMatch;
1033+ /**
1034+ * @brief 连接跟踪匹配条件。
1035+ * @since 26.1.0
1036+ */
1037+ OH_TrafficFilter_ConntrackMatch conntrackMatch;
1038+} OH_TrafficFilter_FilterRule;
1039+ 
1040+/**
1041+ * @brief 报文控制器。
1042+ * @since 26.1.0
1043+ */
1044+typedef struct OH_TrafficFilter_PacketController OH_TrafficFilter_PacketController;
1045+ 
1046+/**
1047+ * @brief 报文处理决策类型。
1048+ * @since 26.1.0
1049+ */
1050+typedef enum OH_TrafficFilter_PacketDecision {
1051+ /**
1052+ * @brief 接受报文。
1053+ * @since 26.1.0
1054+ */
1055+ OH_TRAFFICFILTER_DECISION_ACCEPT = 0,
1056+ /**
1057+ * @brief 丢弃报文。
1058+ * @since 26.1.0
1059+ */
1060+ OH_TRAFFICFILTER_DECISION_DROP
1061+} OH_TrafficFilter_PacketDecision;
1062+ 
1063+/**
1064+ * @brief 报文描述符。
1065+ * @since 26.1.0
1066+ */
1067+typedef struct OH_TrafficFilter_PacketDesc {
1068+ /**
1069+ * @brief 报文ID(报文到达netfilter时由内核分配)。
1070+ * @since 26.1.0
1071+ */
1072+ uint32_t packetId;
1073+ /**
1074+ * @brief 协议类型。
1075+ * @since 26.1.0
1076+ */
1077+ uint8_t protocol;
1078+ /**
1079+ * @brief 源IP地址(支持IPv4和IPv6)。
1080+ * @since 26.1.0
1081+ */
1082+ OH_TrafficFilter_IPAddress srcIp;
1083+ /**
1084+ * @brief 源端口。
1085+ * @since 26.1.0
1086+ */
1087+ uint16_t srcPort;
1088+ /**
1089+ * @brief 目的IP地址(支持IPv4和IPv6)。
1090+ * @since 26.1.0
1091+ */
1092+ OH_TrafficFilter_IPAddress dstIp;
1093+ /**
1094+ * @brief 目的端口。
1095+ * @since 26.1.0
1096+ */
1097+ uint16_t dstPort;
1098+ /**
1099+ * @brief 报文长度。
1100+ * @since 26.1.0
1101+ */
1102+ uint32_t packetLen;
1103+ /**
1104+ * @brief 报文数据指针(用户可修改,内存由系统管理,仅在回调期间有效)。
1105+ * @since 26.1.0
1106+ */
1107+ uint8_t* data;
1108+ /**
1109+ * @brief 用户数据(在回调中使用)。
1110+ * @since 26.1.0
1111+ */
1112+ void* userData;
1113+} OH_TrafficFilter_PacketDesc;
1114+ 
1115+/**
1116+ * @brief 报文回调函数类型。
1117+ *
1118+ * @param packet 报文描述符。
1119+ * @param userData 用户数据。
1120+ * @return 报文处理决策(接受或丢弃)。
1121+ * @since 26.1.0
1122+ */
1123+typedef OH_TrafficFilter_PacketDecision (*OH_TrafficFilter_PacketCallback)(
1124+ const OH_TrafficFilter_PacketDesc* packet,
1125+ void* userData
1126+);
748#ifdef __cplusplus1127#ifdef __cplusplus
749}1128}
750#endif1129#endif