示例#1
0
void
TAO::DCPS::ReliableMulticast::detail::SenderLogic::receive(
  const TAO::DCPS::ReliableMulticast::detail::Packet& p,
  PacketVector& redelivered
  ) const
{
  redelivered.clear();
  if (p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::NACK)
  {
    for (
      TAO::DCPS::ReliableMulticast::detail::Packet::id_type id = p.nack_begin_;
      id != p.nack_end_;
      ++id
      )
    {
      BufferType::const_iterator iter = buffer_.find(id);

      if (iter != buffer_.end())
      {
        redelivered.push_back(iter->second);
      }
      else
      {
        redelivered.push_back(TAO::DCPS::ReliableMulticast::detail::Packet(
          id,
          TAO::DCPS::ReliableMulticast::detail::Packet::DATA_NOT_AVAILABLE
          ));
      }
    }
  }
}
示例#2
0
void
TAO::DCPS::ReliableMulticast::detail::SenderLogic::send(
  const TAO::DCPS::ReliableMulticast::detail::Packet& p,
  PacketVector& delivered
  )
{
  delivered.clear();
  if (
    p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::DATA_INTERMEDIATE ||
    p.type_ == TAO::DCPS::ReliableMulticast::detail::Packet::DATA_END_OF_MESSAGE
    )
  {
    buffer_packet(p, delivered);
  }
}
示例#3
0
void
OpenDDS::DCPS::ReliableMulticast::detail::ReceiverLogic::receive(
  const Packet& p,
  PacketVector& nacks,
  PacketVector& delivered
  )
{
  delivered.clear();

  // todo: validate
  if (!seen_last_delivered_)
  {
    if (
      p.type_ == Packet::DATA_INTERMEDIATE ||
      p.type_ == Packet::DATA_END_OF_MESSAGE
      )
    {
      last_delivered_id_ = p.id_ - 1;
      seen_last_delivered_ = true;
    }
    else
    {
      return;
    }
  }

  if (
    p.type_ == Packet::DATA_INTERMEDIATE ||
    p.type_ == Packet::DATA_END_OF_MESSAGE ||
    p.type_ == Packet::DATA_NOT_AVAILABLE
    )
  {
    bool prior_nack_canceled = nacker_.cancel(p.id_);

    if (in_range(p.id_, 1, receiver_buffer_size_ + receiver_buffer_size_))
    {
      if (p.id_ == last_delivered_id_ + 1)
      {
        Packet tmp_packet;

        deliver(delivered, p);
        while (get_and_remove_buffered_packet(
          last_delivered_id_ + 1,
          tmp_packet
          ))
        {
          deliver(delivered, tmp_packet);
        }
      }
      else if (!is_buffered(p))
      {
        if (
          p.type_ == Packet::DATA_INTERMEDIATE ||
          p.type_ == Packet::DATA_END_OF_MESSAGE
          )
        {
          buffer_packet(p, delivered);
          if (!prior_nack_canceled)
          {
            nacker_.nack_range(find_previous_received(p.id_) + 1, p.id_);
          }
        }
        else if (p.type_ == Packet::DATA_NOT_AVAILABLE)
        {
          handle_unreliable_operation(delivered);
        }
      }
    }
  }
  else if (p.type_ == Packet::HEARTBEAT)
  {
    if (!in_range(p.id_, 0 - 2 * receiver_buffer_size_, 0))
    {
      // NACK the last packet, which will send it along and
      // then trigger the above NACK code...
      nacker_.nack_range(p.id_, p.id_ + 1);
    }
  }

  nacker_.get_nacks(nacks);
}