static void avb_1722_1_create_adp_packet(int message_type, guid_t guid) { ethernet_hdr_t *hdr = (ethernet_hdr_t*) &avb_1722_1_buf[0]; avb_1722_1_adp_packet_t *pkt = (avb_1722_1_adp_packet_t*) (hdr + AVB_1722_1_PACKET_BODY_POINTER_OFFSET); memset(pkt, 0, sizeof(avb_1722_1_adp_packet_t)); avb_1722_1_create_1722_1_header(avb_1722_1_adp_dest_addr, DEFAULT_1722_1_ADP_SUBTYPE, message_type, (message_type==ENTITY_AVAILABLE)?AVB_1722_1_ADP_VALID_TIME:0, AVB_1722_1_ADP_CD_LENGTH, hdr); SET_LONG_WORD(pkt->entity_guid, guid); if (message_type != ENTITY_DISCOVER) { HTON_U32(pkt->vendor_id, AVB_1722_1_ADP_VENDOR_ID); HTON_U32(pkt->model_id, AVB_1722_1_ADP_MODEL_ID); HTON_U32(pkt->entity_capabilities, AVB_1722_1_ADP_ENTITY_CAPABILITIES); HTON_U16(pkt->talker_stream_sources, AVB_1722_1_ADP_TALKER_STREAM_SOURCES); HTON_U16(pkt->talker_capabilities, AVB_1722_1_ADP_TALKER_CAPABILITIES); HTON_U16(pkt->listener_stream_sinks, AVB_1722_1_ADP_LISTENER_STREAM_SINKS); HTON_U16(pkt->listener_capabilites, AVB_1722_1_ADP_LISTENER_CAPABILITIES); HTON_U32(pkt->controller_capabilities, AVB_1722_1_ADP_CONTROLLER_CAPABILITIES); HTON_U32(pkt->available_index, avb_1722_1_available_index); SET_LONG_WORD(pkt->as_grandmaster_id, as_grandmaster_id); HTON_U32(pkt->default_audio_format, AVB_1722_1_ADP_DEFAULT_AUDIO_FORMAT); HTON_U32(pkt->default_video_format, AVB_1722_1_ADP_DEFAULT_VIDEO_FORMAT); HTON_U32(pkt->association_id, AVB_1722_1_ADP_ASSOCIATION_ID); HTON_U32(pkt->entity_type, AVB_1722_1_ADP_ENTITY_TYPE_OTHER); } }
void mrp_encode_four_packed_event(char *buf, int event, mrp_attribute_type attr) { mrp_msg_header *hdr = (mrp_msg_header *) buf; mrp_vector_header *vector_hdr = (mrp_vector_header *) (buf + sizeof(mrp_msg_header)); int num_values = vector_hdr->NumberOfValuesLow; int first_value_length = first_value_lengths[attr]; char *vector = buf + sizeof(mrp_msg_header) + sizeof(mrp_vector_header) + first_value_length + (num_values+3)/3 + num_values/4 ; int shift_required = (num_values % 4 == 0); unsigned attr_list_length = attribute_length_length(hdr); if (shift_required) { char *endmark; if (send_ptr - vector > 0) memmove(vector+1, vector, send_ptr - vector); *vector = 0; attr_list_length++; send_ptr++; HTON_U16(hdr->AttributeListLength, attr_list_length); endmark = buf + sizeof(mrp_msg_header) + attr_list_length - 2; *endmark = 0; *(endmark+1) = 0; } *vector = encode_four_packed(event, num_values % 4, *vector); return; }
// Send an empty leave all message // This may be merged later with a redeclaration if we have // declaration for this attribute static void create_empty_msg(mrp_attribute_type attr, int leave_all) { mrp_msg_header *hdr = (mrp_msg_header *) send_ptr; mrp_vector_header *vector_hdr = (mrp_vector_header *) (send_ptr + sizeof(mrp_msg_header)); int hdr_length = sizeof(mrp_msg_header); int vector_length = 0; int first_value_length = first_value_lengths[attr]; int attr_list_length = first_value_length + sizeof(mrp_vector_header) + vector_length + sizeof(mrp_footer); int msg_length = hdr_length + attr_list_length; // clear message memset((char *)hdr, 0, msg_length); // Set the relevant fields hdr->AttributeType = encode_attr_type(attr); hdr->AttributeLength = first_value_length; HTON_U16(hdr->AttributeListLength, attr_list_length); vector_hdr->LeaveAllEventNumberOfValuesHigh = leave_all << 5; vector_hdr->NumberOfValuesLow = 0; send_ptr += msg_length; }