Cómo resolver el conflicto de dirección IP de lwip
LWIP es una pila de protocolos TCP/IP liviana. La razón por la que se dice que es liviana es porque el autor ha condensado las funciones principales para hacer esta pila de protocolos relativamente simple, principalmente para ROM/RAM. en ambientes extremadamente escasos y preciosos.
Precisamente por su ligereza y sencillez, muchas personas que lo dan por sentado suelen pensar que se puede realizar en él, de hecho, no es así. Las personas que han utilizado LWIP lo sentirán. .
Si hay una situación en la que la IP/MAC que configura entra en conflicto con otros dispositivos en la red, entonces no se puede detectar, y mucho menos la causa, y el enlace siempre se desconectará sin ningún motivo.
Aquí proponemos una solución al problema del conflicto. Damos la bienvenida a la discusión y la corrección.
En primer lugar, es necesario comprender qué es ARP gratuito. Si está interesado, puede buscar en Baidu. Lo resumiré aquí. Cuando un dispositivo se conecta a la red, primero debe enviar un mensaje para preguntar a otros dispositivos: "¿Quién tiene esta IP que envié?". Si esta IP existe en la red, responderá;
ARP gratuito se utiliza para juzgar la respuesta. Si la respuesta recibida o la respuesta tiene la misma IP que el dispositivo, se marcará como conflicto de IP. . Lo mismo se aplica a los conflictos MAC.
En LWIP, se pueden realizar las siguientes mejoras para detectar conflictos de MAC e IP. La parte principal del código se publica a continuación.
etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p){
...
caso PP_HTONS(ARP_REQUEST): p>
p>
if(ip_addr_cmp(amp;sipaddr, amp;(netif-gt;ip_addr))){
etharpError |= DUPLICATE_IP;
}
if((hdr-gt;shwaddr.addr[0] == netif-gt;hwaddr[0])amp;amp;
(hdr-gt;shwaddr.addr [1] == netif-gt; hwaddr[1])amp;
(hdr-gt; shwaddr.addr[2] == netif-gt; hwaddr[2])amp;
(hdr-gt;shwaddr.addr[3] == netif-gt;hwaddr[3])amp;
(hdr-gt;shwaddr.addr[4] == netif -gt;hwaddr[4])amp;amp;
(hdr-gt;shwaddr.addr[5] == netif-gt;hwaddr[5])){
etharpError |= DUPLICATE_MAC;
}
...
caso PP_HTONS(ARP_REPLY):
if(ip_addr_cmp( amp;sipaddr , amp;(netif-gt;ip_addr))){
etharpError |= DUPLICATE_IP;
}
if((hdr-gt; shwaddr.addr [0] == netif-gt;hwaddr[0])amp;amp;
(hdr-gt;shwaddr.addr[1] == netif-gt;hwaddr[1]) amp;amp ;
(hdr-gt;shwaddr.addr[2] == netif-gt;hwaddr[2])amp;amp;
(hdr-gt;shwaddr .addr[ 3] == netif-gt;hwaddr[3])amp;amp;
(hdr-gt;shwaddr.addr[4] == netif-gt;hwaddr[4])amp ;amp;
(hdr-gt;shwaddr.addr[5] == netif-gt;hwaddr[5])){
etharpError |= DUPLICATE_MAC;
}
...
En otros lugares donde se usa, solo necesita juzgar la variable etharpError para saber si hay un conflicto. Debido a que el ARP gratuito se emite cuando la máquina se inicializa después de conectarse a la red, no tiene que preocuparse por si no se ha detectado un conflicto al juzgar las variables.