خطأ ESP-IDF: MDNS و Wireshark وما علاقة وحيد القرن به

مرحبا. أقوم بالتطوير التجاري في إنترنت الأشياء ، ونستخدم بشكل أساسي وحدات من Espressif - ESP8266 و ESP32.

كجزء من طعام الكلاب ، نأخذ أحيانًا منتجاتنا إلى المنزل ونستخدمها في حياتنا اليومية. وبعد ذلك ، في أحد الأيام ، تلقى أحد الموظفين شكوى: بعد تثبيت برنامج اختبار ثابت جديد على الجهاز ، بدأت شبكته المنزلية في التعطل والتجميد بشدة ، ثم عاد الوضع إلى طبيعته ، لكن جهازنا لم يعد مرئيًا سواء على الشبكة المحلية أو في السحابة ...

هناك نوع من الانهيار. لكن اي واحدة؟ في الشبكات الأخرى ، لم نلاحظ مثل هذا السلوك ، لذلك تقرر أن تهبط شخصيًا مجموعة هبوط استطلاعية ، مزودة بكل ما هو ضروري ، للضابط.

خدمة ذكية

بادئ ذي بدء ، قررت جمع أكبر قدر ممكن من البيانات حول الموقف في مرحلته النهائية. بدون إعادة تشغيل الجهاز ، بدأت Wireshark في وضع المراقبة ، واضبط التصفية على عنوان MAC الخاص بالجهاز. اتضح أن الجهاز متأكد من أن شبكته سليمة - لقد أرسل بعناد بعض البيانات إلى جهاز التوجيه ، لكن جهاز التوجيه لم يرد عليها. حسنًا ، مريب.

في لوحة إدارة جهاز التوجيه ، كان يُنظر أيضًا إلى الجهاز على أنه متصل. لكن لماذا لا توجد ردود فعل؟ حصلت على إجابة على هذا السؤال عندما قررت توصيل جهاز آخر بنفس جهاز التوجيه (بتعبير أدق ، أحد أجهزتي ) ، وأزلت التصفية في Wireshark. اتضح أن عنوان 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