IP地址是和主机相关的,但是在linux内核中,IP地址却是配置到网卡的,即struct net_device中,在网络设备结构中,字段ip_ptr和ip6_ptr分别指向该网络设备的IP配置块和IPv6配置块,下面我们只关注IP配置块,ip_ptr指针实际指向的结构是struct in_device对象。
struct net_device
{
...
void *ip_ptr; /* IPv4 specific data */
void *ip6_ptr; /* IPv6 specific data */
...
}
数据结构
IP配置块: struct in_device
struct in_device
{
struct net_device *dev; // 回指网络设备
atomic_t refcnt;
// 当一个IP配置块将要被销毁时,先设置该标记为1,当引用计数为0时再执行内存回收
int dead;
// 每个网络设备可以配置多个IP地址,所以是列表
struct in_ifaddr *ifa_list; /* IP ifaddr chain */
// 多播相关的结构
rwlock_t mc_list_lock;
struct ip_mc_list *mc_list; /* IP multicast filter chain */
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 */
// 网络设备定义的邻居子系统配置参数
struct neigh_parms *arp_parms;
// 影响该网络设备的IP系统配置
struct ipv4_devconf cnf;
// 使用RCU机制回收IP配置块
struct rcu_head rcu_head;
};
网络设备与IP配置块的组织关系如下图:
IP地址: struct in_ifaddr
结构in_ifaddr保存了一个IP地址相关的配置信息。
struct in_ifaddr
{
struct in_ifaddr *ifa_next; // 同一个网络设备上配置的IP地址组成成链表
struct in_device *ifa_dev; // 回指网络设备
struct rcu_head rcu_head; // 使用RCU保护本IP地址的修改
// 对于支持广播的网络,ifa_local和ifa_address一样保存的都是本端地址;
// 对于点对点网络,ifa_address保存的是对端IP地址
__be32 ifa_local;
__be32 ifa_address;
__be32 ifa_mask; // 子网掩码
__be32 ifa_broadcast