----------原创不易,欢迎点赞收藏。广交嵌入式开发的朋友,讨论技术和产品-------------
今天发一篇五年前的文章,不调单板。对以太网和交换片的较多理解,对系统级的优化。
大部分的网络设备,都由多种单板组成,类似刀片服务器产品。一片单板基本上是一个独立的系统,能够处理不同的业务。有些单板的业务流要直接对外,其带的IP/MAC地址要直接发送到业务网络或者公网中。如图1,该设备由四个单板组成,一个主控单板MPU,三个业务单板FXS。每个FXS要对外收发数据报文,那么每个业务单板要配置不同的IP和MAC地址
(图1)
图2是每个业务单板FXS的IP和MAC地址都对外,主控板不参与业务单板的IP/MAC替换,这是传统的做法。
(图2)
- 随着业务单板的增加,所需要的IP和MAC地址会大量增加,对业务配置和网络规划带来了挑战,也增大了维护的难度。如果能够一个设备,只需要配置一个对外的IP和MAC地址,将大大简化产品的使用和维护难度。要实现这个功能,一般由设备的主控单板来对业务单板的报文进行IP和MAC地址替换,将业务单板的源IP和源MAC地址替换成设备对外的IP和MAC地址。
S1,软件从网口收到业务单板发来的报文;
S2,将报文中的源IP替换成自己对外的IP;
S3,将报文中的源MAC替换成自己对外的MAC;
S4,将报文发送到外部网络
主控板CPU对每个报文进行处理,随着业务流量的增大,主控CPU的负荷大大增加,甚至可能处理不过来而丢包,常见的做法上用iptables等第三方软件进行网络地址转换(NAT),图3所示。
(图3)
本文提出一种基于三层交换芯片,能迅速收敛IP和MAC地址,同时业务报文不经过设备主控板CPU,不增加主控板CPU负荷的方法。
(图4)
如上图4所示,交换芯片BCM 53347为一款三层交换芯片。其中,P1~P3接FXS单板网口,P0接主控板网口,P4接对外网口RJ45。
FXS1~FXS3每个单板的对外网口ETH0,配置带VLAN TAG的子接口。FXS1的VLAN=100,FXS2的VLAN=200,FXS3的VLAN=300。同时配置每个FXS子接口的IP地址为主控板对外的IP 10.8.8.1,MAC地址也配置成主控板对外的MAC地址MAC0。
配置BCM53348 P1支持VLAN TAG 100/1000, P2支持VLAN TAG 200/1000, P3支持 VLAN TAG 300/1000。
新增FXS1子接口 eth0.1000 192.168.1.1 私有MAC1
新增FXS2子接口 eth0.1000 192.168.1.2 私有MAC2
新增FXS3子接口 eth0.1000 192.168.1.3 私有MAC3
新增MPU子接口 eth0.1000 192.168.1.254 私有MAC0
以上私有IP用于主控板MPU与每个FXS之间的内部通讯,IP和MAC地址不会对外。
关键配置P4端口发送属性
对于P0/P1/P2/P3内部交换过来报文,剥离VLAN TAG并且发送到外部网络。那么FXS1, FXS2, FXS3的报文源IP/MAC地址都变成10.8.8.1/MAC0,与主控板对外的MAC一致,如图5
端口P4的接收转发属性配置
从P4外部网络进来的报文,只有特定的RTP业务流才能转发到FXS1 - FXS3,其他协议的报文全部转发给主控板MPU。RTP报文上属于UDP协议族,其自带UDP端口号,规定FXS1所属的UDP端口号10000 - 12000,FXS2的UDP端口号范围12001 - 14000,FXS3的UDP端口号范围14001 - 16000。P4端口检测到从外部网络接收的报文,如果是UDP报文,并且判断端口号范围,来确定报文转发到P1 - P3哪个端。转发给P1端口报文增加VLAN为100的tag,转发给P1端口报文增加VLAN为200的tag,转发给P3端口报文增加VLAN为300的tag。这样不同的FXS就可以成功接收外部RTP报文。如图6
主控板MPU与每个FXS单板之间采用私有IP通讯。如果FXS要对外发送报文,必须知道目的IP所对应的MAC地址,一般这是由ARP协议来实现。但是P4端口只能转发UDP RTP报文给FXS,所以FXS发出去的ARP报文,是收不到ARP响应的。这样,FXS发送私有命令给MPU,让MPU发送ARP到外部网络,获取MAC成功后,MPU将MAC地址通过私有协议发送给FXS。如图7
(图5)
(图6)
(图7)