古詩詞大全網 - 古詩大全 - lwip ip地址沖突怎麽解決

lwip ip地址沖突怎麽解決

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是機子壹接入網絡後初始化時發出的,所以可以不用擔心是否在判斷變量時還沒檢測到沖突。