Example #1
0
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;
}
Example #3
0
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;
}