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)); } }
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; } } }
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"); } } }