00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <arpa/inet.h>
00018 #include "Util.h"
00019 #include "HelloTLV.h"
00020 #include "BundleCore.h"
00021
00022 namespace prophet
00023 {
00024
00025 HelloTLV::HelloTLV()
00026 : BaseTLV(BaseTLV::HELLO_TLV),
00027 hf_(HF_UNKNOWN),
00028 timer_(0) {}
00029
00030 HelloTLV::HelloTLV(hello_hf_t hf,
00031 u_int8_t timer,
00032 const std::string& sender)
00033 : BaseTLV(BaseTLV::HELLO_TLV,0,
00034 HelloTLVHeaderSize + FOUR_BYTE_ALIGN(sender.size())),
00035 hf_(hf),
00036 timer_(timer),
00037 sender_(sender)
00038 {
00039 }
00040
00041 bool
00042 HelloTLV::deserialize(const u_char* bp, size_t len)
00043 {
00044 HelloTLVHeader* hdr = (HelloTLVHeader*) bp;
00045
00046
00047 if (bp == NULL) return false;
00048
00049
00050 if (hdr->type != HELLO_TLV) return false;
00051
00052
00053 if (len < HelloTLVHeaderSize) return false;
00054
00055
00056 size_t hello_len = ntohs(hdr->length);
00057 if (len < hello_len) return false;
00058 if (hello_len < hdr->name_length) return false;
00059
00060
00061 hf_ = (hello_hf_t) hdr->HF;
00062 length_ = hello_len;
00063 timer_ = hdr->timer;
00064
00065 std::string name((char*)&hdr->sender_name[0],(int)hdr->name_length);
00066 sender_.assign(name);
00067
00068 return true;
00069 }
00070
00071 size_t
00072 HelloTLV::serialize(u_char* bp, size_t len) const
00073 {
00074
00075 if (sender_ == "") return 0;
00076 if (typecode_ != HELLO_TLV) return 0;
00077
00078
00079 size_t hello_sz = FOUR_BYTE_ALIGN(sender_.length() + HelloTLVHeaderSize);
00080
00081
00082 if (hello_sz > len) return 0;
00083
00084
00085 HelloTLVHeader* hdr = (HelloTLVHeader*) bp;
00086 length_ = hello_sz;
00087 memset(hdr,0,length_);
00088 hdr->type = typecode_;
00089 hdr->HF = hf_;
00090 hdr->length = htons(length_);
00091 hdr->timer = timer_;
00092
00093 hdr->name_length = sender_.length() & 0xff;
00094
00095 size_t buflen = hello_sz;
00096
00097 memcpy(&hdr->sender_name[0],sender_.c_str(),sender_.length());
00098
00099
00100 while (buflen-- > HelloTLVHeaderSize + sender_.length())
00101 bp[buflen] = '\0';
00102
00103 return hello_sz;
00104 }
00105
00106 };