Skip to content

Commit f92b587

Browse files
committed
Merge branch 'main' into john/refactor-rss-blueprint
2 parents 8b7edd6 + 18058fc commit f92b587

File tree

138 files changed

+39918
-243
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

138 files changed

+39918
-243
lines changed

Cargo.lock

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/src/address.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,55 @@ pub const IPV6_SSM_SUBNET: oxnet::Ipv6Net = oxnet::Ipv6Net::new_unchecked(
5252
12,
5353
);
5454

55+
/// IPv4 multicast address range (224.0.0.0/4).
56+
/// See RFC 5771 (IPv4 Multicast Address Assignments):
57+
/// <https://www.rfc-editor.org/rfc/rfc5771>
58+
pub const IPV4_MULTICAST_RANGE: Ipv4Net =
59+
Ipv4Net::new_unchecked(Ipv4Addr::new(224, 0, 0, 0), 4);
60+
61+
/// IPv4 link-local multicast subnet (224.0.0.0/24).
62+
/// This range is reserved for local network control protocols and should not
63+
/// be routed beyond the local link. Includes addresses for protocols like
64+
/// OSPF (224.0.0.5), RIPv2 (224.0.0.9), and other local routing protocols.
65+
/// See RFC 5771 Section 4:
66+
/// <https://www.rfc-editor.org/rfc/rfc5771#section-4>
67+
pub const IPV4_LINK_LOCAL_MULTICAST_SUBNET: Ipv4Net =
68+
Ipv4Net::new_unchecked(Ipv4Addr::new(224, 0, 0, 0), 24);
69+
70+
/// IPv6 multicast address range (ff00::/8).
71+
/// See RFC 4291 (IPv6 Addressing Architecture):
72+
/// <https://www.rfc-editor.org/rfc/rfc4291>
73+
pub const IPV6_MULTICAST_RANGE: Ipv6Net =
74+
Ipv6Net::new_unchecked(Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0), 8);
75+
76+
/// IPv6 multicast prefix (ff00::/8) mask/value for scope checking.
77+
pub const IPV6_MULTICAST_PREFIX: u16 = 0xff00;
78+
79+
/// Admin-scoped IPv6 multicast prefix (ff04::/16) as u16 for address
80+
/// construction and normalization of underlay multicast addresses.
81+
pub const IPV6_ADMIN_SCOPED_MULTICAST_PREFIX: u16 = 0xff04;
82+
83+
/// IPv6 interface-local multicast subnet (ff01::/16).
84+
/// These addresses are not routable and should not be added to IP pools.
85+
/// See RFC 4291 Section 2.7 (multicast scope field):
86+
/// <https://www.rfc-editor.org/rfc/rfc4291#section-2.7>
87+
pub const IPV6_INTERFACE_LOCAL_MULTICAST_SUBNET: oxnet::Ipv6Net =
88+
oxnet::Ipv6Net::new_unchecked(
89+
Ipv6Addr::new(0xff01, 0, 0, 0, 0, 0, 0, 0),
90+
16,
91+
);
92+
93+
/// IPv6 link-local multicast subnet (ff02::/16).
94+
/// These addresses are not routable beyond the local link and should not be
95+
/// added to IP pools.
96+
/// See RFC 4291 Section 2.7 (multicast scope field):
97+
/// <https://www.rfc-editor.org/rfc/rfc4291#section-2.7>
98+
pub const IPV6_LINK_LOCAL_MULTICAST_SUBNET: oxnet::Ipv6Net =
99+
oxnet::Ipv6Net::new_unchecked(
100+
Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0),
101+
16,
102+
);
103+
55104
/// maximum possible value for a tcp or udp port
56105
pub const MAX_PORT: u16 = u16::MAX;
57106

