From 804319344bb9cab47532a9584f3e4383d53ea880 Mon Sep 17 00:00:00 2001 From: Paul Martin Date: Wed, 11 Feb 2015 11:50:28 +0000 Subject: networkd DHCPv4 logging endian fix On Tue, Feb 10, 2015 at 08:10:43PM +0100, Lennart Poettering wrote: > Hmm, I think it would be nicer to use be32toh() here instead, since it > ensures the macro is (to a limited degree) typesafe. > > Any chance you could rework that? From: Paul Martin Date: Wed, 11 Feb 2015 11:47:16 +0000 Subject: [PATCH] networkd dhcpv4 logging endian fix On a big-endian host, systemd-networkd prints out IPv4 network addresses byte reversed: Feb 10 16:43:32 hostname systemd-networkd[151]: eth0 : DHCPv4 address 158.1.24.10/16 via 1.1.24.10 The address obtained is 10.24.1.158/16 and the route is 10.24.0.0/16 dev eth0 src 10.24.1.187 The macro ADDRESS_FMT_VAL() unpacks a "struct in_addr" in a little-endian specific manner. This patch forces the passed address into host order, then unpacks it. On an x86 later than i486, compiled with -O2, the only extra overhead is a single bswap instruction. --- src/network/networkd-link.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 449dbc8846..cec158e47d 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -21,6 +21,8 @@ #pragma once +#include + #include "networkd.h" typedef enum LinkState { @@ -152,8 +154,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref); #define log_link_struct(link, level, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__) -#define ADDRESS_FMT_VAL(address) \ - (address).s_addr & 0xFF, \ - ((address).s_addr >> 8) & 0xFF, \ - ((address).s_addr >> 16) & 0xFF, \ - (address).s_addr >> 24 +#define ADDRESS_FMT_VAL(address) \ + be32toh((address).s_addr) >> 24, \ + (be32toh((address).s_addr) >> 16) & 0xFFu, \ + (be32toh((address).s_addr) >> 8) & 0xFFu, \ + be32toh((address).s_addr) & 0xFFu -- cgit v1.2.3-54-g00ecf