Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add the net::server module. #274

Merged
merged 407 commits into from
Apr 11, 2024
Merged

Add the net::server module. #274

merged 407 commits into from
Apr 11, 2024

Conversation

ximon18
Copy link
Member

@ximon18 ximon18 commented Feb 16, 2024

This PR adds a net::server module to domain that enables the creation of UDP and TCP DNS servers using base transport server, middelware and service building blocks.

For examples of the code in use see:

Various things could be improved even without review feedback:

  • The examples/serve.rs is not neat and tidy at all and should maybe be split into multiple examples. - Resolution: Tidied up a bit.
  • I'm not sure if the net::server::prelude is a good idea or not. - Resolution: Removed.
  • The code doesn't currently adhere completely to our desired coding guidelines.
  • The tests in net::server::tests haven't been looked at for a long time. - Resolution: Reviewed, added some comments, did some minor cleanup.
  • The skeleton for dynamic reconfiguration support is present but not yet used. - Resolution: It is now used.
  • The EDNS(0) timeout support might have the wrong idea about what EDNS(0) timeouts are, I haven't looked back at that for a long time. - Resolution: This has been checked and updated.
  • The TODOs present in the code should be revisited. - Resolution: Many TODOs have been resolved, some have been deliberately left behind as they require more thought.
  • No bechmarking / performance testing has been done yet. - Resolution: Localhost testing with dnsperf and the 1M query set has been done yielding ~1.5M query/sec on the test machine for both UDP and TCP. This was done using the zone tree support in PR Add a queryable zone tree #286.
  • This PR doesn't have the discussed zonefile support yet. - Resolution: See PR Add a queryable zone tree #286.
  • Review remaining calls to unwrap() - Resolution: Unwraps removed, explained with SAFETY comment, or converted to expect() if truly fatal.

This PR also introduces tokio-tracing for async friendly context aware logging, e.g. one can capture the dns message id high up in a call tree and have it automatically included in a log message from deep in the call tree which I think is potentially very useful.

This PR is also probably incompatible with --no-default-features as that would disable the std feature yet this PR currently uses std functionality.

However, I think it's a good moment to take a look at it as-is.

@ximon18 ximon18 requested review from a team and removed request for partim and Philip-NLnetLabs February 19, 2024 20:33
…ly back pressure rather than accepting connections when at the limit.
…pect but in general not modify requests, except in very limited ways. The one currently suppored modifcation is now clearly only possible via a setter on UdpTransportContext. Also simplified the `Request` type to always have an inner `Message` rather than some arbitrary `T`, as an arbitrary `T` may be modifiable while a `Message` is immutable.
…'s behaviour was incorrect with respect to QDCOUNT==0 requests, and it's not clear how it should behave with respect to the deny list or if it should exist in this middleware processor or at all.
…y handled where it should be in the EDNS middleware processor.
…nnot be pushed. Try to adhere to RFC 6891 and push an OPT record in that case.
@partim partim merged commit 0bd1a68 into main Apr 11, 2024
24 checks passed
@partim partim deleted the serve-poc branch April 11, 2024 14:41
@partim partim restored the serve-poc branch April 11, 2024 15:52
@partim partim deleted the serve-poc branch April 11, 2024 15:58
partim added a commit that referenced this pull request Apr 30, 2024
Breaking changes

