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 };