aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_request.c
diff options
context:
space:
mode:
authorMichał Narajowski <michal.narajowski@codecoup.pl>2016-09-18 06:50:02 -0400
committerMarcel Holtmann <marcel@holtmann.org>2016-09-19 14:19:34 -0400
commit7c295c4801b2de24fc25687eb0cb73cf0c99d114 (patch)
tree16897e509d1fb647184b89d3f310290c860d4993 /net/bluetooth/hci_request.c
parent1110a2dbe69831abdcf119c3a9a4c4ef2d0905f8 (diff)
Bluetooth: Add support for local name in scan rsp
This patch enables appending local name to scan response data. If currently advertised instance has name flag set it is expired immediately. Signed-off-by: Michał Narajowski <michal.narajowski@codecoup.pl> Signed-off-by: Szymon Janc <szymon.janc@codecoup.pl> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/hci_request.c')
-rw-r--r--net/bluetooth/hci_request.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
index 9566ff8e3223..0ce6cdd278b2 100644
--- a/net/bluetooth/hci_request.c
+++ b/net/bluetooth/hci_request.c
@@ -971,14 +971,14 @@ void __hci_req_enable_advertising(struct hci_request *req)
971 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable); 971 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
972} 972}
973 973
974static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) 974static u8 append_local_name(struct hci_dev *hdev, u8 *ptr, u8 ad_len)
975{ 975{
976 u8 ad_len = 0;
977 size_t name_len; 976 size_t name_len;
977 int max_len;
978 978
979 max_len = HCI_MAX_AD_LENGTH - ad_len - 2;
979 name_len = strlen(hdev->dev_name); 980 name_len = strlen(hdev->dev_name);
980 if (name_len > 0) { 981 if (name_len > 0 && max_len > 0) {
981 size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2;
982 982
983 if (name_len > max_len) { 983 if (name_len > max_len) {
984 name_len = max_len; 984 name_len = max_len;
@@ -997,22 +997,34 @@ static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr)
997 return ad_len; 997 return ad_len;
998} 998}
999 999
1000static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr)
1001{
1002 return append_local_name(hdev, ptr, 0);
1003}
1004
1000static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance, 1005static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance,
1001 u8 *ptr) 1006 u8 *ptr)
1002{ 1007{
1003 struct adv_info *adv_instance; 1008 struct adv_info *adv_instance;
1009 u32 instance_flags;
1010 u8 scan_rsp_len = 0;
1004 1011
1005 adv_instance = hci_find_adv_instance(hdev, instance); 1012 adv_instance = hci_find_adv_instance(hdev, instance);
1006 if (!adv_instance) 1013 if (!adv_instance)
1007 return 0; 1014 return 0;
1008 1015
1009 /* TODO: Set the appropriate entries based on advertising instance flags 1016 instance_flags = adv_instance->flags;
1010 * here once flags other than 0 are supported. 1017
1011 */
1012 memcpy(ptr, adv_instance->scan_rsp_data, 1018 memcpy(ptr, adv_instance->scan_rsp_data,
1013 adv_instance->scan_rsp_len); 1019 adv_instance->scan_rsp_len);
1014 1020
1015 return adv_instance->scan_rsp_len; 1021 scan_rsp_len += adv_instance->scan_rsp_len;
1022 ptr += adv_instance->scan_rsp_len;
1023
1024 if (instance_flags & MGMT_ADV_FLAG_LOCAL_NAME)
1025 scan_rsp_len = append_local_name(hdev, ptr, scan_rsp_len);
1026
1027 return scan_rsp_len;
1016} 1028}
1017 1029
1018void __hci_req_update_scan_rsp_data(struct hci_request *req, u8 instance) 1030void __hci_req_update_scan_rsp_data(struct hci_request *req, u8 instance)