lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Thu, 21 Mar 2024 13:20:00 +0100
From: Mark Cilissen <mark@...suba.nl>
To: netdev@...r.kernel.org
Cc: Mark Cilissen <mark@...suba.nl>,
	Jakub Kicinski <kuba@...nel.org>,
	Hans de Goede <hdegoede@...hat.com>,
	Paolo Abeni <pabeni@...hat.com>,
	Ratheesh Kannoth <rkannoth@...vell.com>,
	Eric Dumazet <edumazet@...gle.com>,
	Breno Leitao <leitao@...ian.org>,
	Ingo Molnar <mingo@...hat.com>,
	"David S. Miller" <davem@...emloft.net>,
	linux-kernel@...r.kernel.org
Subject: [RFC net-next v2 1/2] netpoll: support sending over raw IP interfaces

Currently, netpoll only supports interfaces with an ethernet-compatible
link layer. Certain interfaces like SLIP do not have a link layer
on the network interface level at all and expect raw IP packets,
and could benefit from being supported by netpoll.

This commit adds support for such interfaces by checking if a link layer
header is present using `dev_has_header()`. If that is not the case,
it simply skips adding the ethernet header, causing a raw IP packet to be
sent over the interface. This has been confirmed to add netconsole support
to at least SLIP and WireGuard interfaces.

Signed-off-by: Mark Cilissen <mark@...suba.nl>
---
v2:
- Use dev_has_header(netdev) to detect existence of link layer header
  instead of netdev->hard_header_len, restore prior skb allocation sizes
  by always using LL_RESERVED_SPACE() as before
- Add selftest for netconsole

v1: https://lore.kernel.org/netdev/20240313124613.51399-1-mark@yotsuba.nl/T/
---
 Documentation/networking/netconsole.rst |  3 ++-
 net/core/netpoll.c                      | 15 ++++++++-------
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/Documentation/networking/netconsole.rst b/Documentation/networking/netconsole.rst
index d55c2a22ec7a..434ce0366027 100644
--- a/Documentation/networking/netconsole.rst
+++ b/Documentation/networking/netconsole.rst
@@ -327,4 +327,5 @@ enable the logging of even the most critical kernel bugs. It works
 from IRQ contexts as well, and does not enable interrupts while
 sending packets. Due to these unique needs, configuration cannot
 be more automatic, and some fundamental limitations will remain:
-only IP networks, UDP packets and ethernet devices are supported.
+only UDP packets over IP networks, over ethernet links if a
+hardware layer is required, are supported.
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index 543007f159f9..d12aa1b7d79e 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -458,9 +458,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
 		ip6h->saddr = np->local_ip.in6;
 		ip6h->daddr = np->remote_ip.in6;
 
-		eth = skb_push(skb, ETH_HLEN);
-		skb_reset_mac_header(skb);
-		skb->protocol = eth->h_proto = htons(ETH_P_IPV6);
+		skb->protocol = htons(ETH_P_IPV6);
 	} else {
 		udph->check = 0;
 		udph->check = csum_tcpudp_magic(np->local_ip.ip,
@@ -487,14 +485,17 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
 		put_unaligned(np->remote_ip.ip, &(iph->daddr));
 		iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
 
+		skb->protocol = htons(ETH_P_IP);
+	}
+
+	if (dev_has_header(np->dev)) {
 		eth = skb_push(skb, ETH_HLEN);
 		skb_reset_mac_header(skb);
-		skb->protocol = eth->h_proto = htons(ETH_P_IP);
+		eth->h_proto = skb->protocol;
+		ether_addr_copy(eth->h_source, np->dev->dev_addr);
+		ether_addr_copy(eth->h_dest, np->remote_mac);
 	}
 
-	ether_addr_copy(eth->h_source, np->dev->dev_addr);
-	ether_addr_copy(eth->h_dest, np->remote_mac);
-
 	skb->dev = np->dev;
 
 	netpoll_send_skb(np, skb);
-- 
2.44.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