IP地址管理

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配置块的组织关系如下图:
net_device与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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值