0731-84728105
15116127200
二層交換機原型設計與實現(二)
發布時(shí)間:2021-05-06
   問錯  FAST架構的UA編程非常簡單,有其固吃報定的套路,核心部分兩塊,一是在main函數中把環境初始化好(hǎo笑遠),注冊UA的回調函數和配置硬件默認規則;二是在回調函數中森城專心處理分組數據,實現完整業務功能。 機那
    &n腦人bsp;二層交換的分組接收由系統回調送入處理函數,有船後續交換相關的所有邏輯均在該函數裡完成實現。 個光
   &nb銀你sp; 1)UA示例代碼
   線紙;  百度網盤下載地址:https://pan.baidu.com/s/13zmK兵少XeMnpUMsCiL5GAI7Vg
     提取碼:e我舊hd7
    &短雪nbsp;目錄:FAST開(kāi)源社區用微/教學案例/連載公開(kāi)課/二層交換機原型設計與實現 到山
   &n遠新bsp; 2)代碼文件說(shuō)明
   服森  二層交換代碼目錄為(wèi):/hom山章e/hnxs/l2switch/,其下共包括兩個文件,其中一個為花說(wèi)main_ul2switch.c主要包括UA的平台性處理代志那碼和空的callback函數。另一個是C市員的編譯文件Makefile文件,主要說(shuō)明如拍資(rú)何編譯生成二層交換可執行命令。
      讀唱 3)編譯文件說(shuō)明

default:
   gc自裡c -o ul2switch main_ul2switch.c市金 -lua -lreg -lpthread
clean:
  &nb嗎短sp;rm -rf ul2switch

     山懂二層交換機編譯需要使用到FAST的libreg、libua和系拍購統的libpthread三個庫的支持。
    作科 4)編譯, 在/home/hnxs/些風l2switch/目錄下輸入以下命令: 白些

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

系統輸出如(rú)下:

gcc -o ul2switch mai少那n_ul2switch.c -lua -l市間reg -lpthread

當前目錄會(huì)多産生一個ul南拿2switch文件

root@HNXS:/home/hnxs/l2sw靜這itch# ls
main_ul2switch.c Makefile ul2sw日章itch

   &呢家nbsp; 5)執行驗證,在/home/hnxs/l2swi上關tch/目錄下輸入以下命令:

root@HNXS:/home/hnxs/l2switch分樹# ./ul2switch
fastU->REG Version:201808街上27,OpenBox HW Version:2020210329
fastU->Register UA能站 to FAST Kernel! Wait Reply人都......
fastU->UA->pid:3069,mid:129,Regist醫很er OK!
fastU->libua version:商窗20180827
fastU->fast_ua_recv...... 從作

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

/*UA模塊初始化*/
ua_init(mid);
/*配置硬件默認規則,将硬件所有報文送到模塊ID為(wèi)m紙電id的進程處理*/
fast_reg_wr(FAST_ACTION_REG_ADDR吃話|FAST_DEFAULT_RULE_ADDR,ACTION_SET_M作街ID<<28|mid);
/*啟動線程接收分派給UA進程的報文*/
fast_ua_recv();
/*主進程進入暫停狀态,數據處理主要在回調函數*/
pause();

     能城2)創建UA,注冊callback

void ua_init(u8 mid)
{
int ret = 0;
/*向系統注冊,自己進程處理報文模塊ID為(w刀事èi)mid的所有報文*/
if((ret=fast_ua_init(mid,低不callback)))//UA模塊實例化(輸少對入參數1:接收模塊ID号,輸入參數2:接收報文的回調處理函數)
{
perror("fast_ua_init計服!\n");
exit (ret);//如(rú)果初始化失敗,爸算則需要打印失敗信息,并将程序結束退出!
}
}

   &裡低nbsp; 3)callback媽商處理函數

int callback(stru玩醫ct fast_packet *pkt,in中藍t pkt_len)
{
return 0;
}

     1)打大土印接收分組metadata信息
     少鄉;FAST分組的數據格式請參考第一篇文章《二層交換機原從體型設計與實現(一)》描述。在callback函數一開(好呢kāi)始,打印FAST分組的metadata信息和以太網協議的源和懂員目的MAC地址信息。

xprintf("inport:%d,dstmid:%d,le明能n:%d,dmac:%02X:%02X:%02X:%裡鐵02X:%02X:%02X,smac:%02X:%理金02X:%02X:%02X:%02X:%討遠02X\n",
pkt->um.inport,pkt->um.d用離stmid,pkt_len,pkt->data[0],pk子坐t->data[1],pkt->data[錢刀2],pkt->data[3],pkt->data[4],都行pkt->data[5],pkt->data[6],pkt門化->data[7],pkt->data[8],pkt->da街商ta[9],pkt->data[10],pkt木舞->data[11]);

     2)調用車木發送函數發送分組
    &nbs吧信p;調用FAST的分組發送函數,将接收到樹大的一個分組從指定端口發出,要特别注意metadat遠地a字段的設置。

void pkt_send愛湖_normal(struct fast_packet *pkt,int p子體kt_len)
{
xprintf("pkt_send_normal->%煙有p,outport:%d,len:%d\n",pkt,pkt->um.離知outport,pkt_len);
pkt->um.pktsrc = 1;/*報文來源為(w銀了èi)CPU輸入,站在硬件角度*/
pkt->um.pktdst = 0;/*報文學就目的為(wèi)硬件輸出*/
pkt->um.dstmid = 5;/*直接從硬件GOE上遠模塊輸出,不(bù)走解析、查表等模塊*/
fast_ua_send(pkt,pkt_len);/*調用FA煙城ST API函數發送*/
}

    &nbs朋是p;該函數調用之前,必須将pkt->um.outport字段賦值,間數指定分組的輸出端口号。
   船睡  1)核心函數callback笑懂
   制計  callback函數是整個UA的核心功能函數,會木是用戶業務實現的開(kāi)始位置。雖然我們(men)今天又嗎隻在該函數中做了兩件事情,一是打印接收到愛年的分組基本信息,二是将該分組發送到指定端口。但是,我們(men)今天已經在該制作平台上實現了一個最簡單的分組轉發功能的原型系統了。
     為紅;2)注釋和備份的重要性
   話數  重新性不(bù)多說(shuō),隻是在此特别的特别的哥又強調一下。
   &nbs務算p; 3)實現簡單交換邏輯功能
    &n慢計bsp;在如(rú)此簡單的一個平台上,能快對能速實現硬件端口的分組接收和指定端口的分組發送,校的是不(bù)是網絡功能的一大(dà)部分問題均書分已經解決?我們(men)隻需要關注我們(men)具體業務的邏輯處間電理了,你到底是要實現交換還是路由?是普通(tōng)二層交換還答雨是SDN交換?是普通(tōng)三層路由還舊月是lisp路由或是segment路由,是不(bù)是一切均很外有可能?
     話愛不(bù)要高興得(de)太早,這隻是萬裡長(cháng)征的東業第一步,起點和終點的距離必須由自己的腳步來測量,一步也不(bù)能少。所以西少我們(men)還是從簡單的二層交換機開(kāi)始,下一篇船我文章正式進入分組交換的設計。
    美長;  歡迎您和學生們(men)加入FAST開(kāi)唱歌源項目群溝通(tōng)與探讨,一起體驗不(bù)一樣的系統設計過程。請先機他加微信号15116127200後邀請入群。

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