linux DSA 开发(一)
linux DSA 开发(一)
本文主要是翻译,原文链接如下:https://www.kernel.org/doc/html/latest/networking/dsa/dsa.html
纲要
本文档描述了**分布式交换机架构 (DSA)**子系统的设计原则、限制、与其他子系统的交互、如何为该子系统开发驱动程序
设计原则
分布式交换机架构最早是用于支持使用 Linux 的 Marvell 以太网交换机的子系统(MV88E6xxx),但此后也发展为支持其他供应商。
这种设计背后的原始理念是能够使用未经修改的 Linux 工具(如bridge、iproute2、ifconfig)直接用来配置/查询交换机端口网络设备。
以太网交换机通常由多个前面板端口和一个或多个 CPU (管理) 端口组成。DSA 子系统目前依赖于管理端口的存在,管理端口连接到以太网控制器,该控制器能够从交换机接收以太网帧。对于小型家庭和办公产品中的各种以太网交换机来说,这是一种非常常见的设置:路由器、网关,甚至是机架式交换机。此主机以太网控制器稍后将在 DSA 术语和代码中称为“主控”和“cpu”。
DSA 中的 D 代表分布式(Distributed),因为该子系统的设计能够配置和管理级联交换机(上游和下游相互连接的多个交换机)。这些特定端口在 DSA 术语和代码中称为 dsa port。相互连接的多个交换机的集合称为“交换机树”(switch tree)
对于交换机每个前面板端口,DSA 将创建专门的网络设备( 对应于 lan*),用作 Linux 网络堆栈中的控制和数据流端点,这些专用网络接口在 DSA 术语和代码中被称为“slave”网络接口
使用 DSA 的理想情况是当以太网交换机支持“交换机标签(switch tag )”时,(这是一种硬件功能,需要硬件支持。)switch tag 用于使交换机为它从特定端口接收/发送的每个以太网帧插入一个特定的标签,以让管理接口知道:
- 这个帧来自哪个端口
- 这个帧被转发的原因是什么
- 如何将 CPU 发起的流量发送到特定端口
不过,该子系统确实支持无法插入/剥离标签的交换机,但在这种情况下,功能可能会受到轻微限制(流量分离依赖于基于端口的 VLAN ID)。
请注意,DSA 当前不会为“cpu”和“dsa”端口创建网络接口,因为:
- “cpu”端口是管理控制器面向以太网交换机的一侧,创建的话您将获得同一管道的两个接口:master netdev和“cpu”netdev , 造成重复,这是不必要的
- “dsa”端口只是两个或多个交换机之间的管道,因此不能真正用作适当的网络接口
switch-tag 协议
DSA 支持许多特定于供应商的标记协议、一种软件定义的标记协议以及一种无标记模式 ( DSA_TAG_PROTO_NONE
)。
标签协议的确切格式是特定于供应商的,但总的来说,它们都包含以下内容:
- 标识以太网帧来自/应该发送到哪个端口
- 提供将此帧转发到管理接口的原因
所有的标记协议都在net/dsa/tag_*.c
文件中,并实现了结构的方法,下面详述。struct dsa_device_ops
标记协议通常属于以下三类之一:
- switch-tag 位于 Ethernet header 之前,向右移动(从 DSA 主机的帧解析器的角度来看)MAC DA、MAC SA、EtherType 和整个 L2 有效载荷。
- switch-tag 位于 EtherType 之前,从 DSA 主机的角度来看,将 MAC DA 和 MAC SA 保持在适当的位置,但将“真实”的 EtherType 和 L2 有效载荷移到右侧。
- switch-tag 位于数据包的尾部,将所有帧头保持在适当的位置,并且不会改变 DSA 主机的帧解析器所拥有的数据包视图。
查看 switch-tag 协议类型
root@OpenWrt:/# cat /sys/class/net/eth0/dsa/tagging
trailer
主控网络设备(master netdev )
主网络设备通常是常规以太网接口,无需对驱动做特殊修改。DSA 子系统已被证明可以与行业标准驱动程序一起使用: e1000e,
mv643xx_eth
等等,而无需对这些驱动程序进行修改。这种网络设备也经常被称为管道网络设备,因为它们充当主机处理器和硬件以太网交换机之间的管道。
网络协议栈中的钩子函数
当 master netdev 与 DSA 一起使用时,在网络堆栈中放置一个钩子函数,以便让 DSA 子系统处理以太网交换机特定的标记协议。典型的以太网帧接收序列如下所示:
主控网络设备(例如:e1000e):
接收中断触发:
- 接收函数被调用
- 完成基本的数据包处理:获取长度、状态等。
- 数据包准备由以太网层通过调用
eth_type_trans
net/ethernet/eth.c:
eth_type_trans(skb, dev)if (dev->dsa_ptr != NULL)-> skb->protocol = ETH_P_XDSA
drivers/net/ethernet/*:
netif_receive_skb(skb)-> iterate over registered packet_type-> invoke handler for ETH_P_XDSA, calls dsa_switch_rcv()
net/dsa/dsa.c:
-> dsa_switch_rcv()-> invoke switch tag specific protocol handler in 'net/dsa/tag_*.c'
net/dsa/tag_*.c:
- inspect and strip switch tag protocol to determine originating port
- locate per-port network device
- invoke
eth_type_trans()
with the DSA slave network device - invoked
netif_receive_skb()
到了这一步,DSA 的 slave netdev (lan*)会收到一个常规以太网帧。
从属网络设备 (slave netdev)
DSA 创建的从网络设备堆叠在其主网络设备的顶部( 例如 lan1@eth0),这些网络接口中负责作为交换机每个前面板端口的控制和数据流端点。这些接口专门用于:
- 在向/从特定交换机端口发送/接收流量时插入/删除交换机标签协议
- 查询交换机的 ethtool 操作:统计信息、链接状态、LAN 唤醒、register dumps …
- 外部/内部 PHY 管理:链接、自动协商等。
这些从属网络设备具有自定义的 net_device_ops 和 ethtool_ops 函数指针,它们允许 DSA 在网络堆栈/ethtool 和交换机驱动程序实现之间引入一个分层级别。
在从这些从属网络设备传输帧时,DSA 将查找当前向这些网络设备注册的交换机标记协议,并调用特定的传输例程,负责在以太网帧中添加相关的交换机标记。
然后,这些帧将排队等待使用主网络设备ndo_start_xmit()
功能进行传输 ,因为它们包含适当的交换机标签,以太网交换机将能够处理这些来自管理接口的传入帧,并将这些帧传送到物理交换机端口。
图示
总结一下,从网络设备的角度来看,DSA 基本上是这样子:
Unaware applicationopens and binds socket| ^| |+-----------v--|--------------------+|+------+ +------+ +------+ +------+||| swp0 | | swp1 | | swp2 | | swp3 |||+------+-+------+-+------+-+------+|| DSA switch driver |+-----------------------------------+| ^Tag added by | | Tag consumed byswitch driver | | switch driverv |+-----------------------------------+| Unmodified host interface driver | Software
--------+-----------------------------------+------------| Host interface (eth0) | Hardware+-----------------------------------+| ^Tag consumed by | | Tag added byswitch hardware | | switch hardwarev |+-----------------------------------+| Switch ||+------+ +------+ +------+ +------+||| swp0 | | swp1 | | swp2 | | swp3 ||++------+-+------+-+------+-+------++
slave MDIO 总线
略
数据结构
DSA 数据结构在include/net/dsa.h
以及 中定义net/dsa/dsa_priv.h
:
略
linux DSA 开发(一)相关推荐
- 慢慢欣赏linux dsa驱动
dsa官方文档 https://www.kernel.org/doc/Documentation/networking/dsa/dsa.txt rtl8201以太网卡调试 https://blog.c ...
- Linux 汇编语言开发指南
Linux 汇编语言开发指南 肖文鹏 (xiaowp@263.net), 北京理工大学计算机系硕士研究生 本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究 ...
- 用 GStreamer 简化 Linux 多媒体开发
GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的编程框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3.Ogg.MPEG1.MPEG2 ...
- python 测试linux dev文件,Linux测试开发人员要掌握的Linux命令有哪些?
今天小编要跟大家分享的文章是关于Linux测试开发人员要掌握的学习Linux和 一.文件和目录相关 文件和目录相关 1.进入目录--cd cd /usr/local //进入/usr/local这个目 ...
- Linux后台开发必看!
来自:我是程序员小贱 一 自我介绍二 面试情况三 相关知识点汇总1 c/c++相关2 计算机网络3 数据结构相关4 数据库相关5 操作系统6 Linux基础知识及应用编程(后台必备!)7 大数问题8 ...
- 学嵌入式Linux软件开发需要的知识
首先,我得声明嵌入式Linux的内核很重要,非常非常重要!但是这个东西如果你没有一定的基础,还是暂时不碰为好.因为想知道它的工作机理,你必须具备N多知识才可以的.弄明白内核(包括驱动和协议栈,以及内核 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- Linux 内核开发特点
Linux 内核 开发的特点 无 libc 库抑或无标准头文件库 GUN C 没有内存保护机制 不要再内核中轻易使用浮点数 容积小而且固定的栈 同步和并发 可移植性的重要性 参考文献 开发的特点 相对 ...
- 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析
嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...
最新文章
- Node.js(二)----安装Cnpm
- 了解 ElasticSearch 这几个知识点后,查询起飞~
- 对付惰性必杀:(10+2)*5法
- iOS中容易混淆的知识点(持续更新中)
- 如何在 CentOS 7 上生成 SSL 证书为 Nginx 加密
- 【Java】生成UUID
- 海外服务器搭建网站访问很慢,海外服务器访问速度变慢了怎么办
- Ubuntu 10.04 分辨率调整
- 分享一个不错的Windows软件——Fliqlo
- QObject: Cannot create children for a parent that is in a different thread错误
- 字根校对-中文校对软件
- Mybatis项目错误:Type interface dao.UserMapper is not known to the MapperRegistry.
- 英音美音加拿大发音区别大盘点
- 【通信原理】第三章 -- 随机过程[下]
- android 自定义View 视差动画
- 乐视体感摄像头开发踩坑记录
- 2020低压电工证考试及低压电工复审模拟考试
- RegCreateKey
- 计算机命令cmd,电脑cmd命令大全
- Intra-LTE Handover : X2 based handover