歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux協議棧之鄰居子系統(相關流程二)

鄰居子系統初始化

跟以前一樣,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];

};
 

Copyright © Linux教程網 All Rights Reserved