Exemplo n.º 1
0
void process(void* arg)
{
    struct msghdr       msg;
    struct iovec        iov;
    struct sockaddr_in  addr;
    int                 ret;

    while(1) {
        iov.iov_base=&buffer;
        iov.iov_len=sizeof(nanosecs_t);
        msg.msg_name=&addr;
        msg.msg_namelen=sizeof(addr);
        msg.msg_iov=&iov;
        msg.msg_iovlen=1;
        msg.msg_control=NULL;
        msg.msg_controllen=0;

        ret = recvmsg_rt(sock, &msg, 0);
        if ( (ret <= 0) || (msg.msg_namelen != sizeof(struct sockaddr_in)) )
            return;

        memcpy(&tx_msg, &buffer, sizeof(nanosecs_t));

        sendto_rt(sock, &tx_msg, reply_size, 0,
                  (struct sockaddr *)&client_addr,
                  sizeof(struct sockaddr_in));
    }
}
Exemplo n.º 2
0
void sync_callback(struct rtdm_dev_context *dummy, void* arg)
{
    struct msghdr      msg;


    irq_count = 0;

    memset(&msg, 0, sizeof(msg));
    msg.msg_name       = NULL;
    msg.msg_namelen    = 0;
    msg.msg_iov        = NULL;
    msg.msg_iovlen     = 0;
    msg.msg_control    = NULL;
    msg.msg_controllen = 0;

    recvmsg_rt(sock, &msg, 0);
}
void echo_rcv(void *arg)
{
    int                 ret;
    struct msghdr       msg;
    struct iovec        iov;
    struct sockaddr_in  addr;


    while (1) {
        iov.iov_base=&buffer;
        iov.iov_len=BUFSIZE;

        msg.msg_name=&addr;
        msg.msg_namelen=sizeof(addr);
        msg.msg_iov=&iov;
        msg.msg_iovlen=1;
        msg.msg_control=NULL;
        msg.msg_controllen=0;

        ret = recvmsg_rt(sock, &msg, 0);

        if ((ret > 0) && (msg.msg_namelen == sizeof(struct sockaddr_in))) {
            union { unsigned long l; unsigned char c[4]; } rcv;
            struct sockaddr_in *sin = msg.msg_name;

            outb(0xEF, PAR_DATA);
            outb(0xFF, PAR_DATA);

            /* get the time    */
            rx_time = rt_get_time_ns();
            memcpy (&tx_time, buffer, sizeof(RTIME));

            rtf_put(PRINT_FIFO, &rx_time, sizeof(RTIME));
            rtf_put(PRINT_FIFO, &tx_time, sizeof(RTIME));

            /* copy the address */
            rcv.l = sin->sin_addr.s_addr;
        }
    }
}
Exemplo n.º 4
0
void recv_msg(void *arg)
{
    int ret;
    struct msghdr msg;
    struct iovec iov[2];
    unsigned short msgsize = size;
    struct sockaddr_in addr;


    while (1) {
        iov[0].iov_base = &msgsize;
        iov[0].iov_len  = sizeof(msgsize);
        iov[1].iov_base = buffer_in;
        iov[1].iov_len  = size;

        memset(&msg, 0, sizeof(msg));
        msg.msg_name    = &addr;
        msg.msg_namelen = sizeof(addr);
        msg.msg_iov     = iov;
        msg.msg_iovlen  = 2;

        ret = recvmsg_rt(sock, &msg, 0);
        if (ret <= 0) {
            rt_printf(" recvmsg_rt() = %d\n", ret);
            return;
        } else {
            unsigned long ip = ntohl(addr.sin_addr.s_addr);

            rt_printf("received packet from %lu.%lu.%lu.%lu, length: %d+2, "
                "encoded length: %d,\n flags: %X, content %s\n", ip >> 24,
                (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF,
                ret-sizeof(msgsize), msgsize, msg.msg_flags,
                (memcmp(buffer_in, buffer_out, ret-sizeof(msgsize)) == 0) ?
                    "ok" : "corrupted");
        }
    }
}