鄰居子系統初始化
跟以前一樣,linux源代碼版本為2.6.21
void __init arp_init(void) (net/ipv4/arp.c)
{
//鄰居表初始化
neigh_table_init(&arp_tbl);
//注冊arp協議
dev_add_pack(&arp_packet_type);
//建立proc對象
arp_proc_init();
#ifdef CONFIG_SYSCTL
neigh_sysctl_register(NULL, &arp_tbl.parms, NET_IPV4,
NET_IPV4_NEIGH, "ipv4", NULL);
#endif
//事件通知鏈表
register_netdevice_notifier(&arp_netdev_notifier);
}
在neigh_table_init(&arp_tbl);中,對鄰居表進行了相應的初始化,特別的,初始化了一個垃圾回收定時器。後面再給出討論
arp_packet_type的內容為:
static struct packet_type arp_packet_type = {
.type = __constant_htons(ETH_P_ARP), (鏈路層對應的協議號)
.func = arp_rcv, 《數據包的處理函數》
}
從上面可以看出,當接收到arp數據包時,將用arp_rcv()處理
五:鄰居系統數據結構分析
neigh_table結構:
struct neigh_table
{
//下一個鄰居表
struct neigh_table *next;
//協議簇
int family;
//入口長度,也就是一個鄰居結構的大小,初始化為sizeof(neighbour)+4(4為一個IP地址的長度)
int entry_size;
//哈希關鍵值長度 即IP地址的長度,為4
int key_len;
//哈希值的計數函數(哈希值是經對應設備net_device 與 目的Ip計算出來的)
__u32 (*hash)(const void *pkey, const struct net_device *);
//鄰居初始化函數
int (*constructor)(struct neighbour *);
int (*pconstructor)(struct pneigh_entry *);
void (*pdestructor)(struct pneigh_entry *);
void (*proxy_redo)(struct sk_buff *skb);
//鄰居表的名稱
char *id;
struct neigh_parms parms;
/* HACK. gc_* shoul follow parms without a gap! */
//常規垃圾回收的時候
int gc_interval;
int gc_thresh1;
//第二個閥值,如果鄰居超過此值,當創建新的鄰居時
//若超過五秒沒有刷新,則必須立即刷新,強制垃圾回收
int gc_thresh2;
//允許鄰居的上限
int gc_thresh3;
//最近刷新時間
unsigned long last_flush;
//常規的垃圾回收定時器
struct timer_list gc_timer;
struct timer_list proxy_timer;
struct sk_buff_head proxy_queue;
//整個表中鄰居的數量
int entries;
rwlock_t lock;
unsigned long last_rand;
struct neigh_parms *parms_list;
kmem_cache_t *kmem_cachep;
struct neigh_statistics *stats;
//哈希數組,存入其中的鄰居
struct neighbour **hash_buckets;
//哈希數組大小的掩碼
unsigned int hash_mask;
__u32 hash_rnd;
unsigned int hash_chain_gc;
//與代理arp相關
struct pneigh_entry **phash_buckets;
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *pde;
#endif
}
Neighbour結構:
struct neighbour
{
//下一個鄰居
struct neighbour *next;
//所在的鄰居表
struct neigh_table *tbl;
//arp傳輸參數
struct neigh_parms *parms;
//鄰居項所對應的網絡設備
struct net_device *dev;
//最後使用時間
unsigned long used;
unsigned long confirmed;
//更新時間
unsigned long updated;
__u8 flags;
//鄰居項對應的狀態
__u8 nud_state;
__u8 type;
//存活標志,如果dead為1,那麼垃圾回收函數會將此項刪除
__u8 dead;
//重試發送arp請求的次數
atomic_t probes;
rwlock_t lock;
//對應鄰居的頭部緩存
unsigned char ha[(MAX_ADDR_LEN+sizeof(unsigned long)-1)&~(sizeof(unsigned long)-1)];
struct hh_cache *hh;
//引用計數
atomic_t refcnt;
//鄰居項對應的發送函數
int (*output)(struct sk_buff *skb);
//對應的發送skb隊列
struct sk_buff_head arp_queue;
//定時器
struct timer_list timer;
struct neigh_ops *ops;
//哈希關鍵字
u8 primary_key[0];
};