正是因為輕量、簡單,所以平時很多理所當然的東西,大家都會覺得在這上面也能實現,實則不然,用過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是機子壹接入網絡後初始化時發出的,所以可以不用擔心是否在判斷變量時還沒檢測到沖突。