diff options
Diffstat (limited to 'net/bluetooth/hci_request.c')
-rw-r--r-- | net/bluetooth/hci_request.c | 28 |
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 | ||
974 | static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) | 974 | static 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 | ||
1000 | static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) | ||
1001 | { | ||
1002 | return append_local_name(hdev, ptr, 0); | ||
1003 | } | ||
1004 | |||
1000 | static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance, | 1005 | static 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 | ||
1018 | void __hci_req_update_scan_rsp_data(struct hci_request *req, u8 instance) | 1030 | void __hci_req_update_scan_rsp_data(struct hci_request *req, u8 instance) |