CommHeader.cc

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   // compute and serialize header checksum
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 }