1 /*
2 * Copyright (c) 2021-2023 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 "message_parcel.h"
17 #include "securec.h"
18 #include "string_ex.h"
19 #include "usb_common.h"
20 #include "usb_errors.h"
21 #include "usb_server_stub.h"
22 #include "usb_interface_type.h"
23 #include "v1_1/iusb_interface.h"
24 #include "usb_report_sys_event.h"
25 #include "hitrace_meter.h"
26 using namespace OHOS::HDI::Usb::V1_1;
27 namespace OHOS {
28 namespace USB {
29 constexpr int32_t MAX_EDM_LIST_SIZE = 200;
GetDeviceMessage(MessageParcel &data, uint8_t &busNum, uint8_t &devAddr)30 int32_t UsbServerStub::GetDeviceMessage(MessageParcel &data, uint8_t &busNum, uint8_t &devAddr)
31 {
32 if (!data.ReadUint8(busNum)) {
33 return UEC_SERVICE_READ_PARCEL_ERROR;
34 }
35 if (!data.ReadUint8(devAddr)) {
36 return UEC_SERVICE_READ_PARCEL_ERROR;
37 }
38 return UEC_OK;
39 }
40
SetBufferMessage(MessageParcel &data, const std::vector<uint8_t> &bufferData)41 int32_t UsbServerStub::SetBufferMessage(MessageParcel &data, const std::vector<uint8_t> &bufferData)
42 {
43 uint32_t length = bufferData.size();
44 const uint8_t *ptr = bufferData.data();
45 if (!ptr) {
46 length = 0;
47 }
48
49 if (!data.WriteUint32(length)) {
50 USB_HILOGE(MODULE_USBD, "write length failed length:%{public}u", length);
51 return UEC_SERVICE_WRITE_PARCEL_ERROR;
52 }
53 if ((ptr) && (length > 0) && !data.WriteBuffer(reinterpret_cast<const void *>(ptr), length)) {
54 USB_HILOGE(MODULE_USBD, "writer buffer failed length:%{public}u", length);
55 return UEC_SERVICE_WRITE_PARCEL_ERROR;
56 }
57 return UEC_OK;
58 }
59
GetBufferMessage(MessageParcel &data, std::vector<uint8_t> &bufferData)60 int32_t UsbServerStub::GetBufferMessage(MessageParcel &data, std::vector<uint8_t> &bufferData)
61 {
62 uint32_t dataSize = 0;
63 bufferData.clear();
64 if (!data.ReadUint32(dataSize)) {
65 USB_HILOGE(MODULE_USBD, "read dataSize failed");
66 return UEC_SERVICE_READ_PARCEL_ERROR;
67 }
68 if (dataSize == 0) {
69 USB_HILOGW(MODULE_USBD, "size:%{public}u", dataSize);
70 return UEC_OK;
71 }
72
73 const uint8_t *readData = data.ReadUnpadBuffer(dataSize);
74 if (readData == nullptr) {
75 USB_HILOGE(MODULE_USBD, "failed size:%{public}u", dataSize);
76 return UEC_SERVICE_READ_PARCEL_ERROR;
77 }
78 std::vector<uint8_t> tdata(readData, readData + dataSize);
79 bufferData.swap(tdata);
80 return UEC_OK;
81 }
82
WriteFileDescriptor(MessageParcel &data, int fd)83 bool UsbServerStub::WriteFileDescriptor(MessageParcel &data, int fd)
84 {
85 if (!data.WriteBool(fd >= 0 ? true : false)) {
86 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: failed to write fd vailed", __func__);
87 return false;
88 }
89 if (fd < 0) {
90 return true;
91 }
92 if (!data.WriteFileDescriptor(fd)) {
93 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s: failed to write fd", __func__);
94 return false;
95 }
96 return true;
97 }
98
StubDevice( uint32_t code, int32_t &result, MessageParcel &data, MessageParcel &reply, MessageOption &option)99 bool UsbServerStub::StubDevice(
100 uint32_t code, int32_t &result, MessageParcel &data, MessageParcel &reply, MessageOption &option)
101 {
102 switch (code) {
103 case static_cast<int>(UsbInterfaceCode::USB_FUN_OPEN_DEVICE):
104 result = DoOpenDevice(data, reply, option);
105 return true;
106 case static_cast<int>(UsbInterfaceCode::USB_FUN_RESET_DEVICE):
107 result = DoResetDevice(data, reply, option);
108 return true;
109 case static_cast<int>(UsbInterfaceCode::USB_FUN_HAS_RIGHT):
110 result = DoHasRight(data, reply, option);
111 return true;
112 case static_cast<int>(UsbInterfaceCode::USB_FUN_REQUEST_RIGHT):
113 result = DoRequestRight(data, reply, option);
114 return true;
115 case static_cast<int>(UsbInterfaceCode::USB_FUN_REMOVE_RIGHT):
116 result = DoRemoveRight(data, reply, option);
117 return true;
118 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_PORTS):
119 result = DoGetPorts(data, reply, option);
120 return true;
121 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_SUPPORTED_MODES):
122 result = DoGetSupportedModes(data, reply, option);
123 return true;
124 case static_cast<int>(UsbInterfaceCode::USB_FUN_SET_PORT_ROLE):
125 result = DoSetPortRole(data, reply, option);
126 return true;
127 case static_cast<int>(UsbInterfaceCode::USB_FUN_CLAIM_INTERFACE):
128 result = DoClaimInterface(data, reply, option);
129 return true;
130 case static_cast<int>(UsbInterfaceCode::USB_FUN_ATTACH_KERNEL_DRIVER):
131 result = DoUsbAttachKernelDriver(data, reply, option);
132 return true;
133 case static_cast<int>(UsbInterfaceCode::USB_FUN_DETACH_KERNEL_DRIVER):
134 result = DoUsbDetachKernelDriver(data, reply, option);
135 return true;
136 case static_cast<int>(UsbInterfaceCode::USB_FUN_RELEASE_INTERFACE):
137 result = DoReleaseInterface(data, reply, option);
138 return true;
139 case static_cast<int>(UsbInterfaceCode::USB_FUN_REG_BULK_CALLBACK):
140 result = DoRegBulkCallback(data, reply, option);
141 return true;
142 case static_cast<int>(UsbInterfaceCode::USB_FUN_UNREG_BULK_CALLBACK):
143 result = DoUnRegBulkCallback(data, reply, option);
144 return true;
145 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_FILEDESCRIPTOR):
146 result = DoGetFileDescriptor(data, reply, option);
147 return true;
148 case static_cast<int>(UsbInterfaceCode::USB_FUN_ADD_RIGHT):
149 result = DoAddRight(data, reply, option);
150 return true;
151 case static_cast<int>(UsbInterfaceCode::USB_FUN_ADD_ACCESS_RIGHT):
152 result = DoAddAccessRight(data, reply, option);
153 return true;
154 default:;
155 }
156 return false;
157 }
158
StubHost( uint32_t code, int32_t &result, MessageParcel &data, MessageParcel &reply, MessageOption &option)159 bool UsbServerStub::StubHost(
160 uint32_t code, int32_t &result, MessageParcel &data, MessageParcel &reply, MessageOption &option)
161 {
162 switch (code) {
163 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_DEVICES):
164 result = DoGetDevices(data, reply, option);
165 return true;
166 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_CURRENT_FUNCTIONS):
167 result = DoGetCurrentFunctions(data, reply, option);
168 return true;
169 case static_cast<int>(UsbInterfaceCode::USB_FUN_SET_CURRENT_FUNCTIONS):
170 result = DoSetCurrentFunctions(data, reply, option);
171 return true;
172 case static_cast<int>(UsbInterfaceCode::USB_FUN_USB_FUNCTIONS_FROM_STRING):
173 result = DoUsbFunctionsFromString(data, reply, option);
174 return true;
175 case static_cast<int>(UsbInterfaceCode::USB_FUN_USB_FUNCTIONS_TO_STRING):
176 result = DoUsbFunctionsToString(data, reply, option);
177 return true;
178 case static_cast<int>(UsbInterfaceCode::USB_FUN_CLOSE_DEVICE):
179 result = DoClose(data, reply, option);
180 return true;
181 case static_cast<int>(UsbInterfaceCode::USB_FUN_REQUEST_QUEUE):
182 result = DoRequestQueue(data, reply, option);
183 return true;
184 case static_cast<int>(UsbInterfaceCode::USB_FUN_REQUEST_WAIT):
185 result = DoRequestWait(data, reply, option);
186 return true;
187 case static_cast<int>(UsbInterfaceCode::USB_FUN_SET_INTERFACE):
188 result = DoSetInterface(data, reply, option);
189 return true;
190 case static_cast<int>(UsbInterfaceCode::USB_FUN_SET_ACTIVE_CONFIG):
191 result = DoSetActiveConfig(data, reply, option);
192 return true;
193 case static_cast<int>(UsbInterfaceCode::USB_FUN_REQUEST_CANCEL):
194 result = DoRequestCancel(data, reply, option);
195 return true;
196 case static_cast<int>(UsbInterfaceCode::USB_FUN_BULK_AYSNC_READ):
197 result = DoBulkRead(data, reply, option);
198 return true;
199 case static_cast<int>(UsbInterfaceCode::USB_FUN_BULK_AYSNC_WRITE):
200 result = DoBulkWrite(data, reply, option);
201 return true;
202 case static_cast<int>(UsbInterfaceCode::USB_FUN_BULK_AYSNC_CANCEL):
203 result = DoBulkCancel(data, reply, option);
204 return true;
205 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_DESCRIPTOR):
206 result = DoGetRawDescriptor(data, reply, option);
207 return true;
208 case static_cast<int>(UsbInterfaceCode::USB_FUN_DISABLE_GLOBAL_INTERFACE):
209 result = DoManageGlobalInterface(data, reply, option);
210 return true;
211 case static_cast<int>(UsbInterfaceCode::USB_FUN_DISABLE_DEVICE):
212 result = DoManageDevice(data, reply, option);
213 return true;
214 case static_cast<int>(UsbInterfaceCode::USB_FUN_DISABLE_INTERFACE_TYPE):
215 result = DoManageInterfaceType(data, reply, option);
216 return true;
217 case static_cast<int>(UsbInterfaceCode::USB_FUN_CLEAR_HALT):
218 result = DoClearHalt(data, reply, option);
219 return true;
220 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_DEVICE_SPEED):
221 result = DoGetDeviceSpeed(data, reply, option);
222 return true;
223 case static_cast<int>(UsbInterfaceCode::USB_FUN_GET_DRIVER_ACTIVE_STATUS):
224 result = DoGetInterfaceActiveStatus(data, reply, option);
225 return true;
226 default:;
227 }
228 return false;
229 }
230
StubHostTransfer(uint32_t code, int32_t &result, MessageParcel &data, MessageParcel &reply, MessageOption &option)231 bool UsbServerStub::StubHostTransfer(uint32_t code, int32_t &result,
232 MessageParcel &data, MessageParcel &reply, MessageOption &option)
233 {
234 switch (code) {
235 case static_cast<int>(UsbInterfaceCode::USB_FUN_BULK_TRANSFER_READ):
236 result = DoBulkTransferRead(data, reply, option);
237 return true;
238 case static_cast<int>(UsbInterfaceCode::USB_FUN_BULK_TRANSFER_READ_WITH_LENGTH):
239 result = DoBulkTransferReadwithLength(data, reply, option);
240 return true;
241 case static_cast<int>(UsbInterfaceCode::USB_FUN_BULK_TRANSFER_WRITE):
242 result = DoBulkTransferWrite(data, reply, option);
243 return true;
244 case static_cast<int>(UsbInterfaceCode::USB_FUN_CONTROL_TRANSFER):
245 result = DoControlTransfer(data, reply, option);
246 return true;
247 case static_cast<int>(UsbInterfaceCode::USB_FUN_USB_CONTROL_TRANSFER):
248 result = DoUsbControlTransfer(data, reply, option);
249 return true;
250 default:;
251 }
252 return false;
253 }
254
OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)255 int32_t UsbServerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
256 {
257 USB_HILOGD(MODULE_USB_SERVICE, "UsbServerStub::OnRemoteRequest, cmd = %{public}u, flags = %{public}d", code,
258 option.GetFlags());
259 std::u16string descriptor = UsbServerStub::GetDescriptor();
260 std::u16string remoteDescriptor = data.ReadInterfaceToken();
261 if (descriptor != remoteDescriptor) {
262 USB_HILOGE(MODULE_SERVICE, "UsbServerStub::OnRemoteRequest failed, descriptor is not matched!");
263 return UEC_SERVICE_INNER_ERR;
264 }
265
266 int32_t ret = 0;
267 if (StubHost(code, ret, data, reply, option)) {
268 return ret;
269 } else if (StubDevice(code, ret, data, reply, option)) {
270 return ret;
271 } else if (StubHostTransfer(code, ret, data, reply, option)) {
272 return ret;
273 } else {
274 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
275 }
276
277 return UEC_OK;
278 }
279
DoGetCurrentFunctions(MessageParcel &data, MessageParcel &reply, MessageOption &option)280 int32_t UsbServerStub::DoGetCurrentFunctions(MessageParcel &data, MessageParcel &reply, MessageOption &option)
281 {
282 int32_t functions;
283 int32_t ret = GetCurrentFunctions(functions);
284 if (ret != UEC_OK) {
285 UsbReportSysEvent::ReportTransforFaultSysEvent("GetCurrentFunctions", {0, 0}, {0, 0}, ret);
286 return ret;
287 }
288 WRITE_PARCEL_WITH_RET(reply, Int32, functions, UEC_SERVICE_WRITE_PARCEL_ERROR);
289 return UEC_OK;
290 }
291
DoSetCurrentFunctions(MessageParcel &data, MessageParcel &reply, MessageOption &option)292 int32_t UsbServerStub::DoSetCurrentFunctions(MessageParcel &data, MessageParcel &reply, MessageOption &option)
293 {
294 HITRACE_METER_NAME(HITRACE_TAG_USB, "SetCurrentFunctions");
295 int32_t funcs;
296 READ_PARCEL_WITH_RET(data, Int32, funcs, UEC_SERVICE_READ_PARCEL_ERROR);
297 int32_t ret = SetCurrentFunctions(funcs);
298 if (ret != UEC_OK) {
299 UsbReportSysEvent::ReportTransforFaultSysEvent("SetCurrentFunctions", {0, 0}, {0, 0}, ret);
300 }
301 return ret;
302 }
303
DoUsbFunctionsFromString(MessageParcel &data, MessageParcel &reply, MessageOption &option)304 int32_t UsbServerStub::DoUsbFunctionsFromString(MessageParcel &data, MessageParcel &reply, MessageOption &option)
305 {
306 std::string funcs;
307 READ_PARCEL_WITH_RET(data, String, funcs, UEC_SERVICE_READ_PARCEL_ERROR);
308 WRITE_PARCEL_WITH_RET(reply, Int32, UsbFunctionsFromString(funcs), UEC_SERVICE_WRITE_PARCEL_ERROR);
309 return UEC_OK;
310 }
311
DoUsbFunctionsToString(MessageParcel &data, MessageParcel &reply, MessageOption &option)312 int32_t UsbServerStub::DoUsbFunctionsToString(MessageParcel &data, MessageParcel &reply, MessageOption &option)
313 {
314 int32_t funcs;
315 READ_PARCEL_WITH_RET(data, Int32, funcs, UEC_SERVICE_READ_PARCEL_ERROR);
316 WRITE_PARCEL_WITH_RET(reply, String, UsbFunctionsToString(funcs), UEC_SERVICE_WRITE_PARCEL_ERROR);
317 return UEC_OK;
318 }
319
DoOpenDevice(MessageParcel &data, MessageParcel &reply, MessageOption &option)320 int32_t UsbServerStub::DoOpenDevice(MessageParcel &data, MessageParcel &reply, MessageOption &option)
321 {
322 uint8_t busNum = 0;
323 uint8_t devAddr = 0;
324 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_READ_PARCEL_ERROR);
325 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_READ_PARCEL_ERROR);
326 int32_t ret = OpenDevice(busNum, devAddr);
327 if (ret != UEC_OK) {
328 UsbReportSysEvent::ReportTransforFaultSysEvent("OpenDevice", {busNum, devAddr}, {0, 0}, ret);
329 return ret;
330 }
331
332 return UEC_OK;
333 }
334
DoResetDevice(MessageParcel &data, MessageParcel &reply, MessageOption &option)335 int32_t UsbServerStub::DoResetDevice(MessageParcel &data, MessageParcel &reply, MessageOption &option)
336 {
337 uint8_t busNum = 0;
338 uint8_t devAddr = 0;
339 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_READ_PARCEL_ERROR);
340 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_READ_PARCEL_ERROR);
341 int32_t ret = ResetDevice(busNum, devAddr);
342 if (ret != UEC_OK) {
343 UsbReportSysEvent::ReportTransforFaultSysEvent("ResetDevice", {busNum, devAddr}, {0, 0}, ret);
344 return ret;
345 }
346
347 return UEC_OK;
348 }
349
DoHasRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)350 int32_t UsbServerStub::DoHasRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)
351 {
352 std::u16string deviceName = u"";
353 READ_PARCEL_WITH_RET(data, String16, deviceName, UEC_SERVICE_READ_PARCEL_ERROR);
354 WRITE_PARCEL_WITH_RET(reply, Bool, HasRight(Str16ToStr8(deviceName)), UEC_SERVICE_WRITE_PARCEL_ERROR);
355
356 return UEC_OK;
357 }
358
DoRequestRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)359 int32_t UsbServerStub::DoRequestRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)
360 {
361 std::u16string deviceName = u"";
362 READ_PARCEL_WITH_RET(data, String16, deviceName, UEC_SERVICE_READ_PARCEL_ERROR);
363 WRITE_PARCEL_WITH_RET(reply, Int32, RequestRight(Str16ToStr8(deviceName)), UEC_SERVICE_WRITE_PARCEL_ERROR);
364 return UEC_OK;
365 }
366
DoRemoveRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)367 int32_t UsbServerStub::DoRemoveRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)
368 {
369 std::u16string deviceName = u"";
370 READ_PARCEL_WITH_RET(data, String16, deviceName, UEC_SERVICE_READ_PARCEL_ERROR);
371 WRITE_PARCEL_WITH_RET(reply, Int32, RemoveRight(Str16ToStr8(deviceName)), UEC_SERVICE_WRITE_PARCEL_ERROR);
372 return UEC_OK;
373 }
374
DoGetPorts(MessageParcel &data, MessageParcel &reply, MessageOption &option)375 int32_t UsbServerStub::DoGetPorts(MessageParcel &data, MessageParcel &reply, MessageOption &option)
376 {
377 std::vector<UsbPort> ports;
378 int32_t ret = GetPorts(ports);
379 USB_HILOGI(MODULE_SERVICE, "UsbServerStub::GetPorts ret %{public}d ", ret);
380 if (ret != UEC_OK) {
381 UsbReportSysEvent::ReportTransforFaultSysEvent("GetPorts", {0, 0}, {0, 0}, ret);
382 return ret;
383 }
384 uint32_t size = ports.size();
385 USB_HILOGI(MODULE_SERVICE, "UsbServerStub::GetPorts size %{public}d ", size);
386 WRITE_PARCEL_WITH_RET(reply, Int32, size, UEC_SERVICE_WRITE_PARCEL_ERROR);
387 for (uint32_t i = 0; i < size; ++i) {
388 ret = WriteUsbPort(reply, ports[i]);
389 if (ret) {
390 return ret;
391 }
392 }
393 return ret;
394 }
395
WriteUsbPort(MessageParcel &reply, const UsbPort &port)396 int32_t UsbServerStub::WriteUsbPort(MessageParcel &reply, const UsbPort &port)
397 {
398 WRITE_PARCEL_WITH_RET(reply, Int32, port.id, UEC_SERVICE_WRITE_PARCEL_ERROR);
399 WRITE_PARCEL_WITH_RET(reply, Int32, port.supportedModes, UEC_SERVICE_WRITE_PARCEL_ERROR);
400 WRITE_PARCEL_WITH_RET(reply, Int32, port.usbPortStatus.currentMode, UEC_SERVICE_WRITE_PARCEL_ERROR);
401 WRITE_PARCEL_WITH_RET(reply, Int32, port.usbPortStatus.currentPowerRole, UEC_SERVICE_WRITE_PARCEL_ERROR);
402 WRITE_PARCEL_WITH_RET(reply, Int32, port.usbPortStatus.currentDataRole, UEC_SERVICE_WRITE_PARCEL_ERROR);
403 USB_HILOGI(MODULE_SERVICE, "UsbServerStub::GetPorts supportedModes %{public}d ", port.supportedModes);
404 return UEC_OK;
405 }
406
DoGetSupportedModes(MessageParcel &data, MessageParcel &reply, MessageOption &option)407 int32_t UsbServerStub::DoGetSupportedModes(MessageParcel &data, MessageParcel &reply, MessageOption &option)
408 {
409 int32_t supportedModes = 0;
410 int32_t portId = 0;
411 READ_PARCEL_WITH_RET(data, Int32, portId, UEC_SERVICE_READ_PARCEL_ERROR);
412 int32_t ret = GetSupportedModes(portId, supportedModes);
413 if (ret != UEC_OK) {
414 return ret;
415 }
416 WRITE_PARCEL_WITH_RET(reply, Int32, supportedModes, UEC_SERVICE_WRITE_PARCEL_ERROR);
417 return ret;
418 }
419
DoSetPortRole(MessageParcel &data, MessageParcel &reply, MessageOption &option)420 int32_t UsbServerStub::DoSetPortRole(MessageParcel &data, MessageParcel &reply, MessageOption &option)
421 {
422 HITRACE_METER_NAME(HITRACE_TAG_USB, "SetPortRole");
423 int32_t portId = 0;
424 int32_t powerRole = 0;
425 int32_t dataRole = 0;
426 READ_PARCEL_WITH_RET(data, Int32, portId, UEC_SERVICE_READ_PARCEL_ERROR);
427 READ_PARCEL_WITH_RET(data, Int32, powerRole, UEC_SERVICE_READ_PARCEL_ERROR);
428 READ_PARCEL_WITH_RET(data, Int32, dataRole, UEC_SERVICE_READ_PARCEL_ERROR);
429 int32_t ret = SetPortRole(portId, powerRole, dataRole);
430 if (ret != UEC_OK) {
431 UsbReportSysEvent::ReportTransforFaultSysEvent("SetPortRole", {0, 0}, {0, 0}, ret);
432 return ret;
433 }
434 return ret;
435 }
436
DoClaimInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)437 int32_t UsbServerStub::DoClaimInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)
438 {
439 HITRACE_METER_NAME(HITRACE_TAG_USB, "ClaimInterface");
440 uint8_t busNum = 0;
441 uint8_t devAddr = 0;
442 uint8_t interface = 0;
443 uint8_t force = 0;
444 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_READ_PARCEL_ERROR);
445 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_READ_PARCEL_ERROR);
446 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_READ_PARCEL_ERROR);
447 READ_PARCEL_WITH_RET(data, Uint8, force, UEC_SERVICE_READ_PARCEL_ERROR);
448 WRITE_PARCEL_WITH_RET(
449 reply, Int32, ClaimInterface(busNum, devAddr, interface, force), UEC_SERVICE_WRITE_PARCEL_ERROR);
450 return UEC_OK;
451 }
452
DoUsbAttachKernelDriver(MessageParcel &data, MessageParcel &reply, MessageOption &option)453 int32_t UsbServerStub::DoUsbAttachKernelDriver(MessageParcel &data, MessageParcel &reply, MessageOption &option)
454 {
455 HITRACE_METER_NAME(HITRACE_TAG_USB, "UsbAttachKernelDriver");
456 uint8_t busNum = 0;
457 uint8_t devAddr = 0;
458 uint8_t interface = 0;
459 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_READ_PARCEL_ERROR);
460 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_READ_PARCEL_ERROR);
461 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_READ_PARCEL_ERROR);
462 WRITE_PARCEL_WITH_RET(
463 reply, Int32, UsbAttachKernelDriver(busNum, devAddr, interface), UEC_SERVICE_WRITE_PARCEL_ERROR);
464 return UEC_OK;
465 }
466
DoUsbDetachKernelDriver(MessageParcel &data, MessageParcel &reply, MessageOption &option)467 int32_t UsbServerStub::DoUsbDetachKernelDriver(MessageParcel &data, MessageParcel &reply, MessageOption &option)
468 {
469 HITRACE_METER_NAME(HITRACE_TAG_USB, "UsbDetachKernelDriver");
470 uint8_t busNum = 0;
471 uint8_t devAddr = 0;
472 uint8_t interface = 0;
473 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_READ_PARCEL_ERROR);
474 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_READ_PARCEL_ERROR);
475 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_READ_PARCEL_ERROR);
476 WRITE_PARCEL_WITH_RET(
477 reply, Int32, UsbDetachKernelDriver(busNum, devAddr, interface), UEC_SERVICE_WRITE_PARCEL_ERROR);
478 return UEC_OK;
479 }
480
DoReleaseInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)481 int32_t UsbServerStub::DoReleaseInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)
482 {
483 HITRACE_METER_NAME(HITRACE_TAG_USB, "ReleaseInterface");
484 uint8_t busNum = 0;
485 uint8_t devAddr = 0;
486 uint8_t interface = 0;
487 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_READ_PARCEL_ERROR);
488 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_READ_PARCEL_ERROR);
489 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_READ_PARCEL_ERROR);
490 WRITE_PARCEL_WITH_RET(reply, Int32, ReleaseInterface(busNum, devAddr, interface), UEC_SERVICE_WRITE_PARCEL_ERROR);
491 return UEC_OK;
492 }
493
DoBulkTransferRead(MessageParcel &data, MessageParcel &reply, MessageOption &option)494 int32_t UsbServerStub::DoBulkTransferRead(MessageParcel &data, MessageParcel &reply, MessageOption &option)
495 {
496 HITRACE_METER_NAME(HITRACE_TAG_USB, "BulkTransferRead");
497 uint8_t busNum = 0;
498 uint8_t devAddr = 0;
499 uint8_t interface = 0;
500 uint8_t endpoint = 0;
501 int32_t timeOut = 0;
502 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
503 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
504 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
505 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
506 READ_PARCEL_WITH_RET(data, Int32, timeOut, UEC_SERVICE_WRITE_PARCEL_ERROR);
507 std::vector<uint8_t> bufferData;
508 const UsbDev tmpDev = {busNum, devAddr};
509 const UsbPipe tmpPipe = {interface, endpoint};
510 int32_t ret = BulkTransferRead(tmpDev, tmpPipe, bufferData, timeOut);
511 if (ret != UEC_OK) {
512 USB_HILOGE(MODULE_USBD, "read failed ret:%{public}d", ret);
513 UsbReportSysEvent::ReportTransforFaultSysEvent("BulkTransferRead", tmpDev, tmpPipe, ret);
514 return ret;
515 }
516 ret = SetBufferMessage(reply, bufferData);
517 if (ret != UEC_OK) {
518 USB_HILOGE(MODULE_USBD, "set buffer failed ret:%{public}d", ret);
519 }
520 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
521 return ret;
522 }
523
DoBulkTransferReadwithLength(MessageParcel &data, MessageParcel &reply, MessageOption &option)524 int32_t UsbServerStub::DoBulkTransferReadwithLength(MessageParcel &data, MessageParcel &reply, MessageOption &option)
525 {
526 HITRACE_METER_NAME(HITRACE_TAG_USB, "BulkTransferRead");
527 uint8_t busNum = 0;
528 uint8_t devAddr = 0;
529 uint8_t interface = 0;
530 uint8_t endpoint = 0;
531 int32_t length = 0;
532 int32_t timeOut = 0;
533 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
534 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
535 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
536 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
537 READ_PARCEL_WITH_RET(data, Int32, length, UEC_SERVICE_WRITE_PARCEL_ERROR);
538 READ_PARCEL_WITH_RET(data, Int32, timeOut, UEC_SERVICE_WRITE_PARCEL_ERROR);
539 std::vector<uint8_t> bufferData;
540 const UsbDev tmpDev = {busNum, devAddr};
541 const UsbPipe tmpPipe = {interface, endpoint};
542 int32_t ret = BulkTransferReadwithLength(tmpDev, tmpPipe, length, bufferData, timeOut);
543 if (ret != UEC_OK) {
544 USB_HILOGE(MODULE_USBD, "read failed ret:%{public}d", ret);
545 UsbReportSysEvent::ReportTransforFaultSysEvent("BulkTransferRead", tmpDev, tmpPipe, ret);
546 return ret;
547 }
548 ret = SetBufferMessage(reply, bufferData);
549 if (ret != UEC_OK) {
550 USB_HILOGE(MODULE_USBD, "set buffer failed ret:%{public}d", ret);
551 }
552 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
553 return ret;
554 }
555
DoBulkTransferWrite(MessageParcel &data, MessageParcel &reply, MessageOption &option)556 int32_t UsbServerStub::DoBulkTransferWrite(MessageParcel &data, MessageParcel &reply, MessageOption &option)
557 {
558 HITRACE_METER_NAME(HITRACE_TAG_USB, "BulkTransferWrite");
559 uint8_t busNum = 0;
560 uint8_t devAddr = 0;
561 uint8_t interface = 0;
562 uint8_t endpoint = 0;
563 int32_t timeOut = 0;
564 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
565 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
566 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
567 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
568 READ_PARCEL_WITH_RET(data, Int32, timeOut, UEC_SERVICE_WRITE_PARCEL_ERROR);
569 std::vector<uint8_t> bufferData;
570 const UsbDev tmpDev = {busNum, devAddr};
571 const UsbPipe tmpPipe = {interface, endpoint};
572 int32_t ret = GetBufferMessage(data, bufferData);
573 if (ret != UEC_OK) {
574 USB_HILOGE(MODULE_USBD, "GetBufferMessage failedret:%{public}d", ret);
575 return ret;
576 }
577 ret = BulkTransferWrite(tmpDev, tmpPipe, bufferData, timeOut);
578 if (ret != UEC_OK) {
579 USB_HILOGE(MODULE_USBD, "BulkTransferWrite error ret:%{public}d", ret);
580 UsbReportSysEvent::ReportTransforFaultSysEvent("BulkTransferWrite", tmpDev, tmpPipe, ret);
581 }
582 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
583 return ret;
584 }
585
DoControlTransfer(MessageParcel &data, MessageParcel &reply, MessageOption &option)586 int32_t UsbServerStub::DoControlTransfer(MessageParcel &data, MessageParcel &reply, MessageOption &option)
587 {
588 HITRACE_METER_NAME(HITRACE_TAG_USB, "ControlTransfer");
589 uint8_t busNum = 0;
590 uint8_t devAddr = 0;
591 int32_t requestType;
592 int32_t request;
593 int32_t value;
594 int32_t index;
595 int32_t timeOut;
596
597 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
598 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
599 READ_PARCEL_WITH_RET(data, Int32, requestType, UEC_SERVICE_WRITE_PARCEL_ERROR);
600 READ_PARCEL_WITH_RET(data, Int32, request, UEC_SERVICE_WRITE_PARCEL_ERROR);
601 READ_PARCEL_WITH_RET(data, Int32, value, UEC_SERVICE_WRITE_PARCEL_ERROR);
602 READ_PARCEL_WITH_RET(data, Int32, index, UEC_SERVICE_WRITE_PARCEL_ERROR);
603 READ_PARCEL_WITH_RET(data, Int32, timeOut, UEC_SERVICE_WRITE_PARCEL_ERROR);
604 std::vector<uint8_t> bufferData;
605 int32_t ret = GetBufferMessage(data, bufferData);
606 if (ret != UEC_OK) {
607 USB_HILOGE(MODULE_USBD, "get error ret:%{public}d", ret);
608 return ret;
609 }
610
611 bool bWrite = ((static_cast<uint32_t>(requestType) & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT);
612 const UsbDev tmpDev = {busNum, devAddr};
613 const UsbCtrlTransfer tctrl = {requestType, request, value, index, timeOut};
614 ret = ControlTransfer(tmpDev, tctrl, bufferData);
615 if (ret != UEC_OK) {
616 UsbReportSysEvent::ReportTransforFaultSysEvent("ControlTransfer", tmpDev, {0, 0}, ret);
617 USB_HILOGE(MODULE_USBD, "ControlTransfer error ret:%{public}d", ret);
618 return ret;
619 }
620
621 if (!bWrite) {
622 ret = SetBufferMessage(reply, bufferData);
623 if (ret != UEC_OK) {
624 USB_HILOGE(MODULE_USBD, "Set buffer message error length = %{public}d", ret);
625 }
626 }
627 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
628 return UEC_OK;
629 }
630
DoUsbControlTransfer(MessageParcel &data, MessageParcel &reply, MessageOption &option)631 int32_t UsbServerStub::DoUsbControlTransfer(MessageParcel &data, MessageParcel &reply, MessageOption &option)
632 {
633 HITRACE_METER_NAME(HITRACE_TAG_USB, "ControlTransfer");
634 uint8_t busNum = 0;
635 uint8_t devAddr = 0;
636 int32_t requestType;
637 int32_t request;
638 int32_t value;
639 int32_t index;
640 int32_t length;
641 int32_t timeOut;
642
643 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
644 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
645 READ_PARCEL_WITH_RET(data, Int32, requestType, UEC_SERVICE_WRITE_PARCEL_ERROR);
646 READ_PARCEL_WITH_RET(data, Int32, request, UEC_SERVICE_WRITE_PARCEL_ERROR);
647 READ_PARCEL_WITH_RET(data, Int32, value, UEC_SERVICE_WRITE_PARCEL_ERROR);
648 READ_PARCEL_WITH_RET(data, Int32, index, UEC_SERVICE_WRITE_PARCEL_ERROR);
649 READ_PARCEL_WITH_RET(data, Int32, length, UEC_SERVICE_WRITE_PARCEL_ERROR);
650 READ_PARCEL_WITH_RET(data, Int32, timeOut, UEC_SERVICE_WRITE_PARCEL_ERROR);
651 std::vector<uint8_t> bufferData;
652 int32_t ret = GetBufferMessage(data, bufferData);
653 if (ret != UEC_OK) {
654 USB_HILOGE(MODULE_USBD, "get error ret:%{public}d", ret);
655 return ret;
656 }
657
658 bool bWrite = ((static_cast<uint32_t>(requestType) & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT);
659 const UsbDev tmpDev = {busNum, devAddr};
660 const UsbCtrlTransferParams tctrlParams = {requestType, request, value, index, length, timeOut};
661 ret = UsbControlTransfer(tmpDev, tctrlParams, bufferData);
662 if (ret != UEC_OK) {
663 UsbReportSysEvent::ReportTransforFaultSysEvent("ControlTransfer", tmpDev, {0, 0}, ret);
664 USB_HILOGE(MODULE_USBD, "ControlTransfer error ret:%{public}d", ret);
665 return ret;
666 }
667
668 if (!bWrite) {
669 ret = SetBufferMessage(reply, bufferData);
670 if (ret != UEC_OK) {
671 USB_HILOGE(MODULE_USBD, "Set buffer message error length = %{public}d", ret);
672 }
673 }
674 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
675 return UEC_OK;
676 }
677
DoSetActiveConfig(MessageParcel &data, MessageParcel &reply, MessageOption &option)678 int32_t UsbServerStub::DoSetActiveConfig(MessageParcel &data, MessageParcel &reply, MessageOption &option)
679 {
680 HITRACE_METER_NAME(HITRACE_TAG_USB, "SetActiveConfig");
681 uint8_t busNum = 0;
682 uint8_t devAddr = 0;
683 uint8_t config = 0;
684 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
685 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
686 READ_PARCEL_WITH_RET(data, Uint8, config, UEC_SERVICE_WRITE_PARCEL_ERROR);
687 WRITE_PARCEL_WITH_RET(reply, Int32, SetActiveConfig(busNum, devAddr, config), UEC_SERVICE_WRITE_PARCEL_ERROR);
688 return UEC_OK;
689 }
690
DoGetActiveConfig(MessageParcel &data, MessageParcel &reply, MessageOption &option)691 int32_t UsbServerStub::DoGetActiveConfig(MessageParcel &data, MessageParcel &reply, MessageOption &option)
692 {
693 uint8_t busNum = 0;
694 uint8_t devAddr = 0;
695 uint8_t config = 0;
696 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
697 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
698 int32_t ret = GetActiveConfig(busNum, devAddr, config);
699 if (ret == UEC_OK) {
700 WRITE_PARCEL_WITH_RET(reply, Uint8, config, UEC_SERVICE_WRITE_PARCEL_ERROR);
701 }
702 return ret;
703 }
704
DoSetInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)705 int32_t UsbServerStub::DoSetInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)
706 {
707 HITRACE_METER_NAME(HITRACE_TAG_USB, "SetInterface");
708 uint8_t busNum = 0;
709 uint8_t devAddr = 0;
710 uint8_t interfaceId = 0;
711 uint8_t altIndex = 0;
712 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
713 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
714 READ_PARCEL_WITH_RET(data, Uint8, interfaceId, UEC_SERVICE_WRITE_PARCEL_ERROR);
715 READ_PARCEL_WITH_RET(data, Uint8, altIndex, UEC_SERVICE_WRITE_PARCEL_ERROR);
716 WRITE_PARCEL_WITH_RET(
717 reply, Int32, SetInterface(busNum, devAddr, interfaceId, altIndex), UEC_SERVICE_WRITE_PARCEL_ERROR);
718 return UEC_OK;
719 }
720
DoGetRawDescriptor(MessageParcel &data, MessageParcel &reply, MessageOption &option)721 int32_t UsbServerStub::DoGetRawDescriptor(MessageParcel &data, MessageParcel &reply, MessageOption &option)
722 {
723 uint8_t busNum = 0;
724 uint8_t devAddr = 0;
725 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
726 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
727 std::vector<uint8_t> bufferData;
728 int32_t ret = GetRawDescriptor(busNum, devAddr, bufferData);
729 if (ret == UEC_OK) {
730 ret = SetBufferMessage(reply, bufferData);
731 if (ret != UEC_OK) {
732 USB_HILOGE(MODULE_USBD, "SetBufferMessage failed ret:%{public}d", ret);
733 }
734 } else {
735 USB_HILOGW(MODULE_USBD, "GetRawDescriptor failed ret:%{public}d", ret);
736 UsbReportSysEvent::ReportTransforFaultSysEvent("GetRawDescriptor", {busNum, devAddr}, {0, 0}, ret);
737 }
738 return ret;
739 }
740
DoGetFileDescriptor(MessageParcel &data, MessageParcel &reply, MessageOption &option)741 int32_t UsbServerStub::DoGetFileDescriptor(MessageParcel &data, MessageParcel &reply, MessageOption &option)
742 {
743 uint8_t busNum = 0;
744 uint8_t devAddr = 0;
745 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
746 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
747 int32_t fd = -1;
748 int32_t ret = GetFileDescriptor(busNum, devAddr, fd);
749 if (ret == UEC_OK) {
750 if (!WriteFileDescriptor(reply, fd)) {
751 USB_HILOGW(MODULE_USB_SERVICE, "%{public}s: write fd failed!", __func__);
752 return UEC_INTERFACE_WRITE_PARCEL_ERROR;
753 }
754 } else {
755 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
756 }
757 return ret;
758 }
759
DoRequestQueue(MessageParcel &data, MessageParcel &reply, MessageOption &option)760 int32_t UsbServerStub::DoRequestQueue(MessageParcel &data, MessageParcel &reply, MessageOption &option)
761 {
762 uint8_t busNum = 0;
763 uint8_t devAddr = 0;
764 uint8_t ifId = 0;
765 uint8_t endpoint = 0;
766 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
767 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
768 READ_PARCEL_WITH_RET(data, Uint8, ifId, UEC_SERVICE_WRITE_PARCEL_ERROR);
769 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
770 std::vector<uint8_t> clientData;
771 std::vector<uint8_t> bufferData;
772
773 int32_t ret = UsbServerStub::GetBufferMessage(data, clientData);
774 if (ret != UEC_OK) {
775 USB_HILOGE(MODULE_USB_INNERKIT, "GetBufferMessage failed ret:%{public}d", ret);
776 return ret;
777 }
778 ret = UsbServerStub::GetBufferMessage(data, bufferData);
779 if (ret != UEC_OK) {
780 USB_HILOGE(MODULE_USB_INNERKIT, "GetBufferMessage failed ret:%{public}d", ret);
781 return ret;
782 }
783 const UsbDev tmpDev = {busNum, devAddr};
784 const UsbPipe tmpPipe = {ifId, endpoint};
785 ret = RequestQueue(tmpDev, tmpPipe, clientData, bufferData);
786 if (ret != UEC_OK) {
787 USB_HILOGE(MODULE_USB_INNERKIT, "GetBufferMessage failed ret:%{public}d", ret);
788 }
789 return ret;
790 }
791
DoRequestWait(MessageParcel &data, MessageParcel &reply, MessageOption &option)792 int32_t UsbServerStub::DoRequestWait(MessageParcel &data, MessageParcel &reply, MessageOption &option)
793 {
794 uint8_t busNum = 0;
795 uint8_t devAddr = 0;
796 int32_t timeOut = 0;
797 std::vector<uint8_t> clientData;
798 std::vector<uint8_t> bufferData;
799 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
800 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
801 READ_PARCEL_WITH_RET(data, Int32, timeOut, UEC_SERVICE_WRITE_PARCEL_ERROR);
802
803 const UsbDev tmpDev = {busNum, devAddr};
804 int32_t ret = RequestWait(tmpDev, timeOut, clientData, bufferData);
805 if (ret != UEC_OK) {
806 USB_HILOGE(MODULE_USB_INNERKIT, "RequestWait failed ret:%{public}d", ret);
807 return ret;
808 }
809
810 ret = SetBufferMessage(reply, clientData);
811 if (ret != UEC_OK) {
812 USB_HILOGE(MODULE_USB_INNERKIT, "Set clientData failed ret:%{public}d", ret);
813 return ret;
814 }
815
816 ret = SetBufferMessage(reply, bufferData);
817 if (ret != UEC_OK) {
818 USB_HILOGE(MODULE_USB_INNERKIT, "Set bufferData failed ret:%{public}d", ret);
819 return ret;
820 }
821 return ret;
822 }
823
DoRequestCancel(MessageParcel &data, MessageParcel &reply, MessageOption &option)824 int32_t UsbServerStub::DoRequestCancel(MessageParcel &data, MessageParcel &reply, MessageOption &option)
825 {
826 uint8_t busNum = 0;
827 uint8_t devAddr = 0;
828 uint8_t interfaceId = 0;
829 uint8_t endpointId = 0;
830 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
831 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
832 READ_PARCEL_WITH_RET(data, Uint8, interfaceId, UEC_SERVICE_WRITE_PARCEL_ERROR);
833 READ_PARCEL_WITH_RET(data, Uint8, endpointId, UEC_SERVICE_WRITE_PARCEL_ERROR);
834 int32_t ret = RequestCancel(busNum, devAddr, interfaceId, endpointId);
835 if (ret != UEC_OK) {
836 USB_HILOGE(MODULE_USB_INNERKIT, "failed ret:%{public}d", ret);
837 }
838 return ret;
839 }
840
DoClose(MessageParcel &data, MessageParcel &reply, MessageOption &option)841 int32_t UsbServerStub::DoClose(MessageParcel &data, MessageParcel &reply, MessageOption &option)
842 {
843 uint8_t busNum = 0;
844 uint8_t devAddr = 0;
845 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
846 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
847 int32_t ret = Close(busNum, devAddr);
848 if (ret != UEC_OK) {
849 USB_HILOGE(MODULE_USB_INNERKIT, "failed ret:%{public}d", ret);
850 UsbReportSysEvent::ReportTransforFaultSysEvent("CloseDevice", {busNum, devAddr}, {0, 0}, ret);
851 }
852 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
853 return ret;
854 }
855
DoGetDevices(MessageParcel &data, MessageParcel &reply, MessageOption &option)856 int32_t UsbServerStub::DoGetDevices(MessageParcel &data, MessageParcel &reply, MessageOption &option)
857 {
858 std::vector<UsbDevice> deviceList;
859 int32_t ret = GetDevices(deviceList);
860 if (ret != UEC_OK) {
861 USB_HILOGE(MODULE_SERVICE, "GetDevices failed ret = %{public}d", ret);
862 UsbReportSysEvent::ReportTransforFaultSysEvent("GetDevices", {0, 0}, {0, 0}, ret);
863 return ret;
864 }
865 USB_HILOGI(MODULE_SERVICE, "list size = %{public}zu", deviceList.size());
866 ret = SetDeviceListMessageParcel(deviceList, reply);
867 if (ret != UEC_OK) {
868 USB_HILOGE(MODULE_USB_INNERKIT, "SetDeviceListMessageParcel failed ret:%{public}d", ret);
869 }
870 return ret;
871 }
872
SetDeviceListMessageParcel(std::vector<UsbDevice> &deviceList, MessageParcel &data)873 int32_t UsbServerStub::SetDeviceListMessageParcel(std::vector<UsbDevice> &deviceList, MessageParcel &data)
874 {
875 int32_t deviceCount = (int32_t)deviceList.size();
876 WRITE_PARCEL_WITH_RET(data, Int32, deviceCount, UEC_SERVICE_WRITE_PARCEL_ERROR);
877 for (int32_t i = 0; i < deviceCount; ++i) {
878 UsbDevice &devInfo = deviceList[i];
879 int32_t ret = SetDeviceMessageParcel(devInfo, data);
880 if (ret) {
881 return ret;
882 }
883 }
884 return UEC_OK;
885 }
886
SetDeviceMessageParcel(UsbDevice &devInfo, MessageParcel &data)887 int32_t UsbServerStub::SetDeviceMessageParcel(UsbDevice &devInfo, MessageParcel &data)
888 {
889 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetBusNum(), UEC_SERVICE_WRITE_PARCEL_ERROR);
890 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetDevAddr(), UEC_SERVICE_WRITE_PARCEL_ERROR);
891
892 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetVendorId(), UEC_SERVICE_WRITE_PARCEL_ERROR);
893 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetProductId(), UEC_SERVICE_WRITE_PARCEL_ERROR);
894 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetClass(), UEC_SERVICE_WRITE_PARCEL_ERROR);
895 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetSubclass(), UEC_SERVICE_WRITE_PARCEL_ERROR);
896 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetProtocol(), UEC_SERVICE_WRITE_PARCEL_ERROR);
897 WRITE_PARCEL_WITH_RET(data, Uint8, devInfo.GetiManufacturer(), UEC_SERVICE_WRITE_PARCEL_ERROR);
898 WRITE_PARCEL_WITH_RET(data, Uint8, devInfo.GetiProduct(), UEC_SERVICE_WRITE_PARCEL_ERROR);
899 WRITE_PARCEL_WITH_RET(data, Uint8, devInfo.GetiSerialNumber(), UEC_SERVICE_WRITE_PARCEL_ERROR);
900 WRITE_PARCEL_WITH_RET(data, Uint8, devInfo.GetbMaxPacketSize0(), UEC_SERVICE_WRITE_PARCEL_ERROR);
901 WRITE_PARCEL_WITH_RET(data, Uint16, devInfo.GetbcdUSB(), UEC_SERVICE_WRITE_PARCEL_ERROR);
902 WRITE_PARCEL_WITH_RET(data, Uint16, devInfo.GetbcdDevice(), UEC_SERVICE_WRITE_PARCEL_ERROR);
903 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(devInfo.GetName()), UEC_SERVICE_WRITE_PARCEL_ERROR);
904 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(devInfo.GetManufacturerName()), UEC_SERVICE_WRITE_PARCEL_ERROR);
905 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(devInfo.GetProductName()), UEC_SERVICE_WRITE_PARCEL_ERROR);
906 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(devInfo.GetVersion()), UEC_SERVICE_WRITE_PARCEL_ERROR);
907 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(devInfo.GetmSerial()), UEC_SERVICE_WRITE_PARCEL_ERROR);
908
909 USB_HILOGE(MODULE_USB_INNERKIT, "devInfo:%{public}s", devInfo.ToString().c_str());
910 WRITE_PARCEL_WITH_RET(data, Int32, devInfo.GetConfigCount(), UEC_SERVICE_WRITE_PARCEL_ERROR);
911 return SetDeviceConfigsMessageParcel(devInfo.GetConfigs(), data);
912 }
913
SetDeviceConfigsMessageParcel(std::vector<USBConfig> &configs, MessageParcel &data)914 int32_t UsbServerStub::SetDeviceConfigsMessageParcel(std::vector<USBConfig> &configs, MessageParcel &data)
915 {
916 for (auto it = configs.begin(); it != configs.end(); ++it) {
917 USBConfig config = *it;
918 WRITE_PARCEL_WITH_RET(data, Int32, config.GetId(), UEC_SERVICE_WRITE_PARCEL_ERROR);
919 WRITE_PARCEL_WITH_RET(data, Uint32, config.GetAttributes(), UEC_SERVICE_WRITE_PARCEL_ERROR);
920 WRITE_PARCEL_WITH_RET(data, Int32, config.GetMaxPower(), UEC_SERVICE_WRITE_PARCEL_ERROR);
921
922 WRITE_PARCEL_WITH_RET(data, Uint8, config.GetiConfiguration(), UEC_SERVICE_WRITE_PARCEL_ERROR);
923 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(config.GetName()), UEC_SERVICE_WRITE_PARCEL_ERROR);
924
925 WRITE_PARCEL_WITH_RET(data, Uint32, config.GetInterfaceCount(), UEC_SERVICE_WRITE_PARCEL_ERROR);
926 USB_HILOGI(MODULE_USB_SERVICE, "devInfo=%{public}s", config.ToString().c_str());
927 int32_t ret = SetDeviceInterfacesMessageParcel(config.GetInterfaces(), data);
928 if (ret) {
929 return ret;
930 }
931 }
932 return UEC_OK;
933 }
934
SetDeviceInterfacesMessageParcel(std::vector<UsbInterface> &interfaces, MessageParcel &data)935 int32_t UsbServerStub::SetDeviceInterfacesMessageParcel(std::vector<UsbInterface> &interfaces, MessageParcel &data)
936 {
937 for (auto it = interfaces.begin(); it != interfaces.end(); ++it) {
938 UsbInterface interface = *it;
939 WRITE_PARCEL_WITH_RET(data, Int32, interface.GetId(), UEC_SERVICE_WRITE_PARCEL_ERROR);
940 WRITE_PARCEL_WITH_RET(data, Int32, interface.GetClass(), UEC_SERVICE_WRITE_PARCEL_ERROR);
941 WRITE_PARCEL_WITH_RET(data, Int32, interface.GetSubClass(), UEC_SERVICE_WRITE_PARCEL_ERROR);
942 WRITE_PARCEL_WITH_RET(data, Int32, interface.GetAlternateSetting(), UEC_SERVICE_WRITE_PARCEL_ERROR);
943 WRITE_PARCEL_WITH_RET(data, Int32, interface.GetProtocol(), UEC_SERVICE_WRITE_PARCEL_ERROR);
944
945 WRITE_PARCEL_WITH_RET(data, Uint8, interface.GetiInterface(), UEC_SERVICE_WRITE_PARCEL_ERROR);
946 WRITE_PARCEL_WITH_RET(data, String16, Str8ToStr16(interface.GetName()), UEC_SERVICE_WRITE_PARCEL_ERROR);
947
948 WRITE_PARCEL_WITH_RET(data, Int32, interface.GetEndpointCount(), UEC_SERVICE_WRITE_PARCEL_ERROR);
949 USB_HILOGI(MODULE_USB_SERVICE, "interface=%{public}s", interface.ToString().c_str());
950 int32_t ret = SetDeviceEndpointsMessageParcel(interface.GetEndpoints(), data);
951 if (ret) {
952 return ret;
953 }
954 }
955 return UEC_OK;
956 }
957
SetDeviceEndpointsMessageParcel(std::vector<USBEndpoint> &eps, MessageParcel &data)958 int32_t UsbServerStub::SetDeviceEndpointsMessageParcel(std::vector<USBEndpoint> &eps, MessageParcel &data)
959 {
960 for (auto it = eps.begin(); it != eps.end(); ++it) {
961 USBEndpoint ep = *it;
962 WRITE_PARCEL_WITH_RET(data, Uint32, ep.GetAddress(), UEC_SERVICE_WRITE_PARCEL_ERROR);
963 WRITE_PARCEL_WITH_RET(data, Uint32, ep.GetAttributes(), UEC_SERVICE_WRITE_PARCEL_ERROR);
964 WRITE_PARCEL_WITH_RET(data, Int32, ep.GetInterval(), UEC_SERVICE_WRITE_PARCEL_ERROR);
965 WRITE_PARCEL_WITH_RET(data, Int32, ep.GetMaxPacketSize(), UEC_SERVICE_WRITE_PARCEL_ERROR);
966 USB_HILOGI(MODULE_USB_SERVICE, "ep=%{public}s", ep.ToString().c_str());
967 }
968 return UEC_OK;
969 }
970
DoRegBulkCallback(MessageParcel &data, MessageParcel &reply, MessageOption &option)971 int32_t UsbServerStub::DoRegBulkCallback(MessageParcel &data, MessageParcel &reply, MessageOption &option)
972 {
973 uint8_t busNum = 0;
974 uint8_t devAddr = 0;
975 uint8_t interface = 0;
976 uint8_t endpoint = 0;
977 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
978 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
979 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
980 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
981 const sptr<IRemoteObject> cb = data.ReadRemoteObject();
982 const UsbDev tmpDev = {busNum, devAddr};
983 const UsbPipe tmpPipe = {interface, endpoint};
984 int32_t ret = RegBulkCallback(tmpDev, tmpPipe, cb);
985 if (ret != UEC_OK) {
986 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
987 return ret;
988 }
989 return ret;
990 }
991
DoUnRegBulkCallback(MessageParcel &data, MessageParcel &reply, MessageOption &option)992 int32_t UsbServerStub::DoUnRegBulkCallback(MessageParcel &data, MessageParcel &reply, MessageOption &option)
993 {
994 uint8_t busNum = 0;
995 uint8_t devAddr = 0;
996 uint8_t interface = 0;
997 uint8_t endpoint = 0;
998 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
999 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1000 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
1001 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
1002 const UsbDev tmpDev = {busNum, devAddr};
1003 const UsbPipe tmpPipe = {interface, endpoint};
1004 int32_t ret = UnRegBulkCallback(tmpDev, tmpPipe);
1005 if (ret != UEC_OK) {
1006 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1007 return ret;
1008 }
1009 return ret;
1010 }
1011
DoBulkRead(MessageParcel &data, MessageParcel &reply, MessageOption &option)1012 int32_t UsbServerStub::DoBulkRead(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1013 {
1014 HITRACE_METER_NAME(HITRACE_TAG_USB, "BulkRead");
1015 uint8_t busNum = 0;
1016 uint8_t devAddr = 0;
1017 uint8_t interface = 0;
1018 uint8_t endpoint = 0;
1019 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
1020 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1021 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
1022 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
1023 sptr<Ashmem> ashmem = data.ReadAshmem();
1024 const UsbDev tmpDev = {busNum, devAddr};
1025 const UsbPipe tmpPipe = {interface, endpoint};
1026 int32_t ret = BulkRead(tmpDev, tmpPipe, ashmem);
1027 if (ret != UEC_OK) {
1028 USB_HILOGE(MODULE_USBD, "BulkRead failed ret:%{public}d", ret);
1029 UsbReportSysEvent::ReportTransforFaultSysEvent("BulkRead", tmpDev, tmpPipe, ret);
1030 return ret;
1031 }
1032 return ret;
1033 }
1034
DoBulkWrite(MessageParcel &data, MessageParcel &reply, MessageOption &option)1035 int32_t UsbServerStub::DoBulkWrite(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1036 {
1037 HITRACE_METER_NAME(HITRACE_TAG_USB, "BulkWrite");
1038 uint8_t busNum = 0;
1039 uint8_t devAddr = 0;
1040 uint8_t interface = 0;
1041 uint8_t endpoint = 0;
1042 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
1043 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1044 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
1045 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
1046 sptr<Ashmem> ashmem = data.ReadAshmem();
1047 const UsbDev tmpDev = {busNum, devAddr};
1048 const UsbPipe tmpPipe = {interface, endpoint};
1049 int32_t ret = BulkWrite(tmpDev, tmpPipe, ashmem);
1050 if (ret != UEC_OK) {
1051 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1052 UsbReportSysEvent::ReportTransforFaultSysEvent("BulkWrite", tmpDev, tmpPipe, ret);
1053 return ret;
1054 }
1055 return ret;
1056 }
1057
DoBulkCancel(MessageParcel &data, MessageParcel &reply, MessageOption &option)1058 int32_t UsbServerStub::DoBulkCancel(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1059 {
1060 uint8_t busNum = 0;
1061 uint8_t devAddr = 0;
1062 uint8_t interface = 0;
1063 uint8_t endpoint = 0;
1064 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
1065 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1066 READ_PARCEL_WITH_RET(data, Uint8, interface, UEC_SERVICE_WRITE_PARCEL_ERROR);
1067 READ_PARCEL_WITH_RET(data, Uint8, endpoint, UEC_SERVICE_WRITE_PARCEL_ERROR);
1068 const UsbDev tmpDev = {busNum, devAddr};
1069 const UsbPipe tmpPipe = {interface, endpoint};
1070 int32_t ret = BulkCancel(tmpDev, tmpPipe);
1071 if (ret != UEC_OK) {
1072 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1073 return ret;
1074 }
1075 return ret;
1076 }
1077
DoAddRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)1078 int32_t UsbServerStub::DoAddRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1079 {
1080 std::string bundleName;
1081 std::string deviceName;
1082 READ_PARCEL_WITH_RET(data, String, bundleName, UEC_SERVICE_READ_PARCEL_ERROR);
1083 READ_PARCEL_WITH_RET(data, String, deviceName, UEC_SERVICE_READ_PARCEL_ERROR);
1084 int32_t ret = AddRight(bundleName, deviceName);
1085 if (ret != UEC_OK) {
1086 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1087 }
1088 return ret;
1089 }
1090
DoAddAccessRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)1091 int32_t UsbServerStub::DoAddAccessRight(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1092 {
1093 std::string tokenId;
1094 std::string deviceName;
1095 READ_PARCEL_WITH_RET(data, String, tokenId, UEC_SERVICE_READ_PARCEL_ERROR);
1096 READ_PARCEL_WITH_RET(data, String, deviceName, UEC_SERVICE_READ_PARCEL_ERROR);
1097 int32_t ret = AddAccessRight(tokenId, deviceName);
1098 if (ret != UEC_OK) {
1099 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1100 }
1101 return ret;
1102 }
1103
DoManageGlobalInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)1104 int32_t UsbServerStub::DoManageGlobalInterface(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1105 {
1106 bool disable = false;
1107 READ_PARCEL_WITH_RET(data, Bool, disable, UEC_SERVICE_READ_PARCEL_ERROR);
1108 int32_t ret = ManageGlobalInterface(disable);
1109 if (ret != UEC_OK) {
1110 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1111 }
1112 return ret;
1113 }
1114
DoManageDevice(MessageParcel &data, MessageParcel &reply, MessageOption &option)1115 int32_t UsbServerStub::DoManageDevice(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1116 {
1117 int32_t vendorId = 0;
1118 int32_t productId = 0;
1119 bool disable = false;
1120 READ_PARCEL_WITH_RET(data, Int32, vendorId, UEC_SERVICE_READ_PARCEL_ERROR);
1121 READ_PARCEL_WITH_RET(data, Int32, productId, UEC_SERVICE_READ_PARCEL_ERROR);
1122 READ_PARCEL_WITH_RET(data, Bool, disable, UEC_SERVICE_READ_PARCEL_ERROR);
1123 int32_t ret = ManageDevice(vendorId, productId, disable);
1124 if (ret != UEC_OK) {
1125 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1126 }
1127 return ret;
1128 }
1129
DoManageInterfaceType(MessageParcel &data, MessageParcel &reply, MessageOption &option)1130 int32_t UsbServerStub::DoManageInterfaceType(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1131 {
1132 int32_t count;
1133 READ_PARCEL_WITH_RET(data, Int32, count, UEC_SERVICE_READ_PARCEL_ERROR);
1134 bool disable = false;
1135 std::vector<UsbDeviceType> disableType;
1136 if (count > MAX_EDM_LIST_SIZE) {
1137 USB_HILOGE(MODULE_USBD, "count:%{public}d", count);
1138 return UEC_SERVICE_READ_PARCEL_ERROR;
1139 }
1140 for (int32_t i = 0; i < count; ++i) {
1141 UsbDeviceType usbDeviceType;
1142 READ_PARCEL_WITH_RET(data, Int32, usbDeviceType.baseClass, UEC_SERVICE_READ_PARCEL_ERROR);
1143 READ_PARCEL_WITH_RET(data, Int32, usbDeviceType.subClass, UEC_SERVICE_READ_PARCEL_ERROR);
1144 READ_PARCEL_WITH_RET(data, Int32, usbDeviceType.protocol, UEC_SERVICE_READ_PARCEL_ERROR);
1145 READ_PARCEL_WITH_RET(data, Bool, usbDeviceType.isDeviceType, UEC_SERVICE_READ_PARCEL_ERROR);
1146 disableType.emplace_back(usbDeviceType);
1147 }
1148 READ_PARCEL_WITH_RET(data, Bool, disable, UEC_SERVICE_READ_PARCEL_ERROR);
1149 int32_t ret = ManageInterfaceType(disableType, disable);
1150 if (ret != UEC_OK) {
1151 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1152 }
1153 return ret;
1154 }
1155
DoClearHalt(MessageParcel &data, MessageParcel &reply, MessageOption &option)1156 int32_t UsbServerStub::DoClearHalt(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1157 {
1158 HITRACE_METER_NAME(HITRACE_TAG_USB, "ClearHalt");
1159 uint8_t busNum = 0;
1160 uint8_t devAddr = 0;
1161 uint8_t interfaceId = 0;
1162 uint8_t endpointId = 0;
1163 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
1164 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1165 READ_PARCEL_WITH_RET(data, Uint8, interfaceId, UEC_SERVICE_WRITE_PARCEL_ERROR);
1166 READ_PARCEL_WITH_RET(data, Uint8, endpointId, UEC_SERVICE_WRITE_PARCEL_ERROR);
1167 int32_t ret = ClearHalt(busNum, devAddr, interfaceId, endpointId);
1168 WRITE_PARCEL_WITH_RET(reply, Int32, ret, UEC_SERVICE_WRITE_PARCEL_ERROR);
1169 return UEC_OK;
1170 }
1171
DoGetInterfaceActiveStatus(MessageParcel &data, MessageParcel &reply, MessageOption &option)1172 int32_t UsbServerStub::DoGetInterfaceActiveStatus(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1173 {
1174 uint8_t busNum = 0;
1175 uint8_t devAddr = 0;
1176 uint8_t interfaceId = 0;
1177 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
1178 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1179 READ_PARCEL_WITH_RET(data, Uint8, interfaceId, UEC_SERVICE_WRITE_PARCEL_ERROR);
1180 bool unactivated;
1181 int32_t ret = GetInterfaceActiveStatus(busNum, devAddr, interfaceId, unactivated);
1182 if (ret == UEC_OK) {
1183 WRITE_PARCEL_WITH_RET(reply, Bool, unactivated, UEC_SERVICE_WRITE_PARCEL_ERROR);
1184 } else {
1185 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1186 }
1187 return ret;
1188 }
1189
DoGetDeviceSpeed(MessageParcel &data, MessageParcel &reply, MessageOption &option)1190 int32_t UsbServerStub::DoGetDeviceSpeed(MessageParcel &data, MessageParcel &reply, MessageOption &option)
1191 {
1192 uint8_t busNum = 0;
1193 uint8_t devAddr = 0;
1194 READ_PARCEL_WITH_RET(data, Uint8, busNum, UEC_SERVICE_WRITE_PARCEL_ERROR);
1195 READ_PARCEL_WITH_RET(data, Uint8, devAddr, UEC_SERVICE_WRITE_PARCEL_ERROR);
1196 uint8_t speed;
1197 int32_t ret = GetDeviceSpeed(busNum, devAddr, speed);
1198 if (ret == UEC_OK) {
1199 WRITE_PARCEL_WITH_RET(reply, Uint8, speed, UEC_SERVICE_WRITE_PARCEL_ERROR);
1200 } else {
1201 USB_HILOGE(MODULE_USBD, "ret:%{public}d", ret);
1202 }
1203 USB_HILOGE(MODULE_USBD, "DoGetDeviceSpeed speed:%{public}u", speed);
1204 return ret;
1205 }
1206
1207 } // namespace USB
1208 } // namespace OHOS
1209