Go to the documentation of this file.00001
00021 #include "Common/Compat.h"
00022 #include "Common/Checksum.h"
00023 #include "Common/Error.h"
00024 #include "Common/Serialization.h"
00025 #include "Common/Logger.h"
00026
00027 #include "CommHeader.h"
00028
00029 using namespace Hypertable;
00030
00031 void CommHeader::encode(uint8_t **bufp) {
00032 uint8_t *base = *bufp;
00033 Serialization::encode_i8(bufp, version);
00034 Serialization::encode_i8(bufp, header_len);
00035 Serialization::encode_i16(bufp, alignment);
00036 Serialization::encode_i16(bufp, flags);
00037 Serialization::encode_i32(bufp, 0);
00038 Serialization::encode_i32(bufp, id);
00039 Serialization::encode_i32(bufp, gid);
00040 Serialization::encode_i32(bufp, total_len);
00041 Serialization::encode_i32(bufp, timeout_ms);
00042 Serialization::encode_i32(bufp, payload_checksum);
00043 Serialization::encode_i64(bufp, command);
00044
00045 header_checksum = fletcher32(base, (*bufp)-base);
00046 base += 6;
00047 Serialization::encode_i32(&base, header_checksum);
00048 }
00049
00050 void CommHeader::decode(const uint8_t **bufp, size_t *remainp) {
00051 const uint8_t *base = *bufp;
00052 if (*remainp < FIXED_LENGTH)
00053 HT_THROWF(Error::COMM_BAD_HEADER,
00054 "Header size %d is less than the minumum fixed length %d",
00055 (int)*remainp, (int)FIXED_LENGTH);
00056 HT_TRY("decoding comm header",
00057 version = Serialization::decode_i8(bufp, remainp);
00058 header_len = Serialization::decode_i8(bufp, remainp);
00059 alignment = Serialization::decode_i16(bufp, remainp);
00060 flags = Serialization::decode_i16(bufp, remainp);
00061 header_checksum = Serialization::decode_i32(bufp, remainp);
00062 id = Serialization::decode_i32(bufp, remainp);
00063 gid = Serialization::decode_i32(bufp, remainp);
00064 total_len = Serialization::decode_i32(bufp, remainp);
00065 timeout_ms = Serialization::decode_i32(bufp, remainp);
00066 payload_checksum = Serialization::decode_i32(bufp, remainp);
00067 command = Serialization::decode_i64(bufp, remainp));
00068 memset((void *)(base+6), 0, 4);
00069 uint32_t checksum = fletcher32(base, *bufp-base);
00070 if (checksum != header_checksum)
00071 HT_THROWF(Error::COMM_HEADER_CHECKSUM_MISMATCH, "%u != %u", checksum,
00072 header_checksum);
00073 }