ESP-IDFのバグ:MDNS、Wireshark、およびユニコーンとの関係

こんにちは。私はIoTで商用開発を行っており、主にEspressifのモジュール(ESP8266およびESP32)を使用しています。

ドッグフードの一環として、製品を家に持ち帰り、日常生活で使用することがあります。そして、ある日、従業員の1人が苦情を受け取りました。デバイスに新しいテストファームウェアをインストールした後、彼のホームネットワークは最初にひどくグリッチしてフリーズし始め、その後状況は通常に戻りましたが、デバイスはローカルネットワークにもクラウドにも表示されなくなりました。 ..。

ある種の崩壊があります。しかし、どれですか?他のネットワークでは、そのような行動は見られなかったので、必要なものをすべて備えた偵察隊員を警官に上陸させることにしました。

インテリジェンスサービス

そもそも、終末期の状況を最大限に把握することにしました。デバイスを再起動せずに、Wiresharkをモニターモードで起動し、デバイスのMACアドレスにフィルタリングを設定しました。デバイスはネットワークが正常であることを確認しました。頑固にデータをルーターに送信しましたが、ルーターはそれに応答しませんでした。うーん、疑わしい。

ルーターの管理パネルでは、デバイスも接続されているように見えました。しかし、なぜフィードバックがないのですか?別のデバイスを同じルーター(より正確には、私の開発キットの1つ)に接続し、Wiresharkのフィル​​タリングを削除することにしたときに、この質問に対する回答を受け取りました。ルーターのMACアドレスが変更されたことが判明しました。うーん、疑わしい。残りのテクニックがこの置換を実現している間、それはちょうど最後の1ビットを変更しましたが、私たちのデバイスはそれを実現せず、もちろん誰も聞いていなかった古いポピーアドレスにデータを永続的に送信しました。

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