linux路由表生成,路由表(FIB)内容的生成(一)
前面已經講到過路由表的初始化,路由表是一個比較復雜的數據結構,一下子并不好理解。下面我們通過模塊初始化時Linux的notify機制所觸發的網絡設備事件回調myfib_netdev_event,來逐步分析如何向FIB插入路由項,來進一步理解FIB。
每一個網絡設備接口在啟動時或者模塊my_inet被插入到內核空間時,都會有NETDEV_UP事件發生,通知內核,設備啟動。
myfib_netdev_event函數處理該事件,對該網絡設備接口上的每一個IP地址調用myfib_add_ifaddr函數,向路由表插入路由
項。
比如網絡設備接口eth0上有一個IP地址172.16.48.11,為從屬地址,其子網掩碼是255.255.255.0(注:這是一個B類地址,子網號和主機號都是8bit寬)。那么代表該IP地址的結構體struct in_ifaddr的內容如下所示:
struct in_ifaddr
{
struct in_ifaddr??? *ifa_next;
struct in_device??? *ifa_dev;
struct rcu_head???? rcu_head;
u32???????? ifa_local = 172.16.48.11;
u32???????? ifa_address =172.16.48.11;
u32???????? ifa_mask = 255.255.255.0;
u32???????? ifa_broadcast = 172.16.48.255;
u32???????? ifa_anycast = 0;
unsigned char?????? ifa_scope = RT_SCOPE_UNIVERSE;
unsigned char?????? ifa_flags = IFA_F_SECONDARY;
unsigned char?????? ifa_prefixlen = 24;
char??????????? ifa_label[IFNAMSIZ] = "eth0";
};
myfib_add_ifaddr函數首先要確保在eth0接口上至少有一個跟其同類型的primary地址。否則出錯,因為在插入路由表時,該primary地址是有用的。然后,將該地址加入路由表,類型為RTN_LOCAL。
如果該網絡設備沒有開啟,我們到此結束,返回,否則繼續。
如果有廣播地址,并且不是受限的廣播地址(發向255.255.255.255廣播地址的數據包永遠不會被轉發,稱為受限的廣播),則將廣播地址加入路由表(172.16.48.255),類型為RTN_BROADCAST。
如果網絡號不為零(網絡號為零,用于BOOTTP協議),并且是primary地址,并且主機號不為零或者子網掩碼不為255.255.255.255。
則把172.16.48.0(去掉主機號)加入FIB,如果為環回地址,則類型為RTN_LOCAL,否則為RTN_UNICAST。
如果子網掩碼不為255.255.255.255,則再加入兩個類型為RTN_BROADCAST的地址172.16.48.255, 172.16.48.0。
這樣一來,對于網絡設備接口上的一個IP地址,最多會向路由表加入五個路由項,第一個是主機地址,第二個是廣播地址,后面三個暫時不是很清楚。
閱讀(2221) | 評論(0) | 轉發(1) |
總結
以上是生活随笔為你收集整理的linux路由表生成,路由表(FIB)内容的生成(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据职业理解_大数据带给我们职业三大根
- 下一篇: linux命令date的功能,Linux