Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
98bf71e
[feat] Add IP pool multicast support
zeeshanlakhani Sep 25, 2025
04dfa49
[feat] Multicast groups
zeeshanlakhani Aug 13, 2025
ca242df
[update] Move API calls behind "experimental" tag and disable runs ba…
zeeshanlakhani Sep 29, 2025
6283b8b
[test-update] update successes.out
zeeshanlakhani Sep 30, 2025
6bd8e19
Merge remote-tracking branch 'origin/main' into zl/ip-pool-multicast-…
zeeshanlakhani Sep 30, 2025
378597a
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Sep 30, 2025
20db268
Merge remote-tracking branch 'origin/main' into zl/ip-pool-multicast-…
zeeshanlakhani Oct 1, 2025
7164585
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Oct 1, 2025
6fe0c6a
Merge remote-tracking branch 'origin/main' into zl/ip-pool-multicast-…
zeeshanlakhani Oct 9, 2025
bcb4fc6
[review] move mvlan and switch port uplinks (for mcast egress) out of…
zeeshanlakhani Oct 9, 2025
4433066
[fmt] fixes
zeeshanlakhani Oct 9, 2025
1746270
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Oct 10, 2025
e8676ec
[review] move to fleet scope, remove vpc derivation(s)
zeeshanlakhani Oct 10, 2025
f7991c3
[review] comments, validation, & cleanup
zeeshanlakhani Oct 12, 2025
1b24936
[api] run generate post-API changes
zeeshanlakhani Oct 12, 2025
d9fb3b9
[post-review] cleanup/docs/tests related to changes + mvlan
zeeshanlakhani Oct 12, 2025
c65356b
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Oct 13, 2025
2aee55c
[fix] leftover on merge
zeeshanlakhani Oct 13, 2025
ef37892
[fix] missing resource policy pieces
zeeshanlakhani Oct 13, 2025
666446f
[review] have IP range conversions use tryfrom
zeeshanlakhani Oct 14, 2025
3c2947d
[fix] auth and test cleanup
zeeshanlakhani Oct 14, 2025
9280dcf
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Oct 14, 2025
870d2c3
[fix] sure up rwlock test handling, fmt'ing
zeeshanlakhani Oct 14, 2025
c636f66
Merge remote-tracking branch 'origin/main' into zl/ip-pool-multicast-…
zeeshanlakhani Oct 15, 2025
5fd902a
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Oct 15, 2025
3ea1f2b
[fmt] ..
zeeshanlakhani Oct 15, 2025
f52ce73
[fix] db ordering
zeeshanlakhani Oct 15, 2025
671e7c4
Merge remote-tracking branch 'origin/zl/ip-pool-multicast-support' in…
zeeshanlakhani Oct 15, 2025
1dfe156
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Oct 15, 2025
983bc46
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Oct 16, 2025
3a3cf50
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Oct 19, 2025
03c0d12
[review] fix up nullable API parms
zeeshanlakhani Oct 21, 2025
fcad2e1
[review+] multicast: schema refinements, CTE ops, doc cleanup
zeeshanlakhani Oct 27, 2025
336fd4c
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Oct 28, 2025
5853303
fmt..
zeeshanlakhani Oct 28, 2025
23aa224
[fix] roles
zeeshanlakhani Oct 28, 2025
38d9a18
[review, fix] find backplane ports, rm rack_id
zeeshanlakhani Oct 31, 2025
e4c4da4
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Oct 31, 2025
0676aef
[fix] hakari / workspace
zeeshanlakhani Oct 31, 2025
83782c9
[fix] test output files
zeeshanlakhani Oct 31, 2025
1fdf077
[fix] doctest
zeeshanlakhani Oct 31, 2025
4b24877
[review] add TODOs around instance->front port replication
zeeshanlakhani Nov 4, 2025
df71ce3
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Nov 4, 2025
0ffbb28
[fix] expectorate
zeeshanlakhani Nov 4, 2025
76f5d86
[review] Rework cache invalidation and add related tests
zeeshanlakhani Nov 10, 2025
273bf6f
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Nov 10, 2025
7601225
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Nov 12, 2025
1a1f93c
[fix] openapi
zeeshanlakhani Nov 12, 2025
698241a
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Nov 13, 2025
bc4cb49
Merge remote-tracking branch 'origin/main' into zl/mcast-impl
zeeshanlakhani Nov 13, 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
6 changes: 6 additions & 0 deletions Cargo.lock

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

49 changes: 49 additions & 0 deletions common/src/address.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,55 @@ pub const IPV6_SSM_SUBNET: oxnet::Ipv6Net = oxnet::Ipv6Net::new_unchecked(
12,
);

