Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: Refactor append name and appearance

Use eir_append_data to remove code duplication.

Signed-off-by: Michał Narajowski <michal.narajowski@codecoup.pl>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Michał Narajowski and committed by
Marcel Holtmann
1b422066 7ddb30c7

+38 -50
+15 -29
net/bluetooth/hci_request.c
··· 21 21 SOFTWARE IS DISCLAIMED. 22 22 */ 23 23 24 - #include <asm/unaligned.h> 25 - 26 24 #include <net/bluetooth/bluetooth.h> 27 25 #include <net/bluetooth/hci_core.h> 28 26 #include <net/bluetooth/mgmt.h> ··· 990 992 /* complete name fits and is eq to max short name len or smaller */ 991 993 if (complete_len <= max_len && 992 994 complete_len <= HCI_MAX_SHORT_NAME_LENGTH) { 993 - ptr[0] = complete_len + 1; 994 - ptr[1] = EIR_NAME_COMPLETE; 995 - memcpy(ptr + 2, hdev->dev_name, complete_len); 996 - 997 - return ad_len + complete_len + 2; 995 + return eir_append_data(ptr, ad_len, EIR_NAME_COMPLETE, 996 + hdev->dev_name, complete_len); 998 997 } 999 998 1000 999 /* short name set and fits */ 1001 1000 if (short_len && short_len <= max_len) { 1002 - ptr[0] = short_len + 1; 1003 - ptr[1] = EIR_NAME_SHORT; 1004 - memcpy(ptr + 2, hdev->short_name, short_len); 1005 - 1006 - return ad_len + short_len + 2; 1001 + return eir_append_data(ptr, ad_len, EIR_NAME_SHORT, 1002 + hdev->short_name, short_len); 1007 1003 } 1008 1004 1009 1005 /* no short name set so shorten complete name */ 1010 1006 if (!short_len) { 1011 - ptr[0] = max_len + 1; 1012 - ptr[1] = EIR_NAME_SHORT; 1013 - memcpy(ptr + 2, hdev->dev_name, max_len); 1014 - 1015 - return ad_len + max_len + 2; 1007 + return eir_append_data(ptr, ad_len, EIR_NAME_SHORT, 1008 + hdev->dev_name, max_len); 1016 1009 } 1017 1010 1018 1011 return ad_len; 1012 + } 1013 + 1014 + static u8 append_appearance(struct hci_dev *hdev, u8 *ptr, u8 ad_len) 1015 + { 1016 + return eir_append_le16(ptr, ad_len, EIR_APPEARANCE, hdev->appearance); 1019 1017 } 1020 1018 1021 1019 static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) ··· 1019 1025 u8 scan_rsp_len = 0; 1020 1026 1021 1027 if (hdev->appearance) { 1022 - ptr[0] = 3; 1023 - ptr[1] = EIR_APPEARANCE; 1024 - put_unaligned_le16(hdev->appearance, ptr + 2); 1025 - scan_rsp_len += 4; 1028 + scan_rsp_len = append_appearance(hdev, ptr, scan_rsp_len); 1026 1029 } 1027 1030 1028 - return append_local_name(hdev, ptr + scan_rsp_len, scan_rsp_len); 1031 + return append_local_name(hdev, ptr, scan_rsp_len); 1029 1032 } 1030 1033 1031 1034 static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance, ··· 1039 1048 instance_flags = adv_instance->flags; 1040 1049 1041 1050 if ((instance_flags & MGMT_ADV_FLAG_APPEARANCE) && hdev->appearance) { 1042 - ptr[0] = 3; 1043 - ptr[1] = EIR_APPEARANCE; 1044 - put_unaligned_le16(hdev->appearance, ptr + 2); 1045 - scan_rsp_len += 4; 1046 - ptr += 4; 1051 + scan_rsp_len = append_appearance(hdev, ptr, scan_rsp_len); 1047 1052 } 1048 1053 1049 - memcpy(ptr, adv_instance->scan_rsp_data, 1054 + memcpy(&ptr[scan_rsp_len], adv_instance->scan_rsp_data, 1050 1055 adv_instance->scan_rsp_len); 1051 1056 1052 1057 scan_rsp_len += adv_instance->scan_rsp_len; 1053 - ptr += adv_instance->scan_rsp_len; 1054 1058 1055 1059 if (instance_flags & MGMT_ADV_FLAG_LOCAL_NAME) 1056 1060 scan_rsp_len = append_local_name(hdev, ptr, scan_rsp_len);
+23
net/bluetooth/hci_request.h
··· 20 20 SOFTWARE IS DISCLAIMED. 21 21 */ 22 22 23 + #include <asm/unaligned.h> 24 + 23 25 #define hci_req_sync_lock(hdev) mutex_lock(&hdev->req_lock) 24 26 #define hci_req_sync_unlock(hdev) mutex_unlock(&hdev->req_lock) 25 27 ··· 105 103 106 104 void hci_request_setup(struct hci_dev *hdev); 107 105 void hci_request_cancel_all(struct hci_dev *hdev); 106 + 107 + static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, 108 + u8 *data, u8 data_len) 109 + { 110 + eir[eir_len++] = sizeof(type) + data_len; 111 + eir[eir_len++] = type; 112 + memcpy(&eir[eir_len], data, data_len); 113 + eir_len += data_len; 114 + 115 + return eir_len; 116 + } 117 + 118 + static inline u16 eir_append_le16(u8 *eir, u16 eir_len, u8 type, u16 data) 119 + { 120 + eir[eir_len++] = sizeof(type) + sizeof(data); 121 + eir[eir_len++] = type; 122 + put_unaligned_le16(data, &eir[eir_len]); 123 + eir_len += sizeof(data); 124 + 125 + return eir_len; 126 + }
-21
net/bluetooth/mgmt.c
··· 867 867 sizeof(rp)); 868 868 } 869 869 870 - static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data, 871 - u8 data_len) 872 - { 873 - eir[eir_len++] = sizeof(type) + data_len; 874 - eir[eir_len++] = type; 875 - memcpy(&eir[eir_len], data, data_len); 876 - eir_len += data_len; 877 - 878 - return eir_len; 879 - } 880 - 881 - static inline u16 eir_append_le16(u8 *eir, u16 eir_len, u8 type, u16 data) 882 - { 883 - eir[eir_len++] = sizeof(type) + sizeof(data); 884 - eir[eir_len++] = type; 885 - put_unaligned_le16(data, &eir[eir_len]); 886 - eir_len += sizeof(data); 887 - 888 - return eir_len; 889 - } 890 - 891 870 static u16 append_eir_data_to_buf(struct hci_dev *hdev, u8 *eir) 892 871 { 893 872 u16 eir_len = 0;