int rpc_call(struct rpc *r, uint32_t msg_id, const void *in_arg, size_t in_len, void *out_arg, size_t out_len) { if (!r) { loge("invalid parament!\n"); return -1; } size_t pkt_len = pack_msg(&r->send_pkt, msg_id, in_arg, in_len); if (pkt_len == 0) { loge("pack_msg failed!\n"); return -1; } if (0 > rpc_send(r, in_arg, in_len)) { loge("skt_send failed, fd = %d!\n", r->fd); return -1; } if (IS_RPC_MSG_NEED_RETURN(msg_id)) { if (thread_sem_wait(r->dispatch_thread, 2000) == -1) { loge("wait response failed %d:%s\n", errno, strerror(errno)); return -1; } logi("recv_pkt.len = %d\n", r->recv_pkt.header.payload_len); memcpy(out_arg, r->recv_pkt.payload, out_len); } else { } return 0; }
void init_pipe(uint8_t dev, uint8_t type, uint8_t dir, usb_pipe_t * req_p) { while (!resp || !connect); resp->call_vtbl->pipe_req(resp, dev, type, dir); thread_sem_wait(&sync); *(req_p) = pipe; }
struct rpc *rpc_create(const char *host, uint16_t port) { char local_ip[INET_ADDRSTRLEN]; char remote_ip[INET_ADDRSTRLEN]; struct rpc *r = CALLOC(1, struct rpc); if (!r) { loge("malloc failed!\n"); return NULL; } memset(&r->recv_pkt, 0, sizeof(struct rpc_packet)); struct skt_connection *connect; connect = skt_tcp_connect(host, port); if (!connect) { loge("connect failed!\n"); return NULL; } r->fd = connect->fd; if (-1 == skt_set_block(r->fd)) { loge("skt_set_block failed!\n"); } r->evbase = gevent_base_create(); if (!r->evbase) { loge("gevent_base_create failed!\n"); return NULL; } rpc_set_cb(r, on_read, on_write, on_error, r); r->dispatch_thread = thread_create("rpc_dispatch", rpc_dispatch_thread, r); r->state = rpc_inited; if (thread_sem_wait(r->dispatch_thread, 2000) == -1) { loge("wait response failed %d:%s\n", errno, strerror(errno)); return NULL; } skt_addr_ntop(local_ip, connect->local.ip); skt_addr_ntop(remote_ip, connect->remote.ip); logi("rpc[%08x] connect information:\n", r->send_pkt.header.uuid_src); logi("local addr = %s:%d\n", local_ip, connect->local.port); logi("remote addr = %s:%d\n", remote_ip, connect->remote.port); return r; }