adb.h revision 7bf68842d765ad7e6a51426b625d0de6d2331740
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    21    // 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
187        /* a list of adisconnect callbacks called when the transport is kicked */
188    int          kicked;
189    adisconnect  disconnects;
190};
191
192
193/* A listener is an entity which binds to a local port
194** and, upon receiving a connection on that port, creates
195** an asocket to connect the new local connection to a
196** specific remote service.
197**
198** TODO: some listeners read from the new connection to
199** determine what exact service to connect to on the far
200** side.
201*/
202struct alistener
203{
204    alistener *next;
205    alistener *prev;
206
207    fdevent fde;
208    int fd;
209
210    const char *local_name;
211    const char *connect_to;
212    atransport *transport;
213    adisconnect  disconnect;
214};
215
216
217void print_packet(const char *label, apacket *p);
218
219asocket *find_local_socket(unsigned id);
220void install_local_socket(asocket *s);
221void remove_socket(asocket *s);
222void close_all_sockets(atransport *t);
223
224#define  LOCAL_CLIENT_PREFIX  "emulator-"
225
226asocket *create_local_socket(int fd);
227asocket *create_local_service_socket(const char *destination);
228
229asocket *create_remote_socket(unsigned id, atransport *t);
230void connect_to_remote(asocket *s, const char *destination);
231void connect_to_smartsocket(asocket *s);
232
233void fatal(const char *fmt, ...);
234void fatal_errno(const char *fmt, ...);
235
236void handle_packet(apacket *p, atransport *t);
237void send_packet(apacket *p, atransport *t);
238
239void get_my_path(char s[PATH_MAX]);
240int launch_server();
241int adb_main(int is_daemon);
242
243
244/* transports are ref-counted
245** get_device_transport does an acquire on your behalf before returning
246*/
247void init_transport_registration(void);
248int  list_transports(char *buf, size_t  bufsize);
249void update_transports(void);
250
251asocket*  create_device_tracker(void);
252
253/* Obtain a transport from the available transports.
254** If state is != CS_ANY, only transports in that state are considered.
255** If serial is non-NULL then only the device with that serial will be chosen.
256** If no suitable transport is found, error is set.
257*/
258atransport *acquire_one_transport(int state, transport_type ttype, const char* serial, char **error_out);
259void   add_transport_disconnect( atransport*  t, adisconnect*  dis );
260void   remove_transport_disconnect( atransport*  t, adisconnect*  dis );
261void   run_transport_disconnects( atransport*  t );
262void   kick_transport( atransport*  t );
263
264/* initialize a transport object's func pointers and state */
265int  init_socket_transport(atransport *t, int s, int port);
266void init_usb_transport(atransport *t, usb_handle *usb);
267
268/* for MacOS X cleanup */
269void close_usb_devices();
270
271/* cause new transports to be init'd and added to the list */
272void register_socket_transport(int s, const char *serial, int  port);
273void register_usb_transport(usb_handle *h, const char *serial);
274
275int service_to_fd(const char *name);
276#if ADB_HOST
277asocket *host_service_to_socket(const char*  name, const char *serial);
278#endif
279
280#if !ADB_HOST
281int       init_jdwp(void);
282asocket*  create_jdwp_service_socket();
283asocket*  create_jdwp_tracker_service_socket();
284int       create_jdwp_connection_fd(int  jdwp_pid);
285#endif
286
287#if !ADB_HOST
288void framebuffer_service(int fd, void *cookie);
289void log_service(int fd, void *cookie);
290void remount_service(int fd, void *cookie);
291char * get_log_file_path(const char * log_name);
292#endif
293
294/* packet allocator */
295apacket *get_apacket(void);
296void put_apacket(apacket *p);
297
298int check_header(apacket *p);
299int check_data(apacket *p);
300
301/* convenience wrappers around read/write that will retry on
302** EINTR and/or short read/write.  Returns 0 on success, -1
303** on error or EOF.
304*/
305int readx(int fd, void *ptr, size_t len);
306int writex(int fd, const void *ptr, size_t len);
307
308/* define ADB_TRACE to 1 to enable tracing support, or 0 to disable it */
309
310#define  ADB_TRACE    1
311
312/* IMPORTANT: if you change the following list, don't
313 * forget to update the corresponding 'tags' table in
314 * the adb_trace_init() function implemented in adb.c
315 */
316typedef enum {
317    TRACE_ADB = 0,
318    TRACE_SOCKETS,
319    TRACE_PACKETS,
320    TRACE_TRANSPORT,
321    TRACE_RWX,
322    TRACE_USB,
323    TRACE_SYNC,
324    TRACE_SYSDEPS,
325    TRACE_JDWP,
326} AdbTrace;
327
328#if ADB_TRACE
329
330  int     adb_trace_mask;
331
332  void    adb_trace_init(void);
333
334#  define ADB_TRACING  ((adb_trace_mask & (1 << TRACE_TAG)) != 0)
335
336  /* you must define TRACE_TAG before using this macro */
337  #define  D(...)                                      \
338        do {                                           \
339            if (ADB_TRACING)                           \
340                fprintf(stderr, __VA_ARGS__ );         \
341        } while (0)
342#else
343#  define  D(...)          ((void)0)
344#  define  ADB_TRACING     0
345#endif
346
347
348#if !TRACE_PACKETS
349#define print_packet(tag,p) do {} while (0)
350#endif
351
352#define ADB_PORT 5037
353#define ADB_LOCAL_TRANSPORT_PORT 5555
354
355#define ADB_CLASS              0xff
356#define ADB_SUBCLASS           0x42
357#define ADB_PROTOCOL           0x1
358
359
360void local_init();
361int  local_connect(int  port);
362
363/* usb host/client interface */
364void usb_init();
365void usb_cleanup();
366int usb_write(usb_handle *h, const void *data, int len);
367int usb_read(usb_handle *h, void *data, int len);
368int usb_close(usb_handle *h);
369void usb_kick(usb_handle *h);
370
371/* used for USB device detection */
372#if ADB_HOST
373int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
374#endif
375
376unsigned host_to_le32(unsigned n);
377int adb_commandline(int argc, char **argv);
378
379int connection_state(atransport *t);
380
381#define CS_ANY       -1
382#define CS_OFFLINE    0
383#define CS_BOOTLOADER 1
384#define CS_DEVICE     2
385#define CS_HOST       3
386#define CS_RECOVERY   4
387#define CS_ERROR      5
388
389extern int HOST;
390
391#define CHUNK_SIZE (64*1024)
392
393int sendfailmsg(int fd, const char *reason);
394int handle_host_request(char *service, transport_type ttype, char* serial, int reply_fd, asocket *s);
395
396#endif
397