当前位置: 首页 > news >正文

Linux 4.0+内核对硬件交换模块的支持(HW Switch Offload)

Linux内核最近跃进到了4.x时代,初看没啥大的动作,但是对于我而言,最令人兴奋的还是它对硬交换模块的支持。这也是为全面迎合SDN做好准备的第一步。

Linux上的路由与交换

Linux诞生于网络,天生对网络拥有全面且强大的支持,即便再复杂的协议,再封闭的技术,几乎都可以找到对应的Linux实现。然而这并不是说Linux网络就天下无敌了,它存在很多不合理的地方。
       Linux拥有对路由的强大支持,在数据平面,你可以很轻松地实现一种路由查找算法,在控制平面,你也可以在用户态实现任何已有的或者你自己设计的路由协议,然而,这一切都是软的,也就是说,都是CPU来完成的。
       当我们知道路由和交换的区别之后,就会发现,Linux一直以来都没有实现真正的交换,起码在通用接口层面上没有一个合理的解决方案。Linux的bridge模块?算了吧,它只是实现了一个软网桥,和真正交换机不沾边的。

Linux对硬件交换的支持

记得去年的时候,我曾经拿到过一块交换板,可以直接插在主板的PCI-E上,当时必须使用厂商特定的驱动程序以及配合VLAN技术才能将其用起来。其实很多的交换机可能都采用了Linux作为管理平面和控制平面,然后配置自己的定制硬件和定制驱动来使用。
       我曾经想过一种办法用Netfilter技术实现对硬件交换模块的支持,但是,CPU还是要被中断的,整个流程是CPU将数据包拉到bridge或者IP 层,然后再交回硬件...正确的方式是根本不用中断CPU,完全通过硬件来转发数据包,只有数据和本地协议栈相关的时候,才中断CPU。而这个思路,意味 着你必须重写驱动。
       总之,没有一个统一的接口,这就意味着如果你自己想设计一块交换板,没有比较好的标准可循,即便有,可能你也要自己编写或者复制粘贴大量的驱动代码,这将严重影响研发效率。

Linux 4.0的switchdev

一切坏消息在Linux 4.0内核中终结。
       Linux 4.0引入了一个switchdev框架,它代表一类拥有“交换”能力芯片的多网口设备的抽象。其中每一个网口就是一个port,在switchdev框 架中被注册成一个net_device。除此之外,内核中自带了一个rocker driver,演示了一个实际的设备驱动的实现。整个switchdev的示意图如下所示:

wKiom1VYMJCS7LVWAAJX8N0ThsQ134.jpg
注意,理想化的实现中,OpenFlow控制器可以直接将流表注入到设备中,从而指导设备直接进行数据包交换。流表的内容超级复杂,不是本文的目标,但是相信在后一个内核版本中会出现相关的Document。
       采用了硬件交换模块的Linux BOX和原来的截然不同了,它更像是一个高端的专业网络设备,类似Cisco那样的。它看起来就是下面的样子:

wKiom1VYMIHjLFdjAAJbQPZpvpo359.jpg




 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1652064

相关文章:

  • VMware vCenter Converter Standalone迁移
  • Linux内核协议栈的socket查找缓存路由机制
  • 如何在mes中更新dll文件
  • .NET 设计模式初探
  • DatabaseMetaData的用法(转)
  • bash组织成树型数据结构
  • CentOS 5.4 通过yum升级php到5.3版本的两种方
  • Nginx之不能解析下载站顶部和底部的inc文件
  • 【转】 iphone开发常用代码
  • 学习笔记 124: 预备知识总结
  • Js参数值中含有单引号或双引号解决办法
  • 学习笔记 十五: mariadb
  • mysql 优化几个注意点(非完全统计)
  • Python中的tuple
  • MySQL都有哪些日志?分别都代表什么?
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java 23种设计模式 之单例模式 7种实现方式
  • Laravel 中的一个后期静态绑定
  • leetcode讲解--894. All Possible Full Binary Trees
  • nodejs调试方法
  • NSTimer学习笔记
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redis学习笔记 - pipline(流水线、管道)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 当SetTimeout遇到了字符串
  • 给初学者:JavaScript 中数组操作注意点
  • 近期前端发展计划
  • 前端
  • 思考 CSS 架构
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信小程序开发问题汇总
  • 原生 js 实现移动端 Touch 滑动反弹
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • (Forward) Music Player: From UI Proposal to Code
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三)uboot源码分析
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ./configure、make、make install 命令
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NetCore 如何动态路由
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET文档生成工具ADB使用图文教程
  • @Autowired自动装配
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [04]Web前端进阶—JS伪数组
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [ACTF2020 新生赛]Include
  • [android] 切换界面的通用处理
  • [ANT] 项目中应用ANT
  • [BROADCASTING]tensor的扩散机制