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地址冲突检测的更多相关文章

  1. java 获取计算机名称, ip, mac地址

    写在前面 通常所说查询本机mac地址是以以太网为准的, 也就是网线那个口..这种描述略捞. 但是通过java的getHostAddress获取ip以及getHardwareAddress()方法获取m ...

  2. 【转载】VC获取MAC地址的4种方法

    From:http://blog.csdn.net/pdfmaker/article/details/465748 有需求才有创造,有了问题才会想着去解决,那么我这里的获取MAC地址的第4种方法也是在 ...

  3. 【转载】linux获取mac地址

    #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...

  4. IP地址与Mac地址绑定错误

    有个application,有时候可以正常访问,有时候又返回404错误,百思不得其解.刚开始以为是文件夹权限问题,折腾了好久. 后来没在服务器上monitor到包,所以猜想是到了错误的mac地址,用a ...

  5. 获取mac地址和扫描端口

    获取IP mac地址 arp -a 10.0.0.34 扫描指定IP 1到30000端口 nmap -p1-30000 10.0.0.36

  6. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  7. (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...

  8. 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层

    这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...

  9. linux 通过 mac地址 查询 ip 和 清除arp 缓存

    问题重述: 今天,突然找不到vm 的ip 了,但是可以从网卡状态上看到其 mac 地址,并且确定主机是启动状态,网络状态良好(后来发现因为子网掩码的问题,导致虚拟机和网关之间不通信,从而导致其他网络的 ...

随机推荐

  1. Linux命令——ln命令创建和删除软、硬链接(6/29)

      ln命令用来为文件创建链接,连接类型分为硬链接和符号链接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.  用法:  ln  [options]  sou ...

  2. Django学习笔记之Django Form表单

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  3. JDK1.8之Stream

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  4. jQuery垂直手风琴菜单 菜单项带小图标

    在线演示 本地下载

  5. java鲁棒性(健壮性)

    java能检测编译和运行时的错误 java自己操作内存减少了内存出错的可能 java实现了真数组,避免了覆盖数据的可能 Java不支持指针操作,大大减少了错误发生的可能性 ... 备注: Java能运 ...

  6. 20145201《Java程序设计》课程总结

    每周读书笔记链接汇总 第一周读书笔记:http://www.cnblogs.com/20145201lzx/p/5249064.html 第二周读书笔记:http://www.cnblogs.com/ ...

  7. QT的基本数据类型

    QT的基本数据类型(转) qint8:signed char 有符号8比特数据 qint16:signed short 16位数据类型 qint32:signed int. 32位有符号数据类型 qi ...

  8. Spring Boot 中修改端口和上下文路径

    通过修改application.properties内容来改变访问的端口号和上下文路径(很简单!) spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.vi ...

  9. Spring注解(赋值相关)

    上面是与生命周期有关的内容,下面是属性赋值相关的: @Configuration public class ProperTyValueConfig { @Bean public Person pers ...

  10. ceph 测试

    FIO用法: 随机读: fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16 ...