mod.rs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
  2. // file at the top-level directory of this distribution and at
  3. // http://rust-lang.org/COPYRIGHT.
  4. //
  5. // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
  6. // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
  7. // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
  8. // option. This file may not be copied, modified, or distributed
  9. // except according to those terms.
  10. pub use self::{answer::DnsAnswer, query::DnsQuery};
  11. use alloc::{string::String, vec::Vec};
  12. use core::{slice, u16};
  13. mod answer;
  14. mod query;
  15. use core::ptr;
  16. use mem;
  17. use alloc::boxed::Box;
  18. #[allow(non_camel_case_types)]
  19. #[derive(Copy, Clone, Debug, Default)]
  20. #[repr(packed)]
  21. pub struct n16 {
  22. inner: u16,
  23. }
  24. impl n16 {
  25. pub fn as_bytes(&self) -> &[u8] {
  26. let left_8bits = (self.inner >> 8) as u8;
  27. let right_8bits = self.inner as u8;
  28. unsafe {
  29. let bytes: [u8; 2] = [left_8bits, right_8bits];
  30. slice::from_raw_parts(bytes.as_ptr(), 2)
  31. }
  32. }
  33. // pub fn as_bytes(&self) -> &[u8] {
  34. // unsafe { slice::from_raw_parts((&self.inner as *const u16) as *const u8, 2) }
  35. // }
  36. pub fn from_bytes(bytes: &[u8]) -> Self {
  37. n16 {
  38. inner: unsafe {
  39. slice::from_raw_parts(bytes.as_ptr() as *const u16, bytes.len() / 2)[0]
  40. },
  41. }
  42. }
  43. }
  44. impl From<u16> for n16 {
  45. fn from(value: u16) -> Self {
  46. n16 {
  47. inner: value.to_be(),
  48. }
  49. }
  50. }
  51. impl From<n16> for u16 {
  52. fn from(value: n16) -> Self {
  53. u16::from_be(value.inner)
  54. }
  55. }
  56. #[derive(Clone, Debug)]
  57. pub struct Dns {
  58. pub transaction_id: u16,
  59. pub flags: u16,
  60. pub queries: Vec<DnsQuery>,
  61. pub answers: Vec<DnsAnswer>,
  62. }
  63. impl Dns {
  64. pub fn compile(&self) -> Vec<u8> {
  65. let mut data = Vec::new();
  66. macro_rules! push_u8 {
  67. ($value:expr) => {
  68. data.push($value);
  69. };
  70. };
  71. macro_rules! push_n16 {
  72. ($value:expr) => {
  73. data.extend_from_slice(n16::from($value).as_bytes());
  74. };
  75. };
  76. push_n16!(self.transaction_id);
  77. push_n16!(self.flags);
  78. push_n16!(self.queries.len() as u16);
  79. push_n16!(self.answers.len() as u16);
  80. push_n16!(0);
  81. push_n16!(0);
  82. for query in self.queries.iter() {
  83. for part in query.name.split('.') {
  84. push_u8!(part.len() as u8);
  85. data.extend_from_slice(part.as_bytes());
  86. }
  87. push_u8!(0);
  88. push_n16!(query.q_type);
  89. push_n16!(query.q_class);
  90. }
  91. data
  92. }
  93. pub fn parse(data: &[u8]) -> Result<Self, String> {
  94. let name_ind = 0b1100_0000;
  95. let mut i = 0;
  96. macro_rules! pop_u8 {
  97. () => {{
  98. i += 1;
  99. if i > data.len() {
  100. return Err(format!("{}: {}: pop_u8", file!(), line!()));
  101. }
  102. data[i - 1]
  103. }};
  104. };
  105. macro_rules! pop_n16 {
  106. () => {{
  107. i += 2;
  108. if i > data.len() {
  109. return Err(format!("{}: {}: pop_n16", file!(), line!()));
  110. }
  111. u16::from(n16::from_bytes(&data[i - 2..i]))
  112. }};
  113. };
  114. macro_rules! pop_data {
  115. () => {{
  116. let mut data = Vec::new();
  117. let data_len = pop_n16!();
  118. for _data_i in 0..data_len {
  119. data.push(pop_u8!());
  120. }
  121. data
  122. }};
  123. };
  124. macro_rules! pop_name {
  125. () => {{
  126. let mut name = String::new();
  127. let old_i = i;
  128. loop {
  129. let name_len = pop_u8!();
  130. if name_len & name_ind == name_ind {
  131. i -= 1;
  132. i = (pop_n16!() - ((name_ind as u16) << 8)) as usize;
  133. continue;
  134. }
  135. if name_len == 0 {
  136. break;
  137. }
  138. if !name.is_empty() {
  139. name.push('.');
  140. }
  141. for _name_i in 0..name_len {
  142. name.push(pop_u8!() as char);
  143. }
  144. }
  145. if i <= old_i {
  146. i = old_i + 2;
  147. }
  148. name
  149. }};
  150. };
  151. let transaction_id = pop_n16!();
  152. let flags = pop_n16!();
  153. let queries_len = pop_n16!();
  154. let answers_len = pop_n16!();
  155. pop_n16!();
  156. pop_n16!();
  157. let mut queries = Vec::new();
  158. for _query_i in 0..queries_len {
  159. queries.push(DnsQuery {
  160. name: pop_name!(),
  161. q_type: pop_n16!(),
  162. q_class: pop_n16!(),
  163. });
  164. }
  165. let mut answers = Vec::new();
  166. for _answer_i in 0..answers_len {
  167. answers.push(DnsAnswer {
  168. name: pop_name!(),
  169. a_type: pop_n16!(),
  170. a_class: pop_n16!(),
  171. ttl_a: pop_n16!(),
  172. ttl_b: pop_n16!(),
  173. data: pop_data!(),
  174. });
  175. }
  176. Ok(Dns {
  177. transaction_id,
  178. flags,
  179. queries,
  180. answers,
  181. })
  182. }
  183. }