以太網的開發中,有時需要為節點分配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)的通信數據流如下所示:
審核編輯:劉清
-
以太網
+關注
關注
40文章
5419瀏覽量
171598 -
VLAN
+關注
關注
1文章
277瀏覽量
35636 -
LwIP協議棧
+關注
關注
0文章
19瀏覽量
7347
原文標題:以太網基礎:為什么需要VLAN?
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論