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.

248 lines
8.1KB

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