Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
b0bf491
Add module 'new_base'
bal-e Dec 6, 2024
ea600fd
[new_base] Add module 'name'
bal-e Dec 9, 2024
6fb0957
[new_base/name] Define labels
bal-e Dec 9, 2024
66c4d19
[new_base] Add module 'message'
bal-e Dec 10, 2024
48051b4
[new_base/name/label] Use 'zerocopy'
bal-e Dec 10, 2024
be78a8f
[new_base] Add module 'parse'
bal-e Dec 10, 2024
7a1a847
[new_base/name] Add module 'parsed'
bal-e Dec 10, 2024
ed95534
[new_base] Add module 'question'
bal-e Dec 10, 2024
37bc7d2
Add module 'record'
bal-e Dec 11, 2024
26653c3
[new_base] Add high-level parsing traits
bal-e Dec 11, 2024
e1c701f
[new_base/name] Add module 'reversed'
bal-e Dec 11, 2024
7ef218d
[new_base/name/reversed] Implement complex parsing
bal-e Dec 11, 2024
3c0b4cd
[new_base/name] Add some 'Debug' impls
bal-e Dec 11, 2024
4b8cc79
[new_base] Implement parsing for 'Question' and 'Record'
bal-e Dec 11, 2024
b56260c
[new_base/parse] Update with new question/record types
bal-e Dec 11, 2024
1622e58
[new_base/name] Fix bugs (thanks clippy)
bal-e Dec 12, 2024
f27f922
[new_base] Make 'record' a private module
bal-e Dec 12, 2024
dd123c1
Use 'zerocopy' 0.8.5 or newer
bal-e Dec 16, 2024
46b2e45
Add module 'new_rdata' with most RFC 1035 types
bal-e Dec 16, 2024
9e238ae
[new_base] Define 'CharStr'
bal-e Dec 16, 2024
bb63a1e
[new_rdata] Define 'Hinfo'
bal-e Dec 16, 2024
5ec06dc
[new_rdata/rfc1035] Implement (basic) 'Txt' records
bal-e Dec 25, 2024
6ad095e
[new_rdata/rfc1035] Add 'ParseFrom' impls where missing
bal-e Dec 25, 2024
90e15bb
[new_rdata/rfc1035] Don't use 'zerocopy' around names
bal-e Dec 25, 2024
c86a57e
[new_base/charstr] Impl 'Eq' and 'Debug'
bal-e Dec 25, 2024
a607c77
[new_base] Add module 'serial'
bal-e Dec 25, 2024
7731a35
[new_base] Add module 'build'
bal-e Dec 26, 2024
c27dd1f
[new_base/build] Add a 'Builder' for DNS messages
bal-e Dec 26, 2024
993eda7
[new_base/name/reversed] Impl building traits
bal-e Dec 26, 2024
d407492
[new_base/build] Add convenience impls for '[u8]'
bal-e Dec 26, 2024
55c7854
[new_base/question] Impl building traits
bal-e Dec 26, 2024
74e6783
[new_base/record] Support building and overhaul parsing
bal-e Dec 26, 2024
6772427
[new_base/charstr] Support building
bal-e Dec 26, 2024
59c33b2
[new_rdata/rfc1035] Impl building traits
bal-e Dec 26, 2024
2d84573
[build/builder] Improve unclear documentation
bal-e Dec 26, 2024
a8433c9
[new_rdata/rfc1035] gate 'Ipv4Addr' behind 'std'
bal-e Dec 27, 2024
86f14bb
[new_rdata/rfc1035] Gate more things under 'std'
bal-e Dec 27, 2024
0728275
[new_base/build/builder] Remove unnecessary explicit lifetime in impl
bal-e Dec 27, 2024
f73ca63
[new_rdata/rfc1035] Support 'Display' outside 'std'
bal-e Dec 28, 2024
1133b4c
[new_rdata] Inline 'rfc1035' and support 'rfc3596'
bal-e Dec 30, 2024
1a95ae8
[new_rdata] Rename submodules with more intuitive names
bal-e Dec 30, 2024
6bf26c5
[new_base] Set up basic EDNS support
bal-e Dec 30, 2024
aa0c590
[new_base/record] Add trait 'ParseRecordData'
bal-e Dec 30, 2024
d11f9e5
[new_base/parse] Make 'Split*' imply 'Parse*'
bal-e Dec 30, 2024
ff7d913
[new_base/record] Add a default for 'parse_record_data()'
bal-e Dec 30, 2024
ba260f0
[new_rdata/basic] Use more capitalization in record data type names
bal-e Dec 30, 2024
6d358a3
[new_rdata] Define enum 'RecordData'
bal-e Dec 30, 2024
bd08a47
[new_rdata/basic] Elide lifetime as per Clippy
bal-e Dec 30, 2024
54f131e
[new_rdata] Elide lifetimes as per clippy
bal-e Dec 31, 2024
6881f6a
Set up a 'domain-macros' crate
bal-e Jan 1, 2025
155fb5a
[new_base/parse] Define 'ParseBytesByRef' for deriving
bal-e Jan 1, 2025
cf170e6
[macros] Define 'ImplSkeleton' and prepare a basic derive
bal-e Jan 1, 2025
89ee797
Expand 'ParseBytesByRef' and largely finish its derive macro
bal-e Jan 2, 2025
baaa8d2
[macros] Add module 'repr' for checking for stable layouts
bal-e Jan 2, 2025
d4fc42f
[new_base/parse] Implement '*BytesByRef' for '[T; N]'
bal-e Jan 2, 2025
a1bfc4f
[macros] Add a derive macro for 'SplitBytesByRef'
bal-e Jan 2, 2025
2164b87
Use '{Parse,Split}BytesByRef' instead of 'zerocopy'
bal-e Jan 2, 2025
499e858
Rename '{Split,Parse}From' to '{Split,Parse}Bytes'
bal-e Jan 2, 2025
2d60092
[macros] Add derives for '{Split,Parse}Bytes'
bal-e Jan 2, 2025
7e0ef89
[macros] Factor out 'new_lifetime()'
bal-e Jan 2, 2025
b0f6b67
Use parsing trait derives across the 'new_*' codebase
bal-e Jan 2, 2025
4a5d343
Impl and use derives for 'AsBytes' and 'BuildBytes'
bal-e Jan 2, 2025
d1f94ba
[macros] Minor fixes as per clippy
bal-e Jan 2, 2025
c0368ea
[new_base/parse] Fix missing doc link
bal-e Jan 2, 2025
42d48e0
[macros] Fix no-fields output for 'ParseBytes'
bal-e Jan 2, 2025
90b531a
[new_base/serial] Support measuring unix time
bal-e Jan 2, 2025
f8fc525
[new_edns] Implement DNS cookie support
bal-e Jan 2, 2025
d445587
[macros] Factor out struct inspection and building
bal-e Jan 3, 2025
21dfd3d
[new_edns] Impl RFC 8914 "Extended DNS errors"
bal-e Jan 6, 2025
1659621
[new_edns] Impl parsing/building for 'EdnsOption'
bal-e Jan 6, 2025
7bb6d2c
[new_base] Add module 'wire' to replace 'zerocopy'
bal-e Jan 6, 2025
af13cf1
[new_base] Correct docs for build traits
bal-e Jan 6, 2025
8daf6b5
[macros] Avoid glob imports where possible
bal-e Jan 6, 2025
8bf87be
[macros/lib.rs] Remove the last 'syn' glob import
bal-e Jan 6, 2025
8afc305
[new_base/parse] Rework '{Parse,Split}FromMessage'
bal-e Jan 7, 2025
1037ba0
[new_base/name] Delete unused 'parsed.rs'
bal-e Jan 7, 2025
5faf44d
[new_base/wire] Define 'SizePrefixed'
bal-e Jan 7, 2025
a98d246
[new_rdata/edns] Implement iteration and formatting
bal-e Jan 7, 2025
3ea33ac
[new_base/build] Use 'BuildResult' to ensure 'commit()' is called
bal-e Jan 9, 2025
6caee28
[new_base/build] Define 'MessageBuilder'
bal-e Jan 9, 2025
95d0fe8
[new_base/message] Add 'as_bytes_mut()' and 'slice_to_mut()'
bal-e Jan 9, 2025
3f14cca
[new_base/name] Add 'UnparsedName'
bal-e Jan 13, 2025
2c9594e
[new_base/message] Impl 'as_array()' for 'SectionCounts'
bal-e Jan 13, 2025
a01a7f2
[new_base/build] Define 'RecordBuilder'
bal-e Jan 13, 2025
7ef9b5b
[new_base/name] Accept Clippy simplifications
bal-e Jan 13, 2025
60f7664
Merge branch 'main' into new-base
bal-e Jan 13, 2025
7540d58
Merge branch 'main' into new-base
bal-e Jan 13, 2025
bfa8c5c
[new_base/build/record] Track record data size
bal-e Jan 13, 2025
07cf2de
[new_base/parse] Remove 'ParseMessage' etc.
bal-e Jan 16, 2025
4772520
[new_base/build] Document 'BuildCommitted' thoroughly
bal-e Jan 16, 2025
554bb71
[new_base/build/builder] Rewrite with a lot of documentation
bal-e Jan 20, 2025
ef702e3
[new_base/build] Add module documentation
bal-e Jan 20, 2025
0e7346c
[new_base/parse] Add a bit of module documentation
bal-e Jan 20, 2025
967d1d5
[new_base/parse] Add missing doc links
bal-e Jan 20, 2025
4fa09b2
[new_base/wire/ints] Make 'set()' non-const
bal-e Jan 20, 2025
9e44e48
[new_base/wire/parse] Fix documentation typo
bal-e Jan 22, 2025
9af8ea1
[new_edns/cookie] Rename 'CookieRequest' to 'ClientCookie'
bal-e Jan 22, 2025
c5f1552
[new_base/parse] Refactor '{Parse,Split}FromMessage'
bal-e Jan 22, 2025
e272947
[new_base/build] Overhaul message building
bal-e Jan 23, 2025
41db42a
[new_base/build/message] Add resumption methods
bal-e Jan 24, 2025
2fcd114
[new_base/build] Test 'MessageBuilder' and fix some bugs
bal-e Jan 24, 2025
074486c
[new_base/build] Track section counts while building
bal-e Jan 24, 2025
9a5e193
[new_base/wire/parse] Fix miscount of doc test
bal-e Jan 24, 2025
30f211f
Merge branch 'main' into new-base
bal-e Jan 24, 2025
1a54da1
[new_base/wire/parse] Support parsing into arrays
bal-e Jan 24, 2025
00aaaf7
[new_base/build] Accept clippy suggestions
bal-e Jan 24, 2025
1112224
[new_rdata] Use 'core::net::Ipv4Addr'
bal-e Jan 24, 2025
c808946
[new_rdata] Document format in 'Txt'
bal-e Jan 24, 2025
2d3e911
[new_base/name] Add 'LabelBuf' and support building on 'Label'
bal-e Jan 24, 2025
7a8450a
[new_base/name] Add mutable access from 'RevNameBuf'
bal-e Jan 24, 2025
0c161f5
[new_base] Simply parse impls using 'split_*()'
bal-e Jan 24, 2025
951be71
[new_base/name] Define the standard 'Name' type
bal-e Jan 24, 2025
f0d7c28
[new_base/name] Add deconstruction methods for 'UnparsedName'
bal-e Jan 24, 2025
b9c0810
Add module 'new_net'
bal-e Jan 14, 2025
436f7fc
[new_net] Add module 'server'
bal-e Jan 14, 2025
2618d4e
[new_net/server] Set up a service layering architecture
bal-e Jan 27, 2025
dbe8ee7
[new_net/server/impls] Avoid MSRV 1.80 IntoIterator
bal-e Jan 28, 2025
b375643
Remove accidental trailing whitespace
bal-e Jan 28, 2025
bb3490b
Merge branch 'new-base' into new-net-server
bal-e Jan 28, 2025
f3909e4
[new_net/server] Overhaul service traits for async support
bal-e Jan 28, 2025
73e135a
[new_net/server/request] Implement construction
bal-e Jan 28, 2025
15e6b10
[new_net/server/request] Rewrite init a bit more cleanly
bal-e Jan 29, 2025
e0745c8
[new_net/server] Impl 'RequestMessage::sole_question()'
bal-e Jan 29, 2025
64ea348
[new_net/server/request] Add the most important getters
bal-e Jan 29, 2025
133c8e9
[new_net/server] Fix broken doc links
bal-e Jan 29, 2025
44125fc
[new_net/server/request] Make method docs clearer
bal-e Jan 29, 2025
5aadd4b
[new_net/server] Define a simple UDP transport
bal-e Jan 30, 2025
6fe81d9
Move 'new_net::server' to 'new_server'
bal-e Jan 30, 2025
7a4fa11
[new_server] Overhaul API for more flexibility
bal-e Feb 3, 2025
feb68af
[new_server/exchange] Make 'new()' non-const
bal-e Feb 3, 2025
4f97176
[new_server/exchange] Enhance documentation
bal-e Feb 3, 2025
cdf18b7
[new_server/exchange] Fix broken doc links
bal-e Feb 4, 2025
0cd88ab
[new_base] Fix various minor bugs
bal-e Feb 4, 2025
5f016e5
[new_base] Import various fixes from 'new-net-server'
bal-e Feb 4, 2025
2c13124
[new_server] Implement cookie middleware
bal-e Feb 6, 2025
7665550
[new_edns] Remove debug 'println'
bal-e Feb 6, 2025
a4c7d49
[new_base] Add some basic unit tests
bal-e Feb 6, 2025
121efe0
Merge branch 'new-base' into new-net-server
bal-e Feb 7, 2025
2219209
[new_edns/cookie] Import 'AsBytes' unconditionally
bal-e Feb 7, 2025
0be40c4
[new_edns] Remove leftover debugging
bal-e Feb 7, 2025
54a4296
[new_server] Use 'log'
bal-e Feb 7, 2025
1c55f04
Add example program 'new-server'
bal-e Feb 7, 2025
e833f81
[new_server] Implement 'MinAnyLayer'
bal-e Feb 14, 2025
14445b0
Merge branch 'main' into new-base
bal-e Mar 3, 2025
c6fc39f
[new_rdata/basic] Refactor into submodules
bal-e Feb 28, 2025
d0045de
[new_rdata] Impl equality for 'RecordData'
bal-e Mar 3, 2025
a855393
[new_rdata] Add 'map_name(s)_by_ref()'
bal-e Mar 3, 2025
946ab21
[new_base/wire] Make 'SizePrefixed' generic over size type
bal-e Mar 6, 2025
79c4fec
[new_rdata] Implement stubs of DNSSEC record types
bal-e Mar 6, 2025
31fea55
[src/new_base/size_prefixed] Fix clippy lint
bal-e Mar 7, 2025
10be8bf
[new_rdata/dnssec] Export helper types
bal-e Mar 7, 2025
3d57844
[new_rdata] Avoid '{BuildInto,ParseFrom}Message' where possible
bal-e Mar 7, 2025
646018d
[new_rdata] Incorporate DNSSEC record types
bal-e Mar 7, 2025
09d79b7
[new_base/name/absolute] Add 'NameBuf'
bal-e Mar 10, 2025
3c63048
[new_base] Add 'bumpalo' and impl 'clone_to_bump()'
bal-e Mar 12, 2025
55815ac
[utils] Add 'UnsizedClone' and 'CloneFrom'
bal-e Mar 17, 2025
d14d365
Define and use a derive macro for 'UnsizedClone'
bal-e Mar 17, 2025
4fd86d4
[utils] Define 'clone_to_bump()' for integrating with 'bumpalo'
bal-e Mar 18, 2025
00d8602
Replace most 'clone_to_bump()'s via 'UnsizedClone'
bal-e Mar 18, 2025
940dd47
Fix broken doc links
bal-e Mar 19, 2025
b405e95
[new_base/name/absolute] Impl 'Ord' for 'Name'
bal-e Mar 19, 2025
c904010
[new_base/message] Impl 'UnsizedClone' for 'Message'
bal-e Mar 19, 2025
0366c20
[new_base/name] Introduce 'CanonicalName'
bal-e Mar 19, 2025
2623bb8
Implement DNSSEC canonical ordering and building
bal-e Mar 19, 2025
2f62993
[new_base/record] Fix broken doc link
bal-e Mar 20, 2025
11560a3
[new_base] Add module 'compat'
bal-e Mar 20, 2025
9c67fc6
[new_rdata/edns] Add 'Opt::EMPTY'
bal-e Mar 20, 2025
e81f1bc
[new_base/build] Make 'MessageBuilder::finish()' return a mutable ref
bal-e Mar 20, 2025
7090d7b
[new_base/build] Add 'must_use' in a few vital places
bal-e Mar 20, 2025
4a9cf40
[new_base/compat] Remove hard-to-port re-exports
bal-e Mar 20, 2025
a5a692f
[new_edns] Add 'EdnsRecord::clone_to_bump()'
bal-e Mar 20, 2025
285019d
[new_base/message] Make 'HeaderFlags' setters modify in place
bal-e Mar 20, 2025
c88b36b
[new_base/build] Fix broken doc test
bal-e Mar 21, 2025
546ec4f
Merge branch 'new-base' into new-net-server
bal-e Mar 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 122 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 15 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
[workspace]
resolver = "2"
members = [".", "./macros"]

