Linux tc filter_classify分类器链匹配与action执行
Linux tc filter_classify分类器链匹配与action执行TCTraffic Control分类器链的核心入口是filter_classify函数它遍历挂在qdisc或clas上的filter链逐一调用每个filter的classify回调进行匹配判决。filter_classify定义在net/sched/cls_api.c中int filter_classify(struct tcf_proto *tp, struct sk_buff *skb,const struct tcf_walker *arg,struct tcf_result *res){int ret TC_ACT_UNSPEC;for (; tp; tp rcu_dereference_bh(tp-next)) {struct tcf_proto_ops *ops rcu_dereference_bh(tp-ops);if (tc_skip_classify(tp, skb))continue;ret ops-classify(skb, tp, res);switch (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) {case TC_ACT_JUMP:tp tcf_chain_jump(tp, res, ret);if (IS_ERR(tp))return PTR_ERR(tp);continue;case TC_ACT_STOLEN:case TC_ACT_TRAP:__qdisc_drop(skb, to_free);return ret;case TC_ACT_SHOT:return ret;case TC_ACT_REDIRECT:return ret;}if (ret ! TC_ACT_UNSPEC) {break;}}return ret;}每个tptcf_proto代表一个协议类型的分类器实例通过tp-next串联成单向链表。ops-classify是具体分类器u32、cls_flower、fw等注册的回调。以最常用的u32分类器为例其classify回调为u32_classifystatic int u32_classify(struct sk_buff *skb, const struct tcf_proto *tp,struct tcf_result *res){struct tc_u_common *tp_c tp-data;struct tc_u_knode *ht;struct tc_u32_sel *sel;int ret TC_ACT_SHOT;u32 key, mask;int off;ht u32_lookup_ht(tp_c, tp_c-h_ht);if (!ht)return TC_ACT_SHOT;while (ht) {struct tc_u_knode *n;for (n ht-next; n; n n-next) {sel n-sel;off skb_network_offset(skb) n-off;for (int i 0; i sel-nkeys; i) {key skb_header_pointer(skb, off sel-keys[i].off,sizeof(u32), sel-keys[i]) ?*(u32 *)(skb-data off sel-keys[i].off) : 0;mask sel-keys[i].mask;if ((key mask) ! sel-keys[i].val)goto skip;}if (n-similar)goto emulate;*res n-res;ret n-res.classid ? TC_ACT_UNSPEC : n-act;if (n-tp) {ret filter_classify(rcu_dereference_bh(n-tp), skb, NULL, res);if (ret ! TC_ACT_UNSPEC)return ret;continue;}if (ret TC_ACT_UNSPEC)continue;return ret;skip:continue;}ht u32_lookup_ht(tp_c, ht-ref);}return ret;}匹配成功后如果有action关联执行流程进入tcf_action_execint tcf_action_exec(struct sk_buff *skb, struct tc_action **act,int nr_actions, struct tcf_result *res){int ret;for (int i 0; i nr_actions; i) {const struct tc_action_ops *ops act[i]-ops;ret ops-act(skb, act[i], res);switch (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) {case TC_ACT_JUMP:if (res NULL || !tcf_action_jump(act[i], res, ret, i))return TC_ACT_SHOT;i res-tcfa_jump_index;continue;case TC_ACT_STOLEN:case TC_ACT_TRAP:case TC_ACT_SHOT:case TC_ACT_REDIRECT:return ret;case TC_ACT_PIPE:continue;case TC_ACT_UNSPEC:return ret;default:return ret;}}return ret;}tcf_action_exec遍历actions数组依次执行。核心动作包括TC_ACT_PIPE继续下一条action、TC_ACT_STOLENskb已被消费、TC_ACT_SHOT丢弃、TC_ACT_REDIRECT重定向。JUMP动作允许在action链内跳转到指定索引配合TC_ACT_JUMP宏#define TC_ACT_JUMP 0x10000000当classify返回TC_ACT_UNSPEC且未查找classid时调用者如sch_handle_ingress需要决定skb的最终流向。在ingress路径中如果filter未命中则按正常RX路径继续在egress路径中filter未命中则直接发送。整个流程的调用栈在ingress侧为__netif_receive_skb_core- sch_handle_ingress- tcf_classify_ingress- filter_classify- u32_classify / cls_flower_classify (etc.)- tcf_action_exec- act-ops-act (e.g. tcf_gact_act, tcf_mirred_act)filter链支持共享块shared block通过tcf_block结构体组织多个chain。每个chain包含filter链的头指针chain之间通过jump指令跳转实现多级分类流水线。block的lookup使用tcf_block_lookupstruct tcf_chain *tcf_block_lookup(struct tcf_block *block, u32 chain_index){if (chain_index block-chain_max)return NULL;return rcu_dereference_bh(block-chain[chain_index]);}各个分类器通过rtnetlink接口进行配置用户态通过tc命令添加filter时内核在tcf_proto_create中分配tp实例并注册到chain的filter链表头部。replace操作调用tcf_proto_replace将新实例原子替换旧实例保证RCU安全。delete操作则通过tcf_proto_destroy进行引用计数递减和最终释放。

