Crate simple_dns[−][src]
Expand description
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
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
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
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
Modules
rdata |
Structs
CharacterString | CharacterString is expressed in one or two ways: |
Name | A Name represents a domain-name, which consists of character strings separated by dots. |
Packet | Represents a DNS message packet |
PacketBuf | Owned version of |
PacketHeader | Contains general information about the packet |
PacketSectionIter | Iterate over the questions of a |
Question | Question represents a query in the DNS Packet |
ResourceRecord | Resource Records are used to represent the answer, authority, and additional sections in DNS packets. |
Enums
CLASS | Possible CLASS values for a Resource in a DNS packet |
OPCODE | Possible OPCODE values for a DNS packet, use to specify the type of operation. |
QCLASS | Possible QCLASS values for a Question in a DNS packet |
QTYPE | Possible QTYPE values for a Question in a DNS packet |
RCODE | Possible RCODE values for a DNS packet |
SimpleDnsError | Error types for SimpleDns |
TYPE | Possible TYPE values in DNS Resource Records |
Traits
DnsPacketContent | The maximum DNS packet size is 9000 bytes less the maximum sizes of the IP (60) and UDP (8) headers. Represents anything that can be part of a dns packet (Question, Resource Record, RData) |
Type Definitions
Result | Alias type for Result<T, SimpleDnsError>; |