0731-84728105
15116127200
二層交換機原型設計與實現(二)
發布時(shí)間:2021-05-06
     FAST架構的(de)UA編程非常簡單,有其固定的(de)套路,核心部分兩塊,一是(shì)在(zài)main函數中把環境初始化好,注冊UA的(de)回調函數和(hé / huò)配置硬件默認規則;二是(shì)在(zài)回調函數中專心處理分組數據,實現完整業務功能。
     二層交換的(de)分組接收由系統回調送入處理函數,後續交換相關的(de)所有邏輯均在(zài)該函數裏完成實現。
     1)UA示例代碼
     百度網盤下載地(dì / de)址:https://pan.baidu.com/s/13zmKXeMnpUMsCiL5GAI7Vg
     提取碼:ehd7
     目錄:FAST開源社區/教學案例/連載公開課/二層交換機原型設計與實現
     2)代碼文件說(shuō)明
     二層交換代碼目錄爲(wéi / wèi):/home/hnxs/l2switch/,其下共包括兩個(gè)文件,其中一個(gè)爲(wéi / wèi)main_ul2switch.c主要(yào / yāo)包括UA的(de)平台性處理代碼和(hé / huò)空的(de)callback函數。另一個(gè)是(shì)C的(de)編譯文件Makefile文件,主要(yào / yāo)說(shuō)明如何編譯生成二層交換可執行命令。
      3)編譯文件說(shuō)明

default:
   gcc -o ul2switch main_ul2switch.c -lua -lreg -lpthread
clean:
   rm -rf ul2switch

     二層交換機編譯需要(yào / yāo)使用到(dào)FAST的(de)libreg、libua和(hé / huò)系統的(de)libpthread三個(gè)庫的(de)支持。
     4)編譯, 在(zài)/home/hnxs/l2switch/目錄下輸入以(yǐ)下命令:

root@HNXS:/home/hnxs/l2switch# make

系統輸出(chū)如下:

gcc -o ul2switch main_ul2switch.c -lua -lreg -lpthread

當前目錄會多産生一個(gè)ul2switch文件

root@HNXS:/home/hnxs/l2switch# ls
main_ul2switch.c Makefile ul2switch

     5)執行驗證,在(zài)/home/hnxs/l2switch/目錄下輸入以(yǐ)下命令:

root@HNXS:/home/hnxs/l2switch# ./ul2switch
fastU->REG Version:20180827,OpenBox HW Version:2020210329
fastU->Register UA to FAST Kernel! Wait Reply......
fastU->UA->pid:3069,mid:129,Register OK!
fastU->libua version:20180827
fastU->fast_ua_recv......

顯示上(shàng)述結果說(shuō)明系統平台代碼執行正常。
     1)C程序的(de)主函數main

/*UA模塊初始化*/
ua_init(mid);
/*配置硬件默認規則,将硬件所有報文送到(dào)模塊ID爲(wéi / wèi)mid的(de)進程處理*/
fast_reg_wr(FAST_ACTION_REG_ADDR|FAST_DEFAULT_RULE_ADDR,ACTION_SET_MID<<28|mid);
/*啓動線程接收分派給UA進程的(de)報文*/
fast_ua_recv();
/*主進程進入暫停狀态,數據處理主要(yào / yāo)在(zài)回調函數*/
pause();

     2)創建UA,注冊callback

void ua_init(u8 mid)
{
int ret = 0;
/*向系統注冊,自己進程處理報文模塊ID爲(wéi / wèi)mid的(de)所有報文*/
if((ret=fast_ua_init(mid,callback)))//UA模塊實例化(輸入參數1:接收模塊ID号,輸入參數2:接收報文的(de)回調處理函數)
{
perror("fast_ua_init!\n");
exit (ret);//如果初始化失敗,則需要(yào / yāo)打印失敗信息,并将程序結束退出(chū)!
}
}

     3)callback處理函數

