以太網(wǎng)的開發(fā)中,有時(shí)需要為節(jié)點(diǎn)分配VLAN(Virtual Local Area Network,虛擬局域網(wǎng))。但是,為什么要為節(jié)點(diǎn)分配VLAN呢?本文針對(duì)這個(gè)話題展開討論。除此之外,文末給出Lwip(Light weight IP)+TC3xx VLAN實(shí)現(xiàn)的源碼及注意事項(xiàng)。
劃分VLAN場(chǎng)景
事物的出現(xiàn),總有其合理性(即:存在即合理),所以,VLAN也有其出現(xiàn)的原因。先看這樣一個(gè)工程場(chǎng)景:某個(gè)控制器(eg:ECU1)啟動(dòng)時(shí),向交換機(jī)(Switch)發(fā)送ARP Broadcast,以便于獲取目標(biāo)節(jié)點(diǎn)MAC(Media Access Control)地址。由于是廣播幀,交換機(jī)收到該幀后,轉(zhuǎn)發(fā)給所有Port(不包括接收Port),也就是我們常說(shuō)的泛洪(Flooding),如下所示:
如果網(wǎng)絡(luò)范圍進(jìn)一步擴(kuò)大,即:多個(gè)Switch連接時(shí),該幀ARP傳播的范圍會(huì)進(jìn)一步擴(kuò)大,如下所示:
節(jié)點(diǎn)發(fā)送ARP的目的是為了獲取目標(biāo)節(jié)點(diǎn)的MAC地址,以便于通信。但是,這樣的動(dòng)作卻要把信息傳遍整個(gè)網(wǎng)絡(luò),如此,將增加網(wǎng)絡(luò)負(fù)擔(dān)。如上,只是討論ARP廣播的例子,實(shí)際工程中,類似場(chǎng)景還有很多:SOME/IP中的服務(wù)發(fā)現(xiàn)、未知單播幀的轉(zhuǎn)發(fā)等。
所以,面對(duì)這些工程場(chǎng)景,應(yīng)該如何降低網(wǎng)絡(luò)帶寬負(fù)載呢?答:可以通過(guò)VLAN技術(shù),分割廣播域,將信息的傳播限定到一定范圍。
VLAN劃分原理
(一)VLAN格式
相比沒有VLAN的以太網(wǎng)幀,包含VLAN的以太網(wǎng)幀多4 Byte(VLAN Tag),具體位置如下所示:
VLAN Tag包含TPID(Tag Protocol Identifier,標(biāo)簽協(xié)議標(biāo)識(shí)符)和TCI(Tag Control Information,數(shù)據(jù)幀控制信息)兩個(gè)部分,如下所示:
各參數(shù)解釋如下:
TPID:表示數(shù)據(jù)幀類型,0x8100 表示 IEEE 802.1Q 幀(C-VLAN),0x88A8表示S-VLAN;
PCP:Priority Code Point(3 bits),表示數(shù)據(jù)幀優(yōu)先級(jí),數(shù)值越大,優(yōu)先級(jí)越高;
DEI:Drop eligible indicator(1 bit),丟棄資格標(biāo)識(shí)符,表示 MAC 地址封裝是否符合規(guī)范格式;
CFI:Canonical Format Indicator(1 bit),標(biāo)準(zhǔn)格式標(biāo)識(shí)符;
VID:VLAN identifier(12 bits),表示幀所屬的VLAN。取值范圍:0~4095。
(二)VLAN分割廣播域原理
根據(jù)項(xiàng)目的實(shí)際情況,可以劃分不同ECU組,之后,為每組ECU分配一個(gè)VID。比如:ECU1、ECU2劃分到VID = 0x0A組,ECU2、ECU3劃分到VID = 0x0B組,如下所示:
當(dāng)某個(gè)節(jié)點(diǎn)(eg:ECU1)發(fā)送ARP Broadcast報(bào)文時(shí),該廣播幀只能在相同VID(eg:VID=0x0A)的域內(nèi)傳播,非相關(guān)的VID組則不受影響,如下所示:
如此,即限定了消息傳播的范圍,同時(shí),也降低了總線帶寬的消耗。
VLAN分組方式有多種:基于端口(Port)劃分、基于協(xié)議(Protocol)劃分、基于MAC地址劃分、基于IP地址劃分等。
Lwip+TC3xx的VLAN實(shí)現(xiàn)細(xì)節(jié)
開源的Lwip雖然是不錯(cuò)的Ethernet學(xué)習(xí)資料,但是,這并不意味著使用Lwip會(huì)一帆風(fēng)順。利用Lwip實(shí)現(xiàn)VLAN過(guò)程中,需要注意以下幾點(diǎn):
(一)netif.c修改
在netif.c的ifx_netif_input()接口中,需要添加ETHTYPE_VLAN,即:接收含有VLAN的以太網(wǎng)幀,修改如下所示:
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: ......
(二)發(fā)送VLAN設(shè)置
IfxGeth_Eth.c中,本文在接口IfxGeth_Eth_configureMacCore()中添加如下代碼,設(shè)置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()接口的具體實(shí)現(xiàn)如下所示:
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通信數(shù)據(jù)流
包含VLAN(VID = 0x0A)的通信數(shù)據(jù)流如下所示:
審核編輯:劉清
-
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5385瀏覽量
171162 -
VLAN
+關(guān)注
關(guān)注
1文章
273瀏覽量
35583 -
LwIP協(xié)議棧
+關(guān)注
關(guān)注
0文章
19瀏覽量
7342
原文標(biāo)題:以太網(wǎng)基礎(chǔ):為什么需要VLAN?
文章出處:【微信號(hào):談思實(shí)驗(yàn)室,微信公眾號(hào):談思實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論