common/src/api/external/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,8 @@ pub enum ResourceType {
957957
LldpLinkConfig,
958958
LoopbackAddress,
959959
MetricProducer,
960+
MulticastGroup,
961+
MulticastGroupMember,
960962
NatEntry,
961963
Oximeter,
962964
PhysicalDisk,
@@ -2523,6 +2525,12 @@ impl Vni {
25232525
/// The VNI for the builtin services VPC.
25242526
pub const SERVICES_VNI: Self = Self(100);
25252527

2528+
/// VNI default if no VPC is provided for a multicast group.
2529+
///
2530+
/// This is a low-numbered VNI to avoid colliding with user VNIs.
2531+
/// However, it is not in the Oxide-reserved range yet.
2532+
pub const DEFAULT_MULTICAST_VNI: Self = Self(77);
2533+
25262534
/// Oxide reserves a slice of initial VNIs for its own use.
25272535
pub const MIN_GUEST_VNI: u32 = 1024;
25282536

common/src/vlan.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub const VLAN_MAX: u16 = 4094;
1616

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

2222
impl VlanID {

dev-tools/omdb/tests/env.out

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ EXECUTING COMMAND: omdb ["db", "--db-url", "postgresql://root@[::1]:REDACTED_POR
22
termination: Exited(0)
33
---------------------------------------------
44
stdout:
5-
SERIAL IP ROLE POLICY STATE ID
6-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
7-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
5+
SERIAL IP ROLE POLICY STATE ID
6+
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
7+
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
88
---------------------------------------------
99
stderr:
1010
note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable
@@ -136,6 +136,11 @@ task: "metrics_producer_gc"
136136
unregisters Oximeter metrics producers that have not renewed their lease
137137

138138

139+
task: "multicast_reconciler"
140+
reconciles multicast group and member state with dendrite switch
141+
configuration
142+
143+
139144
task: "nat_garbage_collector"
140145
prunes soft-deleted NAT entries from nat_entry table based on a
141146
predetermined retention policy
@@ -364,6 +369,11 @@ task: "metrics_producer_gc"
364369
unregisters Oximeter metrics producers that have not renewed their lease
365370

366371

372+
task: "multicast_reconciler"
373+
reconciles multicast group and member state with dendrite switch
374+
configuration
375+
376+
367377
task: "nat_garbage_collector"
368378
prunes soft-deleted NAT entries from nat_entry table based on a
369379
predetermined retention policy
@@ -579,6 +589,11 @@ task: "metrics_producer_gc"
579589
unregisters Oximeter metrics producers that have not renewed their lease
580590

581591

592+
task: "multicast_reconciler"
593+
reconciles multicast group and member state with dendrite switch
594+
configuration
595+
596+
582597
task: "nat_garbage_collector"
583598
prunes soft-deleted NAT entries from nat_entry table based on a
584599
predetermined retention policy
@@ -683,9 +698,9 @@ EXECUTING COMMAND: omdb ["db", "sleds"]
683698
termination: Exited(0)
684699
---------------------------------------------
685700
stdout:
686-
SERIAL IP ROLE POLICY STATE ID
687-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
688-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
701+
SERIAL IP ROLE POLICY STATE ID
702+
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
703+
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
689704
---------------------------------------------
690705
stderr:
691706
note: database URL not specified. Will search DNS.
@@ -698,9 +713,9 @@ EXECUTING COMMAND: omdb ["--dns-server", "[::1]:REDACTED_PORT", "db", "sleds"]
698713
termination: Exited(0)
699714
---------------------------------------------
700715
stdout:
701-
SERIAL IP ROLE POLICY STATE ID
702-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
703-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
716+
SERIAL IP ROLE POLICY STATE ID
717+
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
718+
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
704719
---------------------------------------------
705720
stderr:
706721
note: database URL not specified. Will search DNS.

dev-tools/omdb/tests/successes.out

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ EXECUTING COMMAND: omdb ["db", "sleds"]
8989
termination: Exited(0)
9090
---------------------------------------------
9191
stdout:
92-
SERIAL IP ROLE POLICY STATE ID
93-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
94-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
92+
SERIAL IP ROLE POLICY STATE ID
93+
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
94+
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
9595
---------------------------------------------
9696
stderr:
9797
note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable
@@ -102,9 +102,9 @@ EXECUTING COMMAND: omdb ["db", "sleds", "-F", "discretionary"]
102102
termination: Exited(0)
103103
---------------------------------------------
104104
stdout:
105-
SERIAL IP ROLE POLICY STATE ID
106-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
107-
sim-..........<REDACTED_UUID>........... [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
105+
SERIAL IP ROLE POLICY STATE ID
106+
SimGimlet01 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
107+
SimGimlet00 [::1]:REDACTED_PORT scrimlet in service active ..........<REDACTED_UUID>...........
108108
---------------------------------------------
109109
stderr:
110110
note: using database URL postgresql://root@[::1]:REDACTED_PORT/omicron?sslmode=disable
@@ -371,6 +371,11 @@ task: "metrics_producer_gc"
371371
unregisters Oximeter metrics producers that have not renewed their lease
372372

373373

374+
task: "multicast_reconciler"
375+
reconciles multicast group and member state with dendrite switch
376+
configuration
377+
378+
374379
task: "nat_garbage_collector"
375380
prunes soft-deleted NAT entries from nat_entry table based on a
376381
predetermined retention policy
@@ -704,6 +709,12 @@ task: "metrics_producer_gc"
704709
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
705710
warning: unknown background task: "metrics_producer_gc" (don't know how to interpret details: Object {"expiration": String("<REDACTED_TIMESTAMP>"), "pruned": Array []})
706711

712+
task: "multicast_reconciler"
713+
configured period: every <REDACTED_DURATION>m
714+
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
715+
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
716+
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)})
717+
707718
task: "phantom_disks"
708719
configured period: every <REDACTED_DURATION>s
709720
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
@@ -1266,6 +1277,12 @@ task: "metrics_producer_gc"
12661277
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
12671278
warning: unknown background task: "metrics_producer_gc" (don't know how to interpret details: Object {"expiration": String("<REDACTED_TIMESTAMP>"), "pruned": Array []})
12681279

1280+
task: "multicast_reconciler"
1281+
configured period: every <REDACTED_DURATION>m
1282+
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
1283+
started at <REDACTED_TIMESTAMP> (<REDACTED DURATION>s ago) and ran for <REDACTED DURATION>ms
1284+
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)})
1285+
12691286
task: "phantom_disks"
12701287
configured period: every <REDACTED_DURATION>s
12711288
last completed activation: <REDACTED ITERATIONS>, triggered by <TRIGGERED_BY_REDACTED>
@@ -1851,30 +1868,30 @@ termination: Exited(0)
18511868
---------------------------------------------
18521869
stdout:
18531870
Installed RoT Bootloader Software
1854-
BASEBOARD_ID STAGE0_VERSION STAGE0_NEXT_VERSION
1855-
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
1856-
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
1857-
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
1858-
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
1871+
BASEBOARD_ID STAGE0_VERSION STAGE0_NEXT_VERSION
1872+
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
1873+
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
1874+
i86pc:SimGimlet00 unknown unknown
1875+
i86pc:SimGimlet01 unknown unknown
18591876

18601877
Installed RoT Software
1861-
BASEBOARD_ID SLOT_A_VERSION SLOT_B_VERSION
1862-
FAKE_SIM_SIDECAR:SimSidecar0 unknown (active) unknown
1863-
FAKE_SIM_SIDECAR:SimSidecar1 unknown (active) unknown
1864-
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
1865-
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
1878+
BASEBOARD_ID SLOT_A_VERSION SLOT_B_VERSION
1879+
FAKE_SIM_SIDECAR:SimSidecar0 unknown (active) unknown
1880+
FAKE_SIM_SIDECAR:SimSidecar1 unknown (active) unknown
1881+
i86pc:SimGimlet00 unknown (active) unknown
1882+
i86pc:SimGimlet01 unknown (active) unknown
18661883

18671884
Installed SP Software
1868-
BASEBOARD_ID SLOT0_VERSION SLOT1_VERSION
1869-
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
1870-
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
1871-
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
1872-
sim-gimlet:sim-..........<REDACTED_UUID>........... unknown unknown
1885+
BASEBOARD_ID SLOT0_VERSION SLOT1_VERSION
1886+
FAKE_SIM_SIDECAR:SimSidecar0 unknown unknown
1887+
FAKE_SIM_SIDECAR:SimSidecar1 unknown unknown
1888+
i86pc:SimGimlet00 unknown unknown
1889+
i86pc:SimGimlet01 unknown unknown
18731890

18741891
Installed Host Phase 1 Software
1875-
BASEBOARD_ID SLED_ID SLOT_A_VERSION SLOT_B_VERSION
1876-
sim-gimlet:sim-..........<REDACTED_UUID>........... ..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
1877-
sim-gimlet:sim-..........<REDACTED_UUID>........... ..........<REDACTED_UUID>........... unknown unknown (ACTIVE SLOT UNKNOWN)
1892+
BASEBOARD_ID SLED_ID SLOT_A_VERSION SLOT_B_VERSION
1893+
i86pc:SimGimlet00 ..........<REDACTED_UUID>........... unknown (active) unknown
1894+
i86pc:SimGimlet01 ..........<REDACTED_UUID>........... unknown (active) unknown
18781895

18791896
Installed Host Phase 2 Software
18801897
SLED_ID SLOT_A_VERSION SLOT_B_VERSION

end-to-end-tests/src/instance_launch.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ async fn instance_launch() -> Result<()> {
8080
auto_restart_policy: Default::default(),
8181
anti_affinity_groups: Vec::new(),
8282
cpu_platform: None,
83+
multicast_groups: Vec::new(),
8384
})
8485
.send()
8586
.await?;

