OpenDDS  Snapshot(2023/04/28-20:55)
Public Member Functions | Public Attributes | List of all members
OpenDDS::DCPS::TransportReassembly::FragInfo Struct Reference
Collaboration diagram for OpenDDS::DCPS::TransportReassembly::FragInfo:
Collaboration graph
[legend]

Public Member Functions

typedef OPENDDS_LIST (FragSample) FragSampleList
 
typedef OPENDDS_MAP (FragmentNumber, FragSampleList::iterator) FragSampleListIterMap
 
typedef OPENDDS_LIST (FragmentRange) FragGapList
 
typedef OPENDDS_MAP (FragmentNumber, FragGapList::iterator) FragGapListIterMap
 
 FragInfo ()
 
 FragInfo (bool hf, const FragSampleList &rl, ACE_UINT32 tf, const MonotonicTimePoint &expiration)
 
 FragInfo (const FragInfo &val)
 
FragInfooperator= (const FragInfo &rhs)
 
bool insert (const FragmentRange &fragRange, ReceivedDataSample &data)
 

Public Attributes

bool have_first_
 
FragSampleList sample_list_
 
FragSampleListIterMap sample_finder_
 
FragGapList gap_list_
 
FragGapListIterMap gap_finder_
 
ACE_UINT32 total_frags_
 
MonotonicTimePoint expiration_
 

Detailed Description

Definition at line 124 of file TransportReassembly.h.

Constructor & Destructor Documentation

◆ FragInfo() [1/3]

OpenDDS::DCPS::TransportReassembly::FragInfo::FragInfo ( )

◆ FragInfo() [2/3]

OpenDDS::DCPS::TransportReassembly::FragInfo::FragInfo ( bool  hf,
const FragSampleList &  rl,
ACE_UINT32  tf,
const MonotonicTimePoint expiration 
)

Definition at line 316 of file TransportReassembly.cpp.

References gap_finder_, gap_list_, sample_finder_, and sample_list_.

317  : have_first_(hf)
318  , sample_list_(rl)
319  , total_frags_(tf)
320  , expiration_(expiration)
321 {
322  for (FragSampleList::iterator it = sample_list_.begin(), prev = it; it != sample_list_.end(); ++it) {
323  sample_finder_[it->frag_range_.second] = it;
324  if (it != sample_list_.begin()) {
325  gap_list_.push_back(FragmentRange(prev->frag_range_.second + 1, it->frag_range_.first - 1));
326  }
327  prev = it;
328  }
329  for (FragGapList::iterator it = gap_list_.begin(); it != gap_list_.end(); ++it) {
330  gap_finder_[it->second] = it;
331  }
332 }
std::pair< FragmentNumber, FragmentNumber > FragmentRange

◆ FragInfo() [3/3]

OpenDDS::DCPS::TransportReassembly::FragInfo::FragInfo ( const FragInfo val)

Definition at line 334 of file TransportReassembly.cpp.

335 {
336  *this = val;
337 }

Member Function Documentation

◆ insert()

bool OpenDDS::DCPS::TransportReassembly::FragInfo::insert ( const FragmentRange fragRange,
ReceivedDataSample data 
)

Definition at line 370 of file TransportReassembly.cpp.

References OpenDDS::DCPS::ReceivedDataSample::append(), OpenDDS::DCPS::ReceivedDataSample::clear(), OpenDDS::XTypes::copy(), OpenDDS::DCPS::TransportReassembly::FragSample::frag_range_, OpenDDS::DCPS::ReceivedDataSample::get_fragment_range(), OpenDDS::DCPS::SequenceNumber::getValue(), OpenDDS::DCPS::ReceivedDataSample::has_data(), OpenDDS::DCPS::ReceivedDataSample::header_, OpenDDS::DCPS::DataSampleHeader::join(), LM_DEBUG, OpenDDS::DCPS::DataSampleHeader::more_fragments_, OPENDDS_END_VERSIONED_NAMESPACE_DECL, OpenDDS::DCPS::ReceivedDataSample::prepend(), OpenDDS::DCPS::TransportReassembly::FragSample::rec_ds_, sample_finder_, sample_list_, OpenDDS::DCPS::DataSampleHeader::sequence_, and VDBG.

Referenced by OpenDDS::DCPS::TransportReassembly::data_unavailable(), and OpenDDS::DCPS::TransportReassembly::reassemble_i().

