0731-84728105
15116127200
二层交换机原型设计与实现(四)
发布时间:2021-05-17
     MAC转发表是二层交换机原型中的核心内容,所有(yǒu)的数据操作都是围绕这张表而来。前一篇文(wén)章中讲到了该表涉及的两个核心字段:端口号与MAC地址。本篇文(wén)章专门讲解一下该MAC转发表的设计与表的操作方法。
     MAC转发表的设计我们还是遵循渐进式的方法,从最基本的字段开始,根据需要再逐步增加。
     1)字段设计
     从前一篇文(wén)章分(fēn)析,对于MAC转发表来说,其核心字段就2个:端口号和MAC地址,故我们对其字段的设计也就采用(yòng)此二元数据。交换机的端口号一般不超过64,故用(yòng)char(8位)类型定义即可(kě),MAC地址的位宽為(wèi)48位,可(kě)定义為(wèi)6个字节数组。一般在协议字段中或以协议字段作為(wèi)字段的表结构定义中,采用(yòng)无符号类型做定义,这样方便数据与或运算,也方便硬件移植。字段数据类型的定义一般也建议重定义為(wèi)简写方式,在读写代码时,更好理(lǐ)解和把握数据是否溢出、越界等。

     数据类型重定义如下:

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
//typedef unsigned long u64;/*64位系统*/
/*请特别的注意!!!在32位系统下,long的数据位宽只有(yǒu)32位,64位的数据类型必须使用(yòng)long long的方式定义*/
typedef unsigned long long u64;/*32位系统,实验平台OpenBox-S4為(wèi)32位系统*/

      2)表结构设计
     数据存储结构的设计有(yǒu)很(hěn)多(duō)方式可(kě)选,如数组、多(duō)维数组、单向链表、双向链表和树结构等。在原型系统的设计中,因為(wèi)表结构定义会影响到整个代码实现,且需要考虑将来硬件卸载的便捷性,所以我们一般建议采用(yòng)较為(wèi)简单的表存储结构。又(yòu)因為(wèi)每条表项的大小(xiǎo)是固定空间,所以采用(yòng)数组的形式是较优的选择。
     先定义一条表项的数据结构如下:

struct row_port_mac
{
u8 port;
u8 pad;/*為(wèi)了对齐做的补充*/
u8 mac[MAC_LEN];
};

     补充对齐:上述表项一条宽度為(wèi)7个字节,如此按数组形式组织的话,则会让mac字段在非内存对齐位置出现,导致数据比较时需要两次对比。若是跨了CacheLine,则会导致更長(cháng)的时间损耗。具體(tǐ)原因请网上搜索“内存对齐”深入學(xué)习。我们建议在定义数组项的时候一定按照8字节倍数对齐方式来定义,若小(xiǎo)于8字节,则补充為(wèi)8;若多(duō)于8,则再多(duō)补充直到成為(wèi)8的倍数(特别说明,这是针对数组定义要求,不同数据结构根据分(fēn)析会有(yǒu)不同的优化定义方法)。
     再定义整张表的数据结构如下:

#define OBX_MAC_MAX 128/*系统最多(duō)支持128条MAC表项*/
struct table_port_mac
{
struct row_port_mac row[OBX_MAC_MAX];
};

     3)表操作方法设计
     表的方法主要是指对表的操作,通常包括表项的增、删、改和查四个动作。这些表动作的设计与表的结构定义和表的数据操作方法相关,可(kě)以利用(yòng)对表数据的操作进行优化和精简。如在二维数据中进行任何操作,都得先把表遍历一次,找到空位才能(néng)增加,找到对应的内容项才能(néng)修改和删除。
     根据二层交换的数据处理(lǐ)流程分(fēn)析,在源MAC的學(xué)习过程中,學(xué)习到一个新(xīn)MAC地址需要进行增加表项操作,若已经學(xué)习到的MAC地址发生了端口迁移,则需要更新(xīn)其端口信息。在目的MAC查表过程中是一个单纯的MAC地址查找过程。MAC表项的删除一般发生在MAC表老化的时候,后面文(wén)章单独讲。
     结合前面的表方法设计和二层交换的数据处理(lǐ)逻辑,我们暂将MAC转发表的方法定义為(wèi)两个:一是源MAC學(xué)习;二是目的MAC查找。
     1)源MAC學(xué)习
     源MAC學(xué)习是指将一个输入分(fēn)组的源MAC地址學(xué)习并保存到MAC转发表中。若MAC转发表中不存在该源MAC地址信息,则找一个空白位置存储。若MAC转发表中已有(yǒu)该地址信息,则刷新(xīn)(覆盖)其端口号信息。在查找源MAC地址是否存在时,同时查找空闲表项位置,这样只用(yòng)遍历一次表,即可(kě)完成两件事情。另外就是查找到源MAC地址后,立即刷新(xīn)其端口号,可(kě)以判断并打印显示,该MAC地址是否发生了端口转移。
     2)目的MAC查找
     目的MAC的查找,其目的是為(wèi)了获得查找MAC对应的端口号,查表结果有(yǒu)两种情况,一是查找到了,返回对应的端口号信息;二是没有(yǒu)查找到,则不能(néng)返回正常端口数据,需要使用(yòng)特殊返回值表示,如-1。
     1)查表设计
     MAC转发表的方法设计為(wèi)什么把二层交换的功能(néng)和表操作混在了一起?因為(wèi)在二层交换中,其核心数据处理(lǐ)流程就是针对MAC转发表进行的一系列数据查找、存储和更新(xīn)动作。按照其逻辑处理(lǐ)方式来设计可(kě)以让學(xué)生更好理(lǐ)解MAC表的操作流程与细节。
     在逻辑设计的过程中,我们需要针对一些特定功能(néng)进行抽象、模块化,比如表的四操作。但在具體(tǐ)实现过程中,其本身的逻辑处理(lǐ)也就是对表的内容进行处理(lǐ),以数据流程為(wèi)主線(xiàn)进行设计比纯模块化的分(fēn)层设计更容易让學(xué)生掌握交换的处理(lǐ)过程。模块化和分(fēn)层可(kě)以放到后期优化阶段。
     表操作的方法也并不一定要马上全部实现,根据逻辑的需要逐个实现,在实现过程中也会不断修改完善。
     2)MAC地址學(xué)习与查表实现
     MAC地址的學(xué)习与查找是二层交换的核心,特别是MAC地址學(xué)习,如何设计快速、高效的學(xué)习方法,取决于我们对系统数据处理(lǐ)流程的深度理(lǐ)解与优化迭代。下一篇文(wén)章中会给出一种具體(tǐ)的实现方法供大家参考。
      欢迎您和學(xué)生们加入FAST开源项目群沟通与探讨,一起體(tǐ)验不一样的系统设计过程。请先加微信号15116127200后邀请入群。

关注FAST开源社區(qū)
FAST一一开源、开放、高速、高效、可(kě)编程、可(kě)定义!软硬件协同并行处理(lǐ)。
服務(wù)热線(xiàn)