Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp56725pxy; Wed, 21 Apr 2021 18:22:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz2DiJlpjQMsX+wqMnLpto8pXdOShFNACswZWPGve/wem4TCqOrfTEJLz6muGv5Qe3U40j1 X-Received: by 2002:a62:5ec7:0:b029:227:3253:3f62 with SMTP id s190-20020a625ec70000b029022732533f62mr924865pfb.54.1619054577606; Wed, 21 Apr 2021 18:22:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619054577; cv=none; d=google.com; s=arc-20160816; b=SxGUePNWKwyUvXo10ettCVWDhOLizg8AHgaxD3Ete4Syq+LvYZ0fHOFFzwe1huWHFt WsHvy7zIGKrpR5unBbk4msUZJSy1n4R3mQrEXb3ZnL/aq52rWJEFmwKgw2x8nWCr8JVt UOIcxy52kX3gK0jLVHnsSF7Z6sfkFELWpJL/14jO98TtcvAPbqFFFdywGcKUU7xw7ml0 cnZVrO07DkQOF6CgEQXBtHVyKFzLl73xptl7Oavx0LylZjX9EBrUNJs2eVaoero8C+/h V/uQHLoV6ggYpao1tOLV1XV5TaHdYna270xou3YQPsazlbfGcRoNH35aRg59yf5TUP/o 00fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:to:from:dkim-signature; bh=oW2GkaOj0HcDnC01fUYCZBZ3nWShC/mHEShqSkGQpxU=; b=hRcxBo7/6elg0uGjF4RnctecTC5JdThY2FR7IVZhd6WLpK7qKaqVwkIjdCt/s93Oir UzZv8CS7+n/b72AQhIQOPQn4pz4tsBRx8n+WI1HBe0aENUAQttzHLuXdMLZ0qcQd9yrL eQgxr8Et1s93zQ6OzqKiMYGHftGMmKhNC97/AiHkEUmt7sLCRjeGEM0qqhvJlasExcd8 pbL3sXaSnxL6kg4legherv88cNpx15T9tgzMmFEwEh6Rpj5AvoS1ilOdg1NZ/6ef16LO E+V99WIYitZQgwxniWp0/JEyOyEsP8e2RKMuySSARbJAKbiUaMcGyUjOMxYnZy+0xkJT hnbg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=XgfkVcq1; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h13si1253837pfv.99.2021.04.21.18.22.32; Wed, 21 Apr 2021 18:22:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=XgfkVcq1; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238434AbhDUTgL (ORCPT + 99 others); Wed, 21 Apr 2021 15:36:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235159AbhDUTgL (ORCPT ); Wed, 21 Apr 2021 15:36:11 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8CD08C06174A for ; Wed, 21 Apr 2021 12:35:37 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id e2so17926512plh.8 for ; Wed, 21 Apr 2021 12:35:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=oW2GkaOj0HcDnC01fUYCZBZ3nWShC/mHEShqSkGQpxU=; b=XgfkVcq1xZLnVguZfXniT3g9cKJZHkiFYqG77DOXVzAE0CHOQsu8/zNDeWondPbPGn 6RwvtA3IYI7HDc+OG/1uR6FlwdczoJd9AJio3gl9kAYHg+LV0sOljLbF/5X9TOPPuQ0A lWc0sCOksVSSRj6f+SXT8dZ1phhYVnk09QNpEGN7O6QAXqXd/3jpJskmyPInqrfmINX6 3dSFoeNUFE0tL7BuCqp8JVXQVfYuuQPgac+qfT/a5LHfF+8CBTaBLutbZJ7pVJh7UQmZ Ruhzp+ps5dqCqSrDFr9zd0lL6BufwQp1/SGLZBm4hzn5RBnQ+YF9hTSRa0XkVniRwtN0 GGaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=oW2GkaOj0HcDnC01fUYCZBZ3nWShC/mHEShqSkGQpxU=; b=omoXxX7v46Ecs51wbpwst5FJZXzYgHq7Zz8jSmeEJj1HOVNNL9SgPAa7Uj+jnmj6k2 LRFIKOjV0ox+2rouVWciUlmYppzJuGQMsVmaJ2/CAJOK9xBUle0z3EucGINApfkzEaKG LpCNRQjSrccPKT8RNkUU5YhU+VYdABr5V/pZOmZqltDfF1B/DB5W9bnbb6Att54WPfDq O221PMYW7eO9V4w6QGYzU7RfmiO53laXgCUAQadPyN97nILUiOM9fqLtoGlPUTvgqfzF p4Rs7DD38IGM6OCgOBtL43j5PuVPDATtVfNE/eLHa1pbw/Jhf6WtgW3/0QqT0kFII3C8 z3+w== X-Gm-Message-State: AOAM530p14OUgXd3CQh2aMuSGh1rMOvpCdDKNSmlBSW2XR55S/XBDJu/ SKcnGbRTKJyDIh/A0yzxrtycqPvuvrk= X-Received: by 2002:a17:902:d911:b029:ea:cc53:5501 with SMTP id c17-20020a170902d911b02900eacc535501mr35001398plz.21.1619033736862; Wed, 21 Apr 2021 12:35:36 -0700 (PDT) Received: from han1-XPS-13-9350.hsd1.or.comcast.net ([2601:1c0:6a01:d830:d74a:a8bf:6ad:5ef0]) by smtp.gmail.com with ESMTPSA id b21sm105234pfl.82.2021.04.21.12.35.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Apr 2021 12:35:36 -0700 (PDT) From: Tedd Ho-Jeong An To: linux-bluetooth@vger.kernel.org Subject: [BlueZ v5] monitor: Fix the incorrect vendor name Date: Wed, 21 Apr 2021 12:35:35 -0700 Message-Id: <20210421193535.4616-1-hj.tedd.an@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Tedd Ho-Jeong An This patch fixes the vendor name is alwasy shown as "Microsoft". < HCI Command: Microsoft Secure Send (0x3f|0x0009) plen 249 Type: Data fragment (0x01) > HCI Event: Command Complete (0x0e) plen 4 Microsoft Secure Send (0x3f|0x0009) ncmd 31 Status: Success (0x00) --- monitor/packet.c | 121 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 103 insertions(+), 18 deletions(-) diff --git a/monitor/packet.c b/monitor/packet.c index d729a01cc..42e1fef70 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -266,6 +266,8 @@ struct index_data { uint8_t bdaddr[6]; uint16_t manufacturer; uint16_t msft_opcode; + uint8_t msft_evt_prefix_len; + uint8_t msft_evt_prefix[32]; size_t frame; }; @@ -3940,6 +3942,8 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, memcpy(index_list[index].bdaddr, ni->bdaddr, 6); index_list[index].manufacturer = fallback_manufacturer; index_list[index].msft_opcode = BT_HCI_CMD_NOP; + index_list[index].msft_evt_prefix_len = 0; + memset(index_list[index].msft_evt_prefix, 0, 32); } addr2str(ni->bdaddr, str); @@ -4006,9 +4010,12 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, /* * Intel controllers that support the * Microsoft vendor extension are using - * 0xFC1E for VsMsftOpCode. + * 0xFC1E for VsMsftOpCode and 0x50 for event + * code. */ index_list[index].msft_opcode = 0xFC1E; + index_list[index].msft_evt_prefix_len = 1; + index_list[index].msft_evt_prefix[0] = 0x50; break; case 93: /* @@ -4017,6 +4024,15 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, * 0xFCF0 for VsMsftOpCode. */ index_list[index].msft_opcode = 0xFCF0; + index_list[index].msft_evt_prefix_len = 8; + index_list[index].msft_evt_prefix[0] = 0x23; + index_list[index].msft_evt_prefix[1] = 0x79; + index_list[index].msft_evt_prefix[2] = 0x54; + index_list[index].msft_evt_prefix[3] = 0x33; + index_list[index].msft_evt_prefix[4] = 0x77; + index_list[index].msft_evt_prefix[5] = 0x88; + index_list[index].msft_evt_prefix[6] = 0x97; + index_list[index].msft_evt_prefix[7] = 0x68; break; } } @@ -9323,7 +9339,7 @@ static const char *get_supported_command(int bit) return NULL; } -static const char *current_vendor_str(void) +static const char *current_vendor_str(uint16_t ocf) { uint16_t manufacturer, msft_opcode; @@ -9335,7 +9351,8 @@ static const char *current_vendor_str(void) msft_opcode = BT_HCI_CMD_NOP; } - if (msft_opcode != BT_HCI_CMD_NOP) + if (msft_opcode != BT_HCI_CMD_NOP && + cmd_opcode_ocf(msft_opcode) == ocf) return "Microsoft"; switch (manufacturer) { @@ -9350,6 +9367,27 @@ static const char *current_vendor_str(void) return NULL; } +static const char *current_vendor_evt_str(uint8_t evt) +{ + uint16_t manufacturer; + + if (index_current < MAX_INDEX) + manufacturer = index_list[index_current].manufacturer; + else + manufacturer = fallback_manufacturer; + + switch (manufacturer) { + case 2: + return "Intel"; + case 15: + return "Broadcom"; + case 93: + return "Realtek"; + } + + return NULL; +} + static const struct vendor_ocf *current_vendor_ocf(uint16_t ocf) { uint16_t manufacturer, msft_opcode; @@ -9378,18 +9416,12 @@ static const struct vendor_ocf *current_vendor_ocf(uint16_t ocf) static const struct vendor_evt *current_vendor_evt(uint8_t evt) { - uint16_t manufacturer, msft_opcode; + uint16_t manufacturer; - if (index_current < MAX_INDEX) { + if (index_current < MAX_INDEX) manufacturer = index_list[index_current].manufacturer; - msft_opcode = index_list[index_current].msft_opcode; - } else { + else manufacturer = fallback_manufacturer; - msft_opcode = BT_HCI_CMD_NOP; - } - - if (msft_opcode != BT_HCI_CMD_NOP) - return NULL; switch (manufacturer) { case 2: @@ -9401,6 +9433,26 @@ static const struct vendor_evt *current_vendor_evt(uint8_t evt) return NULL; } +static const struct vendor_evt *current_vendor_msft_evt(const void *data, + uint8_t size) +{ + uint8_t *prefix, prefix_len; + + if (index_current < MAX_INDEX) { + prefix_len = index_list[index_current].msft_evt_prefix_len; + prefix = index_list[index_current].msft_evt_prefix; + } else + return NULL; + + /* MSFT extension events start with the MSFT event prefix which is + * defined by the vendor and followed by the MSFT event code. + */ + if (size > prefix_len && !memcmp(data, prefix, prefix_len)) + return msft_vendor_evt(); + + return NULL; +} + static void inquiry_complete_evt(const void *data, uint8_t size) { const struct bt_hci_evt_inquiry_complete *evt = data; @@ -9573,7 +9625,7 @@ static void cmd_complete_evt(const void *data, uint8_t size) const struct vendor_ocf *vnd = current_vendor_ocf(ocf); if (vnd) { - const char *str = current_vendor_str(); + const char *str = current_vendor_str(ocf); if (str) { snprintf(vendor_str, sizeof(vendor_str), @@ -9665,7 +9717,7 @@ static void cmd_status_evt(const void *data, uint8_t size) const struct vendor_ocf *vnd = current_vendor_ocf(ocf); if (vnd) { - const char *str = current_vendor_str(); + const char *str = current_vendor_str(ocf); if (str) { snprintf(vendor_str, sizeof(vendor_str), @@ -11012,13 +11064,46 @@ static void le_meta_event_evt(const void *data, uint8_t size) static void vendor_evt(const void *data, uint8_t size) { - uint8_t subevent = *((const uint8_t *) data); + uint8_t subevent; struct subevent_data vendor_data; char vendor_str[150]; - const struct vendor_evt *vnd = current_vendor_evt(subevent); + const struct vendor_evt *vnd; + + /* For MSFT Extension event only */ + vnd = current_vendor_msft_evt(data, size); + if (vnd) { + snprintf(vendor_str, sizeof(vendor_str), + "Microsoft %s", vnd->str); + print_indent(6, COLOR_HCI_EVENT, "", vendor_str, COLOR_OFF, + " length: %u", size); + + if (!vnd->evt_func) { + packet_hexdump(data, size); + return; + } + + if (vnd->evt_fixed) { + if (size != vnd->evt_size) { + print_text(COLOR_ERROR, "invalid packet size"); + packet_hexdump(data, size); + return; + } + } else { + if (size < vnd->evt_size) { + print_text(COLOR_ERROR, "too short packet"); + packet_hexdump(data, size); + return; + } + } + + vnd->evt_func(data, size); + return; + } + subevent = *((const uint8_t *) data); + vnd = current_vendor_evt(subevent); if (vnd) { - const char *str = current_vendor_str(); + const char *str = current_vendor_evt_str(subevent); if (str) { snprintf(vendor_str, sizeof(vendor_str), @@ -11419,7 +11504,7 @@ void packet_hci_command(struct timeval *tv, struct ucred *cred, uint16_t index, const struct vendor_ocf *vnd = current_vendor_ocf(ocf); if (vnd) { - const char *str = current_vendor_str(); + const char *str = current_vendor_str(ocf); if (str) { snprintf(vendor_str, sizeof(vendor_str), -- 2.25.1