#include "mrpClient_interface.h" extern int errno; int mrpClient_getDomain(FILE* filepointer, mrp_ctx_t *mrp_ctx) { int ret=0; /* * we may not get a notification if we are joining late, * so query for what is already there ... */ char* msgbuf= malloc(1500); if (NULL == msgbuf){ fprintf(filepointer, "failed to create msgbuf. %d %s\n", errno, strerror(errno));fflush(filepointer); return RETURN_VALUE_FAILURE; } memset(msgbuf, 0, 1500); sprintf(msgbuf, "S??"); fprintf(filepointer, "Get Domain %s\n",msgbuf);fflush(filepointer); ret = mrpClient_send_mrp_msg( filepointer, mrpClient_get_Control_socket(), msgbuf, 1500); fprintf(filepointer, "Query SRP Domain: %s\n", msgbuf);fflush(filepointer); free(msgbuf); if (ret != 1500){ fprintf(filepointer, "failed to create socket. %d %s\n", errno, strerror(errno));fflush(filepointer); return RETURN_VALUE_FAILURE; } while ( (mrp_ctx->domain_a_valid == 0) || (mrp_ctx->domain_b_valid == 0 ) || (mrp_ctx->domain_class_a_vid == 0) || (mrp_ctx->domain_class_b_vid == 0) ){ usleep(20000); } // if (mrp_ctx->domain_a_valid > 0) { // class_a->id = mrp_ctx->domain_class_a_id; // class_a->priority = mrp_ctx->domain_class_a_priority; // class_a->vid = mrp_ctx->domain_class_a_vid; // } // if (mrp_ctx->domain_b_valid > 0) { // class_b->id = mrp_ctx->domain_class_b_id; // class_b->priority = mrp_ctx->domain_class_b_priority; // class_b->vid = mrp_ctx->domain_class_b_vid; // } return RETURN_VALUE_SUCCESS; } int mrpClient_report_domain_status(FILE* filepointer, mrp_ctx_t *mrp_ctx) { char* msgbuf= malloc(1500); int rc=0; if (NULL == msgbuf){ fprintf(filepointer, "mrp_listener_report_domain_status - NULL == msgbuf \t LISTENER_FAILED \n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_FAILED; return RETURN_VALUE_FAILURE; } memset(msgbuf, 0, 1500); 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); fprintf(filepointer, "Report Domain Status %s\n",msgbuf);fflush(filepointer); rc = mrpClient_send_mrp_msg( filepointer, mrpClient_get_Control_socket(), msgbuf, 1500); free(msgbuf); if (rc != 1500){ fprintf(filepointer, "mrp_listener_report_domain_status - rc != 1500 \t LISTENER_FAILED \n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_FAILED; return RETURN_VALUE_FAILURE; } fprintf(filepointer, "mrp_listener_report_domain_status\t LISTENER_IDLE \n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_IDLE; return RETURN_VALUE_SUCCESS; } int mrpClient_joinVLAN(FILE* filepointer, mrp_ctx_t *mrp_ctx) { char* msgbuf= malloc(1500); int rc=0; if (NULL == msgbuf) return RETURN_VALUE_FAILURE; memset(msgbuf, 0, 1500); sprintf(msgbuf, "V++:I=%04x",mrp_ctx->domain_class_a_vid); fprintf(filepointer, "Joing VLAN %s\n",msgbuf);fflush(filepointer); rc = mrpClient_send_mrp_msg( filepointer, mrpClient_get_Control_socket(), msgbuf, 1500); free(msgbuf); if( rc != 1500){ fprintf(filepointer, "int mrp_listener_join_vlan - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_FAILED; return RETURN_VALUE_FAILURE; } else { fprintf(filepointer, "int mrp_listener_join_vlan - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_IDLE; return RETURN_VALUE_SUCCESS; } return RETURN_VALUE_FAILURE; } int mrpClient_getDomain_joinVLAN(FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, mrp_ctx_t *mrp_ctx) { fprintf(filepointer, "calling mrp_get_domain()\n");fflush(filepointer); if ( mrpClient_getDomain( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE) { fprintf(filepointer, "success calling mrp_get_domain()\n");fflush(filepointer); } else { fprintf(filepointer, "failed calling mrp_get_domain()\n");fflush(filepointer); return RETURN_VALUE_FAILURE; } fprintf(filepointer, "detected domain Class A PRIO=%d VID=%04x...\n",mrp_ctx->domain_class_a_priority, mrp_ctx->domain_class_a_vid);fflush(filepointer); if ( mrpClient_report_domain_status( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE ) { fprintf(filepointer, "report_domain_status success\n");fflush(filepointer); } else { fprintf(filepointer, "report_domain_status failed\n");fflush(filepointer); return RETURN_VALUE_FAILURE; } if ( mrpClient_joinVLAN( filepointer, mrp_ctx) > RETURN_VALUE_FAILURE) { fprintf(filepointer, "join_vlan success\n");fflush(filepointer); } else { fprintf(filepointer, "join_vlan failed\n");fflush(filepointer); return RETURN_VALUE_FAILURE; } return RETURN_VALUE_SUCCESS; } int mrpClient_listener_await_talker(FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, mrp_ctx_t *mrp_ctx) { if( mrp_ctx->mrp_status == LISTENER_READY) { fprintf(filepointer, "Already connected to a talker...\n");fflush(filepointer); return RETURN_VALUE_FAILURE; } else { mrp_ctx->mrp_status = LISTENER_WAITING; fprintf(filepointer, "Waiting for talker...\n");fflush(filepointer); fprintf(filepointer, "int mrp_listener_await_talker - rc != 1500\t LISTENER_WAITING\n");fflush(filepointer); struct timespec tim, tim2; tim.tv_sec = 0; tim.tv_nsec = MILISLEEP_TIME * 5; while(mrp_ctx->mrp_status == LISTENER_WAITING && mrp_ctx->mrp_status != LISTENER_READY ){ nanosleep(&tim , &tim2); } if ( mrpClient_listener_send_ready( filepointer, ieee1722mc, mrp_ctx ) > RETURN_VALUE_FAILURE) { fprintf(filepointer, "send_ready success\n");fflush(filepointer); return RETURN_VALUE_SUCCESS; } } return RETURN_VALUE_FAILURE; } int mrpClient_listener_send_ready(FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, mrp_ctx_t *mrp_ctx) { char *databuf= malloc(1500); int rc=0; if (NULL == databuf) return RETURN_VALUE_FAILURE; memset(databuf, 0, 1500); sprintf(databuf, "S+L:L=%02x%02x%02x%02x%02x%02x%02x%02x,D=2", (*ieee1722mc)->streamid8[0], (*ieee1722mc)->streamid8[1], (*ieee1722mc)->streamid8[2], (*ieee1722mc)->streamid8[3], (*ieee1722mc)->streamid8[4], (*ieee1722mc)->streamid8[5], (*ieee1722mc)->streamid8[6], (*ieee1722mc)->streamid8[7]); rc = mrpClient_send_mrp_msg( filepointer, mrpClient_get_Control_socket(), databuf, 1500); fprintf(filepointer, "Send Ready %s\n",databuf);fflush(filepointer); free(databuf); if (rc != 1500){ fprintf(filepointer, "mrp_listener_send_ready - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_FAILED; return RETURN_VALUE_FAILURE; } fprintf(filepointer, "mrp_listener_send_ready - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer); return RETURN_VALUE_SUCCESS; } int mrpClient_listener_send_leave(FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, mrp_ctx_t *mrp_ctx) { char *databuf= malloc(1500); int rc=0; if (NULL == databuf){ return RETURN_VALUE_FAILURE; } memset(databuf, 0, 1500); sprintf(databuf, "S-L:L=%02x%02x%02x%02x%02x%02x%02x%02x,D=3", (*ieee1722mc)->streamid8[0], (*ieee1722mc)->streamid8[1], (*ieee1722mc)->streamid8[2], (*ieee1722mc)->streamid8[3], (*ieee1722mc)->streamid8[4], (*ieee1722mc)->streamid8[5], (*ieee1722mc)->streamid8[6], (*ieee1722mc)->streamid8[7]); rc = mrpClient_send_mrp_msg(filepointer, mrpClient_get_Control_socket(), databuf, 1500); fprintf(filepointer, "Send Leave %s\n",databuf);fflush(filepointer); free(databuf); if (rc != 1500){ fprintf(filepointer, "mrp_listener_send_leave - rc != 1500\t LISTENER_FAILED\n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_FAILED; return RETURN_VALUE_FAILURE; } else { fprintf(filepointer, "mrp_listener_send_leave - rc != 1500\t LISTENER_IDLE\n");fflush(filepointer); mrp_ctx->mrp_status = LISTENER_IDLE; return RETURN_VALUE_SUCCESS; } }