static int find_transports(char **serial_out, const char *prefix);
static void unregister_all_tcp_transports();
static void connect_emulator(char* host, int port, char* buf, int buf_len);
+static size_t sdbsock_get_max_payload(SDB_SOCKET *s);
typedef struct stinfo stinfo;
struct stinfo {
// else {
x = p->data;
// }
- size_t avail = MAX_PAYLOAD;
+ const size_t max_payload = sdbsock_get_max_payload(s);
+ size_t avail = max_payload;
int r = 1;
while(avail > 0) {
break;
}
- if(avail == MAX_PAYLOAD) {
+ if(avail == max_payload) {
put_apacket(p);
} else {
- p->len = MAX_PAYLOAD - avail;
+ p->len = max_payload - avail;
if(peer_enqueue(s, p) < 0) {
//local socket is already closed by peer or should not close the socket.
{
D("LS(%X)\n", s->local_id);
PACKET *p = get_apacket();
- int len = strlen(destination) + 1;
+ size_t len = strlen(destination) + 1;
- if(len > (MAX_PAYLOAD-1)) {
+ if(len > (sdbsock_get_max_payload(s)-1)) {
LOG_FATAL("destination oversized\n");
}
}
#ifdef MAKE_DEBUG
else if(!strncmp(service, "send-packet", strlen("send-packet"))) {
- char data[MAX_PAYLOAD] = {'1', };
+ char data[MAX_PAYLOAD_V1] = {'1', };
send_cmd(0, 0, 0x00000000, data, t);
sendokmsg(socket->fd, "send_packet OK!");
return 0;
}
else {
PACKET* socket_packet = s->pkt_list->data;
- if((socket_packet->len + (*p)->len) > MAX_PAYLOAD) {
+ if((socket_packet->len + (*p)->len) > sdbsock_get_max_payload(s)) {
LOG_ERROR("LS(%x): overflow\n", s->local_id);
put_apacket(*p);
return -1;
snprintf(buf, buf_len, "connecting to %s ...", serial);
}
+
+static size_t sdbsock_get_max_payload(SDB_SOCKET *s) {
+ size_t max_payload = MAX_PAYLOAD;
+ if (s->transport) {
+ max_payload = min(max_payload, s->transport->max_payload);
+ }
+ return max_payload;
+}
static void parse_banner(char *banner, TRANSPORT *t);
static void wakeup_select(T_PACKET* t_packet);
static void encoding_packet(PACKET* p);
-static int check_header(PACKET *p);
+static int check_header(PACKET *p, TRANSPORT *t);
static int check_data(PACKET *p);
static void dump_hex( const unsigned char* ptr, size_t len);
len += 4;
return len;
}
+static void update_version(TRANSPORT *t, int version, size_t payload)
+{
+ size_t max_payload = MAX_PAYLOAD;
+
+ /* TODO : enable the size up for USB transport */
+ if (t->type == kTransportUsb) {
+ max_payload = MAX_PAYLOAD_V1;
+ }
+
+ D("remote transport version=%x, max_payload=%d\n", version, payload);
+ t->protocol_version = min(version, A_VERSION);
+ t->max_payload = min(payload, max_payload);
+ D("update transport version. version=%x, max_payload=%d\n", t->protocol_version, t->max_payload);
+}
void update_transports(void)
{
t->connection_state = CS_WAITCNXN;
// allow the device some time to send the connect message
sdb_sleep_ms(1000);
- send_cmd(A_VERSION, MAX_PAYLOAD, A_CNXN, "host::", t);
+ send_cmd(t->protocol_version, t->max_payload, A_CNXN, "host::", t);
t->connection_state = CS_OFFLINE;
// allow the device some time to respond to the connect message
sdb_sleep_ms(1000);
if(t->read_from_remote(t, &p->msg, sizeof(MESSAGE))) {
break;
}
- if(check_header(p)) {
+ if(check_header(p, t)) {
break;
}
if(p->msg.data_length) {
D("T(%s), device name: '%s'\n", t->serial, t->device_name);
sdb_thread_t transport_thread_ptr;
+ t->protocol_version = A_VERSION;
+ t->max_payload = MAX_PAYLOAD;
+
//transport is updated by transport_thread, we do not have to update here.
if(sdb_thread_create(&transport_thread_ptr, transport_thread, t)){
LOG_FATAL("cannot create output thread\n");
return 0;
}
-static int check_header(PACKET *p)
+static int check_header(PACKET *p, TRANSPORT *t)
{
if(p->msg.magic != (p->msg.command ^ 0xffffffff)) {
LOG_ERROR("check_header(): invalid magic\n");
return -1;
}
- if(p->msg.data_length > MAX_PAYLOAD) {
- LOG_ERROR("check_header(): %d > MAX_PAYLOAD\n", p->msg.data_length);
+ if(p->msg.data_length > t->max_payload) {
+ LOG_ERROR("check_header(): %d > transport->max_payload(%d)\n", p->msg.data_length, t->max_payload);
return -1;
}
// t->connection_state = CS_OFFLINE;
// run_transport_close(t);
// }
+ update_version(t, p->msg.arg0, p->msg.arg1);
parse_banner((char*) p->data, t);
}
else if(cmd == A_STAT) {
apacket *p = get_apacket();
int ret;
- ret = adb_auth_get_userkey(p->data, sizeof(p->data));
+ ret = adb_auth_get_userkey(p->data, MAX_PAYLOAD_V1);
if (!ret) {
D("Failed to get user public key\n");
put_apacket(p);