int STDCALL clock_domain_descriptor_imp::send_set_clock_source_cmd(void * notification_id, uint16_t new_clk_src_index)
{
    struct jdksavdecc_frame cmd_frame;
    struct jdksavdecc_aem_command_set_clock_source aem_cmd_set_clk_src;
    ssize_t aem_cmd_set_clk_src_returned;
    memset(&aem_cmd_set_clk_src, 0, sizeof(aem_cmd_set_clk_src));

    /***************************************** AECP Common Data ******************************************/
    aem_cmd_set_clk_src.aem_header.aecpdu_header.controller_entity_id = base_end_station_imp_ref->get_adp()->get_controller_entity_id();
    // Fill aem_cmd_set_clk_src.sequence_id in AEM Controller State Machine
    aem_cmd_set_clk_src.aem_header.command_type = JDKSAVDECC_AEM_COMMAND_SET_CLOCK_SOURCE;

    /***************** AECP Message Specific Data ****************/
    aem_cmd_set_clk_src.descriptor_type = descriptor_type();
    aem_cmd_set_clk_src.descriptor_index = descriptor_index();
    aem_cmd_set_clk_src.clock_source_index = new_clk_src_index;

    /*************************** Fill frame payload with AECP data and send the frame ***********************/
    aecp_controller_state_machine_ref->ether_frame_init(base_end_station_imp_ref->mac(), &cmd_frame,
                                                        ETHER_HDR_SIZE + JDKSAVDECC_AEM_COMMAND_SET_CLOCK_SOURCE_COMMAND_LEN);
    aem_cmd_set_clk_src_returned = jdksavdecc_aem_command_set_clock_source_write(&aem_cmd_set_clk_src,
                                                                                 cmd_frame.payload,
                                                                                 ETHER_HDR_SIZE,
                                                                                 sizeof(cmd_frame.payload));

    if (aem_cmd_set_clk_src_returned < 0)
    {
        log_imp_ref->post_log_msg(LOGGING_LEVEL_ERROR, "aem_cmd_set_clk_src_write error\n");
        assert(aem_cmd_set_clk_src_returned >= 0);
        return -1;
    }

    aecp_controller_state_machine_ref->common_hdr_init(JDKSAVDECC_AECP_MESSAGE_TYPE_AEM_COMMAND,
                                                       &cmd_frame,
                                                       base_end_station_imp_ref->entity_id(),
                                                       JDKSAVDECC_AEM_COMMAND_SET_CLOCK_SOURCE_COMMAND_LEN -
                                                           JDKSAVDECC_COMMON_CONTROL_HEADER_LEN);
    system_queue_tx(notification_id, CMD_WITH_NOTIFICATION, cmd_frame.payload, cmd_frame.length);

    return 0;
}
	int STDCALL clock_domain_descriptor_imp::send_set_clock_source_cmd(void *notification_id, uint16_t desc_index, uint16_t new_clk_src_index)
	{
		struct jdksavdecc_frame *ether_frame;
		struct jdksavdecc_aem_command_set_clock_source aem_cmd_set_clk_src;
		int aem_cmd_set_clk_src_returned;
		ether_frame = (struct jdksavdecc_frame *)malloc(sizeof(struct jdksavdecc_frame));

		/***************************************** AECP Common Data ********************************************/
		aem_cmd_set_clk_src.controller_entity_id = base_end_station_imp_ref->get_adp()->get_controller_guid();
		// Fill aem_cmd_set_clk_src.sequence_id in AEM Controller State Machine
		aem_cmd_set_clk_src.command_type = JDKSAVDECC_AEM_COMMAND_SET_CLOCK_SOURCE;

		/************************** AECP Message Specific Data ************************/
		aem_cmd_set_clk_src.descriptor_type = JDKSAVDECC_DESCRIPTOR_CLOCK_DOMAIN;
		aem_cmd_set_clk_src.descriptor_index = desc_index;
		aem_cmd_set_clk_src.clock_source_index = new_clk_src_index;

		/******************************** Fill frame payload with AECP data and send the frame ***************************/
		aecp::ether_frame_init(base_end_station_imp_ref, ether_frame);
		aem_cmd_set_clk_src_returned = jdksavdecc_aem_command_set_clock_source_write(&aem_cmd_set_clk_src,
		                                                                             ether_frame->payload,
		                                                                             aecp::CMD_POS,
		                                                                             sizeof(ether_frame->payload));

		if(aem_cmd_set_clk_src_returned < 0)
		{
			avdecc_lib::log_ref->logging(avdecc_lib::LOGGING_LEVEL_ERROR, "aem_cmd_get_clk_src_write error\n");
			assert(aem_cmd_set_clk_src_returned >= 0);
			return -1;
		}

		aecp::common_hdr_init(ether_frame, base_end_station_imp_ref->get_end_station_guid());
		system_queue_tx(notification_id, avdecc_lib::CMD_WITH_NOTIFICATION, ether_frame->payload, ether_frame->length);

		free(ether_frame);
		return 0;

	}