@@ -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.
@@ -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);
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@yotsuba.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(-)