0731-84728105
15116127200
二層交換機原型設計與實現(二)
發布時間:2021-05-06
     FA謝舊ST架構的UA編程非常簡單,有其固定的套路,核心部分銀歌(fēn)兩塊,一(yī)是在main函數中(zhōn數員g)把環境初始化好,注冊UA的回調函數和配置硬件默認規則;二是在民月回調函數中(zhōng)專心處理分(fēn)組用身數據,實現完整業務功能。
   &煙煙nbsp; 二層交換的分(fēn)組接收由系生妹統回調送入處理函數,後續交換相關的所有邏輯均在該函數裏完成實現。 裡媽
   不白;  1)UA示例代碼
  &nbs很美p;  百度網盤下(xià)載地址:https://pan.baidu.com/s/13zm費做KXeMnpUMsCiL5GAI7Vg
  &nbs如化p;  提取碼:ehd7
    &場白nbsp;目錄:FAST開(kāi)源社區/教學案例/連載公花離開(kāi)課/二層交換機原型設計與實現 內物
     姐道;2)代碼文件說明
    &長歌nbsp;二層交換代碼目錄爲:/home/hnx商體s/l2switch/,其下(xià)共包括兩個文件,用這其中(zhōng)一(yī)個爲main_ul2switc事靜h.c主要包括UA的平台性處理代碼和空的callba不笑ck函數。另一(yī)個是C的編譯文件Mak書友efile文件,主要說明如何編譯生(shēng)成二層交換可執行命令。 匠舞
    &nbs亮身p; 3)編譯文件說明

default:
   gcc -o ul2明事switch main_ul2switch.c -lu站舊a -lreg -lpthread
clean:
   rm -rf ul2s線了witch

   書行  二層交換機編譯需要使用到FAST內劇的libreg、libua和系統的libpthread三個庫的支持。 商科
   &nbs道路p; 4)編譯, 在/home/hnxs/l2switc西中h/目錄下(xià)輸入以下(xià)命令: 票西

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

系統輸出如下(xià):

gcc -o ul2switch聽做 main_ul2switch.c -lua -lreg -lpthre子朋ad

當前目錄會多産生(shēng)一(yī)個ul2switch文女的件

root@HNXS:/home/房要hnxs/l2switch# ls
main_ul2switch.c Makefil聽店e ul2switch

   &你兒nbsp; 5)執行驗證,在/home/hnx日內s/l2switch/目錄下(xià)輸入以下(xià)命令: 她白

root@HNXS:/home/hnxs/l2switch# ./u鐵金l2switch
fastU->REG Version:20180827,Op什書enBox HW Version:2020210329
fastU->Register UA to FAST 老金Kernel! Wait Reply......
fastU->UA->pid:306員歌9,mid:129,Register OK!
fastU->libua version:20180827
fastU->fast_ua_recv.....跳體.

顯示上述結果說明系統平台代碼執行正常。 廠用
   &n外低bsp; 1)C程序的主函數main

/*UA模塊初始化*/
ua_init(mid);
/*配置硬件默認規則,将硬件所有報文城子送到模塊ID爲mid的進程處理*/
fast_reg_wr(FAST_ACTION_REG見明_ADDR|FAST_DEFAULT_RUL公樂E_ADDR,ACTION_SET_MID<<28|mid);
/*啓動線程接收分(fēn)派給UA進程的報文*/
fast_ua_recv();
/*主進程進入暫停狀态,數據處理主要在回調函數*/
pause();

   &nbs河看p; 2)創建UA,注冊callback 明土

void ua_init(u8 mid)
{
int ret = 0;
/*向系統注冊,自己進程處理報文模塊ID爲嗎銀mid的所有報文*/
if((ret=fast_ua_i能通nit(mid,callback)))//UA模玩明塊實例化(輸入參數1:接收模塊ID号,輸入參數2:接收報文友離的回調處理函數)
{
perror("fast_ua_init!\n他們");
exit (ret);//如果初始化失敗,則需要打印失敗花機信息,并将程序結束退出!
}
}

    &n文雨bsp;3)callback處理函數

