Skip to content

The Great octseq Conversion #160

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

Merged
merged 16 commits into from
Jan 10, 2023
Merged

The Great octseq Conversion #160

merged 16 commits into from
Jan 10, 2023

Conversation

partim
Copy link
Member

@partim partim commented Nov 16, 2022

This PR swaps the traits and types defined in base::octets for their equivalent in the octseq trait. These are mostly the same except that they facilitate Generic Associated Types as stabilized in Rust 1.65. This results in subtly changed trait bounds, though mostly these should be invisible to the user.

One notable change is that octseq makes the error type of the OctetsBuilder generic and uses Infallible for those types where appending data will never fail (which, for most users, is all of them). It provides methods for either case and we are mirroring these in domain. While this means that converting you code to using the PR will require some work, that work should mostly be removing unwraps – which is nice.

We’re using the opportunity to clean up a few more things that have crept into the code over time. A list of which will be added here:

  • The range, slice, and split methods on the domain name types have changed. They have been merge into a single method taking ranges – except for those on Dname that require type changes. The split methods now take references and don’t change self anymore. This is somewhat required by the limitations imposed by the new Octets trait but feels better, anyway.

  • The Parse, Compose, and Scan traits have been demoted to mere extension traits for foreign types (primarily the built-in integers, so that you can do things like u16::parse). All other types now simply have methods matching the patterns. Where generics are necessary, dedicated traits have been added. E.g., there now are ParseRecordData and ComposeRecordData traits that are implemented by all record data types.

  • Composing of record data and options has been switched to a scheme where the size is predetermined whenever possible instead of composing the data and then updating the length after. Since this is not possible for record data that uses compressed names when compression is actually in use, the old scheme is still used in this particular case.

@partim partim marked this pull request as draft November 16, 2022 13:35
@partim partim marked this pull request as ready for review January 10, 2023 11:11
@partim partim merged commit a2ce078 into main Jan 10, 2023
@partim partim deleted the octseq-with-gats branch January 10, 2023 11:48
@partim partim mentioned this pull request Mar 10, 2023
partim added a commit that referenced this pull request May 12, 2023
Breaking Changes

