feat: support setting wake-on-lan for Ethernet

Fixes #11866

Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
This commit is contained in:
Andrey Smirnov 2025-09-22 21:05:50 +04:00
parent 94f78dbe79
commit 1fca111e24
No known key found for this signature in database
GPG Key ID: 322C6F63F594CE7C
34 changed files with 883 additions and 206 deletions

View File

@ -376,6 +376,18 @@ enum NethelpersVLANProtocol {
VLAN_PROTOCOL8021_AD = 34984;
}
// NethelpersWOLMode wraps ethtool.WOLMode for YAML marshaling.
enum NethelpersWOLMode {
NETHELPERS_WOLMODE_UNSPECIFIED = 0;
WOL_MODE_PHY = 1;
WOL_MODE_UNICAST = 2;
WOL_MODE_MULTICAST = 4;
WOL_MODE_BROADCAST = 8;
WOL_MODE_MAGIC = 32;
WOL_MODE_MAGIC_SECURE = 64;
WOL_MODE_FILTER = 128;
}
// BlockEncryptionKeyType describes encryption key type.
enum BlockEncryptionKeyType {
ENCRYPTION_KEY_STATIC = 0;

View File

@ -169,6 +169,7 @@ message EthernetSpecSpec {
EthernetRingsSpec rings = 1;
map<string, bool> features = 2;
EthernetChannelsSpec channels = 3;
repeated talos.resource.definitions.enums.NethelpersWOLMode wake_on_lan = 4;
}
// EthernetStatusSpec describes status of rendered secrets.
@ -182,6 +183,7 @@ message EthernetStatusSpec {
EthernetRingsStatus rings = 7;
repeated EthernetFeatureStatus features = 8;
EthernetChannelsStatus channels = 9;
repeated talos.resource.definitions.enums.NethelpersWOLMode wake_on_lan = 10;
}
// HardwareAddrSpec describes spec for the link.

View File

@ -66,6 +66,13 @@ The list of overridden settings is available with `talosctl get kernelparamstatu
title = "Extra Binaries"
description = """\
Talos Linux now ships with `nft` binary in the rootfs to support CNIs which shell out to `nft` command.
"""
[notes.ethernet-config]
title = "Ethernet Configuration"
description = """\
The Ethernet configuration now includes a `wakeOnLAN` field to enable Wake-on-LAN (WOL) support.
This field can be set to enable WOL and specify the desired WOL modes.
"""
[make_deps]

View File

@ -87,6 +87,10 @@ func (suite *NodeIdentitySuite) TestLoad() {
func TestNodeIdentitySuite(t *testing.T) {
t.Parallel()
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
suite.Run(t, &NodeIdentitySuite{
DefaultSuite: ctest.DefaultSuite{
AfterSetup: func(suite *ctest.DefaultSuite) {

View File

@ -297,6 +297,10 @@ func (suite *AcquireSuite) injectViaDisk(cfg []byte, wait bool) {
}
func (suite *AcquireSuite) TestFromDisk() {
if os.Geteuid() != 0 {
suite.T().Skip("skipping test that requires root privileges")
}
suite.presentStateVolume()
suite.triggerAcquire()
@ -319,6 +323,10 @@ func (suite *AcquireSuite) TestFromDisk() {
}
func (suite *AcquireSuite) TestFromDiskFailure() {
if os.Geteuid() != 0 {
suite.T().Skip("skipping test that requires root privileges")
}
suite.presentStateVolume()
suite.triggerAcquire()
@ -344,6 +352,10 @@ func (suite *AcquireSuite) TestFromDiskFailure() {
}
func (suite *AcquireSuite) TestFromDiskToMaintenance() {
if os.Geteuid() != 0 {
suite.T().Skip("skipping test that requires root privileges")
}
suite.presentStateVolume()
suite.triggerAcquire()

View File

@ -133,6 +133,10 @@ func (suite *PersistenceSuite) TestConfig() {
func TestPersistenceSuite(t *testing.T) {
t.Parallel()
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
sideroLinkCfg1 := siderolink.NewConfigV1Alpha1()
sideroLinkCfg1.APIUrlConfig.URL = must(url.Parse("https://siderolink.api/?jointoken=secret&user=alice"))

View File

@ -139,6 +139,10 @@ func TestIdentitySuite(t *testing.T) {
t.Skip("skipping test in FIPS mode")
}
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
suite.Run(t, &IdentitySuite{
DefaultSuite: ctest.DefaultSuite{
AfterSetup: func(suite *ctest.DefaultSuite) {

View File

@ -342,5 +342,9 @@ func (suite *EtcFileConfigSuite) TearDownTest() {
}
func TestEtcFileConfigSuite(t *testing.T) {
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
suite.Run(t, new(EtcFileConfigSuite))
}

View File

@ -83,6 +83,7 @@ func (ctrl *EthernetConfigController) apply(ctx context.Context, r controller.Ru
spec.TypedSpec().Rings = network.EthernetRingsSpec(cfg.Rings())
spec.TypedSpec().Channels = network.EthernetChannelsSpec(cfg.Channels())
spec.TypedSpec().Features = cfg.Features()
spec.TypedSpec().WakeOnLAN = cfg.WakeOnLAN()
return nil
}); err != nil {

View File

@ -17,6 +17,7 @@ import (
"go.uber.org/zap"
"github.com/siderolabs/talos/internal/app/machined/pkg/controllers/runtime"
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
"github.com/siderolabs/talos/pkg/machinery/resources/network"
)
@ -153,5 +154,22 @@ func (ctrl *EthernetSpecController) apply(
}
}
if spec.TypedSpec().WakeOnLAN != nil {
var wolModes nethelpers.WOLMode
for _, mode := range spec.TypedSpec().WakeOnLAN {
wolModes |= mode
}
if err := ethClient.SetWakeOnLAN(ethtool.WakeOnLAN{
Interface: ethtool.Interface{
Name: spec.Metadata().ID(),
},
Modes: ethtool.WOLMode(wolModes),
}); err != nil {
return fmt.Errorf("error updating wake-on-lan: %w", err)
}
}
return nil
}

View File

@ -103,7 +103,7 @@ func (ctrl *EthernetStatusController) Run(ctx context.Context, r controller.Runt
// reconcile function runs for every reconciliation loop querying the ethtool state and updating resources.
//
//nolint:gocyclo
//nolint:gocyclo,cyclop
func (ctrl *EthernetStatusController) reconcile(
ctx context.Context,
r controller.Runtime,
@ -145,6 +145,11 @@ func (ctrl *EthernetStatusController) reconcile(
lgger.Warn("error getting channels", zap.Error(err))
}
wolMode, err := ethClient.WakeOnLAN(iface)
if err != nil && !errors.Is(err, os.ErrNotExist) {
lgger.Warn("error getting Wake-on-LAN", zap.Error(err))
}
if err := safe.WriterModify(ctx, r, network.NewEthernetStatus(network.NamespaceName, iface.Name), func(res *network.EthernetStatus) error {
res.TypedSpec().Port = nethelpers.Port(linkInfo.Port)
@ -211,6 +216,16 @@ func (ctrl *EthernetStatusController) reconcile(
}
}
res.TypedSpec().WakeOnLAN = nil
if wolMode != nil {
for mode := nethelpers.WOLModeMin; mode <= nethelpers.WOLModeMax; mode <<= 1 {
if (nethelpers.WOLMode(wolMode.Modes) & mode) == mode {
res.TypedSpec().WakeOnLAN = append(res.TypedSpec().WakeOnLAN, mode)
}
}
}
return nil
}); err != nil {
return fmt.Errorf("error updating EthernetStatus resource: %w", err)

View File

@ -72,6 +72,10 @@ func (suite *PlatformConfigLoadSuite) TestLoadConfig() {
func TestPlatformConfigLoadSuite(t *testing.T) {
t.Parallel()
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
suite.Run(t, &PlatformConfigLoadSuite{
DefaultSuite: ctest.DefaultSuite{
Timeout: 5 * time.Second,

View File

@ -88,6 +88,10 @@ func (suite *PlatformConfigStoreSuite) TestStoreConfig() {
func TestPlatformConfigStoreSuite(t *testing.T) {
t.Parallel()
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
suite.Run(t, &PlatformConfigStoreSuite{
DefaultSuite: ctest.DefaultSuite{
Timeout: 5 * time.Second,

View File

@ -95,6 +95,10 @@ func (suite *EncryptionSaltSuite) TestLoad() {
func TestEncryptionSaltSuite(t *testing.T) {
t.Parallel()
if os.Geteuid() != 0 {
t.Skip("skipping test that requires root privileges")
}
suite.Run(t, &EncryptionSaltSuite{
DefaultSuite: ctest.DefaultSuite{
AfterSetup: func(suite *ctest.DefaultSuite) {

View File

@ -1985,6 +1985,71 @@ func (NethelpersVLANProtocol) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{29}
}
// NethelpersWOLMode wraps ethtool.WOLMode for YAML marshaling.
type NethelpersWOLMode int32
const (
NethelpersWOLMode_NETHELPERS_WOLMODE_UNSPECIFIED NethelpersWOLMode = 0
NethelpersWOLMode_WOL_MODE_PHY NethelpersWOLMode = 1
NethelpersWOLMode_WOL_MODE_UNICAST NethelpersWOLMode = 2
NethelpersWOLMode_WOL_MODE_MULTICAST NethelpersWOLMode = 4
NethelpersWOLMode_WOL_MODE_BROADCAST NethelpersWOLMode = 8
NethelpersWOLMode_WOL_MODE_MAGIC NethelpersWOLMode = 32
NethelpersWOLMode_WOL_MODE_MAGIC_SECURE NethelpersWOLMode = 64
NethelpersWOLMode_WOL_MODE_FILTER NethelpersWOLMode = 128
)
// Enum value maps for NethelpersWOLMode.
var (
NethelpersWOLMode_name = map[int32]string{
0: "NETHELPERS_WOLMODE_UNSPECIFIED",
1: "WOL_MODE_PHY",
2: "WOL_MODE_UNICAST",
4: "WOL_MODE_MULTICAST",
8: "WOL_MODE_BROADCAST",
32: "WOL_MODE_MAGIC",
64: "WOL_MODE_MAGIC_SECURE",
128: "WOL_MODE_FILTER",
}
NethelpersWOLMode_value = map[string]int32{
"NETHELPERS_WOLMODE_UNSPECIFIED": 0,
"WOL_MODE_PHY": 1,
"WOL_MODE_UNICAST": 2,
"WOL_MODE_MULTICAST": 4,
"WOL_MODE_BROADCAST": 8,
"WOL_MODE_MAGIC": 32,
"WOL_MODE_MAGIC_SECURE": 64,
"WOL_MODE_FILTER": 128,
}
)
func (x NethelpersWOLMode) Enum() *NethelpersWOLMode {
p := new(NethelpersWOLMode)
*p = x
return p
}
func (x NethelpersWOLMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (NethelpersWOLMode) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[30].Descriptor()
}
func (NethelpersWOLMode) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[30]
}
func (x NethelpersWOLMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use NethelpersWOLMode.Descriptor instead.
func (NethelpersWOLMode) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{30}
}
// BlockEncryptionKeyType describes encryption key type.
type BlockEncryptionKeyType int32
@ -2022,11 +2087,11 @@ func (x BlockEncryptionKeyType) String() string {
}
func (BlockEncryptionKeyType) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[30].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[31].Descriptor()
}
func (BlockEncryptionKeyType) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[30]
return &file_resource_definitions_enums_enums_proto_enumTypes[31]
}
func (x BlockEncryptionKeyType) Number() protoreflect.EnumNumber {
@ -2035,7 +2100,7 @@ func (x BlockEncryptionKeyType) Number() protoreflect.EnumNumber {
// Deprecated: Use BlockEncryptionKeyType.Descriptor instead.
func (BlockEncryptionKeyType) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{30}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{31}
}
// BlockEncryptionProviderType describes encryption provider type.
@ -2069,11 +2134,11 @@ func (x BlockEncryptionProviderType) String() string {
}
func (BlockEncryptionProviderType) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[31].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[32].Descriptor()
}
func (BlockEncryptionProviderType) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[31]
return &file_resource_definitions_enums_enums_proto_enumTypes[32]
}
func (x BlockEncryptionProviderType) Number() protoreflect.EnumNumber {
@ -2082,7 +2147,7 @@ func (x BlockEncryptionProviderType) Number() protoreflect.EnumNumber {
// Deprecated: Use BlockEncryptionProviderType.Descriptor instead.
func (BlockEncryptionProviderType) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{31}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{32}
}
// BlockFilesystemType describes filesystem type.
@ -2128,11 +2193,11 @@ func (x BlockFilesystemType) String() string {
}
func (BlockFilesystemType) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[32].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[33].Descriptor()
}
func (BlockFilesystemType) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[32]
return &file_resource_definitions_enums_enums_proto_enumTypes[33]
}
func (x BlockFilesystemType) Number() protoreflect.EnumNumber {
@ -2141,7 +2206,7 @@ func (x BlockFilesystemType) Number() protoreflect.EnumNumber {
// Deprecated: Use BlockFilesystemType.Descriptor instead.
func (BlockFilesystemType) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{32}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{33}
}
// BlockVolumePhase describes volume phase.
@ -2193,11 +2258,11 @@ func (x BlockVolumePhase) String() string {
}
func (BlockVolumePhase) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[33].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[34].Descriptor()
}
func (BlockVolumePhase) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[33]
return &file_resource_definitions_enums_enums_proto_enumTypes[34]
}
func (x BlockVolumePhase) Number() protoreflect.EnumNumber {
@ -2206,7 +2271,7 @@ func (x BlockVolumePhase) Number() protoreflect.EnumNumber {
// Deprecated: Use BlockVolumePhase.Descriptor instead.
func (BlockVolumePhase) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{33}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{34}
}
// BlockVolumeType describes volume type.
@ -2252,11 +2317,11 @@ func (x BlockVolumeType) String() string {
}
func (BlockVolumeType) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[34].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[35].Descriptor()
}
func (BlockVolumeType) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[34]
return &file_resource_definitions_enums_enums_proto_enumTypes[35]
}
func (x BlockVolumeType) Number() protoreflect.EnumNumber {
@ -2265,7 +2330,7 @@ func (x BlockVolumeType) Number() protoreflect.EnumNumber {
// Deprecated: Use BlockVolumeType.Descriptor instead.
func (BlockVolumeType) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{34}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{35}
}
// CriImageCacheStatus describes image cache status type.
@ -2305,11 +2370,11 @@ func (x CriImageCacheStatus) String() string {
}
func (CriImageCacheStatus) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[35].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[36].Descriptor()
}
func (CriImageCacheStatus) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[35]
return &file_resource_definitions_enums_enums_proto_enumTypes[36]
}
func (x CriImageCacheStatus) Number() protoreflect.EnumNumber {
@ -2318,7 +2383,7 @@ func (x CriImageCacheStatus) Number() protoreflect.EnumNumber {
// Deprecated: Use CriImageCacheStatus.Descriptor instead.
func (CriImageCacheStatus) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{35}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{36}
}
// CriImageCacheCopyStatus describes image cache copy status type.
@ -2358,11 +2423,11 @@ func (x CriImageCacheCopyStatus) String() string {
}
func (CriImageCacheCopyStatus) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[36].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[37].Descriptor()
}
func (CriImageCacheCopyStatus) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[36]
return &file_resource_definitions_enums_enums_proto_enumTypes[37]
}
func (x CriImageCacheCopyStatus) Number() protoreflect.EnumNumber {
@ -2371,7 +2436,7 @@ func (x CriImageCacheCopyStatus) Number() protoreflect.EnumNumber {
// Deprecated: Use CriImageCacheCopyStatus.Descriptor instead.
func (CriImageCacheCopyStatus) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{36}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{37}
}
// KubespanPeerState is KubeSpan peer current state.
@ -2408,11 +2473,11 @@ func (x KubespanPeerState) String() string {
}
func (KubespanPeerState) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[37].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[38].Descriptor()
}
func (KubespanPeerState) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[37]
return &file_resource_definitions_enums_enums_proto_enumTypes[38]
}
func (x KubespanPeerState) Number() protoreflect.EnumNumber {
@ -2421,7 +2486,7 @@ func (x KubespanPeerState) Number() protoreflect.EnumNumber {
// Deprecated: Use KubespanPeerState.Descriptor instead.
func (KubespanPeerState) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{37}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{38}
}
// RuntimeMachineStage describes the stage of the machine boot/run process.
@ -2476,11 +2541,11 @@ func (x RuntimeMachineStage) String() string {
}
func (RuntimeMachineStage) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[38].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[39].Descriptor()
}
func (RuntimeMachineStage) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[38]
return &file_resource_definitions_enums_enums_proto_enumTypes[39]
}
func (x RuntimeMachineStage) Number() protoreflect.EnumNumber {
@ -2489,7 +2554,7 @@ func (x RuntimeMachineStage) Number() protoreflect.EnumNumber {
// Deprecated: Use RuntimeMachineStage.Descriptor instead.
func (RuntimeMachineStage) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{38}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{39}
}
// RuntimeSELinuxState describes the current SELinux status.
@ -2526,11 +2591,11 @@ func (x RuntimeSELinuxState) String() string {
}
func (RuntimeSELinuxState) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[39].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[40].Descriptor()
}
func (RuntimeSELinuxState) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[39]
return &file_resource_definitions_enums_enums_proto_enumTypes[40]
}
func (x RuntimeSELinuxState) Number() protoreflect.EnumNumber {
@ -2539,7 +2604,7 @@ func (x RuntimeSELinuxState) Number() protoreflect.EnumNumber {
// Deprecated: Use RuntimeSELinuxState.Descriptor instead.
func (RuntimeSELinuxState) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{39}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{40}
}
// RuntimeFIPSState describes the current FIPS status.
@ -2576,11 +2641,11 @@ func (x RuntimeFIPSState) String() string {
}
func (RuntimeFIPSState) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[40].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[41].Descriptor()
}
func (RuntimeFIPSState) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[40]
return &file_resource_definitions_enums_enums_proto_enumTypes[41]
}
func (x RuntimeFIPSState) Number() protoreflect.EnumNumber {
@ -2589,7 +2654,7 @@ func (x RuntimeFIPSState) Number() protoreflect.EnumNumber {
// Deprecated: Use RuntimeFIPSState.Descriptor instead.
func (RuntimeFIPSState) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{40}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{41}
}
// NetworkConfigLayer describes network configuration layers, with lowest priority first.
@ -2632,11 +2697,11 @@ func (x NetworkConfigLayer) String() string {
}
func (NetworkConfigLayer) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[41].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[42].Descriptor()
}
func (NetworkConfigLayer) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[41]
return &file_resource_definitions_enums_enums_proto_enumTypes[42]
}
func (x NetworkConfigLayer) Number() protoreflect.EnumNumber {
@ -2645,7 +2710,7 @@ func (x NetworkConfigLayer) Number() protoreflect.EnumNumber {
// Deprecated: Use NetworkConfigLayer.Descriptor instead.
func (NetworkConfigLayer) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{41}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{42}
}
// NetworkOperator enumerates Talos network operators.
@ -2682,11 +2747,11 @@ func (x NetworkOperator) String() string {
}
func (NetworkOperator) Descriptor() protoreflect.EnumDescriptor {
return file_resource_definitions_enums_enums_proto_enumTypes[42].Descriptor()
return file_resource_definitions_enums_enums_proto_enumTypes[43].Descriptor()
}
func (NetworkOperator) Type() protoreflect.EnumType {
return &file_resource_definitions_enums_enums_proto_enumTypes[42]
return &file_resource_definitions_enums_enums_proto_enumTypes[43]
}
func (x NetworkOperator) Number() protoreflect.EnumNumber {
@ -2695,7 +2760,7 @@ func (x NetworkOperator) Number() protoreflect.EnumNumber {
// Deprecated: Use NetworkOperator.Descriptor instead.
func (NetworkOperator) EnumDescriptor() ([]byte, []int) {
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{42}
return file_resource_definitions_enums_enums_proto_rawDescGZIP(), []int{43}
}
var File_resource_definitions_enums_enums_proto protoreflect.FileDescriptor
@ -2999,7 +3064,16 @@ const file_resource_definitions_enums_enums_proto_rawDesc = "" +
"\x16NethelpersVLANProtocol\x12'\n" +
"#NETHELPERS_VLANPROTOCOL_UNSPECIFIED\x10\x00\x12\x19\n" +
"\x13VLAN_PROTOCOL8021_Q\x10\x80\x82\x02\x12\x1a\n" +
"\x14VLAN_PROTOCOL8021_AD\x10\xa8\x91\x02*\x7f\n" +
"\x14VLAN_PROTOCOL8021_AD\x10\xa8\x91\x02*\xd4\x01\n" +
"\x11NethelpersWOLMode\x12\"\n" +
"\x1eNETHELPERS_WOLMODE_UNSPECIFIED\x10\x00\x12\x10\n" +
"\fWOL_MODE_PHY\x10\x01\x12\x14\n" +
"\x10WOL_MODE_UNICAST\x10\x02\x12\x16\n" +
"\x12WOL_MODE_MULTICAST\x10\x04\x12\x16\n" +
"\x12WOL_MODE_BROADCAST\x10\b\x12\x12\n" +
"\x0eWOL_MODE_MAGIC\x10 \x12\x19\n" +
"\x15WOL_MODE_MAGIC_SECURE\x10@\x12\x14\n" +
"\x0fWOL_MODE_FILTER\x10\x80\x01*\x7f\n" +
"\x16BlockEncryptionKeyType\x12\x19\n" +
"\x15ENCRYPTION_KEY_STATIC\x10\x00\x12\x1a\n" +
"\x16ENCRYPTION_KEY_NODE_ID\x10\x01\x12\x16\n" +
@ -3087,7 +3161,7 @@ func file_resource_definitions_enums_enums_proto_rawDescGZIP() []byte {
return file_resource_definitions_enums_enums_proto_rawDescData
}
var file_resource_definitions_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 43)
var file_resource_definitions_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 44)
var file_resource_definitions_enums_enums_proto_goTypes = []any{
(MachineType)(0), // 0: talos.resource.definitions.enums.MachineType
(NethelpersAddressFlag)(0), // 1: talos.resource.definitions.enums.NethelpersAddressFlag
@ -3119,19 +3193,20 @@ var file_resource_definitions_enums_enums_proto_goTypes = []any{
(NethelpersRoutingTable)(0), // 27: talos.resource.definitions.enums.NethelpersRoutingTable
(NethelpersScope)(0), // 28: talos.resource.definitions.enums.NethelpersScope
(NethelpersVLANProtocol)(0), // 29: talos.resource.definitions.enums.NethelpersVLANProtocol
(BlockEncryptionKeyType)(0), // 30: talos.resource.definitions.enums.BlockEncryptionKeyType
(BlockEncryptionProviderType)(0), // 31: talos.resource.definitions.enums.BlockEncryptionProviderType
(BlockFilesystemType)(0), // 32: talos.resource.definitions.enums.BlockFilesystemType
(BlockVolumePhase)(0), // 33: talos.resource.definitions.enums.BlockVolumePhase
(BlockVolumeType)(0), // 34: talos.resource.definitions.enums.BlockVolumeType
(CriImageCacheStatus)(0), // 35: talos.resource.definitions.enums.CriImageCacheStatus
(CriImageCacheCopyStatus)(0), // 36: talos.resource.definitions.enums.CriImageCacheCopyStatus
(KubespanPeerState)(0), // 37: talos.resource.definitions.enums.KubespanPeerState
(RuntimeMachineStage)(0), // 38: talos.resource.definitions.enums.RuntimeMachineStage
(RuntimeSELinuxState)(0), // 39: talos.resource.definitions.enums.RuntimeSELinuxState
(RuntimeFIPSState)(0), // 40: talos.resource.definitions.enums.RuntimeFIPSState
(NetworkConfigLayer)(0), // 41: talos.resource.definitions.enums.NetworkConfigLayer
(NetworkOperator)(0), // 42: talos.resource.definitions.enums.NetworkOperator
(NethelpersWOLMode)(0), // 30: talos.resource.definitions.enums.NethelpersWOLMode
(BlockEncryptionKeyType)(0), // 31: talos.resource.definitions.enums.BlockEncryptionKeyType
(BlockEncryptionProviderType)(0), // 32: talos.resource.definitions.enums.BlockEncryptionProviderType
(BlockFilesystemType)(0), // 33: talos.resource.definitions.enums.BlockFilesystemType
(BlockVolumePhase)(0), // 34: talos.resource.definitions.enums.BlockVolumePhase
(BlockVolumeType)(0), // 35: talos.resource.definitions.enums.BlockVolumeType
(CriImageCacheStatus)(0), // 36: talos.resource.definitions.enums.CriImageCacheStatus
(CriImageCacheCopyStatus)(0), // 37: talos.resource.definitions.enums.CriImageCacheCopyStatus
(KubespanPeerState)(0), // 38: talos.resource.definitions.enums.KubespanPeerState
(RuntimeMachineStage)(0), // 39: talos.resource.definitions.enums.RuntimeMachineStage
(RuntimeSELinuxState)(0), // 40: talos.resource.definitions.enums.RuntimeSELinuxState
(RuntimeFIPSState)(0), // 41: talos.resource.definitions.enums.RuntimeFIPSState
(NetworkConfigLayer)(0), // 42: talos.resource.definitions.enums.NetworkConfigLayer
(NetworkOperator)(0), // 43: talos.resource.definitions.enums.NetworkOperator
}
var file_resource_definitions_enums_enums_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
@ -3151,7 +3226,7 @@ func file_resource_definitions_enums_enums_proto_init() {
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_resource_definitions_enums_enums_proto_rawDesc), len(file_resource_definitions_enums_enums_proto_rawDesc)),
NumEnums: 43,
NumEnums: 44,
NumMessages: 0,
NumExtensions: 0,
NumServices: 0,

View File

@ -1336,10 +1336,11 @@ func (x *EthernetRingsStatus) GetTcpDataSplit() bool {
// EthernetSpecSpec describes config of Ethernet link.
type EthernetSpecSpec struct {
state protoimpl.MessageState `protogen:"open.v1"`
Rings *EthernetRingsSpec `protobuf:"bytes,1,opt,name=rings,proto3" json:"rings,omitempty"`
Features map[string]bool `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
Channels *EthernetChannelsSpec `protobuf:"bytes,3,opt,name=channels,proto3" json:"channels,omitempty"`
state protoimpl.MessageState `protogen:"open.v1"`
Rings *EthernetRingsSpec `protobuf:"bytes,1,opt,name=rings,proto3" json:"rings,omitempty"`
Features map[string]bool `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
Channels *EthernetChannelsSpec `protobuf:"bytes,3,opt,name=channels,proto3" json:"channels,omitempty"`
WakeOnLan []enums.NethelpersWOLMode `protobuf:"varint,4,rep,packed,name=wake_on_lan,json=wakeOnLan,proto3,enum=talos.resource.definitions.enums.NethelpersWOLMode" json:"wake_on_lan,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@ -1395,18 +1396,26 @@ func (x *EthernetSpecSpec) GetChannels() *EthernetChannelsSpec {
return nil
}
func (x *EthernetSpecSpec) GetWakeOnLan() []enums.NethelpersWOLMode {
if x != nil {
return x.WakeOnLan
}
return nil
}
// EthernetStatusSpec describes status of rendered secrets.
type EthernetStatusSpec struct {
state protoimpl.MessageState `protogen:"open.v1"`
LinkState bool `protobuf:"varint,1,opt,name=link_state,json=linkState,proto3" json:"link_state,omitempty"`
SpeedMegabits int64 `protobuf:"varint,2,opt,name=speed_megabits,json=speedMegabits,proto3" json:"speed_megabits,omitempty"`
Port enums.NethelpersPort `protobuf:"varint,3,opt,name=port,proto3,enum=talos.resource.definitions.enums.NethelpersPort" json:"port,omitempty"`
Duplex enums.NethelpersDuplex `protobuf:"varint,4,opt,name=duplex,proto3,enum=talos.resource.definitions.enums.NethelpersDuplex" json:"duplex,omitempty"`
OurModes []string `protobuf:"bytes,5,rep,name=our_modes,json=ourModes,proto3" json:"our_modes,omitempty"`
PeerModes []string `protobuf:"bytes,6,rep,name=peer_modes,json=peerModes,proto3" json:"peer_modes,omitempty"`
Rings *EthernetRingsStatus `protobuf:"bytes,7,opt,name=rings,proto3" json:"rings,omitempty"`
Features []*EthernetFeatureStatus `protobuf:"bytes,8,rep,name=features,proto3" json:"features,omitempty"`
Channels *EthernetChannelsStatus `protobuf:"bytes,9,opt,name=channels,proto3" json:"channels,omitempty"`
state protoimpl.MessageState `protogen:"open.v1"`
LinkState bool `protobuf:"varint,1,opt,name=link_state,json=linkState,proto3" json:"link_state,omitempty"`
SpeedMegabits int64 `protobuf:"varint,2,opt,name=speed_megabits,json=speedMegabits,proto3" json:"speed_megabits,omitempty"`
Port enums.NethelpersPort `protobuf:"varint,3,opt,name=port,proto3,enum=talos.resource.definitions.enums.NethelpersPort" json:"port,omitempty"`
Duplex enums.NethelpersDuplex `protobuf:"varint,4,opt,name=duplex,proto3,enum=talos.resource.definitions.enums.NethelpersDuplex" json:"duplex,omitempty"`
OurModes []string `protobuf:"bytes,5,rep,name=our_modes,json=ourModes,proto3" json:"our_modes,omitempty"`
PeerModes []string `protobuf:"bytes,6,rep,name=peer_modes,json=peerModes,proto3" json:"peer_modes,omitempty"`
Rings *EthernetRingsStatus `protobuf:"bytes,7,opt,name=rings,proto3" json:"rings,omitempty"`
Features []*EthernetFeatureStatus `protobuf:"bytes,8,rep,name=features,proto3" json:"features,omitempty"`
Channels *EthernetChannelsStatus `protobuf:"bytes,9,opt,name=channels,proto3" json:"channels,omitempty"`
WakeOnLan []enums.NethelpersWOLMode `protobuf:"varint,10,rep,packed,name=wake_on_lan,json=wakeOnLan,proto3,enum=talos.resource.definitions.enums.NethelpersWOLMode" json:"wake_on_lan,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@ -1504,6 +1513,13 @@ func (x *EthernetStatusSpec) GetChannels() *EthernetChannelsStatus {
return nil
}
func (x *EthernetStatusSpec) GetWakeOnLan() []enums.NethelpersWOLMode {
if x != nil {
return x.WakeOnLan
}
return nil
}
// HardwareAddrSpec describes spec for the link.
type HardwareAddrSpec struct {
state protoimpl.MessageState `protogen:"open.v1"`
@ -4646,14 +4662,15 @@ const file_resource_definitions_network_network_proto_rawDesc = "" +
"\atx_push\x18\f \x01(\bR\x06txPush\x12\x17\n" +
"\arx_push\x18\r \x01(\bR\x06rxPush\x12%\n" +
"\x0ftx_push_buf_len\x18\x0e \x01(\rR\ftxPushBufLen\x12$\n" +
"\x0etcp_data_split\x18\x0f \x01(\bR\ftcpDataSplit\"\xd2\x02\n" +
"\x0etcp_data_split\x18\x0f \x01(\bR\ftcpDataSplit\"\xa7\x03\n" +
"\x10EthernetSpecSpec\x12K\n" +
"\x05rings\x18\x01 \x01(\v25.talos.resource.definitions.network.EthernetRingsSpecR\x05rings\x12^\n" +
"\bfeatures\x18\x02 \x03(\v2B.talos.resource.definitions.network.EthernetSpecSpec.FeaturesEntryR\bfeatures\x12T\n" +
"\bchannels\x18\x03 \x01(\v28.talos.resource.definitions.network.EthernetChannelsSpecR\bchannels\x1a;\n" +
"\bchannels\x18\x03 \x01(\v28.talos.resource.definitions.network.EthernetChannelsSpecR\bchannels\x12S\n" +
"\vwake_on_lan\x18\x04 \x03(\x0e23.talos.resource.definitions.enums.NethelpersWOLModeR\twakeOnLan\x1a;\n" +
"\rFeaturesEntry\x12\x10\n" +
"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
"\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"\xa6\x04\n" +
"\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"\xfb\x04\n" +
"\x12EthernetStatusSpec\x12\x1d\n" +
"\n" +
"link_state\x18\x01 \x01(\bR\tlinkState\x12%\n" +
@ -4665,7 +4682,9 @@ const file_resource_definitions_network_network_proto_rawDesc = "" +
"peer_modes\x18\x06 \x03(\tR\tpeerModes\x12M\n" +
"\x05rings\x18\a \x01(\v27.talos.resource.definitions.network.EthernetRingsStatusR\x05rings\x12U\n" +
"\bfeatures\x18\b \x03(\v29.talos.resource.definitions.network.EthernetFeatureStatusR\bfeatures\x12V\n" +
"\bchannels\x18\t \x01(\v2:.talos.resource.definitions.network.EthernetChannelsStatusR\bchannels\"K\n" +
"\bchannels\x18\t \x01(\v2:.talos.resource.definitions.network.EthernetChannelsStatusR\bchannels\x12S\n" +
"\vwake_on_lan\x18\n" +
" \x03(\x0e23.talos.resource.definitions.enums.NethelpersWOLModeR\twakeOnLan\"K\n" +
"\x10HardwareAddrSpec\x12\x12\n" +
"\x04name\x18\x01 \x01(\tR\x04name\x12#\n" +
"\rhardware_addr\x18\x02 \x01(\fR\fhardwareAddr\"\xe5\x01\n" +
@ -5018,26 +5037,27 @@ var file_resource_definitions_network_network_proto_goTypes = []any{
(enums.NethelpersPrimaryReselect)(0), // 69: talos.resource.definitions.enums.NethelpersPrimaryReselect
(enums.NethelpersFailOverMAC)(0), // 70: talos.resource.definitions.enums.NethelpersFailOverMAC
(enums.NethelpersADSelect)(0), // 71: talos.resource.definitions.enums.NethelpersADSelect
(enums.NethelpersPort)(0), // 72: talos.resource.definitions.enums.NethelpersPort
(enums.NethelpersDuplex)(0), // 73: talos.resource.definitions.enums.NethelpersDuplex
(*common.NetIPPort)(nil), // 74: common.NetIPPort
(enums.NethelpersLinkType)(0), // 75: talos.resource.definitions.enums.NethelpersLinkType
(enums.NethelpersOperationalState)(0), // 76: talos.resource.definitions.enums.NethelpersOperationalState
(enums.NethelpersNfTablesChainHook)(0), // 77: talos.resource.definitions.enums.NethelpersNfTablesChainHook
(enums.NethelpersNfTablesChainPriority)(0), // 78: talos.resource.definitions.enums.NethelpersNfTablesChainPriority
(enums.NethelpersNfTablesVerdict)(0), // 79: talos.resource.definitions.enums.NethelpersNfTablesVerdict
(enums.NethelpersConntrackState)(0), // 80: talos.resource.definitions.enums.NethelpersConntrackState
(enums.NethelpersICMPType)(0), // 81: talos.resource.definitions.enums.NethelpersICMPType
(enums.NethelpersMatchOperator)(0), // 82: talos.resource.definitions.enums.NethelpersMatchOperator
(enums.NethelpersProtocol)(0), // 83: talos.resource.definitions.enums.NethelpersProtocol
(enums.NethelpersAddressSortAlgorithm)(0), // 84: talos.resource.definitions.enums.NethelpersAddressSortAlgorithm
(enums.NetworkOperator)(0), // 85: talos.resource.definitions.enums.NetworkOperator
(*runtime.PlatformMetadataSpec)(nil), // 86: talos.resource.definitions.runtime.PlatformMetadataSpec
(*durationpb.Duration)(nil), // 87: google.protobuf.Duration
(enums.NethelpersRoutingTable)(0), // 88: talos.resource.definitions.enums.NethelpersRoutingTable
(enums.NethelpersRouteType)(0), // 89: talos.resource.definitions.enums.NethelpersRouteType
(enums.NethelpersRouteProtocol)(0), // 90: talos.resource.definitions.enums.NethelpersRouteProtocol
(enums.NethelpersVLANProtocol)(0), // 91: talos.resource.definitions.enums.NethelpersVLANProtocol
(enums.NethelpersWOLMode)(0), // 72: talos.resource.definitions.enums.NethelpersWOLMode
(enums.NethelpersPort)(0), // 73: talos.resource.definitions.enums.NethelpersPort
(enums.NethelpersDuplex)(0), // 74: talos.resource.definitions.enums.NethelpersDuplex
(*common.NetIPPort)(nil), // 75: common.NetIPPort
(enums.NethelpersLinkType)(0), // 76: talos.resource.definitions.enums.NethelpersLinkType
(enums.NethelpersOperationalState)(0), // 77: talos.resource.definitions.enums.NethelpersOperationalState
(enums.NethelpersNfTablesChainHook)(0), // 78: talos.resource.definitions.enums.NethelpersNfTablesChainHook
(enums.NethelpersNfTablesChainPriority)(0), // 79: talos.resource.definitions.enums.NethelpersNfTablesChainPriority
(enums.NethelpersNfTablesVerdict)(0), // 80: talos.resource.definitions.enums.NethelpersNfTablesVerdict
(enums.NethelpersConntrackState)(0), // 81: talos.resource.definitions.enums.NethelpersConntrackState
(enums.NethelpersICMPType)(0), // 82: talos.resource.definitions.enums.NethelpersICMPType
(enums.NethelpersMatchOperator)(0), // 83: talos.resource.definitions.enums.NethelpersMatchOperator
(enums.NethelpersProtocol)(0), // 84: talos.resource.definitions.enums.NethelpersProtocol
(enums.NethelpersAddressSortAlgorithm)(0), // 85: talos.resource.definitions.enums.NethelpersAddressSortAlgorithm
(enums.NetworkOperator)(0), // 86: talos.resource.definitions.enums.NetworkOperator
(*runtime.PlatformMetadataSpec)(nil), // 87: talos.resource.definitions.runtime.PlatformMetadataSpec
(*durationpb.Duration)(nil), // 88: google.protobuf.Duration
(enums.NethelpersRoutingTable)(0), // 89: talos.resource.definitions.enums.NethelpersRoutingTable
(enums.NethelpersRouteType)(0), // 90: talos.resource.definitions.enums.NethelpersRouteType
(enums.NethelpersRouteProtocol)(0), // 91: talos.resource.definitions.enums.NethelpersRouteProtocol
(enums.NethelpersVLANProtocol)(0), // 92: talos.resource.definitions.enums.NethelpersVLANProtocol
}
var file_resource_definitions_network_network_proto_depIdxs = []int32{
59, // 0: talos.resource.definitions.network.AddressSpecSpec.address:type_name -> common.NetIPPrefix
@ -5064,112 +5084,114 @@ var file_resource_definitions_network_network_proto_depIdxs = []int32{
13, // 21: talos.resource.definitions.network.EthernetSpecSpec.rings:type_name -> talos.resource.definitions.network.EthernetRingsSpec
58, // 22: talos.resource.definitions.network.EthernetSpecSpec.features:type_name -> talos.resource.definitions.network.EthernetSpecSpec.FeaturesEntry
10, // 23: talos.resource.definitions.network.EthernetSpecSpec.channels:type_name -> talos.resource.definitions.network.EthernetChannelsSpec
72, // 24: talos.resource.definitions.network.EthernetStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort
73, // 25: talos.resource.definitions.network.EthernetStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex
14, // 26: talos.resource.definitions.network.EthernetStatusSpec.rings:type_name -> talos.resource.definitions.network.EthernetRingsStatus
12, // 27: talos.resource.definitions.network.EthernetStatusSpec.features:type_name -> talos.resource.definitions.network.EthernetFeatureStatus
11, // 28: talos.resource.definitions.network.EthernetStatusSpec.channels:type_name -> talos.resource.definitions.network.EthernetChannelsStatus
74, // 29: talos.resource.definitions.network.HostDNSConfigSpec.listen_addresses:type_name -> common.NetIPPort
63, // 30: talos.resource.definitions.network.HostDNSConfigSpec.service_host_dns_address:type_name -> common.NetIP
62, // 31: talos.resource.definitions.network.HostnameSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
75, // 32: talos.resource.definitions.network.LinkSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType
3, // 33: talos.resource.definitions.network.LinkSpecSpec.bond_slave:type_name -> talos.resource.definitions.network.BondSlave
5, // 34: talos.resource.definitions.network.LinkSpecSpec.bridge_slave:type_name -> talos.resource.definitions.network.BridgeSlave
55, // 35: talos.resource.definitions.network.LinkSpecSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec
2, // 36: talos.resource.definitions.network.LinkSpecSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec
4, // 37: talos.resource.definitions.network.LinkSpecSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec
57, // 38: talos.resource.definitions.network.LinkSpecSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec
62, // 39: talos.resource.definitions.network.LinkSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
75, // 40: talos.resource.definitions.network.LinkStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType
76, // 41: talos.resource.definitions.network.LinkStatusSpec.operational_state:type_name -> talos.resource.definitions.enums.NethelpersOperationalState
72, // 42: talos.resource.definitions.network.LinkStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort
73, // 43: talos.resource.definitions.network.LinkStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex
55, // 44: talos.resource.definitions.network.LinkStatusSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec
4, // 45: talos.resource.definitions.network.LinkStatusSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec
2, // 46: talos.resource.definitions.network.LinkStatusSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec
57, // 47: talos.resource.definitions.network.LinkStatusSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec
59, // 48: talos.resource.definitions.network.NfTablesAddressMatch.include_subnets:type_name -> common.NetIPPrefix
59, // 49: talos.resource.definitions.network.NfTablesAddressMatch.exclude_subnets:type_name -> common.NetIPPrefix
77, // 50: talos.resource.definitions.network.NfTablesChainSpec.hook:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainHook
78, // 51: talos.resource.definitions.network.NfTablesChainSpec.priority:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainPriority
34, // 52: talos.resource.definitions.network.NfTablesChainSpec.rules:type_name -> talos.resource.definitions.network.NfTablesRule
79, // 53: talos.resource.definitions.network.NfTablesChainSpec.policy:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict
80, // 54: talos.resource.definitions.network.NfTablesConntrackStateMatch.states:type_name -> talos.resource.definitions.enums.NethelpersConntrackState
81, // 55: talos.resource.definitions.network.NfTablesICMPTypeMatch.types:type_name -> talos.resource.definitions.enums.NethelpersICMPType
82, // 56: talos.resource.definitions.network.NfTablesIfNameMatch.operator:type_name -> talos.resource.definitions.enums.NethelpersMatchOperator
83, // 57: talos.resource.definitions.network.NfTablesLayer4Match.protocol:type_name -> talos.resource.definitions.enums.NethelpersProtocol
33, // 58: talos.resource.definitions.network.NfTablesLayer4Match.match_source_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch
33, // 59: talos.resource.definitions.network.NfTablesLayer4Match.match_destination_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch
28, // 60: talos.resource.definitions.network.NfTablesLayer4Match.match_icmp_type:type_name -> talos.resource.definitions.network.NfTablesICMPTypeMatch
40, // 61: talos.resource.definitions.network.NfTablesPortMatch.ranges:type_name -> talos.resource.definitions.network.PortRange
29, // 62: talos.resource.definitions.network.NfTablesRule.match_o_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch
79, // 63: talos.resource.definitions.network.NfTablesRule.verdict:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict
32, // 64: talos.resource.definitions.network.NfTablesRule.match_mark:type_name -> talos.resource.definitions.network.NfTablesMark
32, // 65: talos.resource.definitions.network.NfTablesRule.set_mark:type_name -> talos.resource.definitions.network.NfTablesMark
24, // 66: talos.resource.definitions.network.NfTablesRule.match_source_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch
24, // 67: talos.resource.definitions.network.NfTablesRule.match_destination_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch
30, // 68: talos.resource.definitions.network.NfTablesRule.match_layer4:type_name -> talos.resource.definitions.network.NfTablesLayer4Match
29, // 69: talos.resource.definitions.network.NfTablesRule.match_i_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch
26, // 70: talos.resource.definitions.network.NfTablesRule.clamp_mss:type_name -> talos.resource.definitions.network.NfTablesClampMSS
31, // 71: talos.resource.definitions.network.NfTablesRule.match_limit:type_name -> talos.resource.definitions.network.NfTablesLimitMatch
27, // 72: talos.resource.definitions.network.NfTablesRule.match_conntrack_state:type_name -> talos.resource.definitions.network.NfTablesConntrackStateMatch
59, // 73: talos.resource.definitions.network.NodeAddressFilterSpec.include_subnets:type_name -> common.NetIPPrefix
59, // 74: talos.resource.definitions.network.NodeAddressFilterSpec.exclude_subnets:type_name -> common.NetIPPrefix
84, // 75: talos.resource.definitions.network.NodeAddressSortAlgorithmSpec.algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm
59, // 76: talos.resource.definitions.network.NodeAddressSpec.addresses:type_name -> common.NetIPPrefix
84, // 77: talos.resource.definitions.network.NodeAddressSpec.sort_algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm
85, // 78: talos.resource.definitions.network.OperatorSpecSpec.operator:type_name -> talos.resource.definitions.enums.NetworkOperator
7, // 79: talos.resource.definitions.network.OperatorSpecSpec.dhcp4:type_name -> talos.resource.definitions.network.DHCP4OperatorSpec
8, // 80: talos.resource.definitions.network.OperatorSpecSpec.dhcp6:type_name -> talos.resource.definitions.network.DHCP6OperatorSpec
54, // 81: talos.resource.definitions.network.OperatorSpecSpec.vip:type_name -> talos.resource.definitions.network.VIPOperatorSpec
62, // 82: talos.resource.definitions.network.OperatorSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
0, // 83: talos.resource.definitions.network.PlatformConfigSpec.addresses:type_name -> talos.resource.definitions.network.AddressSpecSpec
22, // 84: talos.resource.definitions.network.PlatformConfigSpec.links:type_name -> talos.resource.definitions.network.LinkSpecSpec
45, // 85: talos.resource.definitions.network.PlatformConfigSpec.routes:type_name -> talos.resource.definitions.network.RouteSpecSpec
19, // 86: talos.resource.definitions.network.PlatformConfigSpec.hostnames:type_name -> talos.resource.definitions.network.HostnameSpecSpec
43, // 87: talos.resource.definitions.network.PlatformConfigSpec.resolvers:type_name -> talos.resource.definitions.network.ResolverSpecSpec
50, // 88: talos.resource.definitions.network.PlatformConfigSpec.time_servers:type_name -> talos.resource.definitions.network.TimeServerSpecSpec
38, // 89: talos.resource.definitions.network.PlatformConfigSpec.operators:type_name -> talos.resource.definitions.network.OperatorSpecSpec
63, // 90: talos.resource.definitions.network.PlatformConfigSpec.external_ips:type_name -> common.NetIP
41, // 91: talos.resource.definitions.network.PlatformConfigSpec.probes:type_name -> talos.resource.definitions.network.ProbeSpecSpec
86, // 92: talos.resource.definitions.network.PlatformConfigSpec.metadata:type_name -> talos.resource.definitions.runtime.PlatformMetadataSpec
87, // 93: talos.resource.definitions.network.ProbeSpecSpec.interval:type_name -> google.protobuf.Duration
49, // 94: talos.resource.definitions.network.ProbeSpecSpec.tcp:type_name -> talos.resource.definitions.network.TCPProbeSpec
62, // 95: talos.resource.definitions.network.ProbeSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
63, // 96: talos.resource.definitions.network.ResolverSpecSpec.dns_servers:type_name -> common.NetIP
62, // 97: talos.resource.definitions.network.ResolverSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
63, // 98: talos.resource.definitions.network.ResolverStatusSpec.dns_servers:type_name -> common.NetIP
60, // 99: talos.resource.definitions.network.RouteSpecSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily
59, // 100: talos.resource.definitions.network.RouteSpecSpec.destination:type_name -> common.NetIPPrefix
63, // 101: talos.resource.definitions.network.RouteSpecSpec.source:type_name -> common.NetIP
63, // 102: talos.resource.definitions.network.RouteSpecSpec.gateway:type_name -> common.NetIP
88, // 103: talos.resource.definitions.network.RouteSpecSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable
61, // 104: talos.resource.definitions.network.RouteSpecSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope
89, // 105: talos.resource.definitions.network.RouteSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType
90, // 106: talos.resource.definitions.network.RouteSpecSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol
62, // 107: talos.resource.definitions.network.RouteSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
60, // 108: talos.resource.definitions.network.RouteStatusSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily
59, // 109: talos.resource.definitions.network.RouteStatusSpec.destination:type_name -> common.NetIPPrefix
63, // 110: talos.resource.definitions.network.RouteStatusSpec.source:type_name -> common.NetIP
63, // 111: talos.resource.definitions.network.RouteStatusSpec.gateway:type_name -> common.NetIP
88, // 112: talos.resource.definitions.network.RouteStatusSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable
61, // 113: talos.resource.definitions.network.RouteStatusSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope
89, // 114: talos.resource.definitions.network.RouteStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType
90, // 115: talos.resource.definitions.network.RouteStatusSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol
87, // 116: talos.resource.definitions.network.TCPProbeSpec.timeout:type_name -> google.protobuf.Duration
62, // 117: talos.resource.definitions.network.TimeServerSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
63, // 118: talos.resource.definitions.network.VIPOperatorSpec.ip:type_name -> common.NetIP
52, // 119: talos.resource.definitions.network.VIPOperatorSpec.equinix_metal:type_name -> talos.resource.definitions.network.VIPEquinixMetalSpec
53, // 120: talos.resource.definitions.network.VIPOperatorSpec.h_cloud:type_name -> talos.resource.definitions.network.VIPHCloudSpec
91, // 121: talos.resource.definitions.network.VLANSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersVLANProtocol
87, // 122: talos.resource.definitions.network.WireguardPeer.persistent_keepalive_interval:type_name -> google.protobuf.Duration
59, // 123: talos.resource.definitions.network.WireguardPeer.allowed_ips:type_name -> common.NetIPPrefix
56, // 124: talos.resource.definitions.network.WireguardSpec.peers:type_name -> talos.resource.definitions.network.WireguardPeer
125, // [125:125] is the sub-list for method output_type
125, // [125:125] is the sub-list for method input_type
125, // [125:125] is the sub-list for extension type_name
125, // [125:125] is the sub-list for extension extendee
0, // [0:125] is the sub-list for field type_name
72, // 24: talos.resource.definitions.network.EthernetSpecSpec.wake_on_lan:type_name -> talos.resource.definitions.enums.NethelpersWOLMode
73, // 25: talos.resource.definitions.network.EthernetStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort
74, // 26: talos.resource.definitions.network.EthernetStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex
14, // 27: talos.resource.definitions.network.EthernetStatusSpec.rings:type_name -> talos.resource.definitions.network.EthernetRingsStatus
12, // 28: talos.resource.definitions.network.EthernetStatusSpec.features:type_name -> talos.resource.definitions.network.EthernetFeatureStatus
11, // 29: talos.resource.definitions.network.EthernetStatusSpec.channels:type_name -> talos.resource.definitions.network.EthernetChannelsStatus
72, // 30: talos.resource.definitions.network.EthernetStatusSpec.wake_on_lan:type_name -> talos.resource.definitions.enums.NethelpersWOLMode
75, // 31: talos.resource.definitions.network.HostDNSConfigSpec.listen_addresses:type_name -> common.NetIPPort
63, // 32: talos.resource.definitions.network.HostDNSConfigSpec.service_host_dns_address:type_name -> common.NetIP
62, // 33: talos.resource.definitions.network.HostnameSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
76, // 34: talos.resource.definitions.network.LinkSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType
3, // 35: talos.resource.definitions.network.LinkSpecSpec.bond_slave:type_name -> talos.resource.definitions.network.BondSlave
5, // 36: talos.resource.definitions.network.LinkSpecSpec.bridge_slave:type_name -> talos.resource.definitions.network.BridgeSlave
55, // 37: talos.resource.definitions.network.LinkSpecSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec
2, // 38: talos.resource.definitions.network.LinkSpecSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec
4, // 39: talos.resource.definitions.network.LinkSpecSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec
57, // 40: talos.resource.definitions.network.LinkSpecSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec
62, // 41: talos.resource.definitions.network.LinkSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
76, // 42: talos.resource.definitions.network.LinkStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersLinkType
77, // 43: talos.resource.definitions.network.LinkStatusSpec.operational_state:type_name -> talos.resource.definitions.enums.NethelpersOperationalState
73, // 44: talos.resource.definitions.network.LinkStatusSpec.port:type_name -> talos.resource.definitions.enums.NethelpersPort
74, // 45: talos.resource.definitions.network.LinkStatusSpec.duplex:type_name -> talos.resource.definitions.enums.NethelpersDuplex
55, // 46: talos.resource.definitions.network.LinkStatusSpec.vlan:type_name -> talos.resource.definitions.network.VLANSpec
4, // 47: talos.resource.definitions.network.LinkStatusSpec.bridge_master:type_name -> talos.resource.definitions.network.BridgeMasterSpec
2, // 48: talos.resource.definitions.network.LinkStatusSpec.bond_master:type_name -> talos.resource.definitions.network.BondMasterSpec
57, // 49: talos.resource.definitions.network.LinkStatusSpec.wireguard:type_name -> talos.resource.definitions.network.WireguardSpec
59, // 50: talos.resource.definitions.network.NfTablesAddressMatch.include_subnets:type_name -> common.NetIPPrefix
59, // 51: talos.resource.definitions.network.NfTablesAddressMatch.exclude_subnets:type_name -> common.NetIPPrefix
78, // 52: talos.resource.definitions.network.NfTablesChainSpec.hook:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainHook
79, // 53: talos.resource.definitions.network.NfTablesChainSpec.priority:type_name -> talos.resource.definitions.enums.NethelpersNfTablesChainPriority
34, // 54: talos.resource.definitions.network.NfTablesChainSpec.rules:type_name -> talos.resource.definitions.network.NfTablesRule
80, // 55: talos.resource.definitions.network.NfTablesChainSpec.policy:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict
81, // 56: talos.resource.definitions.network.NfTablesConntrackStateMatch.states:type_name -> talos.resource.definitions.enums.NethelpersConntrackState
82, // 57: talos.resource.definitions.network.NfTablesICMPTypeMatch.types:type_name -> talos.resource.definitions.enums.NethelpersICMPType
83, // 58: talos.resource.definitions.network.NfTablesIfNameMatch.operator:type_name -> talos.resource.definitions.enums.NethelpersMatchOperator
84, // 59: talos.resource.definitions.network.NfTablesLayer4Match.protocol:type_name -> talos.resource.definitions.enums.NethelpersProtocol
33, // 60: talos.resource.definitions.network.NfTablesLayer4Match.match_source_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch
33, // 61: talos.resource.definitions.network.NfTablesLayer4Match.match_destination_port:type_name -> talos.resource.definitions.network.NfTablesPortMatch
28, // 62: talos.resource.definitions.network.NfTablesLayer4Match.match_icmp_type:type_name -> talos.resource.definitions.network.NfTablesICMPTypeMatch
40, // 63: talos.resource.definitions.network.NfTablesPortMatch.ranges:type_name -> talos.resource.definitions.network.PortRange
29, // 64: talos.resource.definitions.network.NfTablesRule.match_o_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch
80, // 65: talos.resource.definitions.network.NfTablesRule.verdict:type_name -> talos.resource.definitions.enums.NethelpersNfTablesVerdict
32, // 66: talos.resource.definitions.network.NfTablesRule.match_mark:type_name -> talos.resource.definitions.network.NfTablesMark
32, // 67: talos.resource.definitions.network.NfTablesRule.set_mark:type_name -> talos.resource.definitions.network.NfTablesMark
24, // 68: talos.resource.definitions.network.NfTablesRule.match_source_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch
24, // 69: talos.resource.definitions.network.NfTablesRule.match_destination_address:type_name -> talos.resource.definitions.network.NfTablesAddressMatch
30, // 70: talos.resource.definitions.network.NfTablesRule.match_layer4:type_name -> talos.resource.definitions.network.NfTablesLayer4Match
29, // 71: talos.resource.definitions.network.NfTablesRule.match_i_if_name:type_name -> talos.resource.definitions.network.NfTablesIfNameMatch
26, // 72: talos.resource.definitions.network.NfTablesRule.clamp_mss:type_name -> talos.resource.definitions.network.NfTablesClampMSS
31, // 73: talos.resource.definitions.network.NfTablesRule.match_limit:type_name -> talos.resource.definitions.network.NfTablesLimitMatch
27, // 74: talos.resource.definitions.network.NfTablesRule.match_conntrack_state:type_name -> talos.resource.definitions.network.NfTablesConntrackStateMatch
59, // 75: talos.resource.definitions.network.NodeAddressFilterSpec.include_subnets:type_name -> common.NetIPPrefix
59, // 76: talos.resource.definitions.network.NodeAddressFilterSpec.exclude_subnets:type_name -> common.NetIPPrefix
85, // 77: talos.resource.definitions.network.NodeAddressSortAlgorithmSpec.algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm
59, // 78: talos.resource.definitions.network.NodeAddressSpec.addresses:type_name -> common.NetIPPrefix
85, // 79: talos.resource.definitions.network.NodeAddressSpec.sort_algorithm:type_name -> talos.resource.definitions.enums.NethelpersAddressSortAlgorithm
86, // 80: talos.resource.definitions.network.OperatorSpecSpec.operator:type_name -> talos.resource.definitions.enums.NetworkOperator
7, // 81: talos.resource.definitions.network.OperatorSpecSpec.dhcp4:type_name -> talos.resource.definitions.network.DHCP4OperatorSpec
8, // 82: talos.resource.definitions.network.OperatorSpecSpec.dhcp6:type_name -> talos.resource.definitions.network.DHCP6OperatorSpec
54, // 83: talos.resource.definitions.network.OperatorSpecSpec.vip:type_name -> talos.resource.definitions.network.VIPOperatorSpec
62, // 84: talos.resource.definitions.network.OperatorSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
0, // 85: talos.resource.definitions.network.PlatformConfigSpec.addresses:type_name -> talos.resource.definitions.network.AddressSpecSpec
22, // 86: talos.resource.definitions.network.PlatformConfigSpec.links:type_name -> talos.resource.definitions.network.LinkSpecSpec
45, // 87: talos.resource.definitions.network.PlatformConfigSpec.routes:type_name -> talos.resource.definitions.network.RouteSpecSpec
19, // 88: talos.resource.definitions.network.PlatformConfigSpec.hostnames:type_name -> talos.resource.definitions.network.HostnameSpecSpec
43, // 89: talos.resource.definitions.network.PlatformConfigSpec.resolvers:type_name -> talos.resource.definitions.network.ResolverSpecSpec
50, // 90: talos.resource.definitions.network.PlatformConfigSpec.time_servers:type_name -> talos.resource.definitions.network.TimeServerSpecSpec
38, // 91: talos.resource.definitions.network.PlatformConfigSpec.operators:type_name -> talos.resource.definitions.network.OperatorSpecSpec
63, // 92: talos.resource.definitions.network.PlatformConfigSpec.external_ips:type_name -> common.NetIP
41, // 93: talos.resource.definitions.network.PlatformConfigSpec.probes:type_name -> talos.resource.definitions.network.ProbeSpecSpec
87, // 94: talos.resource.definitions.network.PlatformConfigSpec.metadata:type_name -> talos.resource.definitions.runtime.PlatformMetadataSpec
88, // 95: talos.resource.definitions.network.ProbeSpecSpec.interval:type_name -> google.protobuf.Duration
49, // 96: talos.resource.definitions.network.ProbeSpecSpec.tcp:type_name -> talos.resource.definitions.network.TCPProbeSpec
62, // 97: talos.resource.definitions.network.ProbeSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
63, // 98: talos.resource.definitions.network.ResolverSpecSpec.dns_servers:type_name -> common.NetIP
62, // 99: talos.resource.definitions.network.ResolverSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
63, // 100: talos.resource.definitions.network.ResolverStatusSpec.dns_servers:type_name -> common.NetIP
60, // 101: talos.resource.definitions.network.RouteSpecSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily
59, // 102: talos.resource.definitions.network.RouteSpecSpec.destination:type_name -> common.NetIPPrefix
63, // 103: talos.resource.definitions.network.RouteSpecSpec.source:type_name -> common.NetIP
63, // 104: talos.resource.definitions.network.RouteSpecSpec.gateway:type_name -> common.NetIP
89, // 105: talos.resource.definitions.network.RouteSpecSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable
61, // 106: talos.resource.definitions.network.RouteSpecSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope
90, // 107: talos.resource.definitions.network.RouteSpecSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType
91, // 108: talos.resource.definitions.network.RouteSpecSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol
62, // 109: talos.resource.definitions.network.RouteSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
60, // 110: talos.resource.definitions.network.RouteStatusSpec.family:type_name -> talos.resource.definitions.enums.NethelpersFamily
59, // 111: talos.resource.definitions.network.RouteStatusSpec.destination:type_name -> common.NetIPPrefix
63, // 112: talos.resource.definitions.network.RouteStatusSpec.source:type_name -> common.NetIP
63, // 113: talos.resource.definitions.network.RouteStatusSpec.gateway:type_name -> common.NetIP
89, // 114: talos.resource.definitions.network.RouteStatusSpec.table:type_name -> talos.resource.definitions.enums.NethelpersRoutingTable
61, // 115: talos.resource.definitions.network.RouteStatusSpec.scope:type_name -> talos.resource.definitions.enums.NethelpersScope
90, // 116: talos.resource.definitions.network.RouteStatusSpec.type:type_name -> talos.resource.definitions.enums.NethelpersRouteType
91, // 117: talos.resource.definitions.network.RouteStatusSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersRouteProtocol
88, // 118: talos.resource.definitions.network.TCPProbeSpec.timeout:type_name -> google.protobuf.Duration
62, // 119: talos.resource.definitions.network.TimeServerSpecSpec.config_layer:type_name -> talos.resource.definitions.enums.NetworkConfigLayer
63, // 120: talos.resource.definitions.network.VIPOperatorSpec.ip:type_name -> common.NetIP
52, // 121: talos.resource.definitions.network.VIPOperatorSpec.equinix_metal:type_name -> talos.resource.definitions.network.VIPEquinixMetalSpec
53, // 122: talos.resource.definitions.network.VIPOperatorSpec.h_cloud:type_name -> talos.resource.definitions.network.VIPHCloudSpec
92, // 123: talos.resource.definitions.network.VLANSpec.protocol:type_name -> talos.resource.definitions.enums.NethelpersVLANProtocol
88, // 124: talos.resource.definitions.network.WireguardPeer.persistent_keepalive_interval:type_name -> google.protobuf.Duration
59, // 125: talos.resource.definitions.network.WireguardPeer.allowed_ips:type_name -> common.NetIPPrefix
56, // 126: talos.resource.definitions.network.WireguardSpec.peers:type_name -> talos.resource.definitions.network.WireguardPeer
127, // [127:127] is the sub-list for method output_type
127, // [127:127] is the sub-list for method input_type
127, // [127:127] is the sub-list for extension type_name
127, // [127:127] is the sub-list for extension extendee
0, // [0:127] is the sub-list for field type_name
}
func init() { file_resource_definitions_network_network_proto_init() }

View File

@ -1228,6 +1228,27 @@ func (m *EthernetSpecSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
i -= len(m.unknownFields)
copy(dAtA[i:], m.unknownFields)
}
if len(m.WakeOnLan) > 0 {
var pksize2 int
for _, num := range m.WakeOnLan {
pksize2 += protohelpers.SizeOfVarint(uint64(num))
}
i -= pksize2
j1 := i
for _, num1 := range m.WakeOnLan {
num := uint64(num1)
for num >= 1<<7 {
dAtA[j1] = uint8(uint64(num)&0x7f | 0x80)
num >>= 7
j1++
}
dAtA[j1] = uint8(num)
j1++
}
i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2))
i--
dAtA[i] = 0x22
}
if m.Channels != nil {
size, err := m.Channels.MarshalToSizedBufferVT(dAtA[:i])
if err != nil {
@ -1303,6 +1324,27 @@ func (m *EthernetStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
i -= len(m.unknownFields)
copy(dAtA[i:], m.unknownFields)
}
if len(m.WakeOnLan) > 0 {
var pksize2 int
for _, num := range m.WakeOnLan {
pksize2 += protohelpers.SizeOfVarint(uint64(num))
}
i -= pksize2
j1 := i
for _, num1 := range m.WakeOnLan {
num := uint64(num1)
for num >= 1<<7 {
dAtA[j1] = uint8(uint64(num)&0x7f | 0x80)
num >>= 7
j1++
}
dAtA[j1] = uint8(num)
j1++
}
i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2))
i--
dAtA[i] = 0x52
}
if m.Channels != nil {
size, err := m.Channels.MarshalToSizedBufferVT(dAtA[:i])
if err != nil {
@ -4994,6 +5036,13 @@ func (m *EthernetSpecSpec) SizeVT() (n int) {
l = m.Channels.SizeVT()
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
if len(m.WakeOnLan) > 0 {
l = 0
for _, e := range m.WakeOnLan {
l += protohelpers.SizeOfVarint(uint64(e))
}
n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l
}
n += len(m.unknownFields)
return n
}
@ -5042,6 +5091,13 @@ func (m *EthernetStatusSpec) SizeVT() (n int) {
l = m.Channels.SizeVT()
n += 1 + l + protohelpers.SizeOfVarint(uint64(l))
}
if len(m.WakeOnLan) > 0 {
l = 0
for _, e := range m.WakeOnLan {
l += protohelpers.SizeOfVarint(uint64(e))
}
n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l
}
n += len(m.unknownFields)
return n
}
@ -9316,6 +9372,75 @@ func (m *EthernetSpecSpec) UnmarshalVT(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 4:
if wireType == 0 {
var v enums.NethelpersWOLMode
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= enums.NethelpersWOLMode(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.WakeOnLan = append(m.WakeOnLan, v)
} else if wireType == 2 {
var packedLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
packedLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if packedLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + packedLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
var elementCount int
if elementCount != 0 && len(m.WakeOnLan) == 0 {
m.WakeOnLan = make([]enums.NethelpersWOLMode, 0, elementCount)
}
for iNdEx < postIndex {
var v enums.NethelpersWOLMode
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= enums.NethelpersWOLMode(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.WakeOnLan = append(m.WakeOnLan, v)
}
} else {
return fmt.Errorf("proto: wrong wireType = %d for field WakeOnLan", wireType)
}
default:
iNdEx = preIndex
skippy, err := protohelpers.Skip(dAtA[iNdEx:])
@ -9614,6 +9739,75 @@ func (m *EthernetStatusSpec) UnmarshalVT(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 10:
if wireType == 0 {
var v enums.NethelpersWOLMode
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= enums.NethelpersWOLMode(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.WakeOnLan = append(m.WakeOnLan, v)
} else if wireType == 2 {
var packedLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
packedLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if packedLen < 0 {
return protohelpers.ErrInvalidLength
}
postIndex := iNdEx + packedLen
if postIndex < 0 {
return protohelpers.ErrInvalidLength
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
var elementCount int
if elementCount != 0 && len(m.WakeOnLan) == 0 {
m.WakeOnLan = make([]enums.NethelpersWOLMode, 0, elementCount)
}
for iNdEx < postIndex {
var v enums.NethelpersWOLMode
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protohelpers.ErrIntOverflow
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= enums.NethelpersWOLMode(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.WakeOnLan = append(m.WakeOnLan, v)
}
} else {
return fmt.Errorf("proto: wrong wireType = %d for field WakeOnLan", wireType)
}
default:
iNdEx = preIndex
skippy, err := protohelpers.Skip(dAtA[iNdEx:])

View File

@ -71,6 +71,7 @@ type EthernetConfig interface {
Rings() EthernetRingsConfig
Channels() EthernetChannelsConfig
Features() map[string]bool
WakeOnLAN() []nethelpers.WOLMode
}
// EthernetRingsConfig defines a configuration for Ethernet link rings.

View File

@ -849,6 +849,16 @@
"description": "Configuration for Ethernet link channels.\n\nThis is similar to ethtool -L command.\n",
"markdownDescription": "Configuration for Ethernet link channels.\n\nThis is similar to `ethtool -L` command.",
"x-intellij-html-description": "\u003cp\u003eConfiguration for Ethernet link channels.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -L\u003c/code\u003e command.\u003c/p\u003e\n"
},
"wakeOnLan": {
"items": {
"type": "string"
},
"type": "array",
"title": "wakeOnLan",
"description": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to ethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt; command.\n",
"markdownDescription": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to `ethtool -s \u003clink\u003e wol \u003coptions\u003e` command.",
"x-intellij-html-description": "\u003cp\u003eWake-on-LAN modes to enable.\u003c/p\u003e\n\n\u003cp\u003eIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt;\u003c/code\u003e command.\u003c/p\u003e\n"
}
},
"additionalProperties": false,

View File

@ -101,6 +101,10 @@ func (o *EthernetConfigV1Alpha1) DeepCopy() *EthernetConfigV1Alpha1 {
*cp.ChannelsConfig.Combined = *o.ChannelsConfig.Combined
}
}
if o.WakeOnLANConfig != nil {
cp.WakeOnLANConfig = make([]nethelpers.WOLMode, len(o.WakeOnLANConfig))
copy(cp.WakeOnLANConfig, o.WakeOnLANConfig)
}
return &cp
}

View File

@ -15,6 +15,7 @@ import (
"github.com/siderolabs/talos/pkg/machinery/config/internal/registry"
"github.com/siderolabs/talos/pkg/machinery/config/types/meta"
"github.com/siderolabs/talos/pkg/machinery/config/validation"
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
)
// EthernetKind is a Ethernet config document kind.
@ -69,6 +70,30 @@ type EthernetConfigV1Alpha1 struct {
//
// This is similar to `ethtool -L` command.
ChannelsConfig *EthernetChannelsConfig `yaml:"channels,omitempty"`
// description: |
// Wake-on-LAN modes to enable.
//
// If this field is omitted, Wake-on-LAN configuration is not changed.
// An empty list disables Wake-on-LAN.
//
// This is similar to `ethtool -s <link> wol <options>` command.
// values:
// - "phy"
// - "unicast"
// - "multicast"
// - "broadcast"
// - "arp"
// - "magic"
// - "magicsecure"
// - "filter"
// schema:
// type: array
// items:
// type: string
// examples:
// - value: >
// []nethelpers.WOLMode{nethelpers.WOLModeUnicast, nethelpers.WOLModeMagic}
WakeOnLANConfig []nethelpers.WOLMode `yaml:"wakeOnLan,omitempty"`
}
// EthernetRingsConfig is a configuration for Ethernet link rings.
@ -172,6 +197,11 @@ func (s *EthernetConfigV1Alpha1) Features() map[string]bool {
return s.FeaturesConfig
}
// WakeOnLAN implements config.EthernetConfig interface.
func (s *EthernetConfigV1Alpha1) WakeOnLAN() []nethelpers.WOLMode {
return s.WakeOnLANConfig
}
// Validate implements config.Validator interface.
func (s *EthernetConfigV1Alpha1) Validate(validation.RuntimeMode, ...validation.Option) ([]string, error) {
if s.MetaName == "" {

View File

@ -16,6 +16,7 @@ import (
"github.com/siderolabs/talos/pkg/machinery/config/encoder"
"github.com/siderolabs/talos/pkg/machinery/config/types/meta"
"github.com/siderolabs/talos/pkg/machinery/config/types/network"
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
)
//go:embed testdata/ethernetconfig.yaml
@ -34,6 +35,10 @@ func TestEthernetConfigMarshalStability(t *testing.T) {
cfg.ChannelsConfig = &network.EthernetChannelsConfig{
Combined: pointer.To[uint32](1),
}
cfg.WakeOnLANConfig = []nethelpers.WOLMode{
nethelpers.WOLModeUnicast,
nethelpers.WOLModeMulticast,
}
marshaled, err := encoder.NewEncoder(cfg, encoder.WithComments(encoder.CommentsDisabled)).Encode()
require.NoError(t, err)
@ -67,6 +72,10 @@ func TestEthernetConfigUnmarshal(t *testing.T) {
ChannelsConfig: &network.EthernetChannelsConfig{
Combined: pointer.To[uint32](1),
},
WakeOnLANConfig: []nethelpers.WOLMode{
nethelpers.WOLModeUnicast,
nethelpers.WOLModeMulticast,
},
}, docs[0])
}

View File

@ -10,6 +10,7 @@ import (
"net/netip"
"github.com/siderolabs/talos/pkg/machinery/config/encoder"
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
)
func (DefaultActionConfigV1Alpha1) Doc() *encoder.Doc {
@ -72,11 +73,30 @@ func (EthernetConfigV1Alpha1) Doc() *encoder.Doc {
Description: "Configuration for Ethernet link channels.\n\nThis is similar to `ethtool -L` command.",
Comments: [3]string{"" /* encoder.HeadComment */, "Configuration for Ethernet link channels." /* encoder.LineComment */, "" /* encoder.FootComment */},
},
{
Name: "wakeOnLan",
Type: "[]WOLMode",
Note: "",
Description: "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to `ethtool -s <link> wol <options>` command.",
Comments: [3]string{"" /* encoder.HeadComment */, "Wake-on-LAN modes to enable." /* encoder.LineComment */, "" /* encoder.FootComment */},
Values: []string{
"phy",
"unicast",
"multicast",
"broadcast",
"arp",
"magic",
"magicsecure",
"filter",
},
},
},
}
doc.AddExample("", exampleEthernetConfigV1Alpha1())
doc.Fields[5].AddExample("", []nethelpers.WOLMode{nethelpers.WOLModeUnicast, nethelpers.WOLModeMagic})
return doc
}

View File

@ -7,3 +7,6 @@ rings:
rx: 16
channels:
combined: 1
wakeOnLan:
- unicast
- multicast

View File

@ -1,4 +1,4 @@
// Code generated by "enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol -linecomment -text"; DO NOT EDIT.
// Code generated by "enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol,WOLMode -linecomment -text"; DO NOT EDIT.
package nethelpers
@ -3499,3 +3499,136 @@ func (i *VLANProtocol) UnmarshalText(text []byte) error {
*i, err = VLANProtocolString(string(text))
return err
}
const (
_WOLModeName_0 = "phyunicast"
_WOLModeLowerName_0 = "phyunicast"
_WOLModeName_1 = "multicast"
_WOLModeLowerName_1 = "multicast"
_WOLModeName_2 = "broadcast"
_WOLModeLowerName_2 = "broadcast"
_WOLModeName_3 = "magic"
_WOLModeLowerName_3 = "magic"
_WOLModeName_4 = "magicsecure"
_WOLModeLowerName_4 = "magicsecure"
_WOLModeName_5 = "filter"
_WOLModeLowerName_5 = "filter"
)
var (
_WOLModeIndex_0 = [...]uint8{0, 3, 10}
_WOLModeIndex_1 = [...]uint8{0, 9}
_WOLModeIndex_2 = [...]uint8{0, 9}
_WOLModeIndex_3 = [...]uint8{0, 5}
_WOLModeIndex_4 = [...]uint8{0, 11}
_WOLModeIndex_5 = [...]uint8{0, 6}
)
func (i WOLMode) String() string {
switch {
case 1 <= i && i <= 2:
i -= 1
return _WOLModeName_0[_WOLModeIndex_0[i]:_WOLModeIndex_0[i+1]]
case i == 4:
return _WOLModeName_1
case i == 8:
return _WOLModeName_2
case i == 32:
return _WOLModeName_3
case i == 64:
return _WOLModeName_4
case i == 128:
return _WOLModeName_5
default:
return fmt.Sprintf("WOLMode(%d)", i)
}
}
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
func _WOLModeNoOp() {
var x [1]struct{}
_ = x[WOLModePhy-(1)]
_ = x[WOLModeUnicast-(2)]
_ = x[WOLModeMulticast-(4)]
_ = x[WOLModeBroadcast-(8)]
_ = x[WOLModeMagic-(32)]
_ = x[WOLModeMagicSecure-(64)]
_ = x[WOLModeFilter-(128)]
}
var _WOLModeValues = []WOLMode{WOLModePhy, WOLModeUnicast, WOLModeMulticast, WOLModeBroadcast, WOLModeMagic, WOLModeMagicSecure, WOLModeFilter}
var _WOLModeNameToValueMap = map[string]WOLMode{
_WOLModeName_0[0:3]: WOLModePhy,
_WOLModeLowerName_0[0:3]: WOLModePhy,
_WOLModeName_0[3:10]: WOLModeUnicast,
_WOLModeLowerName_0[3:10]: WOLModeUnicast,
_WOLModeName_1[0:9]: WOLModeMulticast,
_WOLModeLowerName_1[0:9]: WOLModeMulticast,
_WOLModeName_2[0:9]: WOLModeBroadcast,
_WOLModeLowerName_2[0:9]: WOLModeBroadcast,
_WOLModeName_3[0:5]: WOLModeMagic,
_WOLModeLowerName_3[0:5]: WOLModeMagic,
_WOLModeName_4[0:11]: WOLModeMagicSecure,
_WOLModeLowerName_4[0:11]: WOLModeMagicSecure,
_WOLModeName_5[0:6]: WOLModeFilter,
_WOLModeLowerName_5[0:6]: WOLModeFilter,
}
var _WOLModeNames = []string{
_WOLModeName_0[0:3],
_WOLModeName_0[3:10],
_WOLModeName_1[0:9],
_WOLModeName_2[0:9],
_WOLModeName_3[0:5],
_WOLModeName_4[0:11],
_WOLModeName_5[0:6],
}
// WOLModeString retrieves an enum value from the enum constants string name.
// Throws an error if the param is not part of the enum.
func WOLModeString(s string) (WOLMode, error) {
if val, ok := _WOLModeNameToValueMap[s]; ok {
return val, nil
}
if val, ok := _WOLModeNameToValueMap[strings.ToLower(s)]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to WOLMode values", s)
}
// WOLModeValues returns all values of the enum
func WOLModeValues() []WOLMode {
return _WOLModeValues
}
// WOLModeStrings returns a slice of all String values of the enum
func WOLModeStrings() []string {
strs := make([]string, len(_WOLModeNames))
copy(strs, _WOLModeNames)
return strs
}
// IsAWOLMode returns "true" if the value is listed in the enum definition. "false" otherwise
func (i WOLMode) IsAWOLMode() bool {
for _, v := range _WOLModeValues {
if i == v {
return true
}
}
return false
}
// MarshalText implements the encoding.TextMarshaler interface for WOLMode
func (i WOLMode) MarshalText() ([]byte, error) {
return []byte(i.String()), nil
}
// UnmarshalText implements the encoding.TextUnmarshaler interface for WOLMode
func (i *WOLMode) UnmarshalText(text []byte) error {
var err error
*i, err = WOLModeString(string(text))
return err
}

View File

@ -5,5 +5,5 @@
// Package nethelpers provides types and type wrappers to support network resources.
package nethelpers
//go:generate go tool github.com/dmarkham/enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol -linecomment -text
//go:generate go tool github.com/dmarkham/enumer -type=ARPAllTargets,ARPValidate,AddressFlag,AddressSortAlgorithm,ADSelect,AutoHostnameKind,BondMode,BondXmitHashPolicy,ConntrackState,DefaultAction,Duplex,Family,LACPRate,LinkFlag,LinkType,MatchOperator,NfTablesChainHook,NfTablesChainPriority,NfTablesVerdict,OperationalState,Port,PrimaryReselect,Protocol,RouteFlag,RouteProtocol,RouteType,RoutingTable,Scope,Status,VLANProtocol,WOLMode -linecomment -text
//go:generate go tool github.com/dmarkham/enumer -type=FailOverMAC -linecomment

View File

@ -0,0 +1,29 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package nethelpers
import "github.com/mdlayher/ethtool"
// WOLMode wraps ethtool.WOLMode for YAML marshaling.
type WOLMode int
// Constants copied from ethtool to provide Stringer interface.
//
//structprotogen:gen_enum
const (
WOLModePhy WOLMode = WOLMode(ethtool.PHY) // phy
WOLModeUnicast WOLMode = WOLMode(ethtool.Unicast) // unicast
WOLModeMulticast WOLMode = WOLMode(ethtool.Multicast) // multicast
WOLModeBroadcast WOLMode = WOLMode(ethtool.Broadcast) // broadcast
WOLModeMagic WOLMode = WOLMode(ethtool.Magic) // magic
WOLModeMagicSecure WOLMode = WOLMode(ethtool.MagicSecure) // magicsecure
WOLModeFilter WOLMode = WOLMode(ethtool.Filter) // filter
)
// WOLModeMin is the minimum valid WOLMode.
const WOLModeMin = WOLModePhy
// WOLModeMax is the maximum valid WOLMode.
const WOLModeMax = WOLModeFilter

View File

@ -95,6 +95,10 @@ func (o EthernetSpecSpec) DeepCopy() EthernetSpecSpec {
cp.Channels.Combined = new(uint32)
*cp.Channels.Combined = *o.Channels.Combined
}
if o.WakeOnLAN != nil {
cp.WakeOnLAN = make([]nethelpers.WOLMode, len(o.WakeOnLAN))
copy(cp.WakeOnLAN, o.WakeOnLAN)
}
return cp
}
@ -217,6 +221,10 @@ func (o EthernetStatusSpec) DeepCopy() EthernetStatusSpec {
*cp.Channels.Combined = *o.Channels.Combined
}
}
if o.WakeOnLAN != nil {
cp.WakeOnLAN = make([]nethelpers.WOLMode, len(o.WakeOnLAN))
copy(cp.WakeOnLAN, o.WakeOnLAN)
}
return cp
}

View File

@ -10,6 +10,7 @@ import (
"github.com/cosi-project/runtime/pkg/resource/protobuf"
"github.com/cosi-project/runtime/pkg/resource/typed"
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
"github.com/siderolabs/talos/pkg/machinery/proto"
)
@ -23,9 +24,10 @@ type EthernetSpec = typed.Resource[EthernetSpecSpec, EthernetSpecExtension]
//
//gotagsrewrite:gen
type EthernetSpecSpec struct {
Rings EthernetRingsSpec `yaml:"rings,omitempty" protobuf:"1"`
Features map[string]bool `yaml:"features,omitempty" protobuf:"2"`
Channels EthernetChannelsSpec `yaml:"channels,omitempty" protobuf:"3"`
Rings EthernetRingsSpec `yaml:"rings,omitempty" protobuf:"1"`
Features map[string]bool `yaml:"features,omitempty" protobuf:"2"`
Channels EthernetChannelsSpec `yaml:"channels,omitempty" protobuf:"3"`
WakeOnLAN []nethelpers.WOLMode `yaml:"wakeOnLan,omitempty" protobuf:"4"`
}
// EthernetRingsSpec describes config of Ethernet rings.

View File

@ -34,6 +34,7 @@ type EthernetStatusSpec struct {
Rings *EthernetRingsStatus `yaml:"rings,omitempty" protobuf:"7"`
Features EthernetFeatureStatusList `yaml:"features,omitempty" protobuf:"8"`
Channels *EthernetChannelsStatus `yaml:"channels,omitempty" protobuf:"9"`
WakeOnLAN []nethelpers.WOLMode `yaml:"wakeOnLAN,omitempty" protobuf:"10"`
}
// EthernetFeatureStatusList is a list of EthernetFeatureStatus.

View File

@ -120,7 +120,7 @@ func launchVM(config *LaunchConfig) error {
"-netdev", getNetdevParams(config.Network, "net0"),
"-device", fmt.Sprintf("virtio-net-pci,netdev=net0,mac=%s", config.VMMac),
// TODO: uncomment the following line to get another eth interface not connected to anything
// "-nic", "tap,model=virtio-net-pci",
// "-nic", "tap,model=e1000,script=no,downscript=no",
"-device", "virtio-rng-pci",
"-device", "virtio-balloon,deflate-on-oom=on",
"-monitor", fmt.Sprintf("unix:%s,server,nowait", config.MonitorPath),

View File

@ -288,6 +288,7 @@ description: Talos gRPC API reference.
- [NethelpersRoutingTable](#talos.resource.definitions.enums.NethelpersRoutingTable)
- [NethelpersScope](#talos.resource.definitions.enums.NethelpersScope)
- [NethelpersVLANProtocol](#talos.resource.definitions.enums.NethelpersVLANProtocol)
- [NethelpersWOLMode](#talos.resource.definitions.enums.NethelpersWOLMode)
- [NetworkConfigLayer](#talos.resource.definitions.enums.NetworkConfigLayer)
- [NetworkOperator](#talos.resource.definitions.enums.NetworkOperator)
- [RuntimeFIPSState](#talos.resource.definitions.enums.RuntimeFIPSState)
@ -5120,6 +5121,24 @@ NethelpersVLANProtocol is a VLAN protocol.
<a name="talos.resource.definitions.enums.NethelpersWOLMode"></a>
### NethelpersWOLMode
NethelpersWOLMode wraps ethtool.WOLMode for YAML marshaling.
| Name | Number | Description |
| ---- | ------ | ----------- |
| NETHELPERS_WOLMODE_UNSPECIFIED | 0 | |
| WOL_MODE_PHY | 1 | |
| WOL_MODE_UNICAST | 2 | |
| WOL_MODE_MULTICAST | 4 | |
| WOL_MODE_BROADCAST | 8 | |
| WOL_MODE_MAGIC | 32 | |
| WOL_MODE_MAGIC_SECURE | 64 | |
| WOL_MODE_FILTER | 128 | |
<a name="talos.resource.definitions.enums.NetworkConfigLayer"></a>
### NetworkConfigLayer
@ -8266,6 +8285,7 @@ EthernetSpecSpec describes config of Ethernet link.
| rings | [EthernetRingsSpec](#talos.resource.definitions.network.EthernetRingsSpec) | | |
| features | [EthernetSpecSpec.FeaturesEntry](#talos.resource.definitions.network.EthernetSpecSpec.FeaturesEntry) | repeated | |
| channels | [EthernetChannelsSpec](#talos.resource.definitions.network.EthernetChannelsSpec) | | |
| wake_on_lan | [talos.resource.definitions.enums.NethelpersWOLMode](#talos.resource.definitions.enums.NethelpersWOLMode) | repeated | |
@ -8305,6 +8325,7 @@ EthernetStatusSpec describes status of rendered secrets.
| rings | [EthernetRingsStatus](#talos.resource.definitions.network.EthernetRingsStatus) | | |
| features | [EthernetFeatureStatus](#talos.resource.definitions.network.EthernetFeatureStatus) | repeated | |
| channels | [EthernetChannelsStatus](#talos.resource.definitions.network.EthernetChannelsStatus) | | |
| wake_on_lan | [talos.resource.definitions.enums.NethelpersWOLMode](#talos.resource.definitions.enums.NethelpersWOLMode) | repeated | |

View File

@ -26,6 +26,11 @@ rings:
# Configuration for Ethernet link channels.
channels:
rx: 4 # Number of RX channels.
# # Wake-on-LAN modes to enable.
# wakeOnLan:
# - unicast
# - magic
{{< /highlight >}}
@ -35,6 +40,11 @@ channels:
|`features` |map[string]bool |Configuration for Ethernet features.<br><br>Set of features available and whether they can be enabled or disabled is driver specific.<br>Use `talosctl get ethernetstatus <link> -o yaml` to get the list of available features and<br>their current status. | |
|`rings` |<a href="#EthernetConfig.rings">EthernetRingsConfig</a> |Configuration for Ethernet link rings.<br><br>This is similar to `ethtool -G` command. | |
|`channels` |<a href="#EthernetConfig.channels">EthernetChannelsConfig</a> |Configuration for Ethernet link channels.<br><br>This is similar to `ethtool -L` command. | |
|`wakeOnLan` |[]WOLMode |Wake-on-LAN modes to enable.<br><br>If this field is omitted, Wake-on-LAN configuration is not changed.<br>An empty list disables Wake-on-LAN.<br><br>This is similar to `ethtool -s <link> wol <options>` command. <details><summary>Show example(s)</summary>{{< highlight yaml >}}
wakeOnLan:
- unicast
- magic
{{< /highlight >}}</details> |`phy`<br />`unicast`<br />`multicast`<br />`broadcast`<br />`arp`<br />`magic`<br />`magicsecure`<br />`filter`<br /> |

View File

@ -849,6 +849,16 @@
"description": "Configuration for Ethernet link channels.\n\nThis is similar to ethtool -L command.\n",
"markdownDescription": "Configuration for Ethernet link channels.\n\nThis is similar to `ethtool -L` command.",
"x-intellij-html-description": "\u003cp\u003eConfiguration for Ethernet link channels.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -L\u003c/code\u003e command.\u003c/p\u003e\n"
},
"wakeOnLan": {
"items": {
"type": "string"
},
"type": "array",
"title": "wakeOnLan",
"description": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to ethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt; command.\n",
"markdownDescription": "Wake-on-LAN modes to enable.\n\nIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\n\nThis is similar to `ethtool -s \u003clink\u003e wol \u003coptions\u003e` command.",
"x-intellij-html-description": "\u003cp\u003eWake-on-LAN modes to enable.\u003c/p\u003e\n\n\u003cp\u003eIf this field is omitted, Wake-on-LAN configuration is not changed.\nAn empty list disables Wake-on-LAN.\u003c/p\u003e\n\n\u003cp\u003eThis is similar to \u003ccode\u003eethtool -s \u0026lt;link\u0026gt; wol \u0026lt;options\u0026gt;\u003c/code\u003e command.\u003c/p\u003e\n"
}
},
"additionalProperties": false,