Fehler in ESP-IDF: MDNS, Wireshark und was haben Einhörner damit zu tun?

Hallo. Ich mache kommerzielle Entwicklung im IoT, wir verwenden hauptsächlich Module von Espressif - ESP8266 und ESP32.

Als Teil des Hundefutters nehmen wir unsere Produkte manchmal mit nach Hause und verwenden sie in unserem täglichen Leben. Und dann, eines Tages, erhielt einer der Mitarbeiter eine Beschwerde: Nach der Installation einer neuen Test-Firmware auf dem Gerät begann sein Heimnetzwerk zunächst stark zu stören und einzufrieren, und dann normalisierte sich die Situation wieder, aber unser Gerät war weder im lokalen Netzwerk noch in der Cloud mehr sichtbar ...

Es gibt eine Art Zusammenbruch. Aber welcher? In anderen Netzwerken haben wir ein solches Verhalten nicht beobachtet, daher wurde beschlossen, einen Aufklärer in der Person von mir zu landen, der mit allem Notwendigen für den Offizier ausgestattet war.

Nachrichtendienst

Zunächst habe ich mich entschlossen, die maximale Datenmenge über die Situation in der Endphase zu sammeln. Ohne das Gerät neu zu starten, habe ich Wireshark im Überwachungsmodus gestartet und die Filterung nach der MAC-Adresse des Geräts eingestellt. Es stellte sich heraus, dass das Gerät sicher ist, dass sein Netzwerk in Ordnung ist - es hat hartnäckig einige Daten an den Router gesendet, aber der Router hat nicht darauf geantwortet. Hmm, misstrauisch.

Im Admin-Bereich des Routers wurde das Gerät ebenfalls als verbunden angesehen. Aber warum gibt es kein Feedback? Ich erhielt eine Antwort auf diese Frage, als ich mich entschied, ein anderes Gerät an denselben Router anzuschließen (genauer gesagt eines meiner Devkits ) und die Filterung in Wireshark entfernte. Es stellt sich heraus, dass sich die MAC-Adresse des Routers geändert hat! Hmm, misstrauisch . Es änderte sich genau ein letztes Bit, während der Rest der Technik diese Ersetzung realisierte, unser Gerät jedoch nicht und sendete beharrlich Daten an die alte Mohnadresse, die natürlich niemand hörte.

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