Click Modular Router
特別鳴謝hhsh
下面文章是對自己使用click軟件路由器的總結,關於click的具體信息,大家可以在它的網站上獲得http://www.read.cs.ucla.edu/click/
首先介紹click的安裝:(參考麗哥的博客)
1。用戶態的安裝。
click用戶態的安裝相當的easy,幾條命令搞定
(1) 如果沒有安裝編譯環境,首先要安裝編譯環境 sudo apt-get install buildessential
(2) 從click的官方網站下栽(http://read.cs.ucla.edu/click/download)安裝包,解壓到自己喜歡的目錄。這裏我們使用的是clcik-1.8.0的數據包,然後進入click目錄 cd /clickDir/click-1.8.0然後運行以下命令 ./config ; sudo make ; sudo make install。
(3)ok,搞定了,進入到click 的conf目錄,運行 click test.click 運行產生5組數據,成功了,easy吧。
2。核心態的安裝
如果你真的想用click整點事的話用戶態是遠遠不夠的,需要安裝在覈心態。。。。
如果之前你編譯過內核,那麼核心態的安裝對你來說也不過小菜一碟,如果之前沒有編譯過也沒什麼,編譯內核也是幾個傻瓜式的步驟(前提是編譯過程中不出現錯誤哈~~)。需要說明的是內核編譯選用的環境是ubuntu8.04,版本再高了就容易出錯,有大嬸解釋是gcc版本的問題,總之是沒有搞定,如果你是新手有不想折騰的話建議使用8.04的版本
首先要完善編譯環境,內核的要稍微多一點,命令:sudo apt-get install build-essential kernel-package libncurses5-dev
其次要選取新內核( http://www.kernel.org/pub/linux/kernel/),click支持的最新的內核linux-2.6.24.7,我們就使用她咯。將新內核解壓後,進入新內核,如果之前編譯過,首先運行命令 sudo make mrproper清理一下之前編譯的餘孽~~~
接下來我們要爲新內核打上click的補丁了,運行命令 patch -p1 < ../click-1.8.0/etc/linux-2.6.24.7-patch 千萬別忘記這一步噢,要不然內核編譯就白忙活了。。。。
下一步:配置內核,關於內核配置的詳細說明可以參考金步明的文獻,講的很詳細。。。在這裏運行命令 make menuconfig 選擇時要注重Network的選擇。。。
如果嫌麻煩,可以在運行命令前運行命令cp ../config-2.6.24.7 ./.config 將你之前的內核配置選項copy過來,然後運行make menuconfig後出現的界面裏,選擇加載。
編譯並安裝內核了
運行命令 make -j && make bzImage && make modules -j
&& make install && make modules_install
下一步將生成的initrd文件
mkinitramfs -o initrd.img-2.6.24.7 2.6.24.7
最後一步更新grub。。進入目錄/boot/grub 運行命令 sudo update-grub 搞定。。
重啓進入新內核安裝click,跟用戶態安裝一樣 ./config ; sudo make ; sudo make install。
ok,如果安裝沒有什麼問題的話,接下來就對click的簡單的應用進行介紹了,在閱讀下面內容之前希望你先瀏覽一下click網站中elements的介紹,以及click的論文。
click配置文件的編寫,在click文件夾中有關於click配置文件的例子,大家可以自己研究裏面的例子進行書寫自己的配置文件,我主要介紹一下初學者比較不太容易發現的東西,減少大家入門的時間,把更多的精力放在研發上
1.clicky工具的使用。click開發團隊開發了clicky這一圖形化工具,clicky工具的安裝只能在核心態進行,具體的安裝步驟可以參考readme文件,裏面有很詳細的介紹,我就不多說了。clicky的使用也很簡單,跟click命令一模一樣。。。。
2.數據包時延的統計。click中自帶的element可以統計數據包的時延,這兩個element分別是SetTimeStamp 和TimeStampAccum(貌似是,可以參考click網站element對timestamp的介紹中找到他們)。使用方法如下:
1)配置文件test.click s0:RatedSource(\<DATA><08000000000000000000000000000>,1000,100)->SetTimeStamp->Queue()->router::DRRSched()->t::TimeStampAccum->DIscard;
2) 運行命令 click -h t.time -h t.average_time -h t.count test.click
此命令獲得了s0產生的數據源經過DRR調度算法後的所有數據包的時間,每個數據包的時延、數據包的個數
3 統計丟包情況
1)配置文件 test1.click
s0::RatedSource(\<DATA><0800000000000000000000000000>,1000,1000);
s1::RatedSource(\<DATA>08111111111111111111111111111>,1000,1000);
s0->q0::Queue(10)->[0]router;
s1->q1::Queue(10)->[1]router;
router->Discard;\
2)運行命令 sudo click -h q0.drop -h q1.drop test1.click。
獲得每個隊列的掉包數目
。。。。其他的一些應用暫時還沒有發現,如果有發現的歡迎補充哦
可能只用click提供的element不能夠滿足應用,我們要自己寫element。。寫之前我覺得很有必要看一下click網站的api文檔,然後自己對click提供的一些element的源碼進行研究,先看懂了再寫。。。
第一步,編寫你自己的組件(Element)類。
每一個組件類應該由兩個C++源文件構成,file.cc和file.hh。對於剛接觸Click的用戶,一個方便的創建自己組件類的方法,就是複製一個已經存在的組件,然後改變這個C++的名字,然後至少改變這些函數:
const char *class name()const;//返回Element類的名字
void push(int i,Packet *);//處理輸入端口i的push請求
Packet* pull(int i);//處理輸入端口i的pull請求
Packet* simple ( );//適用於不定型的Element
int configure(Vector<String>&,ErrorHandler *)//處理配置參數
Void add handler();//構造一個Element手柄
int initialize(ErrorHandler *);//
void cleanup(CleanupStage); ∥清理Element狀態
在編寫一個新的包處理組件的時候,主要考慮兩個問題:
(1)該組件完成什麼處理功能。這個在實現時可放在push()函數或者pull()函數或者simpleAction()函數裏完成。這是該組件的核心功能,我們的大部分代碼都會在這裏實現。
(2)該組件接不接收用戶參數,應該接收什麼類型用戶參數。我們可以根據組件的功能需求來決定這個問題,然後在具體代碼實現中,我們只需要改動的部分是int configure(Vector<String>&,ErrorHandler *)函數。
當寫好你的組件類,不要忘記你的C++文件以下列語句結尾:EXPORT ELEMENT(class name)其中的class name代表具體的組件類名。該語句的作用是告訴編譯器將我的自定義組件類給編譯進Click系統。
第二步,當你完成你上面的步驟以後,把你的Element放到“click-1.8.0/eleme
nts/”目錄下的stands文件夾裏或者放到你自己新創建的文件夾,比如myElement。
如果是放在stands文件夾中,直接跳過第三步。如果是放到自己創建的文件夾中,則進入步驟三。
第三步,進入click-1.8.0/elements/myElement目錄下,運行sudo ./configure--enable-myElement 命令。此命令的作用是告知編譯單元在編譯時加載此文件夾。
第四步,運行“make elemlist”語句,將新編寫的Element添加到elements.conf文件中。
第五步,運行“make install”,如果沒有出現錯誤信息,那麼添加自己Element的工作結束,可以在配置模塊使用此Element,進行功能和性能上的測試。如果出現錯誤信息,則根據錯誤提示信息,對自己的Element的代碼進行修改。