BlueZ issues
환경
- Gateway
- Board: TinkerBoard2/2S. Arm64
- OS: Debian 10. Custom OS
- Kernel: 4.19
- BlueZ: 5.65
- ell: 0.52
- Node
- Board: Nordic nrf52840 DK
- SDK: Nrf Connect 2.6.0
너무 빠른 Segmented Message 전송으로 인한 패킷 누락
BlueZ 구현 스펙 문제
결론부터 이야기하면, Gateway에서 세그먼트된 패킷을 너무 빨리 전송하여 Node가 수신하는 패킷이
누락되면서 일부 세그먼트 패킷만을 수신하면서 전체 메시지를 수신하지 못하는 문제가 발생하였다.
Gateway의 DFU 개발 완료 후 테스트 하는 중 네트워크에 큰 부하가 없는데도 불구하고 Node에서 너무나도
낮은 수신 ratio로 DFU가 프로세스가 종종 중단되는 것이 문제였다.
확인해보니 Node쪽 로그에서 segmented packet들이 홀수 혹은 짝수 번호만 수신하는 것을 발견할 수 있었다.
Gateway에서 BlueZ module의 Segmentation 구현이 스펙 내용과 다르게 구현된 문제가 있었다. Mesh Protocol에서 SAR(Segmentation and Reassembly) 모델이 구현이 되어있지 않고, Segmentation 패킷 전송 자체의 로직이 스펙과 달랐다.
이 문제를 수정하기 위해 해당 스펙을 구현하여 Patch를 메일링 리스트에 올렸으나 코드리뷰 과정에서 메인테이너와 연락이 끊겼다. 커뮤니티에서 아예 보이지 않는 것을 보니 현실에 문제가 생긴듯..
[00:01:48.492,095] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 2 SegN 9
[00:01:48.591,644] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 4 SegN 9
[00:01:48.694,580] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 6 SegN 9
[00:01:48.793,945] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 8 SegN 9
[00:01:48.905,639] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 0 SegN 9
[00:01:48.998,931] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 2 SegN 9
[00:01:49.099,639] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 4 SegN 9
[00:01:49.193,939] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 6 SegN 9
[00:01:49.323,944] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 8 SegN 9
[00:01:49.396,423] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 0 SegN 9
[00:01:49.504,547] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 2 SegN 9
[00:01:49.605,194] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 4 SegN 9
[00:01:49.710,266] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 6 SegN 9
[00:01:49.804,565] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 8 SegN 9
[00:01:50.555,175] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 5 SegN 9
[00:01:50.672,149] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 9 SegN 9
[00:01:50.773,925] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 1 SegN 9
[00:01:51.079,528] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 5 SegN 9
[00:01:51.177,642] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 7 SegN 9
[00:01:51.280,151] <inf> bt_mesh_transport: SeqZero 0x13ff SegO 9 SegN 9
짝수 번호만 받다가도 여러번 전송하면 홀수를 받으면서 결국 받아지곤 했다. 그래서 BlueZ 내부 코드를
확인해봤으나, 정상적으로 순차적으로 패킷을 전송하고 있었다. 그래서 bluetooth-mesh
서비스를 debug
log 옵션을 켜서 다시 수행하니 Node에서 정상적으로 패킷을 순차적으로 수신하고 있었다(물론 그럼에도
불구하고 종종 못 받는 패킷 존재). Log를 출력하면서 느려진 Gateway의 송신 퍼포먼스로 인해 Node에서
충분히 패킷을 수신하는 것으로 보여짐.
디버깅 결과, 결국 이 패킷 간의 간격은 Gateway의 network transmission interval
상태값이었다.
Relay 과정에서 Segmentation Fault 에러
결론부터 이야기하면, Gateway가 패킷을 Relay하는 과정에서 Network Key를 암호화하는 과정에서
encryption 자료구조를 메모리 공간을 할당받을 때 malloc()
에서 Memory Segmentation Fault에러 발생으로
bluetooth-mesh
서비스가 종료되면서 해당 서비스에 종속된 개발한 Gateway Application 서비스가
종료되는 문제가 발생하였다. 그리하여 Gateway Application에서 Relay 기능을 끄는 것으로 문제를
해결하였다.
해당 문제는 BlueZ library에서 발생하는 문제라서 디버깅까지만 진행하고, 버그 수정을 진행할지 말지 고민한 결과 Gateway의 Mesh packet relay 기능이 굳이 필요하지 않은 것으로 판단하여 수정을 진행하는 대신 Relay 기능을 끄는 것으로 문제를 해결하였다.
댓글남기기