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.

266 lines
8.7KB

  1. /*
  2. Copyright (C) 2016-2019 Christoph Kuhr
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #include "mrp_client_interface.h"
  16. extern int errno;
  17. int mrp_client_getDomain(FILE* filepointer, mrp_ctx_t *mrp_ctx)
  18. {
  19. int ret=0;
  20. /*
  21. * we may not get a notification if we are joining late,
  22. * so query for what is already there ...
  23. */
  24. char* msgbuf= malloc(1500);
  25. if (NULL == msgbuf){
  26. fprintf(filepointer, "failed to create msgbuf. %d %s\n", errno, strerror(errno));fflush(filepointer);
  27. return RETURN_VALUE_FAILURE;
  28. }
  29. memset(msgbuf, 0, 1500);
  30. sprintf(msgbuf, "S??");
  31. fprintf(filepointer, "Get Domain %s\n",msgbuf);fflush(filepointer);
  32. ret = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), msgbuf, 1500);
  33. fprintf(filepointer, "Query SRP Domain: %s\n", msgbuf);fflush(filepointer);
  34. free(msgbuf);
  35. if (ret != 1500){
  36. fprintf(filepointer, "failed to create socket. %d %s\n", errno, strerror(errno));fflush(filepointer);
  37. return RETURN_VALUE_FAILURE;
  38. }
  39. while ( (mrp_ctx->domain_a_valid == 0) || (mrp_ctx->domain_b_valid == 0 ) ||
  40. (mrp_ctx->domain_class_a_vid == 0) || (mrp_ctx->domain_class_b_vid == 0) ){
  41. usleep(20000);
  42. }
  43. // if (mrp_ctx->domain_a_valid > 0) {
  44. // class_a->id = mrp_ctx->domain_class_a_id;
  45. // class_a->priority = mrp_ctx->domain_class_a_priority;
  46. // class_a->vid = mrp_ctx->domain_class_a_vid;
  47. // }
  48. // if (mrp_ctx->domain_b_valid > 0) {
  49. // class_b->id = mrp_ctx->domain_class_b_id;
  50. // class_b->priority = mrp_ctx->domain_class_b_priority;
  51. // class_b->vid = mrp_ctx->domain_class_b_vid;
  52. // }
  53. return RETURN_VALUE_SUCCESS;
  54. }
  55. int mrp_client_report_domain_status(FILE* filepointer, mrp_ctx_t *mrp_ctx)
  56. {
  57. char* msgbuf= malloc(1500);
  58. int rc=0;
  59. if (NULL == msgbuf){
  60. fprintf(filepointer, "mrp_listener_report_domain_status - NULL == msgbuf \t LISTENER_FAILED \n");fflush(filepointer);
  61. mrp_ctx->mrp_status = LISTENER_FAILED;
  62. return RETURN_VALUE_FAILURE;
  63. }
  64. memset(msgbuf, 0, 1500);
  65. sprintf(msgbuf, "S+D:C=%d,P=%d,V=%04x", mrp_ctx->domain_class_a_id, mrp_ctx->domain_class_a_priority, mrp_ctx->domain_class_a_vid);
  66. fprintf(filepointer, "Report Domain Status %s\n",msgbuf);fflush(filepointer);
  67. rc = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), msgbuf, 1500);
  68. free(msgbuf);
  69. if (rc != 1500){
  70. fprintf(filepointer, "mrp_listener_report_domain_status - rc != 1500 \t LISTENER_FAILED \n");fflush(filepointer);
  71. mrp_ctx->mrp_status = LISTENER_FAILED;
  72. return RETURN_VALUE_FAILURE;
  73. }
  74. fprintf(filepointer, "mrp_listener_report_domain_status\t LISTENER_IDLE \n");fflush(filepointer);
  75. mrp_ctx->mrp_status = LISTENER_IDLE;
  76. return RETURN_VALUE_SUCCESS;
  77. }
  78. int mrp_client_joinVLAN(FILE* filepointer, mrp_ctx_t *mrp_ctx)
  79. {
  80. char* msgbuf= malloc(1500);
  81. int rc=0;
  82. if (NULL == msgbuf) return RETURN_VALUE_FAILURE;
  83. memset(msgbuf, 0, 1500);
  84. sprintf(msgbuf, "V++:I=%04x",mrp_ctx->domain_class_a_vid);
  85. fprintf(filepointer, "Joing VLAN %s\n",msgbuf);fflush(filepointer);
  86. rc = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), msgbuf, 1500);
  87. free(msgbuf);
  88. if( rc != 1500){
  89. fprintf(filepointer, "int mrp_listener_join_vlan - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer);
  90. mrp_ctx->mrp_status = LISTENER_FAILED;
  91. return RETURN_VALUE_FAILURE;
  92. } else {
  93. fprintf(filepointer, "int mrp_listener_join_vlan - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer);
  94. mrp_ctx->mrp_status = LISTENER_IDLE;
  95. return RETURN_VALUE_SUCCESS;
  96. }
  97. return RETURN_VALUE_FAILURE;
  98. }
  99. int mrp_client_getDomain_joinVLAN(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  100. {
  101. fprintf(filepointer, "calling mrp_get_domain()\n");fflush(filepointer);
  102. if ( mrp_client_getDomain( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE) {
  103. fprintf(filepointer, "success calling mrp_get_domain()\n");fflush(filepointer);
  104. } else {
  105. fprintf(filepointer, "failed calling mrp_get_domain()\n");fflush(filepointer);
  106. return RETURN_VALUE_FAILURE;
  107. }
  108. fprintf(filepointer, "detected domain Class A PRIO=%d VID=%04x...\n",mrp_ctx->domain_class_a_priority,
  109. mrp_ctx->domain_class_a_vid);fflush(filepointer);
  110. if ( mrp_client_report_domain_status( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE ) {
  111. fprintf(filepointer, "report_domain_status success\n");fflush(filepointer);
  112. } else {
  113. fprintf(filepointer, "report_domain_status failed\n");fflush(filepointer);
  114. return RETURN_VALUE_FAILURE;
  115. }
  116. if ( mrp_client_joinVLAN( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE) {
  117. fprintf(filepointer, "join_vlan success\n");fflush(filepointer);
  118. } else {
  119. fprintf(filepointer, "join_vlan failed\n");fflush(filepointer);
  120. return RETURN_VALUE_FAILURE;
  121. }
  122. return RETURN_VALUE_SUCCESS;
  123. }
  124. int mrp_client_listener_await_talker(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  125. {
  126. if( mrp_ctx->mrp_status == LISTENER_READY) {
  127. fprintf(filepointer, "Already connected to a talker...\n");fflush(filepointer);
  128. return RETURN_VALUE_FAILURE;
  129. } else {
  130. mrp_ctx->mrp_status = LISTENER_WAITING;
  131. fprintf(filepointer, "Waiting for talker...\n");fflush(filepointer);
  132. fprintf(filepointer, "int mrp_listener_await_talker - rc != 1500\t LISTENER_WAITING\n");fflush(filepointer);
  133. struct timespec tim, tim2;
  134. tim.tv_sec = 0;
  135. tim.tv_nsec = MILISLEEP_TIME * 5;
  136. while(mrp_ctx->mrp_status == LISTENER_WAITING
  137. && mrp_ctx->mrp_status != LISTENER_READY ){
  138. nanosleep(&tim , &tim2);
  139. }
  140. if ( mrp_client_listener_send_ready( filepointer, avb_ctx, mrp_ctx ) > RETURN_VALUE_FAILURE) {
  141. fprintf(filepointer, "send_ready success\n");fflush(filepointer);
  142. return RETURN_VALUE_SUCCESS;
  143. }
  144. }
  145. return RETURN_VALUE_FAILURE;
  146. }
  147. int mrp_client_listener_send_ready(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  148. {
  149. char *databuf= malloc(1500);
  150. int rc=0;
  151. if (NULL == databuf) return RETURN_VALUE_FAILURE;
  152. memset(databuf, 0, 1500);
  153. sprintf(databuf, "S+L:L=%02x%02x%02x%02x%02x%02x%02x%02x,D=2",
  154. (*avb_ctx)->streamid8[0], (*avb_ctx)->streamid8[1],
  155. (*avb_ctx)->streamid8[2], (*avb_ctx)->streamid8[3],
  156. (*avb_ctx)->streamid8[4], (*avb_ctx)->streamid8[5],
  157. (*avb_ctx)->streamid8[6], (*avb_ctx)->streamid8[7]);
  158. rc = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), databuf, 1500);
  159. fprintf(filepointer, "Send Ready %s\n",databuf);fflush(filepointer);
  160. free(databuf);
  161. if (rc != 1500){
  162. fprintf(filepointer, "mrp_listener_send_ready - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer);
  163. mrp_ctx->mrp_status = LISTENER_FAILED;
  164. return RETURN_VALUE_FAILURE;
  165. }
  166. fprintf(filepointer, "mrp_listener_send_ready - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer);
  167. return RETURN_VALUE_SUCCESS;
  168. }
  169. int mrp_client_listener_send_leave(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  170. {
  171. char *databuf= malloc(1500);
  172. int rc=0;
  173. if (NULL == databuf){
  174. return RETURN_VALUE_FAILURE;
  175. }
  176. memset(databuf, 0, 1500);
  177. sprintf(databuf, "S-L:L=%02x%02x%02x%02x%02x%02x%02x%02x,D=3",
  178. (*avb_ctx)->streamid8[0], (*avb_ctx)->streamid8[1],
  179. (*avb_ctx)->streamid8[2], (*avb_ctx)->streamid8[3],
  180. (*avb_ctx)->streamid8[4], (*avb_ctx)->streamid8[5],
  181. (*avb_ctx)->streamid8[6], (*avb_ctx)->streamid8[7]);
  182. rc = mrp_client_send_mrp_msg(filepointer, mrp_client_get_Control_socket(), databuf, 1500);
  183. fprintf(filepointer, "Send Leave %s\n",databuf);fflush(filepointer);
  184. free(databuf);
  185. if (rc != 1500){
  186. fprintf(filepointer, "mrp_listener_send_leave - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer);
  187. mrp_ctx->mrp_status = LISTENER_FAILED;
  188. return RETURN_VALUE_FAILURE;
  189. } else {
  190. fprintf(filepointer, "mrp_listener_send_leave - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer);
  191. mrp_ctx->mrp_status = LISTENER_IDLE;
  192. return RETURN_VALUE_SUCCESS;
  193. }
  194. }