网络子系统64_设备ip地址配置

//	相同子网:
//		掩码相同,网络地址相同

//	为设备配置ip地址
//	函数主要任务:
//		1.合理性检查;
//			1.1 相同子网内该地址没有被添加过
//			1.2 相同子网内的地址scope应该相同
//		2.将ifa插入到in_device->ifa_list中
//		3.通知netlink,inetaddr_chain 新地址的加入

//	注:地址在in_device->ifa_list中的排列:
//			1.主地址:插入的如果为主地址,则按照scope从大到小的顺序排列
//			2.辅地址: 总是插入到列表的最尾端

//	调用路径:inet_rtm_newaddr->inet_insert_ifa
1.1 static int inet_insert_ifa(struct in_ifaddr *ifa)
{
	struct in_device *in_dev = ifa->ifa_dev;
	struct in_ifaddr *ifa1, **ifap, **last_primary;

	//辅地址标志
	ifa->ifa_flags &= ~IFA_F_SECONDARY;
	//主地址列表
	last_primary = &in_dev->ifa_list;
	//遍历主地址列表
	for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;
	     ifap = &ifa1->ifa_next) {

		if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&//主地址
		    ifa->ifa_scope <= ifa1->ifa_scope)//ifa的scope小于等于主地址的scope
			last_primary = &ifa1->ifa_next;
		//相同子网:
		//	子网掩码长度相同的情况,网络地址相同
		if (ifa1->ifa_mask == ifa->ifa_mask &&
		    inet_ifa_match(ifa1->ifa_address, ifa)) {//网络地址有重叠
			if (ifa1->ifa_local == ifa->ifa_local) {//本地地址相同
				inet_free_ifa(ifa);//重复添加
				return -EEXIST;
			}
			if (ifa1->ifa_scope != ifa->ifa_scope) {
				inet_free_ifa(ifa);
				return -EINVAL;
			}
			//子网掩码长度相同,网络地址有重叠,设置为辅地址
			ifa->ifa_flags |= IFA_F_SECONDARY;
		}
	}
	//加入新子网
	//	子网掩码或网络地址没有重叠
	if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
		net_srandom(ifa->ifa_local);
		ifap = last_primary;
	}
	//上一个scope大于本ip地址的主地址
	ifa->ifa_next = *ifap;
	*ifap = ifa;

	//向netlink发送消息,新添加了ip地址
	rtmsg_ifa(RTM_NEWADDR, ifa);
	//通知inetaddr_chain,ip地址加入到设备
	notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);

	return 0;
}

//	删除设备的ip地址
//	函数主要任务:
//		1.如果为主地址,则删除同一子网内的所有辅地址
//		2.删除该地址
//		3.通知netlink,inetaddr_chain

//	调用路径:inet_rtm_deladdr->inet_del_ifa
1.2 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
			 int destroy)
{
	struct in_ifaddr *ifa1 = *ifap;

	//1.删除主地址,同一子网内所有辅助地址都被删除
	if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {
		struct in_ifaddr *ifa;
		struct in_ifaddr **ifap1 = &ifa1->ifa_next;

		while ((ifa = *ifap1) != NULL) {
			if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
			    ifa1->ifa_mask != ifa->ifa_mask ||
			    !inet_ifa_match(ifa1->ifa_address, ifa)) {
				ifap1 = &ifa->ifa_next;
				continue;
			}
			//同一子网内的辅助地址
			*ifap1 = ifa->ifa_next;
			//通知netlink,inetaddr_chain
			rtmsg_ifa(RTM_DELADDR, ifa);
			notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa);
			//释放ifa
			inet_free_ifa(ifa);
		}
	}

	//将地址从地址列表删除
	*ifap = ifa1->ifa_next;

	//通知netlink,inetaddr_chain,地址删除
	rtmsg_ifa(RTM_DELADDR, ifa1);
	notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
	//释放ifa
	if (destroy) {
		inet_free_ifa(ifa1);
		//如果没有配置的地址信息,释放配置信息控制块
		if (!in_dev->ifa_list)
			inetdev_destroy(in_dev);
	}
}
时间: 2025-01-30 05:49:05

网络子系统64_设备ip地址配置的相关文章

iOS获取设备IP地址

