[转载]Lwip之IP/MAC地址冲突检测
from: http://blog.csdn.net/tianjueyiyi/article/details/51097447
LWIP是个轻量级的TCP/IP协议栈,之所以说轻量级,是因为作者将主体功能浓缩起来,做成这相对简单的协议栈,主要针对于ROM/RAM极缺极珍贵的环境下使用。正是因为轻量、简单,所以平时很多理所当然的东西,大家都会觉得在这上面也能实现,实则不然,用过LWIP的人就会感觉到。假如一种情况,你设置的IP/MAC与网络中其它设备冲突,这时既检测不到,更查不出是何原因,总是链接会无缘无故地断。在这里,针对冲突这问题,提出一种解决方法,欢迎切磋纠正。首先,需要了解一下,什么是Gratuitous ARP。有兴趣的可以百度一下,这里我就总结一下。当设备接入网络时,需要先发一个信息询问一下其它设备,“我发的这个IP,谁有?”。如果网络中存在这个IP,则会回复;正是利用Gratuitous ARP这个东西,对其回复进行判断,如果接收到的响应或者回复,存在IP与设备自身相同,则标记为IP冲突。MAC冲突同理。在LWIP中,对以下地方进行改进,则可实现MAC和IP冲突的检测。下面贴出主要部分代码。
etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p){
...
case PP_HTONS(ARP_REQUEST):
if(ip_addr_cmp(&sipaddr, &(netif->ip_addr))){
etharpError |= DUPLICATE_IP;
}
if((hdr->shwaddr.addr[0] == netif->hwaddr[0])&&
(hdr->shwaddr.addr[1] == netif->hwaddr[1])&&
(hdr->shwaddr.addr[2] == netif->hwaddr[2])&&
(hdr->shwaddr.addr[3] == netif->hwaddr[3])&&
(hdr->shwaddr.addr[4] == netif->hwaddr[4])&&
(hdr->shwaddr.addr[5] == netif->hwaddr[5])){
etharpError |= DUPLICATE_MAC;
}
...
case PP_HTONS(ARP_REPLY):
if(ip_addr_cmp(&sipaddr, &(netif->ip_addr))){
etharpError |= DUPLICATE_IP;
}
if((hdr->shwaddr.addr[0] == netif->hwaddr[0])&&
(hdr->shwaddr.addr[1] == netif->hwaddr[1])&&
(hdr->shwaddr.addr[2] == netif->hwaddr[2])&&
(hdr->shwaddr.addr[3] == netif->hwaddr[3])&&
(hdr->shwaddr.addr[4] == netif->hwaddr[4])&&
(hdr->shwaddr.addr[5] == netif->hwaddr[5])){
etharpError |= DUPLICATE_MAC;
}
...
在其它使用的地方只需判断etharpError 这个变量即可知道是否有冲突。因为Gratuitous ARP是机子一接入网络后初始化时发出的,所以可以不用担心是否在判断变量时还没检测到冲突。
[转载]Lwip之IP/MAC地址冲突检测的更多相关文章
- java 获取计算机名称, ip, mac地址
		
写在前面 通常所说查询本机mac地址是以以太网为准的, 也就是网线那个口..这种描述略捞. 但是通过java的getHostAddress获取ip以及getHardwareAddress()方法获取m ...
 - 【转载】VC获取MAC地址的4种方法
		
From:http://blog.csdn.net/pdfmaker/article/details/465748 有需求才有创造,有了问题才会想着去解决,那么我这里的获取MAC地址的第4种方法也是在 ...
 - 【转载】linux获取mac地址
		
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...
 - IP地址与Mac地址绑定错误
		
有个application,有时候可以正常访问,有时候又返回404错误,百思不得其解.刚开始以为是文件夹权限问题,折腾了好久. 后来没在服务器上monitor到包,所以猜想是到了错误的mac地址,用a ...
 - 获取mac地址和扫描端口
		
获取IP mac地址 arp -a 10.0.0.34 扫描指定IP 1到30000端口 nmap -p1-30000 10.0.0.36
 - Java获取本机的IP与MAC地址
		
有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...
 - (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
		
郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...
 - 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层
		
这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...
 - linux 通过 mac地址 查询 ip 和 清除arp 缓存
		
问题重述: 今天,突然找不到vm 的ip 了,但是可以从网卡状态上看到其 mac 地址,并且确定主机是启动状态,网络状态良好(后来发现因为子网掩码的问题,导致虚拟机和网关之间不通信,从而导致其他网络的 ...
 
随机推荐
- 【Java Web】入门资源整理
			
[网站] 1.Java Web Application Tutorial for Beginners - JournalDev Google top1 除Java Web还有很多其他教程 2.Intr ...
 - SQuirrel-GUI工具安装手册-基于phoenix驱动
			
背景描述: SQuirrel sql client 官方地址:http://www.squirrelsql.org/index.php?page=screenshots 一个图形界面的管理工具 安装手 ...
 - 20145235李涛《网络对抗》Exp2 后门原理与实践
			
Windows获得Linux Shell Linux获得windows shell 实验内容 使用netcat获取主机操作shell,cron启动 使用socat获取主机shell,任务计划启动 使用 ...
 - Hadoop:eclipse配置hadoop-eclipse-plugin(版本hadoop2.7.3)
			
配置hadoop-eclipse-plugin(版本hadoop2.7.3): 1:首先下载我们需要的 hadoop-eclipse-plugin-2.7.3.jar,winutils.exe 和 ...
 - 去掉xml中的空格和换行符
			
有时在拼接xml或是导入xml格式文件时,会无缘无故出现很多空格符合换行符,导致在转换json时会报各种错误,特此在网上找到了一中比较实用的方法: strxml = Regex.Replace(str ...
 - sem学习
			
关键字的选取搜索引擎营销的关键字选取是非常重要的一步,合适的关键字可以为企业带来可观的咨询量.关键字一般分4种,品牌词,产品词,行业词,竞品词,对于这四类词不同的推广策略有着不同的侧重点,根据市场情况 ...
 - php读取csv乱码问题解决方法
			
<form action="erxian_cy.php" method="post" enctype="multipart/form-data& ...
 - 谷歌浏览器和火狐浏览器设置跨域和https、http混用 Chrome
			
谷歌浏览器和火狐浏览器设置跨域和https.http混用 Chrome 添加启动项: 右键点击Chrome快捷方式,在目标一栏后添加启动项 允许跨域: --disable-web-securit ...
 - AtCoder Regular Contest 095
			
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
 - [Ctsc2000]冰原探险
			
Description 传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址.整个冰原被横竖划分成了很多个大小相等的方格.在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历 ...