[转载]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 地址,并且确定主机是启动状态,网络状态良好(后来发现因为子网掩码的问题,导致虚拟机和网关之间不通信,从而导致其他网络的 ...
随机推荐
- $python数据分析基础——初识matplotlib库
基本用法 import numpy as np import matplotlib.pyplot as plt # 年份 year = [1950,1970,1990,2010] # 全球总人口(单位 ...
- python继承,判断类型,多态
1.python中继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init_ ...
- HTML5/CSS3鼠标悬停动画菜单按钮
在线演示 本地下载
- 开源CMDB详细安装使用
CMDB的GitHub地址: https://github.com/open-cmdb/cmdb 环境说明 [root@WCY ~]# cat /etc/redhat-release CentOS L ...
- 欧拉筛法(phi,d,prime)
筛法求素数的核心就是让每个合数被它的最小质因子筛掉,那么剩下来的就是素数了. 于是在这个过程中我们可以顺便求出每个数的φ().d().e(). ϕ:小于等于该数的与它互质的数的个数(一个数与其自身互质 ...
- codeforces 357
C 题意: ###n个勇士编号1-n,m个回合对战,每个回合由仍留在游戏里的编号Li~Ri的人参加,胜者为Xi,输的人退出游戏. ###求一个a1-an的序列,若ai为胜者,则ai=0,否则ai=打败 ...
- linux 挂在新硬盘
记录一下 全忘了..... PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来,才能让硬盘使用.把硬盘装好后,我们用 fdisk -l 查看下: 图中可以看出 /dev/ ...
- LAMP服务器的搭建
LAMP是一组构建Web应用平台的开源软件解决方案,它是一个开源套件组合.其中L:linux,A :Apache HTTP服务器,M : MySQL或MariaDB,P : perl或Python.这 ...
- IDEA 修改JSP和后端数据后,页面刷新可以实时更新
情况:刚开始使用IDEA进行开发时,发现修改JSP页面或者后端数据后,再刷新浏览器页面,发现没有变化,页面无更新. 这样就导致不得不频繁重启tomcat服务器.非常麻烦 解决方法: 步骤1. 先设置t ...
- Coldfusion8 读取HASH工具
#!/usr/bin/env python #-*- coding:utf- -*- import sys import threading import urllib import httplib ...