Error en ESP-IDF: MDNS, Wireshark y qué tienen que ver los unicornios con él

Hola. Estoy haciendo desarrollo comercial en IoT, utilizamos principalmente módulos de Espressif - ESP8266 y ESP32.

Como parte de la " comida para perros ", a veces nos llevamos nuestros productos a casa y los usamos en la vida diaria. Y luego, un día, uno de los empleados recibió una queja: después de instalar un nuevo firmware de prueba en el dispositivo, su red doméstica primero comenzó a fallar y congelarse severamente, y luego la situación volvió a la normalidad, pero nuestro dispositivo ya no era visible ni en la red local ni en la nube. ...

Hay una especie de colapso. ¿Pero cual? En otras redes, no observamos tal comportamiento, por lo que se decidió aterrizar un soldado de reconocimiento en la persona mía, equipado con todo lo necesario, al oficial.

Servicio de inteligencia

Para empezar, decidí recopilar la máxima cantidad de datos sobre la situación en su etapa terminal. Sin reiniciar el dispositivo, inicié Wireshark en modo Monitor, configurando el filtrado en la dirección MAC del dispositivo. Resultó que el dispositivo está seguro de que su red está en orden: envió obstinadamente algunos datos al enrutador, pero el enrutador no respondió. Hmm, sospechoso.

En el panel de administración del enrutador, el dispositivo también se vio como conectado. Pero, ¿por qué no hay comentarios? Recibí una respuesta a esta pregunta cuando decidí conectar otro dispositivo al mismo enrutador (más precisamente, uno de mis devkits ) y eliminé el filtrado en Wireshark. ¡Resulta que la dirección MAC del enrutador ha cambiado! Hmm, sospechoso . Cambió exactamente un último bit, mientras que el resto de la técnica se dio cuenta de esta sustitución, pero nuestro dispositivo no lo hizo y envió datos de manera persistente a la antigua dirección de amapola, que, por supuesto, nadie estaba escuchando.

, . . , MAC "" ? , MAC . " ", . , . , , Wireshark , .

- . , , . ... Wireshark . , - , , . , , , .

And the winner is... 99% MDNS. , , ( , " ", Amazon). ? - , "/" ( ) . , .

:

  1. multicast- MDNS, .

  2. collision-query- ANY "", , -, "".

  3. collision-query- multicast-, .

  4. advertise- PTR, SRV, TXT A/AAAA multicast- MDNS, , .

  5. advertise- multicast-, .

  6. 2-5 .

, - multicast . ? , , . .

diff. , , . , . ... , 0.9 0.10. ? ... , . , MDNS.

Debugger? printf!

? : mdns.c. _mdns_create_probe_packet. , ( ), #2917 mdns_parse_packet. . _mdns_check_txt_collision. : , advertise, TXT-, TXT. ! , . , .

size_t data_len = 1;
if (len == 1 && service->txt) {
  return -1;//we win
} else if (len > 1 && !service->txt) {
  return 1;//they win
} else if (len == 1 && !service->txt) {
  return 0;//same
}

data_len, TXT- service. - .

mdns_txt_linked_item_t * txt = service->txt;
while (txt) {
  data_len += 2 + strlen(service->txt->key) + strlen(service->txt->value);
  txt = txt->next;
}

if (len > data_len) {
  return 1;//they win
} else if (len < data_len) {
  return -1;//we win
}

, TXT , , .

uint8_t ours[len];
uint16_t index = 0;
char * tmp;

txt = service->txt;
while (txt) {
  tmp = (char *)malloc(2 + strlen(txt->key) + strlen(txt->value));
  if (tmp) {
    sprintf(tmp, "%s=%s", txt->key, txt->value);
    _mdns_append_string(ours, &index, tmp);
    free(tmp);
  } else {
    HOOK_MALLOC_FAILED;
    // continue
  }
  txt = txt->next;
}

int ret = memcmp(ours, data, len);
if (ret > 0) {
  return -1;//we win
} else if (ret < 0) {
  return 1;//they win
}
return 0;//same

TXT , ( ), .

? , . , printf.

"" , . ? "" ( 10 ) ""! .

mdns_txt_linked_item_t * txt = service->txt;
while (txt) {
  data_len += 2 + strlen(service->txt->key) + strlen(service->txt->value);
  txt = txt->next;
}

, linked-list. , key value... . service->txt? , ...

, - (, git blame, ), . ? : . TXT-, , , N. , , , - , . ? , MDNS... .

?

issue ESP-IDF , , .

: SDK? , ( - submodule). - , , ...? , , .

?

@Andrey2008 PVS-Studio. , PVS-Studio, . , , , ... - .

?

, data flow PVS-Studio linked-list. - ( ). , - , .




All Articles