ESP-IDF错误:MDNS,Wireshark以及与之相关的独角兽

你好。我正在进行物联网的商业开发,我们主要使用Espressif的模块-ESP8266和ESP32。

作为“狗粮”的一部分,我们有时会将我们的产品带回家,并在日常生活中使用它们。然后,有一天,一名员工收到了投诉:在设备上安装了新的测试固件后,他的家庭网络首先开始严重故障和冻结,然后情况恢复正常,但是我们的设备在本地网络或云中不再可见...

有某种崩溃。但是哪一个呢?在其他网络上,我们没有观察到这种行为,因此决定将配备了一切必要装备的侦察士兵安置在我自己的手中,交给警官。

情报服务

首先,我决定在终端阶段收集有关该情况的最大数据。在不重新启动设备的情况下,我以“监视器模式”启动了Wireshark,并在设备的MAC地址上设置了过滤功能。事实证明,该设备可以确定其网络是否正常-它固执地向路由器发送了一些数据,但路由器没有对此进行回复。嗯,可疑。

在路由器的管理面板中,该设备也被视为已连接。但是为什么没有反馈?当我决定将另一台设备连接到同一路由器(更确切地说是我的devkit之一),并在Wireshark中删除了过滤时,我收到了这个问题的答案。原来,路由器的MAC地址已更改!嗯,可疑。它恰好改变了最后一位,而其余技术却实现了这种替代,但我们的设备却没有,并持续地将数据发送到旧的罂粟地址,当然,没人在听。

好的,是时候找到更多了。重新启动路由器。从理论上讲,这应该将其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