La Red de Conocimientos Pedagógicos - Currículum vitae - Cómo resolver el conflicto de direcciones IP de lwip

Cómo resolver el conflicto de direcciones 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 en una pila de protocolos relativamente simple, que se utiliza principalmente para ROM/RAM. entornos extremadamente escasos y preciosos.

Precisamente porque es liviano y simple, muchas personas que lo dan por sentado generalmente piensan que se puede realizar en él. De hecho, este no es el caso.

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>

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;

(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.