Lwip之IP/MAC地址顶牾检测

2018-11-28 -

  ? ? ? ? LWIP是个轻量级的TCP/IP协议栈,之因此说轻量级,是鉴于干者将主体干用稀释宗到来,做成此雕刻对立骈杂的协议栈,首要针关于ROM/RAM极缺极宝贵的环境下运用。

  ? ? ? 正是鉴于轻量、骈杂,因此往日很多不移到理的东方正西,父亲家邑会觉得在此雕刻下面也能完成,实则不然,用费过LWIP的人就会觉违反掉落。

  ? ? ? 假设壹种情景,你设置的IP/MAC与网绕中其它设备顶牾,此雕刻时既然检测不到,更查不出产是何缘由,尽是链接会事出产拥有因地断。

  ? ? ? 在此雕刻边,针对顶牾此雕刻效实,提出产壹种处理方法,乐当着商量改正。

  ? ? ? 比值先,需寻求了松壹下,什么是Gratuitous ARP。拥有志趣的却以佰度壹下,此雕刻边我就尽结壹下。当设备接入网绕时,需寻求先发壹个信息讯讯问壹下其它设备,“我发的此雕刻个IP,谁拥有?”。假设网绕中存放在此雕刻个IP,则会回骈;

  正是使用Gratuitous

  ARP此雕刻个东方正西,对其回骈终止判佩,假设接纳到的照顾容许回骈,存放在IP与设备本身相反,则标注识表记标注帜为。MAC顶牾同理。

  ?

  ? ? 在LWIP中,对以下中终止改革,则却完成MAC和的检测。下面贴出产首要片断代码。

  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是机儿子壹接入网绕后初始募化时收回的,因此却以不用担心能否在判佩变量时还没拥有检测到顶牾。