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; }
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)); }
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; } } }
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; }