int callback(struct fast_packet *pkt,int pkt_len)
{
return 0;
}

     1)打印接收分組metadata信息
     FAST分組的(de)數據格式請參考第一篇文章《二層交換機原型設計與實現(一)》描述。在(zài)callback函數一開始,打印FAST分組的(de)metadata信息和(hé / huò)以(yǐ)太網協議的(de)源和(hé / huò)目的(de)MAC地(dì / de)址信息。

xprintf("inport:%d,dstmid:%d,len:%d,dmac:%02X:%02X:%02X:%02X:%02X:%02X,smac:%02X:%02X:%02X:%02X:%02X:%02X\n",
pkt->um.inport,pkt->um.dstmid,pkt_len,pkt->data[0],pkt->data[1],pkt->data[2],pkt->data[3],pkt->data[4],pkt->data[5],pkt->data[6],pkt->data[7],pkt->data[8],pkt->data[9],pkt->data[10],pkt->data[11]);

     2)調用發送函數發送分組
     調用FAST的(de)分組發送函數,将接收到(dào)的(de)一個(gè)分組從指定端口發出(chū),要(yào / yāo)特别注意metadata字段的(de)設置。

void pkt_send_normal(struct fast_packet *pkt,int pkt_len)
{
xprintf("pkt_send_normal->%p,outport:%d,len:%d\n",pkt,pkt->um.outport,pkt_len);
pkt->um.pktsrc = 1;/*報文來(lái)源爲(wéi / wèi)CPU輸入,站在(zài)硬件角度*/
pkt->um.pktdst = 0;/*報文目的(de)爲(wéi / wèi)硬件輸出(chū)*/
pkt->um.dstmid = 5;/*直接從硬件GOE模塊輸出(chū),不(bù)走解析、查表等模塊*/
fast_ua_send(pkt,pkt_len);/*調用FAST API函數發送*/
}

     該函數調用之(zhī)前,必須将pkt->um.outport字段賦值,指定分組的(de)輸出(chū)端口号。
     1)核心函數callback
     callback函數是(shì)整個(gè)UA的(de)核心功能函數,是(shì)用戶業務實現的(de)開始位置。雖然我們今天隻在(zài)該函數中做了(le/liǎo)兩件事情,一是(shì)打印接收到(dào)的(de)分組基本信息,二是(shì)将該分組發送到(dào)指定端口。但是(shì),我們今天已經在(zài)該平台上(shàng)實現了(le/liǎo)一個(gè)最簡單的(de)分組轉發功能的(de)原型系統了(le/liǎo)。
     2)注釋和(hé / huò)備份的(de)重要(yào / yāo)性
     重新性不(bù)多說(shuō),隻是(shì)在(zài)此特别的(de)特别的(de)強調一下。
     3)實現簡單交換邏輯功能
     在(zài)如此簡單的(de)一個(gè)平台上(shàng),能快速實現硬件端口的(de)分組接收和(hé / huò)指定端口的(de)分組發送,是(shì)不(bù)是(shì)網絡功能的(de)一大(dà)部分問題均已經解決?我們隻需要(yào / yāo)關注我們具體業務的(de)邏輯處理了(le/liǎo),你到(dào)底是(shì)要(yào / yāo)實現交換還是(shì)路由?是(shì)普通二層交換還是(shì)SDN交換?是(shì)普通三層路由還是(shì)lisp路由或是(shì)segment路由,是(shì)不(bù)是(shì)一切均有可能?
     不(bù)要(yào / yāo)高興得太早,這(zhè)隻是(shì)萬裏長征的(de)第一步,起點和(hé / huò)終點的(de)距離必須由自己的(de)腳步來(lái)測量,一步也(yě)不(bù)能少。所以(yǐ)我們還是(shì)從簡單的(de)二層交換機開始,下一篇文章正式進入分組交換的(de)設計。
      歡迎您和(hé / huò)學生們加入FAST開源項目群溝通與探讨,一起體驗不(bù)一樣的(de)系統設計過程。請先加微信号15116127200後邀請入群。

關注FAST開源社區
FAST一一開源、開放、高速、高效、可編程、可定義!軟硬件協同并行處理。