Home | History | Annotate | Download | only in adb
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef __ADB_H
     18 #define __ADB_H
     19 
     20 #include <limits.h>
     21 #include <sys/types.h>
     22 
     23 #include <string>
     24 
     25 #include <android-base/macros.h>
     26 
     27 #include "adb_trace.h"
     28 #include "fdevent.h"
     29 #include "socket.h"
     30 
     31 constexpr size_t MAX_PAYLOAD_V1 = 4 * 1024;
     32 constexpr size_t MAX_PAYLOAD_V2 = 256 * 1024;
     33 constexpr size_t MAX_PAYLOAD = MAX_PAYLOAD_V2;
     34 
     35 #define A_SYNC 0x434e5953
     36 #define A_CNXN 0x4e584e43
     37 #define A_OPEN 0x4e45504f
     38 #define A_OKAY 0x59414b4f
     39 #define A_CLSE 0x45534c43
     40 #define A_WRTE 0x45545257
     41 #define A_AUTH 0x48545541
     42 
     43 // ADB protocol version.
     44 #define A_VERSION 0x01000000
     45 
     46 // Used for help/version information.
     47 #define ADB_VERSION_MAJOR 1
     48 #define ADB_VERSION_MINOR 0
     49 
     50 std::string adb_version();
     51 
     52 // Increment this when we want to force users to start a new adb server.
     53 #define ADB_SERVER_VERSION 36
     54 
     55 class atransport;
     56 struct usb_handle;
     57 
     58 struct amessage {
     59     unsigned command;       /* command identifier constant      */
     60     unsigned arg0;          /* first argument                   */
     61     unsigned arg1;          /* second argument                  */
     62     unsigned data_length;   /* length of payload (0 is allowed) */
     63     unsigned data_check;    /* checksum of data payload         */
     64     unsigned magic;         /* command ^ 0xffffffff             */
     65 };
     66 
     67 struct apacket
     68 {
     69     apacket *next;
     70 
     71     unsigned len;
     72     unsigned char *ptr;
     73 
     74     amessage msg;
     75     unsigned char data[MAX_PAYLOAD];
     76 };
     77 
     78 /* the adisconnect structure is used to record a callback that
     79 ** will be called whenever a transport is disconnected (e.g. by the user)
     80 ** this should be used to cleanup objects that depend on the
     81 ** transport (e.g. remote sockets, listeners, etc...)
     82 */
     83 struct  adisconnect
     84 {
     85     void        (*func)(void*  opaque, atransport*  t);
     86     void*         opaque;
     87 };
     88 
     89 
     90 // A transport object models the connection to a remote device or emulator there
     91 // is one transport per connected device/emulator. A "local transport" connects
     92 // through TCP (for the emulator), while a "usb transport" through USB (for real
     93 // devices).
     94 //
     95 // Note that kTransportHost doesn't really correspond to a real transport
     96 // object, it's a special value used to indicate that a client wants to connect
     97 // to a service implemented within the ADB server itself.
     98 enum TransportType {
     99     kTransportUsb,
    100     kTransportLocal,
    101     kTransportAny,
    102     kTransportHost,
    103 };
    104 
    105 #define TOKEN_SIZE 20
    106 
    107 enum ConnectionState {
    108     kCsAny = -1,
    109     kCsOffline = 0,
    110     kCsBootloader,
    111     kCsDevice,
    112     kCsHost,
    113     kCsRecovery,
    114     kCsNoPerm,  // Insufficient permissions to communicate with the device.
    115     kCsSideload,
    116     kCsUnauthorized,
    117 };
    118 
    119 /* A listener is an entity which binds to a local port
    120 ** and, upon receiving a connection on that port, creates
    121 ** an asocket to connect the new local connection to a
    122 ** specific remote service.
    123 **
    124 ** TODO: some listeners read from the new connection to
    125 ** determine what exact service to connect to on the far
    126 ** side.
    127 */
    128 struct alistener
    129 {
    130     alistener *next;
    131     alistener *prev;
    132 
    133     fdevent fde;
    134     int fd;
    135 
    136     char *local_name;
    137     char *connect_to;
    138     atransport *transport;
    139     adisconnect  disconnect;
    140 };
    141 
    142 
    143 void print_packet(const char *label, apacket *p);
    144 
    145 // These use the system (v)fprintf, not the adb prefixed ones defined in sysdeps.h, so they
    146 // shouldn't be tagged with ADB_FORMAT_ARCHETYPE.
    147 void fatal(const char* fmt, ...) __attribute__((noreturn, format(__printf__, 1, 2)));
    148 void fatal_errno(const char* fmt, ...) __attribute__((noreturn, format(__printf__, 1, 2)));
    149 
    150 void handle_packet(apacket *p, atransport *t);
    151 
    152 void get_my_path(char *s, size_t maxLen);
    153 int launch_server(int server_port);
    154 int adb_server_main(int is_daemon, int server_port, int ack_reply_fd);
    155 
    156 /* initialize a transport object's func pointers and state */
    157 #if ADB_HOST
    158 int get_available_local_transport_index();
    159 #endif
    160 int  init_socket_transport(atransport *t, int s, int port, int local);
    161 void init_usb_transport(atransport *t, usb_handle *usb, ConnectionState state);
    162 
    163 #if ADB_HOST
    164 atransport* find_emulator_transport_by_adb_port(int adb_port);
    165 #endif
    166 
    167 int service_to_fd(const char* name, const atransport* transport);
    168 #if ADB_HOST
    169 asocket *host_service_to_socket(const char*  name, const char *serial);
    170 #endif
    171 
    172 #if !ADB_HOST
    173 int       init_jdwp(void);
    174 asocket*  create_jdwp_service_socket();
    175 asocket*  create_jdwp_tracker_service_socket();
    176 int       create_jdwp_connection_fd(int  jdwp_pid);
    177 #endif
    178 
    179 int handle_forward_request(const char* service, TransportType type, const char* serial, int reply_fd);
    180 
    181 #if !ADB_HOST
    182 void framebuffer_service(int fd, void *cookie);
    183 void set_verity_enabled_state_service(int fd, void* cookie);
    184 #endif
    185 
    186 /* packet allocator */
    187 apacket *get_apacket(void);
    188 void put_apacket(apacket *p);
    189 
    190 // Define it if you want to dump packets.
    191 #define DEBUG_PACKETS 0
    192 
    193 #if !DEBUG_PACKETS
    194 #define print_packet(tag,p) do {} while (0)
    195 #endif
    196 
    197 #if ADB_HOST_ON_TARGET
    198 /* adb and adbd are coexisting on the target, so use 5038 for adb
    199  * to avoid conflicting with adbd's usage of 5037
    200  */
    201 #  define DEFAULT_ADB_PORT 5038
    202 #else
    203 #  define DEFAULT_ADB_PORT 5037
    204 #endif
    205 
    206 #define DEFAULT_ADB_LOCAL_TRANSPORT_PORT 5555
    207 
    208 #define ADB_CLASS              0xff
    209 #define ADB_SUBCLASS           0x42
    210 #define ADB_PROTOCOL           0x1
    211 
    212 
    213 void local_init(int port);
    214 void local_connect(int port);
    215 int  local_connect_arbitrary_ports(int console_port, int adb_port, std::string* error);
    216 
    217 // USB host/client interface.
    218 void usb_init();
    219 int usb_write(usb_handle *h, const void *data, int len);
    220 int usb_read(usb_handle *h, void *data, int len);
    221 int usb_close(usb_handle *h);
    222 void usb_kick(usb_handle *h);
    223 
    224 // USB device detection.
    225 #if ADB_HOST
    226 int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
    227 #endif
    228 
    229 int adb_commandline(int argc, const char **argv);
    230 
    231 ConnectionState connection_state(atransport *t);
    232 
    233 extern const char* adb_device_banner;
    234 
    235 #if !ADB_HOST
    236 extern int SHELL_EXIT_NOTIFY_FD;
    237 #endif // !ADB_HOST
    238 
    239 #define CHUNK_SIZE (64*1024)
    240 
    241 #if !ADB_HOST
    242 #define USB_ADB_PATH     "/dev/android_adb"
    243 
    244 #define USB_FFS_ADB_PATH  "/dev/usb-ffs/adb/"
    245 #define USB_FFS_ADB_EP(x) USB_FFS_ADB_PATH#x
    246 
    247 #define USB_FFS_ADB_EP0   USB_FFS_ADB_EP(ep0)
    248 #define USB_FFS_ADB_OUT   USB_FFS_ADB_EP(ep1)
    249 #define USB_FFS_ADB_IN    USB_FFS_ADB_EP(ep2)
    250 #endif
    251 
    252 int handle_host_request(const char* service, TransportType type, const char* serial, int reply_fd, asocket *s);
    253 
    254 void handle_online(atransport *t);
    255 void handle_offline(atransport *t);
    256 
    257 void send_connect(atransport *t);
    258 
    259 void parse_banner(const std::string&, atransport* t);
    260 
    261 #endif
    262