本文主要是總結分析,在前面兩節中,我們根據linux2.6.32中實現的igmp snooping代碼,分析了igmp snooping的流程。
本節在前兩節的基礎上分析實現igmp snooping所需要的功能
一、資料結構
對於實現一個子層功能,最主要的就是資料結構的建立。對於igmp snooping來說,我們需要建立的資料結構之間的關係是
1、一個組播組可以與多個橋連接埠關聯
2、一個橋連接埠可以與多個組播組關聯
3、一個橋連接埠只與一個橋關聯
4、對於橋連接埠而言,有lan側橋連接埠與wan側橋連接埠之分
5、組播組資料項目之間如何進行連結(可以通過鏈表實現等)
6、如何通過一個橋連接埠,快速的尋找到其所加入的所有組播組
7、如何通過一個組播組資料項目,快速的尋找到加入到該組播組的所有橋連接埠
根據上面的條件我們就可以構造相應的組播組資料結構滿足上述要求。對於一個子系統,資料結構最能體現功能的好壞,所以我們的資料結構就需要儘可能的去考慮
各種條件。
2、功能實現
1、對於igmp report報文的處理,對於igmp加入報文,我們就需要建立相應的組播組資料項目,然後再將加入報文發送出去。
對於已建立的組播組項,我們需要相應的到期定時器,以及發送查詢定時器,用於維護組播組資料庫的更新操作。
2、對於leave報文,需要刪除相應的組播組資料庫項等。
3、對於lan側橋連接埠與wan側橋連接埠,其接收或者發送igmp 報文的類型限制等。
4、提供外部介面,對於二層接收到的組播流資料,判斷是否需要轉寄到相應的一個或者多個連接埠
5、提供組播snooping功能開啟或者關閉的介面函數供應用程式層調用
6、在/proc目錄下建立子文檔,用於查看目前已加入組播組的橋連接埠及組播組資訊,以用於調試。
7、代碼實現中使用宏嚴格隔開igmp snooping功能,當不編譯igmp snooping功能時,保證核心可以正常工作。
如果是我們自己實現igmp snooping功能的話,考慮到上述大致情形,應該是可以簡單的實現igmp snooping 的功能了。在實際的實現中,對於每一個
函數我們都進行詳細設計,增加判斷條件等,這樣最終我們自己實現的igmp snooping功能應該也是ok的。
如果依據上面的總體需求,再去閱讀linux igmp snooping的實現代碼,會容易很多。對於閱讀linux核心代碼來說,我們最主要的是理解其實現原理。
如果我們每閱讀完一個子系統的功能實現流程後,都花一點時間去思考其實現原理及需求,應該對我們平常的代碼設計會有很大的協助。