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 "UnknownBlockProcessor.h"
00022
00023 #include "BlockInfo.h"
00024 #include "BundleProtocol.h"
00025 #include "Bundle.h"
00026
00027 namespace dtn {
00028
00029 template <> UnknownBlockProcessor*
00030 oasys::Singleton<UnknownBlockProcessor>::instance_ = NULL;
00031
00032
00033 UnknownBlockProcessor::UnknownBlockProcessor()
00034 : BlockProcessor(BundleProtocol::UNKNOWN_BLOCK)
00035
00036
00037
00038
00039 {
00040 }
00041
00042
00043 int
00044 UnknownBlockProcessor::prepare(const Bundle* bundle,
00045 BlockInfoVec* xmit_blocks,
00046 const BlockInfo* source,
00047 const LinkRef& link,
00048 list_owner_t list)
00049 {
00050 ASSERT(source != NULL);
00051 ASSERT(source->owner() == this);
00052
00053 if (source->flags() & BundleProtocol::BLOCK_FLAG_DISCARD_BLOCK_ONERROR) {
00054 return BP_FAIL;
00055 }
00056
00057
00058
00059 if (source->type() == BundleProtocol::BUNDLE_AUTHENTICATION_BLOCK) {
00060 return BP_FAIL;
00061 }
00062
00063 return BlockProcessor::prepare(bundle, xmit_blocks, source, link, list);
00064 }
00065
00066
00067 int
00068 UnknownBlockProcessor::generate(const Bundle* bundle,
00069 BlockInfoVec* xmit_blocks,
00070 BlockInfo* block,
00071 const LinkRef& link,
00072 bool last)
00073 {
00074 (void)bundle;
00075 (void)link;
00076 (void)xmit_blocks;
00077
00078
00079
00080 const BlockInfo* source = block->source();
00081 ASSERT(source != NULL);
00082 ASSERT(source->owner() == this);
00083
00084
00085 ASSERT((source->flags() &
00086 BundleProtocol::BLOCK_FLAG_DISCARD_BUNDLE_ONERROR) == 0);
00087 ASSERT((source->flags() &
00088 BundleProtocol::BLOCK_FLAG_DISCARD_BLOCK_ONERROR) == 0);
00089
00090
00091
00092 ASSERT(source->contents().len() != 0);
00093 ASSERT(source->data_offset() != 0);
00094
00095 u_int8_t flags = source->flags();
00096 if (last) {
00097 flags |= BundleProtocol::BLOCK_FLAG_LAST_BLOCK;
00098 } else {
00099 flags &= ~BundleProtocol::BLOCK_FLAG_LAST_BLOCK;
00100 }
00101 flags |= BundleProtocol::BLOCK_FLAG_FORWARDED_UNPROCESSED;
00102
00103 block->set_eid_list(source->eid_list());
00104
00105 generate_preamble(xmit_blocks, block, source->type(), flags,
00106 source->data_length());
00107 ASSERT(block->data_length() == source->data_length());
00108
00109 BlockInfo::DataBuffer* contents = block->writable_contents();
00110 contents->reserve(block->full_length());
00111 memcpy(contents->buf() + block->data_offset(),
00112 source->contents().buf() + source->data_offset(),
00113 block->data_length());
00114 contents->set_len(block->full_length());
00115
00116 return BP_SUCCESS;
00117 }
00118
00119
00120 bool
00121 UnknownBlockProcessor::validate(const Bundle* bundle,
00122 BlockInfoVec* block_list,
00123 BlockInfo* block,
00124 status_report_reason_t* reception_reason,
00125 status_report_reason_t* deletion_reason)
00126 {
00127
00128 if (!BlockProcessor::validate(bundle, block_list, block,
00129 reception_reason, deletion_reason)) {
00130 return false;
00131 }
00132
00133
00134 if (block->flags() & BundleProtocol::BLOCK_FLAG_REPORT_ONERROR) {
00135 *reception_reason = BundleProtocol::REASON_BLOCK_UNINTELLIGIBLE;
00136 }
00137
00138 if (block->flags() & BundleProtocol::BLOCK_FLAG_DISCARD_BUNDLE_ONERROR) {
00139 *deletion_reason = BundleProtocol::REASON_BLOCK_UNINTELLIGIBLE;
00140 return false;
00141 }
00142
00143 return true;
00144 }
00145
00146 }