Linux 3.10 kernel bridge转发逻辑解析

1 下载量 177 浏览量 更新于2024-08-29 收藏 97KB PDF 举报
"本文主要分析Linux 3.10内核中的桥接(bridge)转发逻辑,重点关注新引入的netdev_rx_handler_register函数及其在桥接中的应用。内容包括对新功能的解释以及如何与旧版本内核进行对比。" 在Linux 3.10内核中,桥接逻辑经历了显著的改进,特别是增加了对VLAN(虚拟局域网)的处理和桥接入口函数的设置。这些变化使得CentOS 5和CentOS 7的网络功能更加完善和高效。 1. **netdev_rx_handler_register** 函数 在深入分析桥接逻辑之前,我们首先关注的是netdev_rx_handler_register函数。这个函数在2.6内核中并不存在,它允许注册一个接收处理函数到网络设备(net_device)上。通过这个函数,开发者可以指定当数据包到达设备时要执行的处理程序。例如,可以为网桥接口注册br_handle_frame函数,或者为bonding接口注册bond_handle_frame函数。这种设计提供了更大的灵活性,使得在模块中自定义处理函数成为可能,比如OpenvSwitch在3.10内核中的实现。 ```c int netdev_rx_handler_register(struct net_device *dev, rx_handler_func_t *rx_handler, void *rx_handler_data) { ASSERT_RTNL(); // 保证在路由锁保护下操作 if (dev->rx_handler) return -EBUSY; // 如果已有处理函数,返回忙错误 rcu_assign_pointer(dev->rx_handler_data, rx_handler_data); // 设置接收处理函数的数据 rcu_assign_pointer(dev->rx_handler, rx_handler); // 注册接收处理函数 return 0; // 注册成功,返回0 } ``` 这个函数的工作原理是,在网络堆栈的__netif_receive_skb函数中,会根据接收到的数据包所属的设备接口,调用相应注册的接收处理函数。这种机制改进了旧版内核中的处理方式,提高了网络处理的效率和模块化程度。 2. **VLAN处理逻辑** Linux 3.10内核的另一个重大改变是增强了VLAN处理逻辑。VLAN是一种在网络层之上提供逻辑隔离的技术,允许在单个物理链路上划分多个独立的网络。在3.10内核中,桥接模块可以更好地识别和处理带有VLAN标签的数据包,这提升了网络配置的灵活性,使得多租户环境或虚拟化场景的管理更为便捷。 3. **桥接入口函数的设置** 在旧版内核中,桥接的处理流程相对固定。而在3.10内核中,引入了新的入口函数设置,使得桥接过程可以根据不同的网络需求进行定制。这包括了对新添加的netdev_rx_handler_register函数的利用,使得桥接设备可以注册自己的接收处理函数,从而控制数据包的转发行为。 Linux 3.10内核中的桥接逻辑改进提升了网络处理的灵活性、可扩展性和性能。通过引入netdev_rx_handler_register函数,开发者可以更方便地为不同类型的网络设备定制接收处理逻辑,同时增强的VLAN处理使得网络环境的配置和管理更加精细化。这些改变对于运维人员和开发人员来说,意味着更高的网络服务质量以及更好的资源利用率。