| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/devtools/device/usb/android_usb_device.h" | 5 #include "chrome/browser/devtools/device/usb/android_usb_device.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/barrier_closure.h" | 9 #include "base/barrier_closure.h" |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| 11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "chrome/browser/devtools/device/usb/android_rsa.h" | 17 #include "chrome/browser/devtools/device/usb/android_rsa.h" |
| 18 #include "chrome/browser/devtools/device/usb/android_usb_socket.h" | 18 #include "chrome/browser/devtools/device/usb/android_usb_socket.h" |
| 19 #include "chrome/browser/usb/usb_device.h" | 19 #include "components/usb_service/usb_device.h" |
| 20 #include "chrome/browser/usb/usb_interface.h" | 20 #include "components/usb_service/usb_interface.h" |
| 21 #include "chrome/browser/usb/usb_service.h" | 21 #include "components/usb_service/usb_service.h" |
| 22 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 23 #include "crypto/rsa_private_key.h" | 23 #include "crypto/rsa_private_key.h" |
| 24 #include "net/base/ip_endpoint.h" | 24 #include "net/base/ip_endpoint.h" |
| 25 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
| 26 #include "net/socket/stream_socket.h" | 26 #include "net/socket/stream_socket.h" |
| 27 | 27 |
| 28 using usb_service::UsbConfigDescriptor; |
| 29 using usb_service::UsbDevice; |
| 30 using usb_service::UsbDeviceHandle; |
| 31 using usb_service::UsbInterfaceAltSettingDescriptor; |
| 32 using usb_service::UsbInterfaceDescriptor; |
| 33 using usb_service::UsbEndpointDescriptor; |
| 34 using usb_service::UsbService; |
| 35 using usb_service::UsbTransferStatus; |
| 36 |
| 28 namespace { | 37 namespace { |
| 29 | 38 |
| 30 const size_t kHeaderSize = 24; | 39 const size_t kHeaderSize = 24; |
| 31 | 40 |
| 32 const int kAdbClass = 0xff; | 41 const int kAdbClass = 0xff; |
| 33 const int kAdbSubclass = 0x42; | 42 const int kAdbSubclass = 0x42; |
| 34 const int kAdbProtocol = 0x1; | 43 const int kAdbProtocol = 0x1; |
| 35 | 44 |
| 36 const int kUsbTimeout = 0; | 45 const int kUsbTimeout = 0; |
| 37 | 46 |
| 38 const uint32 kMaxPayload = 4096; | 47 const uint32 kMaxPayload = 4096; |
| 39 const uint32 kVersion = 0x01000000; | 48 const uint32 kVersion = 0x01000000; |
| 40 | 49 |
| 41 static const char kHostConnectMessage[] = "host::"; | 50 static const char kHostConnectMessage[] = "host::"; |
| 42 | 51 |
| 43 using content::BrowserThread; | 52 using content::BrowserThread; |
| 44 | 53 |
| 45 typedef std::vector<scoped_refptr<UsbDevice> > UsbDevices; | 54 typedef std::vector<scoped_refptr<UsbDevice> > UsbDevices; |
| 46 typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet; | 55 typedef std::set<scoped_refptr<UsbDevice> > UsbDeviceSet; |
| 47 | 56 |
| 48 // Stores android wrappers around claimed usb devices on caller thread. | 57 // Stores android wrappers around claimed usb devices on caller thread. |
| 49 base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices = | 58 base::LazyInstance<std::vector<AndroidUsbDevice*> >::Leaky g_devices = |
| 50 LAZY_INSTANCE_INITIALIZER; | 59 LAZY_INSTANCE_INITIALIZER; |
| 51 | 60 |
| 52 bool IsAndroidInterface( | 61 bool IsAndroidInterface( |
| 53 scoped_refptr<const UsbInterfaceDescriptor> interface) { | 62 scoped_refptr<const usb_service::UsbInterfaceDescriptor> interface) { |
| 54 if (interface->GetNumAltSettings() == 0) | 63 if (interface->GetNumAltSettings() == 0) |
| 55 return false; | 64 return false; |
| 56 | 65 |
| 57 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = | 66 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = |
| 58 interface->GetAltSetting(0); | 67 interface->GetAltSetting(0); |
| 59 | 68 |
| 60 if (idesc->GetInterfaceClass() != kAdbClass || | 69 if (idesc->GetInterfaceClass() != kAdbClass || |
| 61 idesc->GetInterfaceSubclass() != kAdbSubclass || | 70 idesc->GetInterfaceSubclass() != kAdbSubclass || |
| 62 idesc->GetInterfaceProtocol() != kAdbProtocol || | 71 idesc->GetInterfaceProtocol() != kAdbProtocol || |
| 63 idesc->GetNumEndpoints() != 2) { | 72 idesc->GetNumEndpoints() != 2) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 74 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = | 83 scoped_refptr<const UsbInterfaceAltSettingDescriptor> idesc = |
| 75 interface->GetAltSetting(0); | 84 interface->GetAltSetting(0); |
| 76 | 85 |
| 77 int inbound_address = 0; | 86 int inbound_address = 0; |
| 78 int outbound_address = 0; | 87 int outbound_address = 0; |
| 79 int zero_mask = 0; | 88 int zero_mask = 0; |
| 80 | 89 |
| 81 for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) { | 90 for (size_t i = 0; i < idesc->GetNumEndpoints(); ++i) { |
| 82 scoped_refptr<const UsbEndpointDescriptor> edesc = | 91 scoped_refptr<const UsbEndpointDescriptor> edesc = |
| 83 idesc->GetEndpoint(i); | 92 idesc->GetEndpoint(i); |
| 84 if (edesc->GetTransferType() != USB_TRANSFER_BULK) | 93 if (edesc->GetTransferType() != usb_service::USB_TRANSFER_BULK) |
| 85 continue; | 94 continue; |
| 86 if (edesc->GetDirection() == USB_DIRECTION_INBOUND) | 95 if (edesc->GetDirection() == usb_service::USB_DIRECTION_INBOUND) |
| 87 inbound_address = edesc->GetAddress(); | 96 inbound_address = edesc->GetAddress(); |
| 88 else | 97 else |
| 89 outbound_address = edesc->GetAddress(); | 98 outbound_address = edesc->GetAddress(); |
| 90 zero_mask = edesc->GetMaximumPacketSize() - 1; | 99 zero_mask = edesc->GetMaximumPacketSize() - 1; |
| 91 } | 100 } |
| 92 | 101 |
| 93 if (inbound_address == 0 || outbound_address == 0) | 102 if (inbound_address == 0 || outbound_address == 0) |
| 94 return NULL; | 103 return NULL; |
| 95 | 104 |
| 96 if (!usb_handle->ClaimInterface(interface_id)) | 105 if (!usb_handle->ClaimInterface(interface_id)) |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 | 421 |
| 413 void AndroidUsbDevice::ProcessOutgoing() { | 422 void AndroidUsbDevice::ProcessOutgoing() { |
| 414 DCHECK(message_loop_ == base::MessageLoop::current()); | 423 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 415 | 424 |
| 416 if (outgoing_queue_.empty() || !usb_handle_) | 425 if (outgoing_queue_.empty() || !usb_handle_) |
| 417 return; | 426 return; |
| 418 | 427 |
| 419 BulkMessage message = outgoing_queue_.front(); | 428 BulkMessage message = outgoing_queue_.front(); |
| 420 outgoing_queue_.pop(); | 429 outgoing_queue_.pop(); |
| 421 DumpMessage(true, message.first->data(), message.second); | 430 DumpMessage(true, message.first->data(), message.second); |
| 422 usb_handle_->BulkTransfer(USB_DIRECTION_OUTBOUND, outbound_address_, | 431 usb_handle_->BulkTransfer( |
| 432 usb_service::USB_DIRECTION_OUTBOUND, outbound_address_, |
| 423 message.first, message.second, kUsbTimeout, | 433 message.first, message.second, kUsbTimeout, |
| 424 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, | 434 base::Bind(&AndroidUsbDevice::OutgoingMessageSent, |
| 425 weak_factory_.GetWeakPtr())); | 435 weak_factory_.GetWeakPtr())); |
| 426 } | 436 } |
| 427 | 437 |
| 428 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, | 438 void AndroidUsbDevice::OutgoingMessageSent(UsbTransferStatus status, |
| 429 scoped_refptr<net::IOBuffer> buffer, | 439 scoped_refptr<net::IOBuffer> buffer, |
| 430 size_t result) { | 440 size_t result) { |
| 431 DCHECK(message_loop_ == base::MessageLoop::current()); | 441 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 432 | 442 |
| 433 if (status != USB_TRANSFER_COMPLETED) | 443 if (status != usb_service::USB_TRANSFER_COMPLETED) |
| 434 return; | 444 return; |
| 435 message_loop_->PostTask(FROM_HERE, | 445 message_loop_->PostTask(FROM_HERE, |
| 436 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this)); | 446 base::Bind(&AndroidUsbDevice::ProcessOutgoing, this)); |
| 437 } | 447 } |
| 438 | 448 |
| 439 void AndroidUsbDevice::ReadHeader() { | 449 void AndroidUsbDevice::ReadHeader() { |
| 440 DCHECK(message_loop_ == base::MessageLoop::current()); | 450 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 441 | 451 |
| 442 if (!usb_handle_) | 452 if (!usb_handle_) |
| 443 return; | 453 return; |
| 444 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); | 454 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kHeaderSize); |
| 445 usb_handle_->BulkTransfer(USB_DIRECTION_INBOUND, inbound_address_, | 455 usb_handle_->BulkTransfer( |
| 456 usb_service::USB_DIRECTION_INBOUND, inbound_address_, |
| 446 buffer, kHeaderSize, kUsbTimeout, | 457 buffer, kHeaderSize, kUsbTimeout, |
| 447 base::Bind(&AndroidUsbDevice::ParseHeader, | 458 base::Bind(&AndroidUsbDevice::ParseHeader, |
| 448 weak_factory_.GetWeakPtr())); | 459 weak_factory_.GetWeakPtr())); |
| 449 } | 460 } |
| 450 | 461 |
| 451 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, | 462 void AndroidUsbDevice::ParseHeader(UsbTransferStatus status, |
| 452 scoped_refptr<net::IOBuffer> buffer, | 463 scoped_refptr<net::IOBuffer> buffer, |
| 453 size_t result) { | 464 size_t result) { |
| 454 DCHECK(message_loop_ == base::MessageLoop::current()); | 465 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 455 | 466 |
| 456 if (status == USB_TRANSFER_TIMEOUT) { | 467 if (status == usb_service::USB_TRANSFER_TIMEOUT) { |
| 457 message_loop_->PostTask(FROM_HERE, | 468 message_loop_->PostTask(FROM_HERE, |
| 458 base::Bind(&AndroidUsbDevice::ReadHeader, this)); | 469 base::Bind(&AndroidUsbDevice::ReadHeader, this)); |
| 459 return; | 470 return; |
| 460 } | 471 } |
| 461 | 472 |
| 462 if (status != USB_TRANSFER_COMPLETED || result != kHeaderSize) { | 473 if (status != usb_service::USB_TRANSFER_COMPLETED || result != kHeaderSize) { |
| 463 TransferError(status); | 474 TransferError(status); |
| 464 return; | 475 return; |
| 465 } | 476 } |
| 466 | 477 |
| 467 DumpMessage(false, buffer->data(), result); | 478 DumpMessage(false, buffer->data(), result); |
| 468 std::vector<uint32> header(6); | 479 std::vector<uint32> header(6); |
| 469 memcpy(&header[0], buffer->data(), result); | 480 memcpy(&header[0], buffer->data(), result); |
| 470 scoped_refptr<AdbMessage> message = | 481 scoped_refptr<AdbMessage> message = |
| 471 new AdbMessage(header[0], header[1], header[2], ""); | 482 new AdbMessage(header[0], header[1], header[2], ""); |
| 472 uint32 data_length = header[3]; | 483 uint32 data_length = header[3]; |
| 473 uint32 data_check = header[4]; | 484 uint32 data_check = header[4]; |
| 474 uint32 magic = header[5]; | 485 uint32 magic = header[5]; |
| 475 if ((message->command ^ 0xffffffff) != magic) { | 486 if ((message->command ^ 0xffffffff) != magic) { |
| 476 TransferError(USB_TRANSFER_ERROR); | 487 TransferError(usb_service::USB_TRANSFER_ERROR); |
| 477 return; | 488 return; |
| 478 } | 489 } |
| 479 | 490 |
| 480 if (data_length == 0) { | 491 if (data_length == 0) { |
| 481 message_loop_->PostTask(FROM_HERE, | 492 message_loop_->PostTask(FROM_HERE, |
| 482 base::Bind(&AndroidUsbDevice::HandleIncoming, this, | 493 base::Bind(&AndroidUsbDevice::HandleIncoming, this, |
| 483 message)); | 494 message)); |
| 484 return; | 495 return; |
| 485 } | 496 } |
| 486 | 497 |
| 487 message_loop_->PostTask(FROM_HERE, | 498 message_loop_->PostTask(FROM_HERE, |
| 488 base::Bind(&AndroidUsbDevice::ReadBody, this, | 499 base::Bind(&AndroidUsbDevice::ReadBody, this, |
| 489 message, data_length, data_check)); | 500 message, data_length, data_check)); |
| 490 } | 501 } |
| 491 | 502 |
| 492 void AndroidUsbDevice::ReadBody(scoped_refptr<AdbMessage> message, | 503 void AndroidUsbDevice::ReadBody(scoped_refptr<AdbMessage> message, |
| 493 uint32 data_length, | 504 uint32 data_length, |
| 494 uint32 data_check) { | 505 uint32 data_check) { |
| 495 DCHECK(message_loop_ == base::MessageLoop::current()); | 506 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 496 | 507 |
| 497 if (!usb_handle_) | 508 if (!usb_handle_) |
| 498 return; | 509 return; |
| 499 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); | 510 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data_length); |
| 500 usb_handle_->BulkTransfer(USB_DIRECTION_INBOUND, inbound_address_, | 511 usb_handle_->BulkTransfer( |
| 512 usb_service::USB_DIRECTION_INBOUND, inbound_address_, |
| 501 buffer, data_length, kUsbTimeout, | 513 buffer, data_length, kUsbTimeout, |
| 502 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), | 514 base::Bind(&AndroidUsbDevice::ParseBody, weak_factory_.GetWeakPtr(), |
| 503 message, data_length, data_check)); | 515 message, data_length, data_check)); |
| 504 } | 516 } |
| 505 | 517 |
| 506 void AndroidUsbDevice::ParseBody(scoped_refptr<AdbMessage> message, | 518 void AndroidUsbDevice::ParseBody(scoped_refptr<AdbMessage> message, |
| 507 uint32 data_length, | 519 uint32 data_length, |
| 508 uint32 data_check, | 520 uint32 data_check, |
| 509 UsbTransferStatus status, | 521 UsbTransferStatus status, |
| 510 scoped_refptr<net::IOBuffer> buffer, | 522 scoped_refptr<net::IOBuffer> buffer, |
| 511 size_t result) { | 523 size_t result) { |
| 512 DCHECK(message_loop_ == base::MessageLoop::current()); | 524 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 513 | 525 |
| 514 if (status == USB_TRANSFER_TIMEOUT) { | 526 if (status == usb_service::USB_TRANSFER_TIMEOUT) { |
| 515 message_loop_->PostTask(FROM_HERE, | 527 message_loop_->PostTask(FROM_HERE, |
| 516 base::Bind(&AndroidUsbDevice::ReadBody, this, | 528 base::Bind(&AndroidUsbDevice::ReadBody, this, |
| 517 message, data_length, data_check)); | 529 message, data_length, data_check)); |
| 518 return; | 530 return; |
| 519 } | 531 } |
| 520 | 532 |
| 521 if (status != USB_TRANSFER_COMPLETED || | 533 if (status != usb_service::USB_TRANSFER_COMPLETED || |
| 522 static_cast<uint32>(result) != data_length) { | 534 static_cast<uint32>(result) != data_length) { |
| 523 TransferError(status); | 535 TransferError(status); |
| 524 return; | 536 return; |
| 525 } | 537 } |
| 526 | 538 |
| 527 DumpMessage(false, buffer->data(), data_length); | 539 DumpMessage(false, buffer->data(), data_length); |
| 528 message->body = std::string(buffer->data(), result); | 540 message->body = std::string(buffer->data(), result); |
| 529 if (Checksum(message->body) != data_check) { | 541 if (Checksum(message->body) != data_check) { |
| 530 TransferError(USB_TRANSFER_ERROR); | 542 TransferError(usb_service::USB_TRANSFER_ERROR); |
| 531 return; | 543 return; |
| 532 } | 544 } |
| 533 | 545 |
| 534 message_loop_->PostTask(FROM_HERE, | 546 message_loop_->PostTask(FROM_HERE, |
| 535 base::Bind(&AndroidUsbDevice::HandleIncoming, this, | 547 base::Bind(&AndroidUsbDevice::HandleIncoming, this, |
| 536 message)); | 548 message)); |
| 537 } | 549 } |
| 538 | 550 |
| 539 void AndroidUsbDevice::HandleIncoming(scoped_refptr<AdbMessage> message) { | 551 void AndroidUsbDevice::HandleIncoming(scoped_refptr<AdbMessage> message) { |
| 540 DCHECK(message_loop_ == base::MessageLoop::current()); | 552 DCHECK(message_loop_ == base::MessageLoop::current()); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 BrowserThread::PostTask( | 643 BrowserThread::PostTask( |
| 632 BrowserThread::FILE, FROM_HERE, | 644 BrowserThread::FILE, FROM_HERE, |
| 633 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); | 645 base::Bind(&ReleaseInterface, usb_handle, interface_id_)); |
| 634 } | 646 } |
| 635 | 647 |
| 636 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { | 648 void AndroidUsbDevice::SocketDeleted(uint32 socket_id) { |
| 637 DCHECK(message_loop_ == base::MessageLoop::current()); | 649 DCHECK(message_loop_ == base::MessageLoop::current()); |
| 638 | 650 |
| 639 sockets_.erase(socket_id); | 651 sockets_.erase(socket_id); |
| 640 } | 652 } |
| OLD | NEW |