Task 1 — Proto + model foundation (no dependencies)
Carry IPv6 DNS nameservers through the agent → dhcp-server DhcpConfig, in parallel with the existing IPv4 carbide_nameservers (which stays IPv4-only so the DHCPv4 path is untouched).
Files:
crates/dhcp-server/proto/dhcp_server_control.proto (corrected path — the proto lives under dhcp-server, not crates/rpc/proto)
crates/rpc-utils/src/dhcp.rs
crates/agent/src/dhcp_server_grpc_client.rs
crates/dhcp-server/src/grpc_server.rs
Changes
dhcp_server_control.proto — new field (field 4 / carbide_nameservers stays IPv4-only):
// IPv6 DNS server addresses as colon-notation strings (e.g. "2001:db8::1").
repeated string carbide_nameservers_v6 = 9;
rpc-utils/src/dhcp.rs — add pub carbide_nameservers_v6: Vec<Ipv6Addr> to DhcpConfig (+ Default).
agent/src/dhcp_server_grpc_client.rs — serialize carbide_nameservers_v6 as colon-notation strings in From<ModelDhcpConfig>.
dhcp-server/src/grpc_server.rs — parse the new field as Ipv6Addr in TryFrom<proto::DhcpConfig>; empty/absent → empty Vec (forward-compat with older agents).
Done when: DhcpConfig round-trips v6 nameservers end-to-end; existing DHCPv4 tests unchanged.
Note: this is plumbing ahead of a consumer — nothing reads carbide_nameservers_v6 until the delivery channel (#2644 / #1263) lands. It is a safe, self-contained prerequisite that removes a known data-loss point: the agent currently discards IPv6 nameservers it already has.
Part of #2628
Task 1 — Proto + model foundation (no dependencies)
Carry IPv6 DNS nameservers through the agent → dhcp-server
DhcpConfig, in parallel with the existing IPv4carbide_nameservers(which stays IPv4-only so the DHCPv4 path is untouched).Files:
crates/dhcp-server/proto/dhcp_server_control.proto(corrected path — the proto lives under dhcp-server, notcrates/rpc/proto)crates/rpc-utils/src/dhcp.rscrates/agent/src/dhcp_server_grpc_client.rscrates/dhcp-server/src/grpc_server.rsChanges
dhcp_server_control.proto— new field (field 4 /carbide_nameserversstays IPv4-only):// IPv6 DNS server addresses as colon-notation strings (e.g. "2001:db8::1"). repeated string carbide_nameservers_v6 = 9;rpc-utils/src/dhcp.rs— addpub carbide_nameservers_v6: Vec<Ipv6Addr>toDhcpConfig(+Default).agent/src/dhcp_server_grpc_client.rs— serializecarbide_nameservers_v6as colon-notation strings inFrom<ModelDhcpConfig>.dhcp-server/src/grpc_server.rs— parse the new field asIpv6AddrinTryFrom<proto::DhcpConfig>; empty/absent → emptyVec(forward-compat with older agents).Done when:
DhcpConfiground-trips v6 nameservers end-to-end; existing DHCPv4 tests unchanged.Part of #2628