Code for parsing headers added.

This commit is contained in:
2022-03-13 21:56:17 +01:00
commit 71223309d7
6 changed files with 441 additions and 0 deletions

96
src/main.rs Normal file
View File

@ -0,0 +1,96 @@
use flume::{Receiver, Sender};
use std::net::UdpSocket;
use std::thread::{self, JoinHandle};
use std::convert::TryInto;
mod proto;
use proto::{DNSHeader, DNSOpCode, DNSRCode};
fn listen() -> (JoinHandle<()>, Sender<Vec<u8>>, Receiver<Vec<u8>>) {
let (tx, rx) = flume::unbounded();
let tx_clone = tx.clone();
let rx_clone = rx.clone();
(
thread::spawn(move || {
let socket = UdpSocket::bind("127.0.0.1:13337").unwrap();
let mut buf = [0; 512];
loop {
let (len, _src) = socket.recv_from(&mut buf).unwrap();
let buf = &mut buf[..len];
tx.send(Vec::from(buf)).unwrap();
}
}),
tx_clone,
rx_clone,
)
}
const QR_MASK:u16 = 0x0001;
const OPCODE_MASK:u16 = 0x000e;
const AA_MASK:u16 = 0x0020;
const TC_MASK:u16 = 0x0040;
const RD_MASK:u16 = 0x0080;
const RA_MASK:u16 = 0x0100;
const AD_MASK:u16 = 0x0400;
const CD_MASK:u16 = 0x0800;
const RCODE_MASK:u16 = 0xf000;
const OPCODE_OFFSET:u16 = 1;
const RCODE_OFFSET:u16 = 11;
fn main() {
let (thread_udp, _thread_udp_tx, thread_udp_rx) = listen();
for msg in thread_udp_rx.iter() {
println!("{:?}", msg);
// TODO: check for enough data in msg
let id = u16::from_be_bytes((&msg[..2]).try_into().unwrap());
let flags = u16::from_be_bytes((&msg[2..4]).try_into().unwrap());
let qr = (flags & QR_MASK) != 0;
let opcode:DNSOpCode = DNSOpCode::from((flags & OPCODE_MASK) >> OPCODE_OFFSET);
let authoritative_answer = (flags & AA_MASK) != 0;
let truncated = (flags & TC_MASK) != 0;
let recursion_desired= (flags & RD_MASK) != 0;
let recursion_available = (flags & RA_MASK) != 0;
let authentic_data = (flags & AD_MASK) != 0;
let checking_disabled = (flags & CD_MASK) != 0;
let response_code: DNSRCode = DNSRCode::from((flags & RCODE_MASK) >> RCODE_OFFSET);
let qd_zo_count = u16::from_be_bytes((&msg[4..6]).try_into().unwrap());
let an_pr_count = u16::from_be_bytes((&msg[6..8]).try_into().unwrap());
let ns_up_count = u16::from_be_bytes((&msg[8..10]).try_into().unwrap());
let ar_count = u16::from_be_bytes((&msg[10..12]).try_into().unwrap());
let hdr_struct = DNSHeader {
id,
qr,
opcode,
authoritative_answer,
truncated,
recursion_desired,
recursion_available,
authentic_data,
checking_disabled,
response_code,
qd_zo_count,
an_pr_count,
ns_up_count,
ar_count,
};
dbg!(hdr_struct);
}
let _ = thread_udp.join();
}