simple-dns 0.1.0

Rust implementation to parse and write DNS packets
Documentation

Pure Rust implementation to work with DNS packets

You can parse or write a DNS packet by using [Packet] or [PacketBuf] structs

Packet

Packet holds references for the original data and it is more suitable for situations where you need to manipulate the packet before generating the final bytes buffer

# use simple_dns::*;
# use simple_dns::rdata::*;
let question = Question::new(Name::new_unchecked("_srv._udp.local"), QTYPE::TXT, QCLASS::IN, false);
let resource = ResourceRecord::new(Name::new_unchecked("_srv._udp.local"), CLASS::IN, 10, RData::A(A { address: 10 }));

let mut packet = Packet::new_query(1, false);
packet.questions.push(question);
packet.additional_records.push(resource);

let bytes = packet.build_bytes_vec();
assert!(bytes.is_ok());

It doesn't matter what order the resources are added, the packet will be built only when build_bytes_vec is called

To parse the contents of a buffer into a packet, you need call call [Packet::parse]

# use simple_dns::Packet;

let bytes = b"\x00\x03\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x06\x67\x6f\x6f\x67\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00\x01";
let packet = Packet::parse(&bytes[..]);
assert!(packet.is_ok());

PacketBuf

PacketBuf holds an internal buffer that is populated right when a resource is added.
It DOES matter the order in which the resources are added

# use simple_dns::*;
# use simple_dns::rdata::*;
let question = Question::new(Name::new_unchecked("_srv._udp.local"), QTYPE::TXT, QCLASS::IN, false);
let resource = ResourceRecord::new(Name::new_unchecked("_srv._udp.local"), CLASS::IN, 10, RData::A(A { address: 10 }));

let mut packet = PacketBuf::new(PacketHeader::new_query(1, false));
assert!(packet.add_answer(&resource).is_ok());
assert!(packet.add_question(&question).is_err()); //This will fail, since an answer is already added

It is possible to create a PacketBuf from a buffer by calling [PacketBuf::from], but be aware that this will clone the contents from the buffer