你好。我正在进行物联网的商业开发,我们主要使用Espressif的模块-ESP8266和ESP32。
作为“狗粮”的一部分,我们有时会将我们的产品带回家,并在日常生活中使用它们。然后,有一天,一名员工收到了投诉:在设备上安装了新的测试固件后,他的家庭网络首先开始严重故障和冻结,然后情况恢复正常,但是我们的设备在本地网络或云中不再可见...
有某种崩溃。但是哪一个呢?在其他网络上,我们没有观察到这种行为,因此决定将配备了一切必要装备的侦察士兵安置在我自己的手中,交给警官。
情报服务
首先,我决定在终端阶段收集有关该情况的最大数据。在不重新启动设备的情况下,我以“监视器模式”启动了Wireshark,并在设备的MAC地址上设置了过滤功能。事实证明,该设备可以确定其网络是否正常-它固执地向路由器发送了一些数据,但路由器没有对此进行回复。嗯,可疑。
在路由器的管理面板中,该设备也被视为已连接。但是为什么没有反馈?当我决定将另一台设备连接到同一路由器(更确切地说是我的devkit之一),并在Wireshark中删除了过滤时,我收到了这个问题的答案。原来,路由器的MAC地址已更改!嗯,可疑。它恰好改变了最后一位,而其余技术却实现了这种替代,但我们的设备却没有,并持续地将数据发送到旧的罂粟地址,当然,没人在听。
好的,是时候找到更多了。重新启动路由器。从理论上讲,这应该将其MAC恢复为“正常”状态吗?确实,MAC又回来了。但是冻结的设备已经“处于昏迷状态”,顽固地拒绝做任何事情。我们不会从中学习任何新知识,因此我们也将其重新启动。同时,为了收集更多数据,我们将在Wireshark中从路由器写入密码,以便解密所有流量。
坍方
这里发生了一些奇怪的事情。首先,设备按预期方式返回网络。然后它开始了……Wireshark窗口中的消息数量开始以惊人的速度增长。然而,几分钟后一切都停止了-路由器再次决定展示其替代方案,本质上有所不同。好的,我们有一个转储,让我们看看它是什么。
And the winner is... 99% MDNS. , , ( , " ", Amazon). ? - , "/" ( ) . , .
:
multicast- MDNS, .
collision-query- ANY "", , -, "".
collision-query- multicast-, .
advertise- PTR, SRV, TXT A/AAAA multicast- MDNS, , .
advertise- multicast-, .
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. - ( ). , - , .