Skip to content

Conversation

@Aperence
Copy link
Contributor

Derive default for the Seg6Header structure. As the structure is tagged with non_exhaustive, there is currently no way to create a Seg6Header structure. By defining the Default trait for Seg6Header, this patch should allow to create Seg6Header instances.

@gemini-code-assist
Copy link

Summary of Changes

Hello @Aperence, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request enhances the usability of the Seg6Header structure by implementing the Default trait. Previously, the non_exhaustive attribute on Seg6Header prevented its direct instantiation. By providing a default implementation, developers can now easily create Seg6Header instances, streamlining code that interacts with Segment Routing over IPv6 (SRv6) headers.

Highlights

  • Seg6Header Default Implementation: The Default trait has been derived for the Seg6Header struct, allowing for its instantiation with default values. This addresses the previous limitation where the non_exhaustive tag prevented direct creation.
  • Seg6Mode Default Variant: The Default trait has also been derived for the Seg6Mode enum, with the Encap variant explicitly marked as the default.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request aims to make Seg6Header constructible from outside the crate by deriving the Default trait for it and its mode field of type Seg6Mode. This is a good approach for #[non_exhaustive] types. However, the chosen default Seg6Mode::Encap for Seg6Mode causes Seg6Header::default() to create an invalid instance that panics during serialization. My review includes a critical comment explaining the issue and suggesting a fix, which is to change the default mode to Seg6Mode::Inline.

/// Netlink attributes for `RTA_ENCAP` with `RTA_ENCAP_TYPE` set to
/// `LWTUNNEL_ENCAP_SEG6`.
#[derive(Debug, PartialEq, Eq, Clone)]
#[derive(Debug, PartialEq, Eq, Clone, Default)]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

Deriving Default here is the correct approach to make Seg6Header constructible. However, it currently leads to a panic because of the Default implementation of Seg6Mode.

Seg6Header::default() will be created with mode: Seg6Mode::Encap (the current default) and an empty segments vector. When this default instance is serialized via emit_value(), the number_segments will be 0. This causes an integer underflow and a panic in debug builds on lines 182-183 when calculating segments_left and first_segment (0 - 1).

It appears Encap mode requires at least one segment to be valid. To fix this, Seg6Mode::Inline should be the default, as it handles an empty segment list correctly.

Please move the #[default] attribute from the Encap variant to the Inline variant in the Seg6Mode enum definition.

@Aperence
Copy link
Contributor Author

Changed from a default implementation to a constructor returning a Result<Seg6Header, ...>.
This should prevent the usage of an invalid Seg6Header containing no segment, thus making
the underflow issue impossible.

As the structure Seg6Header is tagged with `non_exhaustive`,
there is currently no way for an external library to create
a Seg6Header structure. By defining a constructor function `new`
for Seg6Header, this patch should allow to create Seg6Header
instances. In addition, this constructor checks if the segment
list is valid, i.e. if at least one segment is present,
preventing an underflow exception in `emit_value`.

Signed-off-by: Aperence <[email protected]>
Signed-off-by: Aperence <[email protected]>
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