以太网基础:为什么要为节点分配VLAN呢?

以太网的开发中,有时需要为节点分配vlan(virtual local area network,虚拟局域网)。但是,为什么要为节点分配vlan呢?本文针对这个话题展开讨论。除此之外,文末给出lwip(light weight ip)+tc3xx vlan实现的源码及注意事项。
划分vlan场景
事物的出现,总有其合理性(即:存在即合理),所以,vlan也有其出现的原因。先看这样一个工程场景:某个控制器(eg:ecu1)启动时,向交换机(switch)发送arp broadcast,以便于获取目标节点mac(media access control)地址。由于是广播帧,交换机收到该帧后,转发给所有port(不包括接收port),也就是我们常说的泛洪(flooding),如下所示:
如果网络范围进一步扩大,即:多个switch连接时,该帧arp传播的范围会进一步扩大,如下所示:
节点发送arp的目的是为了获取目标节点的mac地址,以便于通信。但是,这样的动作却要把信息传遍整个网络,如此,将增加网络负担。如上,只是讨论arp广播的例子,实际工程中,类似场景还有很多:some/ip中的服务发现、未知单播帧的转发等。
所以,面对这些工程场景,应该如何降低网络带宽负载呢?答:可以通过vlan技术,分割广播域,将信息的传播限定到一定范围。
vlan划分原理
(一)vlan格式
相比没有vlan的以太网帧,包含vlan的以太网帧多4 byte(vlan tag),具体位置如下所示:
vlan tag包含tpid(tag protocol identifier,标签协议标识符)和tci(tag control information,数据帧控制信息)两个部分,如下所示:
各参数解释如下:
tpid:表示数据帧类型,0x8100 表示 ieee 802.1q 帧(c-vlan),0x88a8表示s-vlan;
pcp:priority code point(3 bits),表示数据帧优先级,数值越大,优先级越高;
dei:drop eligible indicator(1 bit),丢弃资格标识符,表示 mac 地址封装是否符合规范格式;
cfi:canonical format indicator(1 bit),标准格式标识符;
vid:vlan identifier(12 bits),表示帧所属的vlan。取值范围: 0~4095。
(二)vlan分割广播域原理
根据项目的实际情况,可以划分不同ecu组,之后,为每组ecu分配一个vid。比如:ecu1、ecu2划分到vid = 0x0a组,ecu2、ecu3划分到vid = 0x0b组,如下所示:
当某个节点(eg:ecu1)发送arp broadcast报文时,该广播帧只能在相同vid(eg:vid=0x0a)的域内传播,非相关的vid组则不受影响,如下所示:
如此,即限定了消息传播的范围,同时,也降低了总线带宽的消耗。
vlan分组方式有多种:基于端口(port)划分、基于协议(protocol)划分、基于mac地址划分、基于ip地址划分等。
lwip+tc3xx的vlan实现细节
开源的lwip虽然是不错的ethernet学习资料,但是,这并不意味着使用lwip会一帆风顺。利用lwip实现vlan过程中,需要注意以下几点:
(一)netif.c修改
在netif.c的ifx_netif_input()接口中,需要添加ethtype_vlan,即:接收含有vlan的以太网帧,修改如下所示:
err_t ifx_netif_input(netif_t *netif){ ...... switch (htons(ethhdr->type)) { /* ip or arp packet? */ case ethtype_ip: case ethtype_arp: case ethtype_vlan: ......  
(二)发送vlan设置
ifxgeth_eth.c中,本文在接口ifxgeth_eth_configuremaccore()中添加如下代码,设置vid=0x0a,如下所示:
void ifxgeth_eth_configuremaccore(ifxgeth_eth *geth, ifxgeth_eth_macconfig *macconfig){ ... /* set send vlan */    ifxgeth_mac_writequeuevlantag(geth->gethsfr, ifxgeth_mtlqueue_0, 0x0a); ...}   
ifxgeth_eth_configuremaccore()接口的具体实现如下所示:
boolean ifxgeth_mac_writequeuevlantag(ifx_geth *gethsfr, ifxgeth_mtlqueue queueid, uint16 vlantag){ ifx_geth_mac_vlan_incl vlan_incl; if (gethsfr->mac_vlan_incl.b.busy) { return false; } /* vlan tag control in transmit packets */ vlan_incl.b.vlc = 2; vlan_incl.b.rdwr = 1; vlan_incl.b.csvl = 0; vlan_incl.b.vlt = vlantag; vlan_incl.b.addr = queueid; gethsfr->mac_vlan_incl.u = vlan_incl.u; // wait until operation is finished while (gethsfr->mac_vlan_incl.b.busy) {} return true;}  
(三)含vlan通信数据流
包含vlan(vid = 0x0a)的通信数据流如下所示:


电脑打开网页速度慢原因及解决办法
中芯国际上半年营收17.22亿美元 14纳米FinFET技术获重大进展
国产SRAM芯片EMI504NL16VM可替代IS61WV25616EFALL
三河科丰电气最新研发负压系统控制器震撼上市
Microchip BodyCom技术是全球首创以人体作为一个安全低功耗通信信道的技术
以太网基础:为什么要为节点分配VLAN呢?
LM2675电源芯片的内部设计原理和结构
三星开始恢复针对存储器产业的投资 未来或冲击中国台湾存储器厂商的营运状况
草地贪夜蛾杀虫灯的应用优势是什么
双通道方法让Zynq SoC资源利用最大化
赛迪顾问李珂:我国汽车智能传感器产业的发展现状、趋势与建议
为什么电磁流量计测量误差很大?原因是什么?
具有自校正功能的数模转换器AD760实现高精度波形发生器的设计
首超苹果! 华为手机成最保值品牌!
云端未来携ARM云计算解决方案亮相第十届中国电子信息博览会
FPGA相关技术人员,没有中年危机?
一表双芯:传统钟表行业迈向智能时代的关键一步
萨科微slkor推出光耦SL601,积极做好国产替代
安世半导体恒定电流LED驱动器介绍 经济高效、可靠
采用LIBS成像技术研究纳米颗粒在单细胞内的亚细胞分布