/// IPv4 multicast address range (224.0.0.0/4).
/// See RFC 5771 (IPv4 Multicast Address Assignments):
/// <https://www.rfc-editor.org/rfc/rfc5771>
pub const IPV4_MULTICAST_RANGE: Ipv4Net =
Ipv4Net::new_unchecked(Ipv4Addr::new(224, 0, 0, 0), 4);

/// IPv4 link-local multicast subnet (224.0.0.0/24).
/// This range is reserved for local network control protocols and should not
/// be routed beyond the local link. Includes addresses for protocols like
/// OSPF (224.0.0.5), RIPv2 (224.0.0.9), and other local routing protocols.
/// See RFC 5771 Section 4:
/// <https://www.rfc-editor.org/rfc/rfc5771#section-4>
pub const IPV4_LINK_LOCAL_MULTICAST_SUBNET: Ipv4Net =
Ipv4Net::new_unchecked(Ipv4Addr::new(224, 0, 0, 0), 24);

/// IPv6 multicast address range (ff00::/8).
/// See RFC 4291 (IPv6 Addressing Architecture):
/// <https://www.rfc-editor.org/rfc/rfc4291>
pub const IPV6_MULTICAST_RANGE: Ipv6Net =
Ipv6Net::new_unchecked(Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0), 8);

/// IPv6 multicast prefix (ff00::/8) mask/value for scope checking.
pub const IPV6_MULTICAST_PREFIX: u16 = 0xff00;

/// Admin-scoped IPv6 multicast prefix (ff04::/16) as u16 for address
/// construction and normalization of underlay multicast addresses.
pub const IPV6_ADMIN_SCOPED_MULTICAST_PREFIX: u16 = 0xff04;

/// IPv6 interface-local multicast subnet (ff01::/16).
/// These addresses are not routable and should not be added to IP pools.
/// See RFC 4291 Section 2.7 (multicast scope field):
/// <https://www.rfc-editor.org/rfc/rfc4291#section-2.7>
pub const IPV6_INTERFACE_LOCAL_MULTICAST_SUBNET: oxnet::Ipv6Net =
oxnet::Ipv6Net::new_unchecked(
Ipv6Addr::new(0xff01, 0, 0, 0, 0, 0, 0, 0),
16,
);

/// IPv6 link-local multicast subnet (ff02::/16).
/// These addresses are not routable beyond the local link and should not be
/// added to IP pools.
/// See RFC 4291 Section 2.7 (multicast scope field):
/// <https://www.rfc-editor.org/rfc/rfc4291#section-2.7>
pub const IPV6_LINK_LOCAL_MULTICAST_SUBNET: oxnet::Ipv6Net =
oxnet::Ipv6Net::new_unchecked(
Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0),
16,
);

/// maximum possible value for a tcp or udp port
pub const MAX_PORT: u16 = u16::MAX;

Expand Down
8 changes: 8 additions & 0 deletions common/src/api/external/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -957,6 +957,8 @@ pub enum ResourceType {
LldpLinkConfig,
LoopbackAddress,
MetricProducer,
MulticastGroup,
MulticastGroupMember,
NatEntry,
Oximeter,
PhysicalDisk,
Expand Down Expand Up @@ -2523,6 +2525,12 @@ impl Vni {
/// The VNI for the builtin services VPC.
pub const SERVICES_VNI: Self = Self(100);

/// VNI default if no VPC is provided for a multicast group.
///
/// This is a low-numbered VNI to avoid colliding with user VNIs.
/// However, it is not in the Oxide-reserved range yet.
pub const DEFAULT_MULTICAST_VNI: Self = Self(77);

/// Oxide reserves a slice of initial VNIs for its own use.
pub const MIN_GUEST_VNI: u32 = 1024;

Expand Down
2 changes: 1 addition & 1 deletion common/src/vlan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub const VLAN_MAX: u16 = 4094;

/// Wrapper around a VLAN ID, ensuring it is valid.
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy, JsonSchema)]
#[serde(rename = "VlanId")]
#[serde(transparent)]
pub struct VlanID(u16);

