PageRenderTime 119ms CodeModel.GetById 32ms RepoModel.GetById 3ms app.codeStats 0ms

/doc/doxy/class_t_c_p_s_a_c_k_rexmit_queue.html

https://bitbucket.org/ymir/inet
HTML | 933 lines | 877 code | 54 blank | 2 comment | 0 complexity | 46c281e3a358eb61a3159e86c9c148f6 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
  5. <title>INET Framework for OMNeT++/OMNEST: TCPSACKRexmitQueue Class Reference</title>
  6. <link href="tabs.css" rel="stylesheet" type="text/css"/>
  7. <link href="navtree.css" rel="stylesheet" type="text/css"/>
  8. <script type="text/javascript" src="jquery.js"></script>
  9. <script type="text/javascript" src="navtree.js"></script>
  10. <script type="text/javascript" src="resize.js"></script>
  11. <script type="text/javascript">
  12. $(document).ready(initResizable);
  13. </script>
  14. <link href="doxygen.css" rel="stylesheet" type="text/css"/>
  15. </head>
  16. <body>
  17. <!-- Generated by Doxygen 1.7.4 -->
  18. <div id="top">
  19. <div id="titlearea">
  20. <table cellspacing="0" cellpadding="0">
  21. <tbody>
  22. <tr style="height: 56px;">
  23. <td style="padding-left: 0.5em;">
  24. <div id="projectname">INET Framework for OMNeT++/OMNEST</div>
  25. </td>
  26. </tr>
  27. </tbody>
  28. </table>
  29. </div>
  30. <div id="navrow1" class="tabs">
  31. <ul class="tablist">
  32. <li><a href="index.html"><span>Main&#160;Page</span></a></li>
  33. <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
  34. <li><a href="namespaces.html"><span>Namespaces</span></a></li>
  35. <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
  36. <li><a href="files.html"><span>Files</span></a></li>
  37. <li><a href="dirs.html"><span>Directories</span></a></li>
  38. </ul>
  39. </div>
  40. <div id="navrow2" class="tabs2">
  41. <ul class="tablist">
  42. <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
  43. <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
  44. <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
  45. </ul>
  46. </div>
  47. </div>
  48. <div id="side-nav" class="ui-resizable side-nav-resizable">
  49. <div id="nav-tree">
  50. <div id="nav-tree-contents">
  51. </div>
  52. </div>
  53. <div id="splitbar" style="-moz-user-select:none;"
  54. class="ui-resizable-handle">
  55. </div>
  56. </div>
  57. <script type="text/javascript">
  58. initNavTree('class_t_c_p_s_a_c_k_rexmit_queue.html','');
  59. </script>
  60. <div id="doc-content">
  61. <div class="header">
  62. <div class="summary">
  63. <a href="#nested-classes">Classes</a> &#124;
  64. <a href="#pub-types">Public Types</a> &#124;
  65. <a href="#pub-methods">Public Member Functions</a> &#124;
  66. <a href="#pub-attribs">Public Attributes</a> </div>
  67. <div class="headertitle">
  68. <div class="title">TCPSACKRexmitQueue Class Reference</div> </div>
  69. </div>
  70. <div class="contents">
  71. <!-- doxytag: class="TCPSACKRexmitQueue" -->
  72. <p><code>#include &lt;TCPSACKRexmitQueue.h&gt;</code></p>
  73. <p><a href="class_t_c_p_s_a_c_k_rexmit_queue-members.html">List of all members.</a></p>
  74. <table class="memberdecls">
  75. <tr><td colspan="2"><h2><a name="nested-classes"></a>
  76. Classes</h2></td></tr>
  77. <tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_t_c_p_s_a_c_k_rexmit_queue_1_1_region.html">Region</a></td></tr>
  78. <tr><td colspan="2"><h2><a name="pub-types"></a>
  79. Public Types</h2></td></tr>
  80. <tr><td class="memItemLeft" align="right" valign="top">typedef std::list&lt; <a class="el" href="struct_t_c_p_s_a_c_k_rexmit_queue_1_1_region.html">Region</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a781aa79dc8c63e63e3c63862acc2a2e7">RexmitQueue</a></td></tr>
  81. <tr><td colspan="2"><h2><a name="pub-methods"></a>
  82. Public Member Functions</h2></td></tr>
  83. <tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a0bf1372385f41f2546fccab62c7f9a2d">TCPSACKRexmitQueue</a> ()</td></tr>
  84. <tr><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a2d307d6697c2059f8e31638254cc6b1c">~TCPSACKRexmitQueue</a> ()</td></tr>
  85. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a76c212912f59518e0b05a79c494ac0e2">setConnection</a> (<a class="el" href="class_t_c_p_connection.html">TCPConnection</a> *_conn)</td></tr>
  86. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a342033845eaaf7a565c82fb70718ca0e">init</a> (uint32 seqNum)</td></tr>
  87. <tr><td class="memItemLeft" align="right" valign="top">virtual std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ad2f55eea975ad487c30ce421de967424">str</a> () const </td></tr>
  88. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#af2d58fd127e40c421dde848d242f9e39">info</a> ()</td></tr>
  89. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a70457a2096dfd6e0f6dcf172bd9488cd">getBufferStartSeq</a> ()</td></tr>
  90. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#aab51c929cca62ab481aebf24ecaff747">getBufferEndSeq</a> ()</td></tr>
  91. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a07b77209c59eb50fce9751418039ed64">discardUpTo</a> (uint32 seqNum)</td></tr>
  92. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a6eb4b2c4417dfff97a1734c9a43fca76">enqueueSentData</a> (uint32 fromSeqNum, uint32 toSeqNum)</td></tr>
  93. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#abd0309b9f592a452399c73174bbd94cf">setSackedBit</a> (uint32 fromSeqNum, uint32 toSeqNum)</td></tr>
  94. <tr><td class="memItemLeft" align="right" valign="top">virtual bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#af9d8cbda22d7ae05a8d367d69ec23127">getSackedBit</a> (uint32 seqNum)</td></tr>
  95. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ab06b7b8f9c9084d258bc14375a2f3b39">getQueueLength</a> ()</td></tr>
  96. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a56303d12ec8a593e9f4f58dabbb79d8d">getHighestSackedSeqNum</a> ()</td></tr>
  97. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a375f04cfa1ff9d8f044864332cc2fbaf">getHighestRexmittedSeqNum</a> ()</td></tr>
  98. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a8c83d42828fe0c5477981025d6d105fb">checkRexmitQueueForSackedOrRexmittedSegments</a> (uint32 fromSeq)</td></tr>
  99. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#adfa5c6f04f91b16f9c98258f6ede0052">resetSackedBit</a> ()</td></tr>
  100. <tr><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#afe96b5040346953484decf38ab2644e5">resetRexmittedBit</a> ()</td></tr>
  101. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a9e3ff65826298ce1b2000bbd0bc04957">getTotalAmountOfSackedBytes</a> ()</td></tr>
  102. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ab41d57345e37e6db6d9e7a0db5ae0580">getAmountOfSackedBytes</a> (uint32 seqNum)</td></tr>
  103. <tr><td class="memItemLeft" align="right" valign="top">virtual uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a54be5e710f72ed92239d5e20b0729b97">getNumOfDiscontiguousSacks</a> (uint32 seqNum)</td></tr>
  104. <tr><td colspan="2"><h2><a name="pub-attribs"></a>
  105. Public Attributes</h2></td></tr>
  106. <tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="class_t_c_p_connection.html">TCPConnection</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a0dcb9791b18a4c26ed38ad6593c2d470">conn</a></td></tr>
  107. <tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a781aa79dc8c63e63e3c63862acc2a2e7">RexmitQueue</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a></td></tr>
  108. <tr><td class="memItemLeft" align="right" valign="top">uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a></td></tr>
  109. <tr><td class="memItemLeft" align="right" valign="top">uint32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a></td></tr>
  110. </table>
  111. <hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
  112. <div class="textblock"><p>Retransmission data for SACK. </p>
  113. </div><hr/><h2>Member Typedef Documentation</h2>
  114. <a class="anchor" id="a781aa79dc8c63e63e3c63862acc2a2e7"></a><!-- doxytag: member="TCPSACKRexmitQueue::RexmitQueue" ref="a781aa79dc8c63e63e3c63862acc2a2e7" args="" -->
  115. <div class="memitem">
  116. <div class="memproto">
  117. <table class="memname">
  118. <tr>
  119. <td class="memname">typedef std::list&lt;<a class="el" href="struct_t_c_p_s_a_c_k_rexmit_queue_1_1_region.html">Region</a>&gt; <a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a781aa79dc8c63e63e3c63862acc2a2e7">TCPSACKRexmitQueue::RexmitQueue</a></td>
  120. </tr>
  121. </table>
  122. </div>
  123. <div class="memdoc">
  124. </div>
  125. </div>
  126. <hr/><h2>Constructor &amp; Destructor Documentation</h2>
  127. <a class="anchor" id="a0bf1372385f41f2546fccab62c7f9a2d"></a><!-- doxytag: member="TCPSACKRexmitQueue::TCPSACKRexmitQueue" ref="a0bf1372385f41f2546fccab62c7f9a2d" args="()" -->
  128. <div class="memitem">
  129. <div class="memproto">
  130. <table class="memname">
  131. <tr>
  132. <td class="memname">TCPSACKRexmitQueue::TCPSACKRexmitQueue </td>
  133. <td>(</td>
  134. <td class="paramname"></td><td>)</td>
  135. <td></td>
  136. </tr>
  137. </table>
  138. </div>
  139. <div class="memdoc">
  140. <p>Ctor </p>
  141. <div class="fragment"><pre class="fragment">{
  142. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a0dcb9791b18a4c26ed38ad6593c2d470">conn</a> = NULL;
  143. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a> = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a> = 0;
  144. }
  145. </pre></div>
  146. </div>
  147. </div>
  148. <a class="anchor" id="a2d307d6697c2059f8e31638254cc6b1c"></a><!-- doxytag: member="TCPSACKRexmitQueue::~TCPSACKRexmitQueue" ref="a2d307d6697c2059f8e31638254cc6b1c" args="()" -->
  149. <div class="memitem">
  150. <div class="memproto">
  151. <table class="memname">
  152. <tr>
  153. <td class="memname">TCPSACKRexmitQueue::~TCPSACKRexmitQueue </td>
  154. <td>(</td>
  155. <td class="paramname"></td><td>)</td>
  156. <td><code> [virtual]</code></td>
  157. </tr>
  158. </table>
  159. </div>
  160. <div class="memdoc">
  161. <p>Virtual dtor. </p>
  162. <div class="fragment"><pre class="fragment">{
  163. <span class="keywordflow">while</span> (!<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.empty())
  164. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.pop_front();
  165. }
  166. </pre></div>
  167. </div>
  168. </div>
  169. <hr/><h2>Member Function Documentation</h2>
  170. <a class="anchor" id="a8c83d42828fe0c5477981025d6d105fb"></a><!-- doxytag: member="TCPSACKRexmitQueue::checkRexmitQueueForSackedOrRexmittedSegments" ref="a8c83d42828fe0c5477981025d6d105fb" args="(uint32 fromSeq)" -->
  171. <div class="memitem">
  172. <div class="memproto">
  173. <table class="memname">
  174. <tr>
  175. <td class="memname">uint32 TCPSACKRexmitQueue::checkRexmitQueueForSackedOrRexmittedSegments </td>
  176. <td>(</td>
  177. <td class="paramtype">uint32&#160;</td>
  178. <td class="paramname"><em>fromSeq</em></td><td>)</td>
  179. <td><code> [virtual]</code></td>
  180. </tr>
  181. </table>
  182. </div>
  183. <div class="memdoc">
  184. <p>Checks rexmit queue for sacked of rexmitted segments and returns a certain offset (contiguous sacked or rexmitted region) to forward snd-&gt;nxt. It is called before retransmitting data. </p>
  185. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#af71155c4fad49ea52907d840463a06d5">TCPConnection::sendSegment()</a>.</p>
  186. <div class="fragment"><pre class="fragment">{
  187. uint32 counter = 0;
  188. <span class="keywordflow">if</span> (fromSeqNum==0 || <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.empty() || !(<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a>,fromSeqNum) &amp;&amp; <a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(fromSeqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>)))
  189. <span class="keywordflow">return</span> counter;
  190. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  191. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  192. {
  193. <span class="comment">// search for fromSeqNum (snd_nxt)</span>
  194. <span class="keywordflow">if</span> (i-&gt;beginSeqNum == fromSeqNum)
  195. <span class="keywordflow">break</span>;
  196. <span class="keywordflow">else</span>
  197. i++;
  198. }
  199. <span class="comment">// search for adjacent sacked/rexmitted regions</span>
  200. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  201. {
  202. <span class="keywordflow">if</span> (i-&gt;sacked || i-&gt;rexmitted)
  203. {
  204. counter = counter + (i-&gt;endSeqNum - i-&gt;beginSeqNum);
  205. <span class="comment">// adjacent regions?</span>
  206. uint32 tmp = i-&gt;endSeqNum;
  207. i++;
  208. <span class="keywordflow">if</span> (i-&gt;beginSeqNum != tmp)
  209. <span class="keywordflow">break</span>;
  210. }
  211. <span class="keywordflow">else</span>
  212. <span class="keywordflow">break</span>;
  213. }
  214. <span class="keywordflow">return</span> counter;
  215. }
  216. </pre></div>
  217. </div>
  218. </div>
  219. <a class="anchor" id="a07b77209c59eb50fce9751418039ed64"></a><!-- doxytag: member="TCPSACKRexmitQueue::discardUpTo" ref="a07b77209c59eb50fce9751418039ed64" args="(uint32 seqNum)" -->
  220. <div class="memitem">
  221. <div class="memproto">
  222. <table class="memname">
  223. <tr>
  224. <td class="memname">void TCPSACKRexmitQueue::discardUpTo </td>
  225. <td>(</td>
  226. <td class="paramtype">uint32&#160;</td>
  227. <td class="paramname"><em>seqNum</em></td><td>)</td>
  228. <td><code> [virtual]</code></td>
  229. </tr>
  230. </table>
  231. </div>
  232. <div class="memdoc">
  233. <p>Tells the queue that bytes up to (but NOT including) seqNum have been transmitted and ACKed, so they can be removed from the queue. </p>
  234. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#ac1144f5ca6e960176d6e623998cb7456">TCPConnection::processAckInEstabEtc()</a>, <a class="el" href="class_t_c_p_connection.html#a4d240ca8f36aa37a29b8bcc44ec052cd">TCPConnection::processRstInSynReceived()</a>, and <a class="el" href="class_t_c_p_connection.html#a12b903f9e148f5c26f926dcdc8107c86">TCPConnection::processSegmentInSynSent()</a>.</p>
  235. <div class="fragment"><pre class="fragment">{
  236. <span class="keywordflow">if</span> (<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.empty())
  237. <span class="keywordflow">return</span>;
  238. ASSERT(<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a>,seqNum) &amp;&amp; <a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(seqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>));
  239. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a> = seqNum;
  240. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  241. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end()) <span class="comment">// discard/delete regions from rexmit queue, which have been acked</span>
  242. {
  243. <span class="keywordflow">if</span> (<a class="code" href="_t_c_p_segment_8h.html#aa2e84a0093c6f222b12a4b443c7278eb">seqLess</a>(i-&gt;beginSeqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a>))
  244. i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.erase(i);
  245. <span class="keywordflow">else</span>
  246. i++;
  247. }
  248. <span class="comment">// update begin and end of rexmit queue</span>
  249. <span class="keywordflow">if</span> (<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.empty())
  250. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a> = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a> = 0;
  251. <span class="keywordflow">else</span>
  252. {
  253. i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  254. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a> = i-&gt;beginSeqNum;
  255. i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end();
  256. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a> = i-&gt;endSeqNum;
  257. }
  258. }
  259. </pre></div>
  260. </div>
  261. </div>
  262. <a class="anchor" id="a6eb4b2c4417dfff97a1734c9a43fca76"></a><!-- doxytag: member="TCPSACKRexmitQueue::enqueueSentData" ref="a6eb4b2c4417dfff97a1734c9a43fca76" args="(uint32 fromSeqNum, uint32 toSeqNum)" -->
  263. <div class="memitem">
  264. <div class="memproto">
  265. <table class="memname">
  266. <tr>
  267. <td class="memname">void TCPSACKRexmitQueue::enqueueSentData </td>
  268. <td>(</td>
  269. <td class="paramtype">uint32&#160;</td>
  270. <td class="paramname"><em>fromSeqNum</em>, </td>
  271. </tr>
  272. <tr>
  273. <td class="paramkey"></td>
  274. <td></td>
  275. <td class="paramtype">uint32&#160;</td>
  276. <td class="paramname"><em>toSeqNum</em>&#160;</td>
  277. </tr>
  278. <tr>
  279. <td></td>
  280. <td>)</td>
  281. <td></td><td><code> [virtual]</code></td>
  282. </tr>
  283. </table>
  284. </div>
  285. <div class="memdoc">
  286. <p>Inserts sent data to the rexmit queue. </p>
  287. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#af71155c4fad49ea52907d840463a06d5">TCPConnection::sendSegment()</a>.</p>
  288. <div class="fragment"><pre class="fragment">{
  289. <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
  290. <a class="code" href="_t_c_p_8h.html#a601325e92d65fe658c80eab711e12304">tcpEV</a> &lt;&lt; <span class="stringliteral">&quot;rexmitQ: &quot;</span> &lt;&lt; <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ad2f55eea975ad487c30ce421de967424">str</a>() &lt;&lt; <span class="stringliteral">&quot; enqueueSentData [&quot;</span> &lt;&lt; fromSeqNum &lt;&lt; <span class="stringliteral">&quot;..&quot;</span> &lt;&lt; toSeqNum &lt;&lt; <span class="stringliteral">&quot;)\n&quot;</span>;
  291. Region region;
  292. region.beginSeqNum = fromSeqNum;
  293. region.endSeqNum = toSeqNum;
  294. region.sacked = <span class="keyword">false</span>;
  295. region.rexmitted = <span class="keyword">false</span>;
  296. <span class="keywordflow">if</span> (<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ab06b7b8f9c9084d258bc14375a2f3b39">getQueueLength</a>()==0)
  297. {
  298. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a> = fromSeqNum;
  299. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a> = toSeqNum;
  300. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.push_back(region);
  301. <span class="comment">// tcpEV &lt;&lt; &quot;rexmitQ: rexmitQLength=&quot; &lt;&lt; getQueueLength() &lt;&lt; &quot;\n&quot;;</span>
  302. <span class="keywordflow">return</span>;
  303. }
  304. <span class="keywordflow">if</span> (<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a>,fromSeqNum) &amp;&amp; <a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(toSeqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>))
  305. {
  306. <span class="comment">// Search for region in queue!</span>
  307. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  308. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  309. {
  310. <span class="keywordflow">if</span> (i-&gt;beginSeqNum == fromSeqNum &amp;&amp; i-&gt;endSeqNum == toSeqNum)
  311. {
  312. i-&gt;rexmitted = <span class="keyword">true</span>; <span class="comment">// set rexmitted bit</span>
  313. found = <span class="keyword">true</span>;
  314. }
  315. i++;
  316. }
  317. }
  318. <span class="keywordflow">if</span> (!found)
  319. {
  320. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a> = toSeqNum;
  321. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.push_back(region);
  322. }
  323. <span class="comment">// tcpEV &lt;&lt; &quot;rexmitQ: rexmitQLength=&quot; &lt;&lt; getQueueLength() &lt;&lt; &quot;\n&quot;;</span>
  324. }
  325. </pre></div>
  326. </div>
  327. </div>
  328. <a class="anchor" id="ab41d57345e37e6db6d9e7a0db5ae0580"></a><!-- doxytag: member="TCPSACKRexmitQueue::getAmountOfSackedBytes" ref="ab41d57345e37e6db6d9e7a0db5ae0580" args="(uint32 seqNum)" -->
  329. <div class="memitem">
  330. <div class="memproto">
  331. <table class="memname">
  332. <tr>
  333. <td class="memname">uint32 TCPSACKRexmitQueue::getAmountOfSackedBytes </td>
  334. <td>(</td>
  335. <td class="paramtype">uint32&#160;</td>
  336. <td class="paramname"><em>seqNum</em></td><td>)</td>
  337. <td><code> [virtual]</code></td>
  338. </tr>
  339. </table>
  340. </div>
  341. <div class="memdoc">
  342. <p>Returns amount of sacked bytes above seqNum. </p>
  343. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a261dc1ebd41e03d655b112f2b82b3f08">TCPConnection::isLost()</a>.</p>
  344. <div class="fragment"><pre class="fragment">{
  345. uint32 bytes = 0;
  346. uint32 counter = 0;
  347. <span class="keywordflow">if</span> (<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.empty() || <a class="code" href="_t_c_p_segment_8h.html#af4745b9cf95eb5b78d8ae6c3c8429cfc">seqGE</a>(seqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>))
  348. <span class="keywordflow">return</span> counter;
  349. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  350. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end() &amp;&amp; <a class="code" href="_t_c_p_segment_8h.html#aa2e84a0093c6f222b12a4b443c7278eb">seqLess</a>(i-&gt;beginSeqNum, seqNum)) <span class="comment">// search for seqNum</span>
  351. {
  352. i++;
  353. <span class="keywordflow">if</span> (i-&gt;beginSeqNum == seqNum)
  354. <span class="keywordflow">break</span>;
  355. }
  356. ASSERT(<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(seqNum,i-&gt;beginSeqNum) || <a class="code" href="_t_c_p_segment_8h.html#af4745b9cf95eb5b78d8ae6c3c8429cfc">seqGE</a>(seqNum,--i-&gt;endSeqNum));
  357. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  358. {
  359. <span class="keywordflow">if</span> (i-&gt;sacked)
  360. {
  361. counter++;
  362. bytes = bytes + (i-&gt;endSeqNum - i-&gt;beginSeqNum);
  363. }
  364. i++;
  365. }
  366. <span class="keywordflow">return</span> bytes;
  367. }
  368. </pre></div>
  369. </div>
  370. </div>
  371. <a class="anchor" id="aab51c929cca62ab481aebf24ecaff747"></a><!-- doxytag: member="TCPSACKRexmitQueue::getBufferEndSeq" ref="aab51c929cca62ab481aebf24ecaff747" args="()" -->
  372. <div class="memitem">
  373. <div class="memproto">
  374. <table class="memname">
  375. <tr>
  376. <td class="memname">uint32 TCPSACKRexmitQueue::getBufferEndSeq </td>
  377. <td>(</td>
  378. <td class="paramname"></td><td>)</td>
  379. <td><code> [virtual]</code></td>
  380. </tr>
  381. </table>
  382. </div>
  383. <div class="memdoc">
  384. <p>Returns the sequence number of the last byte stored in the buffer plus one. (The first byte of the next send operation would get this sequence number.) </p>
  385. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a4d240ca8f36aa37a29b8bcc44ec052cd">TCPConnection::processRstInSynReceived()</a>.</p>
  386. <div class="fragment"><pre class="fragment">{
  387. <span class="keywordflow">return</span> <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>;
  388. }
  389. </pre></div>
  390. </div>
  391. </div>
  392. <a class="anchor" id="a70457a2096dfd6e0f6dcf172bd9488cd"></a><!-- doxytag: member="TCPSACKRexmitQueue::getBufferStartSeq" ref="a70457a2096dfd6e0f6dcf172bd9488cd" args="()" -->
  393. <div class="memitem">
  394. <div class="memproto">
  395. <table class="memname">
  396. <tr>
  397. <td class="memname">uint32 TCPSACKRexmitQueue::getBufferStartSeq </td>
  398. <td>(</td>
  399. <td class="paramname"></td><td>)</td>
  400. <td><code> [virtual]</code></td>
  401. </tr>
  402. </table>
  403. </div>
  404. <div class="memdoc">
  405. <p>Returns the sequence number of the first byte stored in the buffer. </p>
  406. <div class="fragment"><pre class="fragment">{
  407. <span class="keywordflow">return</span> <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a>;
  408. }
  409. </pre></div>
  410. </div>
  411. </div>
  412. <a class="anchor" id="a375f04cfa1ff9d8f044864332cc2fbaf"></a><!-- doxytag: member="TCPSACKRexmitQueue::getHighestRexmittedSeqNum" ref="a375f04cfa1ff9d8f044864332cc2fbaf" args="()" -->
  413. <div class="memitem">
  414. <div class="memproto">
  415. <table class="memname">
  416. <tr>
  417. <td class="memname">uint32 TCPSACKRexmitQueue::getHighestRexmittedSeqNum </td>
  418. <td>(</td>
  419. <td class="paramname"></td><td>)</td>
  420. <td><code> [virtual]</code></td>
  421. </tr>
  422. </table>
  423. </div>
  424. <div class="memdoc">
  425. <p>Returns the highest sequence number rexmitted by data sender. </p>
  426. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#ae8d9450252219a54062112f6d8688309">TCPConnection::nextSeg()</a>, <a class="el" href="class_t_c_p_connection.html#a8ae68910942bd1ea6558ae7849ae22ea">TCPConnection::retransmitOneSegment()</a>, <a class="el" href="class_t_c_p_connection.html#a0238c323366884c6598d7d92d21f69ab">TCPConnection::sendData()</a>, <a class="el" href="class_t_c_p_connection.html#ac922b39992f510ef7803067e675d80f1">TCPConnection::sendSegmentDuringLossRecoveryPhase()</a>, and <a class="el" href="class_t_c_p_connection.html#a728bea28fa24566bb22935f0de7c4655">TCPConnection::setPipe()</a>.</p>
  427. <div class="fragment"><pre class="fragment">{
  428. uint32 tmp_highest_rexmitted = 0;
  429. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  430. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  431. {
  432. <span class="keywordflow">if</span> (i-&gt;rexmitted)
  433. tmp_highest_rexmitted = i-&gt;endSeqNum;
  434. i++;
  435. }
  436. <span class="keywordflow">return</span> tmp_highest_rexmitted;
  437. }
  438. </pre></div>
  439. </div>
  440. </div>
  441. <a class="anchor" id="a56303d12ec8a593e9f4f58dabbb79d8d"></a><!-- doxytag: member="TCPSACKRexmitQueue::getHighestSackedSeqNum" ref="a56303d12ec8a593e9f4f58dabbb79d8d" args="()" -->
  442. <div class="memitem">
  443. <div class="memproto">
  444. <table class="memname">
  445. <tr>
  446. <td class="memname">uint32 TCPSACKRexmitQueue::getHighestSackedSeqNum </td>
  447. <td>(</td>
  448. <td class="paramname"></td><td>)</td>
  449. <td><code> [virtual]</code></td>
  450. </tr>
  451. </table>
  452. </div>
  453. <div class="memdoc">
  454. <p>Returns the highest sequence number sacked by data receiver. </p>
  455. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#ae8d9450252219a54062112f6d8688309">TCPConnection::nextSeg()</a>.</p>
  456. <div class="fragment"><pre class="fragment">{
  457. uint32 tmp_highest_sacked = 0;
  458. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  459. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  460. {
  461. <span class="keywordflow">if</span> (i-&gt;sacked)
  462. tmp_highest_sacked = i-&gt;endSeqNum;
  463. i++;
  464. }
  465. <span class="keywordflow">return</span> tmp_highest_sacked;
  466. }
  467. </pre></div>
  468. </div>
  469. </div>
  470. <a class="anchor" id="a54be5e710f72ed92239d5e20b0729b97"></a><!-- doxytag: member="TCPSACKRexmitQueue::getNumOfDiscontiguousSacks" ref="a54be5e710f72ed92239d5e20b0729b97" args="(uint32 seqNum)" -->
  471. <div class="memitem">
  472. <div class="memproto">
  473. <table class="memname">
  474. <tr>
  475. <td class="memname">uint32 TCPSACKRexmitQueue::getNumOfDiscontiguousSacks </td>
  476. <td>(</td>
  477. <td class="paramtype">uint32&#160;</td>
  478. <td class="paramname"><em>seqNum</em></td><td>)</td>
  479. <td><code> [virtual]</code></td>
  480. </tr>
  481. </table>
  482. </div>
  483. <div class="memdoc">
  484. <p>Returns the number of discontiguous sacked regions (SACKed sequences) above seqNum. </p>
  485. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a261dc1ebd41e03d655b112f2b82b3f08">TCPConnection::isLost()</a>.</p>
  486. <div class="fragment"><pre class="fragment">{
  487. uint32 counter = 0;
  488. <span class="keywordflow">if</span> (<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.empty() || <a class="code" href="_t_c_p_segment_8h.html#af4745b9cf95eb5b78d8ae6c3c8429cfc">seqGE</a>(seqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>))
  489. <span class="keywordflow">return</span> counter;
  490. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  491. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end() &amp;&amp; <a class="code" href="_t_c_p_segment_8h.html#aa2e84a0093c6f222b12a4b443c7278eb">seqLess</a>(i-&gt;beginSeqNum, seqNum)) <span class="comment">// search for seqNum</span>
  492. {
  493. i++;
  494. <span class="keywordflow">if</span> (i-&gt;beginSeqNum == seqNum)
  495. <span class="keywordflow">break</span>;
  496. }
  497. ASSERT(<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(seqNum,i-&gt;beginSeqNum) || <a class="code" href="_t_c_p_segment_8h.html#af4745b9cf95eb5b78d8ae6c3c8429cfc">seqGE</a>(seqNum,--i-&gt;endSeqNum));
  498. <span class="comment">// search for discontiguous sacked regions</span>
  499. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  500. {
  501. <span class="keywordflow">if</span> (i-&gt;sacked)
  502. {
  503. counter++;
  504. uint32 tmp = i-&gt;endSeqNum;
  505. i++;
  506. <span class="keywordflow">while</span> (i-&gt;sacked &amp;&amp; i-&gt;beginSeqNum == tmp &amp;&amp; i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end()) <span class="comment">// adjacent sacked regions?</span>
  507. {
  508. tmp = i-&gt;endSeqNum;
  509. i++;
  510. }
  511. }
  512. <span class="keywordflow">else</span>
  513. i++;
  514. }
  515. <span class="keywordflow">return</span> counter;
  516. }
  517. </pre></div>
  518. </div>
  519. </div>
  520. <a class="anchor" id="ab06b7b8f9c9084d258bc14375a2f3b39"></a><!-- doxytag: member="TCPSACKRexmitQueue::getQueueLength" ref="ab06b7b8f9c9084d258bc14375a2f3b39" args="()" -->
  521. <div class="memitem">
  522. <div class="memproto">
  523. <table class="memname">
  524. <tr>
  525. <td class="memname">uint32 TCPSACKRexmitQueue::getQueueLength </td>
  526. <td>(</td>
  527. <td class="paramname"></td><td>)</td>
  528. <td><code> [virtual]</code></td>
  529. </tr>
  530. </table>
  531. </div>
  532. <div class="memdoc">
  533. <p>Returns the number of blocks currently buffered in queue. </p>
  534. <p>Referenced by <a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a6eb4b2c4417dfff97a1734c9a43fca76">enqueueSentData()</a>.</p>
  535. <div class="fragment"><pre class="fragment">{
  536. <span class="keywordflow">return</span> <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.size();
  537. }
  538. </pre></div>
  539. </div>
  540. </div>
  541. <a class="anchor" id="af9d8cbda22d7ae05a8d367d69ec23127"></a><!-- doxytag: member="TCPSACKRexmitQueue::getSackedBit" ref="af9d8cbda22d7ae05a8d367d69ec23127" args="(uint32 seqNum)" -->
  542. <div class="memitem">
  543. <div class="memproto">
  544. <table class="memname">
  545. <tr>
  546. <td class="memname">bool TCPSACKRexmitQueue::getSackedBit </td>
  547. <td>(</td>
  548. <td class="paramtype">uint32&#160;</td>
  549. <td class="paramname"><em>seqNum</em></td><td>)</td>
  550. <td><code> [virtual]</code></td>
  551. </tr>
  552. </table>
  553. </div>
  554. <div class="memdoc">
  555. <p>Returns SackedBit value of seqNum. </p>
  556. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#ae8d9450252219a54062112f6d8688309">TCPConnection::nextSeg()</a>, and <a class="el" href="class_t_c_p_connection.html#a728bea28fa24566bb22935f0de7c4655">TCPConnection::setPipe()</a>.</p>
  557. <div class="fragment"><pre class="fragment">{
  558. <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
  559. <span class="keywordflow">if</span> (<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a>,seqNum))
  560. {
  561. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  562. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  563. {
  564. <span class="keywordflow">if</span> (i-&gt;beginSeqNum == seqNum) <span class="comment">// Search for region in queue!</span>
  565. {
  566. found = i-&gt;sacked;
  567. <span class="keywordflow">break</span>;
  568. }
  569. i++;
  570. }
  571. }
  572. <span class="keywordflow">return</span> found;
  573. }
  574. </pre></div>
  575. </div>
  576. </div>
  577. <a class="anchor" id="a9e3ff65826298ce1b2000bbd0bc04957"></a><!-- doxytag: member="TCPSACKRexmitQueue::getTotalAmountOfSackedBytes" ref="a9e3ff65826298ce1b2000bbd0bc04957" args="()" -->
  578. <div class="memitem">
  579. <div class="memproto">
  580. <table class="memname">
  581. <tr>
  582. <td class="memname">uint32 TCPSACKRexmitQueue::getTotalAmountOfSackedBytes </td>
  583. <td>(</td>
  584. <td class="paramname"></td><td>)</td>
  585. <td><code> [virtual]</code></td>
  586. </tr>
  587. </table>
  588. </div>
  589. <div class="memdoc">
  590. <p>Returns total amount of sacked bytes. Corresponds to update() function from RFC 3517. </p>
  591. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a33b50078727564bd2c4e7e906e2f1648">TCPConnection::processSACKOption()</a>.</p>
  592. <div class="fragment"><pre class="fragment">{
  593. uint32 bytes = 0;
  594. uint32 counter = 0;
  595. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  596. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  597. {
  598. <span class="keywordflow">if</span> (i-&gt;sacked)
  599. {
  600. counter++;
  601. bytes = bytes + (i-&gt;endSeqNum - i-&gt;beginSeqNum);
  602. }
  603. i++;
  604. }
  605. <span class="keywordflow">return</span> bytes;
  606. }
  607. </pre></div>
  608. </div>
  609. </div>
  610. <a class="anchor" id="af2d58fd127e40c421dde848d242f9e39"></a><!-- doxytag: member="TCPSACKRexmitQueue::info" ref="af2d58fd127e40c421dde848d242f9e39" args="()" -->
  611. <div class="memitem">
  612. <div class="memproto">
  613. <table class="memname">
  614. <tr>
  615. <td class="memname">void TCPSACKRexmitQueue::info </td>
  616. <td>(</td>
  617. <td class="paramname"></td><td>)</td>
  618. <td><code> [virtual]</code></td>
  619. </tr>
  620. </table>
  621. </div>
  622. <div class="memdoc">
  623. <p>Prints the current rexmitQueue status for debug purposes. </p>
  624. <div class="fragment"><pre class="fragment">{
  625. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ad2f55eea975ad487c30ce421de967424">str</a>();
  626. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  627. <a class="code" href="_i_n_e_t_defs_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14">uint</a> j = 1;
  628. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  629. {
  630. <a class="code" href="_t_c_p_8h.html#a601325e92d65fe658c80eab711e12304">tcpEV</a> &lt;&lt; j &lt;&lt; <span class="stringliteral">&quot;. region: [&quot;</span> &lt;&lt; i-&gt;beginSeqNum &lt;&lt; <span class="stringliteral">&quot;..&quot;</span> &lt;&lt; i-&gt;endSeqNum &lt;&lt; <span class="stringliteral">&quot;) \t sacked=&quot;</span> &lt;&lt; i-&gt;sacked &lt;&lt; <span class="stringliteral">&quot;\t rexmitted=&quot;</span> &lt;&lt; i-&gt;rexmitted &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;
  631. i++;
  632. j++;
  633. }
  634. }
  635. </pre></div>
  636. </div>
  637. </div>
  638. <a class="anchor" id="a342033845eaaf7a565c82fb70718ca0e"></a><!-- doxytag: member="TCPSACKRexmitQueue::init" ref="a342033845eaaf7a565c82fb70718ca0e" args="(uint32 seqNum)" -->
  639. <div class="memitem">
  640. <div class="memproto">
  641. <table class="memname">
  642. <tr>
  643. <td class="memname">void TCPSACKRexmitQueue::init </td>
  644. <td>(</td>
  645. <td class="paramtype">uint32&#160;</td>
  646. <td class="paramname"><em>seqNum</em></td><td>)</td>
  647. <td><code> [virtual]</code></td>
  648. </tr>
  649. </table>
  650. </div>
  651. <div class="memdoc">
  652. <p>Initialize the object. The startSeq parameter tells what sequence number the first byte of app data should get. This is usually ISS+1 because SYN consumes one byte in the sequence number space.</p>
  653. <p><a class="el" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a342033845eaaf7a565c82fb70718ca0e">init()</a> may be called more than once; every call flushes the existing contents of the queue. </p>
  654. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a585bbcdd70565eb01b6bfe17a1487c78">TCPConnection::selectInitialSeqNum()</a>.</p>
  655. <div class="fragment"><pre class="fragment">{
  656. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a30eef9065593a675b29a696fa7ca3ae4">begin</a> = seqNum;
  657. <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a> = seqNum;
  658. }
  659. </pre></div>
  660. </div>
  661. </div>
  662. <a class="anchor" id="afe96b5040346953484decf38ab2644e5"></a><!-- doxytag: member="TCPSACKRexmitQueue::resetRexmittedBit" ref="afe96b5040346953484decf38ab2644e5" args="()" -->
  663. <div class="memitem">
  664. <div class="memproto">
  665. <table class="memname">
  666. <tr>
  667. <td class="memname">void TCPSACKRexmitQueue::resetRexmittedBit </td>
  668. <td>(</td>
  669. <td class="paramname"></td><td>)</td>
  670. <td><code> [virtual]</code></td>
  671. </tr>
  672. </table>
  673. </div>
  674. <div class="memdoc">
  675. <p>Called when REXMIT timer expired. Resets rexmitted bit of all segments in rexmit queue. </p>
  676. <p>Referenced by <a class="el" href="class_t_c_p_base_alg.html#ac8a305a437d4eafd1689204e50af8870">TCPBaseAlg::processRexmitTimer()</a>.</p>
  677. <div class="fragment"><pre class="fragment">{
  678. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  679. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  680. {
  681. i-&gt;rexmitted = <span class="keyword">false</span>; <span class="comment">// reset rexmitted bit</span>
  682. i++;
  683. }
  684. }
  685. </pre></div>
  686. </div>
  687. </div>
  688. <a class="anchor" id="adfa5c6f04f91b16f9c98258f6ede0052"></a><!-- doxytag: member="TCPSACKRexmitQueue::resetSackedBit" ref="adfa5c6f04f91b16f9c98258f6ede0052" args="()" -->
  689. <div class="memitem">
  690. <div class="memproto">
  691. <table class="memname">
  692. <tr>
  693. <td class="memname">void TCPSACKRexmitQueue::resetSackedBit </td>
  694. <td>(</td>
  695. <td class="paramname"></td><td>)</td>
  696. <td><code> [virtual]</code></td>
  697. </tr>
  698. </table>
  699. </div>
  700. <div class="memdoc">
  701. <p>Called when REXMIT timer expired. Resets sacked bit of all segments in rexmit queue. </p>
  702. <p>Referenced by <a class="el" href="class_t_c_p_base_alg.html#ac8a305a437d4eafd1689204e50af8870">TCPBaseAlg::processRexmitTimer()</a>.</p>
  703. <div class="fragment"><pre class="fragment">{
  704. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  705. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  706. {
  707. i-&gt;sacked = <span class="keyword">false</span>; <span class="comment">// reset sacked bit</span>
  708. i++;
  709. }
  710. }
  711. </pre></div>
  712. </div>
  713. </div>
  714. <a class="anchor" id="a76c212912f59518e0b05a79c494ac0e2"></a><!-- doxytag: member="TCPSACKRexmitQueue::setConnection" ref="a76c212912f59518e0b05a79c494ac0e2" args="(TCPConnection *_conn)" -->
  715. <div class="memitem">
  716. <div class="memproto">
  717. <table class="memname">
  718. <tr>
  719. <td class="memname">virtual void TCPSACKRexmitQueue::setConnection </td>
  720. <td>(</td>
  721. <td class="paramtype"><a class="el" href="class_t_c_p_connection.html">TCPConnection</a> *&#160;</td>
  722. <td class="paramname"><em>_conn</em></td><td>)</td>
  723. <td><code> [inline, virtual]</code></td>
  724. </tr>
  725. </table>
  726. </div>
  727. <div class="memdoc">
  728. <p>Set the connection that owns this queue. </p>
  729. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a1d5624dcbc77e79d142f6a886b3e788d">TCPConnection::cloneListeningConnection()</a>, and <a class="el" href="class_t_c_p_connection.html#a69caa8ea0ffbe8d9f73f935aac1b29d9">TCPConnection::initConnection()</a>.</p>
  730. <div class="fragment"><pre class="fragment">{<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a0dcb9791b18a4c26ed38ad6593c2d470">conn</a> = _conn;}
  731. </pre></div>
  732. </div>
  733. </div>
  734. <a class="anchor" id="abd0309b9f592a452399c73174bbd94cf"></a><!-- doxytag: member="TCPSACKRexmitQueue::setSackedBit" ref="abd0309b9f592a452399c73174bbd94cf" args="(uint32 fromSeqNum, uint32 toSeqNum)" -->
  735. <div class="memitem">
  736. <div class="memproto">
  737. <table class="memname">
  738. <tr>
  739. <td class="memname">void TCPSACKRexmitQueue::setSackedBit </td>
  740. <td>(</td>
  741. <td class="paramtype">uint32&#160;</td>
  742. <td class="paramname"><em>fromSeqNum</em>, </td>
  743. </tr>
  744. <tr>
  745. <td class="paramkey"></td>
  746. <td></td>
  747. <td class="paramtype">uint32&#160;</td>
  748. <td class="paramname"><em>toSeqNum</em>&#160;</td>
  749. </tr>
  750. <tr>
  751. <td></td>
  752. <td>)</td>
  753. <td></td><td><code> [virtual]</code></td>
  754. </tr>
  755. </table>
  756. </div>
  757. <div class="memdoc">
  758. <p>Called when data sender received selective acknowledgments. Tells the queue which bytes have been transmitted and SACKed, so they can be skipped if retransmitting segments as long as REXMIT timer did not expired. </p>
  759. <p>Referenced by <a class="el" href="class_t_c_p_connection.html#a33b50078727564bd2c4e7e906e2f1648">TCPConnection::processSACKOption()</a>.</p>
  760. <div class="fragment"><pre class="fragment">{
  761. <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
  762. <span class="keywordflow">if</span> (<a class="code" href="_t_c_p_segment_8h.html#a55ef269e8ae44948c1d1f1cbe14bc92b">seqLE</a>(toSeqNum,<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#ac55cc23bb0a9903e374fd66794317ca6">end</a>))
  763. {
  764. RexmitQueue::iterator i = <a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.begin();
  765. <span class="keywordflow">while</span> (i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end())
  766. {
  767. <span class="keywordflow">if</span> (i-&gt;beginSeqNum == fromSeqNum &amp;&amp; <a class="code" href="_t_c_p_segment_8h.html#af4745b9cf95eb5b78d8ae6c3c8429cfc">seqGE</a>(toSeqNum, i-&gt;endSeqNum)) <span class="comment">// Search for LE of region in queue!</span>
  768. {
  769. i-&gt;sacked = <span class="keyword">true</span>; <span class="comment">// set sacked bit</span>
  770. found = <span class="keyword">true</span>;
  771. i++;
  772. <span class="keywordflow">while</span> (<a class="code" href="_t_c_p_segment_8h.html#af4745b9cf95eb5b78d8ae6c3c8429cfc">seqGE</a>(toSeqNum, i-&gt;endSeqNum) &amp;&amp; i!=<a class="code" href="class_t_c_p_s_a_c_k_rexmit_queue.html#a5cc1ca7db78dbb6e1454a87ba62bdd8e">rexmitQueue</a>.end()) <span class="comment">// Search for RE of region in queue!</span>
  773. {
  774. i-&gt;sacked = <span class="keyword">true</span>; <span class="comment">// set sacked bit</span>
  775. i++;
  776. }
  777. }
  778. <span class="keywordflow">else</span>
  779. i++;
  780. }
  781. }
  782. <span class="keywordflow">if</span> (!found)
  783. <a class="code" href="_t_c_p_8h.html#a601325e92d65fe658c80eab711e12304">tcpEV</a> &lt;&lt; <span class="stringliteral">&quot;FAILED to set sacked bit for region: [&quot;</span> &lt;&lt; fromSeqNum &lt;&lt; <span class="stringliteral">&quot;..&quot;</span> &lt;&lt; toSeqNum &lt;&lt; <span class="stringliteral">&quot;). Not found in retransmission queue.\n&quot;</span>;
  784. }
  785. </pre></div>
  786. </div>
  787. </div>
  788. <a class="anchor" id="ad2f55eea975ad487c30ce421…

Large files files are truncated, but you can click here to view the full file