第一次看到以太網(wǎng)物理地址格式時(shí),感覺很平淡。像看到IPV4和IPV6報(bào)文的標(biāo)頭部分一樣沒有感覺。但真正去理解以太網(wǎng)物理地址某些比特含義時(shí),是在幾年前的一次吹牛中體會(huì)到的。這次吹牛,差點(diǎn)毀掉了一直以來信譽(yù)良好的好名聲。
事情起源
在本文章中,曾經(jīng)提到過,TSN(Time Sensitive Networking,TSN)和TTE(Time-Triggered Ethernet)的起源及應(yīng)用領(lǐng)域,在那篇文章中,還提到了可以嘗試著把TTE看作是密閉空間內(nèi)使用的TSN的說法。事實(shí)上,這種說法是非常不準(zhǔn)確的。二者雖然都對(duì)業(yè)務(wù)進(jìn)行了是否實(shí)時(shí)性的區(qū)分,但實(shí)現(xiàn)時(shí)卻采用了截然不同的兩種方法。
TTE和TSN實(shí)時(shí)業(yè)務(wù)的保障方式
1、保障業(yè)務(wù)的實(shí)時(shí)性采用的是調(diào)度表的方式,對(duì)TT業(yè)務(wù)的收發(fā)嚴(yán)格按照調(diào)度表執(zhí)行;詳見上一篇公眾號(hào)文章:一個(gè)人,一個(gè)想法,一家公司和即將被改變的全世界網(wǎng)絡(luò)
2、TSN中對(duì)業(yè)務(wù)實(shí)時(shí)性保障的方式不是通過調(diào)度表的方式,而是提供資源預(yù)留,即流預(yù)留協(xié)議(SRP)。TSN中的流預(yù)留協(xié)議(SRP)包括廣播、注冊(cè)和解注冊(cè)三步。在流的整個(gè)傳輸路徑上采用協(xié)商機(jī)制,提前保留出流量傳輸所需要的帶寬,如果交換端口帶寬允許,則建立連接,否則連接失敗。 同時(shí)SRP協(xié)議規(guī)定將75%的帶寬分配給實(shí)時(shí)流量,25%的帶寬分配給盡力傳BE流量,所以TSN為低優(yōu)先級(jí)流量的發(fā)送提供了機(jī)會(huì),某種程度上可以緩解低優(yōu)先級(jí)流量“饑餓”現(xiàn)象。(關(guān)于TSN的帶寬預(yù)留機(jī)制可以參見IEEE 802.1Qat和Qcc標(biāo)準(zhǔn))。
而本文所說的事情就與TSN中的資源預(yù)留協(xié)議的實(shí)現(xiàn)相關(guān)。準(zhǔn)確的說是與車載時(shí)間敏感網(wǎng)絡(luò)中的IEEE802.1Qat協(xié)議相關(guān),即多流注冊(cè)協(xié)議(Multiple Stream Registration Protocol,MSRP)。
任務(wù)要求
當(dāng)時(shí)接到的任務(wù)是,通過XILINX的通用Zedboard開發(fā)平臺(tái)(本公眾號(hào)所有案例均在此平臺(tái)上實(shí)現(xiàn)),實(shí)現(xiàn)兩種數(shù)據(jù)幀的捕獲操作。
捕獲過程是指:數(shù)據(jù)幀通過網(wǎng)口進(jìn)入FPGA,然后由FPGA通過字段匹配出需要提交給CPU的某種類型的數(shù)據(jù)幀,然后將該數(shù)據(jù)幀通過中斷的方式提交給CPU進(jìn)行分析。
需要捕獲交給CPU的幀類型有兩種:1、MSRP報(bào)文:目的MAC為01-80-C2-00-00-0E,以太網(wǎng)類型為0x22EA;2、MVRP報(bào)文:目的MAC為01-80-C2-00-00-21,以太網(wǎng)類型為0x88F5;
要求:搭建一個(gè)演示平臺(tái),通過CPU可以配置FPGA內(nèi)部用來識(shí)別捕獲幀特征的寄存器,數(shù)據(jù)幀的類型和目的MAC地址可任意配置,然后將上述兩種FPGA內(nèi)部產(chǎn)生的數(shù)據(jù)幀通過捕獲通道交給CPU。
看到了上述任務(wù)要求后感覺很簡單,這種事情做過的太多了。從HINOC項(xiàng)目到各種定制的星載交換系統(tǒng),都有類似的需求。于是在被人問需要多久做好時(shí),毫不猶豫的爽快的說道:很簡單,明天就給你!
出現(xiàn)問題
接到任務(wù)是下午,吃過晚飯后就找了兩個(gè)學(xué)生開干。Zedboard板子以及操作系統(tǒng)環(huán)境甚至連FPGA的代碼基本都是現(xiàn)成的,需要做的只是少許修改,首先要實(shí)現(xiàn)通過操作系統(tǒng)去配置FPGA上相應(yīng)的寄存器內(nèi)容(MAC地址寄存器),但就在Linux操作系統(tǒng)嘗試著通過TCP/IP協(xié)議棧配置FPGA的MAC地址時(shí)就出現(xiàn)了問題,一般的MAC地址都能很容易的配置成功,但就是前面需要捕獲給CPU的MAC,也就是MSRP報(bào)文和MVRP報(bào)文都不能配置成功。
經(jīng)過反復(fù)的嘗試,發(fā)現(xiàn)MAC地址第一個(gè)字節(jié)最低位為1的MAC地址都無法正確配置。每次都返回set mac fail。
但在設(shè)置第一個(gè)字節(jié)最低位為0的地址時(shí),都能夠設(shè)置成功。
調(diào)試中遇到問題是家常便飯,對(duì)于第一次遇見這樣奇怪的問題,一下子激起了大家的好奇心。決定一定要弄明白是怎么回事。
分析及查找問題
1、分析問題
通過Linux命令行配置目的MAC地址失敗,原因肯定在該數(shù)據(jù)的通路上。這個(gè)配置數(shù)據(jù)經(jīng)過命令行輸入后,會(huì)依次經(jīng)過TCP/IP協(xié)議棧、驅(qū)動(dòng),然后再由AXI總線寫入FPGA內(nèi)部自定義的MAC寄存器。如果出現(xiàn)問題,那么肯定是這個(gè)通路沒有走通。那到底是哪一步?jīng)]有走通呢?
2、查看FPGA內(nèi)部寄存器是否被正確寫入
為了定位問題,我們先從FPGA內(nèi)部Verilog代碼描述的專門接收操作系統(tǒng)配置下來的目的MAC寄存器查起。為了定位,我們把該寄存器及相關(guān)的寫操作及寄存器內(nèi)容都作為ChipScope的監(jiān)測(cè)信號(hào)。在命令行輸入配置信息后,看寫該寄存器的寫使能信號(hào)是否被觸發(fā),結(jié)果發(fā)現(xiàn)在寫命令輸入之后,寫使能信號(hào)沒有被觸發(fā),該寄存器值仍然是復(fù)位值。也就是說,MAC地址沒有寫入FPGA內(nèi)部的相應(yīng)寄存器中,甚至連寫該寄存器的動(dòng)作都沒有。
3、看驅(qū)動(dòng)是否接收到命令行給出的配置數(shù)據(jù)
從操作系統(tǒng)Linux命令行給出來的配置MAC指令,經(jīng)過操作系統(tǒng)處理之后,最后肯定要寫到驅(qū)動(dòng)上,由驅(qū)動(dòng)執(zhí)行寫FPGA內(nèi)部寄存器的動(dòng)作才能把數(shù)據(jù)寫入FPGA內(nèi)部寄存器。這里的驅(qū)動(dòng),屬于我們自己寫的SNMP網(wǎng)管軟件的一部分,SNMP網(wǎng)管功能主要包括驅(qū)動(dòng)和應(yīng)用程序兩個(gè)部分,這里的應(yīng)用程序大家可以簡單的理解為就是剛才的命令行輸入的配置目的MAC地址的指令。而驅(qū)動(dòng)則包括字符型驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)兩部分。字符型驅(qū)動(dòng)一般用來與應(yīng)用程序進(jìn)行交互。而網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng),主要是插入捕獲功能等,本文開始提到的捕獲MSRP報(bào)文及MVRP報(bào)文就是通過網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)執(zhí)行的。
于是,修改C代碼,在字符驅(qū)動(dòng)相關(guān)函數(shù)中加入打印信息,命令行配置目的MAC地址后,該驅(qū)動(dòng)函數(shù)未被調(diào)用。也就是說,配置信息連驅(qū)動(dòng)層面都沒有到,下一步就猜測(cè):有可能配置的目的MAC地址被TCP/IP協(xié)議棧給過濾掉了。
定位問題
經(jīng)過上述分析和查找定位,基本上定位在配置的目的MAC地址可能被TCP/IP協(xié)議棧給過濾掉了。這個(gè)時(shí)候我們才想起來,會(huì)不會(huì)是我們給出的目的MAC地址不合法???為什么總是第一個(gè)字節(jié)最低位為1的目的MAC地址會(huì)被TCP/IP協(xié)議棧過濾掉(文中開頭提到的MVRP和MSRP報(bào)文MAC地址的第一個(gè)字節(jié)最低位都為1)呢?
我們先來看一下MAC地址的定義及每一個(gè)bit的含義吧。
MAC地址含義
1、MAC地址是48bit二進(jìn)制的地址,前24位為供應(yīng)商代碼,后24為序列號(hào);2、單播地址:第一字節(jié)最低位為0,如00-e0-fc-00-00-06;3、多播地址:第一字節(jié)最低位為1,如01-e0-fc-00-00-06;4、廣播地址:48位全1,如ff-ff-ff-ff-ff-ff。
通過上面的描述,基本確認(rèn)了問題,也就是說TCP/IP協(xié)議棧會(huì)把第一個(gè)字節(jié)最低位為1的MAC地址,也就是多播地址,自動(dòng)的給過濾掉。會(huì)把配置多播地址為某個(gè)板子的MAC地址的Linux指令定義為無效指令。
找到并定位到問題以后,已經(jīng)晚上12點(diǎn)了。。。原本以為半小時(shí)就能搞定的問題,竟然花了四個(gè)小時(shí)才定位到問題。
解決問題
既然TCP/IP協(xié)議棧會(huì)把這類MAC地址過濾掉,那么我們不走TCP/IP協(xié)議棧不就可以了嗎?
好在之前做過的項(xiàng)目中預(yù)留了可以旁路掉TCP/IP協(xié)議棧的通路,直接將配置數(shù)據(jù)交給驅(qū)動(dòng),寫進(jìn)FPGA相應(yīng)的寄存器中。
這樣,捕獲給CPU的觸發(fā)條件,也就是MAC地址就順利的配到FPGA內(nèi)部了。好在,捕獲通道很順利,很容易的就把目的地址為任意MAC地址的以太網(wǎng)幀都順利的交給CPU了。(因?yàn)楫?dāng)時(shí)未保留MVRP和MSRP報(bào)文捕獲成功的截圖,隨便找了一張上課演示的圖片)
等一切都搞定的時(shí)候,已經(jīng)到了凌晨一點(diǎn)多了。
哦,對(duì)了。本文中需要將Zedboard開發(fā)板設(shè)置為從SD卡啟動(dòng)模式,板子上的跳帽位置如下:
同時(shí),在這種模式下,不加載操作系統(tǒng)的純FPGA代碼上板調(diào)試是不受影響的。
結(jié)論
1、無論任何時(shí)候,都不要隨便的說大話。要保持低調(diào)且謙虛謹(jǐn)慎的態(tài)度去面對(duì)任何一次科學(xué)實(shí)驗(yàn);
2、MAC地址中第一個(gè)字節(jié)的最低位為1表示該地址是組播地址,是不能通過操作系統(tǒng)經(jīng)過TCP/IP協(xié)議棧配置給FGPA板子的。這是文中的結(jié)論,求大佬們給出更專業(yè)的解釋。
3、本文是日常項(xiàng)目調(diào)試中出現(xiàn)的眾多問題中非常普通的一個(gè),希望大家也能夠養(yǎng)成問題記錄的好習(xí)慣,引用一位跟我同名同姓老鄉(xiāng)的話來說就是:日有寸進(jìn),得寸進(jìn)尺,日積月累,必有所成!
-
FPGA
+關(guān)注
關(guān)注
1620文章
21510瀏覽量
598965 -
寄存器
+關(guān)注
關(guān)注
31文章
5253瀏覽量
119210
原文標(biāo)題:從一次TSN相關(guān)協(xié)議實(shí)現(xiàn)中了解以太網(wǎng)MAC地址的含義
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論