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.

232 lines
9.1KB

  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. #include "mrp_client_control_socket.h"
  17. #include "mrp_client_send_msg.h"
  18. #include <malloc.h>
  19. extern int errno;
  20. int mrp_client_getDomain(FILE* filepointer, mrp_ctx_t *mrp_ctx)
  21. {
  22. int ret=0;
  23. char* msgbuf= malloc(1500);
  24. // we may not get a notification if we are joining late,
  25. //so query for what is already there ...
  26. if (NULL == msgbuf){
  27. fprintf(filepointer, "failed to create msgbuf. %d %s\n", errno, strerror(errno));fflush(filepointer);
  28. return RETURN_VALUE_FAILURE;
  29. }
  30. memset(msgbuf, 0, 1500);
  31. sprintf(msgbuf, "S??");
  32. fprintf(filepointer, "Get Domain %s\n",msgbuf);fflush(filepointer);
  33. ret = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), msgbuf, 1500);
  34. fprintf(filepointer, "Query SRP Domain: %s\n", msgbuf);fflush(filepointer);
  35. free(msgbuf);
  36. if (ret != 1500){
  37. fprintf(filepointer, "failed to create socket. %d %s\n", errno, strerror(errno));fflush(filepointer);
  38. return RETURN_VALUE_FAILURE;
  39. }
  40. while ( (mrp_ctx->domain_a_valid == 0) || (mrp_ctx->domain_b_valid == 0 ) ||
  41. (mrp_ctx->domain_class_a_vid == 0) || (mrp_ctx->domain_class_b_vid == 0) ){
  42. usleep(20000);
  43. }
  44. // if (mrp_ctx->domain_a_valid > 0) {
  45. // class_a->id = mrp_ctx->domain_class_a_id;
  46. // class_a->priority = mrp_ctx->domain_class_a_priority;
  47. // class_a->vid = mrp_ctx->domain_class_a_vid;
  48. // }
  49. // if (mrp_ctx->domain_b_valid > 0) {
  50. // class_b->id = mrp_ctx->domain_class_b_id;
  51. // class_b->priority = mrp_ctx->domain_class_b_priority;
  52. // class_b->vid = mrp_ctx->domain_class_b_vid;
  53. // }
  54. return RETURN_VALUE_SUCCESS;
  55. }
  56. int mrp_client_report_domain_status(FILE* filepointer, mrp_ctx_t *mrp_ctx)
  57. {
  58. char* msgbuf= malloc(1500);
  59. int rc=0;
  60. if (NULL == msgbuf){
  61. fprintf(filepointer, "mrp_listener_report_domain_status - NULL == msgbuf \t LISTENER_FAILED \n");fflush(filepointer);
  62. mrp_ctx->mrp_status = LISTENER_FAILED;
  63. return RETURN_VALUE_FAILURE;
  64. }
  65. memset(msgbuf, 0, 1500);
  66. 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);
  67. fprintf(filepointer, "Report Domain Status %s\n",msgbuf);fflush(filepointer);
  68. rc = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), msgbuf, 1500);
  69. free(msgbuf);
  70. if (rc != 1500){
  71. fprintf(filepointer, "mrp_listener_report_domain_status - rc != 1500 \t LISTENER_FAILED \n");fflush(filepointer);
  72. mrp_ctx->mrp_status = LISTENER_FAILED;
  73. return RETURN_VALUE_FAILURE;
  74. }
  75. fprintf(filepointer, "mrp_listener_report_domain_status\t LISTENER_IDLE \n");fflush(filepointer);
  76. mrp_ctx->mrp_status = LISTENER_IDLE;
  77. return RETURN_VALUE_SUCCESS;
  78. }
  79. int mrp_client_joinVLAN(FILE* filepointer, mrp_ctx_t *mrp_ctx)
  80. {
  81. char* msgbuf= malloc(1500);
  82. int rc=0;
  83. if (NULL == msgbuf) return RETURN_VALUE_FAILURE;
  84. memset(msgbuf, 0, 1500);
  85. sprintf(msgbuf, "V++:I=%04x",mrp_ctx->domain_class_a_vid);
  86. fprintf(filepointer, "Joing VLAN %s\n",msgbuf);fflush(filepointer);
  87. rc = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), msgbuf, 1500);
  88. free(msgbuf);
  89. if( rc != 1500){
  90. fprintf(filepointer, "int mrp_listener_join_vlan - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer);
  91. mrp_ctx->mrp_status = LISTENER_FAILED;
  92. return RETURN_VALUE_FAILURE;
  93. } else {
  94. fprintf(filepointer, "int mrp_listener_join_vlan - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer);
  95. mrp_ctx->mrp_status = LISTENER_IDLE;
  96. return RETURN_VALUE_SUCCESS;
  97. }
  98. return RETURN_VALUE_FAILURE;
  99. }
  100. int mrp_client_getDomain_joinVLAN(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  101. {
  102. fprintf(filepointer, "calling mrp_get_domain()\n");fflush(filepointer);
  103. if ( mrp_client_getDomain( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE) {
  104. fprintf(filepointer, "success calling mrp_get_domain()\n");fflush(filepointer);
  105. } else {
  106. fprintf(filepointer, "failed calling mrp_get_domain()\n");fflush(filepointer);
  107. return RETURN_VALUE_FAILURE;
  108. }
  109. fprintf(filepointer, "detected domain Class A PRIO=%d VID=%04x...\n",mrp_ctx->domain_class_a_priority,
  110. mrp_ctx->domain_class_a_vid);fflush(filepointer);
  111. if ( mrp_client_report_domain_status( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE ) {
  112. fprintf(filepointer, "report_domain_status success\n");fflush(filepointer);
  113. } else {
  114. fprintf(filepointer, "report_domain_status failed\n");fflush(filepointer);
  115. return RETURN_VALUE_FAILURE;
  116. }
  117. if ( mrp_client_joinVLAN( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE) {
  118. fprintf(filepointer, "join_vlan success\n");fflush(filepointer);
  119. } else {
  120. fprintf(filepointer, "join_vlan failed\n");fflush(filepointer);
  121. return RETURN_VALUE_FAILURE;
  122. }
  123. return RETURN_VALUE_SUCCESS;
  124. }
  125. int mrp_client_listener_await_talker(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  126. {
  127. if( mrp_ctx->mrp_status == LISTENER_READY) {
  128. fprintf(filepointer, "Already connected to a talker...\n");fflush(filepointer);
  129. return RETURN_VALUE_FAILURE;
  130. } else {
  131. mrp_ctx->mrp_status = LISTENER_WAITING;
  132. fprintf(filepointer, "Waiting for talker...\n");fflush(filepointer);
  133. fprintf(filepointer, "int mrp_listener_await_talker - rc != 1500\t LISTENER_WAITING\n");fflush(filepointer);
  134. struct timespec tim, tim2;
  135. tim.tv_sec = 0;
  136. tim.tv_nsec = MILISLEEP_TIME * 5;
  137. while(mrp_ctx->mrp_status == LISTENER_WAITING
  138. && mrp_ctx->mrp_status != LISTENER_READY ){
  139. nanosleep(&tim , &tim2);
  140. }
  141. if ( mrp_client_listener_send_ready( filepointer, avb_ctx, mrp_ctx ) > RETURN_VALUE_FAILURE) {
  142. fprintf(filepointer, "send_ready success\n");fflush(filepointer);
  143. return RETURN_VALUE_SUCCESS;
  144. }
  145. }
  146. return RETURN_VALUE_FAILURE;
  147. }
  148. int mrp_client_listener_send_ready(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  149. {
  150. char *databuf= malloc(1500);
  151. int rc=0;
  152. if (NULL == databuf) return RETURN_VALUE_FAILURE;
  153. memset(databuf, 0, 1500);
  154. sprintf(databuf, "S+L:L=%02x%02x%02x%02x%02x%02x%02x%02x,D=2",
  155. (*avb_ctx)->streamid8[0], (*avb_ctx)->streamid8[1],
  156. (*avb_ctx)->streamid8[2], (*avb_ctx)->streamid8[3],
  157. (*avb_ctx)->streamid8[4], (*avb_ctx)->streamid8[5],
  158. (*avb_ctx)->streamid8[6], (*avb_ctx)->streamid8[7]);
  159. rc = mrp_client_send_mrp_msg( filepointer, mrp_client_get_Control_socket(), databuf, 1500);
  160. fprintf(filepointer, "Send Ready %s\n",databuf);fflush(filepointer);
  161. free(databuf);
  162. if (rc != 1500){
  163. fprintf(filepointer, "mrp_listener_send_ready - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer);
  164. mrp_ctx->mrp_status = LISTENER_FAILED;
  165. return RETURN_VALUE_FAILURE;
  166. }
  167. fprintf(filepointer, "mrp_listener_send_ready - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer);
  168. return RETURN_VALUE_SUCCESS;
  169. }
  170. int mrp_client_listener_send_leave(FILE* filepointer, avb_driver_state_t **avb_ctx, mrp_ctx_t *mrp_ctx)
  171. {
  172. char *databuf= malloc(1500);
  173. int rc=0;
  174. if (NULL == databuf){
  175. return RETURN_VALUE_FAILURE;
  176. }
  177. memset(databuf, 0, 1500);
  178. sprintf(databuf, "S-L:L=%02x%02x%02x%02x%02x%02x%02x%02x,D=3",
  179. (*avb_ctx)->streamid8[0], (*avb_ctx)->streamid8[1],
  180. (*avb_ctx)->streamid8[2], (*avb_ctx)->streamid8[3],
  181. (*avb_ctx)->streamid8[4], (*avb_ctx)->streamid8[5],
  182. (*avb_ctx)->streamid8[6], (*avb_ctx)->streamid8[7]);
  183. rc = mrp_client_send_mrp_msg(filepointer, mrp_client_get_Control_socket(), databuf, 1500);
  184. fprintf(filepointer, "Send Leave %s\n",databuf);fflush(filepointer);
  185. free(databuf);
  186. if (rc != 1500){
  187. fprintf(filepointer, "mrp_listener_send_leave - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer);
  188. mrp_ctx->mrp_status = LISTENER_FAILED;
  189. return RETURN_VALUE_FAILURE;
  190. } else {
  191. fprintf(filepointer, "mrp_listener_send_leave - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer);
  192. mrp_ctx->mrp_status = LISTENER_IDLE;
  193. return RETURN_VALUE_SUCCESS;
  194. }
  195. }