以太網(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),也就是我們常說的泛洪(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ù)載呢?答:可以通過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過程中,需要注意以下幾點(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)注
41文章
5873瀏覽量
178983 -
VLAN
+關(guān)注
關(guān)注
1文章
288瀏覽量
37352 -
LwIP協(xié)議棧
+關(guān)注
關(guān)注
0文章
19瀏覽量
7831
原文標(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)先 登錄
以太網(wǎng)交換技術(shù)講解
為什么無法通過demo_feature_L2_bridge_vlan上的PFE轉(zhuǎn)發(fā)VLAN標(biāo)記的以太網(wǎng)數(shù)據(jù)包?
車載以太網(wǎng)基礎(chǔ)培訓(xùn)——車載以太網(wǎng)的鏈路層#車載以太網(wǎng)
ATM上的以太網(wǎng)服務(wù)介紹
以太網(wǎng)城域MSTP應(yīng)用發(fā)展趨勢(shì)
如何在S32DS中設(shè)置以太網(wǎng)VLAN ID?
以太網(wǎng)交換機(jī)基礎(chǔ)
以太網(wǎng)與工業(yè)以太網(wǎng)的區(qū)別
以太網(wǎng)是什么_以太網(wǎng)怎么連接寬帶
以太網(wǎng)的傳播速率_以太網(wǎng)的傳輸介質(zhì)
如何快速分辨以太網(wǎng)與千兆以太網(wǎng)

以太網(wǎng)基礎(chǔ):為什么要為節(jié)點(diǎn)分配VLAN呢?
評(píng)論