コード例 #1
0
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);
	  }
}
コード例 #2
0
ファイル: avb_mrp.c プロジェクト: dbrignoli/sw_avb
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;
}
コード例 #3
0
ファイル: avb_mrp.c プロジェクト: dbrignoli/sw_avb
// 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;
}