Packet.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #include "Packet.h"
  2. #include "MalformedPacket.h"
  3. namespace Network {
  4. namespace Dns {
  5. Packet::Packet() :
  6. m_identifier(0),
  7. m_query(0),
  8. m_authorativeAnswer(0),
  9. m_truncation(0),
  10. m_recursionDesired(0),
  11. m_recursionAvailable(0),
  12. m_zero(0),
  13. m_operationCode(OperationCode::QUERY),
  14. m_responseCode(ResponseCode::NO_ERROR)
  15. {
  16. }
  17. Packet::Packet(DataReader reader, unsigned pos)
  18. {
  19. try
  20. {
  21. m_identifier = reader.Read16(pos);
  22. uint8_t flags = reader.Read8(pos);
  23. m_query = (flags & (1 << 7)) >> 7; // 10000000
  24. m_operationCode = static_cast<OperationCode::type>(((flags & (((1 << 4) - 1) << 3)) >> 3)); // 01111000
  25. m_authorativeAnswer = (flags & (1 << 2)) >> 2; // 00000100
  26. m_truncation = (flags & (1 << 1)) >> 1; // 00000010
  27. m_recursionDesired = (flags & (1 << 0)) >> 0; // 00000001
  28. flags = reader.Read8(pos);
  29. m_recursionAvailable = (flags & (1 << 7)) >> 7; // 10000000
  30. m_zero = (flags & (((1 << 3) - 1) << 4)) >> 4; // 01110000
  31. m_responseCode = static_cast<ResponseCode::type>((flags & ((1 << 4) - 1))); // 00001111
  32. unsigned queryCount = reader.Read16(pos);
  33. unsigned answerCount = reader.Read16(pos);
  34. unsigned authorityCount = reader.Read16(pos);
  35. unsigned additionalRecordsCount = reader.Read16(pos);
  36. for (size_t i = 0; i < queryCount; i++)
  37. {
  38. m_queries.emplace_back();
  39. pos = m_queries.back().ReadFromData(reader, pos);
  40. }
  41. for (size_t i = 0; i < answerCount; i++)
  42. {
  43. m_answers.emplace_back();
  44. pos = m_answers.back().ReadFromData(reader, pos);
  45. }
  46. for (size_t i = 0; i < authorityCount; i++)
  47. {
  48. m_authorities.emplace_back();
  49. pos = m_authorities.back().ReadFromData(reader, pos);
  50. }
  51. for (size_t i = 0; i < additionalRecordsCount; i++)
  52. {
  53. m_additionalRecords.emplace_back();
  54. pos = m_additionalRecords.back().ReadFromData(reader, pos);
  55. }
  56. }
  57. catch (const DataReaderOutOfBounds& droob)
  58. {
  59. throw MalformedPacket();
  60. }
  61. }
  62. Data Packet::GetData() const
  63. {
  64. Data data;
  65. data.append(static_cast<uint16_t>(m_identifier));
  66. uint8_t flags =
  67. (static_cast<uint8_t>(m_query) << 7) |
  68. (static_cast<uint8_t>(m_operationCode) << 3) |
  69. (static_cast<uint8_t>(m_authorativeAnswer) << 2) |
  70. (static_cast<uint8_t>(m_truncation) << 1) |
  71. (static_cast<uint8_t>(m_recursionDesired) << 0);
  72. data.append(flags);
  73. flags =
  74. (static_cast<uint8_t>(m_recursionAvailable) << 7) |
  75. (static_cast<uint8_t>(m_zero) << 4) |
  76. (static_cast<uint8_t>(m_responseCode) << 0);
  77. data.append(flags);
  78. data.append(static_cast<uint16_t>(GetQueryCount()));
  79. data.append(static_cast<uint16_t>(GetAnswerCount()));
  80. data.append(static_cast<uint16_t>(GetAuthorityCount()));
  81. data.append(static_cast<uint16_t>(GetAdditionalRecordsCount()));
  82. for (const QueryImpl& q : m_queries)
  83. data.append(q.GetData());
  84. for (const ResourceRecordImpl& r : m_answers)
  85. data.append(r.GetData());
  86. for (const ResourceRecordImpl& r : m_authorities)
  87. data.append(r.GetData());
  88. for (const ResourceRecordImpl& r : m_additionalRecords)
  89. data.append(r.GetData());
  90. return data;
  91. }
  92. uint16_t Packet::GetIdentifier() const
  93. {
  94. return m_identifier;
  95. }
  96. bool Packet::GetQuery() const
  97. {
  98. return m_query;
  99. }
  100. OperationCode::type Packet::GetOperationCode() const
  101. {
  102. return m_operationCode;
  103. }
  104. bool Packet::GetAuthorativeAnswer() const
  105. {
  106. return m_authorativeAnswer;
  107. }
  108. bool Packet::GetTruncation() const
  109. {
  110. return m_truncation;
  111. }
  112. bool Packet::GetRecursionDesired() const
  113. {
  114. return m_recursionDesired;
  115. }
  116. bool Packet::GetRecursionAvailable() const
  117. {
  118. return m_recursionAvailable;
  119. }
  120. uint8_t Packet::GetZero() const
  121. {
  122. return m_zero;
  123. }
  124. ResponseCode::type Packet::GetResponseCode() const
  125. {
  126. return m_responseCode;
  127. }
  128. std::vector<QueryImpl> Packet::GetQueries() const
  129. {
  130. return m_queries;
  131. }
  132. std::vector<ResourceRecordImpl> Packet::GetAnswers() const
  133. {
  134. return m_answers;
  135. }
  136. std::vector<ResourceRecordImpl> Packet::GetAuthorities() const
  137. {
  138. return m_authorities;
  139. }
  140. std::vector<ResourceRecordImpl> Packet::GetAdditionalRecords() const
  141. {
  142. return m_additionalRecords;
  143. }
  144. unsigned Packet::GetQueryCount() const
  145. {
  146. return static_cast<unsigned>(m_queries.size());
  147. }
  148. unsigned Packet::GetAnswerCount() const
  149. {
  150. return static_cast<unsigned>(m_answers.size());
  151. }
  152. unsigned Packet::GetAuthorityCount() const
  153. {
  154. return static_cast<unsigned>(m_authorities.size());
  155. }
  156. unsigned Packet::GetAdditionalRecordsCount() const
  157. {
  158. return static_cast<unsigned>(m_additionalRecords.size());
  159. }
  160. void Packet::SetIdentifier(uint16_t identifier)
  161. {
  162. m_identifier = identifier;
  163. }
  164. void Packet::SetQuery(bool query)
  165. {
  166. m_query = query;
  167. }
  168. void Packet::SetOperationCode(OperationCode::type operationCode)
  169. {
  170. m_operationCode = operationCode;
  171. }
  172. void Packet::SetAuthorativeAnswer(bool authorativeAnswer)
  173. {
  174. m_authorativeAnswer = authorativeAnswer;
  175. }
  176. void Packet::SetTruncation(bool truncation)
  177. {
  178. m_truncation = truncation;
  179. }
  180. void Packet::SetRecursionDesired(bool recursionDesired)
  181. {
  182. m_recursionDesired = recursionDesired;
  183. }
  184. void Packet::SetRecursionAvailable(bool recursionAvailable)
  185. {
  186. m_recursionAvailable = recursionAvailable;
  187. }
  188. void Packet::SetZero(uint8_t zero)
  189. {
  190. m_zero = zero;
  191. }
  192. void Packet::SetResponseCode(ResponseCode::type responseCode)
  193. {
  194. m_responseCode = responseCode;
  195. }
  196. void Packet::AddQuery(const QueryImpl& query)
  197. {
  198. m_queries.emplace_back(query);
  199. }
  200. void Packet::AddAnswer(const ResourceRecordImpl& record)
  201. {
  202. m_answers.emplace_back(record);
  203. }
  204. void Packet::AddAuthority(const ResourceRecordImpl& record)
  205. {
  206. m_authorities.emplace_back(record);
  207. }
  208. void Packet::AddAdditionalRecords(const ResourceRecordImpl& record)
  209. {
  210. m_additionalRecords.emplace_back(record);
  211. }
  212. std::ostream& operator<<(std::ostream& stream, const Packet& packet)
  213. {
  214. stream << "Packet (\n";
  215. stream << " identifier = " << packet.m_identifier
  216. << ", query = " << packet.m_query
  217. << ", operationCode = " << static_cast<int>(packet.m_operationCode)
  218. << ", authorativeAnswer = " << packet.m_authorativeAnswer
  219. << ", truncation = " << packet.m_truncation
  220. << ", recursionDesired = " << packet.m_recursionDesired << "\n";
  221. stream << " recursionAvailable = " << packet.m_recursionAvailable
  222. << ", zero = " << packet.m_zero
  223. << ", responseCode = " << static_cast<int>(packet.m_responseCode) << "\n";
  224. for (const QueryImpl& q : packet.m_queries)
  225. stream << " Query: " << q << "\n";
  226. for (const ResourceRecordImpl& r : packet.m_answers)
  227. stream << " Answer: " << r << "\n";
  228. for (const ResourceRecordImpl& r : packet.m_authorities)
  229. stream << " Authority: " << r << "\n";
  230. for (const ResourceRecordImpl& r : packet.m_additionalRecords)
  231. stream << " AdditionalRecord: " << r << "\n";
  232. stream << ")\n";
  233. return stream;
  234. }
  235. } // namespace Dns
  236. } // namespace Network