以前做过获取设备IP地址的功能,但是由于当时代码管理不当,很多代码已经遗失,现在只能重新过一遍,也让自己更有~~基情~~激情的学习.网上关于这方面的文章很多,但是找到自己真正需要的却不容易,经过几番周折.终于在著名的stackoverflow上面找到了我想要的答案. 代码如下: #import <ifaddrs.h> #import <arpa/inet.h> #import <net/if.h> #define IOS_CELLULAR @"pdp_ip0&

远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置

2.1.远程拷贝 (将/export/servers/hadoop上的文件拷贝到bigdate@192.168.1.1:/export/servers/ ) scp –r /export/servers/hadoop bigdate@192.168.1.1:/export/servers/  上面的意思是说将 /export/servers/hadoop 拷贝到192.168.1.1这台服务器下的bigdate用户下的/export/servers/这个文件夹下 2.2.查看端口 netstat

交换机配置基础:交换机VLAN接口静态IP地址配置

VLAN是为解决以太网的广播问题和安全性而 提出的一种协议,它在以太网帧的基础上增加了VLAN头,用VLAN ID把用户划分为更小的工作组,限制不同工作组间的用户互访,每个工作组就是一个虚拟局域网.下面让我们通过实践来实现交换机VLAN接口静态IP地址配置.一 组网需求:1.SwitchA为三层交换机, PC1和PC2可以通过SwitchA进行互通:2.PC1连接到SwitchA的以太网端口E1/0/1,属于VLAN10:3.PC2连接到SwitchA的以太网端口E1/0/2,属于VLAN20:

Nginx单IP地址配置多个SSL证书的方法

Nginx单IP地址配置多个SSL证书的方法 默认情况下,Nginx一个IP地址仅支持一个SSL证书,需要多个IP地址才能配置多个SSL证书,在公网IP地址有限的情况下,可以使用TLS Server Name Indication extension(SNI, RFC 6066),它允许浏览器在SSL握手的时候发送请求的server name,也就是 Host,这样 Nginx 就能找到对应server 的SSL配置. 配置步骤如下: 1.检查Nginx是否支持TLS $ nginx -V ..

处理Linux网络编程中的IP地址

 Linux网络服务能力非常强大,它的TCP/IP代码是最高级的.Linux的网络实现是模仿FreeBSD的,它支持FreeBSD的带有扩展的Sockets(套接字)和TCP/IP协议.它支持两个主机间的网络连接和Sockets通讯模型,实现了两种类型的Sockets:BSD Sockets和INET Sockets.它为不同的通信模型和服务质量提供了两种传输协议,即不可靠的.基于消息的UDP传输协议和可靠的.基于流的传输协议TCP,并且都是在IP网络协议上实现的.INET sockets是在以

网络子系统6_设备开启与关闭

// 网络设备开启 // 函数主要任务: // 1.设置dev->state=__LINK_STATE_START // 2.调用驱动程序的回调函数open // 3.设置dev->flags |= IFF_UP表示设备开启 // 4.更新多播列表, // 5.激活设备 // 6.通知监听器,设置dev->flags // 设备开启之后应该具备的特征: // 1.dev->state, 表示设备可以进行传输接收 // 2.dev->flags,表示设备已经开启 // 3.设备

C# 网络编程之通过ip地址获取地理位置(补充)

前面我写过一篇文章"C# 网络编程之获取本机名.ip地址.域名.物理位置"里面可以根据输入的网址根据其ip地址获取器物理位置,其中该部分主要代码是通过有道网提供的在线第三方接口实现动态获取它的数据.引用popping_dancer的博客代码,其主要代码如下图所示: /// <summary> /// 根据IP 获取物理地址 /// </summary> /// <param name="strIP"></param>

Android获取移动设备IP地址

MainActivity如下: package cn.testip; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 获取移动设备的IP地址 */ pub

无线网络如何设置静态ip地址

电脑用户 1.我们先进入win电脑的"控制面板"→"查看网络状态和任务"→"更改适配器设置" 如下图所示.   2.然后在网络连接面板中点击"本地连接"-->"详细信息" 在此就会看到你的IP信息了.   3.好了我们把信息记住了,然后关闭详细信息对话框再右击"本地连接"-->"属性"项. 4.在弹出对话框中双击"Internet 协议(TCP/