impl VlanID {
Expand Down
33 changes: 24 additions & 9 deletions dev-tools/omdb/tests/env.out
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ EXECUTING COMMAND: omdb ["db", "--db-url", "postgresql://root@[::1]:REDACTED_POR
termination: Exited(0)
---------------------------------------------
stdout:
SERIAL IP ROLE POLICY STATE ID
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SERIAL IP ROLE POLICY STATE ID
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
---------------------------------------------
stderr:
note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable
Expand Down Expand Up @@ -136,6 +136,11 @@ task: "metrics_producer_gc"
unregisters Oximeter metrics producers that have not renewed their lease


task: "multicast_reconciler"
reconciles multicast group and member state with dendrite switch
configuration


task: "nat_garbage_collector"
prunes soft-deleted NAT entries from nat_entry table based on a
predetermined retention policy
Expand Down Expand Up @@ -364,6 +369,11 @@ task: "metrics_producer_gc"
unregisters Oximeter metrics producers that have not renewed their lease


task: "multicast_reconciler"
reconciles multicast group and member state with dendrite switch
configuration


task: "nat_garbage_collector"
prunes soft-deleted NAT entries from nat_entry table based on a
predetermined retention policy
Expand Down Expand Up @@ -579,6 +589,11 @@ task: "metrics_producer_gc"
unregisters Oximeter metrics producers that have not renewed their lease


task: "multicast_reconciler"
reconciles multicast group and member state with dendrite switch
configuration


task: "nat_garbage_collector"
prunes soft-deleted NAT entries from nat_entry table based on a
predetermined retention policy
Expand Down Expand Up @@ -683,9 +698,9 @@ EXECUTING COMMAND: omdb ["db", "sleds"]
termination: Exited(0)
---------------------------------------------
stdout:
SERIAL IP ROLE POLICY STATE ID
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SERIAL IP ROLE POLICY STATE ID
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
---------------------------------------------
stderr:
note: database URL not specified. Will search DNS.
Expand All @@ -698,9 +713,9 @@ EXECUTING COMMAND: omdb ["--dns-server", "[::1]:REDACTED_PORT", "db", "sleds"]
termination: Exited(0)
---------------------------------------------
stdout:
SERIAL IP ROLE POLICY STATE ID
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SERIAL IP ROLE POLICY STATE ID
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
---------------------------------------------
stderr:
note: database URL not specified. Will search DNS.
Expand Down
65 changes: 41 additions & 24 deletions dev-tools/omdb/tests/successes.out
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,9 @@ EXECUTING COMMAND: omdb ["db", "sleds"]
termination: Exited(0)
---------------------------------------------
stdout:
SERIAL IP ROLE POLICY STATE ID
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SERIAL IP ROLE POLICY STATE ID
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
---------------------------------------------
stderr:
note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable
Expand All @@ -102,9 +102,9 @@ EXECUTING COMMAND: omdb ["db", "sleds", "-F", "discretionary"]
termination: Exited(0)
---------------------------------------------
stdout:
SERIAL IP ROLE POLICY STATE ID
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SERIAL IP ROLE POLICY STATE ID
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
---------------------------------------------
stderr:
note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable
Expand Down Expand Up @@ -371,6 +371,11 @@ task: "metrics_producer_gc"
unregisters Oximeter metrics producers that have not renewed their lease


task: "multicast_reconciler"
reconciles multicast group and member state with dendrite switch
configuration


task: "nat_garbage_collector"
prunes soft-deleted NAT entries from nat_entry table based on a
predetermined retention policy
Expand Down Expand Up @@ -704,6 +709,12 @@ task: "metrics_producer_gc"
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
warning: unknown background task: "metrics_producer_gc" (don't know how to interpret details: Object {"expiration": String("<REDACTED_TIMESTAMP>"), "pruned": Array []})

task: "multicast_reconciler"
configured period: every <REDACTED_DURATION>m
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
warning: unknown background task: "multicast_reconciler" (don't know how to interpret details: Object {"disabled": Bool(false), "errors": Array [], "groups_created": Number(0), "groups_deleted": Number(0), "groups_verified": Number(0), "members_deleted": Number(0), "members_processed": Number(0)})

task: "phantom_disks"
configured period: every <REDACTED_DURATION>s
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
Expand Down Expand Up @@ -1266,6 +1277,12 @@ task: "metrics_producer_gc"
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
warning: unknown background task: "metrics_producer_gc" (don't know how to interpret details: Object {"expiration": String("<REDACTED_TIMESTAMP>"), "pruned": Array []})

task: "multicast_reconciler"
configured period: every <REDACTED_DURATION>m
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
warning: unknown background task: "multicast_reconciler" (don't know how to interpret details: Object {"disabled": Bool(false), "errors": Array [], "groups_created": Number(0), "groups_deleted": Number(0), "groups_verified": Number(0), "members_deleted": Number(0), "members_processed": Number(0)})

task: "phantom_disks"
configured period: every <REDACTED_DURATION>s
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
Expand Down Expand Up @@ -1851,30 +1868,30 @@ termination: Exited(0)
---------------------------------------------
stdout:
Installed RoT Bootloader Software
BASEBOARD_ID STAGE0_VERSION STAGE0_NEXT_VERSION
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
BASEBOARD_ID STAGE0_VERSION STAGE0_NEXT_VERSION
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
i86pc:SimGimlet00 unknown unknown
i86pc:SimGimlet01 unknown unknown

Installed RoT Software
BASEBOARD_ID SLOT_A_VERSION SLOT_B_VERSION
FAKE_SIM_SIDECAR:SimSidecar0 unknown (active) unknown
FAKE_SIM_SIDECAR:SimSidecar1 unknown (active) unknown
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
BASEBOARD_ID SLOT_A_VERSION SLOT_B_VERSION
FAKE_SIM_SIDECAR:SimSidecar0 unknown (active) unknown
FAKE_SIM_SIDECAR:SimSidecar1 unknown (active) unknown
i86pc:SimGimlet00 unknown (active) unknown
i86pc:SimGimlet01 unknown (active) unknown

Installed SP Software
BASEBOARD_ID SLOT0_VERSION SLOT1_VERSION
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
BASEBOARD_ID SLOT0_VERSION SLOT1_VERSION
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
i86pc:SimGimlet00 unknown unknown
i86pc:SimGimlet01 unknown unknown

Installed Host Phase 1 Software
BASEBOARD_ID SLED_ID SLOT_A_VERSION SLOT_B_VERSION
sim-gimlet:sim-..........<REDACTED_UUID>........... ..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
sim-gimlet:sim-..........<REDACTED_UUID>........... ..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
BASEBOARD_ID SLED_ID SLOT_A_VERSION SLOT_B_VERSION
i86pc:SimGimlet00 ..........<REDACTED_UUID>........... unknown (active) unknown
i86pc:SimGimlet01 ..........<REDACTED_UUID>........... unknown (active) unknown

Installed Host Phase 2 Software
SLED_ID SLOT_A_VERSION SLOT_B_VERSION
Expand Down
1 change: 1 addition & 0 deletions end-to-end-tests/src/instance_launch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ async fn instance_launch() -> Result<()> {
auto_restart_policy: Default::default(),
anti_affinity_groups: Vec::new(),
cpu_platform: None,
multicast_groups: Vec::new(),
})
.send()
.await?;
Expand Down
5 changes: 5 additions & 0 deletions illumos-utils/src/opte/illumos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ pub enum Error {
#[error("Tried to update external IPs on non-existent port ({0}, {1:?})")]
ExternalIpUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),

#[error(
"Tried to update multicast groups on non-existent port ({0}, {1:?})"
)]
MulticastUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),

#[error("Could not find Primary NIC")]
NoPrimaryNic,

Expand Down
8 changes: 5 additions & 3 deletions illumos-utils/src/opte/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ use oxide_vpc::api::RouterTarget;
pub use oxide_vpc::api::Vni;
use oxnet::IpNet;
pub use port::Port;
pub use port_manager::MulticastGroupCfg;
pub use port_manager::PortCreateParams;
pub use port_manager::PortManager;
pub use port_manager::PortTicket;
Expand Down Expand Up @@ -71,7 +72,7 @@ impl Gateway {
}
}

/// Convert a nexus `IpNet` to an OPTE `IpCidr`.
/// Convert a nexus [IpNet] to an OPTE [IpCidr].
fn net_to_cidr(net: IpNet) -> IpCidr {
match net {
IpNet::V4(net) => IpCidr::Ip4(Ipv4Cidr::new(
Expand All @@ -85,9 +86,10 @@ fn net_to_cidr(net: IpNet) -> IpCidr {
}
}

/// Convert a nexus `RouterTarget` to an OPTE `RouterTarget`.
/// Convert a nexus [shared::RouterTarget] to an OPTE [RouterTarget].
///
/// This is effectively a `From` impl, but defined for two out-of-crate types.
/// This is effectively a [`From`] impl, but defined for two
/// out-of-crate types.
/// We map internet gateways that target the (single) "system" VPC IG to
/// `InternetGateway(None)`. Everything else is mapped directly, translating IP
/// address types as needed.
Expand Down
5 changes: 5 additions & 0 deletions illumos-utils/src/opte/non_illumos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ pub enum Error {
#[error("Tried to update external IPs on non-existent port ({0}, {1:?})")]
ExternalIpUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),

#[error(
"Tried to update multicast groups on non-existent port ({0}, {1:?})"
)]
MulticastUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),

#[error("Could not find Primary NIC")]
NoPrimaryNic,

Expand Down
Loading
Loading