相关新闻

5个实用技巧:轻松掌握iCloud照片批量下载神器

5个实用技巧:轻松掌握iCloud照片批量下载神器

5个实用技巧:轻松掌握iCloud照片批量下载神器 【免费下载链接】icloud_photos_downloader A command-line tool to download photos from iCloud 项目地址: https://gitcode.com/GitHub_Trending/ic/icloud_photos_downloader 你是否曾经担心iCloud中的珍贵照…

2026/7/21 10:54:11 阅读更多 →
高效API测试与调试神器:Restfox深度解析与实战指南

高效API测试与调试神器:Restfox深度解析与实战指南

高效API测试与调试神器:Restfox深度解析与实战指南 【免费下载链接】Restfox Offline-First Minimalistic HTTP & Socket Testing Client for the Web & Desktop 项目地址: https://gitcode.com/gh_mirrors/re/Restfox Restfox是一款专为现代开发者设…

2026/7/21 10:53:10 阅读更多 →
STM32F103C8T6光伏发电量检测:从ADC采样到工程实践全链路解析

STM32F103C8T6光伏发电量检测:从ADC采样到工程实践全链路解析

最近在整理一些嵌入式项目时,发现一个挺有意思的现象:很多同学在做光伏相关的课程设计或毕业设计时,会直接搜索“STM32F103C8T6 光伏发电量检测”这样的关键词,然后期望找到一个现成的、能直接运行的完整项目。结果往往是&#xf…

2026/7/21 10:53:10 阅读更多 →

最新新闻

小程序毕业设计-基于 SSM + 微信小程序的校园失物招领平台的设计与实现 智慧校园失物招领便民服务小程序设计(源码+LW+部署文档+全bao+远程调试+代码讲解等)

小程序毕业设计-基于 SSM + 微信小程序的校园失物招领平台的设计与实现 智慧校园失物招领便民服务小程序设计(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/21 18:17:10 阅读更多 →
小程序毕业设计-基于 SpringBoot + 微信小程序的中医知源科普服务小程序的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

小程序毕业设计-基于 SpringBoot + 微信小程序的中医知源科普服务小程序的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/21 18:17:10 阅读更多 →
3种AI图像超分模型组合策略:从新手到专家的完整指南

3种AI图像超分模型组合策略:从新手到专家的完整指南

3种AI图像超分模型组合策略:从新手到专家的完整指南 【免费下载链接】upscaler 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/upscaler 掌握AI图像超分模型组合应用技巧,你将能够将任何低分辨率图片转化为高清艺术品。这个开源项目汇…

2026/7/21 18:17:10 阅读更多 →
计算机小程序毕设实战-基于SpringBoot的智慧中医养生知识普及小程序的设计与实现 移动端中医知识查询与养生指导平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机小程序毕设实战-基于SpringBoot的智慧中医养生知识普及小程序的设计与实现 移动端中医知识查询与养生指导平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/21 18:17:10 阅读更多 →
终极GTA修复指南:如何让经典三部曲在现代电脑上完美运行

终极GTA修复指南:如何让经典三部曲在现代电脑上完美运行

终极GTA修复指南:如何让经典三部曲在现代电脑上完美运行 【免费下载链接】SilentPatch SilentPatch for GTA III, Vice City, and San Andreas 项目地址: https://gitcode.com/gh_mirrors/si/SilentPatch 还在为《侠盗猎车手》三部曲在现代Windows系统上的崩…

2026/7/21 18:17:10 阅读更多 →
如何安全关闭gh_mirrors/pi/pi-cluster:Ansible自动化与物理断电最佳流程

如何安全关闭gh_mirrors/pi/pi-cluster:Ansible自动化与物理断电最佳流程

如何安全关闭gh_mirrors/pi/pi-cluster:Ansible自动化与物理断电最佳流程 【免费下载链接】pi-cluster Raspberry Pi Cluster automation 项目地址: https://gitcode.com/gh_mirrors/pi/pi-cluster gh_mirrors/pi/pi-cluster是一个基于Raspberry Pi的集群自动…

2026/7/21 18:16:10 阅读更多 →

日新闻

Octane Render与C4D汉化版安装与优化指南

Octane Render与C4D汉化版安装与优化指南

1. Octane Render与C4D的黄金组合:为什么选择这个方案?在三维创作领域,渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D(C4D)用户,Octane Render的GPU加速特性与实时预览功能&#xff…

2026/7/21 0:00:19 阅读更多 →
GPMC接口设计:异步/同步模式与多路复用配置实战

GPMC接口设计:异步/同步模式与多路复用配置实战

1. GPMC接口设计:从硬件连接到软件配置的全局视角在嵌入式系统开发中,尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里,外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash,还是作为高速数据…

2026/7/21 0:00:19 阅读更多 →
UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

1. 项目概述:UE5 GAS RPG被动技能的核心价值在UE5里用GAS(Gameplay Ability System)做RPG游戏,主动技能像是你手里的武器,按一下打一下,逻辑直接,反馈也快。但被动技能,它更像是你身…

2026/7/21 0:00:19 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