int callback(stru議文ct fast_packet *pkt,int pkt_len)作文
{
return 0;
}

   事男  1)打印接收分(區為fēn)組metadata信息
   &請問nbsp; FAST分(fēn筆那)組的數據格式請參考第一(yī)篇文章《二層交換機原型設計與實現(一(yī))家歌》描述。在callback函數一(yī)開(kāi)始,打印FA市區ST分(fēn)組的metadata信息和以太網協議的源和目的麗線MAC地址信息。

xprintf("inport:%d,dstm線身id:%d,len:%d,dmac:%02X:%呢麗02X:%02X:%02X:%02X:%02X,smac:%02X:%02X影雜:%02X:%02X:%02X:%02X\n",
pkt->um.inport,pkt->um.dstmid,pk老市t_len,pkt->data[0],pkt->機還data[1],pkt->data[2],pkt->da家身ta[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)調用發照有送函數發送分(fēn)組
   &有歌nbsp; 調用FAST的分(中喝fēn)組發送函數,将接收到的一(yī)個分(fēn)組從指定南一端口發出,要特别注意metadata字段的設置。

void pkt_send_no金少rmal(struct fast_packet *p亮草kt,int pkt_len)
{
xprintf("pkt_send_normal->%p,out些少port:%d,len:%d\n",pkt,pkt-樂議>um.outport,pkt_len);
pkt->um.pktsrc = 1;/*報文來源爲CPU輸入,站妹書在硬件角度*/
pkt->um.pktdst = 0;/*音快報文目的爲硬件輸出*/
pkt->um.dstmid = 5;/*直接從硬件GO謝銀E模塊輸出,不走解析、查表等模塊*/
fast_ua_send(pkt,pkt_len);/*調如吃用FAST API函數發送*/
}

     多個該函數調用之前,必須将pkt->um.outport字段賦值,指定分(fēn)到就組的輸出端口号。
   &筆雪nbsp; 1)核心函數callback
    &n短秒bsp;callback函數是整個UA的核心功能函數,是用戶業務實討遠現的開(kāi)始位置。雖然我(wǒ)(wǒ)們問訊今天隻在該函數中(zhōng)做了兩件事情,一(yī)是打印接收到的分短會(fēn)組基本信息,二是将該分(fēn)組發送到指定端口。但是,我(wǒ)會醫(wǒ)們今天已經在該平台上實現了一(yī)個最簡單的分這到(fēn)組轉發功能的原型系統了。
     2)注釋和如志備份的重要性
     重書國新性不多說,隻是在此特别的特别的強調一(y到計ī)下(xià)。
   &厭票nbsp; 3)實現簡單交換邏輯功能
   &是快nbsp; 在如此簡單的一(yī)個平人司台上,能快速實現硬件端口的分(fēn)組接收和指定端口的分(fēn)慢謝組發送,是不是網絡功能的一(yī)大(dà)部分(fēn)問題均已經解決?我爸遠(wǒ)(wǒ)們隻需要關注我(wǒ)(w小拿ǒ)們具體(tǐ)業務的邏輯處理了,你到底是要實老玩現交換還是路由?是普通二層交換還是SDN交換?是普通三相秒層路由還是lisp路由或是segment路由,是不是一(y線還ī)切均有可能?
    &n制睡bsp;不要高興得太早,這隻是萬裏長征的第一(yī)步,起點和南來終點的距離(lí)必須由自己的腳步來測量,一(yī)步也不能少。所文遠以我(wǒ)(wǒ)們還是從簡單的二層交換機開(kāi)始,歌短下(xià)一(yī)篇文章正式進入分(fēn)組交換的設計。 南玩
      黃關 歡迎您和學生(shēng)們加入FAST開(k機動āi)源項目群溝通與探讨,一(yī)起體(tǐ)驗不一你在(yī)樣的系統設計過程。請先加微信号15116127200後邀請入群。 光舞

關注FAST開(kāi)源社區
FAST一(yī)一(yī)開(kā動從i)源、開(kāi)放(fàng)、高速、高效、可編程、可定義!軟硬件協同通山并行處理。