Lines Matching +full:ls +full:- +full:remote

8  *      http://www.apache.org/licenses/LICENSE-2.0
35 #include <android-base/strings.h>
38 #include <android-base/properties.h>
69 if (s->id != local_id) { in find_local_socket()
72 if (peer_id == 0 || (s->peer && s->peer->id == peer_id)) { in find_local_socket()
84 s->id = local_socket_next_id++; in install_local_socket()
97 list->erase(std::remove_if(list->begin(), list->end(), [s](asocket* x) { return x == s; }), in remove_socket()
98 list->end()); in remove_socket()
103 /* this is a little gross, but since s->close() *will* modify in close_all_sockets()
109 if (s->transport == t || (s->peer && s->peer->transport == t)) { in close_all_sockets()
110 s->close(s); in close_all_sockets()
123 D("LS(%u) %s: %zu bytes in queue", s->id, __func__, s->packet_queue.size()); in local_socket_flush_incoming()
125 if (!s->packet_queue.empty()) { in local_socket_flush_incoming()
126 std::vector<adb_iovec> iov = s->packet_queue.iovecs(); in local_socket_flush_incoming()
127 ssize_t rc = adb_writev(s->fd, iov.data(), iov.size()); in local_socket_flush_incoming()
128 D("LS(%u) %s: rc = %zd", s->id, __func__, rc); in local_socket_flush_incoming()
131 if (static_cast<size_t>(rc) == s->packet_queue.size()) { in local_socket_flush_incoming()
132 s->packet_queue.clear(); in local_socket_flush_incoming()
134 s->packet_queue.drop_front(rc); in local_socket_flush_incoming()
136 } else if (rc == -1 && errno == EAGAIN) { in local_socket_flush_incoming()
142 s->has_write_error = true; in local_socket_flush_incoming()
146 bool fd_full = !s->packet_queue.empty() && !s->has_write_error; in local_socket_flush_incoming()
147 if (s->transport && s->peer) { in local_socket_flush_incoming()
148 if (s->available_send_bytes.has_value()) { in local_socket_flush_incoming()
150 send_ready(s->id, s->peer->id, s->transport, bytes_flushed); in local_socket_flush_incoming()
154 if (bytes_flushed != 0 && s->packet_queue.size() < MAX_PAYLOAD) { in local_socket_flush_incoming()
155 send_ready(s->id, s->peer->id, s->transport, 0); in local_socket_flush_incoming()
161 if (s->closing && !fd_full) { in local_socket_flush_incoming()
162 s->close(s); in local_socket_flush_incoming()
167 fdevent_add(s->fde, FDE_WRITE); in local_socket_flush_incoming()
170 fdevent_del(s->fde, FDE_WRITE); in local_socket_flush_incoming()
175 // Returns false if the socket has been closed and destroyed as a side-effect of this function.
177 const size_t max_payload = s->get_max_payload(); in local_socket_flush_outgoing()
186 r = adb_read(s->fd, x, avail); in local_socket_flush_outgoing()
187 D("LS(%d): post adb_read(fd=%d,...) r=%d (errno=%d) avail=%zu", s->id, s->fd, r, in local_socket_flush_outgoing()
189 if (r == -1) { in local_socket_flush_outgoing()
194 avail -= r; in local_socket_flush_outgoing()
203 D("LS(%d): fd=%d post avail loop. r=%d is_eof=%d", s->id, s->fd, r, is_eof); in local_socket_flush_outgoing()
205 if (avail != max_payload && s->peer) { in local_socket_flush_outgoing()
206 data.resize(max_payload - avail); in local_socket_flush_outgoing()
208 // s->peer->enqueue() may call s->close() and free s, in local_socket_flush_outgoing()
210 unsigned saved_id = s->id; in local_socket_flush_outgoing()
211 int saved_fd = s->fd; in local_socket_flush_outgoing()
213 if (s->available_send_bytes) { in local_socket_flush_outgoing()
214 *s->available_send_bytes -= data.size(); in local_socket_flush_outgoing()
217 r = s->peer->enqueue(s->peer, std::move(data)); in local_socket_flush_outgoing()
218 D("LS(%u): fd=%d post peer->enqueue(). r=%d", saved_id, saved_fd, r); in local_socket_flush_outgoing()
221 // Error return means they closed us as a side-effect and we must in local_socket_flush_outgoing()
231 if (s->available_send_bytes) { in local_socket_flush_outgoing()
232 if (*s->available_send_bytes <= 0) { in local_socket_flush_outgoing()
233 D("LS(%u): send buffer full (%" PRId64 ")", saved_id, *s->available_send_bytes); in local_socket_flush_outgoing()
234 fdevent_del(s->fde, FDE_READ); in local_socket_flush_outgoing()
237 D("LS(%u): acks not deferred, blocking", saved_id); in local_socket_flush_outgoing()
238 fdevent_del(s->fde, FDE_READ); in local_socket_flush_outgoing()
245 s->close(s); in local_socket_flush_outgoing()
253 D("LS(%d): enqueue %zu", s->id, data.size()); in local_socket_enqueue()
255 s->packet_queue.append(std::move(data)); in local_socket_enqueue()
258 return -1; in local_socket_enqueue()
267 return !s->packet_queue.empty(); in local_socket_enqueue()
273 fdevent_add(s->fde, FDE_READ); in local_socket_ready()
280 // The standard (RFC 1122 - 4.2.2.13) says that if we call close on a
296 while ((rc = adb_read(fde->fd.get(), buf, sizeof(buf))) > 0) { in deferred_close()
300 if (rc == -1 && errno == EAGAIN) { in deferred_close()
302 auto duration = std::chrono::steady_clock::now() - socket_info->begin; in deferred_close()
329 int exit_on_close = s->exit_on_close; in local_socket_destroy()
331 D("LS(%d): destroying fde.fd=%d", s->id, s->fd); in local_socket_destroy()
333 deferred_close(fdevent_release(s->fde)); in local_socket_destroy()
345 D("entered local_socket_close. LS(%d) fd=%d", s->id, s->fd); in local_socket_close()
347 if (s->peer) { in local_socket_close()
348 D("LS(%d): closing peer. peer->id=%d peer->fd=%d", s->id, s->peer->id, s->peer->fd); in local_socket_close()
350 * the peer, this ensures that remote sockets can still get the id in local_socket_close()
353 if (s->peer->shutdown) { in local_socket_close()
354 s->peer->shutdown(s->peer); in local_socket_close()
356 s->peer->peer = nullptr; in local_socket_close()
357 s->peer->close(s->peer); in local_socket_close()
358 s->peer = nullptr; in local_socket_close()
364 if (s->closing || s->has_write_error || s->packet_queue.empty()) { in local_socket_close()
365 int id = s->id; in local_socket_close()
367 D("LS(%d): closed", id); in local_socket_close()
373 D("LS(%d): closing", s->id); in local_socket_close()
374 s->closing = true; in local_socket_close()
375 fdevent_del(s->fde, FDE_READ); in local_socket_close()
377 D("LS(%d): put on socket_closing_list fd=%d", s->id, s->fd); in local_socket_close()
379 CHECK_EQ(FDE_WRITE, s->fde->state & FDE_WRITE); in local_socket_close()
384 D("LS(%d): event_func(fd=%d(==%d), ev=%04x)", s->id, s->fd, fd, ev); in local_socket_event_func()
413 D("LS(%d): FDE_ERROR (fd=%d)", s->id, s->fd); in local_socket_event_func()
423 if (s->available_send_bytes.has_value() != acked_bytes.has_value()) { in local_socket_ack()
424 LOG(ERROR) << "delayed ack mismatch: socket = " << s->available_send_bytes.has_value() in local_socket_ack()
429 if (s->available_send_bytes.has_value()) { in local_socket_ack()
430 D("LS(%d) received delayed ack, available bytes: %" PRId64 " += %" PRIu32, s->id, in local_socket_ack()
431 *s->available_send_bytes, *acked_bytes); in local_socket_ack()
433 // This can't (reasonably) overflow: available_send_bytes is 64-bit. in local_socket_ack()
434 *s->available_send_bytes += *acked_bytes; in local_socket_ack()
435 if (*s->available_send_bytes > 0) { in local_socket_ack()
436 s->ready(s); in local_socket_ack()
439 D("LS(%d) received ack", s->id); in local_socket_ack()
440 s->ready(s); in local_socket_ack()
447 s->fd = fd; in create_local_socket()
448 s->enqueue = local_socket_enqueue; in create_local_socket()
449 s->ready = local_socket_ready; in create_local_socket()
450 s->shutdown = nullptr; in create_local_socket()
451 s->close = local_socket_close; in create_local_socket()
454 s->fde = fdevent_create(fd, local_socket_event_func, s); in create_local_socket()
455 D("LS(%d): created (fd=%d)", s->id, s->fd); in create_local_socket()
472 s->transport = transport; in create_local_service_socket()
473 LOG(VERBOSE) << "LS(" << s->id << "): bound to '" << name << "' via " << fd_value; in create_local_service_socket()
479 D("LS(%d): enabling exit_on_close", s->id); in create_local_service_socket()
480 s->exit_on_close = 1; in create_local_service_socket()
488 D("entered remote_socket_enqueue RS(%d) WRITE fd=%d peer.fd=%d", s->id, s->fd, s->peer->fd); in remote_socket_enqueue()
491 p->msg.command = A_WRTE; in remote_socket_enqueue()
492 p->msg.arg0 = s->peer->id; in remote_socket_enqueue()
493 p->msg.arg1 = s->id; in remote_socket_enqueue()
497 return -1; in remote_socket_enqueue()
500 p->payload = std::move(data); in remote_socket_enqueue()
501 p->msg.data_length = p->payload.size(); in remote_socket_enqueue()
503 send_packet(p, s->transport); in remote_socket_enqueue()
508 D("entered remote_socket_ready RS(%d) OKAY fd=%d peer.fd=%d", s->id, s->fd, s->peer->fd); in remote_socket_ready()
510 p->msg.command = A_OKAY; in remote_socket_ready()
511 p->msg.arg0 = s->peer->id; in remote_socket_ready()
512 p->msg.arg1 = s->id; in remote_socket_ready()
513 send_packet(p, s->transport); in remote_socket_ready()
517 D("entered remote_socket_shutdown RS(%d) CLOSE fd=%d peer->fd=%d", s->id, s->fd, in remote_socket_shutdown()
518 s->peer ? s->peer->fd : -1); in remote_socket_shutdown()
520 p->msg.command = A_CLSE; in remote_socket_shutdown()
521 if (s->peer) { in remote_socket_shutdown()
522 p->msg.arg0 = s->peer->id; in remote_socket_shutdown()
524 p->msg.arg1 = s->id; in remote_socket_shutdown()
525 send_packet(p, s->transport); in remote_socket_shutdown()
529 if (s->peer) { in remote_socket_close()
530 s->peer->peer = nullptr; in remote_socket_close()
531 D("RS(%d) peer->close()ing peer->id=%d peer->fd=%d", s->id, s->peer->id, s->peer->fd); in remote_socket_close()
532 s->peer->close(s->peer); in remote_socket_close()
534 D("entered remote_socket_close RS(%d) CLOSE fd=%d peer->fd=%d", s->id, s->fd, in remote_socket_close()
535 s->peer ? s->peer->fd : -1); in remote_socket_close()
536 D("RS(%d): closed", s->id); in remote_socket_close()
540 // Create a remote socket to exchange packets with a remote service through transport
542 // side of the transport (it is allocated by the remote side and _cannot_ be 0).
543 // Returns a new non-NULL asocket handle.
546 LOG(FATAL) << "invalid remote socket id (0)"; in create_remote_socket()
549 s->id = id; in create_remote_socket()
550 s->enqueue = remote_socket_enqueue; in create_remote_socket()
551 s->ready = remote_socket_ready; in create_remote_socket()
552 s->shutdown = remote_socket_shutdown; in create_remote_socket()
553 s->close = remote_socket_close; in create_remote_socket()
554 s->transport = t; in create_remote_socket()
556 D("RS(%d): created", s->id); in create_remote_socket()
563 // appropriate filter (to figure out whether the remote is in connect_to_remote()
565 s->transport->UpdateReverseConfig(destination); in connect_to_remote()
567 D("Connect_to_remote call RS(%d) fd=%d", s->id, s->fd); in connect_to_remote()
570 LOG(VERBOSE) << "LS(" << s->id << ": connect(" << destination << ")"; in connect_to_remote()
571 p->msg.command = A_OPEN; in connect_to_remote()
572 p->msg.arg0 = s->id; in connect_to_remote()
574 if (s->transport->SupportsDelayedAck()) { in connect_to_remote()
575 p->msg.arg1 = INITIAL_DELAYED_ACK_BYTES; in connect_to_remote()
576 s->available_send_bytes = 0; in connect_to_remote()
579 // adbd used to expect a null-terminated string. in connect_to_remote()
581 p->payload.resize(destination.size() + 1); in connect_to_remote()
582 memcpy(p->payload.data(), destination.data(), destination.size()); in connect_to_remote()
583 p->payload[destination.size()] = '\0'; in connect_to_remote()
584 p->msg.data_length = p->payload.size(); in connect_to_remote()
586 CHECK_LE(p->msg.data_length, s->get_max_payload()); in connect_to_remote()
588 send_packet(p, s->transport); in connect_to_remote()
593 send the go-ahead message when they connect */
595 s->ready = local_socket_ready; in local_socket_ready_notify()
596 s->shutdown = nullptr; in local_socket_ready_notify()
597 s->close = local_socket_close; in local_socket_ready_notify()
598 SendOkay(s->fd); in local_socket_ready_notify()
599 s->ready(s); in local_socket_ready_notify()
606 s->ready = local_socket_ready; in local_socket_close_notify()
607 s->shutdown = nullptr; in local_socket_close_notify()
608 s->close = local_socket_close; in local_socket_close_notify()
609 SendFail(s->fd, "closed"); in local_socket_close_notify()
610 s->close(s); in local_socket_close_notify()
616 while (len-- > 0) { in unhex()
628 c -= '0'; in unhex()
636 c = c - 'a' + 10; in unhex()
644 c = c - 'A' + 10; in unhex()
661 // Where <port> must be a base-10 number and <prefix> may be any of {usb,product,model,device}.
790 D("SS(%d): enqueue %zu", s->id, data.size()); in smart_socket_enqueue()
792 if (s->smart_socket_data.empty()) { in smart_socket_enqueue()
794 s->smart_socket_data.assign(data.begin(), data.end()); in smart_socket_enqueue()
796 std::copy(data.begin(), data.end(), std::back_inserter(s->smart_socket_data)); in smart_socket_enqueue()
800 if (s->smart_socket_data.size() < 4) { in smart_socket_enqueue()
804 uint32_t len = unhex(s->smart_socket_data.data(), 4); in smart_socket_enqueue()
806 D("SS(%d): bad size (%u)", s->id, len); in smart_socket_enqueue()
810 D("SS(%d): len is %u", s->id, len); in smart_socket_enqueue()
812 if ((len + 4) > s->smart_socket_data.size()) { in smart_socket_enqueue()
813 D("SS(%d): waiting for %zu more bytes", s->id, len + 4 - s->smart_socket_data.size()); in smart_socket_enqueue()
817 s->smart_socket_data[len + 4] = 0; in smart_socket_enqueue()
819 D("SS(%d): '%s'", s->id, (char*)(s->smart_socket_data.data() + 4)); in smart_socket_enqueue()
821 service = std::string_view(s->smart_socket_data).substr(4); in smart_socket_enqueue()
826 if (android::base::ConsumePrefix(&service, "host-serial:")) { in smart_socket_enqueue()
829 LOG(ERROR) << "SS(" << s->id << "): failed to parse host service: " << service; in smart_socket_enqueue()
832 } else if (android::base::ConsumePrefix(&service, "host-transport-id:")) { in smart_socket_enqueue()
834 LOG(ERROR) << "SS(" << s->id << "): failed to parse host transport id: " << service; in smart_socket_enqueue()
835 return -1; in smart_socket_enqueue()
838 LOG(ERROR) << "SS(" << s->id << "): host-transport-id without command"; in smart_socket_enqueue()
839 return -1; in smart_socket_enqueue()
841 } else if (android::base::ConsumePrefix(&service, "host-usb:")) { in smart_socket_enqueue()
843 } else if (android::base::ConsumePrefix(&service, "host-local:")) { in smart_socket_enqueue()
854 // Some requests are handled immediately -- in that case the handle_host_request() routine in smart_socket_enqueue()
858 s->peer->fd, s); in smart_socket_enqueue()
862 LOG(VERBOSE) << "SS(" << s->id << "): handled host service '" << service << "'"; in smart_socket_enqueue()
866 D("SS(%d): okay transport", s->id); in smart_socket_enqueue()
867 s->smart_socket_data.clear(); in smart_socket_enqueue()
881 LOG(VERBOSE) << "SS(" << s->id << "): couldn't create host service '" << service << "'"; in smart_socket_enqueue()
883 SendFail(s->peer->fd, msg); in smart_socket_enqueue()
894 SendOkay(s->peer->fd); in smart_socket_enqueue()
896 s->peer->ready = local_socket_ready; in smart_socket_enqueue()
897 s->peer->shutdown = nullptr; in smart_socket_enqueue()
898 s->peer->close = local_socket_close; in smart_socket_enqueue()
899 s->peer->peer = s2; in smart_socket_enqueue()
900 s2->peer = s->peer; in smart_socket_enqueue()
901 s->peer = nullptr; in smart_socket_enqueue()
902 D("SS(%d): okay", s->id); in smart_socket_enqueue()
903 s->close(s); in smart_socket_enqueue()
906 s2->ready(s2); in smart_socket_enqueue()
910 if (!s->transport) { in smart_socket_enqueue()
911 SendFail(s->peer->fd, "device offline (no transport)"); in smart_socket_enqueue()
913 } else if (!ConnectionStateIsOnline(s->transport->GetConnectionState())) { in smart_socket_enqueue()
914 /* if there's no remote we fail the connection in smart_socket_enqueue()
917 SendFail(s->peer->fd, "device offline (transport offline)"); in smart_socket_enqueue()
926 s->peer->ready = local_socket_ready_notify; in smart_socket_enqueue()
927 s->peer->shutdown = nullptr; in smart_socket_enqueue()
928 s->peer->close = local_socket_close_notify; in smart_socket_enqueue()
929 s->peer->peer = nullptr; in smart_socket_enqueue()
931 s->peer->transport = s->transport; in smart_socket_enqueue()
933 connect_to_remote(s->peer, std::string_view(s->smart_socket_data).substr(4)); in smart_socket_enqueue()
934 s->peer = nullptr; in smart_socket_enqueue()
935 s->close(s); in smart_socket_enqueue()
939 /* we're going to close our peer as a side-effect, so in smart_socket_enqueue()
940 ** return -1 to signal that state to the local socket in smart_socket_enqueue()
943 s->close(s); in smart_socket_enqueue()
944 return -1; in smart_socket_enqueue()
948 D("SS(%d): ready", s->id); in smart_socket_ready()
952 D("SS(%d): closed", s->id); in smart_socket_close()
953 if (s->peer) { in smart_socket_close()
954 s->peer->peer = nullptr; in smart_socket_close()
955 s->peer->close(s->peer); in smart_socket_close()
956 s->peer = nullptr; in smart_socket_close()
964 s->enqueue = smart_socket_enqueue; in create_smart_socket()
965 s->ready = smart_socket_ready; in create_smart_socket()
966 s->shutdown = nullptr; in create_smart_socket()
967 s->close = smart_socket_close; in create_smart_socket()
969 D("SS(%d)", s->id); in create_smart_socket()
976 s->peer = ss; in connect_to_smartsocket()
977 ss->peer = s; in connect_to_smartsocket()
978 s->ready(s); in connect_to_smartsocket()
985 max_payload = std::min(max_payload, transport->get_max_payload()); in get_max_payload()
987 if (peer && peer->transport) { in get_max_payload()
988 max_payload = std::min(max_payload, peer->transport->get_max_payload()); in get_max_payload()