371 {
372  const FragmentNumber prev = fragRange.first - 1, next = fragRange.second + 1;
373 
374  FragSampleList::iterator start = sample_list_.begin();
375  FragSampleListIterMap::iterator fit = sample_finder_.begin();
376  if (!sample_list_.empty()) {
377  fit = sample_finder_.lower_bound(prev);
378  if (fit != sample_finder_.end()) {
379  start = fit->second;
380  if (start->frag_range_.second != prev && start != sample_list_.begin()) {
381  --start;
382  --fit;
383  }
384  } else {
385  start = sample_list_.end();
386  --start;
387  --fit;
388  }
389  }
390 
391  const SequenceNumber::Value sn = data.header_.sequence_.getValue();
392 
393  for (FragSampleList::iterator it = start; it != sample_list_.end(); ++it) {
394  FragSample& fr = *it;
395  if (next < fr.frag_range_.first) {
396  // insert before 'it'
397  sample_finder_[fragRange.second] = sample_list_.insert(it, FragSample(fragRange, data));
398  data.clear();
399  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) inserted %q-%q on the left of %q-%q\n", sn, fragRange.first, fragRange.second, fr.frag_range_.first, fr.frag_range_.second));
400  return true;
401 
402  } else if (next == fr.frag_range_.first) {
403  // combine on left of fr
404  DataSampleHeader joined;
405  if (!DataSampleHeader::join(data.header_, fr.rec_ds_.header_, joined)) {
406  join_err("left");
407  return false;
408  }
409  fr.rec_ds_.header_ = joined;
410  if (fr.rec_ds_.has_data() && data.has_data()) {
411  fr.rec_ds_.prepend(data);
412  } else {
413  fr.rec_ds_.clear();
414  data.clear();
415  }
416  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) combined %q-%q with %q-%q on the left\n", sn, fragRange.first, fragRange.second, fr.frag_range_.first, fr.frag_range_.second));
417  fr.frag_range_.first = fragRange.first;
418  return true;
419 
420  } else if (fragRange.first < fr.frag_range_.first) {
421  // split and recursively insert both parts
422  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) splitting %q-%q into %q-%q and %q-%q and recursively inserting both\n", sn, fragRange.first, fragRange.second, fragRange.first, fr.frag_range_.first - 1, fr.frag_range_.first, fragRange.second));
423  ReceivedDataSample front_split = data.get_fragment_range(0, fr.frag_range_.first - fragRange.first - 1);
424  ReceivedDataSample back_split = data.get_fragment_range(fr.frag_range_.first - fragRange.first);
425  data.clear();
426  const bool r1 = insert(FragmentRange(fragRange.first, fr.frag_range_.first - 1), front_split);
427  const bool r2 = insert(FragmentRange(fr.frag_range_.first, fragRange.second), back_split);
428  return r1 || r2; // r1 will likely always be true, but check both
429 
430  } else if (fragRange.first < fr.frag_range_.second && fr.frag_range_.second < fragRange.second) {
431  // split and recursively insert just the back
432  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) splitting %q-%q in order to recursively insert %q-%q\n", sn, fragRange.first, fragRange.second, fr.frag_range_.second + 1, fragRange.second));
433  ReceivedDataSample back_split = data.get_fragment_range(fr.frag_range_.second - fragRange.first);
434  data.clear();
435  return insert(FragmentRange(fr.frag_range_.second + 1, fragRange.second), back_split);
436 
437  } else if (prev == fr.frag_range_.second) {
438  // combine on right of fr
439  if (!fr.rec_ds_.has_data()) {
440  fr.rec_ds_.header_.more_fragments_ = true;
441  }
442  DataSampleHeader joined;
443  if (!DataSampleHeader::join(fr.rec_ds_.header_, data.header_, joined)) {
444  join_err("right");
445  return false;
446  }
447  fr.rec_ds_.header_ = joined;
448  if (fr.rec_ds_.has_data() && data.has_data()) {
449  fr.rec_ds_.append(data);
450  } else {
451  fr.rec_ds_.clear();
452  data.clear();
453  }
454 
455  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) combined %q-%q with %q-%q on the right, removing and recursingly inserting\n", sn, fragRange.first, fragRange.second, fr.frag_range_.first, fr.frag_range_.second));
456 
457  FragmentRange range(fr.frag_range_.first, fragRange.second);
458  ReceivedDataSample copy(fr.rec_ds_);
459 
460  sample_list_.erase(it);
461  sample_finder_.erase(fit);
462 
463  return insert(range, copy);
464 
465  } else if (fr.frag_range_.first <= fragRange.first && fr.frag_range_.second >= fragRange.second) {
466  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) duplicate fragment range %q-%q, dropping\n", sn, fragRange.first, fragRange.second));
467  return false;
468  }
469  ++fit;
470  }
471 
472  // add to end of list
473  sample_finder_[fragRange.second] = sample_list_.insert(sample_list_.end(), FragSample(fragRange, data));
474  VDBG((LM_DEBUG, "(%P|%t) TransportReassembly::insert: (SN: %q) inserting %q-%q at the end of the fragment buffer list\n", sn, fragRange.first, fragRange.second));
475  data.clear();
476  return true;
477 }
#define VDBG(DBG_ARGS)
std::pair< FragmentNumber, FragmentNumber > FragmentRange
SequenceNumber::Value FragmentNumber
static bool join(const DataSampleHeader &first, const DataSampleHeader &second, DataSampleHeader &result)
DDS::ReturnCode_t copy(DDS::DynamicData_ptr dest, DDS::DynamicData_ptr src)
bool insert(const FragmentRange &fragRange, ReceivedDataSample &data)

