內核版本:2.6.34
802.1q
1. 注冊vlan網絡系統子空間,
每個子空間注冊成功都會分配一個ID,在register_pernet_subsys() -> register_pernet_operations() -> ida_get_new_above()獲得,而vlan_net_ops中的vlan_net_id記錄了這個ID。注冊子空間的最後會調用子空間的初始化函數vlan_init_net(),它會把vlan_net(有關vlan的proc文件系統信息)加到全局的net->gen->ptr數組中去,下標為之前分配的ID。這樣,通過vlan_net_id便可隨時查到vlan_net的信息,主要與proc有關。
2. 注冊vlan_notifier_block
關於register_netdevice_notifier()做的工作並不復雜,首先會注冊vlan_notifier_block到netdev_chain:
然後通知事件NETDEV_REGISTER和NETDEV_UP事件到網絡系統的中的每個設備:
此時nb就是vlan_notifier_block,調用通知函數vlan_device_event()。假設此時主機上擁有設備lo[環回接口], eth1[網卡], eth1.1[虛擬接口],來看vlan_device_event()函數:
判斷是否為vlan虛擬接口,則執行__vlan_device_event(),這個函數的作用就是在proc文件系統中添加或刪除vlan虛擬設備的相應項。顯然,符合條件的是eth1.1,而事件NETDEV_REGISTER會在/proc/net目錄下創建eth1.1的文件。
然後判斷dev是否在vlan_group_hash表中[參考最後”vlan設備組織結構”],它以dev->ifindex為hash值,顯然,只有eth1才有正確的ifindex,lo和eth1.1會因查詢失敗而退出vlan_device_event。