jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
5.1KB

  1. /*
  2. * udpSocket.c
  3. *
  4. * Created on: Nov 7, 2016
  5. * Author: christoph
  6. */
  7. #include "avb_sockets.h"
  8. #define DUMMY_STREAMID (0xABCDEF)
  9. /*
  10. * IEEE 1722 AVTP Receiver Socket
  11. */
  12. int enable_1722avtp_filter( FILE* filepointer, int raw_transport_socket, unsigned char *destinationMacAddress)
  13. {
  14. /*
  15. tcpdump -i enp9s0 "ether dst 91:e0:f0:00:c3:51" -dd
  16. { 0x20, 0, 0, 0x00000002 },
  17. { 0x15, 0, 3, 0xf000c351 },
  18. { 0x28, 0, 0, 0x00000000 },
  19. { 0x15, 0, 1, 0x000091e0 },
  20. { 0x6, 0, 0, 0x00040000 },
  21. { 0x6, 0, 0, 0x00000000 },
  22. */
  23. unsigned int low_mac=0, hi_mac=0;
  24. low_mac = (((destinationMacAddress[0] & 0xFF) & 0xFFFFFFFF) << 8 ) | (destinationMacAddress[1] & 0xFF );
  25. hi_mac = (((destinationMacAddress[2] & 0xFF) & 0xFFFFFFFF) << 24 ) | (((destinationMacAddress[3] & 0xFF ) & 0xFFFFFFFF) << 16 ) | (((destinationMacAddress[4] & 0xFF ) & 0xFFFFFFFF) << 8 ) | (destinationMacAddress[5] & 0xFF );
  26. struct sock_filter code[] = {
  27. { 0x20, 0, 0, 0x00000002 },
  28. { 0x15, 0, 3, hi_mac },
  29. { 0x28, 0, 0, 0x00000000 },
  30. { 0x15, 0, 1, low_mac },
  31. { 0x6, 0, 0, 0x00040000 },
  32. { 0x6, 0, 0, 0x00000000 },
  33. };
  34. struct sock_fprog bpf = {
  35. .len = ARRAYSIZE(code),
  36. .filter = code,
  37. };
  38. if(setsockopt(raw_transport_socket, SOL_SOCKET, SO_ATTACH_FILTER, &bpf, sizeof(bpf)) < 0) {
  39. fprintf(filepointer, "setsockopt error: %s \n", strerror(errno));fflush(filepointer);
  40. return RETURN_VALUE_FAILURE;
  41. }
  42. return RETURN_VALUE_FAILURE;
  43. }
  44. int create_RAW_AVB_Transport_Socket( FILE* filepointer, int* raw_transport_socket, char* eth_dev)
  45. {
  46. struct ifreq ifr; // set promiscuous mode
  47. memset((char*)&ifr, 0, sizeof(struct ifreq));
  48. int sockopt=0;
  49. struct ifreq ifopts; /* set promiscuous mode */
  50. memset((char*)&ifopts, 0, sizeof(struct ifreq));
  51. int s;
  52. strncpy (ifr.ifr_name, eth_dev, IFNAMSIZ - 1);
  53. ifr.ifr_name[sizeof(ifr.ifr_name)-1] = '\0';
  54. // create a RAW socket
  55. if (( s = socket(PF_PACKET, SOCK_RAW, htons(AVB_ETHER_TYPE/*ETH_P_ALL*/))) < 0){
  56. fprintf(filepointer, "[RAW_TRANSPORT] Error creating RAW Socket \n");fflush(filepointer);
  57. return RETURN_VALUE_FAILURE;
  58. }
  59. *raw_transport_socket = s;
  60. // printf("[RAW_TRANSPORT] Success creating RAW Socket %d %d\n", &raw_transport_socket, *raw_transport_socket);
  61. strncpy(ifopts.ifr_name, ifr.ifr_name, IFNAMSIZ-1);
  62. if( ioctl(*raw_transport_socket, SIOCGIFFLAGS, &ifopts) == -1) {
  63. fprintf(filepointer, "[RAW_TRANSPORT] No such interface");fflush(filepointer);
  64. fprintf(filepointer, "Zero \n");fflush(filepointer);
  65. close(*raw_transport_socket);
  66. return RETURN_VALUE_FAILURE;
  67. }
  68. ifopts.ifr_flags |= IFF_PROMISC;
  69. if( ioctl(*raw_transport_socket, SIOCSIFFLAGS, &ifopts) == -1){
  70. fprintf(filepointer, "[RAW_TRANSPORT] Interface is down. \n");fflush(filepointer);
  71. close(*raw_transport_socket);
  72. return RETURN_VALUE_FAILURE;
  73. }
  74. /* Allow the socket to be reused - incase connection is closed prematurely */
  75. if (setsockopt(*raw_transport_socket, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof( sockopt)) == -1) {
  76. fprintf(filepointer, "[RAW_TRANSPORT] setsockopt failed \n");fflush(filepointer);
  77. close(*raw_transport_socket);
  78. return RETURN_VALUE_FAILURE;
  79. }
  80. /* Set Timestamping Option => requires recvmsg to be used => timestamp in ancillary data */
  81. int timestamp_flags = 0;
  82. // timestamp_flags |= SOF_TIMESTAMPING_TX_HARDWARE;
  83. timestamp_flags |= SOF_TIMESTAMPING_RX_HARDWARE;
  84. timestamp_flags |= SOF_TIMESTAMPING_SYS_HARDWARE;
  85. timestamp_flags |= SOF_TIMESTAMPING_RAW_HARDWARE;
  86. struct hwtstamp_config hwconfig;
  87. memset( &hwconfig, 0, sizeof( hwconfig ));
  88. hwconfig.rx_filter = HWTSTAMP_FILTER_ALL;
  89. // hwconfig.tx_type = HWTSTAMP_TX_OFF;
  90. hwconfig.tx_type = HWTSTAMP_TX_ON;
  91. struct ifreq hwtstamp;
  92. memset((char*)&hwtstamp, 0, sizeof(struct ifreq));
  93. strncpy(hwtstamp.ifr_name, ifr.ifr_name, IFNAMSIZ-1);
  94. hwtstamp.ifr_data = (void *) &hwconfig;
  95. if( ioctl( *raw_transport_socket, SIOCSHWTSTAMP, &hwtstamp ) == -1 ) {
  96. fprintf(filepointer, "[RAW TRANSPORT] ioctl timestamping failed %d %s \n", errno, strerror(errno));fflush(filepointer);
  97. close(*raw_transport_socket);
  98. return RETURN_VALUE_FAILURE;
  99. }
  100. if (setsockopt(*raw_transport_socket, SOL_SOCKET, SO_TIMESTAMPING, &timestamp_flags, sizeof(timestamp_flags) ) == -1) {
  101. fprintf(filepointer, "[RAW TRANSPORT] setsockopt timestamping failed %d %s \n", errno, strerror(errno));fflush(filepointer);
  102. close(*raw_transport_socket);
  103. return RETURN_VALUE_FAILURE;
  104. } else {
  105. fprintf(filepointer, "[RAW TRANSPORT] Timestamp Socket \n");fflush(filepointer);
  106. }
  107. /* Bind Socket to Device */
  108. if (setsockopt(*raw_transport_socket, SOL_SOCKET, SO_BINDTODEVICE, eth_dev, IFNAMSIZ-1) == -1) {
  109. fprintf(filepointer, "[RAW_TRANSPORT] SO_BINDTODEVICE failed \n");fflush(filepointer);
  110. close(*raw_transport_socket);
  111. return RETURN_VALUE_FAILURE;
  112. }
  113. return RETURN_VALUE_SUCCESS;
  114. }
  115. void print_eth_header(etherheader_q_t *eh)
  116. {
  117. printf("Ethernet Header: ");
  118. for(int i=0; i<6; i++){
  119. printf("%x",eh->ether_dhost[i]);
  120. if(i<5) printf(":");
  121. else printf(" ");
  122. }
  123. for(int i=0; i<6; i++){
  124. printf("%x",eh->ether_shost[i]);
  125. if(i<5) printf(":");
  126. else printf(" ");
  127. }
  128. printf("%x ",eh->vlan_id);
  129. printf("%x ",eh->ether_type);
  130. printf("\n");
  131. }