* All types and functions referring to domain names have been changed from
  using the term “dname” to just “name.” For instance, `Dname` has become
  `Name`, `ToDname` has become `ToName`, and `ToDname::to_dname` has become
  `ToName::to_name`. ([#290])
* The `ToName` and `ToRelativeName` traits have been changed to have a
  pair of methods a la `try_to_name` and `to_name` for octets builders
  with limited and unlimited buffers, reflecting the pattern used
  elsewhere. ([#285])
* The types for IANA-registered parameters in `base::iana` have been
  changed from enums to a newtypes around their underlying integer type
  and associated constants for the registered values. (This was really
  always the better way to structure this.) ([#276], [#298])
* The `Txt` record data type now rejects empty record data as invalid. As
  a consequence `TxtBuilder` converts an empty builder into TXT record
  data consisting of one empty character string which requires
  `TxtBuilder::finish` to be able to return an error. ([#267])
* `Txt` record data serialization has been redesigned. It now serialized as
  a sequence of character strings. It also deserializes from such a sequence.
  If supported by the format, it alternatively deserializes from a string that
  is broken up into 255 octet chunks if necessary. ([#268])
* The text formatting for `CharStr` has been redesigned. The `Display`
  impl now uses a modified version of the representation format that
  doesn’t escape white space but also doesn’t enclose the string in
  quotes. Methods for explicitly formatting in quoted and unquoted
  presentation format are provided. ([#270])
* The `validate::RrsigExt` trait now accepts anything that impls
  `AsRef<Record<..>>` to allow the use of smart pointers. ([#288] by
  [@hunts])
* The stub resolver now uses the new client transports. This doesn’t change
  how it is used but does change how it queries the configured servers.
  ([#215])
* The sub resolver’s server configuration `Transport` type has been
  changed to be either `Transport::UdpTcp` for trying UDP and if that
  leads to a truncated answer try TCP and `Transport::Tcp` for only trying
  TCP. The stub resolver uses these accordingly now ([#296])
* Many error types have been changed from enums to structs that hide
  internal error details. Enums have been kept for errors where
  distinguishing variants might be meaningful for dealing with the error.
  ([#277])
* Renamed `Dnskey::is_zsk` to `is_zone_key`. ([#292])
* Split RRSIG timestamp handling from `Serial` into a new type
  `rdata::dnssec::Timestamp`. ([#294])
* Upgraded `octseq` to 0.5. ([#257])
* The minimum Rust version is now 1.70. ([#304])

New

* Add impls for `AsRef<RelativeDname<[u8]>>` and `Borrow<RelativeDname<[u8]>>`
  to `RelativeDname<_>`. ([#251] by [@torin-carey])
* Added `name::Chain::fmt_with_dots` to format an absolute chained name
  with a final dot. ([#253])
* Added a new `ParseAnyRecordData` trait for record data types that can
  parse any type of record data. ([#256])
* Added implementations of `OctetsFrom` and `Debug` to `AllOptData` and
  the specific options types that didn’t have them yet. ([#257])
* Added missing ordering impls to `ZoneRecordData`, `AllRecordData`,
  `Opt`, and `SvcbRdata`. ([#293])
* Added `Name::reverse_from_addr` that creates a domain name for the
  reverse lookup of an IP address. ([#289])
* Added `OptBuilder::clone_from` to replace the OPT record with the
  content of another OPT record. ([#299])
* Added `Message::for_slice_ref` that returns a `Message<&[u8]>`. ([#300])

Bug fixes

* Fixed the display implementation of `name::Chain<_, _>`. ([#253])
* Fixed the display implementation of `rdata::Txt<..>`. It now displays
  each embedded character string separately in quoted form. ([#259])
* Fixed the extended part returned by `OptRcode::to_parts` (it was shifted
  by 4 bits too many) and return all 12 bits for the `Int` variant in
  `OptRcode::to_int`. ([#258])
* Fixed a bug in the `inplace` zonefile parser that made it reject
  character string of length 255. ([#284])

Unstable features

* Added the module `net::client` with experimental support for client
  message transport, i.e., sending of requests and receiving responses
  as well as caching of responses.
  This is gated by the `unstable-client-transport` feature. ([#215],[#275])
* Added the module `net::server` with experimental support for server
  transports, processing requests through a middleware chain and a service
  trait.
  This is gated by the `unstable-server-transport` feature. ([#274])
* Added the module `zonetree` providing basic traits representing a
  collection of zones and their data. The `zonetree::in_memory` module 
  provides an in-memory implementation. The `zonetree::parsed` module
  provides a way to classify RRsets before inserting them into a tree.
  This is gated by the `unstable-zonetree` feature. ([#286])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants