Linux netdev master LAG聚合与slave优先级切换
Linux netdev master LAG聚合与slave优先级切换Linux bonding/LAGLink Aggregation驱动位于drivers/net/bonding/通过bonding master设备聚合多个slave网卡提供负载均衡和链路冗余。核心数据模型基于netdev_master_upper_dev_link建立上层链路关系。bonding初始化时创建一个master net_device每个实际网卡作为slave加入。bond_enslave函数将slave绑定到masterint bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,struct netlink_ext_ack *extack){struct bonding *bond netdev_priv(bond_dev);struct slave *slave;int res;slave kzalloc(sizeof(struct slave), GFP_KERNEL);if (!slave)return -ENOMEM;slave-dev slave_dev;slave-bond bond;dev_hold(slave_dev);netdev_master_upper_dev_link(slave_dev, bond_dev, slave, NULL, NULL);if (bond-params.mode BOND_MODE_8023AD) {slave-ad_info.actor_system bond-params.ad_actor_system;slave-ad_info.aggregator_id 0;}res bond_set_slave_link_state(slave, BOND_LINK_UP,BR_STATE_NONE, NULL);if (res)goto err_unlink;if (bond-params.mode BOND_MODE_ACTIVEBACKUP) {if (!bond-curr_active_slave) {bond_set_active_slave(slave);bond-curr_active_slave slave;} else {bond_set_backup_slave(slave);}}slave-original_mtu slave_dev-mtu;slave-speed slave_dev-ethtool_ops ?slave_dev-ethtool_ops-get_link_ksettings ?slave_dev-ethtool_ops-get_link_ksettings(...): SPEED_UNKNOWN : SPEED_UNKNOWN;if (bond-params.mode BOND_MODE_ACTIVEBACKUP ||bond-params.mode BOND_MODE_ROUNDROBIN ||bond-params.mode BOND_MODE_BALANCE_RR)bond_set_slave_inactive_flags(slave, BOND_SLAVE_NOTIFY_NOW);bond_update_slave_arr(bond, NULL);return 0;err_unlink:netdev_upper_dev_unlink(slave_dev, bond_dev);dev_put(slave_dev);kfree(slave);return res;}主备模式active-backup下slave优先级切换由bond_select_active_slave决定struct slave *bond_select_active_slave(struct bonding *bond){struct slave *best_slave NULL;struct list_head *iter;struct slave *slave;int best_priority -1;bond_for_each_slave(bond, slave, iter) {if (!bond_slave_can_tx(slave))continue;if (slave-link BOND_LINK_DOWN)continue;if (!bond_has_lii(bond, slave))continue;if (slave-priority best_priority) {best_priority slave-priority;best_slave slave;}}if (best_slave)bond_set_active_slave(best_slave);return best_slave;}slave优先级通过netlink属性IFLA_BOND_SLAVE_PRIORITY设置默认值为0。优先级高的slave优先成为active。当active slave的link down时bonding在bond_mii_monitor中检测到状态变化触发failoverstatic void bond_mii_monitor(struct work_struct *work){struct bonding *bond container_of(work, struct bonding,mii_work.work);struct slave *slave, *oldactive;bool should_notify_peers false;bool commit false;read_lock(bond-lock);oldactive bond-curr_active_slave;bond_for_each_slave(bond, slave, iter) {int link_state bond_check_dev_link(bond, slave-dev, 0);if (link_state ! slave-link) {slave-link link_state;if (link_state BOND_LINK_DOWN) {if (slave bond-curr_active_slave) {commit true;}}}}if (commit bond-curr_active_slave bond-curr_active_slave-link BOND_LINK_DOWN) {bond_set_slave_inactive_flags(bond-curr_active_slave,BOND_SLAVE_NOTIFY_NOW);bond_select_active_slave(bond);}read_unlock(bond-lock);if (bond-curr_active_slave ! oldactive) {netdev_cmd_send_sw(bond-dev, NETDEV_BONDING_FAILOVER,NULL, NULL);should_notify_peers true;}if (should_notify_peers)netdev_notify_peers(bond-dev);queue_delayed_work(bond-wq, bond-mii_work, msecs_to_jiffies(100));}发送路径上bond_start_xmit根据模式选择slave发送。802.3ad模式下使用哈希选择slavestatic netdev_tx_t bond_start_xmit(struct sk_buff *skb,struct net_device *dev){struct bonding *bond netdev_priv(dev);if (bond_is_np(bond)) {return bond_3ad_xor_xmit(skb, dev);}switch (bond-params.mode) {case BOND_MODE_ROUNDROBIN:return bond_xmit_roundrobin(skb, dev);case BOND_MODE_ACTIVEBACKUP:return bond_xmit_activebackup(skb, dev);case BOND_MODE_XOR:return bond_3ad_xor_xmit(skb, dev);case BOND_MODE_BROADCAST:return bond_xmit_broadcast(skb, dev);case BOND_MODE_8023AD:return bond_3ad_xor_xmit(skb, dev);case BOND_MODE_ALB:return bond_alb_xmit(skb, dev);case BOND_MODE_TLB:return bond_tlb_xmit(skb, dev);default:return dev_queue_xmit(skb);}}active-backup模式下bond_xmit_activebackup的实现在当前active slave上发送static netdev_tx_t bond_xmit_activebackup(struct sk_buff *skb,struct net_device *bond_dev){struct bonding *bond netdev_priv(bond_dev);struct slave *slave;slave bond-curr_active_slave;if (slave) {if (bond_slave_can_tx(slave))return bond_dev_queue_xmit(bond, skb, slave-dev);}bond-dev-stats.tx_dropped;dev_kfree_skb(skb);return NETDEV_TX_OK;}slave数组的维护通过bond_update_slave_arr完成。每次slave状态变化时重新构建void bond_update_slave_arr(struct bonding *bond, struct slave *skipslave){struct slave *slave;struct list_head *iter;struct bond_up_slave *new_arr;int slaves_in_agg;if (bond-params.mode BOND_MODE_8023AD)slaves_in_agg bond_3ad_get_active_agg_slave_num(bond);elseslaves_in_agg bond-slave_cnt;new_arr kmalloc(struct_size(new_arr, arr, slaves_in_agg), GFP_ATOMIC);if (!new_arr)return;new_arr-count 0;bond_for_each_slave(bond, slave, iter) {if (bond_slave_can_tx(slave))new_arr-arr[new_arr-count] slave;}rcu_assign_pointer(bond-slave_arr, new_arr);synchronize_rcu();// old array will be freed by RCU callback}LACP802.3ad模式下slave优先级通过actor_port_priority和partner的system priority联合决定slave在aggregator中的激活顺序。bond_3ad_state_machine_handler周期性处理LACPDU协议报文更新聚合组状态动态调整slave激活集合。

相关新闻

TestNG集成UI自动化测试:构建工程化框架与实战指南

TestNG集成UI自动化测试:构建工程化框架与实战指南

1. 项目概述:为什么要把UI测试塞进TestNG?做自动化测试的同行,尤其是从后端或者单元测试转过来的,可能都有过这样的纠结:UI测试脚本写好了,用Selenium、Playwright或者Cypress跑得也挺欢,但总感…

2026/6/22 4:50:32阅读更多 →
终极指南:炉石传说自动化脚本如何让你的游戏时间效率提升7倍

终极指南:炉石传说自动化脚本如何让你的游戏时间效率提升7倍

终极指南:炉石传说自动化脚本如何让你的游戏时间效率提升7倍 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为每日重复的炉石传说任务…

2026/6/22 4:50:32阅读更多 →
ExplorerPatcher实践:5个实用技巧让Windows 11界面回归高效经典

ExplorerPatcher实践:5个实用技巧让Windows 11界面回归高效经典

ExplorerPatcher实践:5个实用技巧让Windows 11界面回归高效经典 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 你是否对Windows 1…

2026/6/22 4:50:32阅读更多 →
SPT-AKI存档编辑器:你的《逃离塔科夫》离线版终极掌控神器

SPT-AKI存档编辑器:你的《逃离塔科夫》离线版终极掌控神器

SPT-AKI存档编辑器:你的《逃离塔科夫》离线版终极掌控神器 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirro…

2026/6/22 6:11:30阅读更多 →
Windows 11系统性能优化实战:从臃肿到高效的完整解决方案

Windows 11系统性能优化实战:从臃肿到高效的完整解决方案

Windows 11系统性能优化实战:从臃肿到高效的完整解决方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…

2026/6/22 6:11:30阅读更多 →
WarcraftHelper:魔兽争霸III终极优化教程 - 解决宽屏、帧率、地图限制三大问题

WarcraftHelper:魔兽争霸III终极优化教程 - 解决宽屏、帧率、地图限制三大问题

WarcraftHelper:魔兽争霸III终极优化教程 - 解决宽屏、帧率、地图限制三大问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽…

2026/6/22 6:11:30阅读更多 →
3步掌握PIDtoolbox:无人机黑盒日志分析的终极免费工具指南

3步掌握PIDtoolbox:无人机黑盒日志分析的终极免费工具指南

3步掌握PIDtoolbox:无人机黑盒日志分析的终极免费工具指南 【免费下载链接】PIDtoolbox PIDtoolbox is a set of graphical tools for analyzing blackbox log data 项目地址: https://gitcode.com/gh_mirrors/pi/PIDtoolbox 你是否曾经面对无人机的飞行日志…

2026/6/22 6:11:30阅读更多 →
夏风满塘色

夏风满塘色

夏风满塘色满眼翠色不知时,倾心风尘难离世。初来人间春秋月,终结九重玉阙词。粉颜染红清静台,绿伞华盖晶莹地。沉水污泥何处洁,浮云青山满塘季。

2026/6/22 6:11:30阅读更多 →
职场邮件安全实战指南:从钓鱼攻击原理到企业级防御体系

职场邮件安全实战指南:从钓鱼攻击原理到企业级防御体系

1. 项目概述:为什么邮件安全是每个职场人的必修课邮件,这个看似古老却依然坚挺的通信工具,至今仍是企业内外沟通的主动脉。但这条动脉,也成了网络攻击者最热衷的“血管穿刺点”。我处理过太多因为一封邮件而引发的安全事件&#x…

2026/6/22 6:06:17阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/22 6:01:42阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/22 1:15:34阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/22 5:42:46阅读更多 →
Codex本地AI编码代理与CC Switch协议适配实战

Codex本地AI编码代理与CC Switch协议适配实战

1. Codex不是“另一个VS Code插件”,而是本地AI编码代理的临界点Codex这个名字,现在被太多人误读了。它不是ChatGPT那个早已停更的旧模型代号,也不是某个新出的VS Code扩展图标——它是2024年中后期悄然浮出水面的一类本地化AI编码代理&#…

2026/6/22 0:04:18阅读更多 →
从MSP430到Flexis QE128:8/32位MCU无缝迁移与低功耗设计实战

从MSP430到Flexis QE128:8/32位MCU无缝迁移与低功耗设计实战

1. 项目概述:当8位MCU遇到性能瓶颈,我们如何优雅升级?在嵌入式开发领域,尤其是电池供电的便携式设备、工业传感器节点或智能家居终端中,我们常常面临一个经典的两难选择:是选择功耗极低但性能有限的8位微控…

2026/6/22 0:04:18阅读更多 →
大语言模型空间推理能力提升:TEXT2SPACE数据集与ASCII增强技术解析

大语言模型空间推理能力提升:TEXT2SPACE数据集与ASCII增强技术解析

1. 项目缘起:当大语言模型“看”不懂空间 最近在折腾大语言模型(LLM)的各种应用时,我发现一个挺有意思的现象:你让模型写首诗、写代码、甚至做逻辑推理,它可能都表现得有模有样。但一旦涉及到需要理解“空间…

2026/6/22 0:04:18阅读更多 →