Bug no ESP-IDF: MDNS, Wireshark e o que os unicórnios têm a ver com isso

Olá. Estou fazendo desenvolvimento comercial de IoT, usamos principalmente módulos do Espressif - ESP8266 e ESP32.

Como parte da " comida de cachorro ", às vezes levamos nossos produtos para casa e os usamos na vida cotidiana. E então, um dia, um dos funcionários recebeu uma reclamação: depois de instalar um novo firmware de teste no dispositivo, sua rede doméstica começou a apresentar falhas graves e congelar, e então a situação voltou ao normal, mas nosso dispositivo não estava mais visível na rede local ou na nuvem ...

Existe algum tipo de colapso. Mas qual deles? Em outras redes, não observamos tal comportamento, por isso foi decidido desembarcar um soldado de reconhecimento na minha pessoa, equipado com todo o necessário, para o oficial.

Serviço de inteligência

Para começar, decidi coletar o máximo de dados sobre a situação em seu estágio terminal. Sem reiniciar o dispositivo, iniciei o Wireshark no Modo Monitor, definindo a filtragem no endereço MAC do dispositivo. Descobriu-se que o dispositivo tem certeza de que sua rede está em ordem - ele teimosamente enviou alguns dados ao roteador, mas o roteador não respondeu a ele. Hmm, suspeito.

No painel de administração do roteador, o dispositivo também foi visto como conectado. Mas por que não há feedback? Obtive uma resposta a essa pergunta quando decidi conectar outro dispositivo ao mesmo roteador (mais precisamente, um dos meus devkits ) e removi a filtragem no Wireshark. Acontece que o endereço MAC do roteador mudou! Hmm, suspeito . Ele mudou exatamente um último bit, enquanto o resto da técnica percebeu essa substituição, mas nosso dispositivo não, e persistentemente enviou dados para o antigo endereço poppy, que, claro, ninguém estava ouvindo.

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