avb_status_t process_avb_1722_1_aecp_packet(unsigned char dest_addr[6], avb_1722_1_aecp_packet_t *pkt, chanend c_tx)
{
	int message_type = GET_1722_1_MSG_TYPE(((avb_1722_1_packet_header_t*)pkt));
	if (compare_guid(pkt->target_guid, &my_guid)==0) return AVB_1722_1_OK;

	switch (message_type)
	{
		case AECP_CMD_AVDECC_MSG_COMMAND:
		{
			avb_1722_1_aecp_avdecc_msg_t *msg = &(pkt->data.avdecc);
			process_avb_1722_1_aecp_avdecc_msg(msg);
			break;
		}
		case AECP_CMD_ADDRESS_ACCESS_COMMAND:
		{
			break;
		}
		case AECP_CMD_AVC_COMMAND:
		{
# if AVB_1722_1_USE_AVC
			uint32_t length = 0 ;
			struct ethernet_hdr_t *eth_hdr = (ethernet_hdr_t*) &avb_1722_1_buf[0];
			avb_1722_1_packet_header_t *pkt_hdr = (avb_1722_1_packet_header_t*) (eth_hdr + 1);
			avb_1722_1_aecp_avc_t* payload = (avb_1722_1_aecp_avc_t*)avb_1722_1_create_aecp_packet(dest_addr, AECP_CMD_AVC_RESPONSE, pkt);
			bcopy(pkt->data.payload, payload, 514);
			length = ((uint32_t)payload->avc_length[0] << 8) | payload->avc_length[1];
			processAVCCommand(payload->avc_command_response, &length);
			payload->avc_length[0] = (length >> 8) & 0xff;
			payload->avc_length[1] = length & 0xff;
			SET_1722_1_DATALENGTH(pkt_hdr, length+12);
			mac_tx(c_tx, avb_1722_1_buf, sizeof(ethernet_hdr_t)+sizeof(avb_1722_1_packet_header_t)+36+length, ETH_BROADCAST);
#endif
			break;
		}
		case AECP_CMD_VENDOR_UNIQUE_COMMAND:
		{
			break;
		}
		case AECP_CMD_EXTENDED_COMMAND:
		{
			break;
		}
		default:
			// This node is not expecting a response
			break;
	}
	return AVB_1722_1_OK;
}
Beispiel #2
0
static void store_rcvd_cmd_resp(avb_1722_1_acmp_cmd_resp* store, avb_1722_1_acmp_packet_t* pkt)
{
    get_64(store->stream_id.c, pkt->stream_id);
    get_64(store->controller_guid.c, pkt->controller_guid);
    get_64(store->listener_guid.c, pkt->listener_guid);
    get_64(store->talker_guid.c, pkt->talker_guid);
    store->talker_unique_id = ntoh_16(pkt->talker_unique_id);
    store->listener_unique_id = ntoh_16(pkt->listener_unique_id);
    store->connection_count = ntoh_16(pkt->connection_count);
    store->sequence_id = ntoh_16(pkt->sequence_id);
    store->flags = ntoh_16(pkt->flags);
    store->vlan_id = ntoh_16(pkt->vlan_id);
    memcpy(store->stream_dest_mac, pkt->dest_mac, 6);
    store->message_type = GET_1722_1_MSG_TYPE(&(pkt->header));
    store->status = GET_1722_1_VALID_TIME(&(pkt->header));
}
Beispiel #3
0
void process_avb_1722_1_acmp_packet(avb_1722_1_acmp_packet_t* pkt, chanend c_tx)
{
    unsigned char message_type = GET_1722_1_MSG_TYPE(((avb_1722_1_packet_header_t*)pkt));

    switch (message_type)
    {
        // Talker messages
        case ACMP_CMD_CONNECT_TX_COMMAND:
        case ACMP_CMD_DISCONNECT_TX_COMMAND:
        case ACMP_CMD_GET_TX_STATE_COMMAND:
        case ACMP_CMD_GET_TX_CONNECTION_COMMAND:
        {
            process_avb_1722_1_acmp_talker_packet(message_type, pkt);
            return;
        }
        // Listener messages
        case ACMP_CMD_CONNECT_TX_RESPONSE:
        case ACMP_CMD_DISCONNECT_TX_RESPONSE:
        case ACMP_CMD_CONNECT_RX_COMMAND:
        case ACMP_CMD_DISCONNECT_RX_COMMAND:
        case ACMP_CMD_GET_RX_STATE_COMMAND:
        {
            process_avb_1722_1_acmp_listener_packet(message_type, pkt);
            return;
        }
        // Controller messages
        case ACMP_CMD_CONNECT_RX_RESPONSE:
        case ACMP_CMD_DISCONNECT_RX_RESPONSE:
        case ACMP_CMD_GET_RX_STATE_RESPONSE:
        case ACMP_CMD_GET_TX_STATE_RESPONSE:
        case ACMP_CMD_GET_TX_CONNECTION_RESPONSE:
        {
            process_avb_1722_1_acmp_controller_packet(message_type, pkt);
            return;
        }
    }
}
Beispiel #4
0
avb_status_t process_avb_1722_1_adp_packet(avb_1722_1_adp_packet_t* pkt, chanend c_tx)
{
	unsigned message_type = GET_1722_1_MSG_TYPE(((avb_1722_1_packet_header_t*)pkt));
	guid_t zero_guid = { 0 };

	switch (message_type)
	{
		case ENTITY_DISCOVER:
		{
			if ( compare_guid(pkt->entity_guid, &my_guid) || compare_guid(pkt->entity_guid, &zero_guid) )
			{
				if (adp_advertise_state == ADP_ADVERTISE_WAITING)
					adp_advertise_state = ADP_ADVERTISE_ADVERTISE_1;
			}
			return AVB_1722_1_OK;
		}
		case ENTITY_AVAILABLE:
		{
			if (avb_1722_1_entity_database_add(pkt))
			{
				/* We only indicate ADP_DISCOVERY_ADDED state if a new (unseen) entity was added,
				 * and not if an existing entity was updated
				 */
				adp_discovery_state = ADP_DISCOVERY_ADDED;
			}
			return AVB_1722_1_OK;
		}
		case ENTITY_DEPARTING:
		{
			avb_1722_1_entity_database_remove(pkt);
			adp_discovery_state = ADP_DISCOVERY_REMOVED;
			return AVB_1722_1_OK;
		}
	}

	return AVB_1722_1_OK;
}