مرحبا. أقوم بالتطوير التجاري في إنترنت الأشياء ، ونستخدم بشكل أساسي وحدات من Espressif - ESP8266 و ESP32.
كجزء من طعام الكلاب ، نأخذ أحيانًا منتجاتنا إلى المنزل ونستخدمها في حياتنا اليومية. وبعد ذلك ، في أحد الأيام ، تلقى أحد الموظفين شكوى: بعد تثبيت برنامج اختبار ثابت جديد على الجهاز ، بدأت شبكته المنزلية في التعطل والتجميد بشدة ، ثم عاد الوضع إلى طبيعته ، لكن جهازنا لم يعد مرئيًا سواء على الشبكة المحلية أو في السحابة ...
هناك نوع من الانهيار. لكن اي واحدة؟ في الشبكات الأخرى ، لم نلاحظ مثل هذا السلوك ، لذلك تقرر أن تهبط شخصيًا مجموعة هبوط استطلاعية ، مزودة بكل ما هو ضروري ، للضابط.
خدمة ذكية
بادئ ذي بدء ، قررت جمع أكبر قدر ممكن من البيانات حول الموقف في مرحلته النهائية. بدون إعادة تشغيل الجهاز ، بدأت Wireshark في وضع المراقبة ، واضبط التصفية على عنوان MAC الخاص بالجهاز. اتضح أن الجهاز متأكد من أن شبكته سليمة - لقد أرسل بعناد بعض البيانات إلى جهاز التوجيه ، لكن جهاز التوجيه لم يرد عليها. حسنًا ، مريب.
في لوحة إدارة جهاز التوجيه ، كان يُنظر أيضًا إلى الجهاز على أنه متصل. لكن لماذا لا توجد ردود فعل؟ حصلت على إجابة على هذا السؤال عندما قررت توصيل جهاز آخر بنفس جهاز التوجيه (بتعبير أدق ، أحد أجهزتي ) ، وأزلت التصفية في Wireshark. اتضح أن عنوان 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;//sameTXT , ( ), .
? , . , 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. - ( ). , - , .