◆ OPENDDS_LIST() [1/2]

typedef OpenDDS::DCPS::TransportReassembly::FragInfo::OPENDDS_LIST ( FragSample  )

◆ OPENDDS_LIST() [2/2]

typedef OpenDDS::DCPS::TransportReassembly::FragInfo::OPENDDS_LIST ( FragmentRange  )

◆ OPENDDS_MAP() [1/2]

typedef OpenDDS::DCPS::TransportReassembly::FragInfo::OPENDDS_MAP ( FragmentNumber  ,
FragSampleList::iterator   
)

◆ OPENDDS_MAP() [2/2]

typedef OpenDDS::DCPS::TransportReassembly::FragInfo::OPENDDS_MAP ( FragmentNumber  ,
FragGapList::iterator   
)

◆ operator=()

TransportReassembly::FragInfo & OpenDDS::DCPS::TransportReassembly::FragInfo::operator= ( const FragInfo rhs)

Definition at line 340 of file TransportReassembly.cpp.

References ACE_ERROR, ACE_TEXT(), expiration_, gap_finder_, gap_list_, have_first_, LM_ERROR, sample_finder_, sample_list_, and total_frags_.

341 {
342  if (this != &rhs) {
343  have_first_ = rhs.have_first_;
344  sample_list_ = rhs.sample_list_;
345  gap_list_ = rhs.gap_list_;
346  total_frags_ = rhs.total_frags_;
347  expiration_ = rhs.expiration_;
348  sample_finder_.clear();
349  gap_finder_.clear();
350  for (FragSampleList::iterator it = sample_list_.begin(); it != sample_list_.end(); ++it) {
351  sample_finder_[it->frag_range_.second] = it;
352  }
353  for (FragGapList::iterator it = gap_list_.begin(); it != gap_list_.end(); ++it) {
354  gap_finder_[it->second] = it;
355  }
356  }
357  return *this;
358 }

Member Data Documentation

◆ expiration_

MonotonicTimePoint OpenDDS::DCPS::TransportReassembly::FragInfo::expiration_

Definition at line 145 of file TransportReassembly.h.

Referenced by operator=().

◆ gap_finder_

FragGapListIterMap OpenDDS::DCPS::TransportReassembly::FragInfo::gap_finder_

Definition at line 143 of file TransportReassembly.h.

Referenced by FragInfo(), and operator=().

◆ gap_list_

FragGapList OpenDDS::DCPS::TransportReassembly::FragInfo::gap_list_

Definition at line 142 of file TransportReassembly.h.

Referenced by FragInfo(), and operator=().

◆ have_first_

bool OpenDDS::DCPS::TransportReassembly::FragInfo::have_first_

◆ sample_finder_

FragSampleListIterMap OpenDDS::DCPS::TransportReassembly::FragInfo::sample_finder_

Definition at line 141 of file TransportReassembly.h.

Referenced by FragInfo(), insert(), and operator=().

◆ sample_list_

FragSampleList OpenDDS::DCPS::TransportReassembly::FragInfo::sample_list_

◆ total_frags_

ACE_UINT32 OpenDDS::DCPS::TransportReassembly::FragInfo::total_frags_

Definition at line 144 of file TransportReassembly.h.

Referenced by operator=().


The documentation for this struct was generated from the following files: