/* ip配置块 */ in_device为ip配置块,关联了二层设备,包含ip地址列表,组播配置,arp参数,接口配置等;
struct in_device {/* 二层设备 */
struct net_device *dev;
/* 引用计数 */
atomic_t refcnt;
/* 是否正在销毁 */
int dead;
/* ip地址列表 */
struct in_ifaddr *ifa_list; /* IP ifaddr chain */
/* 组播相关 */
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 */
/* arp参数 */
struct neigh_parms *arp_parms;
/* 设备接口的一些配置 */
struct ipv4_devconf cnf;
struct rcu_head rcu_head;
};
in_ifaddr表示地址结构,其成员包含了地址,掩码,范围等信息,多个地址连接成链表,主地址在前,从地址在后;
/* 地址结构 */
struct in_ifaddr {
struct hlist_node hash;
/* 下一个地址节点 */
struct in_ifaddr *ifa_next;
/* 所属ip配置块 */
struct in_device *ifa_dev;
struct rcu_head rcu_head;
/*
ifa_local和ifa_address都用来存储ip地址
但在不同设备接口意义不同
(1) 在配置了广播的设备上,都表示本地ip地址
(2) 在点对点设备上,ifa_address存储的是对端ip地址,
而ifa_local存储的是本地ip地址
*/
__be32 ifa_local;
__be32 ifa_address;
/* 子网掩码 */
__be32 ifa_mask;
/* 广播地址 */
__be32 ifa_broadcast;
/*
地址范围,值越小表示的范围越大
RT_SCOPE_UNIVERSE-在任何地方使用
RT_SCOPE_SITE-本地封闭系统的内部路由
RT_SCOPE_LINK-局域网内使用,如广播地址
RT_SCOPE_HOST-主机内部通信,如回环地址
RT_SCOPE_NOWHERE-目的地址不存在
*/
unsigned char ifa_scope;
/* 子网掩码长度 */
unsigned char ifa_prefixlen;
/*
地址属性标记
IFA_F_SECONDARY-从属ip地址
IFA_F_NODAD-禁止重复地址检测,ipv6使用
IFA_F_HOMEADDRESS-移动ipv6家乡地址,ipv6使用
IFA_F_DEPRECATED-此ip地址不鼓励使用,也不禁止
IFA_F_TENTATIVE-尝试阶段的ip地址,仍在进行地址检测工作
IFA_F_PERMANENT-永久性地址,无此标识,则会动态配置ip地址
*/
__u32 ifa_flags;
/* 地址标签,通常是网络设备名或者网络设备别名 */
char ifa_label[IFNAMSIZ];
/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */
/* 生命周期 */
__u32 ifa_valid_lft;
__u32 ifa_preferred_lft;
/* 时间戳 */
unsigned long ifa_cstamp; /* created timestamp */
unsigned long ifa_tstamp; /* updated timestamp */
};