public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH manager docs 0/3] add optional WoL config options
@ 2024-03-05 12:54 Christian Ebner
  2024-03-05 12:54 ` [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface Christian Ebner
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Christian Ebner @ 2024-03-05 12:54 UTC (permalink / raw)
  To: pve-devel

For certain network setups the default values currently used to send
a wake on lan magic packet are not correct, e.g. it will get send via
the interface for which the default gateway is configured.

This patches add optional configuration options to set a bind
interface, over which to send the WoL packet and/or set a broadcast
address to use.

The functionality was tested by listening on all interfaces of the
sending host via `tcpdump -i any udp port 9`, and testing the
combinations of
`pvenode config set -wakeonlan-bind-interface <iface-name>` and
`pvenode config set -wakeonlan-broadcast-address <broadcast-address>`.

See also the thread in the community forum
https://forum.proxmox.com/threads/123459/

pve-manager:

Christian Ebner (2):
  fix #5255: node: wol: add optional bind interface
  fix #5255: node: wol: configurable broadcast address

 PVE/API2/Nodes.pm | 16 ++++++++++++++--
 PVE/NodeConfig.pm | 12 ++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

pve-docs:

Christian Ebner (1):
  pvenode/wake-on-lan: mention optional config options

 pvenode.adoc | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

-- 
2.39.2





^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface
  2024-03-05 12:54 [pve-devel] [PATCH manager docs 0/3] add optional WoL config options Christian Ebner
@ 2024-03-05 12:54 ` Christian Ebner
  2024-03-21 17:27   ` Thomas Lamprecht
  2024-03-05 12:54 ` [pve-devel] [PATCH manager 2/3] fix #5255: node: wol: configurable broadcast address Christian Ebner
  2024-03-05 12:54 ` [pve-devel] [PATCH docs 3/3] pvenode/wake-on-lan: mention optional config options Christian Ebner
  2 siblings, 1 reply; 7+ messages in thread
From: Christian Ebner @ 2024-03-05 12:54 UTC (permalink / raw)
  To: pve-devel

Allows to optionally configure a local interface name to which to
bind to when sending a wake on lan packet to wake a remote node.

Default behaviour remains to send the packet via the interface for
the default gateway.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
 PVE/API2/Nodes.pm | 13 ++++++++++++-
 PVE/NodeConfig.pm |  6 ++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index cc5ee65e..620dac1c 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -682,9 +682,10 @@ __PACKAGE__->register_method({
 	my ($param) = @_;
 
 	my $node = $param->{node};
+	my $local_node = PVE::INotify::nodename();
 
 	die "'$node' is local node, cannot wake my self!\n"
-	    if $node eq 'localhost' || $node eq PVE::INotify::nodename();
+	    if $node eq 'localhost' || $node eq $local_node;
 
 	PVE::Cluster::check_node_exists($node);
 
@@ -694,6 +695,9 @@ __PACKAGE__->register_method({
 	    die "No wake on LAN MAC address defined for '$node'!\n";
 	}
 
+	my $local_config = PVE::NodeConfig::load_config($local_node);
+	my $bind_iface = $local_config->{'wakeonlan-bind-interface'};
+
 	$mac_addr =~ s/://g;
 	my $packet = chr(0xff) x 6 . pack('H*', $mac_addr) x 16;
 
@@ -706,6 +710,13 @@ __PACKAGE__->register_method({
 	setsockopt($sock, Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
 	    || die "Unable to set socket option: $!\n";
 
+	if (defined($bind_iface)) {
+	    # Null terminated interface name
+	    my $bind_iface_raw = pack('Z*', $bind_iface);
+	    setsockopt($sock, Socket::SOL_SOCKET, Socket::SO_BINDTODEVICE, $bind_iface_raw)
+		|| die "Unable to bind socket to interface '$bind_iface': $!\n";
+	}
+
 	send($sock, $packet, 0, $to)
 	    || die "Unable to send packet: $!\n";
 
diff --git a/PVE/NodeConfig.pm b/PVE/NodeConfig.pm
index 941e6009..5450ab2f 100644
--- a/PVE/NodeConfig.pm
+++ b/PVE/NodeConfig.pm
@@ -91,6 +91,12 @@ my $confdesc = {
 	format => 'mac-addr',
 	optional => 1,
     },
+    'wakeonlan-bind-interface' => {
+	type => 'string',
+	description => 'Bind to this interface when sending wake on LAN packet',
+	format => 'pve-iface',
+	optional => 1,
+    },
     'startall-onboot-delay' => {
 	description => 'Initial delay in seconds, before starting all the Virtual Guests with on-boot enabled.',
 	type => 'integer',
-- 
2.39.2





^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pve-devel] [PATCH manager 2/3] fix #5255: node: wol: configurable broadcast address
  2024-03-05 12:54 [pve-devel] [PATCH manager docs 0/3] add optional WoL config options Christian Ebner
  2024-03-05 12:54 ` [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface Christian Ebner
@ 2024-03-05 12:54 ` Christian Ebner
  2024-03-05 12:54 ` [pve-devel] [PATCH docs 3/3] pvenode/wake-on-lan: mention optional config options Christian Ebner
  2 siblings, 0 replies; 7+ messages in thread
From: Christian Ebner @ 2024-03-05 12:54 UTC (permalink / raw)
  To: pve-devel

Allows to configure a custom broadcast address to use when sending a
wake on lan packet to wake a remote node.

Default behaviour remains to fallback to 255.255.255.255.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
 PVE/API2/Nodes.pm | 3 ++-
 PVE/NodeConfig.pm | 6 ++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 620dac1c..e73fc28f 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -697,11 +697,12 @@ __PACKAGE__->register_method({
 
 	my $local_config = PVE::NodeConfig::load_config($local_node);
 	my $bind_iface = $local_config->{'wakeonlan-bind-interface'};
+	my $broadcast_addr = $local_config->{'wakeonlan-broadcast-address'} // '255.255.255.255';
 
 	$mac_addr =~ s/://g;
 	my $packet = chr(0xff) x 6 . pack('H*', $mac_addr) x 16;
 
-	my $addr = gethostbyname('255.255.255.255');
+	my $addr = gethostbyname($broadcast_addr);
 	my $port = getservbyname('discard', 'udp');
 	my $to = Socket::pack_sockaddr_in($port, $addr);
 
diff --git a/PVE/NodeConfig.pm b/PVE/NodeConfig.pm
index 5450ab2f..e3feaaa6 100644
--- a/PVE/NodeConfig.pm
+++ b/PVE/NodeConfig.pm
@@ -97,6 +97,12 @@ my $confdesc = {
 	format => 'pve-iface',
 	optional => 1,
     },
+    'wakeonlan-broadcast-address' => {
+	type => 'string',
+	description => 'IPv4 broadcast address to use when sending wake on LAN packet',
+	format => 'ipv4',
+	optional => 1,
+    },
     'startall-onboot-delay' => {
 	description => 'Initial delay in seconds, before starting all the Virtual Guests with on-boot enabled.',
 	type => 'integer',
-- 
2.39.2





^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pve-devel] [PATCH docs 3/3] pvenode/wake-on-lan: mention optional config options
  2024-03-05 12:54 [pve-devel] [PATCH manager docs 0/3] add optional WoL config options Christian Ebner
  2024-03-05 12:54 ` [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface Christian Ebner
  2024-03-05 12:54 ` [pve-devel] [PATCH manager 2/3] fix #5255: node: wol: configurable broadcast address Christian Ebner
@ 2024-03-05 12:54 ` Christian Ebner
  2 siblings, 0 replies; 7+ messages in thread
From: Christian Ebner @ 2024-03-05 12:54 UTC (permalink / raw)
  To: pve-devel

Show how to configure the optional bind interface and broadcast address
options via `pvenode`.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
 pvenode.adoc | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/pvenode.adoc b/pvenode.adoc
index 59eeecb..8a1da08 100644
--- a/pvenode.adoc
+++ b/pvenode.adoc
@@ -87,6 +87,20 @@ of `<node>` obtained from the `wakeonlan` property. The node-specific
 pvenode config set -wakeonlan XX:XX:XX:XX:XX:XX
 ----
 
+Optionally, the interface via which to send the WoL packet can be specified by
+setting the `wakeonlan-bind-interface` via the following command:
+
+----
+pvenode config set -wakeonlan-bind-interface <iface-name>
+----
+
+The broadcast address used when sending the WoL packet can further be set by
+specifying the `wakeonlan-broadcast-address` using the following command:
+
+----
+pvenode config set -wakeonlan-broadcast-address <broadcast-address>
+----
+
 Task History
 ~~~~~~~~~~~~
 
-- 
2.39.2





^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface
  2024-03-05 12:54 ` [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface Christian Ebner
@ 2024-03-21 17:27   ` Thomas Lamprecht
  2024-03-22 14:37     ` Christian Ebner
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Lamprecht @ 2024-03-21 17:27 UTC (permalink / raw)
  To: Proxmox VE development discussion, Christian Ebner

On 05/03/2024 13:54, Christian Ebner wrote:
> Allows to optionally configure a local interface name to which to
> bind to when sending a wake on lan packet to wake a remote node.
> 
> Default behaviour remains to send the packet via the interface for
> the default gateway.
> 
> Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
> ---
>  PVE/API2/Nodes.pm | 13 ++++++++++++-
>  PVE/NodeConfig.pm |  6 ++++++
>  2 files changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
> index cc5ee65e..620dac1c 100644
> --- a/PVE/API2/Nodes.pm
> +++ b/PVE/API2/Nodes.pm
> @@ -682,9 +682,10 @@ __PACKAGE__->register_method({
>  	my ($param) = @_;
>  
>  	my $node = $param->{node};
> +	my $local_node = PVE::INotify::nodename();
>  
>  	die "'$node' is local node, cannot wake my self!\n"
> -	    if $node eq 'localhost' || $node eq PVE::INotify::nodename();
> +	    if $node eq 'localhost' || $node eq $local_node;
>  
>  	PVE::Cluster::check_node_exists($node);
>  
> @@ -694,6 +695,9 @@ __PACKAGE__->register_method({
>  	    die "No wake on LAN MAC address defined for '$node'!\n";
>  	}
>  
> +	my $local_config = PVE::NodeConfig::load_config($local_node);
> +	my $bind_iface = $local_config->{'wakeonlan-bind-interface'};
> +
>  	$mac_addr =~ s/://g;
>  	my $packet = chr(0xff) x 6 . pack('H*', $mac_addr) x 16;
>  
> @@ -706,6 +710,13 @@ __PACKAGE__->register_method({
>  	setsockopt($sock, Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
>  	    || die "Unable to set socket option: $!\n";
>  
> +	if (defined($bind_iface)) {
> +	    # Null terminated interface name
> +	    my $bind_iface_raw = pack('Z*', $bind_iface);
> +	    setsockopt($sock, Socket::SOL_SOCKET, Socket::SO_BINDTODEVICE, $bind_iface_raw)
> +		|| die "Unable to bind socket to interface '$bind_iface': $!\n";
> +	}
> +
>  	send($sock, $packet, 0, $to)
>  	    || die "Unable to send packet: $!\n";
>  
> diff --git a/PVE/NodeConfig.pm b/PVE/NodeConfig.pm
> index 941e6009..5450ab2f 100644
> --- a/PVE/NodeConfig.pm
> +++ b/PVE/NodeConfig.pm
> @@ -91,6 +91,12 @@ my $confdesc = {
>  	format => 'mac-addr',
>  	optional => 1,
>      },
> +    'wakeonlan-bind-interface' => {
> +	type => 'string',
> +	description => 'Bind to this interface when sending wake on LAN packet',
> +	format => 'pve-iface',
> +	optional => 1,
> +    },

we could transform the existing "wakeonlan" property into a format string,
keep the new mac property as default_key there for backwards compat, kinda
like "acme" is a format string in the same config.

For such a config option that would be IMO fitting and avoid bloating the
"top-level" format.

>      'startall-onboot-delay' => {
>  	description => 'Initial delay in seconds, before starting all the Virtual Guests with on-boot enabled.',
>  	type => 'integer',





^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface
  2024-03-21 17:27   ` Thomas Lamprecht
@ 2024-03-22 14:37     ` Christian Ebner
  2024-03-26  9:21       ` Christian Ebner
  0 siblings, 1 reply; 7+ messages in thread
From: Christian Ebner @ 2024-03-22 14:37 UTC (permalink / raw)
  To: Thomas Lamprecht, Proxmox VE development discussion

> On 21.03.2024 18:27 CET Thomas Lamprecht <t.lamprecht@proxmox.com> wrote:
> 
>  
> On 05/03/2024 13:54, Christian Ebner wrote:

> > +    'wakeonlan-bind-interface' => {
> > +	type => 'string',
> > +	description => 'Bind to this interface when sending wake on LAN packet',
> > +	format => 'pve-iface',
> > +	optional => 1,
> > +    },
> 
> we could transform the existing "wakeonlan" property into a format string,
> keep the new mac property as default_key there for backwards compat, kinda
> like "acme" is a format string in the same config.
> 
> For such a config option that would be IMO fitting and avoid bloating the
> "top-level" format.

Agreed, will send a new version with the suggested changes to the format
string.




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface
  2024-03-22 14:37     ` Christian Ebner
@ 2024-03-26  9:21       ` Christian Ebner
  0 siblings, 0 replies; 7+ messages in thread
From: Christian Ebner @ 2024-03-26  9:21 UTC (permalink / raw)
  To: Thomas Lamprecht, Proxmox VE development discussion

> On 22.03.2024 15:37 CET Christian Ebner <c.ebner@proxmox.com> wrote:
> 
> Agreed, will send a new version with the suggested changes to the format
> string.

Version 2 of the patches:
https://lists.proxmox.com/pipermail/pve-devel/2024-March/062397.html




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-03-26  9:21 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-05 12:54 [pve-devel] [PATCH manager docs 0/3] add optional WoL config options Christian Ebner
2024-03-05 12:54 ` [pve-devel] [PATCH manager 1/3] fix #5255: node: wol: add optional bind interface Christian Ebner
2024-03-21 17:27   ` Thomas Lamprecht
2024-03-22 14:37     ` Christian Ebner
2024-03-26  9:21       ` Christian Ebner
2024-03-05 12:54 ` [pve-devel] [PATCH manager 2/3] fix #5255: node: wol: configurable broadcast address Christian Ebner
2024-03-05 12:54 ` [pve-devel] [PATCH docs 3/3] pvenode/wake-on-lan: mention optional config options Christian Ebner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal