Red de conocimiento del abogados - Ley de patentes - Cómo resolver el conflicto de dirección IP de lwip

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>

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.