Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 29c369053a983cc5d8c880dc6e0a2237 > files > 648

libdtn-devel-2.6.0-2mdv2009.1.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>DTN Reference Implementation: SimConvergenceLayer.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.8 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>SimConvergenceLayer.cc</h1><a href="SimConvergenceLayer_8cc.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> *    Copyright 2004-2006 Intel Corporation</span>
<a name="l00003"></a>00003 <span class="comment"> * </span>
<a name="l00004"></a>00004 <span class="comment"> *    Licensed under the Apache License, Version 2.0 (the "License");</span>
<a name="l00005"></a>00005 <span class="comment"> *    you may not use this file except in compliance with the License.</span>
<a name="l00006"></a>00006 <span class="comment"> *    You may obtain a copy of the License at</span>
<a name="l00007"></a>00007 <span class="comment"> * </span>
<a name="l00008"></a>00008 <span class="comment"> *        http://www.apache.org/licenses/LICENSE-2.0</span>
<a name="l00009"></a>00009 <span class="comment"> * </span>
<a name="l00010"></a>00010 <span class="comment"> *    Unless required by applicable law or agreed to in writing, software</span>
<a name="l00011"></a>00011 <span class="comment"> *    distributed under the License is distributed on an "AS IS" BASIS,</span>
<a name="l00012"></a>00012 <span class="comment"> *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<a name="l00013"></a>00013 <span class="comment"> *    See the License for the specific language governing permissions and</span>
<a name="l00014"></a>00014 <span class="comment"> *    limitations under the License.</span>
<a name="l00015"></a>00015 <span class="comment"> */</span>
<a name="l00016"></a>00016 
<a name="l00017"></a>00017 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
<a name="l00018"></a>00018 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;<a class="code" href="dtn-config_8h.html">dtn-config.h</a>&gt;</span>
<a name="l00019"></a>00019 <span class="preprocessor">#endif</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span>
<a name="l00021"></a>00021 <span class="preprocessor">#include &lt;queue&gt;</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;oasys/util/OptParser.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;oasys/util/StringBuffer.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;oasys/util/TokenBucket.h&gt;</span>
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="preprocessor">#include "<a class="code" href="SimConvergenceLayer_8h.html">SimConvergenceLayer.h</a>"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "<a class="code" href="Connectivity_8h.html">Connectivity.h</a>"</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "<a class="code" href="sim_2Node_8h.html">Node.h</a>"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "<a class="code" href="Simulator_8h.html">Simulator.h</a>"</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include "<a class="code" href="Topology_8h.html">Topology.h</a>"</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "<a class="code" href="bundling_2Bundle_8h.html">bundling/Bundle.h</a>"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "<a class="code" href="BundleEvent_8h.html">bundling/BundleEvent.h</a>"</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include "<a class="code" href="bundling_2BundleList_8h.html">bundling/BundleList.h</a>"</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="ContactManager_8h.html">contacts/ContactManager.h</a>"</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="keyword">namespace </span>dtnsim {
<a name="l00038"></a>00038 
<a name="l00039"></a>00039 <span class="keyword">class </span>InFlightBundle;
<a name="l00040"></a>00040 
<a name="l00041"></a>00041 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00042"></a><a class="code" href="classdtnsim_1_1SimLink.html">00042</a> <span class="keyword">class </span><a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a> : <span class="keyword">public</span> <a class="code" href="classdtn_1_1CLInfo.html" title="Abstract base class for convergence layer specific state stored in an interface /...">CLInfo</a>,
<a name="l00043"></a>00043                 <span class="keyword">public</span> oasys::<a class="code" href="classoasys_1_1Logger.html">Logger</a> {
<a name="l00044"></a>00044 <span class="keyword">public</span>:
<a name="l00045"></a>00045     <span class="keyword">struct </span><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html">Params</a>;
<a name="l00046"></a>00046     
<a name="l00047"></a><a class="code" href="classdtnsim_1_1SimLink.html#f584fc9d65c43f00997621febd18fb37">00047</a>     <a class="code" href="classdtnsim_1_1SimLink.html#f584fc9d65c43f00997621febd18fb37">SimLink</a>(<span class="keyword">const</span> <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a>&amp; link,
<a name="l00048"></a>00048             <span class="keyword">const</span> <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html">SimLink::Params</a>&amp; params)
<a name="l00049"></a>00049         : <a class="code" href="classoasys_1_1Logger.html">Logger</a>(<span class="stringliteral">"SimLink"</span>, <span class="stringliteral">"/dtn/cl/sim/%s"</span>, link-&gt;name()),
<a name="l00050"></a>00050           <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>(link.object(), <span class="stringliteral">"SimLink"</span>),
<a name="l00051"></a>00051           <a class="code" href="classdtnsim_1_1SimLink.html#2ca34df3b9fd92f81d4d94190ec67bca">params_</a>(params),
<a name="l00052"></a>00052           <a class="code" href="classdtnsim_1_1SimLink.html#acc1169aba619333dd4425ded507762f" title="Token bucket to track the link rate.">tb_</a>(((std::string)logpath_ + <span class="stringliteral">"/tb"</span>).c_str(),
<a name="l00053"></a>00053               <a class="code" href="classdtnsim_1_1SimLink.html#2ca34df3b9fd92f81d4d94190ec67bca">params_</a>.capacity_,
<a name="l00054"></a>00054               0xffffffff  <span class="comment">/* unlimited rate -- overridden by Connectivity */</span>),
<a name="l00055"></a>00055           <a class="code" href="classdtnsim_1_1SimLink.html#b1cb5971c5ce861064877c0489a70c8b">inflight_timer_</a>(this, <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a>::INFLIGHT),
<a name="l00056"></a>00056           <a class="code" href="classdtnsim_1_1SimLink.html#362b965aee05cc5ce4a12adfb2851f79">arrival_timer_</a>(this, <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a>::ARRIVAL),
<a name="l00057"></a>00057           <a class="code" href="classdtnsim_1_1SimLink.html#d09a7883abb5a4e4b7e4e6332aef980d">transmitted_timer_</a>(this, <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a>::TRANSMITTED)
<a name="l00058"></a>00058     {
<a name="l00059"></a>00059     }
<a name="l00060"></a>00060 
<a name="l00061"></a><a class="code" href="classdtnsim_1_1SimLink.html#deebacf28266b8ee1be662e04f02c464">00061</a>     <a class="code" href="classdtnsim_1_1SimLink.html#deebacf28266b8ee1be662e04f02c464">~SimLink</a>() {};
<a name="l00062"></a>00062 
<a name="l00063"></a>00063     <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink.html#44df94e79e7d4d5bbf2c4daffc0bc2d4">start_next_bundle</a>();
<a name="l00064"></a>00064     <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink.html#fd6152f3a4889cb2561cb8110465ae7a">timeout</a>(<span class="keyword">const</span> oasys::Time&amp; now);
<a name="l00065"></a>00065     <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink.html#569eaaf98a5ebffe3716dafed8bc7803">handle_pending_inflight</a>(<span class="keyword">const</span> oasys::Time&amp; now);
<a name="l00066"></a>00066     <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink.html#3e9dff5b296f40679fa1c4b929469c13">handle_arrival_events</a>(<span class="keyword">const</span> oasys::Time&amp; now);
<a name="l00067"></a>00067     <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink.html#fac1c027aaa1a11c3128dbafe77878c1">handle_transmitted_events</a>(<span class="keyword">const</span> oasys::Time&amp; now);
<a name="l00068"></a>00068     <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">reschedule_timers</a>();
<a name="l00069"></a>00069 
<a name="l00071"></a><a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309">00071</a>     <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>;
<a name="l00072"></a>00072     
<a name="l00073"></a><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html">00073</a>     <span class="keyword">struct </span><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html">Params</a> {
<a name="l00076"></a><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#f3a32cf75d8c239055952d76fd5bdc38">00076</a>         <span class="keywordtype">bool</span> <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#f3a32cf75d8c239055952d76fd5bdc38" title="if contact closes in the middle of a transmission, deliver the partially received...">deliver_partial_</a>;
<a name="l00077"></a>00077 
<a name="l00081"></a><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#60f1fccf979e5f344564389e1a049346">00081</a>         <span class="keywordtype">bool</span> <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#60f1fccf979e5f344564389e1a049346" title="for bundles sent over the link, signal to the router whether or not they were delivered...">reliable_</a>;
<a name="l00082"></a>00082 
<a name="l00084"></a><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1c39847b91b0178b1a04749d64aecbf2">00084</a>         u_int <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1c39847b91b0178b1a04749d64aecbf2" title="burst capacity of the link (default 0)">capacity_</a>;
<a name="l00085"></a>00085 
<a name="l00087"></a><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1dac95754a10197829cf580d83072756">00087</a>         <span class="keywordtype">bool</span> <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1dac95754a10197829cf580d83072756" title="automatically infer the remote eid when the link connects">set_remote_eid_</a>;
<a name="l00088"></a>00088         
<a name="l00090"></a><a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#412ffc2b2be0d27ea3bae9ddf0142609">00090</a>         <span class="keywordtype">bool</span> <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#412ffc2b2be0d27ea3bae9ddf0142609" title="set the previous hop when bundles arrive">set_prevhop_</a>;
<a name="l00091"></a>00091         
<a name="l00092"></a>00092     } <a class="code" href="classdtnsim_1_1SimLink.html#2ca34df3b9fd92f81d4d94190ec67bca">params_</a>;
<a name="l00093"></a>00093 
<a name="l00095"></a><a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e">00095</a>     <a class="code" href="classdtnsim_1_1Node.html" title="Class representing a node in the simulator (i.e.">Node</a>* <a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a>;   
<a name="l00096"></a>00096 
<a name="l00098"></a><a class="code" href="classdtnsim_1_1SimLink.html#acc1169aba619333dd4425ded507762f">00098</a>     oasys::TokenBucket <a class="code" href="classdtnsim_1_1SimLink.html#acc1169aba619333dd4425ded507762f" title="Token bucket to track the link rate.">tb_</a>;
<a name="l00099"></a>00099 
<a name="l00101"></a><a class="code" href="classdtnsim_1_1SimLink.html#57b0481e90469e25edf041c99826e0c3">00101</a>     u_char <a class="code" href="classdtnsim_1_1SimLink.html#57b0481e90469e25edf041c99826e0c3" title="Temp buffer.">buf_</a>[65536];
<a name="l00102"></a>00102     
<a name="l00105"></a><a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html">00105</a>     <span class="keyword">struct </span><a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a> {
<a name="l00106"></a><a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#43b87e30a9de363b06d3c20fba25003a">00106</a>         <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#43b87e30a9de363b06d3c20fba25003a">PendingEvent</a>(<a class="code" href="classdtn_1_1Bundle.html" title="The internal representation of a bundle.">Bundle</a>*            bundle,
<a name="l00107"></a>00107                      <span class="keywordtype">size_t</span>             total_len,
<a name="l00108"></a>00108                      <span class="keyword">const</span> oasys::Time&amp; time)
<a name="l00109"></a>00109             : <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#cc3c4756a2c86e232937126cb1b6aadc">bundle_</a>(bundle, <span class="stringliteral">"SimCL::PendingEvent"</span>),
<a name="l00110"></a>00110               <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a>(total_len),
<a name="l00111"></a>00111               <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">time_</a>(time) {}
<a name="l00112"></a>00112 
<a name="l00113"></a><a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#cc3c4756a2c86e232937126cb1b6aadc">00113</a>         <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a>   <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#cc3c4756a2c86e232937126cb1b6aadc">bundle_</a>;
<a name="l00114"></a><a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">00114</a>         <span class="keywordtype">size_t</span>      <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a>;
<a name="l00115"></a><a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">00115</a>         oasys::Time <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">time_</a>;
<a name="l00116"></a>00116     };
<a name="l00117"></a>00117 
<a name="l00119"></a><a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72">00119</a>     <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a>* <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>;
<a name="l00120"></a>00120 
<a name="l00122"></a><a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5">00122</a>     std::queue&lt;PendingEvent*&gt; <a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>;
<a name="l00123"></a>00123 
<a name="l00125"></a><a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9">00125</a>     std::queue&lt;PendingEvent*&gt; <a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>;
<a name="l00126"></a>00126     
<a name="l00128"></a><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html">00128</a>     <span class="keyword">class </span><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a> : <span class="keyword">public</span> oasys::Timer {
<a name="l00129"></a>00129     <span class="keyword">public</span>:
<a name="l00130"></a><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f9361">00130</a>         <span class="keyword">typedef</span> <span class="keyword">enum</span> { <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f9361aedaddb32e9879e015001eece370ae69">INFLIGHT</a>, <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f936112f3e7650b2a1528a099ee57c639ad1f">ARRIVAL</a>, <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f936173ad4e51269d3bf7a5ab978d90527201">TRANSMITTED</a> } <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f9361">type_t</a>;
<a name="l00131"></a>00131         
<a name="l00132"></a><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#0b879b8e4b57ad4ece8990a50f6257b5">00132</a>         <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#0b879b8e4b57ad4ece8990a50f6257b5">PendingEventTimer</a>(<a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>* link, <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f9361">type_t</a> type)
<a name="l00133"></a>00133             : <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#9728639d558c621b6aea7252e6d527ea">link_</a>(link), <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#3b4b148614c444db4ca584320ae949da">type_</a>(type) {}
<a name="l00134"></a>00134         
<a name="l00135"></a>00135         <span class="keywordtype">void</span> <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#434f0a00dd9addb0d9f6ca1df0231e80">timeout</a>(<span class="keyword">const</span> timeval&amp; now);
<a name="l00136"></a>00136         
<a name="l00137"></a>00137     <span class="keyword">protected</span>:
<a name="l00138"></a><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#9728639d558c621b6aea7252e6d527ea">00138</a>         <a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>* <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#9728639d558c621b6aea7252e6d527ea">link_</a>;
<a name="l00139"></a><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#3b4b148614c444db4ca584320ae949da">00139</a>         <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f9361">type_t</a>   <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#3b4b148614c444db4ca584320ae949da">type_</a>;
<a name="l00140"></a>00140     };
<a name="l00141"></a>00141 
<a name="l00144"></a><a class="code" href="classdtnsim_1_1SimLink.html#b1cb5971c5ce861064877c0489a70c8b">00144</a>     <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a> <a class="code" href="classdtnsim_1_1SimLink.html#b1cb5971c5ce861064877c0489a70c8b">inflight_timer_</a>;
<a name="l00145"></a><a class="code" href="classdtnsim_1_1SimLink.html#362b965aee05cc5ce4a12adfb2851f79">00145</a>     <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a> <a class="code" href="classdtnsim_1_1SimLink.html#362b965aee05cc5ce4a12adfb2851f79">arrival_timer_</a>;
<a name="l00146"></a><a class="code" href="classdtnsim_1_1SimLink.html#d09a7883abb5a4e4b7e4e6332aef980d">00146</a>     <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html" title="Timer class to manage pending events.">PendingEventTimer</a> <a class="code" href="classdtnsim_1_1SimLink.html#d09a7883abb5a4e4b7e4e6332aef980d">transmitted_timer_</a>;
<a name="l00148"></a>00148 };
<a name="l00149"></a>00149 
<a name="l00150"></a>00150 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00151"></a>00151 <span class="keywordtype">void</span>
<a name="l00152"></a><a class="code" href="classdtnsim_1_1SimLink.html#44df94e79e7d4d5bbf2c4daffc0bc2d4">00152</a> <a class="code" href="classdtnsim_1_1SimLink.html#44df94e79e7d4d5bbf2c4daffc0bc2d4">SimLink::start_next_bundle</a>()
<a name="l00153"></a>00153 {
<a name="l00154"></a>00154     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!<a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;queue()-&gt;empty());
<a name="l00155"></a>00155     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(<a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a> == NULL);
<a name="l00156"></a>00156     
<a name="l00157"></a>00157     <a class="code" href="classdtnsim_1_1Node.html" title="Class representing a node in the simulator (i.e.">Node</a>* src_node = <a class="code" href="classdtnsim_1_1Node.html#0092d41cdd29927ede0833a8164885e9" title="Return the current active node.">Node::active_node</a>();
<a name="l00158"></a>00158     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(src_node != <a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a>);
<a name="l00159"></a>00159 
<a name="l00160"></a>00160     <span class="keyword">const</span> <a class="code" href="structdtnsim_1_1ConnState.html" title="Helper struct to store the current connectivity settings between a pair (or set)...">ConnState</a>* cs = <a class="code" href="classdtnsim_1_1Connectivity.html#497447ab2f860f9767b44ee5946516a6" title="Singleton accessor.">Connectivity::instance</a>()-&gt;<a class="code" href="classdtnsim_1_1Connectivity.html#a51f2d31913b28dafe3db9448c34c4ef" title="Get the current connectivity state between two nodes.">lookup</a>(src_node, <a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a>);
<a name="l00161"></a>00161     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(cs);
<a name="l00162"></a>00162 
<a name="l00163"></a>00163     <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> src_bundle(<span class="stringliteral">"SimLink::start_next_bundle"</span>);
<a name="l00164"></a>00164     src_bundle = <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;queue()-&gt;front();
<a name="l00165"></a>00165     
<a name="l00166"></a>00166     <a class="code" href="classdtn_1_1BlockInfoVec.html" title="Class for a vector of BlockInfo structures.">BlockInfoVec</a>* blocks = src_bundle-&gt;xmit_blocks()-&gt;find_blocks(<a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>);
<a name="l00167"></a>00167     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(blocks != NULL);
<a name="l00168"></a>00168 
<a name="l00169"></a>00169     <span class="comment">// since we don't really have any payload to send, we find the</span>
<a name="l00170"></a>00170     <span class="comment">// payload block and overwrite the data_length to be zero, then</span>
<a name="l00171"></a>00171     <span class="comment">// adjust the payload_ on the new bundle</span>
<a name="l00172"></a>00172     <span class="keywordflow">if</span> (src_bundle-&gt;payload().location() == BundlePayload::NODATA) {
<a name="l00173"></a>00173         <a class="code" href="classdtn_1_1BlockInfo.html" title="Class used to store unparsed bundle blocks and associated metadata about them.">BlockInfo</a>* payload = <span class="keyword">const_cast&lt;</span><a class="code" href="classdtn_1_1BlockInfo.html" title="Class used to store unparsed bundle blocks and associated metadata about them.">BlockInfo</a>*<span class="keyword">&gt;</span>(
<a name="l00174"></a>00174             blocks-&gt;<a class="code" href="classdtn_1_1BlockInfoVec.html#646316c3b0fb301712bb39fdbfd3207e" title="Find the block for the given type.">find_block</a>(BundleProtocol::PAYLOAD_BLOCK));
<a name="l00175"></a>00175         <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(payload != NULL);
<a name="l00176"></a>00176         payload-&gt;<a class="code" href="classdtn_1_1BlockInfo.html#38d215397b046a403f252512227c29a9" title="Mutating accessors.">set_data_length</a>(0);
<a name="l00177"></a>00177     }
<a name="l00178"></a>00178     
<a name="l00179"></a>00179     <span class="keywordtype">bool</span> complete = <span class="keyword">false</span>;
<a name="l00180"></a>00180     <span class="keywordtype">size_t</span> <a class="code" href="num2sdnv_8c.html#fed088663f8704004425cdae2120b9b3">len</a> = BundleProtocol::produce(src_bundle.object(), blocks,
<a name="l00181"></a>00181                                          <a class="code" href="classdtnsim_1_1SimLink.html#57b0481e90469e25edf041c99826e0c3" title="Temp buffer.">buf_</a>, 0, <span class="keyword">sizeof</span>(buf_),
<a name="l00182"></a>00182                                          &amp;complete);
<a name="l00183"></a>00183     ASSERTF(complete, <span class="stringliteral">"BundleProtocol non-payload blocks must fit in "</span>
<a name="l00184"></a>00184             <span class="stringliteral">"65 K buffer size"</span>);
<a name="l00185"></a>00185 
<a name="l00186"></a>00186     <span class="keywordtype">size_t</span> total_len = len;
<a name="l00187"></a>00187 
<a name="l00188"></a>00188     <span class="keywordflow">if</span> (src_bundle-&gt;payload().location() == BundlePayload::NODATA)
<a name="l00189"></a>00189         total_len += src_bundle-&gt;payload().length();
<a name="l00190"></a>00190 
<a name="l00191"></a>00191     complete = <span class="keyword">false</span>;
<a name="l00192"></a>00192     <a class="code" href="classdtn_1_1Bundle.html" title="The internal representation of a bundle.">Bundle</a>* dst_bundle = <span class="keyword">new</span> <a class="code" href="classdtn_1_1Bundle.html" title="The internal representation of a bundle.">Bundle</a>(src_bundle-&gt;payload().location());
<a name="l00193"></a>00193     <span class="keywordtype">int</span> cc = BundleProtocol::consume(dst_bundle, buf_, len, &amp;complete);
<a name="l00194"></a>00194     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(cc == (<span class="keywordtype">int</span>)len);
<a name="l00195"></a>00195     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(complete);
<a name="l00196"></a>00196 
<a name="l00197"></a>00197     <span class="keywordflow">if</span> (src_bundle-&gt;payload().location() == BundlePayload::NODATA) {
<a name="l00198"></a>00198         dst_bundle-&gt;<a class="code" href="classdtn_1_1Bundle.html#857079bad68497626f75c2985b69052f" title="Setters and mutable accessors.">mutable_payload</a>()-&gt;<a class="code" href="classdtn_1_1BundlePayload.html#af1ede6096a6d625fb83c001a9d490d6" title="Set the payload length in preparation for filling in with data.">set_length</a>(src_bundle-&gt;payload().length());
<a name="l00199"></a>00199     }
<a name="l00200"></a>00200             
<a name="l00201"></a>00201     <a class="code" href="classdtnsim_1_1SimLink.html#acc1169aba619333dd4425ded507762f" title="Token bucket to track the link rate.">tb_</a>.drain(total_len * 8);
<a name="l00202"></a>00202     
<a name="l00203"></a>00203     oasys::Time bw_delay = <a class="code" href="classdtnsim_1_1SimLink.html#acc1169aba619333dd4425ded507762f" title="Token bucket to track the link rate.">tb_</a>.time_to_level(0);
<a name="l00204"></a>00204     oasys::Time inflight_time = oasys::Time(<a class="code" href="classdtnsim_1_1Simulator.html#e428d32758e9f94c855b43527d87bd84" title="Return the current simulator time.">Simulator::time</a>()) + bw_delay;
<a name="l00205"></a>00205     oasys::Time arrival_time = inflight_time + cs-&gt;<a class="code" href="structdtnsim_1_1ConnState.html#2d33bb7b4db92d3aba604c08b5e36fab">latency_</a>;
<a name="l00206"></a>00206     oasys::Time transmitted_time;
<a name="l00207"></a>00207 
<a name="l00208"></a>00208     <span class="comment">// the transmitted event either occurs after the "ack" comes back</span>
<a name="l00209"></a>00209     <span class="comment">// (when in reliable mode) or immediately after we send the bundle</span>
<a name="l00210"></a>00210     <span class="keywordflow">if</span> (<a class="code" href="classdtnsim_1_1SimLink.html#2ca34df3b9fd92f81d4d94190ec67bca">params_</a>.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#60f1fccf979e5f344564389e1a049346" title="for bundles sent over the link, signal to the router whether or not they were delivered...">reliable_</a>) {
<a name="l00211"></a>00211         transmitted_time = inflight_time + (cs-&gt;<a class="code" href="structdtnsim_1_1ConnState.html#2d33bb7b4db92d3aba604c08b5e36fab">latency_</a> * 2);
<a name="l00212"></a>00212     } <span class="keywordflow">else</span> {
<a name="l00213"></a>00213         transmitted_time = inflight_time;
<a name="l00214"></a>00214     }
<a name="l00215"></a>00215     
<a name="l00216"></a>00216     log_debug(<span class="stringliteral">"send_bundle src %d dst %d: total len %zu, "</span>
<a name="l00217"></a>00217               <span class="stringliteral">"inflight_time %u.%u arrival_time %u.%u transmitted_time %u.%u"</span>,
<a name="l00218"></a>00218               src_bundle-&gt;bundleid(), dst_bundle-&gt;<a class="code" href="classdtn_1_1Bundle.html#7031e2e5e4078445bf4ad39cdcdea3b2" title="Accessors.">bundleid</a>(), total_len,
<a name="l00219"></a>00219               inflight_time.sec_, inflight_time.usec_,
<a name="l00220"></a>00220               arrival_time.sec_, arrival_time.usec_,
<a name="l00221"></a>00221               transmitted_time.sec_, transmitted_time.usec_);
<a name="l00222"></a>00222 
<a name="l00223"></a>00223     <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a> = <span class="keyword">new</span> <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a>(src_bundle.object(), total_len, inflight_time);
<a name="l00224"></a>00224     <a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.push(<span class="keyword">new</span> <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a>(dst_bundle, total_len, arrival_time));
<a name="l00225"></a>00225     <a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.push(<span class="keyword">new</span> <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a>(src_bundle.object(), total_len, transmitted_time));
<a name="l00226"></a>00226 
<a name="l00227"></a>00227     <a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">reschedule_timers</a>();
<a name="l00228"></a>00228 }
<a name="l00229"></a>00229 
<a name="l00230"></a>00230 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00231"></a>00231 <span class="keywordtype">void</span>
<a name="l00232"></a><a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">00232</a> <a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">SimLink::reschedule_timers</a>()
<a name="l00233"></a>00233 {
<a name="l00234"></a>00234     <span class="comment">// if the timer is already pending, there's no need to reschedule</span>
<a name="l00235"></a>00235     <span class="comment">// since the channel is FIFO and latency changes don't take effect</span>
<a name="l00236"></a>00236     <span class="comment">// mid-flight</span>
<a name="l00237"></a>00237 
<a name="l00238"></a>00238     <span class="keywordflow">if</span> (! <a class="code" href="classdtnsim_1_1SimLink.html#b1cb5971c5ce861064877c0489a70c8b">inflight_timer_</a>.pending() &amp;&amp; <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a> != NULL)
<a name="l00239"></a>00239     {
<a name="l00240"></a>00240         <a class="code" href="classdtnsim_1_1SimLink.html#b1cb5971c5ce861064877c0489a70c8b">inflight_timer_</a>.schedule_at(<a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">time_</a>);
<a name="l00241"></a>00241     }
<a name="l00242"></a>00242 
<a name="l00243"></a>00243     <span class="keywordflow">if</span> (! <a class="code" href="classdtnsim_1_1SimLink.html#362b965aee05cc5ce4a12adfb2851f79">arrival_timer_</a>.pending() &amp;&amp; !<a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.empty())
<a name="l00244"></a>00244     {
<a name="l00245"></a>00245         <a class="code" href="classdtnsim_1_1SimLink.html#362b965aee05cc5ce4a12adfb2851f79">arrival_timer_</a>.schedule_at(<a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.front()-&gt;time_);
<a name="l00246"></a>00246     }
<a name="l00247"></a>00247 
<a name="l00248"></a>00248     <span class="keywordflow">if</span> (! <a class="code" href="classdtnsim_1_1SimLink.html#d09a7883abb5a4e4b7e4e6332aef980d">transmitted_timer_</a>.pending() &amp;&amp; !<a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.empty())
<a name="l00249"></a>00249     {
<a name="l00250"></a>00250         <a class="code" href="classdtnsim_1_1SimLink.html#d09a7883abb5a4e4b7e4e6332aef980d">transmitted_timer_</a>.schedule_at(<a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.front()-&gt;time_);
<a name="l00251"></a>00251     }
<a name="l00252"></a>00252 }
<a name="l00253"></a>00253 
<a name="l00254"></a>00254 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00255"></a>00255 <span class="keywordtype">void</span>
<a name="l00256"></a><a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#434f0a00dd9addb0d9f6ca1df0231e80">00256</a> <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#434f0a00dd9addb0d9f6ca1df0231e80">SimLink::PendingEventTimer::timeout</a>(<span class="keyword">const</span> timeval&amp; tv)
<a name="l00257"></a>00257 {
<a name="l00258"></a>00258     oasys::Time now(tv.tv_sec, tv.tv_usec);
<a name="l00259"></a>00259     <span class="keywordflow">switch</span> (<a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#3b4b148614c444db4ca584320ae949da">type_</a>) {
<a name="l00260"></a>00260     <span class="keywordflow">case</span> <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f9361aedaddb32e9879e015001eece370ae69">INFLIGHT</a>:
<a name="l00261"></a>00261         <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#9728639d558c621b6aea7252e6d527ea">link_</a>-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#569eaaf98a5ebffe3716dafed8bc7803">handle_pending_inflight</a>(now);
<a name="l00262"></a>00262         <span class="keywordflow">break</span>;
<a name="l00263"></a>00263     <span class="keywordflow">case</span> <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f936112f3e7650b2a1528a099ee57c639ad1f">ARRIVAL</a>:
<a name="l00264"></a>00264         <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#9728639d558c621b6aea7252e6d527ea">link_</a>-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#3e9dff5b296f40679fa1c4b929469c13">handle_arrival_events</a>(now);
<a name="l00265"></a>00265         <span class="keywordflow">break</span>;
<a name="l00266"></a>00266     <span class="keywordflow">case</span> <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#59f076b16894438b85a88324842f936173ad4e51269d3bf7a5ab978d90527201">TRANSMITTED</a>:
<a name="l00267"></a>00267         <a class="code" href="classdtnsim_1_1SimLink_1_1PendingEventTimer.html#9728639d558c621b6aea7252e6d527ea">link_</a>-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#fac1c027aaa1a11c3128dbafe77878c1">handle_transmitted_events</a>(now);
<a name="l00268"></a>00268         <span class="keywordflow">break</span>;
<a name="l00269"></a>00269     <span class="keywordflow">default</span>:
<a name="l00270"></a>00270         NOTREACHED;
<a name="l00271"></a>00271     }
<a name="l00272"></a>00272 }
<a name="l00273"></a>00273 
<a name="l00274"></a>00274 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00275"></a>00275 <span class="keywordtype">void</span>
<a name="l00276"></a><a class="code" href="classdtnsim_1_1SimLink.html#569eaaf98a5ebffe3716dafed8bc7803">00276</a> <a class="code" href="classdtnsim_1_1SimLink.html#569eaaf98a5ebffe3716dafed8bc7803">SimLink::handle_pending_inflight</a>(<span class="keyword">const</span> oasys::Time&amp; now)
<a name="l00277"></a>00277 {
<a name="l00278"></a>00278     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(<a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a> != NULL);
<a name="l00279"></a>00279     
<a name="l00280"></a>00280     <span class="comment">// deliver any bundles that have arrived</span>
<a name="l00281"></a>00281     <span class="keywordflow">if</span> (<a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">time_</a> &lt;= now) {
<a name="l00282"></a>00282         <span class="keyword">const</span> <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a>&amp; bundle = <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#cc3c4756a2c86e232937126cb1b6aadc">bundle_</a>;
<a name="l00283"></a>00283 
<a name="l00284"></a>00284         log_debug(<span class="stringliteral">"putting *%p in flight"</span>, bundle.object());
<a name="l00285"></a>00285         <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;add_to_inflight(bundle, <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a>);
<a name="l00286"></a>00286         <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;del_from_queue(bundle, <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a>);
<a name="l00287"></a>00287             
<a name="l00288"></a>00288         <span class="comment">// XXX/demmer maybe there should be an event for this??</span>
<a name="l00289"></a>00289         
<a name="l00290"></a>00290         <span class="keyword">delete</span> <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a>;
<a name="l00291"></a>00291         <a class="code" href="classdtnsim_1_1SimLink.html#2893440f71bdbe2d95b8c4c7b56f5c72" title="Pending event (at most one) to put the next bundle in flight.">pending_inflight_</a> = NULL;
<a name="l00292"></a>00292 
<a name="l00293"></a>00293         <span class="keywordflow">if</span> (! <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;queue()-&gt;empty()) {
<a name="l00294"></a>00294             <a class="code" href="classdtnsim_1_1SimLink.html#44df94e79e7d4d5bbf2c4daffc0bc2d4">start_next_bundle</a>();
<a name="l00295"></a>00295         }
<a name="l00296"></a>00296     }
<a name="l00297"></a>00297     
<a name="l00298"></a>00298     <a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">reschedule_timers</a>();
<a name="l00299"></a>00299 }
<a name="l00300"></a>00300 
<a name="l00301"></a>00301 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00302"></a>00302 <span class="keywordtype">void</span>
<a name="l00303"></a><a class="code" href="classdtnsim_1_1SimLink.html#3e9dff5b296f40679fa1c4b929469c13">00303</a> <a class="code" href="classdtnsim_1_1SimLink.html#3e9dff5b296f40679fa1c4b929469c13">SimLink::handle_arrival_events</a>(<span class="keyword">const</span> oasys::Time&amp; now)
<a name="l00304"></a>00304 {
<a name="l00305"></a>00305     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(! <a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.empty());
<a name="l00306"></a>00306     
<a name="l00307"></a>00307     <span class="comment">// deliver any bundles that have arrived</span>
<a name="l00308"></a>00308     <span class="keywordflow">while</span> (! <a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.empty()) {
<a name="l00309"></a>00309         <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a>* next = <a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.front();
<a name="l00310"></a>00310         <span class="keywordflow">if</span> (next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">time_</a> &lt;= now) {
<a name="l00311"></a>00311             <span class="keyword">const</span> <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a>&amp; bundle = next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#cc3c4756a2c86e232937126cb1b6aadc">bundle_</a>;
<a name="l00312"></a>00312             <a class="code" href="classdtnsim_1_1SimLink.html#27439f634ae423b24acffe60832b9fb5" title="Pending bundle arrival events.">arrival_events_</a>.pop();
<a name="l00313"></a>00313 
<a name="l00314"></a>00314             log_debug(<span class="stringliteral">"*%p arrived"</span>, bundle.object());
<a name="l00315"></a>00315             
<a name="l00316"></a>00316             <a class="code" href="classdtn_1_1BundleReceivedEvent.html" title="Event class for new bundle arrivals.">BundleReceivedEvent</a>* rcv_event =
<a name="l00317"></a>00317                 <span class="keyword">new</span> <a class="code" href="classdtn_1_1BundleReceivedEvent.html" title="Event class for new bundle arrivals.">BundleReceivedEvent</a>(bundle.object(),
<a name="l00318"></a>00318                                         <a class="code" href="namespacedtn.html#60ee39c9672604f59fe1b12d4e1d142bb0775776e4be46e62a0dcff6cf968059" title="a peer dtn forwarder">EVENTSRC_PEER</a>,
<a name="l00319"></a>00319                                         next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a>,
<a name="l00320"></a>00320                                         <a class="code" href="classdtnsim_1_1SimLink.html#2ca34df3b9fd92f81d4d94190ec67bca">params_</a>.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#412ffc2b2be0d27ea3bae9ddf0142609" title="set the previous hop when bundles arrive">set_prevhop_</a> ?
<a name="l00321"></a>00321                                         <a class="code" href="classdtnsim_1_1Node.html#0092d41cdd29927ede0833a8164885e9" title="Return the current active node.">Node::active_node</a>()-&gt;<a class="code" href="classdtn_1_1BundleDaemon.html#f606a71844413e32918c9c3e98b8ce3f" title="Return the local endpoint identifier.">local_eid</a>() :
<a name="l00322"></a>00322                                         EndpointID::NULL_EID());
<a name="l00323"></a>00323             <a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a>-&gt;<a class="code" href="classdtnsim_1_1Node.html#0986c0f6d3eeec3fba7779a3d6d38513" title="Virtual post function, overridden in the simulator to use the modified event queue...">post_event</a>(rcv_event);
<a name="l00324"></a>00324 
<a name="l00325"></a>00325             <span class="keyword">delete</span> next;
<a name="l00326"></a>00326             
<a name="l00327"></a>00327         } <span class="keywordflow">else</span> {
<a name="l00328"></a>00328             <span class="keywordflow">break</span>;
<a name="l00329"></a>00329         }
<a name="l00330"></a>00330     }
<a name="l00331"></a>00331 
<a name="l00332"></a>00332     <a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">reschedule_timers</a>();
<a name="l00333"></a>00333 }
<a name="l00334"></a>00334 
<a name="l00335"></a>00335 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00336"></a>00336 <span class="keywordtype">void</span>
<a name="l00337"></a><a class="code" href="classdtnsim_1_1SimLink.html#fac1c027aaa1a11c3128dbafe77878c1">00337</a> <a class="code" href="classdtnsim_1_1SimLink.html#fac1c027aaa1a11c3128dbafe77878c1">SimLink::handle_transmitted_events</a>(<span class="keyword">const</span> oasys::Time&amp; now)
<a name="l00338"></a>00338 {
<a name="l00339"></a>00339     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(! <a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.empty());
<a name="l00340"></a>00340     
<a name="l00341"></a>00341     <span class="comment">// deliver any bundles that have arrived</span>
<a name="l00342"></a>00342     <span class="keywordflow">while</span> (! <a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.empty()) {
<a name="l00343"></a>00343         <a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html" title="Helper class to track bundle transmission or reception events that need to be delivered...">PendingEvent</a>* next = <a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.front();
<a name="l00344"></a>00344         <span class="keywordflow">if</span> (next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#e2c0d6aebcd14f8be4533ee953e5d3aa">time_</a> &lt;= now) {
<a name="l00345"></a>00345             <span class="keyword">const</span> <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a>&amp; bundle = next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#cc3c4756a2c86e232937126cb1b6aadc">bundle_</a>;
<a name="l00346"></a>00346             <a class="code" href="classdtnsim_1_1SimLink.html#b2ec6a0297d39426263f968a985e9fe9" title="Pending bundle transmitted events.">transmitted_events_</a>.pop();
<a name="l00347"></a>00347             
<a name="l00348"></a>00348             log_debug(<span class="stringliteral">"*%p transmitted"</span>, bundle.object());
<a name="l00349"></a>00349 
<a name="l00350"></a>00350             <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(<a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;contact() != NULL);
<a name="l00351"></a>00351             
<a name="l00352"></a>00352             <a class="code" href="classdtn_1_1BundleTransmittedEvent.html" title="Event class for bundle or fragment transmission.">BundleTransmittedEvent</a>* xmit_event =
<a name="l00353"></a>00353                 <span class="keyword">new</span> <a class="code" href="classdtn_1_1BundleTransmittedEvent.html" title="Event class for bundle or fragment transmission.">BundleTransmittedEvent</a>(bundle.object(), <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>-&gt;contact(), <a class="code" href="classdtnsim_1_1SimLink.html#a71bf2e73e47179eb051b09bf8fb7309" title="The dtn Link.">link_</a>,
<a name="l00354"></a>00354                                            next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a>,
<a name="l00355"></a>00355                                            <a class="code" href="classdtnsim_1_1SimLink.html#2ca34df3b9fd92f81d4d94190ec67bca">params_</a>.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#60f1fccf979e5f344564389e1a049346" title="for bundles sent over the link, signal to the router whether or not they were delivered...">reliable_</a> ? next-&gt;<a class="code" href="structdtnsim_1_1SimLink_1_1PendingEvent.html#a8c223053f1406bba5dbd162d5e6c93b">total_len_</a> : 0);
<a name="l00356"></a>00356             BundleDaemon::post(xmit_event);
<a name="l00357"></a>00357             
<a name="l00358"></a>00358             <span class="keyword">delete</span> next;
<a name="l00359"></a>00359         } <span class="keywordflow">else</span> {
<a name="l00360"></a>00360             <span class="keywordflow">break</span>;
<a name="l00361"></a>00361         }
<a name="l00362"></a>00362     }
<a name="l00363"></a>00363     
<a name="l00364"></a>00364     <a class="code" href="classdtnsim_1_1SimLink.html#a9856259f0468f8c4ce0d5b043103c7b">reschedule_timers</a>();
<a name="l00365"></a>00365 }
<a name="l00366"></a>00366 
<a name="l00367"></a>00367 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00368"></a>00368 <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html" title="Simulator implementation of the Convergence Layer API.">SimConvergenceLayer</a>* <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#0098039e4a83481bc79a9544d04f6a21">SimConvergenceLayer::instance_</a>;
<a name="l00369"></a>00369 
<a name="l00370"></a><a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#86ff6f1bd31a92eaa9addb07d2f19082">00370</a> <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#86ff6f1bd31a92eaa9addb07d2f19082" title="Constructor.">SimConvergenceLayer::SimConvergenceLayer</a>()
<a name="l00371"></a>00371     : <a class="code" href="classdtn_1_1ConvergenceLayer.html" title="The abstract interface for a convergence layer.">ConvergenceLayer</a>(<span class="stringliteral">"SimConvergenceLayer"</span>, <span class="stringliteral">"sim"</span>)
<a name="l00372"></a>00372 {
<a name="l00373"></a>00373 }
<a name="l00374"></a>00374 
<a name="l00375"></a>00375 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00376"></a>00376 <span class="keywordtype">bool</span>
<a name="l00377"></a><a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#61a4c4bd2f5b405da5f691dec3dd961b">00377</a> <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#61a4c4bd2f5b405da5f691dec3dd961b">SimConvergenceLayer::init_link</a>(<span class="keyword">const</span> <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a>&amp; link,
<a name="l00378"></a>00378                                <span class="keywordtype">int</span> argc, <span class="keyword">const</span> <span class="keywordtype">char</span>* argv[])
<a name="l00379"></a>00379 {
<a name="l00380"></a>00380     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(link != NULL);
<a name="l00381"></a>00381     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!link-&gt;isdeleted());
<a name="l00382"></a>00382     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(link-&gt;cl_info() == NULL);
<a name="l00383"></a>00383 
<a name="l00384"></a>00384     oasys::OptParser p;
<a name="l00385"></a>00385     <a class="code" href="structdtnsim_1_1SimLink_1_1Params.html">SimLink::Params</a> params;
<a name="l00386"></a>00386 
<a name="l00387"></a>00387     params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#f3a32cf75d8c239055952d76fd5bdc38" title="if contact closes in the middle of a transmission, deliver the partially received...">deliver_partial_</a> = <span class="keyword">true</span>;
<a name="l00388"></a>00388     params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#60f1fccf979e5f344564389e1a049346" title="for bundles sent over the link, signal to the router whether or not they were delivered...">reliable_</a>        = <span class="keyword">true</span>;
<a name="l00389"></a>00389     params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1c39847b91b0178b1a04749d64aecbf2" title="burst capacity of the link (default 0)">capacity_</a>        = 0;
<a name="l00390"></a>00390     params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1dac95754a10197829cf580d83072756" title="automatically infer the remote eid when the link connects">set_remote_eid_</a>  = <span class="keyword">true</span>;
<a name="l00391"></a>00391     params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#412ffc2b2be0d27ea3bae9ddf0142609" title="set the previous hop when bundles arrive">set_prevhop_</a>     = <span class="keyword">true</span>;
<a name="l00392"></a>00392     
<a name="l00393"></a>00393     p.addopt(<span class="keyword">new</span> oasys::BoolOpt(<span class="stringliteral">"deliver_partial"</span>, &amp;params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#f3a32cf75d8c239055952d76fd5bdc38" title="if contact closes in the middle of a transmission, deliver the partially received...">deliver_partial_</a>));
<a name="l00394"></a>00394     p.addopt(<span class="keyword">new</span> oasys::BoolOpt(<span class="stringliteral">"reliable"</span>, &amp;params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#60f1fccf979e5f344564389e1a049346" title="for bundles sent over the link, signal to the router whether or not they were delivered...">reliable_</a>));
<a name="l00395"></a>00395     p.addopt(<span class="keyword">new</span> oasys::UIntOpt(<span class="stringliteral">"capacity"</span>, &amp;params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1c39847b91b0178b1a04749d64aecbf2" title="burst capacity of the link (default 0)">capacity_</a>));
<a name="l00396"></a>00396     p.addopt(<span class="keyword">new</span> oasys::BoolOpt(<span class="stringliteral">"set_remote_eid"</span>, &amp;params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#1dac95754a10197829cf580d83072756" title="automatically infer the remote eid when the link connects">set_remote_eid_</a>));
<a name="l00397"></a>00397     p.addopt(<span class="keyword">new</span> oasys::BoolOpt(<span class="stringliteral">"set_prevhop"</span>, &amp;params.<a class="code" href="structdtnsim_1_1SimLink_1_1Params.html#412ffc2b2be0d27ea3bae9ddf0142609" title="set the previous hop when bundles arrive">set_prevhop_</a>));
<a name="l00398"></a>00398 
<a name="l00399"></a>00399     <span class="keyword">const</span> <span class="keywordtype">char</span>* invalid;
<a name="l00400"></a>00400     <span class="keywordflow">if</span> (! p.parse(argc, argv, &amp;invalid)) {
<a name="l00401"></a>00401         log_err(<span class="stringliteral">"error parsing link options: invalid option %s"</span>, invalid);
<a name="l00402"></a>00402         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00403"></a>00403     }
<a name="l00404"></a>00404 
<a name="l00405"></a>00405     <a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>* sl = <span class="keyword">new</span> <a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>(link, params);
<a name="l00406"></a>00406     sl-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a> = <a class="code" href="classdtnsim_1_1Topology.html#47925759729cb97284a5bb032941b132">Topology::find_node</a>(link-&gt;nexthop());
<a name="l00407"></a>00407 
<a name="l00408"></a>00408     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(sl-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a>);
<a name="l00409"></a>00409     link-&gt;set_cl_info(sl);
<a name="l00410"></a>00410 
<a name="l00411"></a>00411     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00412"></a>00412 }
<a name="l00413"></a>00413 
<a name="l00414"></a>00414 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00415"></a>00415 <span class="keywordtype">void</span>
<a name="l00416"></a><a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#b2b2198bb3dcbf48bb4a096523aca83d">00416</a> <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#b2b2198bb3dcbf48bb4a096523aca83d">SimConvergenceLayer::delete_link</a>(<span class="keyword">const</span> <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a>&amp; link)
<a name="l00417"></a>00417 {
<a name="l00418"></a>00418     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(link != NULL);
<a name="l00419"></a>00419     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!link-&gt;isdeleted());
<a name="l00420"></a>00420     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(link-&gt;cl_info() != NULL);
<a name="l00421"></a>00421 
<a name="l00422"></a>00422     log_debug(<span class="stringliteral">"SimConvergenceLayer::delete_link: "</span>
<a name="l00423"></a>00423               <span class="stringliteral">"deleting link %s"</span>, link-&gt;name());
<a name="l00424"></a>00424 
<a name="l00425"></a>00425     <span class="keyword">delete</span> link-&gt;cl_info();
<a name="l00426"></a>00426     link-&gt;set_cl_info(NULL);
<a name="l00427"></a>00427 }
<a name="l00428"></a>00428 
<a name="l00429"></a>00429 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00430"></a>00430 <span class="keywordtype">bool</span>
<a name="l00431"></a><a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#1a7ad793750a14ee2e500ee1e87d5381">00431</a> <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#1a7ad793750a14ee2e500ee1e87d5381">SimConvergenceLayer::open_contact</a>(<span class="keyword">const</span> <a class="code" href="namespacedtn.html#5f869544c85c75b5a85a14d6e90d7ff7" title="Typedef for a reference on a contact.">ContactRef</a>&amp; contact)
<a name="l00432"></a>00432 {
<a name="l00433"></a>00433     log_debug(<span class="stringliteral">"opening contact for link [*%p]"</span>, contact.object());
<a name="l00434"></a>00434 
<a name="l00435"></a>00435 
<a name="l00436"></a>00436     <a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>* sl = (<a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>*)contact-&gt;link()-&gt;cl_info();
<a name="l00437"></a>00437     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(sl);
<a name="l00438"></a>00438     
<a name="l00439"></a>00439     <span class="keyword">const</span> <a class="code" href="structdtnsim_1_1ConnState.html" title="Helper struct to store the current connectivity settings between a pair (or set)...">ConnState</a>* cs = <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#088bc32699af701d4db627669793482b" title="Singleton accessor.">Connectivity::instance</a>()-&gt;
<a name="l00440"></a>00440                           lookup(<a class="code" href="classdtnsim_1_1Node.html#0092d41cdd29927ede0833a8164885e9" title="Return the current active node.">Node::active_node</a>(), sl-&gt;peer_node_);
<a name="l00441"></a>00441     <span class="keywordflow">if</span> (cs != NULL &amp;&amp; cs-&gt;<a class="code" href="structdtnsim_1_1ConnState.html#bdc8e1b713b2b6692693c1ced1b6554c">open_</a>) {
<a name="l00442"></a>00442         log_debug(<span class="stringliteral">"opening contact"</span>);
<a name="l00443"></a>00443         <span class="keywordflow">if</span> (sl-&gt;params_.set_remote_eid_) {
<a name="l00444"></a>00444             contact-&gt;link()-&gt;set_remote_eid(sl-&gt;peer_node_-&gt;local_eid());
<a name="l00445"></a>00445         }
<a name="l00446"></a>00446         <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#8dde819b0f05a1c9f32f132c458d58c6">update_connectivity</a>(<a class="code" href="classdtnsim_1_1Node.html#0092d41cdd29927ede0833a8164885e9" title="Return the current active node.">Node::active_node</a>(), sl-&gt;peer_node_, *cs);
<a name="l00447"></a>00447         BundleDaemon::post(<span class="keyword">new</span> <a class="code" href="classdtn_1_1ContactUpEvent.html" title="Event class for contact up events.">ContactUpEvent</a>(contact));
<a name="l00448"></a>00448 
<a name="l00449"></a>00449         <span class="comment">// if there is a queued bundle on the link, start sending it</span>
<a name="l00450"></a>00450         <span class="keywordflow">if</span> (! contact-&gt;link()-&gt;queue()-&gt;empty()) {
<a name="l00451"></a>00451             sl-&gt;start_next_bundle();
<a name="l00452"></a>00452         }
<a name="l00453"></a>00453         
<a name="l00454"></a>00454     } <span class="keywordflow">else</span> {
<a name="l00455"></a>00455         log_debug(<span class="stringliteral">"connectivity is down when trying to open contact"</span>);
<a name="l00456"></a>00456         BundleDaemon::post(
<a name="l00457"></a>00457             <span class="keyword">new</span> <a class="code" href="classdtn_1_1LinkStateChangeRequest.html" title="Request class for link state change requests that are sent to the daemon thread for...">LinkStateChangeRequest</a>(contact-&gt;link(),
<a name="l00458"></a>00458                                        Link::CLOSED,
<a name="l00459"></a>00459                                        ContactEvent::BROKEN));
<a name="l00460"></a>00460     }
<a name="l00461"></a>00461         
<a name="l00462"></a>00462     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00463"></a>00463 }
<a name="l00464"></a>00464 
<a name="l00465"></a>00465 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00466"></a>00466 <span class="keywordtype">void</span> 
<a name="l00467"></a><a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#97961eca765e46809c8f797ef8bb0cbb">00467</a> <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#97961eca765e46809c8f797ef8bb0cbb">SimConvergenceLayer::bundle_queued</a>(<span class="keyword">const</span> <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a>&amp; link, <span class="keyword">const</span> <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a>&amp; bundle)
<a name="l00468"></a>00468 {
<a name="l00469"></a>00469     (void)bundle;
<a name="l00470"></a>00470     
<a name="l00471"></a>00471     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!link-&gt;isdeleted());
<a name="l00472"></a>00472     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(link-&gt;cl_info() != NULL);
<a name="l00473"></a>00473 
<a name="l00474"></a>00474     log_debug(<span class="stringliteral">"bundle_queued *%p on link *%p"</span>, bundle.object(), link.object());
<a name="l00475"></a>00475 
<a name="l00476"></a>00476     <a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>* sl = (<a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>*)link-&gt;cl_info();
<a name="l00477"></a>00477     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(sl);
<a name="l00478"></a>00478 
<a name="l00479"></a>00479     <span class="keywordflow">if</span> (link-&gt;isopen() &amp;&amp; (sl-&gt;pending_inflight_ == NULL)) {
<a name="l00480"></a>00480         sl-&gt;start_next_bundle();
<a name="l00481"></a>00481     }
<a name="l00482"></a>00482 }
<a name="l00483"></a>00483 
<a name="l00484"></a>00484 <span class="comment">//----------------------------------------------------------------------</span>
<a name="l00485"></a>00485 <span class="keywordtype">void</span>
<a name="l00486"></a><a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#8dde819b0f05a1c9f32f132c458d58c6">00486</a> <a class="code" href="classdtnsim_1_1SimConvergenceLayer.html#8dde819b0f05a1c9f32f132c458d58c6">SimConvergenceLayer::update_connectivity</a>(<a class="code" href="classdtnsim_1_1Node.html" title="Class representing a node in the simulator (i.e.">Node</a>* n1, <a class="code" href="classdtnsim_1_1Node.html" title="Class representing a node in the simulator (i.e.">Node</a>* n2, <span class="keyword">const</span> <a class="code" href="structdtnsim_1_1ConnState.html" title="Helper struct to store the current connectivity settings between a pair (or set)...">ConnState</a>&amp; cs)
<a name="l00487"></a>00487 {
<a name="l00488"></a>00488     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(n1 != NULL);
<a name="l00489"></a>00489     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(n2 != NULL);
<a name="l00490"></a>00490 
<a name="l00491"></a>00491     n1-&gt;<a class="code" href="classdtnsim_1_1Node.html#5f8ad70a765bbb1b8d8e8d07ef502036" title="Set the node as the &amp;quot;active&amp;quot; node in the simulation.">set_active</a>();
<a name="l00492"></a>00492     
<a name="l00493"></a>00493     <a class="code" href="classdtn_1_1ContactManager.html" title="A contact manager class.">ContactManager</a>* cm = n1-&gt;<a class="code" href="classdtn_1_1BundleDaemon.html#22515a3eddd14032172f89d06d8d4e46" title="Accessor for the contact manager.">contactmgr</a>();;
<a name="l00494"></a>00494 
<a name="l00495"></a>00495     oasys::ScopeLock l(cm-&gt;<a class="code" href="classdtn_1_1ContactManager.html#6edebce9cf6080f854039f8df593cfec" title="Accessor for the ContactManager internal lock.">lock</a>(), <span class="stringliteral">"SimConvergenceLayer::update_connectivity"</span>);
<a name="l00496"></a>00496     <span class="keyword">const</span> <a class="code" href="classdtn_1_1LinkSet.html" title="Set of links.">LinkSet</a>* links = cm-&gt;<a class="code" href="classdtn_1_1ContactManager.html#957c6cfac0575444e0a9a04a12708cf6" title="Return the list of links.">links</a>();
<a name="l00497"></a>00497     
<a name="l00498"></a>00498     <span class="keywordflow">for</span> (LinkSet::iterator iter = links-&gt;begin();
<a name="l00499"></a>00499          iter != links-&gt;end();
<a name="l00500"></a>00500          ++iter)
<a name="l00501"></a>00501     {
<a name="l00502"></a>00502         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link = *iter;
<a name="l00503"></a>00503         <a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>* sl = (<a class="code" href="classdtnsim_1_1SimLink.html">SimLink</a>*)link-&gt;cl_info();
<a name="l00504"></a>00504         <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(sl);
<a name="l00505"></a>00505 
<a name="l00506"></a>00506         <span class="comment">// update the token bucket</span>
<a name="l00507"></a>00507         sl-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#acc1169aba619333dd4425ded507762f" title="Token bucket to track the link rate.">tb_</a>.set_rate(cs.<a class="code" href="structdtnsim_1_1ConnState.html#baebb749124c990c0a3b957dfd6467ad">bw_</a>);
<a name="l00508"></a>00508         
<a name="l00509"></a>00509         <span class="keywordflow">if</span> (sl-&gt;<a class="code" href="classdtnsim_1_1SimLink.html#c1b78c68f8d8f7dd512971fb59d76d1e" title="The receiving node.">peer_node_</a> != n2)
<a name="l00510"></a>00510             <span class="keywordflow">continue</span>;
<a name="l00511"></a>00511         
<a name="l00512"></a>00512         log_debug(<span class="stringliteral">"update_connectivity: checking node %s link %s"</span>,
<a name="l00513"></a>00513                   n1-&gt;<a class="code" href="classdtnsim_1_1Node.html#cac8ab04c1d7117e0dea6b3ad74f70de" title="Accessor for name.">name</a>(), link-&gt;name());
<a name="l00514"></a>00514         
<a name="l00515"></a>00515         <span class="keywordflow">if</span> (cs.<a class="code" href="structdtnsim_1_1ConnState.html#bdc8e1b713b2b6692693c1ced1b6554c">open_</a> == <span class="keyword">false</span> &amp;&amp; link-&gt;state() == Link::OPEN) {
<a name="l00516"></a>00516             log_debug(<span class="stringliteral">"update_connectivity: closing link %s"</span>, link-&gt;name());
<a name="l00517"></a>00517             n1-&gt;<a class="code" href="classdtnsim_1_1Node.html#0986c0f6d3eeec3fba7779a3d6d38513" title="Virtual post function, overridden in the simulator to use the modified event queue...">post_event</a>(
<a name="l00518"></a>00518                 <span class="keyword">new</span> <a class="code" href="classdtn_1_1LinkStateChangeRequest.html" title="Request class for link state change requests that are sent to the daemon thread for...">LinkStateChangeRequest</a>(link, Link::CLOSED,
<a name="l00519"></a>00519                                            ContactEvent::BROKEN));
<a name="l00520"></a>00520         }
<a name="l00521"></a>00521     }
<a name="l00522"></a>00522 }
<a name="l00523"></a>00523 
<a name="l00524"></a>00524 
<a name="l00525"></a>00525 } <span class="comment">// namespace dtnsim</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Fri Jan 30 09:26:58 2009 for DTN Reference Implementation by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
</body>
</html>