int aecp_aem_check( const struct jdksavdecc_frame *frame, struct jdksavdecc_aecpdu_aem *aem, const struct jdksavdecc_eui64 controller_entity_id, const struct jdksavdecc_eui64 target_entity_id, uint16_t sequence_id ) { int r = -1; ssize_t pos = jdksavdecc_aecpdu_aem_read( aem, frame->payload, 0, frame->length ); if ( pos > 0 ) { struct jdksavdecc_aecpdu_common_control_header *h = &aem->aecpdu_header.header; if ( h->version == 0 && h->subtype == JDKSAVDECC_SUBTYPE_AECP && h->cd == 1 ) { if ( h->message_type == JDKSAVDECC_AECP_MESSAGE_TYPE_AEM_RESPONSE ) { if ( h->control_data_length >= JDKSAVDECC_AECPDU_AEM_LEN - JDKSAVDECC_COMMON_CONTROL_HEADER_LEN ) { if ( jdksavdecc_eui64_compare( &aem->aecpdu_header.controller_entity_id, &controller_entity_id ) == 0 ) { if ( jdksavdecc_eui64_compare( &aem->aecpdu_header.header.target_entity_id, &target_entity_id ) == 0 ) { if ( aem->aecpdu_header.sequence_id == sequence_id ) { r = 0; } } } } } } } return r; }
aecp::aecp(uint8_t *frame, size_t pos, size_t frame_len) { aecp_frame = (uint8_t *)malloc(frame_len * sizeof(uint8_t)); memcpy(aecp_frame, frame, frame_len); aecpdu_aem_read_returned = jdksavdecc_aecpdu_aem_read(&aecpdu, aecp_frame, pos, frame_len); if(aecpdu_aem_read_returned < 0) { log_imp_ref->post_log_msg(LOGGING_LEVEL_ERROR, "aecpdu_aem_read error"); assert(aecpdu_aem_read_returned >= 0); } }
void jdksavdecc_aecp_print(struct jdksavdecc_printer *self, struct jdksavdecc_aecpdu_common const *msg, void const *p, ssize_t pos, size_t len) { jdksavdecc_aecp_common_print(self,msg); switch( msg->header.message_type ) { // Todo: put more detail into printing of non-aem messages case JDKSAVDECC_AECP_MESSAGE_TYPE_AEM_COMMAND: { struct jdksavdecc_aecpdu_aem aem; if( jdksavdecc_aecpdu_aem_read(&aem,p,pos,len) > 0 ) { jdksavdecc_aem_command_print(self,&aem,p,pos,len); } break; } case JDKSAVDECC_AECP_MESSAGE_TYPE_AEM_RESPONSE: { struct jdksavdecc_aecpdu_aem aem; if( jdksavdecc_aecpdu_aem_read(&aem,p,pos,len) > 0 ) { jdksavdecc_aem_response_print(self,&aem,p,pos,len); } break; } case JDKSAVDECC_AECP_MESSAGE_TYPE_ADDRESS_ACCESS_COMMAND: case JDKSAVDECC_AECP_MESSAGE_TYPE_ADDRESS_ACCESS_RESPONSE: jdksavdecc_aecp_common_print(self,msg); jdksavdecc_printer_print_label(self,"tlv_count"); jdksavdecc_printer_print_uint16(self,jdksavdecc_aecp_aa_get_tlv_count(p,pos)); jdksavdecc_printer_print_eol(self); jdksavdecc_printer_print_label(self,"payload"); jdksavdecc_printer_print_block(self,p,len,pos+JDKSAVDECC_AECPDU_AA_LEN,pos+msg->header.control_data_length-(JDKSAVDECC_AECPDU_AA_LEN -JDKSAVDECC_COMMON_CONTROL_HEADER_LEN) ); jdksavdecc_printer_print_eol(self); break; case JDKSAVDECC_AECP_MESSAGE_TYPE_AVC_COMMAND: case JDKSAVDECC_AECP_MESSAGE_TYPE_AVC_RESPONSE: jdksavdecc_aecp_common_print(self,msg); jdksavdecc_printer_print_label(self,"payload"); jdksavdecc_printer_print_block(self,p,len,pos+JDKSAVDECC_AECPDU_COMMON_LEN,pos+msg->header.control_data_length-(JDKSAVDECC_AECPDU_COMMON_LEN -JDKSAVDECC_COMMON_CONTROL_HEADER_LEN) ); jdksavdecc_printer_print_eol(self); break; case JDKSAVDECC_AECP_MESSAGE_TYPE_HDCP_APM_COMMAND: case JDKSAVDECC_AECP_MESSAGE_TYPE_HDCP_APM_RESPONSE: jdksavdecc_aecp_common_print(self,msg); jdksavdecc_printer_print_label(self,"payload"); jdksavdecc_printer_print_block(self,p,len,pos+JDKSAVDECC_AECPDU_COMMON_LEN,pos+msg->header.control_data_length-(JDKSAVDECC_AECPDU_COMMON_LEN -JDKSAVDECC_COMMON_CONTROL_HEADER_LEN) ); jdksavdecc_printer_print_eol(self); break; case JDKSAVDECC_AECP_MESSAGE_TYPE_VENDOR_UNIQUE_COMMAND: case JDKSAVDECC_AECP_MESSAGE_TYPE_VENDOR_UNIQUE_RESPONSE: jdksavdecc_aecp_common_print(self,msg); jdksavdecc_printer_print_label(self,"payload"); jdksavdecc_printer_print_block(self,p,len,pos+JDKSAVDECC_AECPDU_COMMON_LEN,pos+msg->header.control_data_length-(JDKSAVDECC_AECPDU_COMMON_LEN -JDKSAVDECC_COMMON_CONTROL_HEADER_LEN) ); jdksavdecc_printer_print_eol(self); break; case JDKSAVDECC_AECP_MESSAGE_TYPE_EXTENDED_COMMAND: case JDKSAVDECC_AECP_MESSAGE_TYPE_EXTENDED_RESPONSE: jdksavdecc_aecp_common_print(self,msg); jdksavdecc_printer_print_label(self,"payload"); jdksavdecc_printer_print_block(self,p,len,pos+JDKSAVDECC_AECPDU_COMMON_LEN,pos+msg->header.control_data_length-(JDKSAVDECC_AECPDU_COMMON_LEN -JDKSAVDECC_COMMON_CONTROL_HEADER_LEN) ); jdksavdecc_printer_print_eol(self); break; default: jdksavdecc_aecp_common_print(self,msg); jdksavdecc_printer_print_label(self,"payload"); jdksavdecc_printer_print_block(self,p,len,pos+JDKSAVDECC_AECPDU_COMMON_LEN,pos+msg->header.control_data_length-(JDKSAVDECC_AECPDU_COMMON_LEN -JDKSAVDECC_COMMON_CONTROL_HEADER_LEN) ); jdksavdecc_printer_print_eol(self); break; } }