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