illumos-utils/src/opte/illumos.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ pub enum Error {
5252
#[error("Tried to update external IPs on non-existent port ({0}, {1:?})")]
5353
ExternalIpUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),
5454

55+
#[error(
56+
"Tried to update multicast groups on non-existent port ({0}, {1:?})"
57+
)]
58+
MulticastUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),
59+
5560
#[error("Could not find Primary NIC")]
5661
NoPrimaryNic,
5762

illumos-utils/src/opte/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use oxide_vpc::api::RouterTarget;
3131
pub use oxide_vpc::api::Vni;
3232
use oxnet::IpNet;
3333
pub use port::Port;
34+
pub use port_manager::MulticastGroupCfg;
3435
pub use port_manager::PortCreateParams;
3536
pub use port_manager::PortManager;
3637
pub use port_manager::PortTicket;
@@ -71,7 +72,7 @@ impl Gateway {
7172
}
7273
}
7374

74-
/// Convert a nexus `IpNet` to an OPTE `IpCidr`.
75+
/// Convert a nexus [IpNet] to an OPTE [IpCidr].
7576
fn net_to_cidr(net: IpNet) -> IpCidr {
7677
match net {
7778
IpNet::V4(net) => IpCidr::Ip4(Ipv4Cidr::new(
@@ -85,9 +86,10 @@ fn net_to_cidr(net: IpNet) -> IpCidr {
8586
}
8687
}
8788

88-
/// Convert a nexus `RouterTarget` to an OPTE `RouterTarget`.
89+
/// Convert a nexus [shared::RouterTarget] to an OPTE [RouterTarget].
8990
///
90-
/// This is effectively a `From` impl, but defined for two out-of-crate types.
91+
/// This is effectively a [`From`] impl, but defined for two
92+
/// out-of-crate types.
9193
/// We map internet gateways that target the (single) "system" VPC IG to
9294
/// `InternetGateway(None)`. Everything else is mapped directly, translating IP
9395
/// address types as needed.

illumos-utils/src/opte/non_illumos.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ pub enum Error {
4646
#[error("Tried to update external IPs on non-existent port ({0}, {1:?})")]
4747
ExternalIpUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),
4848

49+
#[error(
50+
"Tried to update multicast groups on non-existent port ({0}, {1:?})"
51+
)]
52+
MulticastUpdateMissingPort(uuid::Uuid, NetworkInterfaceKind),
53+
4954
#[error("Could not find Primary NIC")]
5055
NoPrimaryNic,
5156

0 commit comments

Comments
 (0)