adb.h revision 0e7c4274c687446dbe30a814278d7a6b99da8c4e
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
22#define MAX_PAYLOAD 4096
23
24#define A_SYNC 0x434e5953
25#define A_CNXN 0x4e584e43
26#define A_OPEN 0x4e45504f
27#define A_OKAY 0x59414b4f
28#define A_CLSE 0x45534c43
29#define A_WRTE 0x45545257
30
31#define A_VERSION 0x01000000        // ADB protocol version
32
33#define ADB_VERSION_MAJOR 1         // Used for help/version information
34#define ADB_VERSION_MINOR 0         // Used for help/version information
35
36#define ADB_SERVER_VERSION    26    // Increment this when we want to force users to start a new adb server
37
38typedef struct amessage amessage;
39typedef struct apacket apacket;
40typedef struct asocket asocket;
41typedef struct alistener alistener;
42typedef struct aservice aservice;
43typedef struct atransport atransport;
44typedef struct adisconnect  adisconnect;
45typedef struct usb_handle usb_handle;
46
47struct amessage {
48    unsigned command;       /* command identifier constant      */
49    unsigned arg0;          /* first argument                   */
50    unsigned arg1;          /* second argument                  */
51    unsigned data_length;   /* length of payload (0 is allowed) */
52    unsigned data_check;    /* checksum of data payload         */
53    unsigned magic;         /* command ^ 0xffffffff             */
54};
55
56struct apacket
57{
58    apacket *next;
59
60    unsigned len;
61    unsigned char *ptr;
62
63    amessage msg;
64    unsigned char data[MAX_PAYLOAD];
65};
66
67/* An asocket represents one half of a connection between a local and
68** remote entity.  A local asocket is bound to a file descriptor.  A
69** remote asocket is bound to the protocol engine.
70*/
71struct asocket {
72        /* chain pointers for the local/remote list of
73        ** asockets that this asocket lives in
74        */
75    asocket *next;
76    asocket *prev;
77
78        /* the unique identifier for this asocket
79        */
80    unsigned id;
81
82        /* flag: set when the socket's peer has closed
83        ** but packets are still queued for delivery
84        */
85    int    closing;
86
87        /* the asocket we are connected to
88        */
89
90    asocket *peer;
91
92        /* For local asockets, the fde is used to bind
93        ** us to our fd event system.  For remote asockets
94        ** these fields are not used.
95        */
96    fdevent fde;
97    int fd;
98
99        /* queue of apackets waiting to be written
100        */
101    apacket *pkt_first;
102    apacket *pkt_last;
103
104        /* enqueue is called by our peer when it has data
105        ** for us.  It should return 0 if we can accept more
106        ** data or 1 if not.  If we return 1, we must call
107        ** peer->ready() when we once again are ready to
108        ** receive data.
109        */
110    int (*enqueue)(asocket *s, apacket *pkt);
111
112        /* ready is called by the peer when it is ready for
113        ** us to send data via enqueue again
114        */
115    void (*ready)(asocket *s);
116
117        /* close is called by the peer when it has gone away.
118        ** we are not allowed to make any further calls on the
119        ** peer once our close method is called.
120        */
121    void (*close)(asocket *s);
122
123        /* socket-type-specific extradata */
124    void *extra;
125
126    	/* A socket is bound to atransport */
127    atransport *transport;
128};
129
130
131/* the adisconnect structure is used to record a callback that
132** will be called whenever a transport is disconnected (e.g. by the user)
133** this should be used to cleanup objects that depend on the
134** transport (e.g. remote sockets, listeners, etc...)
135*/
136struct  adisconnect
137{
138    void        (*func)(void*  opaque, atransport*  t);
139    void*         opaque;
140    adisconnect*  next;
141    adisconnect*  prev;
142};
143
144
145/* a transport object models the connection to a remote device or emulator
146** there is one transport per connected device/emulator. a "local transport"
147** connects through TCP (for the emulator), while a "usb transport" through
148** USB (for real devices)
149**
150** note that kTransportHost doesn't really correspond to a real transport
151** object, it's a special value used to indicate that a client wants to
152** connect to a service implemented within the ADB server itself.
153*/
154typedef enum transport_type {
155        kTransportUsb,
156        kTransportLocal,
157        kTransportAny,
158        kTransportHost,
159} transport_type;
160
161struct atransport
162{
163    atransport *next;
164    atransport *prev;
165
166    int (*read_from_remote)(apacket *p, atransport *t);
167    int (*write_to_remote)(apacket *p, atransport *t);
168    void (*close)(atransport *t);
169    void (*kick)(atransport *t);
170
171    int fd;
172    int transport_socket;
173    fdevent transport_fde;
174    int ref_count;
175    unsigned sync_token;
176    int connection_state;
177    transport_type type;
178
179        /* usb handle or socket fd as needed */
180    usb_handle *usb;
181    int sfd;
182
183        /* used to identify transports for clients */
184    char *serial;
185    char *product;
186    int adb_port; // Use for emulators (local transport)
187
188        /* a list of adisconnect callbacks called when the transport is kicked */
189    int          kicked;
190    adisconnect  disconnects;
191};
192
193
194/* A listener is an entity which binds to a local port
195** and, upon receiving a connection on that port, creates
196** an asocket to connect the new local connection to a
197** specific remote service.
198**
199** TODO: some listeners read from the new connection to
200** determine what exact service to connect to on the far
201** side.
202*/
203struct alistener
204{
205    alistener *next;
206    alistener *prev;
207
208    fdevent fde;
209    int fd;
210
211    const char *local_name;
212    const char *connect_to;
213    atransport *transport;
214    adisconnect  disconnect;
215};
216
217
218void print_packet(const char *label, apacket *p);
219
220asocket *find_local_socket(unsigned id);
221void install_local_socket(asocket *s);
222void remove_socket(asocket *s);
223void close_all_sockets(atransport *t);
224
225#define  LOCAL_CLIENT_PREFIX  "emulator-"
226
227asocket *create_local_socket(int fd);
228asocket *create_local_service_socket(const char *destination);
229
230asocket *create_remote_socket(unsigned id, atransport *t);
231void connect_to_remote(asocket *s, const char *destination);
232void connect_to_smartsocket(asocket *s);
233
234void fatal(const char *fmt, ...);
235void fatal_errno(const char *fmt, ...);
236
237void handle_packet(apacket *p, atransport *t);
238void send_packet(apacket *p, atransport *t);
239
240void get_my_path(char *s, size_t maxLen);
241int launch_server(int server_port);
242int adb_main(int is_daemon, int server_port);
243
244
245/* transports are ref-counted
246** get_device_transport does an acquire on your behalf before returning
247*/
248void init_transport_registration(void);
249int  list_transports(char *buf, size_t  bufsize);
250void update_transports(void);
251
252asocket*  create_device_tracker(void);
253
254/* Obtain a transport from the available transports.
255** If state is != CS_ANY, only transports in that state are considered.
256** If serial is non-NULL then only the device with that serial will be chosen.
257** If no suitable transport is found, error is set.
258*/
259atransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char **error_out);
260void   add_transport_disconnect( atransport*  t, adisconnect*  dis );
261void   remove_transport_disconnect( atransport*  t, adisconnect*  dis );
262void   run_transport_disconnects( atransport*  t );
263void   kick_transport( atransport*  t );
264
265/* initialize a transport object's func pointers and state */
266#if ADB_HOST
267int get_available_local_transport_index();
268#endif
269int  init_socket_transport(atransport *t, int s, int port, int local);
270void init_usb_transport(atransport *t, usb_handle *usb, int state);
271
272/* for MacOS X cleanup */
273void close_usb_devices();
274
275/* cause new transports to be init'd and added to the list */
276void register_socket_transport(int s, const char *serial, int port, int local);
277
278/* these should only be used for the "adb disconnect" command */
279void unregister_transport(atransport *t);
280void unregister_all_tcp_transports();
281
282void register_usb_transport(usb_handle *h, const char *serial, unsigned writeable);
283
284/* this should only be used for transports with connection_state == CS_NOPERM */
285void unregister_usb_transport(usb_handle *usb);
286
287atransport *find_transport(const char *serial);
288#if ADB_HOST
289atransport* find_emulator_transport_by_adb_port(int adb_port);
290#endif
291
292int service_to_fd(const char *name);
293#if ADB_HOST
294asocket *host_service_to_socket(const char*  name, const char *serial);
295#endif
296
297#if !ADB_HOST
298int       init_jdwp(void);
299asocket*  create_jdwp_service_socket();
300asocket*  create_jdwp_tracker_service_socket();
301int       create_jdwp_connection_fd(int  jdwp_pid);
302#endif
303
304#if !ADB_HOST
305void framebuffer_service(int fd, void *cookie);
306void log_service(int fd, void *cookie);
307void remount_service(int fd, void *cookie);
308char * get_log_file_path(const char * log_name);
309#endif
310
311/* packet allocator */
312apacket *get_apacket(void);
313void put_apacket(apacket *p);
314
315int check_header(apacket *p);
316int check_data(apacket *p);
317
318/* convenience wrappers around read/write that will retry on
319** EINTR and/or short read/write.  Returns 0 on success, -1
320** on error or EOF.
321*/
322int readx(int fd, void *ptr, size_t len);
323int writex(int fd, const void *ptr, size_t len);
324
325/* define ADB_TRACE to 1 to enable tracing support, or 0 to disable it */
326
327#define  ADB_TRACE    1
328
329/* IMPORTANT: if you change the following list, don't
330 * forget to update the corresponding 'tags' table in
331 * the adb_trace_init() function implemented in adb.c
332 */
333typedef enum {
334    TRACE_ADB = 0,
335    TRACE_SOCKETS,
336    TRACE_PACKETS,
337    TRACE_TRANSPORT,
338    TRACE_RWX,
339    TRACE_USB,
340    TRACE_SYNC,
341    TRACE_SYSDEPS,
342    TRACE_JDWP,
343} AdbTrace;
344
345#if ADB_TRACE
346
347  int     adb_trace_mask;
348
349  void    adb_trace_init(void);
350
351#  define ADB_TRACING  ((adb_trace_mask & (1 << TRACE_TAG)) != 0)
352
353  /* you must define TRACE_TAG before using this macro */
354  #define  D(...)                                      \
355        do {                                           \
356            if (ADB_TRACING)                           \
357                fprintf(stderr, __VA_ARGS__ );         \
358        } while (0)
359#else
360#  define  D(...)          ((void)0)
361#  define  ADB_TRACING     0
362#endif
363
364
365#if !TRACE_PACKETS
366#define print_packet(tag,p) do {} while (0)
367#endif
368
369#if ADB_HOST_ON_TARGET
370/* adb and adbd are coexisting on the target, so use 5038 for adb
371 * to avoid conflicting with adbd's usage of 5037
372 */
373#  define DEFAULT_ADB_PORT 5038
374#else
375#  define DEFAULT_ADB_PORT 5037
376#endif
377
378#define DEFAULT_ADB_LOCAL_TRANSPORT_PORT 5555
379
380#define ADB_CLASS              0xff
381#define ADB_SUBCLASS           0x42
382#define ADB_PROTOCOL           0x1
383
384
385void local_init(int port);
386int  local_connect(int  port);
387int  local_connect_arbitrary_ports(int console_port, int adb_port);
388
389/* usb host/client interface */
390void usb_init();
391void usb_cleanup();
392int usb_write(usb_handle *h, const void *data, int len);
393int usb_read(usb_handle *h, void *data, int len);
394int usb_close(usb_handle *h);
395void usb_kick(usb_handle *h);
396
397/* used for USB device detection */
398#if ADB_HOST
399int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
400#endif
401
402unsigned host_to_le32(unsigned n);
403int adb_commandline(int argc, char **argv);
404
405int connection_state(atransport *t);
406
407#define CS_ANY       -1
408#define CS_OFFLINE    0
409#define CS_BOOTLOADER 1
410#define CS_DEVICE     2
411#define CS_HOST       3
412#define CS_RECOVERY   4
413#define CS_NOPERM     5 /* Insufficient permissions to communicate with the device */
414
415extern int HOST;
416
417#define CHUNK_SIZE (64*1024)
418
419int sendfailmsg(int fd, const char *reason);
420int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s);
421
422#endif
423