Packet.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Sergey Bugaev <bugaevc@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include "Answer.h"
  9. #include "Question.h"
  10. #include <AK/Optional.h>
  11. #include <AK/Types.h>
  12. #include <AK/Vector.h>
  13. namespace DNS {
  14. enum class ShouldRandomizeCase {
  15. No = 0,
  16. Yes
  17. };
  18. class Packet {
  19. public:
  20. Packet() = default;
  21. static ErrorOr<Packet> from_raw_packet(ReadonlyBytes bytes);
  22. ErrorOr<ByteBuffer> to_byte_buffer() const;
  23. bool is_query() const { return !m_query_or_response; }
  24. bool is_response() const { return m_query_or_response; }
  25. bool is_authoritative_answer() const { return m_authoritative_answer; }
  26. bool recursion_desired() const { return m_recursion_desired; }
  27. bool recursion_available() const { return m_recursion_available; }
  28. void set_is_query() { m_query_or_response = false; }
  29. void set_is_response() { m_query_or_response = true; }
  30. void set_authoritative_answer(bool authoritative_answer) { m_authoritative_answer = authoritative_answer; }
  31. void set_recursion_desired(bool recursion_desired) { m_recursion_desired = recursion_desired; }
  32. void set_recursion_available(bool recursion_available) { m_recursion_available = recursion_available; }
  33. u16 id() const { return m_id; }
  34. void set_id(u16 id) { m_id = id; }
  35. Vector<Question> const& questions() const { return m_questions; }
  36. Vector<Answer> const& answers() const { return m_answers; }
  37. u16 question_count() const
  38. {
  39. VERIFY(m_questions.size() <= UINT16_MAX);
  40. return m_questions.size();
  41. }
  42. u16 answer_count() const
  43. {
  44. VERIFY(m_answers.size() <= UINT16_MAX);
  45. return m_answers.size();
  46. }
  47. void add_question(Question const&);
  48. void add_answer(Answer const&);
  49. enum class Code : u8 {
  50. NOERROR = 0,
  51. FORMERR = 1,
  52. SERVFAIL = 2,
  53. NXDOMAIN = 3,
  54. NOTIMP = 4,
  55. REFUSED = 5,
  56. YXDOMAIN = 6,
  57. XRRSET = 7,
  58. NOTAUTH = 8,
  59. NOTZONE = 9,
  60. };
  61. Code code() const { return (Code)m_code; }
  62. void set_code(Code code) { m_code = (u8)code; }
  63. private:
  64. u16 m_id { 0 };
  65. u8 m_code { 0 };
  66. bool m_authoritative_answer { false };
  67. bool m_query_or_response { false };
  68. bool m_recursion_desired { true };
  69. bool m_recursion_available { true };
  70. Vector<Question> m_questions;
  71. Vector<Answer> m_answers;
  72. };
  73. }