* The minimal required Rust version is now 1.65. ([#160])
* The `random` feature has been dropped in favour of using `rand`.
  ([#204])
* The generic octets foundation has been moved to a new crate *[octseq]*
  and completely revamped with Generic Associated Types stabilized in Rust
  1.65. This required changes all over the code but, hopefully, should
  result in relatively few changes when using the crate. ([#160])
* The range, slice, and split methods on the domain name types have changed.
  They have been merge into a single method taking ranges – except for those
  on `Dname` that require type changes. The split methods now take references
  and don’t change `self` anymore. ([#160])
* The `Parse`, `Compose`, and `Scan` traits have been demoted to mere
  extension traits for foreign types (primarily the built-in integers, so that
  you can do things like `u16::parse`). All other types now simply have
  methods matching the patterns. Where generics are necessary, dedicated
  traits have been added. E.g., there now are `ParseRecordData` and
  `ComposeRecordData` traits that are implemented by all record data types.
  ([#160])
* The `Deref` and `DerefMut` impls have been removed for most types that
  had them to follow guidance that they are exclusively for use by pointer
  types – which none of them are. `len` and `is_empty` methods have been
  added where appropriate, additional methods may be added. ([#205])
* Various functions and methods of the `tsig` module now expect the
  current time as an argument to allow use of the module in a no-std
  environment. ([#152])
* Parsing of representation format and zonefiles has been completely
  re-written. ([#142], based on work in [#109] by [Martin Fischer])
* All types that wrap an octets sequence only now allow unsized octets
  sequence types. They all have an associated function `from_slice` to
  create a reference to a value wrapping an (unsized) octets slice and
  method `for_slice` that converts a `&self` into such a reference. Where
  the latter already existed but returned a value wrapping a `&[u8]` (e.g.,
  `Dname<_>` and `Message<_>`, the return type has changed accordingly.
  ([#168])
* Removed `CharStr::from_bytes`. Use `CharStr::from_octets` instead. ([#168])
* `Message::from_octets` now returns a new error type `ShortMessage`. ([#168])
* Dropped `Deref` impls for `Dname<_>`, `RelativeDname<_>`. ([#168])
* Renamed `opt::KeyTag::new` to `opt::KeyTag::from_octets`. ([#168])
* Renamed `rdata::Txt::try_from_slice` to `build_from_slice`. ([#168])
* The `new` method of the following record data types now check whether
  the wire format representation of the record data is too long and thus
  returns a result: `Tsig<_, _>`, `Dnskey<_>`, `Rrsig<_, _>`, `Ds<_>`, 
  `Cdnskey<_>`, `Cds<_>`. ([#169])
* The `new` function for `rdata::Null<_>` has been replaced with a
  `from_octets` and `from_slice` pair. The `Deref` impl was removed. ([#169])
* The `rdata::svcb` module has been refactored to work in the same way as
  other type-length-value constructs. The names of types, methods, and
  functions have changed both to match the usual nomenclature as well as
  to match the terms used in the SVCB draft. ([#176])
* The `base::iana::SvcbParamKey` type has been renamed to `SvcParamKey`
  to match the terms used in the SVCB draft. ([#176])
* The `TcpKeepalive` option has been changed to use an `Option<u16>` as
  its data and allow for an empty option in accordance with the RFC.
  ([#185])
* Renamed the sub-modules of `rdata` that contain record data types to use a
  name derived from their content rather than their RFC number – with the
  exception of `rdata::rfc1035`. ([#189])
* Renamed the sub-modules of `base::opt` that contain option data types to
  use short-hand names rather than their RFC number. ([#190])
* TTL values are now using a newtype `base::record::Ttl` that wraps the
  raw `u32` and improves conversions. ([#202] by [@CrabNejonas])
* Changes all option data types to ensure their wire format is at most
  65,535 octets long. This requires changing the signatures of some
  creator functions. Their naming scheme and signatures are also changed
  to follow the pattern established with record data. ([#193])
* Renamed `UnknownOptData::from_octets` to `new` and return a result. ([#193])
* Completely redesigns DNS cookie options, adding support for standard server
  cookies introduced in RFC 9018. ([#193])
* Change the type of `ExtendedError`’s text to `Str<Octs>` and change the
  return type of `set_text` to `()`. ([#193])
* Changed the type `TcpKeepalive`’s content to a newtype `IdleTimeout` to
  make it easier to convert to and from durations. ([#193])
* Changes Padding to just contain the padding octets and drop `PaddingMode`.
  Instead, the methods on `OptBuilder` should be used to add padding. ([#193])

New

* `Display` impls are now available for all EDNS0 options. ([#157])
* Adds a `FromStr` implementation and related functions to
  `RelativeDname`. ([#177])
* Add a `Debug` impl to `base::message::Message` so it can be unwrapped
  etc. ([#199])
* New methods `make_canonical` on `Dname` and `RelativeDname` that convert
  the name into its canonical, i.e., lowercase form. Similarly, new
  methods `ToDname::to_canonical_dname` and
  `ToRelativeDname::to_canonical_relative_dname` that produce new
  canonical names. ([#200])
* Added a `MAX_LEN` constant to various types that wrap length-limited
  octets sequences. ([#201] by [@CrabNejonas])
Philip-NLnetLabs pushed a commit that referenced this pull request Jun 30, 2023
Breaking Changes

* The minimal required Rust version is now 1.65. ([#160])
* The `random` feature has been dropped in favour of using `rand`.
  ([#204])
* The generic octets foundation has been moved to a new crate *[octseq]*
  and completely revamped with Generic Associated Types stabilized in Rust
  1.65. This required changes all over the code but, hopefully, should
  result in relatively few changes when using the crate. ([#160])
* The range, slice, and split methods on the domain name types have changed.
  They have been merge into a single method taking ranges – except for those
  on `Dname` that require type changes. The split methods now take references
  and don’t change `self` anymore. ([#160])
* The `Parse`, `Compose`, and `Scan` traits have been demoted to mere
  extension traits for foreign types (primarily the built-in integers, so that
  you can do things like `u16::parse`). All other types now simply have
  methods matching the patterns. Where generics are necessary, dedicated
  traits have been added. E.g., there now are `ParseRecordData` and
  `ComposeRecordData` traits that are implemented by all record data types.
  ([#160])
* The `Deref` and `DerefMut` impls have been removed for most types that
  had them to follow guidance that they are exclusively for use by pointer
  types – which none of them are. `len` and `is_empty` methods have been
  added where appropriate, additional methods may be added. ([#205])
* Various functions and methods of the `tsig` module now expect the
  current time as an argument to allow use of the module in a no-std
  environment. ([#152])
* Parsing of representation format and zonefiles has been completely
  re-written. ([#142], based on work in [#109] by [Martin Fischer])
* All types that wrap an octets sequence only now allow unsized octets
  sequence types. They all have an associated function `from_slice` to
  create a reference to a value wrapping an (unsized) octets slice and
  method `for_slice` that converts a `&self` into such a reference. Where
  the latter already existed but returned a value wrapping a `&[u8]` (e.g.,
  `Dname<_>` and `Message<_>`, the return type has changed accordingly.
  ([#168])
* Removed `CharStr::from_bytes`. Use `CharStr::from_octets` instead. ([#168])
* `Message::from_octets` now returns a new error type `ShortMessage`. ([#168])
* Dropped `Deref` impls for `Dname<_>`, `RelativeDname<_>`. ([#168])
* Renamed `opt::KeyTag::new` to `opt::KeyTag::from_octets`. ([#168])
* Renamed `rdata::Txt::try_from_slice` to `build_from_slice`. ([#168])
* The `new` method of the following record data types now check whether
  the wire format representation of the record data is too long and thus
  returns a result: `Tsig<_, _>`, `Dnskey<_>`, `Rrsig<_, _>`, `Ds<_>`, 
  `Cdnskey<_>`, `Cds<_>`. ([#169])
* The `new` function for `rdata::Null<_>` has been replaced with a
  `from_octets` and `from_slice` pair. The `Deref` impl was removed. ([#169])
* The `rdata::svcb` module has been refactored to work in the same way as
  other type-length-value constructs. The names of types, methods, and
  functions have changed both to match the usual nomenclature as well as
  to match the terms used in the SVCB draft. ([#176])
* The `base::iana::SvcbParamKey` type has been renamed to `SvcParamKey`
  to match the terms used in the SVCB draft. ([#176])
* The `TcpKeepalive` option has been changed to use an `Option<u16>` as
  its data and allow for an empty option in accordance with the RFC.
  ([#185])
* Renamed the sub-modules of `rdata` that contain record data types to use a
  name derived from their content rather than their RFC number – with the
  exception of `rdata::rfc1035`. ([#189])
* Renamed the sub-modules of `base::opt` that contain option data types to
  use short-hand names rather than their RFC number. ([#190])
* TTL values are now using a newtype `base::record::Ttl` that wraps the
  raw `u32` and improves conversions. ([#202] by [@CrabNejonas])
* Changes all option data types to ensure their wire format is at most
  65,535 octets long. This requires changing the signatures of some
  creator functions. Their naming scheme and signatures are also changed
  to follow the pattern established with record data. ([#193])
* Renamed `UnknownOptData::from_octets` to `new` and return a result. ([#193])
* Completely redesigns DNS cookie options, adding support for standard server
  cookies introduced in RFC 9018. ([#193])
* Change the type of `ExtendedError`’s text to `Str<Octs>` and change the
  return type of `set_text` to `()`. ([#193])
* Changed the type `TcpKeepalive`’s content to a newtype `IdleTimeout` to
  make it easier to convert to and from durations. ([#193])
* Changes Padding to just contain the padding octets and drop `PaddingMode`.
  Instead, the methods on `OptBuilder` should be used to add padding. ([#193])

New

* `Display` impls are now available for all EDNS0 options. ([#157])
* Adds a `FromStr` implementation and related functions to
  `RelativeDname`. ([#177])
* Add a `Debug` impl to `base::message::Message` so it can be unwrapped
  etc. ([#199])
* New methods `make_canonical` on `Dname` and `RelativeDname` that convert
  the name into its canonical, i.e., lowercase form. Similarly, new
  methods `ToDname::to_canonical_dname` and
  `ToRelativeDname::to_canonical_relative_dname` that produce new
  canonical names. ([#200])
* Added a `MAX_LEN` constant to various types that wrap length-limited
  octets sequences. ([#201] by [@CrabNejonas])
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.

1 participant