512просмотров
47.9%от подписчиков
14 марта 2026 г.
Score: 563
Ещё пример. Функция bt_set_local_name просто перекладывает строку в буфер размером 248 байт и передаёт её в hci_send_cmd.
int bt_set_local_name(const char name)
{ uint8_t params[248] = {0}; int len = 0; while (name[len] && len < 247) { params[len] = name[len]; len++; } return hci_send_cmd(HCI_OP_WRITE_LOCAL_NAME, params, 248);
}
Посмотрим, что происходит со строкой дальше:
static int hci_send_cmd(uint16_t opcode, void params, uint8_t plen)
{ uint8_t buf[256]; buf[0] = HCI_COMMAND_PKT; struct hci_command_hdr hdr = (struct hci_command_hdr )&buf[1]; hdr->opcode = opcode; hdr->plen = plen; if (plen > 0 && params) { for (int i = 0; i < plen; i++) { buf[4 + i] = ((uint8_t )params)[i]; } } / TODO: Send via USB bulk endpoint */ printk(KERN_DEBUG "BT: Send cmd opcode=0x%04x len=%d\n", opcode, plen); return 0;
}
Формируется новый буфер из специального заголовка и переданной строки. Дальше этот буфер пока не используется, но суть не в этом. Непонятно, зачем вообще был нужен промежуточный буфер в bt_set_local_name. Код можно сократить, попутно ускорив его, убрав одно копирование.