Bonjour. Je fais du développement commercial en IoT, nous utilisons principalement des modules d'Espressif - ESP8266 et ESP32.
Dans le cadre de la nourriture pour chiens , nous emportons parfois nos produits à la maison et les utilisons dans notre vie quotidienne. Et puis, un jour, l'un des employés a reçu une plainte: après avoir installé un nouveau micrologiciel de test sur l'appareil, son réseau domestique a commencé à gravement piquer et se figer, puis la situation est revenue à la normale, mais notre appareil n'était plus visible ni sur le réseau local ni dans le cloud. ...
Il y a une sorte d'effondrement. Mais lequel? Sur d'autres réseaux, nous n'avons pas observé un tel comportement, il a donc été décidé de débarquer un soldat de reconnaissance en ma personne, équipé de tout le nécessaire, à l'officier.
Service de renseignements
Pour commencer, j'ai décidé de collecter le maximum de données sur la situation dans sa phase terminale. Sans redémarrer l'appareil, j'ai lancé Wireshark en mode moniteur, en définissant le filtrage sur l'adresse MAC de l'appareil. Il s'est avéré que l'appareil était sûr que son réseau était en ordre - il envoyait constamment des données au routeur, mais le routeur ne lui a rien répondu. Hmm, méfiant.
Dans le panneau d'administration du routeur, l'appareil était également considéré comme connecté. Mais pourquoi n'y a-t-il pas de rétroaction? J'ai reçu une réponse à cette question lorsque j'ai décidé de connecter un autre appareil au même routeur (plus précisément, l'un de mes devkits ), et supprimé le filtrage dans Wireshark. Il s'avère que l'adresse MAC du routeur a changé! Hmm, méfiant . Cela a changé exactement un dernier bit, tandis que le reste de la technique réalisait cette substitution, mais notre appareil ne l'a pas fait, et a constamment envoyé des données à l'ancienne adresse de pavot, ce que, bien sûr, personne n'écoutait.
, . . , 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. - ( ). , - , .