1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "pan_sdp.h"
17 #include "btstack.h"
18 #include "log.h"
19 #include "sdp.h"
20 namespace OHOS {
21 namespace bluetooth {
PanSdp()22 PanSdp::PanSdp()
23 {}
24
Register()25 int PanSdp::Register()
26 {
27 LOG_DEBUG("[PAN SDP]%{public}s():enter", __PRETTY_FUNCTION__);
28 int result = BT_SUCCESS;
29 sdpHandle_ = SDP_CreateServiceRecord();
30 result = RegisterServiceInfo();
31 if (result != BT_SUCCESS) {
32 LOG_ERROR("[PAN SDP] RegisterServiceInfo result = %{public}d", result);
33 return result;
34 }
35 result = AddPanDescriptionList();
36 if (result != BT_SUCCESS) {
37 LOG_ERROR("[PAN SDP] AddPanDescriptionList result = %{public}d", result);
38 return result;
39 }
40 result = AddPanSecurityDescriptionId();
41 if (result != BT_SUCCESS) {
42 LOG_ERROR("[PAN SDP] AddPanSecurityDescriptionId result = %{public}d", result);
43 return result;
44 }
45 result = RegisterNetInfo();
46 if (result != BT_SUCCESS) {
47 LOG_ERROR("[PAN SDP] RegisterNetInfo result = %{public}d", result);
48 return result;
49 }
50 result = AddBluetoothProfileDescriptorList();
51 if (result != BT_SUCCESS) {
52 LOG_ERROR("[PAN SDP] AddBluetoothProfileDescriptorList result = %{public}d", result);
53 return result;
54 }
55 result = AddLanguageBaseAttributeIdList();
56 if (result != BT_SUCCESS) {
57 LOG_ERROR("[PAN SDP] AddLanguageBaseAttributeIdList result = %{public}d", result);
58 return result;
59 }
60 result = AddBrowseGroupList();
61 if (result != BT_SUCCESS) {
62 LOG_ERROR("[PAN SDP] AddBrowseGroupList result = %{public}d", result);
63 return result;
64 }
65 result = RegisterServiceRecord();
66 if (result != BT_SUCCESS) {
67 LOG_ERROR("[PAN SDP] RegisterServiceRecord result = %{public}d", result);
68 return result;
69 }
70 return result;
71 }
72
Deregister()73 void PanSdp::Deregister()
74 {
75 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
76 int result = BT_SUCCESS;
77 result = SDP_DeregisterServiceRecord(sdpHandle_);
78 if (result != BT_SUCCESS) {
79 LOG_ERROR("[PAN SDP] SDP_DeregisterServiceRecord result = %{public}d", result);
80 return;
81 }
82 result = SDP_DestroyServiceRecord(sdpHandle_);
83 if (result != BT_SUCCESS) {
84 LOG_ERROR("[PAN SDP] SDP_DestroyServiceRecord result = %{public}d", result);
85 }
86 sdpHandle_ = 0;
87 }
88
AddServiceClassIdList()89 int PanSdp::AddServiceClassIdList()
90 {
91 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
92 BtUuid classId[1];
93 classId[0].type = BT_UUID_16;
94 classId[0].uuid16 = NAP_UUID16;
95 // ServiceClassID
96 int result = SDP_AddServiceClassIdList(sdpHandle_, classId, 1);
97 return result;
98 }
99
AddPanSecurityDescriptionId()100 int PanSdp::AddPanSecurityDescriptionId()
101 {
102 LOG_INFO("[PAN SDP] Call %{public}s", __PRETTY_FUNCTION__);
103 uint16_t security = 0;
104 security |= 0x0001;
105 int result = SDP_AddAttribute(sdpHandle_, PAN_SECURITY_DESCRIPTION_ID,
106 SDP_TYPE_UINT_16, &security, sizeof(security));
107 return result;
108 }
109
AddPanNetAccessRate()110 int PanSdp::AddPanNetAccessRate()
111 {
112 LOG_INFO("[PAN SDP] Call %{public}s", __PRETTY_FUNCTION__);
113 uint16_t PanNetAccessType = 0x0005;
114 int result = SDP_AddAttribute(sdpHandle_, PAN_NET_ACCESS_TYPE_ID, SDP_TYPE_UINT_16,
115 &PanNetAccessType, PAN_NET_ACCESS_TYPE_LENGTH);
116 return result;
117 }
118
AddPanNetAccessType()119 int PanSdp::AddPanNetAccessType()
120 {
121 LOG_INFO("[PAN SDP] Call %{public}s", __PRETTY_FUNCTION__);
122 uint32_t PanNetAccessRate = 0x0001312D0;
123 int result = SDP_AddAttribute(sdpHandle_, PAN_MAX_NET_ACCESS_RATE_ID, SDP_TYPE_UINT_32,
124 &PanNetAccessRate, PAN_NET_ACCESS_RATE_LENGTH);
125 return result;
126 }
127
AddPanDescriptionList()128 int PanSdp::AddPanDescriptionList()
129 {
130 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
131 static const uint8_t panProtocolDescriptorListData[] = {
132 0x35, 0x06, // l2cap sequence
133 0x19, 0x01, 0x00, // l2cap uuid(0x0100)
134 0x09, 0x00, 0x0F, // l2cap psm(0x000f)
135 0x35, 0x0E, // bnep seqence
136 0x19, 0x00, 0x0F, // bnep uuid(0x000f)
137 0x09, 0x01, 0x00, // bnep version(0x0100)
138 0x35, 0x06, // network information
139 0x09, 0x08, 0x00, // network packet type IPv4(0x0800)
140 0x09, 0x08, 0x06 // network packet type ARP(0x0806)
141 };
142 int result = SDP_AddSequenceAttribute(sdpHandle_, SDP_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST,
143 (uint8_t*)panProtocolDescriptorListData, sizeof(panProtocolDescriptorListData));
144 return result;
145 }
AddBluetoothProfileDescriptorList()146 int PanSdp::AddBluetoothProfileDescriptorList()
147 {
148 LOG_INFO("[PAN SDP] Call %{public}s", __PRETTY_FUNCTION__);
149 // Bluetooth Profile Descriptor List
150 SdpProfileDescriptor profileDescriptor;
151 profileDescriptor.profileUuid.type = BT_UUID_16;
152 profileDescriptor.profileUuid.uuid16 = NAP_UUID16;
153 profileDescriptor.versionNumber = PAN_VERSION_NUMBER;
154 // create Bluetooth Profile Descriptor List
155 int result = SDP_AddBluetoothProfileDescriptorList(sdpHandle_, &profileDescriptor, 1);
156 return result;
157 }
AddServiceName()158 int PanSdp::AddServiceName()
159 {
160 LOG_INFO("[PAN SDP] Call %{public}s", __PRETTY_FUNCTION__);
161 // Service Name
162 int result = SDP_AddServiceName(
163 sdpHandle_, SDP_ATTRIBUTE_PRIMARY_LANGUAGE_BASE, PAN_SERVICE_NAME.c_str(), PAN_SERVICE_NAME.length());
164 return result;
165 }
AddLanguageBaseAttributeIdList()166 int PanSdp::AddLanguageBaseAttributeIdList()
167 {
168 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
169 SdpLanguageBaseAttributeId languageBaseAttr;
170 languageBaseAttr.languageIdentifier = PAN_LANG_ID_CODE_ENGLISH;
171 languageBaseAttr.characterEncodingIdentifier = PAN_LANG_ID_CHAR_ENCODE_UTF8;
172 languageBaseAttr.baseAttributeId = PAN_LANGUAGE_BASE_ID;
173 int result = SDP_AddLanguageBaseAttributeIdList(sdpHandle_, &languageBaseAttr, 1);
174 return result;
175 }
AddBrowseGroupList()176 int PanSdp::AddBrowseGroupList()
177 {
178 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
179 BtUuid btUuid = {BT_UUID_16, {SDP_PUBLIC_BROWSE_GROUP_ROOT_UUID}};
180 int result = SDP_AddBrowseGroupList(sdpHandle_, &btUuid, 1);
181 return result;
182 }
AddServiceDescription()183 int PanSdp::AddServiceDescription()
184 {
185 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
186 int result = SDP_AddServiceDescription(sdpHandle_, PAN_SERVICE_DESCRIPTION_ID,
187 PAN_SERVICE_DESCRIPTION.c_str(), PAN_SERVICE_DESCRIPTION.length());
188 return result;
189 }
RegisterServiceRecord()190 int PanSdp::RegisterServiceRecord()
191 {
192 LOG_INFO("[PAN SDP]Call %{public}s", __PRETTY_FUNCTION__);
193 int result = SDP_RegisterServiceRecord(sdpHandle_);
194 return result;
195 }
RegisterNetInfo()196 int PanSdp::RegisterNetInfo()
197 {
198 int result = BT_SUCCESS;
199 result = AddPanNetAccessRate();
200 if (result != BT_SUCCESS) {
201 LOG_ERROR("[PAN SDP] AddPanNetAccessRate result = %{public}d", result);
202 return result;
203 }
204 result = AddPanNetAccessType();
205 if (result != BT_SUCCESS) {
206 LOG_ERROR("[PAN SDP] AddPanNetAccessRate result = %{public}d", result);
207 return result;
208 }
209 return result;
210 }
RegisterServiceInfo()211 int PanSdp::RegisterServiceInfo()
212 {
213 int result = BT_SUCCESS;
214 result = AddServiceClassIdList();
215 if (result != BT_SUCCESS) {
216 LOG_ERROR("[PAN SDP] AddServiceClassIdList result = %{public}d", result);
217 return result;
218 }
219 result = AddServiceName();
220 if (result != BT_SUCCESS) {
221 LOG_ERROR("[PAN SDP] AddServiceName result = %{public}d", result);
222 return result;
223 }
224 result = AddServiceDescription();
225 if (result != BT_SUCCESS) {
226 LOG_ERROR("[PAN SDP] AddServiceName result = %{public}d", result);
227 return result;
228 }
229 return result;
230 }
231 } // namespace bluetooth
232 } // namespace OHOS