00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "UnknownBlockProcessor.h"
00018
00019 #include "BlockInfo.h"
00020 #include "BundleProtocol.h"
00021
00022 namespace dtn {
00023
00024 template <> UnknownBlockProcessor*
00025 oasys::Singleton<UnknownBlockProcessor>::instance_ = NULL;
00026
00027
00028 UnknownBlockProcessor::UnknownBlockProcessor()
00029 : BlockProcessor(0xff)
00030 {
00031 }
00032
00033
00034 void
00035 UnknownBlockProcessor::prepare(const Bundle* bundle,
00036 Link* link,
00037 BlockInfoVec* blocks,
00038 const BlockInfo* source)
00039 {
00040 ASSERT(source != NULL);
00041 ASSERT(source->owner() == this);
00042
00043 if (source->flags() & BundleProtocol::BLOCK_FLAG_DISCARD_BLOCK_ONERROR) {
00044 return;
00045 }
00046
00047 BlockProcessor::prepare(bundle, link, blocks, source);
00048 }
00049
00050
00051 void
00052 UnknownBlockProcessor::generate(const Bundle* bundle,
00053 Link* link,
00054 BlockInfo* block,
00055 bool last)
00056 {
00057 (void)bundle;
00058 (void)link;
00059
00060
00061
00062 const BlockInfo* source = block->source();
00063 ASSERT(source != NULL);
00064 ASSERT(source->owner() == this);
00065
00066
00067 ASSERT((source->flags() &
00068 BundleProtocol::BLOCK_FLAG_DISCARD_BUNDLE_ONERROR) == 0);
00069 ASSERT((source->flags() &
00070 BundleProtocol::BLOCK_FLAG_DISCARD_BLOCK_ONERROR) == 0);
00071
00072
00073
00074 ASSERT(source->contents().len() != 0);
00075 ASSERT(source->data_offset() != 0);
00076
00077 u_int8_t flags = source->flags();
00078 if (last) {
00079 flags |= BundleProtocol::BLOCK_FLAG_LAST_BLOCK;
00080 } else {
00081 flags &= ~BundleProtocol::BLOCK_FLAG_LAST_BLOCK;
00082 }
00083 flags |= BundleProtocol::BLOCK_FLAG_FORWARDED_UNPROCESSED;
00084
00085 generate_preamble(block, source->type(), flags,
00086 source->data_length());
00087 ASSERT(block->data_offset() == source->data_offset());
00088 ASSERT(block->data_length() == source->data_length());
00089
00090 BlockInfo::DataBuffer* contents = block->writable_contents();
00091 memcpy(contents->buf() + block->data_offset(),
00092 source->contents().buf() + block->data_offset(),
00093 block->data_length());
00094 contents->set_len(block->full_length());
00095 }
00096
00097
00098 bool
00099 UnknownBlockProcessor::validate(const Bundle* bundle, BlockInfo* block,
00100 BundleProtocol::status_report_reason_t* reception_reason,
00101 BundleProtocol::status_report_reason_t* deletion_reason)
00102 {
00103
00104 if (!BlockProcessor::validate(bundle, block,
00105 reception_reason, deletion_reason)) {
00106 return false;
00107 }
00108
00109
00110 if (block->flags() & BundleProtocol::BLOCK_FLAG_REPORT_ONERROR) {
00111 *reception_reason = BundleProtocol::REASON_BLOCK_UNINTELLIGIBLE;
00112 }
00113
00114 if (block->flags() & BundleProtocol::BLOCK_FLAG_DISCARD_BUNDLE_ONERROR) {
00115 *deletion_reason = BundleProtocol::REASON_BLOCK_UNINTELLIGIBLE;
00116 return false;
00117 }
00118
00119 return true;
00120 }
00121
00122 }