00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #include <oasys/util/OptParser.h>
00022 #include "NullConvergenceLayer.h"
00023 #include "bundling/BundleDaemon.h"
00024
00025 namespace dtn {
00026
00027 struct NullConvergenceLayer::Params NullConvergenceLayer::defaults_;
00028
00029
00030 void
00031 NullConvergenceLayer::Params::serialize(oasys::SerializeAction* a)
00032 {
00033 a->process("can_transmit", &can_transmit_);
00034 }
00035
00036
00037 NullConvergenceLayer::NullConvergenceLayer()
00038 : ConvergenceLayer("NullConvergenceLayer", "null")
00039 {
00040 defaults_.can_transmit_ = true;
00041 }
00042
00043
00044 bool
00045 NullConvergenceLayer::parse_link_params(Params* params,
00046 int argc, const char** argv,
00047 const char** invalidp)
00048 {
00049 oasys::OptParser p;
00050 p.addopt(new oasys::BoolOpt("can_transmit", ¶ms->can_transmit_));
00051 return p.parse(argc, argv, invalidp);
00052 }
00053
00054
00055 bool
00056 NullConvergenceLayer::init_link(const LinkRef& link,
00057 int argc, const char* argv[])
00058 {
00059 ASSERT(link != NULL);
00060 ASSERT(!link->isdeleted());
00061 ASSERT(link->cl_info() == NULL);
00062
00063 log_debug("adding %s link %s", link->type_str(), link->nexthop());
00064
00065
00066
00067 Params* params = new Params(defaults_);
00068
00069 const char* invalid;
00070 if (! parse_link_params(params, argc, argv, &invalid)) {
00071 log_err("error parsing link options: invalid option '%s'", invalid);
00072 delete params;
00073 return false;
00074 }
00075 link->set_cl_info(params);
00076 return true;
00077 }
00078
00079
00080 bool
00081 NullConvergenceLayer::reconfigure_link(const LinkRef& link,
00082 int argc, const char* argv[])
00083 {
00084 ASSERT(link != NULL);
00085 ASSERT(!link->isdeleted());
00086 ASSERT(link->cl_info() != NULL);
00087
00088 Params* params = dynamic_cast<Params*>(link->cl_info());
00089 ASSERT(params != NULL);
00090
00091 const char* invalid;
00092 if (! parse_link_params(params, argc, argv, &invalid)) {
00093 log_err("reconfigure_link: invalid parameter %s", invalid);
00094 return false;
00095 }
00096
00097 return true;
00098 }
00099
00100
00101 void
00102 NullConvergenceLayer::delete_link(const LinkRef& link)
00103 {
00104 ASSERT(link != NULL);
00105 ASSERT(!link->isdeleted());
00106 ASSERT(link->cl_info() != NULL);
00107
00108 log_debug("deleting link %s", link->name());
00109
00110 delete link->cl_info();
00111 link->set_cl_info(NULL);
00112 }
00113
00114
00115 bool
00116 NullConvergenceLayer::open_contact(const ContactRef& contact)
00117 {
00118 LinkRef link = contact->link();
00119 ASSERT(link != NULL);
00120 ASSERT(!link->isdeleted());
00121
00122 BundleDaemon::post(new ContactUpEvent(contact));
00123 return true;
00124 }
00125
00126
00127 void
00128 NullConvergenceLayer::bundle_queued(const LinkRef& link, const BundleRef& bundle)
00129 {
00130 ASSERT(link != NULL);
00131 ASSERT(!link->isdeleted());
00132
00133 Params* params = (Params*)link->cl_info();
00134
00135 if (! params->can_transmit_) {
00136 return;
00137 }
00138
00139 const BlockInfoVec* blocks = bundle->xmit_blocks()->find_blocks(link);
00140 ASSERT(blocks != NULL);
00141 size_t total_len = BundleProtocol::total_length(blocks);
00142
00143 log_debug("send_bundle *%p to *%p (total len %zu)",
00144 bundle.object(), link.object(), total_len);
00145
00146 link->del_from_queue(bundle, total_len);
00147 link->add_to_inflight(bundle, total_len);
00148
00149 BundleDaemon::post(
00150 new BundleTransmittedEvent(bundle.object(), link->contact(), link, total_len, 0));
00151 }
00152
00153
00154 void
00155 NullConvergenceLayer::cancel_bundle(const LinkRef& link, const BundleRef& bundle)
00156 {
00157 Params* params = (Params*)link->cl_info();
00158
00159
00160
00161 if (! params->can_transmit_&& link->queue()->contains(bundle)) {
00162 log_debug("NullConvergenceLayer::cancel_bundle: "
00163 "cancelling bundle *%p on *%p", bundle.object(), link.object());
00164 BundleDaemon::post(new BundleSendCancelledEvent(bundle.object(), link));
00165 return;
00166 } else {
00167 log_debug("NullConvergenceLayer::cancel_bundle: "
00168 "not cancelling bundle *%p on *%p since !is_queued()",
00169 bundle.object(), link.object());
00170 }
00171 }
00172
00173 }