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:01阅读更多 →
3分钟上手BOTW存档编辑器:塞尔达传说旷野之息存档修改完全指南

3分钟上手BOTW存档编辑器:塞尔达传说旷野之息存档修改完全指南

3分钟上手BOTW存档编辑器:塞尔达传说旷野之息存档修改完全指南 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否曾经在《塞尔达传说:旷…

2026/7/21 10:52:01阅读更多 →
终极空洞骑士模组管理器Scarab:三步打造个性化游戏体验

终极空洞骑士模组管理器Scarab:三步打造个性化游戏体验

终极空洞骑士模组管理器Scarab:三步打造个性化游戏体验 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab Scarab是一款专为《空洞骑士》设计的智能模组管理器&…

2026/7/21 10:52:01阅读更多 →
《键盘沉浸式样式》二、输入法应用沉浸模式指南

《键盘沉浸式样式》二、输入法应用沉浸模式指南

HarmonyOS 输入法应用沉浸模式开发指南:从前台应用到输入法的全链路沉浸式体验 前言 在 HarmonyOS 应用开发中,沉浸式体验已经成为提升用户感知品质的关键要素。当用户在搜索、编辑等场景中使用输入法时,如果键盘区域与应用界面之间存在明显…

2026/7/22 8:17:20阅读更多 →
从“人找数”到“数找人”:数猎天下Data Neo如何让企业终于敢用AI做决策

从“人找数”到“数找人”:数猎天下Data Neo如何让企业终于敢用AI做决策

一、行业阵痛:BI做了十年,数据还是“不敢用”“上个月的转化率为什么掉了?”——这个简单的问题,在大多数企业里依然要花两三天才能得到一个半信半疑的答案。不是因为没有数据,而是因为数据散落在十几张表里&#xff1…

2026/7/22 8:17:20阅读更多 →
BAS-NSGA-II算法在交直流微电网优化中的应用

BAS-NSGA-II算法在交直流微电网优化中的应用

1. 项目背景与核心价值交直流混合微电网作为新型电力系统的重要组成部分,正在重塑分布式能源的利用方式。这种同时包含交流母线和直流母线的架构,能够高效整合光伏、风电等可再生能源,并直接为数据中心、电动汽车充电桩等直流负载供电&#x…

2026/7/22 8:17:20阅读更多 →
AI写工作总结≠套模板!基于NLP任务分解的提示词设计法(附GPT-4o实测对比数据)

AI写工作总结≠套模板!基于NLP任务分解的提示词设计法(附GPT-4o实测对比数据)

更多请点击: https://codechina.net 第一章:AI写工作总结≠套模板!基于NLP任务分解的提示词设计法(附GPT-4o实测对比数据) 传统“三段式模板关键词堆砌”的提示词方式,常导致生成内容空洞、岗位特性缺失、…

2026/7/22 8:17:20阅读更多 →
孩子随行澳洲要准备什么?出生医学证明 NAATI 翻译办理流程详解

孩子随行澳洲要准备什么?出生医学证明 NAATI 翻译办理流程详解

2026年,国内家庭为孩子办理澳洲访客签证、学生签证、技术移民或家庭类签证时,出生医学证明用于证明孩子的出生信息、父母身份和亲子关系。非英文材料递交澳洲机构时,需要同时提供中文原件和英文译文。孩子未满18周岁时,出生证明、…

2026/7/22 8:17:20阅读更多 →
西蓝花矮砧密植模式下,水肥一体化滴灌系统从零搭建手册

西蓝花矮砧密植模式下,水肥一体化滴灌系统从零搭建手册

种西蓝花的朋友应该都有感触,这几年行情波动大,想赚钱就得在产量和品质上下功夫。矮砧密植这个模式在不少产区慢慢推广开了,它确实能提高土地利用率,让单位面积里多结几个花球。但密植带来的问题也很直接,植株挨得近&a…

2026/7/22 8:15:20阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →