IP结构与操作之in_device结构和in_ifaddr结构
in_device为ip配置块,关联了二层设备,包含ip地址列表,组播配置,arp参数,接口配置等;
1 /* ip配置块 */ 2 struct in_device { 3 /* 二层设备 */ 4 struct net_device *dev; 5 /* 引用计数 */ 6 atomic_t refcnt; 7 /* 是否正在销毁 */ 8 int dead; 9 /* ip地址列表 */ 10 struct in_ifaddr *ifa_list; /* IP ifaddr chain */ 11 12 /* 组播相关 */ 13 struct ip_mc_list __rcu *mc_list; /* IP multicast filter chain */ 14 struct ip_mc_list __rcu * __rcu *mc_hash; 15 16 int mc_count; /* Number of installed mcasts */ 17 spinlock_t mc_tomb_lock; 18 struct ip_mc_list *mc_tomb; 19 unsigned long mr_v1_seen; 20 unsigned long mr_v2_seen; 21 unsigned long mr_maxdelay; 22 unsigned char mr_qrv; 23 unsigned char mr_gq_running; 24 unsigned char mr_ifc_count; 25 struct timer_list mr_gq_timer; /* general query timer */ 26 struct timer_list mr_ifc_timer; /* interface change timer */ 27 28 /* arp参数 */ 29 struct neigh_parms *arp_parms; 30 /* 设备接口的一些配置 */ 31 struct ipv4_devconf cnf; 32 struct rcu_head rcu_head; 33 };
in_ifaddr表示地址结构,其成员包含了地址,掩码,范围等信息,多个地址连接成链表,主地址在前,从地址在后;
1 /* 地址结构 */ 2 struct in_ifaddr { 3 struct hlist_node hash; 4 /* 下一个地址节点 */ 5 struct in_ifaddr *ifa_next; 6 /* 所属ip配置块 */ 7 struct in_device *ifa_dev; 8 struct rcu_head rcu_head; 9 /* 10 ifa_local和ifa_address都用来存储ip地址 11 但在不同设备接口意义不同 12 (1) 在配置了广播的设备上,都表示本地ip地址 13 (2) 在点对点设备上,ifa_address存储的是对端ip地址, 14 而ifa_local存储的是本地ip地址 15 */ 16 __be32 ifa_local; 17 __be32 ifa_address; 18 /* 子网掩码 */ 19 __be32 ifa_mask; 20 /* 广播地址 */ 21 __be32 ifa_broadcast; 22 /* 23 地址范围,值越小表示的范围越大 24 RT_SCOPE_UNIVERSE-在任何地方使用 25 RT_SCOPE_SITE-本地封闭系统的内部路由 26 RT_SCOPE_LINK-局域网内使用,如广播地址 27 RT_SCOPE_HOST-主机内部通信,如回环地址 28 RT_SCOPE_NOWHERE-目的地址不存在 29 30 */ 31 unsigned char ifa_scope; 32 /* 子网掩码长度 */ 33 unsigned char ifa_prefixlen; 34 /* 35 地址属性标记 36 IFA_F_SECONDARY-从属ip地址 37 IFA_F_NODAD-禁止重复地址检测,ipv6使用 38 IFA_F_HOMEADDRESS-移动ipv6家乡地址,ipv6使用 39 IFA_F_DEPRECATED-此ip地址不鼓励使用,也不禁止 40 IFA_F_TENTATIVE-尝试阶段的ip地址,仍在进行地址检测工作 41 IFA_F_PERMANENT-永久性地址,无此标识,则会动态配置ip地址 42 */ 43 __u32 ifa_flags; 44 /* 地址标签,通常是网络设备名或者网络设备别名 */ 45 char ifa_label[IFNAMSIZ]; 46 47 /* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */ 48 /* 生命周期 */ 49 __u32 ifa_valid_lft; 50 __u32 ifa_preferred_lft; 51 /* 时间戳 */ 52 unsigned long ifa_cstamp; /* created timestamp */ 53 unsigned long ifa_tstamp; /* updated timestamp */ 54 };