net_device、in_device、in_ifaddr数据结构关系:
一、in_device数据结构:
IP配置块,网络设备层与IPv4相关的配置都存放在in_device结构中,应用层可以通过ip或者ifconfig工具来修改这些配置。
该结构实例的地址保存在net_device的in_ptr中,可以通过in_dev_get()访问它。访问结束后,必须使用in_dev_put()。
in_dev_get()会递增该实例的引用计数,in_dev_put()函数会递减该结构的引用计数,当引用计数为0时,才真正释放该实例。
struct in_device {
struct net_device *dev;/*指向所属的网络设备*/
atomic_t refcnt;/*引用计数*/
int dead;/*为1时标识所在的IP配置块将要被释放,不允许再访问其成员*/
/*指向 in_ifaddr架构链表,in_ifaddr中存储了网络设备的IP地址,
因为一个网络设备可以配置多个IP地址,因此使用链表来存储。*/
struct in_ifaddr *ifa_list;
struct ip_mc_list __rcu *mc_list; /* IP multicast filter chain */
struct ip_mc_list __rcu * __rcu *mc_hash;
/*与组播相关配置*/
int mc_count; /* Number of installed mcasts */
spinlock_t mc_tomb_lock;
struct ip_mc_list *mc_tomb;
unsigned long mr_v1_seen;
unsigned long mr_v2_seen;
unsigned long mr_maxdelay;
unsigned char mr_qrv;
unsigned char mr_gq_running;
unsigned char mr_ifc_count;
struct timer_list mr_gq_timer; /* general query timer */
struct timer_list mr_ifc_timer; /* interface change timer */
/*指向neigh_parms结构实例,存储一些与ARP相关的参数*/
struct neigh_parms *arp_parms;
/*ipv4_devconf相关信息,还不知道干啥的,以后再看*/
struct ipv4_devconf cnf;
/*RCU机制使用,实现互斥,如果锁一般*/
struct rcu_head rcu_head;
};
二、in_ifaddr数据结构:
IP地址块,存储主机的IP地址,子网掩码,广播地址等信息。一个网络设备有多少个IP地址,就有多少个IP地址块。
struct in_ifaddr {
struct hlist_node hash;
struct in_ifaddr *ifa_next;//in_ifaddr链表
struct in_device *if