From e4df83410f395a020653273ce126c786e4d9f6ae Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Thu, 26 Sep 2019 11:06:12 +0200 Subject: [PATCH] Keep DNS_FLAGS_CD and DNS_FLAGS_RD --- src/dns.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/dns.rs b/src/dns.rs index 976f37d..e82b5cb 100644 --- a/src/dns.rs +++ b/src/dns.rs @@ -10,9 +10,11 @@ pub const DNS_OFFSET_FLAGS: usize = 2; pub const DNS_MAX_PACKET_SIZE: usize = 0x1600; const DNS_MAX_INDIRECTIONS: usize = 16; -const DNS_FLAGS_TC: u16 = 2u16 << 8; -const DNS_FLAGS_QR: u16 = 128u16 << 8; -const DNS_FLAGS_RA: u16 = 128; +const DNS_FLAGS_TC: u16 = 1u16 << 9; +const DNS_FLAGS_QR: u16 = 1u16 << 15; +const DNS_FLAGS_RA: u16 = 1u16 << 7; +const DNS_FLAGS_RD: u16 = 1u16 << 8; +const DNS_FLAGS_CD: u16 = 1u16 << 4; const DNS_OFFSET_QUESTION: usize = DNS_HEADER_SIZE; const DNS_TYPE_OPT: u16 = 41; const DNS_TYPE_TXT: u16 = 16; @@ -108,13 +110,16 @@ pub fn set_tid(packet: &mut [u8], tid: u16) { BigEndian::write_u16(&mut packet[0..], tid); } +#[inline] +pub fn set_flags(packet: &mut [u8], flags: u16) { + BigEndian::write_u16(&mut packet[DNS_OFFSET_FLAGS..], flags); +} + #[inline] pub fn authoritative_response(packet: &mut [u8]) { - let current_flags = BigEndian::read_u16(&packet[DNS_OFFSET_FLAGS..]); - BigEndian::write_u16( - &mut packet[DNS_OFFSET_FLAGS..], - current_flags | DNS_FLAGS_QR | DNS_FLAGS_RA, - ); + let current_rd_cd_flags = + BigEndian::read_u16(&packet[DNS_OFFSET_FLAGS..]) & (DNS_FLAGS_CD | DNS_FLAGS_RD); + set_flags(packet, current_rd_cd_flags | DNS_FLAGS_QR | DNS_FLAGS_RA); } #[inline]