[package]
name = "domain"
version = "0.10.3"
Expand All @@ -15,12 +19,11 @@ readme = "README.md"
keywords = ["DNS", "domain"]
license = "BSD-3-Clause"

[lib]
name = "domain"
path = "src/lib.rs"

[dependencies]
domain-macros = { path = "./macros", version = "0.10.3" }

arbitrary = { version = "1.4.1", optional = true, features = ["derive"] }
bumpalo = { version = "3.12", optional = true }
octseq = { version = "0.5.2", default-features = false }
time = { version = "0.3.1", default-features = false }
rand = { version = "0.8", optional = true }
Expand Down Expand Up @@ -52,11 +55,12 @@ tracing-subscriber = { version = "0.3.18", optional = true, features = ["env-fil
default = ["std", "rand"]

# Support for libraries
bumpalo = ["dep:bumpalo", "std"]
bytes = ["dep:bytes", "octseq/bytes"]
heapless = ["dep:heapless", "octseq/heapless"]
serde = ["dep:serde", "octseq/serde"]
smallvec = ["dep:smallvec", "octseq/smallvec"]
std = ["dep:hashbrown", "bytes?/std", "octseq/std", "time/std"]
std = ["dep:hashbrown", "bumpalo?/std", "bytes?/std", "octseq/std", "time/std"]
tracing = ["dep:log", "dep:tracing"]

# Cryptographic backends
Expand All @@ -72,7 +76,7 @@ zonefile = ["bytes", "serde", "std"]

# Unstable features
unstable-client-transport = ["moka", "net", "tracing"]
unstable-server-transport = ["arc-swap", "chrono/clock", "libc", "net", "siphasher", "tracing"]
unstable-server-transport = ["dep:bumpalo", "arc-swap", "chrono/clock", "dep:log", "libc", "net", "rand", "siphasher", "tracing"]
unstable-sign = ["std", "dep:secrecy", "unstable-validate", "time/formatting"]
unstable-stelline = ["tokio/test-util", "tracing", "tracing-subscriber", "tsig", "unstable-client-transport", "unstable-server-transport", "zonefile"]
unstable-validate = ["bytes", "std", "ring"]
Expand All @@ -97,6 +101,7 @@ tokio-rustls = { version = "0.26", default-features = false, features = [
tokio-test = "0.4"
tokio-tfo = { version = "0.2.0" }
webpki-roots = { version = "0.26" }
env_logger = { version = "0.11" }

# For the "mysql-zone" example
#sqlx = { version = "0.6", features = [ "runtime-tokio-native-tls", "mysql" ] }
Expand All @@ -116,6 +121,10 @@ required-features = ["resolv"]
name = "lookup"
required-features = ["resolv"]

[[example]]
name = "new-server"
required-features = ["net", "unstable-server-transport", "unstable-client-transport"]

[[example]]
name = "resolv-sync"
required-features = ["resolv-sync"]
Expand Down
92 changes: 92 additions & 0 deletions examples/new-server.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
use std::ops::ControlFlow;

use log::trace;

use domain::new_server::{
exchange::{OutgoingResponse, ResponseCode},
layers::{
cookie::{CookieMetadata, CookiePolicy, CookieSecrets},
CookieLayer,
},
transport, Exchange, LocalService, LocalServiceLayer, Service,
ServiceLayer,
};

pub struct MyService;

impl Service for MyService {
async fn respond(&self, exchange: &mut Exchange<'_>) {
let cookie = exchange
.metadata
.iter()
.find_map(|m| m.try_as::<CookieMetadata>());

if let Some(CookieMetadata::ServerCookie { .. }) = cookie {
trace!(target: "MyService", "Request had a valid cookie");
} else {
trace!(target: "MyService", "Request did not have a valid cookie");
}

exchange.respond(ResponseCode::Success);

// Copy all questions from the request to the response.
exchange
.response
.questions
.append(&mut exchange.request.questions);
}
}

impl LocalService for MyService {
async fn respond_local(&self, exchange: &mut Exchange<'_>) {
self.respond(exchange).await
}
}

pub struct MyLayer;

impl ServiceLayer for MyLayer {
async fn process_incoming(
&self,
exchange: &mut Exchange<'_>,
) -> ControlFlow<()> {
trace!(target: "MyLayer",
"Incoming request (message ID {})",
exchange.request.id);
ControlFlow::Continue(())
}

async fn process_outgoing(&self, response: OutgoingResponse<'_, '_>) {
trace!(target: "MyLayer",
"Outgoing response (message ID {})",
response.response.id);
}
}

impl LocalServiceLayer for MyLayer {
async fn process_local_incoming(
&self,
exchange: &mut Exchange<'_>,
) -> ControlFlow<()> {
self.process_incoming(exchange).await
}

async fn process_local_outgoing(
&self,
response: OutgoingResponse<'_, '_>,
) {
self.process_outgoing(response).await
}
}

#[tokio::main]
async fn main() {
env_logger::init();

let addr = "127.0.0.1:8080".parse().unwrap();
let cookie_layer =
CookieLayer::new(CookiePolicy::default(), CookieSecrets::generate());
let service = (MyLayer, cookie_layer, MyService);
let result = transport::serve_udp(addr, service).await;
println!("Ended on result {result:?}");
}
28 changes: 28 additions & 0 deletions macros/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
[package]
name = "domain-macros"

# Copied from 'domain'.
version = "0.10.3"
rust-version = "1.68.2"
edition = "2021"

authors = ["NLnet Labs <[email protected]>"]
description = "Procedural macros for the `domain` crate."
documentation = "https://docs.rs/domain-macros"
homepage = "https://github.com/nlnetlabs/domain/"
repository = "https://github.com/nlnetlabs/domain/"
keywords = ["DNS", "domain"]
license = "BSD-3-Clause"

[lib]
proc-macro = true

[dependencies.proc-macro2]
version = "1.0"

[dependencies.syn]
version = "2.0"
features = ["full", "visit"]

[dependencies.quote]
version = "1.0"
Loading