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/9/21 0:33:17 阅读更多 →
高效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/9/20 5:03:21 阅读更多 →
STM32F103C8T6光伏发电量检测:从ADC采样到工程实践全链路解析

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

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

2026/9/20 10:50:28 阅读更多 →

最新新闻

用 Python 打造 IMDB 电影信息爬虫:Movie Information Scraper 源码解析与实战指南

用 Python 打造 IMDB 电影信息爬虫:Movie Information Scraper 源码解析与实战指南

用 Python 打造 IMDB 电影信息爬虫:Movie Information Scraper 源码解析与实战指南 【免费下载链接】python-mini-projects A collection of simple python mini projects to enhance your python skills 项目地址: https://gitcode.com/gh_mirrors/py/python-min…

2026/9/21 0:33:18 阅读更多 →
Claude Code 里挂 gsearch-cli 搜索 Skill,Base URL 填 TaoToken

Claude Code 里挂 gsearch-cli 搜索 Skill,Base URL 填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 0:33:18 阅读更多 →
Abaqus CAE 认不出 oneAPI?让 Codex 走 TaoToken 对着 launcher.bat 排查

Abaqus CAE 认不出 oneAPI?让 Codex 走 TaoToken 对着 launcher.bat 排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 0:33:18 阅读更多 →
Vue3 /api 代理取不到 gdp.json?用 TaoToken 接入的 Codex 改 vite.config.js

Vue3 /api 代理取不到 gdp.json?用 TaoToken 接入的 Codex 改 vite.config.js

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 0:33:18 阅读更多 →
放弃Notion自建开源知识库:从选型到Docker部署的完整实践指南

放弃Notion自建开源知识库:从选型到Docker部署的完整实践指南

作为一个在团队协作工具里摸爬滚打多年的老运维,我对 Notion 的感情很复杂:功能确实好用,but 那个订阅价格,尤其是团队规模上来之后,每年算总账的时候真的肉疼。后来我盯上了开源知识库这条路线,尤其是那个…

2026/9/21 0:33:18 阅读更多 →
ccusage 仓库提交规范实战:基于 git apply 的原子化 Conventional Commits 工作流

ccusage 仓库提交规范实战:基于 git apply 的原子化 Conventional Commits 工作流

AI 应用CLI开发工具 【免费下载链接】ccusage npx ccusage 项目地址: https://gitcode.com/gh_mirrors/cc/ccusage 点击查看 免费下载 本篇文章深入解读 ccusage 仓库内置的 commit 技能(.agents/skills/commit/SKILL.md),完整还…

2026/9/21 0:32:18 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →