Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include <string>
00008 #include "MultiHopBroadcastFrame.h"
00009 #include "EthernetFrame.h"
00010
00011 MultiHopBroadcastFrame::MultiHopBroadcastFrame(std::string topic_to_publish, std::string data, string source_host, uint8_t payload_type_field, uint16_t hop_range)
00012 {
00013 this->topic_ = topic_to_publish;
00014 this->hostname_source_ = source_host;
00015 this->payload_ = data;
00016 this->header_.payload_type = payload_type_field;
00017 this->header_.hop_limit = hop_range;
00018 header_.id = frame_count_stat++;
00019
00020 memcpy(this->eh_h_.eh_dest, bcast_mac, 6);
00021
00022 this->header_.current_hop = 1 ;
00023
00024 this->header_.frame_type = FRAME_TYPE_BROADCAST;
00025
00026 }
00027
00028
00029 MultiHopBroadcastFrame::MultiHopBroadcastFrame(unsigned char* buffer)
00030 {
00031 unsigned char* buffer_start = buffer;
00032 buffer_str_len_ = 0;
00033
00034
00035 eh_header* eh = (struct eh_header *) buffer;
00036 buffer += sizeof (eh_header);
00037 buffer_str_len_ += sizeof (eh_header);
00038
00039
00040 mh_bcast_header* rfh = (struct mh_bcast_header *) buffer;
00041 buffer += sizeof (mh_bcast_header);
00042 buffer_str_len_ += sizeof (mh_bcast_header);
00043
00044
00045 hostname_source_ = "";
00046 hostname_source_.append((const char*) buffer, rfh->hostname_source_len);
00047 buffer += rfh->hostname_source_len;
00048 buffer_str_len_ += rfh->hostname_source_len;
00049
00050
00051 topic_ = "";
00052 topic_.append((const char*) buffer, rfh->topic_len);
00053 buffer += rfh->topic_len;
00054 buffer_str_len_ += rfh->topic_len;
00055
00056
00057
00058 payload_ = "";
00059 payload_.append((const char*) buffer, rfh->payload_len);
00060 buffer += rfh->payload_len;
00061 buffer_str_len_ += rfh->payload_len;
00062
00063
00064 if(rfh->current_hop <= rfh->hop_limit)
00065 this->rebroadcast = true;
00066 else
00067 this->rebroadcast = false;
00068
00069
00070 uint32_t crc = 0;
00071 memcpy((unsigned char*) &crc, (unsigned char*) buffer, 4);
00072
00073 std::string crc_data_string = "";
00074 crc_data_string.append((const char*) buffer_start, this->HEADER_FIXED_LEN + rfh->hostname_source_len + rfh->topic_len + rfh->payload_len);
00075 correct_crc_ = (crc == (uint32_t) GetCrc32(crc_data_string));
00076
00077
00078
00079
00080 memcpy(&this->eh_h_, &(*eh), sizeof (eh_header));
00081 memcpy(&this->header_, &(*rfh), sizeof (mh_bcast_header));
00082 }
00083
00084 MultiHopBroadcastFrame::~MultiHopBroadcastFrame()
00085 {
00086 }
00087
00088 std::string MultiHopBroadcastFrame::getFrameAsNetworkString(unsigned char* source)
00089 {
00090
00091
00092
00093 header_.current_hop++;
00094 memcpy(this->eh_h_.eh_source, source, 6);
00095
00096
00097 this->header_.hostname_source_len = hostname_source_.length();
00098 this->header_.topic_len = topic_.length();
00099 this->header_.payload_len = payload_.length();
00100
00101
00102
00103
00104 unsigned char f_buffer[ETHER_MAX_LEN];
00105 unsigned char* buffer = f_buffer;
00106 unsigned char* buffer_start = f_buffer;
00107
00108
00109
00110
00111
00112 memcpy(buffer, &this->eh_h_, sizeof (eh_header));
00113 buffer += sizeof (eh_header);
00114
00115
00116 memcpy(buffer, &this->header_, sizeof (mh_bcast_header));
00117 buffer += sizeof (mh_bcast_header);
00118
00119
00120 memcpy(buffer, this->hostname_source_.data(),
00121 this->hostname_source_.length());
00122 buffer += this->hostname_source_.length();
00123
00124
00125
00126 memcpy(buffer, this->topic_.data(), this->topic_.length());
00127 buffer += topic_.length();
00128
00129
00130
00131 memcpy(buffer, this->payload_.data(), this->payload_.length());
00132 buffer += payload_.length();
00133
00134
00135
00136 uint32_t dynamic_field_len = this->hostname_source_.length() + topic_.length() + payload_.length();
00137 std::string crc_string = std::string((const char*) buffer_start, this->HEADER_FIXED_LEN + dynamic_field_len);
00138 uint32_t crc = GetCrc32(crc_string);
00139 memcpy(buffer, &crc, sizeof (uint32_t));
00140 buffer += sizeof (uint32_t);
00141
00142
00143 return string((const char*) buffer_start, this->HEADER_FIXED_LEN + dynamic_field_len + sizeof (uint32_t));
00144
00145 }