diff --git a/linux/avb/listener_mediaclock.c b/linux/avb/listener_mediaclock.c index 8d877518..fb103ac5 100644 --- a/linux/avb/listener_mediaclock.c +++ b/linux/avb/listener_mediaclock.c @@ -71,12 +71,38 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv // }; - fprintf(filepointer, "test 1\n");fflush(filepointer); - struct iovec iov = { stream_packet, BUFLEN }; - fprintf(filepointer, "test 2\n");fflush(filepointer); - struct msghdr msg = { (void*)((struct sockaddr *)(*si_other_avb)), slen_avb, &iov, 1, NULL, 0, 0 }; + struct msghdr msg; + struct cmsghdr *cmsg; + struct sockaddr_ll remote; + struct iovec sgentry; + struct { + struct cmsghdr cm; + char control[256]; + } control; + + + memset( &msg, 0, sizeof( msg )); + + msg.msg_iov = &sgentry; + msg.msg_iovlen = 1; + + sgentry.iov_base = stream_packet; + sgentry.iov_len = BUFLEN; + + memset( &remote, 0, sizeof(remote)); + msg.msg_name = (caddr_t) &remote; + msg.msg_namelen = sizeof( remote ); + msg.msg_control = &control; + msg.msg_controllen = sizeof(control); + + + + + +// struct iovec iov = { stream_packet, BUFLEN }; +// struct msghdr msg = { (void*)((struct sockaddr *)(*si_other_avb)), slen_avb, &iov, 1, NULL, 0, 0 }; + - fprintf(filepointer, "test 3\n");fflush(filepointer); int status = recvmsg((*avtp_transport_socket_fds)->fd, &msg, NULL); if (status == 0) { @@ -119,29 +145,42 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv fprintf(filepointer, "stream packet!\n");fflush(filepointer); - struct cmsghdr *cmsg;// = (struct cmsghdr *)malloc(sizeof(struct cmsghdr)); +// struct cmsghdr *cmsg;// = (struct cmsghdr *)malloc(sizeof(struct cmsghdr)); +// cmsg = CMSG_FIRSTHDR(&msg); +// fprintf(filepointer, "%d %d %d\n", cmsg->cmsg_len, cmsg->cmsg_level, cmsg->cmsg_type);fflush(filepointer); +// for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)){ +// fprintf(filepointer, "stream packet!: %d %d\n", cmsg->cmsg_level, cmsg->cmsg_type);fflush(filepointer); +// if (cmsg->cmsg_level != SOL_SOCKET) +// continue; +// switch (cmsg->cmsg_type){ +// case SO_TIMESTAMPING:{ +// struct timespec* stamp = (struct timespec*)CMSG_DATA(cmsg); // timestamp is found +// fprintf(filepointer, "Timestamp %ld sec %ld nanosec\n", stamp->tv_sec, stamp->tv_nsec);fflush(filepointer); +// return 0; +// break; +// } +// default: +// fprintf(filepointer, "no timestamp\n");fflush(filepointer); +// break; +// } +// } + + + // Retrieve the timestamp cmsg = CMSG_FIRSTHDR(&msg); - fprintf(filepointer, "%d %d %d\n", cmsg->cmsg_len, cmsg->cmsg_level, cmsg->cmsg_type);fflush(filepointer); - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)){ - fprintf(filepointer, "stream packet!: %d %d\n", cmsg->cmsg_level, cmsg->cmsg_type);fflush(filepointer); - if (cmsg->cmsg_level != SOL_SOCKET) - continue; - switch (cmsg->cmsg_type){ - case SO_TIMESTAMPING:{ - struct timespec* stamp = (struct timespec*)CMSG_DATA(cmsg); // timestamp is found - fprintf(filepointer, "Timestamp %ld sec %ld nanosec\n", stamp->tv_sec, stamp->tv_nsec);fflush(filepointer); - return 0; - break; - } - default: - fprintf(filepointer, "no timestamp\n");fflush(filepointer); - break; + while( cmsg != NULL ) { + if( cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_TIMESTAMPING ) { + struct timespec *ts_device, *ts_system; + ts_system = ((struct timespec *) CMSG_DATA(cmsg)) + 1; + ts_device = ts_system + 1; + fprintf(filepointer, "Timestamp %ld sec %ld nanosec\n", ts_system->tv_sec, ts_system->tv_nsec);fflush(filepointer); + + break; } + cmsg = CMSG_NXTHDR(&msg,cmsg); } - - struct timeval sys_time; if (clock_gettime(CLOCK_REALTIME, &sys_time)) {