Sophie

Sophie

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

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: ExternalRouter.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>ExternalRouter.cc</h1><a href="ExternalRouter_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 2006-2007 The MITRE 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 <span class="comment"> *    The US Government will not be charged any license fee and/or royalties</span>
<a name="l00017"></a>00017 <span class="comment"> *    related to this software. Neither name of The MITRE Corporation; nor the</span>
<a name="l00018"></a>00018 <span class="comment"> *    names of its contributors may be used to endorse or promote products</span>
<a name="l00019"></a>00019 <span class="comment"> *    derived from this software without specific prior written permission.</span>
<a name="l00020"></a>00020 <span class="comment"> */</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
<a name="l00023"></a>00023 <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="l00024"></a>00024 <span class="preprocessor">#endif</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span>
<a name="l00026"></a>00026 <span class="preprocessor">#if defined(XERCES_C_ENABLED) &amp;&amp; defined(EXTERNAL_DP_ENABLED)</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;memory&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;iostream&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;map&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;vector&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;sys/ioctl.h&gt;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;time.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;netinet/in.h&gt;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &lt;sstream&gt;</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include &lt;xercesc/framework/MemBufFormatTarget.hpp&gt;</span>
<a name="l00038"></a>00038 
<a name="l00039"></a>00039 <span class="preprocessor">#include "<a class="code" href="ExternalRouter_8h.html">ExternalRouter.h</a>"</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include "<a class="code" href="GbofId_8h.html">bundling/GbofId.h</a>"</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include "<a class="code" href="BundleDaemon_8h.html">bundling/BundleDaemon.h</a>"</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include "<a class="code" href="BundleActions_8h.html">bundling/BundleActions.h</a>"</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include "<a class="code" href="MetadataBlockProcessor_8h.html">bundling/MetadataBlockProcessor.h</a>"</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include "<a class="code" href="ContactManager_8h.html">contacts/ContactManager.h</a>"</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include "<a class="code" href="NamedAttribute_8h.html">contacts/NamedAttribute.h</a>"</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include "<a class="code" href="RegistrationTable_8h.html">reg/RegistrationTable.h</a>"</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include "<a class="code" href="ConvergenceLayer_8h.html">conv_layers/ConvergenceLayer.h</a>"</span>
<a name="l00048"></a>00048 <span class="preprocessor">#include &lt;oasys/io/UDPClient.h&gt;</span>
<a name="l00049"></a>00049 <span class="preprocessor">#include &lt;oasys/tclcmd/TclCommand.h&gt;</span>
<a name="l00050"></a>00050 <span class="preprocessor">#include &lt;oasys/io/IO.h&gt;</span>
<a name="l00051"></a>00051 
<a name="l00052"></a>00052 <span class="preprocessor">#define SEND(event, data) \</span>
<a name="l00053"></a>00053 <span class="preprocessor">    rtrmessage::bpa message; \</span>
<a name="l00054"></a>00054 <span class="preprocessor">    message.event(data); \</span>
<a name="l00055"></a>00055 <span class="preprocessor">    send(message);</span>
<a name="l00056"></a>00056 <span class="preprocessor"></span>
<a name="l00057"></a>00057 <span class="preprocessor">#define CATCH(exception) \</span>
<a name="l00058"></a>00058 <span class="preprocessor">    catch (exception &amp;e) { log_warn("%s",e.what()); }</span>
<a name="l00059"></a>00059 <span class="preprocessor"></span>
<a name="l00060"></a>00060 <span class="keyword">namespace </span>dtn {
<a name="l00061"></a>00061 
<a name="l00062"></a>00062 <span class="keyword">using namespace </span>rtrmessage;
<a name="l00063"></a>00063 
<a name="l00064"></a>00064 ExternalRouter::ExternalRouter()
<a name="l00065"></a>00065     : BundleRouter(<span class="stringliteral">"ExternalRouter"</span>, <span class="stringliteral">"external"</span>)
<a name="l00066"></a>00066 {
<a name="l00067"></a>00067     log_notice(<span class="stringliteral">"Initializing ExternalRouter"</span>);
<a name="l00068"></a>00068 }
<a name="l00069"></a>00069 
<a name="l00070"></a>00070 ExternalRouter::~ExternalRouter()
<a name="l00071"></a>00071 {
<a name="l00072"></a>00072     <span class="keyword">delete</span> srv_;
<a name="l00073"></a>00073     <span class="keyword">delete</span> hello_;
<a name="l00074"></a>00074     <span class="keyword">delete</span> reg_;
<a name="l00075"></a>00075     <span class="keyword">delete</span> route_table_;
<a name="l00076"></a>00076 }
<a name="l00077"></a>00077 
<a name="l00078"></a>00078 <span class="comment">// Initialize inner classes</span>
<a name="l00079"></a>00079 <span class="keywordtype">void</span>
<a name="l00080"></a>00080 ExternalRouter::initialize()
<a name="l00081"></a>00081 {
<a name="l00082"></a>00082     <span class="comment">// Create the static route table</span>
<a name="l00083"></a>00083     route_table_ = <span class="keyword">new</span> RouteTable(<span class="stringliteral">"external"</span>);
<a name="l00084"></a>00084 
<a name="l00085"></a>00085     <span class="comment">// Register as a client app with the forwarder</span>
<a name="l00086"></a>00086     reg_ = <span class="keyword">new</span> ERRegistration(<span class="keyword">this</span>);
<a name="l00087"></a>00087 
<a name="l00088"></a>00088     <span class="comment">// Create a hello timer</span>
<a name="l00089"></a>00089     hello_ = <span class="keyword">new</span> HelloTimer(<span class="keyword">this</span>);
<a name="l00090"></a>00090 
<a name="l00091"></a>00091     <span class="comment">// Register the global shutdown function</span>
<a name="l00092"></a>00092     BundleDaemon::instance()-&gt;set_rtr_shutdown(
<a name="l00093"></a>00093         external_rtr_shutdown, (<span class="keywordtype">void</span> *) 0);
<a name="l00094"></a>00094 
<a name="l00095"></a>00095     <span class="comment">// Start module server thread</span>
<a name="l00096"></a>00096     srv_ = <span class="keyword">new</span> ModuleServer();
<a name="l00097"></a>00097     srv_-&gt;start();
<a name="l00098"></a>00098 
<a name="l00099"></a>00099     bpa <a class="code" href="serialsource_8c.html#dce261c6a0421cc69b6a6ff86f5be7dd">message</a>;
<a name="l00100"></a>00100     message.alert(dtnStatusType(std::string(<span class="stringliteral">"justBooted"</span>)));
<a name="l00101"></a>00101     message.hello_interval(ExternalRouter::hello_interval);
<a name="l00102"></a>00102     send(message);
<a name="l00103"></a>00103     hello_-&gt;schedule_in(ExternalRouter::hello_interval * 1000);
<a name="l00104"></a>00104 }
<a name="l00105"></a>00105 
<a name="l00106"></a>00106 <span class="keywordtype">void</span>
<a name="l00107"></a>00107 ExternalRouter::shutdown()
<a name="l00108"></a>00108 {
<a name="l00109"></a>00109     dtnStatusType e(std::string(<span class="stringliteral">"shuttingDown"</span>));
<a name="l00110"></a>00110     SEND(alert, e)
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112 
<a name="l00113"></a>00113 <span class="comment">// Format the given StringBuffer with static routing info</span>
<a name="l00114"></a>00114 <span class="keywordtype">void</span>
<a name="l00115"></a>00115 ExternalRouter::get_routing_state(oasys::StringBuffer* <a class="code" href="num2sdnv_8c.html#a81cdcc7ff6987bc85c073253e32715f">buf</a>)
<a name="l00116"></a>00116 {
<a name="l00117"></a>00117     buf-&gt;appendf(<span class="stringliteral">"Static route table for %s router(s):\n"</span>, name_.c_str());
<a name="l00118"></a>00118     route_table_-&gt;dump(buf);
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120 
<a name="l00121"></a>00121 <span class="comment">// Serialize events and UDP multicast to external routers</span>
<a name="l00122"></a>00122 <span class="keywordtype">void</span>
<a name="l00123"></a>00123 ExternalRouter::handle_event(BundleEvent *event)
<a name="l00124"></a>00124 {
<a name="l00125"></a>00125     dispatch_event(event);
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127 
<a name="l00128"></a>00128 <span class="keywordtype">void</span>
<a name="l00129"></a>00129 ExternalRouter::handle_bundle_received(BundleReceivedEvent *event)
<a name="l00130"></a>00130 {
<a name="l00131"></a>00131     bpa::bundle_received_event::type e(
<a name="l00132"></a>00132         event-&gt;bundleref_.object(),
<a name="l00133"></a>00133         <span class="keyword">event</span>-&gt;bundleref_-&gt;dest(),
<a name="l00134"></a>00134         <span class="keyword">event</span>-&gt;bundleref_-&gt;custodian(),
<a name="l00135"></a>00135         <span class="keyword">event</span>-&gt;bundleref_-&gt;replyto(),
<a name="l00136"></a>00136         bundle_ts_to_long(event-&gt;bundleref_-&gt;extended_id()),
<a name="l00137"></a>00137         event-&gt;bundleref_-&gt;expiration(),
<a name="l00138"></a>00138         <span class="keyword">event</span>-&gt;bytes_received_);
<a name="l00139"></a>00139 
<a name="l00140"></a>00140     <span class="comment">// optional param, so has to be added after constructor call</span>
<a name="l00141"></a>00141     e.prevhop(event-&gt;bundleref_-&gt;prevhop());
<a name="l00142"></a>00142 
<a name="l00143"></a>00143     <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> null_link(<span class="stringliteral">"ExternalRouter::handle_bundle_received"</span>);
<a name="l00144"></a>00144     MetadataVec * gen_meta = <span class="keyword">event</span>-&gt;bundleref_-&gt;generated_metadata().
<a name="l00145"></a>00145                              find_blocks(null_link);
<a name="l00146"></a>00146     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num_meta_blocks = <span class="keyword">event</span>-&gt;bundleref_-&gt;recv_metadata().size() +
<a name="l00147"></a>00147                                    ((gen_meta == NULL)? 0 : gen_meta-&gt;size());
<a name="l00148"></a>00148     e.num_meta_blocks(num_meta_blocks);
<a name="l00149"></a>00149 
<a name="l00150"></a>00150     SEND(bundle_received_event, e)
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152 
<a name="l00153"></a>00153 <span class="keywordtype">void</span>
<a name="l00154"></a>00154 ExternalRouter::handle_bundle_transmitted(BundleTransmittedEvent* event)
<a name="l00155"></a>00155 {
<a name="l00156"></a>00156     <span class="keywordflow">if</span> (event-&gt;contact_ == NULL) <span class="keywordflow">return</span>;
<a name="l00157"></a>00157 
<a name="l00158"></a>00158     bpa::data_transmitted_event::type e(
<a name="l00159"></a>00159         event-&gt;bundleref_.object(),
<a name="l00160"></a>00160         bundle_ts_to_long(event-&gt;bundleref_-&gt;extended_id()),
<a name="l00161"></a>00161         event-&gt;link_.object()-&gt;name_str(),
<a name="l00162"></a>00162         <span class="keyword">event</span>-&gt;bytes_sent_,
<a name="l00163"></a>00163         <span class="keyword">event</span>-&gt;reliably_sent_);
<a name="l00164"></a>00164     SEND(data_transmitted_event, e)
<a name="l00165"></a>00165 }
<a name="l00166"></a>00166 
<a name="l00167"></a>00167 <span class="keywordtype">void</span>
<a name="l00168"></a>00168 ExternalRouter::handle_bundle_delivered(BundleDeliveredEvent* event)
<a name="l00169"></a>00169 {
<a name="l00170"></a>00170     bpa::bundle_delivered_event::type e(
<a name="l00171"></a>00171         event-&gt;bundleref_.object(),
<a name="l00172"></a>00172         bundle_ts_to_long(event-&gt;bundleref_-&gt;extended_id()));
<a name="l00173"></a>00173     SEND(bundle_delivered_event, e)
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175 
<a name="l00176"></a>00176 <span class="keywordtype">void</span>
<a name="l00177"></a>00177 ExternalRouter::handle_bundle_expired(BundleExpiredEvent* event)
<a name="l00178"></a>00178 {
<a name="l00179"></a>00179     bpa::bundle_expired_event::type e(
<a name="l00180"></a>00180         event-&gt;bundleref_.object(),
<a name="l00181"></a>00181         bundle_ts_to_long(event-&gt;bundleref_-&gt;extended_id()));
<a name="l00182"></a>00182     SEND(bundle_expired_event, e)
<a name="l00183"></a>00183 }
<a name="l00184"></a>00184 
<a name="l00185"></a>00185 <span class="keywordtype">void</span>
<a name="l00186"></a>00186 ExternalRouter::handle_bundle_cancelled(BundleSendCancelledEvent* event)
<a name="l00187"></a>00187 {
<a name="l00188"></a>00188     bpa::bundle_send_cancelled_event::type e(
<a name="l00189"></a>00189         event-&gt;bundleref_.object(),
<a name="l00190"></a>00190         <span class="keyword">event</span>-&gt;link_.object()-&gt;name_str(),
<a name="l00191"></a>00191         bundle_ts_to_long(event-&gt;bundleref_-&gt;extended_id()));
<a name="l00192"></a>00192     SEND(bundle_send_cancelled_event, e)
<a name="l00193"></a>00193 }
<a name="l00194"></a>00194 
<a name="l00195"></a>00195 <span class="keywordtype">void</span>
<a name="l00196"></a>00196 ExternalRouter::handle_bundle_injected(BundleInjectedEvent* event)
<a name="l00197"></a>00197 {
<a name="l00198"></a>00198     bpa::bundle_injected_event::type e(
<a name="l00199"></a>00199         event-&gt;request_id_,
<a name="l00200"></a>00200         event-&gt;bundleref_.object(),
<a name="l00201"></a>00201         bundle_ts_to_long(event-&gt;bundleref_-&gt;extended_id()));
<a name="l00202"></a>00202     SEND(bundle_injected_event, e)
<a name="l00203"></a>00203 }
<a name="l00204"></a>00204 
<a name="l00205"></a>00205 <span class="keywordtype">void</span>
<a name="l00206"></a>00206 ExternalRouter::handle_contact_up(ContactUpEvent* event)
<a name="l00207"></a>00207 {
<a name="l00208"></a>00208     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event-&gt;contact_-&gt;link() != NULL);
<a name="l00209"></a>00209     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!event-&gt;contact_-&gt;link()-&gt;isdeleted());
<a name="l00210"></a>00210         
<a name="l00211"></a>00211     bpa::link_opened_event::type e(
<a name="l00212"></a>00212         event-&gt;contact_.object(),
<a name="l00213"></a>00213         <span class="keyword">event</span>-&gt;contact_-&gt;link().object()-&gt;name_str());
<a name="l00214"></a>00214     SEND(link_opened_event, e)
<a name="l00215"></a>00215 }
<a name="l00216"></a>00216 
<a name="l00217"></a>00217 <span class="keywordtype">void</span>
<a name="l00218"></a>00218 ExternalRouter::handle_contact_down(ContactDownEvent* event)
<a name="l00219"></a>00219 {
<a name="l00220"></a>00220     bpa::link_closed_event::type e(
<a name="l00221"></a>00221         event-&gt;contact_.object(),
<a name="l00222"></a>00222         <span class="keyword">event</span>-&gt;contact_-&gt;link().object()-&gt;name_str(),
<a name="l00223"></a>00223         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00224"></a>00224     SEND(link_closed_event, e)
<a name="l00225"></a>00225 }
<a name="l00226"></a>00226 
<a name="l00227"></a>00227 <span class="keywordtype">void</span>
<a name="l00228"></a>00228 ExternalRouter::handle_link_created(LinkCreatedEvent *event)
<a name="l00229"></a>00229 {
<a name="l00230"></a>00230     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event-&gt;link_ != NULL);
<a name="l00231"></a>00231     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!event-&gt;link_-&gt;isdeleted());
<a name="l00232"></a>00232         
<a name="l00233"></a>00233     bpa::link_created_event::type e(
<a name="l00234"></a>00234         event-&gt;link_.object(),
<a name="l00235"></a>00235         <span class="keyword">event</span>-&gt;link_.object()-&gt;name_str(),
<a name="l00236"></a>00236         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00237"></a>00237     SEND(link_created_event, e)
<a name="l00238"></a>00238 }
<a name="l00239"></a>00239 
<a name="l00240"></a>00240 <span class="keywordtype">void</span>
<a name="l00241"></a>00241 ExternalRouter::handle_link_deleted(LinkDeletedEvent *event)
<a name="l00242"></a>00242 {
<a name="l00243"></a>00243     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event-&gt;link_ != NULL);
<a name="l00244"></a>00244 
<a name="l00245"></a>00245     bpa::link_deleted_event::type e(
<a name="l00246"></a>00246         event-&gt;link_.object()-&gt;name_str(),
<a name="l00247"></a>00247         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00248"></a>00248     SEND(link_deleted_event, e)
<a name="l00249"></a>00249 }
<a name="l00250"></a>00250 
<a name="l00251"></a>00251 <span class="keywordtype">void</span>
<a name="l00252"></a>00252 ExternalRouter::handle_link_available(LinkAvailableEvent *event)
<a name="l00253"></a>00253 {
<a name="l00254"></a>00254     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event-&gt;link_ != NULL);
<a name="l00255"></a>00255     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!event-&gt;link_-&gt;isdeleted());
<a name="l00256"></a>00256         
<a name="l00257"></a>00257     bpa::link_available_event::type e(
<a name="l00258"></a>00258         event-&gt;link_.object()-&gt;name_str(),
<a name="l00259"></a>00259         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00260"></a>00260     SEND(link_available_event, e)
<a name="l00261"></a>00261 }
<a name="l00262"></a>00262 
<a name="l00263"></a>00263 <span class="keywordtype">void</span>
<a name="l00264"></a>00264 ExternalRouter::handle_link_unavailable(LinkUnavailableEvent *event)
<a name="l00265"></a>00265 {
<a name="l00266"></a>00266     bpa::link_unavailable_event::type e(
<a name="l00267"></a>00267         event-&gt;link_.object()-&gt;name_str(),
<a name="l00268"></a>00268         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00269"></a>00269     SEND(link_unavailable_event, e)
<a name="l00270"></a>00270 }
<a name="l00271"></a>00271 
<a name="l00272"></a>00272 <span class="keywordtype">void</span>
<a name="l00273"></a>00273 ExternalRouter::handle_link_attribute_changed(LinkAttributeChangedEvent *event)
<a name="l00274"></a>00274 {
<a name="l00275"></a>00275     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event-&gt;link_ != NULL);
<a name="l00276"></a>00276     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!event-&gt;link_-&gt;isdeleted());
<a name="l00277"></a>00277         
<a name="l00278"></a>00278     bpa::link_attribute_changed_event::type e(
<a name="l00279"></a>00279         event-&gt;link_.object(),
<a name="l00280"></a>00280         <span class="keyword">event</span>-&gt;link_.object()-&gt;name_str(),
<a name="l00281"></a>00281         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00282"></a>00282     SEND(link_attribute_changed_event, e)
<a name="l00283"></a>00283 }
<a name="l00284"></a>00284 
<a name="l00285"></a>00285 <span class="keywordtype">void</span>
<a name="l00286"></a>00286 ExternalRouter::handle_new_eid_reachable(NewEIDReachableEvent* event)
<a name="l00287"></a>00287 {
<a name="l00288"></a>00288     bpa::eid_reachable_event::type e(
<a name="l00289"></a>00289         event-&gt;endpoint_,
<a name="l00290"></a>00290         event-&gt;iface_-&gt;name());
<a name="l00291"></a>00291     SEND(eid_reachable_event, e)
<a name="l00292"></a>00292 }
<a name="l00293"></a>00293 
<a name="l00294"></a>00294 <span class="keywordtype">void</span>
<a name="l00295"></a>00295 ExternalRouter::handle_contact_attribute_changed(ContactAttributeChangedEvent *event)
<a name="l00296"></a>00296 {
<a name="l00297"></a>00297     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event-&gt;contact_-&gt;link() != NULL);
<a name="l00298"></a>00298     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(!event-&gt;contact_-&gt;link()-&gt;isdeleted());
<a name="l00299"></a>00299         
<a name="l00300"></a>00300     <span class="comment">// @@@ is this right? contact_eid same as link's remote_eid?</span>
<a name="l00301"></a>00301     bpa::contact_attribute_changed_event::type e(
<a name="l00302"></a>00302         eidType(event-&gt;contact_-&gt;link()-&gt;remote_eid().str()), 
<a name="l00303"></a>00303         event-&gt;contact_.object(),
<a name="l00304"></a>00304         contactReasonType(reason_to_str(event-&gt;reason_)));
<a name="l00305"></a>00305     SEND(contact_attribute_changed_event, e)
<a name="l00306"></a>00306 }
<a name="l00307"></a>00307 
<a name="l00308"></a>00308 <span class="comment">// void</span>
<a name="l00309"></a>00309 <span class="comment">// ExternalRouter::handle_link_busy(LinkBusyEvent *event)</span>
<a name="l00310"></a>00310 <span class="comment">// {</span>
<a name="l00311"></a>00311 <span class="comment">//     bpa::link_busy_event::type e(</span>
<a name="l00312"></a>00312 <span class="comment">//         event-&gt;link_.object());</span>
<a name="l00313"></a>00313 <span class="comment">//     SEND(link_busy_event, e)</span>
<a name="l00314"></a>00314 <span class="comment">// }</span>
<a name="l00315"></a>00315 
<a name="l00316"></a>00316 <span class="keywordtype">void</span>
<a name="l00317"></a>00317 ExternalRouter::handle_registration_added(RegistrationAddedEvent* event)
<a name="l00318"></a>00318 {
<a name="l00319"></a>00319     bpa::registration_added_event::type e(
<a name="l00320"></a>00320         event-&gt;registration_,
<a name="l00321"></a>00321         (xml_schema::string)<a class="code" href="namespacedtn.html#a1bfdb2c18e1fd4697b62e43e863fa76" title="Conversion function from a source to a string suitable for use with plug-in arch...">source_to_str</a>((<a class="code" href="namespacedtn.html#60ee39c9672604f59fe1b12d4e1d142b" title="Possible sources for events.">event_source_t</a>)event-&gt;source_));
<a name="l00322"></a>00322     SEND(registration_added_event, e)
<a name="l00323"></a>00323 }
<a name="l00324"></a>00324 
<a name="l00325"></a>00325 <span class="keywordtype">void</span>
<a name="l00326"></a>00326 ExternalRouter::handle_registration_removed(RegistrationRemovedEvent* event)
<a name="l00327"></a>00327 {
<a name="l00328"></a>00328     bpa::registration_removed_event::type e(
<a name="l00329"></a>00329         event-&gt;registration_);
<a name="l00330"></a>00330     SEND(registration_removed_event, e)
<a name="l00331"></a>00331 }
<a name="l00332"></a>00332 
<a name="l00333"></a>00333 <span class="keywordtype">void</span>
<a name="l00334"></a>00334 ExternalRouter::handle_registration_expired(RegistrationExpiredEvent* event)
<a name="l00335"></a>00335 {
<a name="l00336"></a>00336     bpa::registration_expired_event::type e(
<a name="l00337"></a>00337         event-&gt;registration_-&gt;regid());
<a name="l00338"></a>00338     SEND(registration_expired_event, e)
<a name="l00339"></a>00339 }
<a name="l00340"></a>00340 
<a name="l00341"></a>00341 <span class="keywordtype">void</span>
<a name="l00342"></a>00342 ExternalRouter::handle_route_add(RouteAddEvent* event)
<a name="l00343"></a>00343 {
<a name="l00344"></a>00344     <span class="comment">// update our own static route table first</span>
<a name="l00345"></a>00345     route_table_-&gt;add_entry(event-&gt;entry_);
<a name="l00346"></a>00346 
<a name="l00347"></a>00347     bpa::route_add_event::type e(
<a name="l00348"></a>00348         event-&gt;entry_);
<a name="l00349"></a>00349     SEND(route_add_event, e)
<a name="l00350"></a>00350 }
<a name="l00351"></a>00351 
<a name="l00352"></a>00352 <span class="keywordtype">void</span>
<a name="l00353"></a>00353 ExternalRouter::handle_route_del(RouteDelEvent* event)
<a name="l00354"></a>00354 {
<a name="l00355"></a>00355     <span class="comment">// update our own static route table first</span>
<a name="l00356"></a>00356     route_table_-&gt;del_entries(event-&gt;dest_);
<a name="l00357"></a>00357 
<a name="l00358"></a>00358     bpa::route_delete_event::type e(
<a name="l00359"></a>00359         eidType(event-&gt;dest_.str()));
<a name="l00360"></a>00360     SEND(route_delete_event, e)
<a name="l00361"></a>00361 }
<a name="l00362"></a>00362 
<a name="l00363"></a>00363 <span class="keywordtype">void</span>
<a name="l00364"></a>00364 ExternalRouter::handle_custody_signal(CustodySignalEvent* event)
<a name="l00365"></a>00365 {
<a name="l00366"></a>00366     custodySignalType attr(
<a name="l00367"></a>00367         event-&gt;data_.admin_type_,
<a name="l00368"></a>00368         event-&gt;data_.admin_flags_,
<a name="l00369"></a>00369         event-&gt;data_.succeeded_,
<a name="l00370"></a>00370         event-&gt;data_.reason_,
<a name="l00371"></a>00371         event-&gt;data_.orig_frag_offset_,
<a name="l00372"></a>00372         event-&gt;data_.orig_frag_length_,
<a name="l00373"></a>00373         event-&gt;data_.custody_signal_tv_.seconds_,
<a name="l00374"></a>00374         event-&gt;data_.custody_signal_tv_.seqno_,
<a name="l00375"></a>00375         event-&gt;data_.orig_creation_tv_.seconds_,
<a name="l00376"></a>00376         event-&gt;data_.orig_creation_tv_.seqno_);
<a name="l00377"></a>00377 
<a name="l00378"></a>00378     <span class="comment">// In order to provide the correct local_id we have to go find the</span>
<a name="l00379"></a>00379     <span class="comment">// bundle in our system that has this GBOF-ID and that we are custodian</span>
<a name="l00380"></a>00380     <span class="comment">// of. There should only be one such bundle.</span>
<a name="l00381"></a>00381 
<a name="l00382"></a>00382     GbofId gbof_id;
<a name="l00383"></a>00383     gbof_id.source_ = <span class="keyword">event</span>-&gt;data_.orig_source_eid_;
<a name="l00384"></a>00384     gbof_id.creation_ts_ = <span class="keyword">event</span>-&gt;data_.orig_creation_tv_;
<a name="l00385"></a>00385     gbof_id.is_fragment_
<a name="l00386"></a>00386         = <span class="keyword">event</span>-&gt;data_.admin_flags_ &amp; <a class="code" href="classdtn_1_1BundleProtocol.html#f827c0a9dff8115434bc273dc53b7df1951511bc017d452550ea77dd9a15306b">BundleProtocol::ADMIN_IS_FRAGMENT</a>;
<a name="l00387"></a>00387     gbof_id.frag_length_
<a name="l00388"></a>00388         = gbof_id.is_fragment_ ? <span class="keyword">event</span>-&gt;data_.orig_frag_length_ : 0;
<a name="l00389"></a>00389     gbof_id.frag_offset_
<a name="l00390"></a>00390         = gbof_id.is_fragment_ ? <span class="keyword">event</span>-&gt;data_.orig_frag_offset_ : 0;
<a name="l00391"></a>00391 
<a name="l00392"></a>00392     BundleDaemon *bd = BundleDaemon::instance();
<a name="l00393"></a>00393     <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = bd-&gt;custody_bundles()-&gt;find(gbof_id);
<a name="l00394"></a>00394     <span class="keywordflow">if</span> (!br.object()) {
<a name="l00395"></a>00395         <span class="comment">// We don't seem to currently have custody of this bundle</span>
<a name="l00396"></a>00396         <span class="keywordflow">return</span>;
<a name="l00397"></a>00397     }
<a name="l00398"></a>00398 
<a name="l00399"></a>00399     bpa::custody_signal_event::type e(
<a name="l00400"></a>00400         event-&gt;data_,
<a name="l00401"></a>00401         attr,
<a name="l00402"></a>00402         bundle_ts_to_long(br-&gt;extended_id()));
<a name="l00403"></a>00403 
<a name="l00404"></a>00404     SEND(custody_signal_event, e)
<a name="l00405"></a>00405 }
<a name="l00406"></a>00406 
<a name="l00407"></a>00407 <span class="keywordtype">void</span>
<a name="l00408"></a>00408 ExternalRouter::handle_custody_timeout(CustodyTimeoutEvent* event)
<a name="l00409"></a>00409 {
<a name="l00410"></a>00410     bpa::custody_timeout_event::type e(
<a name="l00411"></a>00411         event-&gt;bundle_.object(),
<a name="l00412"></a>00412         bundle_ts_to_long(event-&gt;bundle_-&gt;extended_id()));
<a name="l00413"></a>00413     SEND(custody_timeout_event, e)
<a name="l00414"></a>00414 }
<a name="l00415"></a>00415 
<a name="l00416"></a>00416 <span class="keywordtype">void</span>
<a name="l00417"></a>00417 ExternalRouter::handle_link_report(LinkReportEvent *event)
<a name="l00418"></a>00418 {
<a name="l00419"></a>00419     BundleDaemon *bd = BundleDaemon::instance();
<a name="l00420"></a>00420     oasys::ScopeLock l(bd-&gt;contactmgr()-&gt;lock(),
<a name="l00421"></a>00421         <span class="stringliteral">"ExternalRouter::handle_event"</span>);
<a name="l00422"></a>00422 
<a name="l00423"></a>00423     (void) event;
<a name="l00424"></a>00424 
<a name="l00425"></a>00425     <span class="keyword">const</span> LinkSet *links = bd-&gt;contactmgr()-&gt;links();
<a name="l00426"></a>00426     LinkSet::const_iterator i = links-&gt;begin();
<a name="l00427"></a>00427     LinkSet::const_iterator <a class="code" href="dtncat_8c.html#7ab59805f7a1819164bc301293db600d">end</a> = links-&gt;end();
<a name="l00428"></a>00428 
<a name="l00429"></a>00429     link_report report;
<a name="l00430"></a>00430     link_report::link::container c;
<a name="l00431"></a>00431 
<a name="l00432"></a>00432     <span class="keywordflow">for</span>(; i != end; ++i)
<a name="l00433"></a>00433         c.push_back(link_report::link::type((*i).object()));
<a name="l00434"></a>00434 
<a name="l00435"></a>00435     report.link(c);
<a name="l00436"></a>00436     SEND(link_report, report)
<a name="l00437"></a>00437 }
<a name="l00438"></a>00438 
<a name="l00439"></a>00439 <span class="keywordtype">void</span>
<a name="l00440"></a>00440 ExternalRouter::handle_link_attributes_report(LinkAttributesReportEvent *event)
<a name="l00441"></a>00441 {
<a name="l00442"></a>00442     AttributeVector::const_iterator iter = <span class="keyword">event</span>-&gt;attributes_.begin();
<a name="l00443"></a>00443     AttributeVector::const_iterator end = <span class="keyword">event</span>-&gt;attributes_.end();
<a name="l00444"></a>00444 
<a name="l00445"></a>00445     link_attributes_report::report_params::container c;
<a name="l00446"></a>00446 
<a name="l00447"></a>00447     <span class="keywordflow">for</span>(; iter != end; ++iter) {
<a name="l00448"></a>00448       c.push_back( key_value_pair(*iter) );
<a name="l00449"></a>00449     }
<a name="l00450"></a>00450 
<a name="l00451"></a>00451     link_attributes_report e(event-&gt;query_id_);
<a name="l00452"></a>00452     e.report_params(c);
<a name="l00453"></a>00453     SEND(link_attributes_report, e)
<a name="l00454"></a>00454 }
<a name="l00455"></a>00455 
<a name="l00456"></a>00456 <span class="keywordtype">void</span>
<a name="l00457"></a>00457 ExternalRouter::handle_contact_report(ContactReportEvent* event)
<a name="l00458"></a>00458 {
<a name="l00459"></a>00459     BundleDaemon *bd = BundleDaemon::instance();
<a name="l00460"></a>00460     oasys::ScopeLock l(bd-&gt;contactmgr()-&gt;lock(),
<a name="l00461"></a>00461         <span class="stringliteral">"ExternalRouter::handle_event"</span>);
<a name="l00462"></a>00462 
<a name="l00463"></a>00463     (void) event;
<a name="l00464"></a>00464     
<a name="l00465"></a>00465     <span class="keyword">const</span> LinkSet *links = bd-&gt;contactmgr()-&gt;links();
<a name="l00466"></a>00466     LinkSet::const_iterator i = links-&gt;begin();
<a name="l00467"></a>00467     LinkSet::const_iterator end = links-&gt;end();
<a name="l00468"></a>00468 
<a name="l00469"></a>00469     contact_report report;
<a name="l00470"></a>00470     contact_report::contact::container c;
<a name="l00471"></a>00471     
<a name="l00472"></a>00472     <span class="keywordflow">for</span>(; i != end; ++i) {
<a name="l00473"></a>00473         <span class="keywordflow">if</span> ((*i)-&gt;contact() != NULL) {
<a name="l00474"></a>00474             c.push_back((*i)-&gt;contact().object());
<a name="l00475"></a>00475         }
<a name="l00476"></a>00476     }
<a name="l00477"></a>00477 
<a name="l00478"></a>00478     report.contact(c);
<a name="l00479"></a>00479     SEND(contact_report, report)
<a name="l00480"></a>00480 }
<a name="l00481"></a>00481 
<a name="l00482"></a>00482 <span class="keywordtype">void</span>
<a name="l00483"></a>00483 ExternalRouter::handle_bundle_report(BundleReportEvent *event)
<a name="l00484"></a>00484 {
<a name="l00485"></a>00485     BundleDaemon *bd = BundleDaemon::instance();
<a name="l00486"></a>00486     oasys::ScopeLock l(bd-&gt;pending_bundles()-&gt;lock(),
<a name="l00487"></a>00487         <span class="stringliteral">"ExternalRouter::handle_event"</span>);
<a name="l00488"></a>00488 
<a name="l00489"></a>00489     (void) event;
<a name="l00490"></a>00490 
<a name="l00491"></a>00491     log_debug(<span class="stringliteral">"pending_bundles size %zu"</span>, bd-&gt;pending_bundles()-&gt;size());
<a name="l00492"></a>00492     <span class="keyword">const</span> BundleList *bundles = bd-&gt;pending_bundles();
<a name="l00493"></a>00493     <a class="code" href="classdtn_1_1BundleList.html#1d52b8d6bb7d8a07e5d4f5fc4b5b61d2" title="Type for an iterator, which just wraps an stl iterator.">BundleList::iterator</a> i = bundles-&gt;begin();
<a name="l00494"></a>00494     <a class="code" href="classdtn_1_1BundleList.html#1d52b8d6bb7d8a07e5d4f5fc4b5b61d2" title="Type for an iterator, which just wraps an stl iterator.">BundleList::iterator</a> end = bundles-&gt;end();
<a name="l00495"></a>00495 
<a name="l00496"></a>00496     bundle_report report;
<a name="l00497"></a>00497     bundle_report::bundle::container c;
<a name="l00498"></a>00498 
<a name="l00499"></a>00499     <span class="keywordflow">for</span>(; i != end; ++i)
<a name="l00500"></a>00500         c.push_back(bundle_report::bundle::type(*i));
<a name="l00501"></a>00501 
<a name="l00502"></a>00502     report.bundle(c);
<a name="l00503"></a>00503     SEND(bundle_report, report)
<a name="l00504"></a>00504 }
<a name="l00505"></a>00505 
<a name="l00506"></a>00506 <span class="keywordtype">void</span>
<a name="l00507"></a>00507 ExternalRouter::handle_bundle_attributes_report(BundleAttributesReportEvent *event)
<a name="l00508"></a>00508 {
<a name="l00509"></a>00509     <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = <span class="keyword">event</span>-&gt;bundle_;
<a name="l00510"></a>00510 
<a name="l00511"></a>00511     bundleAttributesReportType response;
<a name="l00512"></a>00512 
<a name="l00513"></a>00513     AttributeNameVector::iterator i = <span class="keyword">event</span>-&gt;attribute_names_.begin();
<a name="l00514"></a>00514     AttributeNameVector::iterator end = <span class="keyword">event</span>-&gt;attribute_names_.end();
<a name="l00515"></a>00515 
<a name="l00516"></a>00516     <span class="keywordflow">for</span> (; i != end; ++i) {
<a name="l00517"></a>00517         <span class="keyword">const</span> std::string&amp; name = i-&gt;name();
<a name="l00518"></a>00518 
<a name="l00519"></a>00519         <span class="keywordflow">if</span> (name == <span class="stringliteral">"bundleid"</span>)
<a name="l00520"></a>00520             response.bundleid( br-&gt;bundleid() );
<a name="l00521"></a>00521         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"is_admin"</span>)
<a name="l00522"></a>00522             response.is_admin( br-&gt;is_admin() );
<a name="l00523"></a>00523         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"do_not_fragment"</span>)
<a name="l00524"></a>00524             response.do_not_fragment( br-&gt;do_not_fragment() );
<a name="l00525"></a>00525         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"priority"</span>)
<a name="l00526"></a>00526             response.priority(
<a name="l00527"></a>00527                 bundlePriorityType(lowercase(br-&gt;prioritytoa(br-&gt;priority()))) );
<a name="l00528"></a>00528         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"custody_requested"</span>)
<a name="l00529"></a>00529             response.custody_requested( br-&gt;custody_requested() );
<a name="l00530"></a>00530         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"local_custody"</span>)
<a name="l00531"></a>00531             response.local_custody( br-&gt;local_custody() );
<a name="l00532"></a>00532         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"singleton_dest"</span>)
<a name="l00533"></a>00533             response.singleton_dest( br-&gt;singleton_dest() );
<a name="l00534"></a>00534         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"custody_rcpt"</span>)
<a name="l00535"></a>00535             response.custody_rcpt( br-&gt;custody_rcpt() );
<a name="l00536"></a>00536         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"receive_rcpt"</span>)
<a name="l00537"></a>00537             response.receive_rcpt( br-&gt;receive_rcpt() );
<a name="l00538"></a>00538         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"forward_rcpt"</span>)
<a name="l00539"></a>00539             response.forward_rcpt( br-&gt;forward_rcpt() );
<a name="l00540"></a>00540         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"delivery_rcpt"</span>)
<a name="l00541"></a>00541             response.delivery_rcpt( br-&gt;delivery_rcpt() );
<a name="l00542"></a>00542         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"deletion_rcpt"</span>)
<a name="l00543"></a>00543             response.deletion_rcpt( br-&gt;deletion_rcpt() );
<a name="l00544"></a>00544         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"app_acked_rcpt"</span>)
<a name="l00545"></a>00545             response.app_acked_rcpt( br-&gt;app_acked_rcpt() );
<a name="l00546"></a>00546         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"expiration"</span>)
<a name="l00547"></a>00547             response.expiration( br-&gt;expiration() );
<a name="l00548"></a>00548         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"orig_length"</span>)
<a name="l00549"></a>00549             response.orig_length( br-&gt;orig_length() );
<a name="l00550"></a>00550         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"owner"</span>)
<a name="l00551"></a>00551             response.owner( br-&gt;owner() );
<a name="l00552"></a>00552         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"location"</span>)
<a name="l00553"></a>00553             response.location(
<a name="l00554"></a>00554                 bundleLocationType(
<a name="l00555"></a>00555                     bundleType::location_to_str(br-&gt;payload().location())) );
<a name="l00556"></a>00556         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"dest"</span>)
<a name="l00557"></a>00557             response.dest( br-&gt;dest() );
<a name="l00558"></a>00558         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"custodian"</span>)
<a name="l00559"></a>00559             response.custodian( br-&gt;custodian() );
<a name="l00560"></a>00560         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"replyto"</span>)
<a name="l00561"></a>00561             response.replyto( br-&gt;replyto() );
<a name="l00562"></a>00562         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"prevhop"</span>)
<a name="l00563"></a>00563             response.prevhop( br-&gt;prevhop() );
<a name="l00564"></a>00564         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == <span class="stringliteral">"payload_file"</span>) {
<a name="l00565"></a>00565             response.payload_file( br-&gt;payload().filename() );
<a name="l00566"></a>00566         }
<a name="l00567"></a>00567     }
<a name="l00568"></a>00568 
<a name="l00569"></a>00569     <span class="keywordflow">if</span> (event-&gt;metadata_blocks_.size() &gt; 0) {
<a name="l00570"></a>00570 
<a name="l00571"></a>00571         <span class="comment">// We don't want to send duplicate blocks, so keep track of which</span>
<a name="l00572"></a>00572         <span class="comment">// blocks have been added to the outgoing list with this.</span>
<a name="l00573"></a>00573         std::vector&lt;unsigned int&gt; added_blocks;
<a name="l00574"></a>00574 
<a name="l00575"></a>00575         <span class="comment">// Iterate through the requests.</span>
<a name="l00576"></a>00576         MetaBlockRequestVector::iterator requested;
<a name="l00577"></a>00577         <span class="keywordflow">for</span> (requested = event-&gt;metadata_blocks_.begin(); 
<a name="l00578"></a>00578              requested != <span class="keyword">event</span>-&gt;metadata_blocks_.end();
<a name="l00579"></a>00579              ++requested) {
<a name="l00580"></a>00580 
<a name="l00581"></a>00581             <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; 2; ++i) {
<a name="l00582"></a>00582                 MetadataVec * block_vec = NULL;
<a name="l00583"></a>00583                 <span class="keywordflow">if</span> (i == 0) {
<a name="l00584"></a>00584                     block_vec = br-&gt;mutable_recv_metadata();
<a name="l00585"></a>00585                     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(block_vec != NULL);
<a name="l00586"></a>00586                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (i == 1) {
<a name="l00587"></a>00587                     <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> null_link(<span class="stringliteral">"ExternalRouter::"</span>
<a name="l00588"></a>00588                                       <span class="stringliteral">"handle_bundle_attributes_report"</span>);
<a name="l00589"></a>00589                     block_vec = br-&gt;generated_metadata().find_blocks(null_link);
<a name="l00590"></a>00590                     <span class="keywordflow">if</span> (block_vec == NULL) {
<a name="l00591"></a>00591                         <span class="keywordflow">continue</span>;
<a name="l00592"></a>00592                     }
<a name="l00593"></a>00593                 } <span class="keywordflow">else</span> {
<a name="l00594"></a>00594                     <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(block_vec != NULL);
<a name="l00595"></a>00595                 }
<a name="l00596"></a>00596 
<a name="l00597"></a>00597                 MetadataVec::iterator block_i;
<a name="l00598"></a>00598                 <span class="keywordflow">for</span> (block_i  = block_vec-&gt;begin();
<a name="l00599"></a>00599                      block_i != block_vec-&gt;end();
<a name="l00600"></a>00600                      ++block_i) {
<a name="l00601"></a>00601 
<a name="l00602"></a>00602                     <a class="code" href="namespacedtn.html#f29401130d6ec45e1688792a57f80f9c" title="Typedef for a reference to a MetadataBlock.">MetadataBlockRef</a> block = *block_i;
<a name="l00603"></a>00603 
<a name="l00604"></a>00604                     <span class="comment">// Skip this block if we already added it.</span>
<a name="l00605"></a>00605                     <span class="keywordtype">bool</span> added = <span class="keyword">false</span>;
<a name="l00606"></a>00606                     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; added_blocks.size(); ++i) {
<a name="l00607"></a>00607                         <span class="keywordflow">if</span> (added_blocks[i] == block-&gt;id()) {
<a name="l00608"></a>00608                             added = <span class="keyword">true</span>;
<a name="l00609"></a>00609                             <span class="keywordflow">break</span>;
<a name="l00610"></a>00610                         }
<a name="l00611"></a>00611                     }
<a name="l00612"></a>00612                     <span class="keywordflow">if</span> (added) {
<a name="l00613"></a>00613                         <span class="keywordflow">continue</span>;
<a name="l00614"></a>00614                     }
<a name="l00615"></a>00615 
<a name="l00616"></a>00616                     <span class="keywordflow">switch</span> (requested-&gt;query_type()) {
<a name="l00617"></a>00617                     <span class="comment">// Match the block's identifier (index).</span>
<a name="l00618"></a>00618                     <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52a6701bc44556c817ee499ee686be5b82e">MetadataBlockRequest::QueryByIdentifier</a>:
<a name="l00619"></a>00619                         <span class="keywordflow">if</span> (requested-&gt;query_value() != block-&gt;id())
<a name="l00620"></a>00620                             <span class="keywordflow">continue</span>;
<a name="l00621"></a>00621                         <span class="keywordflow">break</span>;
<a name="l00622"></a>00622 
<a name="l00623"></a>00623                     <span class="comment">// Match the block's type.</span>
<a name="l00624"></a>00624                     <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52aa4f72c48f5571f4f27c45fc0010ab762">MetadataBlockRequest::QueryByType</a>:
<a name="l00625"></a>00625                         <span class="keywordflow">if</span> (block-&gt;ontology() != requested-&gt;query_value())
<a name="l00626"></a>00626                             <span class="keywordflow">continue</span>;
<a name="l00627"></a>00627                         <span class="keywordflow">break</span>;
<a name="l00628"></a>00628 
<a name="l00629"></a>00629                     <span class="comment">// All blocks were requested.</span>
<a name="l00630"></a>00630                     <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52a95b4d6f58003db4d200c22defbc2c760">MetadataBlockRequest::QueryAll</a>:
<a name="l00631"></a>00631                         <span class="keywordflow">break</span>;
<a name="l00632"></a>00632                     }
<a name="l00633"></a>00633 
<a name="l00634"></a>00634                     <span class="comment">// Note that we have added this block.</span>
<a name="l00635"></a>00635                     added_blocks.push_back(block-&gt;id());
<a name="l00636"></a>00636 
<a name="l00637"></a>00637                     <span class="comment">// Add the block to the list.</span>
<a name="l00638"></a>00638                     response.meta_blocks().push_back(
<a name="l00639"></a>00639                         rtrmessage::metadataBlockType(
<a name="l00640"></a>00640                             block-&gt;id(), <span class="keyword">false</span>, block-&gt;ontology(),
<a name="l00641"></a>00641                             xml_schema::base64_binary(
<a name="l00642"></a>00642                                     block-&gt;metadata(),
<a name="l00643"></a>00643                                     block-&gt;metadata_len())));
<a name="l00644"></a>00644                 }
<a name="l00645"></a>00645             }
<a name="l00646"></a>00646         }
<a name="l00647"></a>00647     }
<a name="l00648"></a>00648 
<a name="l00649"></a>00649     bundle_attributes_report e(event-&gt;query_id_, response);
<a name="l00650"></a>00650     SEND(bundle_attributes_report, e)
<a name="l00651"></a>00651 }
<a name="l00652"></a>00652 
<a name="l00653"></a>00653 <span class="keywordtype">void</span>
<a name="l00654"></a>00654 ExternalRouter::handle_route_report(RouteReportEvent* event)
<a name="l00655"></a>00655 {
<a name="l00656"></a>00656     oasys::ScopeLock l(route_table_-&gt;lock(),
<a name="l00657"></a>00657         <span class="stringliteral">"ExternalRouter::handle_event"</span>);
<a name="l00658"></a>00658 
<a name="l00659"></a>00659     (void) event;
<a name="l00660"></a>00660 
<a name="l00661"></a>00661     <span class="keyword">const</span> RouteEntryVec *re = route_table_-&gt;route_table();
<a name="l00662"></a>00662     RouteEntryVec::const_iterator i = re-&gt;begin();
<a name="l00663"></a>00663     RouteEntryVec::const_iterator end = re-&gt;end();
<a name="l00664"></a>00664 
<a name="l00665"></a>00665     route_report report;
<a name="l00666"></a>00666     route_report::route_entry::container c;
<a name="l00667"></a>00667 
<a name="l00668"></a>00668     <span class="keywordflow">for</span>(; i != end; ++i)
<a name="l00669"></a>00669         c.push_back(route_report::route_entry::type(*i));
<a name="l00670"></a>00670 
<a name="l00671"></a>00671     report.route_entry(c);
<a name="l00672"></a>00672     SEND(route_report, report)
<a name="l00673"></a>00673 }
<a name="l00674"></a>00674 
<a name="l00675"></a>00675 <span class="keywordtype">void</span>
<a name="l00676"></a>00676 ExternalRouter::send(bpa &amp;message)
<a name="l00677"></a>00677 {
<a name="l00678"></a>00678     xercesc::MemBufFormatTarget buf;
<a name="l00679"></a>00679     xml_schema::namespace_infomap map;
<a name="l00680"></a>00680 
<a name="l00681"></a>00681     message.eid(BundleDaemon::instance()-&gt;local_eid().c_str());
<a name="l00682"></a>00682 
<a name="l00683"></a>00683     <span class="keywordflow">if</span> (ExternalRouter::client_validation)
<a name="l00684"></a>00684         map[<span class="stringliteral">""</span>].schema = ExternalRouter::schema.c_str();
<a name="l00685"></a>00685 
<a name="l00686"></a>00686     <span class="keywordflow">try</span> {
<a name="l00687"></a>00687         bpa_(buf, message, map, <span class="stringliteral">"UTF-8"</span>,
<a name="l00688"></a>00688              xml_schema::flags::dont_initialize);
<a name="l00689"></a>00689         srv_-&gt;eventq-&gt;push_back(<span class="keyword">new</span> std::string((<span class="keywordtype">char</span> *)buf.getRawBuffer()));
<a name="l00690"></a>00690     }
<a name="l00691"></a>00691     <span class="keywordflow">catch</span> (xml_schema::serialization &amp;e) {
<a name="l00692"></a>00692         <span class="keyword">const</span> xml_schema::errors &amp;elist = e.errors();
<a name="l00693"></a>00693         xml_schema::errors::const_iterator i = elist.begin();
<a name="l00694"></a>00694         xml_schema::errors::const_iterator end = elist.end();
<a name="l00695"></a>00695 
<a name="l00696"></a>00696         <span class="keywordflow">for</span> (; i &lt; end; ++i) {
<a name="l00697"></a>00697             std::cout &lt;&lt; (*i).message() &lt;&lt; std::endl;
<a name="l00698"></a>00698         }
<a name="l00699"></a>00699     }
<a name="l00700"></a>00700     CATCH(xml_schema::unexpected_element)
<a name="l00701"></a>00701     CATCH(xml_schema::no_namespace_mapping)
<a name="l00702"></a>00702     CATCH(xml_schema::no_prefix_mapping)
<a name="l00703"></a>00703     CATCH(xml_schema::xsi_already_in_use)
<a name="l00704"></a>00704 }
<a name="l00705"></a>00705 
<a name="l00706"></a>00706 const <span class="keywordtype">char</span> *
<a name="l00707"></a>00707 ExternalRouter::reason_to_str(<span class="keywordtype">int</span> reason)
<a name="l00708"></a>00708 {
<a name="l00709"></a>00709     <span class="keywordflow">switch</span>(reason) {
<a name="l00710"></a>00710         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7745e7897b68d73fa05257424c8746ded" title="No additional info.">ContactEvent::NO_INFO</a>:     <span class="keywordflow">return</span> <span class="stringliteral">"no_info"</span>;
<a name="l00711"></a>00711         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f72e449a76cefd484940a3f3bfc07d188e" title="User action (i.e. console / config).">ContactEvent::USER</a>:        <span class="keywordflow">return</span> <span class="stringliteral">"user"</span>;
<a name="l00712"></a>00712         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f72e018ae4b4ab30873b97e51e26e2baf2" title="Clean connection shutdown.">ContactEvent::SHUTDOWN</a>:    <span class="keywordflow">return</span> <span class="stringliteral">"shutdown"</span>;
<a name="l00713"></a>00713         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7f0c1475c056a0f72e11b5ba8466a27f7" title="Unexpected session interruption.">ContactEvent::BROKEN</a>:      <span class="keywordflow">return</span> <span class="stringliteral">"broken"</span>;
<a name="l00714"></a>00714         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f793b4b30e007a04676c706a0b749ef033" title="Convergence layer protocol error.">ContactEvent::CL_ERROR</a>:    <span class="keywordflow">return</span> <span class="stringliteral">"cl_error"</span>;
<a name="l00715"></a>00715         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f704fb70b2e32b5f6f3e3707dc12958787" title="Convergence layer version mismatch.">ContactEvent::CL_VERSION</a>:  <span class="keywordflow">return</span> <span class="stringliteral">"cl_version"</span>;
<a name="l00716"></a>00716         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7fe3939848fd2dc31d31aec1c8c1f3c2a" title="Re-establish link after failure.">ContactEvent::RECONNECT</a>:   <span class="keywordflow">return</span> <span class="stringliteral">"reconnect"</span>;
<a name="l00717"></a>00717         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7cc4b8963a82f22c0d9b61c37e06e877e" title="Idle connection shut down by the CL.">ContactEvent::IDLE</a>:        <span class="keywordflow">return</span> <span class="stringliteral">"idle"</span>;
<a name="l00718"></a>00718         <span class="keywordflow">case</span> <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7eb788e67896aff756d499766183ff6d8" title="Scheduled link ended duration.">ContactEvent::TIMEOUT</a>:     <span class="keywordflow">return</span> <span class="stringliteral">"timeout"</span>;
<a name="l00719"></a>00719         <span class="keywordflow">default</span>: <span class="keywordflow">return</span> <span class="stringliteral">""</span>;
<a name="l00720"></a>00720     }
<a name="l00721"></a>00721 }
<a name="l00722"></a>00722 
<a name="l00723"></a>00723 ExternalRouter::ModuleServer::ModuleServer()
<a name="l00724"></a>00724     : IOHandlerBase(new oasys::Notifier(<span class="stringliteral">"/router/external/moduleserver"</span>)),
<a name="l00725"></a>00725       Thread(<span class="stringliteral">"/router/external/moduleserver"</span>),
<a name="l00726"></a>00726       parser_(new oasys::XercesXMLUnmarshal(
<a name="l00727"></a>00727                   ExternalRouter::server_validation,
<a name="l00728"></a>00728                   ExternalRouter::schema.c_str())),
<a name="l00729"></a>00729       lock_(new oasys::SpinLock())
<a name="l00730"></a>00730 {
<a name="l00731"></a>00731     set_logpath(<span class="stringliteral">"/router/external/moduleserver"</span>);
<a name="l00732"></a>00732 
<a name="l00733"></a>00733     <span class="comment">// router interface and external routers must be able to bind</span>
<a name="l00734"></a>00734     <span class="comment">// to the same port</span>
<a name="l00735"></a>00735     <span class="keywordflow">if</span> (<a class="code" href="dtnperf-client_8c.html#6f8059414f0228f0256115e024eeed4b">fd</a>() == -1) {
<a name="l00736"></a>00736         init_socket();
<a name="l00737"></a>00737     }
<a name="l00738"></a>00738     <span class="keyword">const</span> <span class="keywordtype">int</span> on = 1;
<a name="l00739"></a>00739     <span class="keywordflow">if</span> (setsockopt(<a class="code" href="dtnperf-client_8c.html#6f8059414f0228f0256115e024eeed4b">fd</a>(), SOL_SOCKET, SO_REUSEADDR, &amp;on, <span class="keyword">sizeof</span>(on)) &lt; 0)
<a name="l00740"></a>00740         log_err(<span class="stringliteral">"ExternalRouter::ModuleServer::ModuleServer():  "</span>
<a name="l00741"></a>00741                 <span class="stringliteral">"Failed to set SO_REUSEADDR:  %s"</span>, strerror(errno));
<a name="l00742"></a>00742     bind(htonl(INADDR_ALLRTRS_GROUP), ExternalRouter::server_port);
<a name="l00743"></a>00743 
<a name="l00744"></a>00744     <span class="comment">// join the "all routers" multicast group</span>
<a name="l00745"></a>00745     ip_mreq mreq;
<a name="l00746"></a>00746     mreq.imr_multiaddr.s_addr = htonl(INADDR_ALLRTRS_GROUP);
<a name="l00747"></a>00747     mreq.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
<a name="l00748"></a>00748     <span class="keywordflow">if</span> (setsockopt(<a class="code" href="dtnperf-client_8c.html#6f8059414f0228f0256115e024eeed4b">fd</a>(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
<a name="l00749"></a>00749                    &amp;mreq, <span class="keyword">sizeof</span>(mreq)) &lt; 0)
<a name="l00750"></a>00750         log_err(<span class="stringliteral">"ExternalRouter::ModuleServer::ModuleServer():  "</span>
<a name="l00751"></a>00751                 <span class="stringliteral">"Failed to join multicast group:  %s"</span>, strerror(errno));
<a name="l00752"></a>00752 
<a name="l00753"></a>00753     <span class="comment">// source messages from the loopback interface</span>
<a name="l00754"></a>00754     in_addr src_if;
<a name="l00755"></a>00755     src_if.s_addr = htonl(INADDR_LOOPBACK);
<a name="l00756"></a>00756     <span class="keywordflow">if</span> (setsockopt(<a class="code" href="dtnperf-client_8c.html#6f8059414f0228f0256115e024eeed4b">fd</a>(), IPPROTO_IP, IP_MULTICAST_IF,
<a name="l00757"></a>00757                    &amp;src_if, <span class="keyword">sizeof</span>(src_if)) &lt; 0)
<a name="l00758"></a>00758         log_err(<span class="stringliteral">"ExternalRouter::ModuleServer::ModuleServer():  "</span>
<a name="l00759"></a>00759                 <span class="stringliteral">"Failed to set IP_MULTICAST_IF:  %s"</span>, strerror(errno));
<a name="l00760"></a>00760 
<a name="l00761"></a>00761     <span class="comment">// we always delete the thread object when we exit</span>
<a name="l00762"></a>00762     Thread::set_flag(Thread::DELETE_ON_EXIT);
<a name="l00763"></a>00763 
<a name="l00764"></a>00764     set_logfd(<span class="keyword">false</span>);
<a name="l00765"></a>00765 
<a name="l00766"></a>00766     eventq = <span class="keyword">new</span> oasys::MsgQueue&lt; std::string * &gt;(logpath_, lock_);
<a name="l00767"></a>00767 }
<a name="l00768"></a>00768 
<a name="l00769"></a>00769 ExternalRouter::ModuleServer::~ModuleServer()
<a name="l00770"></a>00770 {
<a name="l00771"></a>00771     <span class="comment">// free all pending events</span>
<a name="l00772"></a>00772     std::string *event;
<a name="l00773"></a>00773     <span class="keywordflow">while</span> (eventq-&gt;try_pop(&amp;event))
<a name="l00774"></a>00774         <span class="keyword">delete</span> event;
<a name="l00775"></a>00775 
<a name="l00776"></a>00776     <span class="keyword">delete</span> eventq;
<a name="l00777"></a>00777 }
<a name="l00778"></a>00778 
<a name="l00779"></a>00779 <span class="comment">// ModuleServer main loop</span>
<a name="l00780"></a>00780 <span class="keywordtype">void</span>
<a name="l00781"></a>00781 ExternalRouter::ModuleServer::run() 
<a name="l00782"></a>00782 {
<a name="l00783"></a>00783     <span class="comment">// block on input from the socket and</span>
<a name="l00784"></a>00784     <span class="comment">// on input from the bundle event list</span>
<a name="l00785"></a>00785     <span class="keyword">struct </span>pollfd pollfds[2];
<a name="l00786"></a>00786 
<a name="l00787"></a>00787     <span class="keyword">struct </span>pollfd* event_poll = &amp;pollfds[0];
<a name="l00788"></a>00788     event_poll-&gt;fd = eventq-&gt;read_fd();
<a name="l00789"></a>00789     event_poll-&gt;events = POLLIN;
<a name="l00790"></a>00790     event_poll-&gt;revents = 0;
<a name="l00791"></a>00791 
<a name="l00792"></a>00792     <span class="keyword">struct </span>pollfd* sock_poll = &amp;pollfds[1];
<a name="l00793"></a>00793     sock_poll-&gt;fd = <a class="code" href="dtnperf-client_8c.html#6f8059414f0228f0256115e024eeed4b">fd</a>();
<a name="l00794"></a>00794     sock_poll-&gt;events = POLLIN;
<a name="l00795"></a>00795     sock_poll-&gt;revents = 0;
<a name="l00796"></a>00796 
<a name="l00797"></a>00797     <span class="keywordflow">while</span> (1) {
<a name="l00798"></a>00798         <span class="keywordflow">if</span> (should_stop()) <span class="keywordflow">return</span>;
<a name="l00799"></a>00799 
<a name="l00800"></a>00800         <span class="comment">// block waiting...</span>
<a name="l00801"></a>00801         <span class="keywordtype">int</span> ret = oasys::IO::poll_multiple(pollfds, 2, -1,
<a name="l00802"></a>00802             get_notifier());
<a name="l00803"></a>00803 
<a name="l00804"></a>00804         <span class="keywordflow">if</span> (ret == oasys::IOINTR) {
<a name="l00805"></a>00805             log_debug(<span class="stringliteral">"module server interrupted"</span>);
<a name="l00806"></a>00806             set_should_stop();
<a name="l00807"></a>00807             <span class="keywordflow">continue</span>;
<a name="l00808"></a>00808         }
<a name="l00809"></a>00809 
<a name="l00810"></a>00810         <span class="keywordflow">if</span> (ret == oasys::IOERROR) {
<a name="l00811"></a>00811             log_debug(<span class="stringliteral">"module server error"</span>);
<a name="l00812"></a>00812             set_should_stop();
<a name="l00813"></a>00813             <span class="keywordflow">continue</span>;
<a name="l00814"></a>00814         }
<a name="l00815"></a>00815 
<a name="l00816"></a>00816         <span class="comment">// check for an event</span>
<a name="l00817"></a>00817         <span class="keywordflow">if</span> (event_poll-&gt;revents &amp; POLLIN) {
<a name="l00818"></a>00818             std::string *event;
<a name="l00819"></a>00819             <span class="keywordflow">if</span> (eventq-&gt;try_pop(&amp;event)) {
<a name="l00820"></a>00820                 <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(event != NULL)
<a name="l00821"></a>00821                 sendto(const_cast&lt; <span class="keywordtype">char</span> * &gt;(event-&gt;c_str()),
<a name="l00822"></a>00822                     event-&gt;size(), 0,
<a name="l00823"></a>00823                     htonl(INADDR_ALLRTRS_GROUP),
<a name="l00824"></a>00824                     ExternalRouter::server_port);
<a name="l00825"></a>00825                 delete event;
<a name="l00826"></a>00826             }
<a name="l00827"></a>00827         }
<a name="l00828"></a>00828 
<a name="l00829"></a>00829         if (sock_poll-&gt;revents &amp; POLLIN) {
<a name="l00830"></a>00830             <span class="keywordtype">char</span> buf[MAX_UDP_PACKET];
<a name="l00831"></a>00831             in_addr_t raddr;
<a name="l00832"></a>00832             u_int16_t rport;
<a name="l00833"></a>00833             <span class="keywordtype">int</span> bytes;
<a name="l00834"></a>00834 
<a name="l00835"></a>00835             bytes = recvfrom(buf, MAX_UDP_PACKET, 0, &amp;raddr, &amp;rport);
<a name="l00836"></a>00836             buf[bytes] = <span class="charliteral">'\0'</span>;
<a name="l00837"></a>00837 
<a name="l00838"></a>00838             process_action(buf);
<a name="l00839"></a>00839         }
<a name="l00840"></a>00840     }
<a name="l00841"></a>00841 }
<a name="l00842"></a>00842 
<a name="l00843"></a>00843 <span class="comment">// Handle a message from an external router</span>
<a name="l00844"></a>00844 <span class="keywordtype">void</span>
<a name="l00845"></a>00845 ExternalRouter::ModuleServer::process_action(<span class="keyword">const</span> <span class="keywordtype">char</span> *payload)
<a name="l00846"></a>00846 {
<a name="l00847"></a>00847     <span class="comment">// clear any error condition before next parse</span>
<a name="l00848"></a>00848     parser_-&gt;reset_error();
<a name="l00849"></a>00849     
<a name="l00850"></a>00850     <span class="comment">// parse the xml payload received</span>
<a name="l00851"></a>00851     <span class="keyword">const</span> xercesc::DOMDocument *doc = parser_-&gt;doc(payload);
<a name="l00852"></a>00852     
<a name="l00853"></a>00853     <span class="comment">// was the message valid?</span>
<a name="l00854"></a>00854     <span class="keywordflow">if</span> (parser_-&gt;error()) {
<a name="l00855"></a>00855         log_debug(<span class="stringliteral">"received invalid message"</span>);
<a name="l00856"></a>00856         <span class="keywordflow">return</span>;
<a name="l00857"></a>00857     }
<a name="l00858"></a>00858 
<a name="l00859"></a>00859     std::auto_ptr&lt;bpa&gt; instance;
<a name="l00860"></a>00860 
<a name="l00861"></a>00861     <span class="keywordflow">try</span> {
<a name="l00862"></a>00862         instance = bpa_(*doc);
<a name="l00863"></a>00863     }
<a name="l00864"></a>00864     CATCH(xml_schema::expected_element)
<a name="l00865"></a>00865     CATCH(xml_schema::unexpected_element)
<a name="l00866"></a>00866     CATCH(xml_schema::expected_attribute)
<a name="l00867"></a>00867     CATCH(xml_schema::unexpected_enumerator)
<a name="l00868"></a>00868     CATCH(xml_schema::no_type_info)
<a name="l00869"></a>00869     CATCH(xml_schema::not_derived)
<a name="l00870"></a>00870 
<a name="l00871"></a>00871     <span class="comment">// Check that we have an instance object to work with</span>
<a name="l00872"></a>00872     if (instance.get() == 0)
<a name="l00873"></a>00873         return;
<a name="l00874"></a>00874 
<a name="l00875"></a>00875     <span class="comment">// @@@ Need to add:</span>
<a name="l00876"></a>00876     <span class="comment">//      broadcast_send_bundle_request</span>
<a name="l00877"></a>00877 
<a name="l00878"></a>00878     <span class="comment">// Examine message contents</span>
<a name="l00879"></a>00879     if (instance-&gt;send_bundle_request().present()) {
<a name="l00880"></a>00880         log_debug(<span class="stringliteral">"posting BundleSendRequest"</span>);
<a name="l00881"></a>00881         send_bundle_request&amp; in_request = instance-&gt;send_bundle_request().get();
<a name="l00882"></a>00882 
<a name="l00883"></a>00883         gbofIdType <span class="keywordtype">id</span> = in_request.gbof_id();
<a name="l00884"></a>00884         BundleTimestamp local_id;
<a name="l00885"></a>00885         local_id.seconds_ = in_request.local_id() &gt;&gt; 32;
<a name="l00886"></a>00886         local_id.seqno_ = in_request.local_id() &amp; 0xffffffff;
<a name="l00887"></a>00887         std::string link = in_request.link_id();
<a name="l00888"></a>00888         <span class="keywordtype">int</span> action = convert_fwd_action(in_request.fwd_action());
<a name="l00889"></a>00889 
<a name="l00890"></a>00890         GbofId gbof_id;
<a name="l00891"></a>00891         gbof_id.source_ = EndpointID( <span class="keywordtype">id</span>.source().uri() );
<a name="l00892"></a>00892         gbof_id.creation_ts_.seconds_ = <span class="keywordtype">id</span>.creation_ts() &gt;&gt; 32;
<a name="l00893"></a>00893         gbof_id.creation_ts_.seqno_ = <span class="keywordtype">id</span>.creation_ts() &amp; 0xffffffff;
<a name="l00894"></a>00894         gbof_id.is_fragment_ = <span class="keywordtype">id</span>.is_fragment();
<a name="l00895"></a>00895         gbof_id.frag_length_ = <span class="keywordtype">id</span>.frag_length();
<a name="l00896"></a>00896         gbof_id.frag_offset_ = <span class="keywordtype">id</span>.frag_offset();
<a name="l00897"></a>00897 
<a name="l00898"></a>00898         BundleDaemon *bd = BundleDaemon::instance();
<a name="l00899"></a>00899         log_debug(<span class="stringliteral">"pending_bundles size %zu"</span>, bd-&gt;pending_bundles()-&gt;size());
<a name="l00900"></a>00900         <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = bd-&gt;pending_bundles()-&gt;find(gbof_id, local_id);
<a name="l00901"></a>00901         <span class="keywordflow">if</span> (br.object()) {
<a name="l00902"></a>00902             BundleSendRequest *request = <span class="keyword">new</span> BundleSendRequest(br, link, action);
<a name="l00903"></a>00903     
<a name="l00904"></a>00904             <span class="comment">// @@@ need to handle optional params frag_size, frag_offset</span>
<a name="l00905"></a>00905             
<a name="l00906"></a>00906             <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link_ref = bd-&gt;contactmgr()-&gt;find_link(link.c_str());
<a name="l00907"></a>00907             <span class="keywordflow">if</span> (link_ref == NULL) {
<a name="l00908"></a>00908                 <span class="keywordflow">if</span> (in_request.metadata_block().size() &gt; 0) {
<a name="l00909"></a>00909                     log_err(<span class="stringliteral">"link %s does not exist; failed to "</span>
<a name="l00910"></a>00910                             <span class="stringliteral">"modify/generate metadata for send bundle request"</span>,
<a name="l00911"></a>00911                             link.c_str());
<a name="l00912"></a>00912                 }
<a name="l00913"></a>00913     
<a name="l00914"></a>00914             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (in_request.metadata_block().size() &gt; 0) {
<a name="l00915"></a>00915     
<a name="l00916"></a>00916                 typedef ::xsd::cxx::tree::sequence&lt;rtrmessage::metadataBlockType&gt;
<a name="l00917"></a>00917                         MetaBlockSequence;
<a name="l00918"></a>00918                 
<a name="l00919"></a>00919                 MetadataBlockProcessor* meta_processor = 
<a name="l00920"></a>00920                         <span class="keyword">dynamic_cast&lt;</span>MetadataBlockProcessor*<span class="keyword">&gt;</span>(
<a name="l00921"></a>00921                             <a class="code" href="classdtn_1_1BundleProtocol.html#9baff2ff7f808753a44b05f90a366c61" title="Find the appropriate BlockProcessor for the given block type code.">BundleProtocol::find_processor</a>(
<a name="l00922"></a>00922                             <a class="code" href="classdtn_1_1BundleProtocol.html#54a44c247b3c20b4ed11e29494284ca7f69759524468f2b1c3f7f1c2f6619f39" title="NOT IN SPEC YET.">BundleProtocol::METADATA_BLOCK</a>));
<a name="l00923"></a>00923                 <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(meta_processor != NULL);
<a name="l00924"></a>00924                 
<a name="l00925"></a>00925                 oasys::ScopeLock bundle_lock(br-&gt;lock(), <span class="stringliteral">"ExternalRouter"</span>);
<a name="l00926"></a>00926                 
<a name="l00927"></a>00927                 MetaBlockSequence::const_iterator block_i;
<a name="l00928"></a>00928                 <span class="keywordflow">for</span> (block_i = in_request.metadata_block().begin();
<a name="l00929"></a>00929                      block_i != in_request.metadata_block().end();
<a name="l00930"></a>00930                      ++block_i) {
<a name="l00931"></a>00931     
<a name="l00932"></a>00932                     <span class="keywordflow">if</span> (!block_i-&gt;generated()) {
<a name="l00933"></a>00933     
<a name="l00934"></a>00934                         <a class="code" href="namespacedtn.html#f29401130d6ec45e1688792a57f80f9c" title="Typedef for a reference to a MetadataBlock.">MetadataBlockRef</a> existing(<span class="stringliteral">"ExternalRouter metadata block search"</span>);
<a name="l00935"></a>00935                         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0;
<a name="l00936"></a>00936                              i &lt; br-&gt;recv_metadata().size(); ++i) {
<a name="l00937"></a>00937                             <span class="keywordflow">if</span> (br-&gt;recv_metadata()[i]-&gt;id() ==
<a name="l00938"></a>00938                                 block_i-&gt;identifier()) {
<a name="l00939"></a>00939                                 existing = br-&gt;recv_metadata()[i];
<a name="l00940"></a>00940                                 <span class="keywordflow">break</span>;
<a name="l00941"></a>00941                             }
<a name="l00942"></a>00942                         }
<a name="l00943"></a>00943     
<a name="l00944"></a>00944                         <span class="keywordflow">if</span> (existing != NULL) {
<a name="l00945"></a>00945                             <span class="comment">// Lock the block so nobody tries to read it while</span>
<a name="l00946"></a>00946                             <span class="comment">// we are changing it.</span>
<a name="l00947"></a>00947                             oasys::ScopeLock metadata_lock(existing-&gt;lock(),
<a name="l00948"></a>00948                                                            <span class="stringliteral">"ExternalRouter"</span>);
<a name="l00949"></a>00949                         
<a name="l00950"></a>00950                             <span class="comment">// If the new block size is zero, it is being removed</span>
<a name="l00951"></a>00951                             <span class="comment">// for this particular link.</span>
<a name="l00952"></a>00952                             <span class="keywordflow">if</span> (block_i-&gt;contents().size() == 0) {
<a name="l00953"></a>00953                                 existing-&gt;remove_outgoing_metadata(link_ref);                        
<a name="l00954"></a>00954                                 log_info(<span class="stringliteral">"Removing metadata block %u from bundle "</span>
<a name="l00955"></a>00955                                          <span class="stringliteral">"%u on link %s"</span>, block_i-&gt;identifier(),
<a name="l00956"></a>00956                                          br-&gt;bundleid(), link.c_str());
<a name="l00957"></a>00957                             }
<a name="l00958"></a>00958                         
<a name="l00959"></a>00959                             <span class="comment">// Otherwise, if the new block size is non-zero, it</span>
<a name="l00960"></a>00960                             <span class="comment">// it is being modified for this link.</span>
<a name="l00961"></a>00961                             <span class="keywordflow">else</span> {
<a name="l00962"></a>00962                                 log_info(<span class="stringliteral">"Modifying metadata block %u on bundle "</span>
<a name="l00963"></a>00963                                          <span class="stringliteral">"%u on link %s"</span>, block_i-&gt;identifier(),
<a name="l00964"></a>00964                                          br-&gt;bundleid(), link.c_str());
<a name="l00965"></a>00965                                 existing-&gt;modify_outgoing_metadata(
<a name="l00966"></a>00966                                               link_ref,
<a name="l00967"></a>00967                                               (u_char*)block_i-&gt;contents().data(),
<a name="l00968"></a>00968                                               block_i-&gt;contents().size());
<a name="l00969"></a>00969                             }
<a name="l00970"></a>00970                             <span class="keywordflow">continue</span>;
<a name="l00971"></a>00971                         }
<a name="l00972"></a>00972     
<a name="l00973"></a>00973                         <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(existing == NULL);
<a name="l00974"></a>00974     
<a name="l00975"></a>00975                         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> null_link(<span class="stringliteral">"ExternalRouter::process_action"</span>);
<a name="l00976"></a>00976                         MetadataVec * nulldata = br-&gt;generated_metadata().
<a name="l00977"></a>00977                                                          find_blocks(null_link);
<a name="l00978"></a>00978                         <span class="keywordflow">if</span> (nulldata != NULL) {
<a name="l00979"></a>00979                             <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; nulldata-&gt;size(); ++i) {
<a name="l00980"></a>00980                                 <span class="keywordflow">if</span> ((*nulldata)[i]-&gt;id() == block_i-&gt;identifier()) {
<a name="l00981"></a>00981                                     existing = (*nulldata)[i];
<a name="l00982"></a>00982                                     <span class="keywordflow">break</span>;
<a name="l00983"></a>00983                                 }
<a name="l00984"></a>00984                         }
<a name="l00985"></a>00985                         }
<a name="l00986"></a>00986     
<a name="l00987"></a>00987                         <span class="keywordflow">if</span> (existing != NULL) {
<a name="l00988"></a>00988                             MetadataVec * link_vec = br-&gt;generated_metadata().
<a name="l00989"></a>00989                                                      find_blocks(link_ref);
<a name="l00990"></a>00990                             <span class="keywordflow">if</span> (link_vec == NULL) {
<a name="l00991"></a>00991                                 link_vec = br-&gt;mutable_generated_metadata()-&gt;
<a name="l00992"></a>00992                                            create_blocks(link_ref);
<a name="l00993"></a>00993                             }
<a name="l00994"></a>00994                             <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(link_vec != NULL);
<a name="l00995"></a>00995     
<a name="l00996"></a>00996                             <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(existing-&gt;ontology() == block_i-&gt;type());
<a name="l00997"></a>00997     
<a name="l00998"></a>00998                             MetadataBlock * meta_block =
<a name="l00999"></a>00999                                 <span class="keyword">new</span> MetadataBlock(
<a name="l01000"></a>01000                                         existing-&gt;id(),
<a name="l01001"></a>01001                                         block_i-&gt;type(),
<a name="l01002"></a>01002                                         (u_char *)block_i-&gt;contents().data(),
<a name="l01003"></a>01003                                         block_i-&gt;contents().size());
<a name="l01004"></a>01004                             meta_block-&gt;set_flags(existing-&gt;flags());
<a name="l01005"></a>01005     
<a name="l01006"></a>01006                         link_vec-&gt;push_back(meta_block);
<a name="l01007"></a>01007     
<a name="l01008"></a>01008                             log_info(<span class="stringliteral">"Adding a metadata block to bundle %u on "</span>
<a name="l01009"></a>01009                                      <span class="stringliteral">"link %s"</span>, br-&gt;bundleid(), link.c_str());
<a name="l01010"></a>01010                             <span class="keywordflow">continue</span>;
<a name="l01011"></a>01011                         }
<a name="l01012"></a>01012     
<a name="l01013"></a>01013                         log_err(<span class="stringliteral">"bundle %u does not have a block %u"</span>,
<a name="l01014"></a>01014                                 br-&gt;bundleid(), block_i-&gt;identifier());
<a name="l01015"></a>01015     
<a name="l01016"></a>01016                     } <span class="keywordflow">else</span> {
<a name="l01017"></a>01017                         <a class="code" href="SDNV_8cc.html#ca68c0d4ac8df0838e209fb5300f7be3">ASSERT</a>(block_i-&gt;generated());
<a name="l01018"></a>01018     
<a name="l01019"></a>01019                         MetadataVec* vec = 
<a name="l01020"></a>01020                             br-&gt;generated_metadata().find_blocks(link_ref);
<a name="l01021"></a>01021                         <span class="keywordflow">if</span> (vec == NULL)
<a name="l01022"></a>01022                             vec = br-&gt;mutable_generated_metadata()-&gt;create_blocks(link_ref);
<a name="l01023"></a>01023                         
<a name="l01024"></a>01024                         MetadataBlock* meta_block = <span class="keyword">new</span> MetadataBlock(
<a name="l01025"></a>01025                                 block_i-&gt;type(),
<a name="l01026"></a>01026                                 (u_char*)block_i-&gt;contents().data(),
<a name="l01027"></a>01027                                 block_i-&gt;contents().size());
<a name="l01028"></a>01028                         
<a name="l01029"></a>01029                         vec-&gt;push_back(meta_block);
<a name="l01030"></a>01030                         log_info(<span class="stringliteral">"Adding an metadata block to bundle %u on "</span>
<a name="l01031"></a>01031                                  <span class="stringliteral">"link %s"</span>, br-&gt;bundleid(), link.c_str());
<a name="l01032"></a>01032                     }
<a name="l01033"></a>01033                  }
<a name="l01034"></a>01034             }
<a name="l01035"></a>01035             
<a name="l01036"></a>01036             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(request);
<a name="l01037"></a>01037         }
<a name="l01038"></a>01038         <span class="keywordflow">else</span> {
<a name="l01039"></a>01039             log_warn(<span class="stringliteral">"attempt to send nonexistent bundle %s"</span>,
<a name="l01040"></a>01040                      gbof_id.str().c_str());
<a name="l01041"></a>01041         }
<a name="l01042"></a>01042     }
<a name="l01043"></a>01043 
<a name="l01044"></a>01044     <span class="keywordflow">if</span> (instance-&gt;open_link_request().present()) {
<a name="l01045"></a>01045         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01046"></a>01046         log_debug(<span class="stringliteral">"posting LinkStateChangeRequest"</span>);
<a name="l01047"></a>01047 
<a name="l01048"></a>01048         std::string lstr =
<a name="l01049"></a>01049             instance-&gt;open_link_request().get().link_id();
<a name="l01050"></a>01050         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link = bd-&gt;contactmgr()-&gt;find_link(lstr.c_str());
<a name="l01051"></a>01051 
<a name="l01052"></a>01052         <span class="keywordflow">if</span> (link.object() != 0) {
<a name="l01053"></a>01053             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(
<a name="l01054"></a>01054                 <span class="keyword">new</span> LinkStateChangeRequest(link, <a class="code" href="classdtn_1_1Link.html#1bf2479a21276737f73204a3c46508a335e8afe56056fd46352661764b8982df" title="A convergence layer session is in the process of being established.">Link::OPENING</a>,
<a name="l01055"></a>01055                                            <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7745e7897b68d73fa05257424c8746ded" title="No additional info.">ContactEvent::NO_INFO</a>));
<a name="l01056"></a>01056         } <span class="keywordflow">else</span> {
<a name="l01057"></a>01057             log_warn(<span class="stringliteral">"attempt to open link %s that doesn't exist!"</span>,
<a name="l01058"></a>01058                      lstr.c_str());
<a name="l01059"></a>01059         }
<a name="l01060"></a>01060     }
<a name="l01061"></a>01061 
<a name="l01062"></a>01062     <span class="keywordflow">if</span> (instance-&gt;close_link_request().present()) {
<a name="l01063"></a>01063         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01064"></a>01064         log_debug(<span class="stringliteral">"posting LinkStateChangeRequest"</span>);
<a name="l01065"></a>01065 
<a name="l01066"></a>01066         std::string lstr =
<a name="l01067"></a>01067             instance-&gt;close_link_request().get().link_id();
<a name="l01068"></a>01068         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link = bd-&gt;contactmgr()-&gt;find_link(lstr.c_str());
<a name="l01069"></a>01069 
<a name="l01070"></a>01070         <span class="keywordflow">if</span> (link.object() != 0) {
<a name="l01071"></a>01071             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(
<a name="l01072"></a>01072                 <span class="keyword">new</span> LinkStateChangeRequest(link, <a class="code" href="classdtn_1_1Link.html#1bf2479a21276737f73204a3c46508a32e48e0c707487f143c54dd1cd5185323" title="Bogus state that&amp;#39;s never actually used in the Link state_ variable, but is used...">Link::CLOSED</a>,
<a name="l01073"></a>01073                                            <a class="code" href="classdtn_1_1ContactEvent.html#e20f7357509a2bcca3d8e6c8daf552f7745e7897b68d73fa05257424c8746ded" title="No additional info.">ContactEvent::NO_INFO</a>));
<a name="l01074"></a>01074         } <span class="keywordflow">else</span> {
<a name="l01075"></a>01075             log_warn(<span class="stringliteral">"attempt to close link %s that doesn't exist!"</span>,
<a name="l01076"></a>01076                      lstr.c_str());
<a name="l01077"></a>01077         }
<a name="l01078"></a>01078     }
<a name="l01079"></a>01079 
<a name="l01080"></a>01080     <span class="keywordflow">if</span> (instance-&gt;add_link_request().present()) {
<a name="l01081"></a>01081         log_debug(<span class="stringliteral">"posting LinkCreateRequest"</span>);
<a name="l01082"></a>01082 
<a name="l01083"></a>01083         rtrmessage::add_link_request request
<a name="l01084"></a>01084             = instance-&gt;add_link_request().get();
<a name="l01085"></a>01085         std::string clayer = request.clayer();
<a name="l01086"></a>01086         ConvergenceLayer *cl = <a class="code" href="classdtn_1_1ConvergenceLayer.html#6259b19bef1dd17295030b33c44c29d0" title="Find the appropriate convergence layer for the given string.">ConvergenceLayer::find_clayer</a>(clayer.c_str());
<a name="l01087"></a>01087         <span class="keywordflow">if</span> (!cl) {
<a name="l01088"></a>01088             log_warn(<span class="stringliteral">"attempt to create link using non-existent CLA %s"</span>,
<a name="l01089"></a>01089                      clayer.c_str());
<a name="l01090"></a>01090         }
<a name="l01091"></a>01091         <span class="keywordflow">else</span> {
<a name="l01092"></a>01092             std::string name = request.link_id();
<a name="l01093"></a>01093             <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61e" title="Valid types for a link.">Link::link_type_t</a> type = convert_link_type( request.link_type() );
<a name="l01094"></a>01094             std::string eid = request.remote_eid().uri();
<a name="l01095"></a>01095 
<a name="l01096"></a>01096             <a class="code" href="namespacedtn.html#e203c4f515b9e88e9e3462100c257314">AttributeVector</a> params;
<a name="l01097"></a>01097 
<a name="l01098"></a>01098             <span class="keywordflow">if</span> (request.link_config_params().present()) {
<a name="l01099"></a>01099                 linkConfigType::cl_params::container
<a name="l01100"></a>01100                     c = request.link_config_params().get().cl_params();
<a name="l01101"></a>01101                 linkConfigType::cl_params::container::iterator iter;
<a name="l01102"></a>01102 
<a name="l01103"></a>01103                 <span class="keywordflow">for</span> (iter = c.begin(); iter &lt; c.end(); iter++) {
<a name="l01104"></a>01104                     <span class="keywordflow">if</span> (iter-&gt;bool_value().present())
<a name="l01105"></a>01105                         params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01106"></a>01106                                                         iter-&gt;bool_value()));
<a name="l01107"></a>01107                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;u_int_value().present())
<a name="l01108"></a>01108                         params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01109"></a>01109                                                         iter-&gt;u_int_value()));
<a name="l01110"></a>01110                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;int_value().present())
<a name="l01111"></a>01111                         params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01112"></a>01112                                                         iter-&gt;int_value()));
<a name="l01113"></a>01113                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;str_value().present())
<a name="l01114"></a>01114                         params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01115"></a>01115                                                         iter-&gt;str_value()));
<a name="l01116"></a>01116                     <span class="keywordflow">else</span>
<a name="l01117"></a>01117                         log_warn(<span class="stringliteral">"unknown value type in key-value pair"</span>);
<a name="l01118"></a>01118                 }
<a name="l01119"></a>01119             }
<a name="l01120"></a>01120 
<a name="l01121"></a>01121             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(
<a name="l01122"></a>01122                 <span class="keyword">new</span> LinkCreateRequest(name, type, eid, cl, params));
<a name="l01123"></a>01123         }
<a name="l01124"></a>01124     }
<a name="l01125"></a>01125 
<a name="l01126"></a>01126     <span class="keywordflow">if</span> (instance-&gt;delete_link_request().present()) {
<a name="l01127"></a>01127         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01128"></a>01128         log_debug(<span class="stringliteral">"posting LinkDeleteRequest"</span>);
<a name="l01129"></a>01129 
<a name="l01130"></a>01130         std::string lstr = instance-&gt;delete_link_request().get().link_id();
<a name="l01131"></a>01131         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link = bd-&gt;contactmgr()-&gt;find_link(lstr.c_str());
<a name="l01132"></a>01132 
<a name="l01133"></a>01133         <span class="keywordflow">if</span> (link.object() != 0) {
<a name="l01134"></a>01134             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> LinkDeleteRequest(link));
<a name="l01135"></a>01135         } <span class="keywordflow">else</span> {
<a name="l01136"></a>01136             log_warn(<span class="stringliteral">"attempt to delete link %s that doesn't exist!"</span>,
<a name="l01137"></a>01137                      lstr.c_str());
<a name="l01138"></a>01138         }
<a name="l01139"></a>01139     }
<a name="l01140"></a>01140 
<a name="l01141"></a>01141     <span class="keywordflow">if</span> (instance-&gt;reconfigure_link_request().present()) {
<a name="l01142"></a>01142         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01143"></a>01143         log_debug(<span class="stringliteral">"posting LinkReconfigureRequest"</span>);
<a name="l01144"></a>01144 
<a name="l01145"></a>01145         rtrmessage::reconfigure_link_request request
<a name="l01146"></a>01146             = instance-&gt;reconfigure_link_request().get();
<a name="l01147"></a>01147         std::string lstr = request.link_id();
<a name="l01148"></a>01148         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link = bd-&gt;contactmgr()-&gt;find_link(lstr.c_str());
<a name="l01149"></a>01149 
<a name="l01150"></a>01150         rtrmessage::linkConfigType request_params=request.link_config_params();
<a name="l01151"></a>01151 
<a name="l01152"></a>01152         <span class="keywordflow">if</span> (link.object() != 0) {
<a name="l01153"></a>01153             <a class="code" href="namespacedtn.html#e203c4f515b9e88e9e3462100c257314">AttributeVector</a> params;
<a name="l01154"></a>01154             <span class="keywordflow">if</span> (request_params.is_usable().present()) {
<a name="l01155"></a>01155                 params.push_back(NamedAttribute(<span class="stringliteral">"is_usable"</span>, request_params.is_usable().get()));
<a name="l01156"></a>01156             }
<a name="l01157"></a>01157             <span class="keywordflow">if</span> (request_params.reactive_frag_enabled().present()) {
<a name="l01158"></a>01158                 <span class="comment">// xlate between router.xsd/clevent.xsd</span>
<a name="l01159"></a>01159                 params.push_back(NamedAttribute(<span class="stringliteral">"reactive_fragment"</span>, request_params.reactive_frag_enabled().get()));
<a name="l01160"></a>01160             }
<a name="l01161"></a>01161             <span class="keywordflow">if</span> (request_params.nexthop().present()) {
<a name="l01162"></a>01162                 params.push_back(NamedAttribute(<span class="stringliteral">"nexthop"</span>, request_params.nexthop().get()));
<a name="l01163"></a>01163             }
<a name="l01164"></a>01164             <span class="comment">// Following are DTN2 parameters not listed in the DP interface</span>
<a name="l01165"></a>01165             <span class="keywordflow">if</span> (request_params.min_retry_interval().present()) {
<a name="l01166"></a>01166                 params.push_back(
<a name="l01167"></a>01167                     NamedAttribute(<span class="stringliteral">"min_retry_interval"</span>,
<a name="l01168"></a>01168                                    request_params.min_retry_interval().get()));
<a name="l01169"></a>01169             }
<a name="l01170"></a>01170             <span class="keywordflow">if</span> (request_params.max_retry_interval().present()) {
<a name="l01171"></a>01171                 params.push_back(
<a name="l01172"></a>01172                     NamedAttribute(<span class="stringliteral">"max_retry_interval"</span>,
<a name="l01173"></a>01173                                    request_params.max_retry_interval().get()));
<a name="l01174"></a>01174             }
<a name="l01175"></a>01175             <span class="keywordflow">if</span> (request_params.idle_close_time().present()) {
<a name="l01176"></a>01176                 params.push_back(
<a name="l01177"></a>01177                     NamedAttribute(<span class="stringliteral">"idle_close_time"</span>,
<a name="l01178"></a>01178                                    request_params.idle_close_time().get()));
<a name="l01179"></a>01179             }
<a name="l01180"></a>01180 
<a name="l01181"></a>01181             linkConfigType::cl_params::container
<a name="l01182"></a>01182                 c = request_params.cl_params();
<a name="l01183"></a>01183             linkConfigType::cl_params::container::iterator iter;
<a name="l01184"></a>01184 
<a name="l01185"></a>01185             <span class="keywordflow">for</span> (iter = c.begin(); iter &lt; c.end(); iter++) {
<a name="l01186"></a>01186               <span class="keywordflow">if</span> (iter-&gt;bool_value().present())
<a name="l01187"></a>01187                 params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01188"></a>01188                                                 iter-&gt;bool_value()));
<a name="l01189"></a>01189               <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;u_int_value().present())
<a name="l01190"></a>01190                 params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01191"></a>01191                                                 iter-&gt;u_int_value()));
<a name="l01192"></a>01192               <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;int_value().present())
<a name="l01193"></a>01193                 params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01194"></a>01194                                                 iter-&gt;int_value()));
<a name="l01195"></a>01195               <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;str_value().present())
<a name="l01196"></a>01196                 params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01197"></a>01197                                                 iter-&gt;str_value()));
<a name="l01198"></a>01198               <span class="keywordflow">else</span>
<a name="l01199"></a>01199                 log_warn(<span class="stringliteral">"unknown value type in key-value pair"</span>);
<a name="l01200"></a>01200             }
<a name="l01201"></a>01201 
<a name="l01202"></a>01202             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> LinkReconfigureRequest(link, params));
<a name="l01203"></a>01203         } <span class="keywordflow">else</span> {
<a name="l01204"></a>01204             log_warn(<span class="stringliteral">"attempt to reconfigure link %s that doesn't exist!"</span>,
<a name="l01205"></a>01205                      lstr.c_str());
<a name="l01206"></a>01206         }
<a name="l01207"></a>01207     }
<a name="l01208"></a>01208 
<a name="l01209"></a>01209     <span class="keywordflow">if</span> (instance-&gt;inject_bundle_request().present()) {
<a name="l01210"></a>01210         log_debug(<span class="stringliteral">"posting BundleInjectRequest"</span>);
<a name="l01211"></a>01211 
<a name="l01212"></a>01212         inject_bundle_request fields = instance-&gt;inject_bundle_request().get();
<a name="l01213"></a>01213 
<a name="l01214"></a>01214         <span class="comment">//XXX Where did the other BundleInjectRequest constructor go?</span>
<a name="l01215"></a>01215         BundleInjectRequest *request = <span class="keyword">new</span> BundleInjectRequest();
<a name="l01216"></a>01216 
<a name="l01217"></a>01217         request-&gt;src_ = fields.source().uri();
<a name="l01218"></a>01218         request-&gt;dest_ = fields.dest().uri();
<a name="l01219"></a>01219         request-&gt;link_ = fields.link_id();
<a name="l01220"></a>01220         request-&gt;request_id_ = fields.request_id();
<a name="l01221"></a>01221         
<a name="l01222"></a>01222         request-&gt;payload_file_ = fields.payload_file();
<a name="l01223"></a>01223 
<a name="l01224"></a>01224         <span class="keywordflow">if</span>(fields.replyto().present())
<a name="l01225"></a>01225             request-&gt;replyto_ = fields.replyto().get().uri();
<a name="l01226"></a>01226         <span class="keywordflow">else</span>
<a name="l01227"></a>01227             request-&gt;replyto_ = <span class="stringliteral">""</span>;
<a name="l01228"></a>01228 
<a name="l01229"></a>01229         <span class="keywordflow">if</span>(fields.custodian().present())
<a name="l01230"></a>01230             request-&gt;custodian_ = fields.custodian().get().uri();
<a name="l01231"></a>01231         <span class="keywordflow">else</span>
<a name="l01232"></a>01232             request-&gt;custodian_ = <span class="stringliteral">""</span>;
<a name="l01233"></a>01233 
<a name="l01234"></a>01234         <span class="keywordflow">if</span>(fields.priority().present())
<a name="l01235"></a>01235             request-&gt;priority_ = convert_priority( fields.priority().get() );
<a name="l01236"></a>01236         <span class="keywordflow">else</span>
<a name="l01237"></a>01237             request-&gt;priority_ = <a class="code" href="classdtn_1_1Bundle.html#ee1ec0a9c045adc48dc8751f54f59e64cdd03b2fd0d69a8085cbce1d8941690f" title="lowest priority">Bundle::COS_BULK</a>; <span class="comment">// default</span>
<a name="l01238"></a>01238 
<a name="l01239"></a>01239         <span class="keywordflow">if</span>(fields.expiration().present())
<a name="l01240"></a>01240             request-&gt;expiration_ = fields.expiration().get();
<a name="l01241"></a>01241         <span class="keywordflow">else</span>
<a name="l01242"></a>01242             request-&gt;expiration_ = 0; <span class="comment">// default will be used</span>
<a name="l01243"></a>01243 
<a name="l01244"></a>01244         <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(request);
<a name="l01245"></a>01245     }
<a name="l01246"></a>01246 
<a name="l01247"></a>01247     <span class="keywordflow">if</span> (instance-&gt;cancel_bundle_request().present()) {
<a name="l01248"></a>01248         log_debug(<span class="stringliteral">"posting BundleCancelRequest"</span>);
<a name="l01249"></a>01249 
<a name="l01250"></a>01250         gbofIdType <span class="keywordtype">id</span> =
<a name="l01251"></a>01251             instance-&gt;cancel_bundle_request().get().gbof_id();
<a name="l01252"></a>01252         BundleTimestamp local_id;
<a name="l01253"></a>01253         local_id.seconds_ =
<a name="l01254"></a>01254             instance-&gt;cancel_bundle_request().get().local_id() &gt;&gt; 32;
<a name="l01255"></a>01255         local_id.seqno_ =
<a name="l01256"></a>01256             instance-&gt;cancel_bundle_request().get().local_id() &amp; 0xffffffff;
<a name="l01257"></a>01257         std::string link =
<a name="l01258"></a>01258             instance-&gt;cancel_bundle_request().get().link_id();
<a name="l01259"></a>01259 
<a name="l01260"></a>01260         GbofId gbof_id;
<a name="l01261"></a>01261         gbof_id.source_ = EndpointID( <span class="keywordtype">id</span>.source().uri() );
<a name="l01262"></a>01262         gbof_id.creation_ts_.seconds_ = <span class="keywordtype">id</span>.creation_ts() &gt;&gt; 32;
<a name="l01263"></a>01263         gbof_id.creation_ts_.seqno_ = <span class="keywordtype">id</span>.creation_ts() &amp; 0xffffffff;
<a name="l01264"></a>01264         gbof_id.is_fragment_ = <span class="keywordtype">id</span>.is_fragment();
<a name="l01265"></a>01265         gbof_id.frag_length_ = <span class="keywordtype">id</span>.frag_length();
<a name="l01266"></a>01266         gbof_id.frag_offset_ = <span class="keywordtype">id</span>.frag_offset();
<a name="l01267"></a>01267 
<a name="l01268"></a>01268         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01269"></a>01269         log_debug(<span class="stringliteral">"pending_bundles size %zu"</span>, bd-&gt;pending_bundles()-&gt;size());
<a name="l01270"></a>01270         <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = bd-&gt;pending_bundles()-&gt;find(gbof_id, local_id);
<a name="l01271"></a>01271         <span class="keywordflow">if</span> (br.object()) {
<a name="l01272"></a>01272             BundleCancelRequest *request = <span class="keyword">new</span> BundleCancelRequest(br, link);
<a name="l01273"></a>01273             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(request);
<a name="l01274"></a>01274         }
<a name="l01275"></a>01275         <span class="keywordflow">else</span> {
<a name="l01276"></a>01276             log_warn(<span class="stringliteral">"attempt to cancel send of nonexistent bundle %s"</span>,
<a name="l01277"></a>01277                      gbof_id.str().c_str());
<a name="l01278"></a>01278         }
<a name="l01279"></a>01279     }
<a name="l01280"></a>01280 
<a name="l01281"></a>01281     <span class="keywordflow">if</span> (instance-&gt;delete_bundle_request().present()) {
<a name="l01282"></a>01282         log_debug(<span class="stringliteral">"posting BundleDeleteRequest"</span>);
<a name="l01283"></a>01283 
<a name="l01284"></a>01284         gbofIdType <span class="keywordtype">id</span> =
<a name="l01285"></a>01285             instance-&gt;delete_bundle_request().get().gbof_id();
<a name="l01286"></a>01286 
<a name="l01287"></a>01287         GbofId gbof_id;
<a name="l01288"></a>01288         gbof_id.source_ = EndpointID( <span class="keywordtype">id</span>.source().uri() );
<a name="l01289"></a>01289         gbof_id.creation_ts_.seconds_ = <span class="keywordtype">id</span>.creation_ts() &gt;&gt; 32;
<a name="l01290"></a>01290         gbof_id.creation_ts_.seqno_ = <span class="keywordtype">id</span>.creation_ts() &amp; 0xffffffff;
<a name="l01291"></a>01291         gbof_id.is_fragment_ = <span class="keywordtype">id</span>.is_fragment();
<a name="l01292"></a>01292         gbof_id.frag_length_ = <span class="keywordtype">id</span>.frag_length();
<a name="l01293"></a>01293         gbof_id.frag_offset_ = <span class="keywordtype">id</span>.frag_offset();
<a name="l01294"></a>01294         BundleTimestamp local_id;
<a name="l01295"></a>01295         local_id.seconds_ =
<a name="l01296"></a>01296             instance-&gt;delete_bundle_request().get().local_id() &gt;&gt; 32;
<a name="l01297"></a>01297         local_id.seqno_ =
<a name="l01298"></a>01298             instance-&gt;delete_bundle_request().get().local_id() &amp; 0xffffffff;
<a name="l01299"></a>01299 
<a name="l01300"></a>01300         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01301"></a>01301         log_debug(<span class="stringliteral">"pending_bundles size %zu"</span>, bd-&gt;pending_bundles()-&gt;size());
<a name="l01302"></a>01302         <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = bd-&gt;pending_bundles()-&gt;find(gbof_id, local_id);
<a name="l01303"></a>01303         <span class="keywordflow">if</span> (br.object()) {
<a name="l01304"></a>01304             BundleDeleteRequest *request =
<a name="l01305"></a>01305                 <span class="keyword">new</span> BundleDeleteRequest(br,
<a name="l01306"></a>01306                                         <a class="code" href="classdtn_1_1BundleProtocol.html#37b000d94172c06970bb8af32889f917eac137290a0338e66ed4a0c1cc09c2f2">BundleProtocol::REASON_NO_ADDTL_INFO</a>);
<a name="l01307"></a>01307             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(request);
<a name="l01308"></a>01308         }
<a name="l01309"></a>01309         <span class="keywordflow">else</span> {
<a name="l01310"></a>01310             log_warn(<span class="stringliteral">"attempt to delete nonexistent bundle %s"</span>,
<a name="l01311"></a>01311                      gbof_id.str().c_str());
<a name="l01312"></a>01312         }
<a name="l01313"></a>01313     }
<a name="l01314"></a>01314 
<a name="l01315"></a>01315     <span class="keywordflow">if</span> (instance-&gt;set_cl_params_request().present()) {
<a name="l01316"></a>01316         log_debug(<span class="stringliteral">"posting CLASetParamsRequest"</span>);
<a name="l01317"></a>01317 
<a name="l01318"></a>01318         std::string clayer = instance-&gt;set_cl_params_request().get().clayer();
<a name="l01319"></a>01319         ConvergenceLayer *cl = <a class="code" href="classdtn_1_1ConvergenceLayer.html#6259b19bef1dd17295030b33c44c29d0" title="Find the appropriate convergence layer for the given string.">ConvergenceLayer::find_clayer</a>(clayer.c_str());
<a name="l01320"></a>01320         <span class="keywordflow">if</span> (!cl) {
<a name="l01321"></a>01321             log_warn(<span class="stringliteral">"attempt to set parameters for non-existent CLA %s"</span>,
<a name="l01322"></a>01322                      clayer.c_str());
<a name="l01323"></a>01323         }
<a name="l01324"></a>01324         <span class="keywordflow">else</span> {
<a name="l01325"></a>01325             <a class="code" href="namespacedtn.html#e203c4f515b9e88e9e3462100c257314">AttributeVector</a> params;
<a name="l01326"></a>01326 
<a name="l01327"></a>01327             set_cl_params_request::cl_params::container
<a name="l01328"></a>01328                 c = instance-&gt;set_cl_params_request().get().cl_params();
<a name="l01329"></a>01329             set_cl_params_request::cl_params::container::iterator iter;
<a name="l01330"></a>01330 
<a name="l01331"></a>01331             <span class="keywordflow">for</span> (iter = c.begin(); iter &lt; c.end(); iter++) {
<a name="l01332"></a>01332                 <span class="keywordflow">if</span> (iter-&gt;bool_value().present())
<a name="l01333"></a>01333                     params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01334"></a>01334                                                     iter-&gt;bool_value()));
<a name="l01335"></a>01335                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;u_int_value().present())
<a name="l01336"></a>01336                     params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01337"></a>01337                                                     iter-&gt;u_int_value()));
<a name="l01338"></a>01338                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;int_value().present())
<a name="l01339"></a>01339                     params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01340"></a>01340                                                     iter-&gt;int_value()));
<a name="l01341"></a>01341                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iter-&gt;str_value().present())
<a name="l01342"></a>01342                     params.push_back(NamedAttribute(iter-&gt;name(), 
<a name="l01343"></a>01343                                                     iter-&gt;str_value()));
<a name="l01344"></a>01344                 <span class="keywordflow">else</span>
<a name="l01345"></a>01345                     log_warn(<span class="stringliteral">"unknown value type in key-value pair"</span>);
<a name="l01346"></a>01346             }
<a name="l01347"></a>01347 
<a name="l01348"></a>01348             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> CLASetParamsRequest(cl, params));
<a name="l01349"></a>01349         }
<a name="l01350"></a>01350     }
<a name="l01351"></a>01351 
<a name="l01352"></a>01352     <span class="keywordflow">if</span> (instance-&gt;bundle_attributes_query().present()) {
<a name="l01353"></a>01353         log_debug(<span class="stringliteral">"posting BundleAttributesQueryRequest"</span>);
<a name="l01354"></a>01354         bundle_attributes_query query =
<a name="l01355"></a>01355             instance-&gt;bundle_attributes_query().get();
<a name="l01356"></a>01356         std::string query_id = query.query_id();
<a name="l01357"></a>01357         gbofIdType <span class="keywordtype">id</span> = query.gbof_id();
<a name="l01358"></a>01358 
<a name="l01359"></a>01359         GbofId gbof_id;
<a name="l01360"></a>01360         gbof_id.source_ = EndpointID( <span class="keywordtype">id</span>.source().uri() );
<a name="l01361"></a>01361         gbof_id.creation_ts_.seconds_ = <span class="keywordtype">id</span>.creation_ts() &gt;&gt; 32;
<a name="l01362"></a>01362         gbof_id.creation_ts_.seqno_ = <span class="keywordtype">id</span>.creation_ts() &amp; 0xffffffff;
<a name="l01363"></a>01363         gbof_id.is_fragment_ = <span class="keywordtype">id</span>.is_fragment();
<a name="l01364"></a>01364         gbof_id.frag_length_ = <span class="keywordtype">id</span>.frag_length();
<a name="l01365"></a>01365         gbof_id.frag_offset_ = <span class="keywordtype">id</span>.frag_offset();
<a name="l01366"></a>01366         BundleTimestamp local_id;
<a name="l01367"></a>01367         local_id.seconds_ = query.local_id() &gt;&gt; 32;
<a name="l01368"></a>01368         local_id.seqno_ = query.local_id() &amp; 0xffffffff;
<a name="l01369"></a>01369 
<a name="l01370"></a>01370         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01371"></a>01371         log_debug(<span class="stringliteral">"pending_bundles size %zu"</span>, bd-&gt;pending_bundles()-&gt;size());
<a name="l01372"></a>01372         <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = bd-&gt;pending_bundles()-&gt;find(gbof_id, local_id);
<a name="l01373"></a>01373 
<a name="l01374"></a>01374         <span class="comment">// XXX note, if we want to send a report even when the bundle does</span>
<a name="l01375"></a>01375         <span class="comment">// not exist (instead of ignoring the request), we have to not test</span>
<a name="l01376"></a>01376         <span class="comment">// for the existence of the object here (it is tested again in</span>
<a name="l01377"></a>01377         <span class="comment">// BundleDaemon::handle_bundle_attributes_query)</span>
<a name="l01378"></a>01378         <span class="keywordflow">if</span> (br.object()) {
<a name="l01379"></a>01379             <a class="code" href="namespacedtn.html#af9ae7e19d5214bb504a600ea79cb9e2">AttributeNameVector</a> attribute_names;
<a name="l01380"></a>01380             <a class="code" href="namespacedtn.html#7778e0e11630dcf6bc3cd35e10ab0164">MetaBlockRequestVector</a> metadata_blocks;
<a name="l01381"></a>01381             bundle_attributes_query::query_params::container
<a name="l01382"></a>01382                 c = query.query_params();
<a name="l01383"></a>01383             bundle_attributes_query::query_params::container::iterator iter;
<a name="l01384"></a>01384     
<a name="l01385"></a>01385             <span class="keywordflow">for</span> (iter = c.begin(); iter != c.end(); iter++) {
<a name="l01386"></a>01386                 bundleAttributesQueryType&amp; q = *iter;
<a name="l01387"></a>01387     
<a name="l01388"></a>01388                 <span class="keywordflow">if</span> (q.query().present()) {
<a name="l01389"></a>01389                     attribute_names.push_back( AttributeName(q.query().get()) );
<a name="l01390"></a>01390                 }
<a name="l01391"></a>01391                 <span class="keywordflow">if</span> (q.meta_blocks().present()) {
<a name="l01392"></a>01392                     bundleMetaBlockQueryType&amp; block = q.meta_blocks().get();
<a name="l01393"></a>01393                     <span class="keywordtype">int</span> query_value = -1;
<a name="l01394"></a>01394                     <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52a">MetadataBlockRequest::QueryType</a> query_type;
<a name="l01395"></a>01395                     
<a name="l01396"></a>01396                     <span class="keywordflow">if</span> (block.identifier().present()) {
<a name="l01397"></a>01397                         query_value = block.identifier().get();
<a name="l01398"></a>01398                         query_type = <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52a6701bc44556c817ee499ee686be5b82e">MetadataBlockRequest::QueryByIdentifier</a>;
<a name="l01399"></a>01399                     }
<a name="l01400"></a>01400                     
<a name="l01401"></a>01401                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (block.type().present()) {
<a name="l01402"></a>01402                         query_value = block.type().get();
<a name="l01403"></a>01403                         query_type = <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52aa4f72c48f5571f4f27c45fc0010ab762">MetadataBlockRequest::QueryByType</a>;
<a name="l01404"></a>01404                     }
<a name="l01405"></a>01405                     
<a name="l01406"></a>01406                     <span class="keywordflow">if</span> (query_value &lt; 0)
<a name="l01407"></a>01407                         query_type = <a class="code" href="classdtn_1_1MetadataBlockRequest.html#ffc63aa4033f49e32fadfc85158dc52a95b4d6f58003db4d200c22defbc2c760">MetadataBlockRequest::QueryAll</a>;
<a name="l01408"></a>01408                     
<a name="l01409"></a>01409                     metadata_blocks.push_back(
<a name="l01410"></a>01410                         MetadataBlockRequest(query_type, query_value) );
<a name="l01411"></a>01411                 }
<a name="l01412"></a>01412             }
<a name="l01413"></a>01413     
<a name="l01414"></a>01414             BundleAttributesQueryRequest* request
<a name="l01415"></a>01415                 = <span class="keyword">new</span> BundleAttributesQueryRequest(query_id, br, attribute_names);
<a name="l01416"></a>01416     
<a name="l01417"></a>01417             <span class="keywordflow">if</span> (metadata_blocks.size() &gt; 0) {
<a name="l01418"></a>01418                 request-&gt;metadata_blocks_ = metadata_blocks;
<a name="l01419"></a>01419             }
<a name="l01420"></a>01420     
<a name="l01421"></a>01421             <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(request);
<a name="l01422"></a>01422         }
<a name="l01423"></a>01423         <span class="keywordflow">else</span> {
<a name="l01424"></a>01424             log_warn(<span class="stringliteral">"attempt to query nonexistent bundle %s"</span>,
<a name="l01425"></a>01425                      gbof_id.str().c_str());
<a name="l01426"></a>01426         }
<a name="l01427"></a>01427     }
<a name="l01428"></a>01428 
<a name="l01429"></a>01429     <span class="keywordflow">if</span> (instance-&gt;link_query().present()) {
<a name="l01430"></a>01430         log_debug(<span class="stringliteral">"posting LinkQueryRequest"</span>);
<a name="l01431"></a>01431         <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> LinkQueryRequest());
<a name="l01432"></a>01432     }
<a name="l01433"></a>01433 
<a name="l01434"></a>01434     <span class="keywordflow">if</span> (instance-&gt;link_attributes_query().present()) {
<a name="l01435"></a>01435         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01436"></a>01436         log_debug(<span class="stringliteral">"posting LinkAttributesQueryRequest"</span>);
<a name="l01437"></a>01437 
<a name="l01438"></a>01438         link_attributes_query query = instance-&gt;link_attributes_query().get();
<a name="l01439"></a>01439         std::string query_id = query.query_id();
<a name="l01440"></a>01440         std::string lstr = query.link_id();
<a name="l01441"></a>01441 
<a name="l01442"></a>01442         <a class="code" href="namespacedtn.html#6efb37e503f8062c537b022eb755b94e" title="Typedef for a reference on a link.">LinkRef</a> link = bd-&gt;contactmgr()-&gt;find_link(lstr.c_str());
<a name="l01443"></a>01443 
<a name="l01444"></a>01444         <span class="keywordflow">if</span> (link.object() != 0) {
<a name="l01445"></a>01445            <a class="code" href="namespacedtn.html#af9ae7e19d5214bb504a600ea79cb9e2">AttributeNameVector</a> attribute_names;
<a name="l01446"></a>01446 
<a name="l01447"></a>01447            link_attributes_query::query_params::container 
<a name="l01448"></a>01448              c = query.query_params();
<a name="l01449"></a>01449            link_attributes_query::query_params::container::iterator iter;
<a name="l01450"></a>01450 
<a name="l01451"></a>01451            <span class="keywordflow">for</span> (iter = c.begin(); iter &lt; c.end(); iter++) {
<a name="l01452"></a>01452              attribute_names.push_back( AttributeName(*iter) );
<a name="l01453"></a>01453            }
<a name="l01454"></a>01454 
<a name="l01455"></a>01455           <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> LinkAttributesQueryRequest(query_id, 
<a name="l01456"></a>01456                                                             link, 
<a name="l01457"></a>01457                                                             attribute_names));
<a name="l01458"></a>01458         } <span class="keywordflow">else</span> {
<a name="l01459"></a>01459             log_warn(<span class="stringliteral">"attempt to query attributes of link %s that doesn't exist!"</span>,
<a name="l01460"></a>01460                      lstr.c_str());
<a name="l01461"></a>01461         }
<a name="l01462"></a>01462     }
<a name="l01463"></a>01463 
<a name="l01464"></a>01464     <span class="keywordflow">if</span> (instance-&gt;bundle_query().present()) {
<a name="l01465"></a>01465         log_debug(<span class="stringliteral">"posting BundleQueryRequest"</span>);
<a name="l01466"></a>01466         <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> BundleQueryRequest());
<a name="l01467"></a>01467     }
<a name="l01468"></a>01468 
<a name="l01469"></a>01469     <span class="keywordflow">if</span> (instance-&gt;contact_query().present()) {
<a name="l01470"></a>01470         log_debug(<span class="stringliteral">"posting ContactQueryRequest"</span>);
<a name="l01471"></a>01471         <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> ContactQueryRequest());
<a name="l01472"></a>01472     }
<a name="l01473"></a>01473 
<a name="l01474"></a>01474     <span class="keywordflow">if</span> (instance-&gt;route_query().present()) {
<a name="l01475"></a>01475         log_debug(<span class="stringliteral">"posting RouteQueryRequest"</span>);
<a name="l01476"></a>01476         <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> RouteQueryRequest());
<a name="l01477"></a>01477     }
<a name="l01478"></a>01478 
<a name="l01479"></a>01479     <span class="comment">/* This is needed for delivering to LB applications */</span>
<a name="l01480"></a>01480     <span class="keywordflow">if</span> (instance-&gt;deliver_bundle_to_app_request().present()) {
<a name="l01481"></a>01481         log_debug(<span class="stringliteral">"posting DeliverBundleToAppRequest"</span>);
<a name="l01482"></a>01482         deliver_bundle_to_app_request&amp; in_request = 
<a name="l01483"></a>01483             instance-&gt;deliver_bundle_to_app_request().get();
<a name="l01484"></a>01484 
<a name="l01485"></a>01485         eidType reg = in_request.endpoint();
<a name="l01486"></a>01486         EndpointID reg_eid;
<a name="l01487"></a>01487         reg_eid.assign(reg.uri());
<a name="l01488"></a>01488 
<a name="l01489"></a>01489         gbofIdType <span class="keywordtype">id</span> = in_request.gbof_id();
<a name="l01490"></a>01490         GbofId gbof_id;
<a name="l01491"></a>01491         gbof_id.source_ = EndpointID( <span class="keywordtype">id</span>.source().uri() );
<a name="l01492"></a>01492         gbof_id.creation_ts_.seconds_ = <span class="keywordtype">id</span>.creation_ts() &gt;&gt; 32;
<a name="l01493"></a>01493         gbof_id.creation_ts_.seqno_ = <span class="keywordtype">id</span>.creation_ts() &amp; 0xffffffff;
<a name="l01494"></a>01494         gbof_id.is_fragment_ = <span class="keywordtype">id</span>.is_fragment();
<a name="l01495"></a>01495         gbof_id.frag_length_ = <span class="keywordtype">id</span>.frag_length();
<a name="l01496"></a>01496         gbof_id.frag_offset_ = <span class="keywordtype">id</span>.frag_offset();
<a name="l01497"></a>01497         BundleTimestamp local_id;
<a name="l01498"></a>01498         local_id.seconds_ = in_request.local_id() &gt;&gt; 32;
<a name="l01499"></a>01499         local_id.seqno_ = in_request.local_id() &amp; 0xffffffff;
<a name="l01500"></a>01500 
<a name="l01501"></a>01501         BundleDaemon *bd = BundleDaemon::instance();
<a name="l01502"></a>01502         log_debug(<span class="stringliteral">"pending_bundles size %zu"</span>, bd-&gt;pending_bundles()-&gt;size());
<a name="l01503"></a>01503         <a class="code" href="namespacedtn.html#87094f3b26b9f1d469e616d311ae57b1" title="Class definition for a Bundle reference.">BundleRef</a> br = bd-&gt;pending_bundles()-&gt;find(gbof_id, local_id);
<a name="l01504"></a>01504 
<a name="l01505"></a>01505         <span class="keywordflow">if</span> (br.object()) {
<a name="l01506"></a>01506             bd-&gt;check_and_deliver_to_registrations(br.object(), reg_eid);
<a name="l01507"></a>01507         }
<a name="l01508"></a>01508         <span class="keywordflow">else</span> {
<a name="l01509"></a>01509             log_warn(<span class="stringliteral">"attempt to deliver nonexistent bundle %s to app %s"</span>,
<a name="l01510"></a>01510                      gbof_id.str().c_str(), reg_eid.c_str());
<a name="l01511"></a>01511         }
<a name="l01512"></a>01512     }
<a name="l01513"></a>01513 }
<a name="l01514"></a>01514 
<a name="l01515"></a>01515 <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61e" title="Valid types for a link.">Link::link_type_t</a>
<a name="l01516"></a>01516 ExternalRouter::ModuleServer::convert_link_type(rtrmessage::linkTypeType type)
<a name="l01517"></a>01517 {
<a name="l01518"></a>01518     <span class="keywordflow">if</span>(type==linkTypeType(linkTypeType::alwayson)){
<a name="l01519"></a>01519         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61eb2b2a3f569e0a11e5277b2428253137d" title="The link is expected to be ALWAYS available, and any convergence layer connection...">Link::ALWAYSON</a>;
<a name="l01520"></a>01520     }
<a name="l01521"></a>01521     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(type==linkTypeType(linkTypeType::ondemand)){
<a name="l01522"></a>01522         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61eeacf2159ea9fd169ca07c9f9891309ec" title="The link is expected to be either always available, or can be made available easily...">Link::ONDEMAND</a>;
<a name="l01523"></a>01523     }
<a name="l01524"></a>01524     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(type==linkTypeType(linkTypeType::scheduled)){
<a name="l01525"></a>01525         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61e801d9aeea31cb25c67e25914a461db38" title="The link is only available at pre-determined times.">Link::SCHEDULED</a>;
<a name="l01526"></a>01526     }
<a name="l01527"></a>01527     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(type==linkTypeType(linkTypeType::opportunistic)){
<a name="l01528"></a>01528         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61e692792332b57aa903a769cb33e3d366b" title="The link may or may not be available, based on uncontrollable factors.">Link::OPPORTUNISTIC</a>;
<a name="l01529"></a>01529     }
<a name="l01530"></a>01530 
<a name="l01531"></a>01531     <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Link.html#a93653796d33692c67c415afd1edf61e16f74d8b58f067027e718650590deef1">Link::LINK_INVALID</a>;
<a name="l01532"></a>01532 }
<a name="l01533"></a>01533 
<a name="l01534"></a>01534 <a class="code" href="classdtn_1_1ForwardingInfo.html#18ec95dc1b1b8a7e9df9873a0d9b5947" title="The forwarding action type codes.">ForwardingInfo::action_t</a>
<a name="l01535"></a>01535 ExternalRouter::ModuleServer::convert_fwd_action(rtrmessage::bundleForwardActionType action)
<a name="l01536"></a>01536 {
<a name="l01537"></a>01537     <span class="keywordflow">if</span>(action==bundleForwardActionType(bundleForwardActionType::forward)){
<a name="l01538"></a>01538         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1ForwardingInfo.html#18ec95dc1b1b8a7e9df9873a0d9b59471efad47dbf6015f5e4458ac355eabbaa" title="Forward the bundle to only this next hop.">ForwardingInfo::FORWARD_ACTION</a>;
<a name="l01539"></a>01539     }
<a name="l01540"></a>01540     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(action== bundleForwardActionType(bundleForwardActionType::copy)){
<a name="l01541"></a>01541         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1ForwardingInfo.html#18ec95dc1b1b8a7e9df9873a0d9b594777ba7ba2355d6b87536afc9ef78efeb8" title="Forward a copy of the bundle.">ForwardingInfo::COPY_ACTION</a>;
<a name="l01542"></a>01542     }
<a name="l01543"></a>01543 
<a name="l01544"></a>01544     <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1ForwardingInfo.html#18ec95dc1b1b8a7e9df9873a0d9b59479d97a6b0898703ac5a95fdd043ffb04a" title="Invalid action.">ForwardingInfo::INVALID_ACTION</a>;
<a name="l01545"></a>01545 }
<a name="l01546"></a>01546 
<a name="l01547"></a>01547 <a class="code" href="classdtn_1_1Bundle.html#ee1ec0a9c045adc48dc8751f54f59e64" title="Values for the bundle priority field.">Bundle::priority_values_t</a>
<a name="l01548"></a>01548 ExternalRouter::ModuleServer::convert_priority(rtrmessage::bundlePriorityType <a class="code" href="dtnsend_8cc.html#4ba3115667f04372a659752ad557db6c">priority</a>)
<a name="l01549"></a>01549 {
<a name="l01550"></a>01550     <span class="keywordflow">if</span>(priority == bundlePriorityType(bundlePriorityType::bulk)){
<a name="l01551"></a>01551         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Bundle.html#ee1ec0a9c045adc48dc8751f54f59e64cdd03b2fd0d69a8085cbce1d8941690f" title="lowest priority">Bundle::COS_BULK</a>;
<a name="l01552"></a>01552     }
<a name="l01553"></a>01553     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(priority == bundlePriorityType(bundlePriorityType::normal)){
<a name="l01554"></a>01554         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Bundle.html#ee1ec0a9c045adc48dc8751f54f59e649acfb0603df69344a00cae0aa885d78f" title="regular priority">Bundle::COS_NORMAL</a>;
<a name="l01555"></a>01555     }
<a name="l01556"></a>01556     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(priority == bundlePriorityType(bundlePriorityType::expedited)){
<a name="l01557"></a>01557         <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Bundle.html#ee1ec0a9c045adc48dc8751f54f59e64ae2b7023d5a38cf3497e08a4db9e907d" title="important">Bundle::COS_EXPEDITED</a>;
<a name="l01558"></a>01558     }
<a name="l01559"></a>01559 
<a name="l01560"></a>01560     <span class="keywordflow">return</span> <a class="code" href="classdtn_1_1Bundle.html#ee1ec0a9c045adc48dc8751f54f59e646fa0c342a18057585832e534b1225de2" title="invalid">Bundle::COS_INVALID</a>;
<a name="l01561"></a>01561 }
<a name="l01562"></a>01562 
<a name="l01563"></a>01563 ExternalRouter::HelloTimer::HelloTimer(ExternalRouter *router)
<a name="l01564"></a>01564     : router_(router)
<a name="l01565"></a>01565 {
<a name="l01566"></a>01566 }
<a name="l01567"></a>01567 
<a name="l01568"></a>01568 ExternalRouter::HelloTimer::~HelloTimer()
<a name="l01569"></a>01569 {
<a name="l01570"></a>01570     cancel();
<a name="l01571"></a>01571 }
<a name="l01572"></a>01572 
<a name="l01573"></a>01573 <span class="comment">// Timeout callback for the hello timer</span>
<a name="l01574"></a>01574 <span class="keywordtype">void</span>
<a name="l01575"></a>01575 ExternalRouter::HelloTimer::timeout(<span class="keyword">const</span> <span class="keyword">struct</span> timeval &amp;)
<a name="l01576"></a>01576 {
<a name="l01577"></a>01577     bpa message;
<a name="l01578"></a>01578     message.hello_interval(ExternalRouter::hello_interval);
<a name="l01579"></a>01579     router_-&gt;send(message);
<a name="l01580"></a>01580     schedule_in(ExternalRouter::hello_interval * 1000);
<a name="l01581"></a>01581 }
<a name="l01582"></a>01582 
<a name="l01583"></a>01583 ExternalRouter::ERRegistration::ERRegistration(ExternalRouter *router)
<a name="l01584"></a>01584     : Registration(Registration::EXTERNALROUTER_REGID,
<a name="l01585"></a>01585                     EndpointID(BundleDaemon::instance()-&gt;local_eid().str() +
<a name="l01586"></a>01586                         EXTERNAL_ROUTER_SERVICE_TAG),
<a name="l01587"></a>01587                    Registration::DEFER, 0, 0),
<a name="l01588"></a>01588       router_(router)
<a name="l01589"></a>01589 {
<a name="l01590"></a>01590     logpathf(<span class="stringliteral">"/reg/admin"</span>);
<a name="l01591"></a>01591     
<a name="l01592"></a>01592     <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> RegistrationAddedEvent(<span class="keyword">this</span>, <a class="code" href="namespacedtn.html#60ee39c9672604f59fe1b12d4e1d142b04a9578f3e2276d81cd632222ceb4e2e" title="the admin logic">EVENTSRC_ADMIN</a>));
<a name="l01593"></a>01593 }
<a name="l01594"></a>01594 
<a name="l01595"></a>01595 <span class="comment">// deliver a bundle to external routers</span>
<a name="l01596"></a>01596 <span class="keywordtype">void</span>
<a name="l01597"></a>01597 ExternalRouter::ERRegistration::deliver_bundle(Bundle *bundle)
<a name="l01598"></a>01598 {
<a name="l01599"></a>01599     bundle_delivery_event e(bundle, bundle,
<a name="l01600"></a>01600                             bundle_ts_to_long(bundle-&gt;extended_id()));
<a name="l01601"></a>01601 
<a name="l01602"></a>01602     e.bundle().payload_file( bundle-&gt;payload().filename() );
<a name="l01603"></a>01603 
<a name="l01604"></a>01604     bpa message;
<a name="l01605"></a>01605     message.bundle_delivery_event(e);
<a name="l01606"></a>01606     router_-&gt;send(message);
<a name="l01607"></a>01607 
<a name="l01608"></a>01608     <a class="code" href="classdtn_1_1BundleDaemon.html#370a80f7dd9fd9297e76d7f830d737a8" title="Queues the event at the tail of the queue for processing by the daemon thread.">BundleDaemon::post</a>(<span class="keyword">new</span> BundleDeliveredEvent(bundle, <span class="keyword">this</span>));
<a name="l01609"></a>01609 }
<a name="l01610"></a>01610 
<a name="l01611"></a>01611 <span class="comment">// Global shutdown callback function</span>
<a name="l01612"></a>01612 <span class="keywordtype">void</span> external_rtr_shutdown(<span class="keywordtype">void</span> *)
<a name="l01613"></a>01613 {
<a name="l01614"></a>01614     BundleDaemon::instance()-&gt;router()-&gt;shutdown();
<a name="l01615"></a>01615 }
<a name="l01616"></a>01616 
<a name="l01617"></a>01617 <span class="comment">// Initialize ExternalRouter parameters</span>
<a name="l01618"></a>01618 u_int16_t ExternalRouter::server_port       = 8001;
<a name="l01619"></a>01619 u_int16_t ExternalRouter::hello_interval    = 30;
<a name="l01620"></a>01620 std::string ExternalRouter::schema          = <a class="code" href="dtn-config_8h.html#009edfa12b8468d6f3cb50bd62ab0e4c">INSTALL_SYSCONFDIR</a> <span class="stringliteral">"/router.xsd"</span>;
<a name="l01621"></a>01621 <span class="keywordtype">bool</span> ExternalRouter::server_validation      = <span class="keyword">true</span>;
<a name="l01622"></a>01622 <span class="keywordtype">bool</span> ExternalRouter::client_validation      = <span class="keyword">false</span>;
<a name="l01623"></a>01623 
<a name="l01624"></a>01624 } <span class="comment">// namespace dtn</span>
<a name="l01625"></a>01625 <span class="preprocessor">#endif // XERCES_C_ENABLED &amp;&amp; EXTERNAL_DP_ENABLED</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Fri Jan 30 09:26:56 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>