2015-08-27 13:59:06 +02:00
|
|
|
#pragma once
|
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
/***
|
|
|
|
This file is part of systemd.
|
|
|
|
|
|
|
|
Copyright 2013 Tom Gundersen <teg@jklm.no>
|
|
|
|
|
|
|
|
systemd is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
systemd is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
|
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
|
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 <paul.martin@codethink.co.uk>
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.
2015-02-11 12:50:28 +01:00
|
|
|
#include <endian.h>
|
|
|
|
|
2016-04-29 04:52:04 +02:00
|
|
|
#include "sd-bus.h"
|
2015-08-27 13:59:06 +02:00
|
|
|
#include "sd-dhcp-client.h"
|
|
|
|
#include "sd-dhcp-server.h"
|
|
|
|
#include "sd-dhcp6-client.h"
|
2015-10-24 22:58:24 +02:00
|
|
|
#include "sd-ipv4ll.h"
|
2015-08-27 13:59:06 +02:00
|
|
|
#include "sd-lldp.h"
|
2015-10-24 22:58:24 +02:00
|
|
|
#include "sd-ndisc.h"
|
2016-04-29 04:52:04 +02:00
|
|
|
#include "sd-netlink.h"
|
2015-08-27 13:59:06 +02:00
|
|
|
|
2016-04-29 04:52:04 +02:00
|
|
|
#include "list.h"
|
|
|
|
#include "set.h"
|
2014-08-06 12:50:53 +02:00
|
|
|
|
|
|
|
typedef enum LinkState {
|
2014-08-13 15:34:27 +02:00
|
|
|
LINK_STATE_PENDING,
|
2014-08-06 12:50:53 +02:00
|
|
|
LINK_STATE_ENSLAVING,
|
|
|
|
LINK_STATE_SETTING_ADDRESSES,
|
|
|
|
LINK_STATE_SETTING_ROUTES,
|
|
|
|
LINK_STATE_CONFIGURED,
|
|
|
|
LINK_STATE_UNMANAGED,
|
|
|
|
LINK_STATE_FAILED,
|
|
|
|
LINK_STATE_LINGER,
|
|
|
|
_LINK_STATE_MAX,
|
|
|
|
_LINK_STATE_INVALID = -1
|
|
|
|
} LinkState;
|
|
|
|
|
2015-08-27 13:59:06 +02:00
|
|
|
typedef enum LinkOperationalState {
|
|
|
|
LINK_OPERSTATE_OFF,
|
|
|
|
LINK_OPERSTATE_NO_CARRIER,
|
|
|
|
LINK_OPERSTATE_DORMANT,
|
|
|
|
LINK_OPERSTATE_CARRIER,
|
|
|
|
LINK_OPERSTATE_DEGRADED,
|
|
|
|
LINK_OPERSTATE_ROUTABLE,
|
|
|
|
_LINK_OPERSTATE_MAX,
|
|
|
|
_LINK_OPERSTATE_INVALID = -1
|
|
|
|
} LinkOperationalState;
|
|
|
|
|
2016-04-29 04:52:04 +02:00
|
|
|
typedef struct Manager Manager;
|
|
|
|
typedef struct Network Network;
|
|
|
|
typedef struct Address Address;
|
2015-08-27 13:59:06 +02:00
|
|
|
|
2016-04-29 04:52:04 +02:00
|
|
|
typedef struct Link {
|
2014-08-06 12:50:53 +02:00
|
|
|
Manager *manager;
|
|
|
|
|
|
|
|
int n_ref;
|
|
|
|
|
|
|
|
int ifindex;
|
|
|
|
char *ifname;
|
2016-06-09 13:44:31 +02:00
|
|
|
char *kind;
|
2016-02-18 22:49:02 +01:00
|
|
|
unsigned short iftype;
|
2014-08-06 12:50:53 +02:00
|
|
|
char *state_file;
|
|
|
|
struct ether_addr mac;
|
2015-11-16 17:43:08 +01:00
|
|
|
struct in6_addr ipv6ll_address;
|
2014-08-06 12:50:53 +02:00
|
|
|
uint32_t mtu;
|
|
|
|
struct udev_device *udev_device;
|
|
|
|
|
|
|
|
unsigned flags;
|
|
|
|
uint8_t kernel_operstate;
|
|
|
|
|
|
|
|
Network *network;
|
|
|
|
|
|
|
|
LinkState state;
|
|
|
|
LinkOperationalState operstate;
|
|
|
|
|
2014-08-08 12:12:17 +02:00
|
|
|
unsigned link_messages;
|
2014-08-06 12:50:53 +02:00
|
|
|
unsigned enslaving;
|
|
|
|
|
2015-09-23 01:53:29 +02:00
|
|
|
Set *addresses;
|
2015-09-30 14:01:44 +02:00
|
|
|
Set *addresses_foreign;
|
2015-10-25 14:46:21 +01:00
|
|
|
Set *routes;
|
|
|
|
Set *routes_foreign;
|
2014-08-06 12:50:53 +02:00
|
|
|
|
|
|
|
sd_dhcp_client *dhcp_client;
|
|
|
|
sd_dhcp_lease *dhcp_lease;
|
|
|
|
char *lease_file;
|
|
|
|
uint16_t original_mtu;
|
2014-08-08 12:12:17 +02:00
|
|
|
unsigned dhcp4_messages;
|
|
|
|
bool dhcp4_configured;
|
2015-09-23 13:52:03 +02:00
|
|
|
bool dhcp6_configured;
|
network: beef up ipv6 RA support considerably
This reworks sd-ndisc and networkd substantially to support IPv6 RA much more
comprehensively. Since the API is extended quite a bit networkd has been ported
over too, and the patch is not as straight-forward as one could wish. The
rework includes:
- Support for DNSSL, RDNSS and RA routing options in sd-ndisc and networkd. Two
new configuration options have been added to networkd to make this
configurable.
- sd-ndisc now exposes an sd_ndisc_router object that encapsulates a full RA
message, and has direct, friendly acessor functions for the singleton RA
properties, as well as an iterative interface to iterate through known and
unsupported options. The router object may either be retrieved from the wire,
or generated from raw data. In many ways the sd-ndisc API now matches the
sd-lldp API, except that no implicit database of seen data is kept. (Note
that sd-ndisc actually had a half-written, but unused implementaiton of such
a store, which is removed now.)
- sd-ndisc will now collect the reception timestamps of RA, which is useful to
make sd_ndisc_router fully descriptive of what it covers.
Fixes: #1079
2016-06-02 20:38:12 +02:00
|
|
|
|
networkd: ndisc - handle router advertisement in userspace
Router Discovery is a core part of IPv6, which by default is handled by the kernel.
However, the kernel implementation is meant as a fall-back, and to fully support
the protocol a userspace implementation is desired.
The protocol essentially listens for Router Advertisement packets from routers
on the local link and use these to configure the client automatically. The four
main pieces of information are: what kind (if any) of DHCPv6 configuration should
be performed; a default gateway; the prefixes that should be considered to be on
the local link; and the prefixes with which we can preform SLAAC in order to pick
a global IPv6 address.
A lot of additional information is also available, which we do not yet fully
support, but which will eventually allow us to avoid the need for DHCPv6 in the
common case.
Short-term, the reason for wanting this is in userspace was the desire to fully
track all the addresses on links we manage, and that is not possible for addresses
managed by the kernel (as the kernel does not expose to us the fact that it
manages these addresses). Moreover, we would like to support stable privacy
addresses, which will soon be mandated and the legacy MAC-based global addresses
deprecated, to do this well we need to handle the generation in userspace. Lastly,
more long-term we wish to support more RA options than what the kernel exposes.
2015-11-03 13:02:16 +01:00
|
|
|
unsigned ndisc_messages;
|
|
|
|
bool ndisc_configured;
|
2014-08-06 15:54:03 +02:00
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
sd_ipv4ll *ipv4ll;
|
2015-11-10 21:30:59 +01:00
|
|
|
bool ipv4ll_address:1;
|
|
|
|
bool ipv4ll_route:1;
|
2014-08-06 12:50:53 +02:00
|
|
|
|
2014-08-08 12:12:17 +02:00
|
|
|
bool static_configured;
|
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
LIST_HEAD(Address, pool_addresses);
|
|
|
|
|
|
|
|
sd_dhcp_server *dhcp_server;
|
|
|
|
|
network: beef up ipv6 RA support considerably
This reworks sd-ndisc and networkd substantially to support IPv6 RA much more
comprehensively. Since the API is extended quite a bit networkd has been ported
over too, and the patch is not as straight-forward as one could wish. The
rework includes:
- Support for DNSSL, RDNSS and RA routing options in sd-ndisc and networkd. Two
new configuration options have been added to networkd to make this
configurable.
- sd-ndisc now exposes an sd_ndisc_router object that encapsulates a full RA
message, and has direct, friendly acessor functions for the singleton RA
properties, as well as an iterative interface to iterate through known and
unsupported options. The router object may either be retrieved from the wire,
or generated from raw data. In many ways the sd-ndisc API now matches the
sd-lldp API, except that no implicit database of seen data is kept. (Note
that sd-ndisc actually had a half-written, but unused implementaiton of such
a store, which is removed now.)
- sd-ndisc will now collect the reception timestamps of RA, which is useful to
make sd_ndisc_router fully descriptive of what it covers.
Fixes: #1079
2016-06-02 20:38:12 +02:00
|
|
|
sd_ndisc *ndisc;
|
|
|
|
Set *ndisc_rdnss;
|
|
|
|
Set *ndisc_dnssl;
|
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
sd_dhcp6_client *dhcp6_client;
|
2015-04-10 13:03:18 +02:00
|
|
|
bool rtnl_extended_attrs;
|
2014-11-23 05:26:14 +01:00
|
|
|
|
2016-02-21 14:14:08 +01:00
|
|
|
/* This is about LLDP reception */
|
2014-11-23 05:26:14 +01:00
|
|
|
sd_lldp *lldp;
|
2014-12-11 05:29:55 +01:00
|
|
|
char *lldp_file;
|
2015-02-17 13:06:57 +01:00
|
|
|
|
2016-02-21 14:14:08 +01:00
|
|
|
/* This is about LLDP transmission */
|
|
|
|
unsigned lldp_tx_fast; /* The LLDP txFast counter (See 802.1ab-2009, section 9.2.5.18) */
|
2016-05-06 21:27:36 +02:00
|
|
|
sd_event_source *lldp_emit_event_source;
|
2016-02-21 14:14:08 +01:00
|
|
|
|
2015-02-17 13:06:57 +01:00
|
|
|
Hashmap *bound_by_links;
|
|
|
|
Hashmap *bound_to_links;
|
2016-04-29 04:52:04 +02:00
|
|
|
} Link;
|
2014-08-06 12:50:53 +02:00
|
|
|
|
|
|
|
Link *link_unref(Link *link);
|
|
|
|
Link *link_ref(Link *link);
|
|
|
|
int link_get(Manager *m, int ifindex, Link **ret);
|
2015-06-12 16:31:33 +02:00
|
|
|
int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
|
2014-08-06 12:50:53 +02:00
|
|
|
void link_drop(Link *link);
|
|
|
|
|
2015-09-24 15:25:20 +02:00
|
|
|
int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
|
|
|
|
int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
|
2014-08-06 12:50:53 +02:00
|
|
|
|
2014-08-06 15:54:03 +02:00
|
|
|
void link_enter_failed(Link *link);
|
2014-08-06 12:50:53 +02:00
|
|
|
int link_initialized(Link *link, struct udev_device *device);
|
|
|
|
|
2015-09-28 13:38:43 +02:00
|
|
|
void link_check_ready(Link *link);
|
2014-08-06 15:54:03 +02:00
|
|
|
|
2015-09-30 18:17:43 +02:00
|
|
|
void link_update_operstate(Link *link);
|
2015-06-12 16:31:33 +02:00
|
|
|
int link_update(Link *link, sd_netlink_message *message);
|
2014-08-06 15:54:03 +02:00
|
|
|
|
2015-09-30 18:17:43 +02:00
|
|
|
void link_dirty(Link *link);
|
|
|
|
void link_clean(Link *link);
|
2014-08-06 12:50:53 +02:00
|
|
|
int link_save(Link *link);
|
|
|
|
|
2015-02-03 15:44:12 +01:00
|
|
|
int link_carrier_reset(Link *link);
|
2014-09-04 14:05:54 +02:00
|
|
|
bool link_has_carrier(Link *link);
|
2014-08-06 12:50:53 +02:00
|
|
|
|
2015-11-16 17:43:08 +01:00
|
|
|
int link_ipv6ll_gained(Link *link, const struct in6_addr *address);
|
2015-11-10 21:30:59 +01:00
|
|
|
|
2014-08-08 12:12:17 +02:00
|
|
|
int link_set_mtu(Link *link, uint32_t mtu);
|
|
|
|
int link_set_hostname(Link *link, const char *hostname);
|
2015-08-27 02:12:27 +02:00
|
|
|
int link_set_timezone(Link *link, const char *timezone);
|
2014-08-08 12:12:17 +02:00
|
|
|
|
2014-08-06 15:54:03 +02:00
|
|
|
int ipv4ll_configure(Link *link);
|
2014-08-08 12:12:17 +02:00
|
|
|
int dhcp4_configure(Link *link);
|
2015-11-10 15:43:52 +01:00
|
|
|
int dhcp6_configure(Link *link);
|
2016-06-01 08:54:46 +02:00
|
|
|
int dhcp6_request_address(Link *link, int ir);
|
2014-08-06 15:54:03 +02:00
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
const char* link_state_to_string(LinkState s) _const_;
|
|
|
|
LinkState link_state_from_string(const char *s) _pure_;
|
|
|
|
|
2015-08-27 13:59:06 +02:00
|
|
|
const char* link_operstate_to_string(LinkOperationalState s) _const_;
|
|
|
|
LinkOperationalState link_operstate_from_string(const char *s) _pure_;
|
|
|
|
|
2015-02-04 11:44:37 +01:00
|
|
|
extern const sd_bus_vtable link_vtable[];
|
|
|
|
|
|
|
|
int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
|
|
|
|
int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
|
|
|
|
int link_send_changed(Link *link, const char *property, ...) _sentinel_;
|
2014-08-06 12:50:53 +02:00
|
|
|
|
|
|
|
DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
|
|
|
|
#define _cleanup_link_unref_ _cleanup_(link_unrefp)
|
|
|
|
|
|
|
|
/* Macros which append INTERFACE= to the message */
|
|
|
|
|
core,network: major per-object logging rework
This changes log_unit_info() (and friends) to take a real Unit* object
insted of just a unit name as parameter. The call will now prefix all
logged messages with the unit name, thus allowing the unit name to be
dropped from the various passed romat strings, simplifying invocations
drastically, and unifying log output across messages. Also, UNIT= vs.
USER_UNIT= is now derived from the Manager object attached to the Unit
object, instead of getpid(). This has the benefit of correcting the
field for --test runs.
Also contains a couple of other logging improvements:
- Drops a couple of strerror() invocations in favour of using %m.
- Not only .mount units now warn if a symlinks exist for the mount
point already, .automount units do that too, now.
- A few invocations of log_struct() that didn't actually pass any
additional structured data have been replaced by simpler invocations
of log_unit_info() and friends.
- For structured data a new LOG_UNIT_MESSAGE() macro has been added,
that works like LOG_MESSAGE() but prefixes the message with the unit
name. Similar, there's now LOG_LINK_MESSAGE() and
LOG_NETDEV_MESSAGE().
- For structured data new LOG_UNIT_ID(), LOG_LINK_INTERFACE(),
LOG_NETDEV_INTERFACE() macros have been added that generate the
necessary per object fields. The old log_unit_struct() call has been
removed in favour of these new macros used in raw log_struct()
invocations. In addition to removing one more function call this
allows generated structured log messages that contain two object
fields, as necessary for example for network interfaces that are
joined into another network interface, and whose messages shall be
indexed by both.
- The LOG_ERRNO() macro has been removed, in favour of
log_struct_errno(). The latter has the benefit of ensuring that %m in
format strings is properly resolved to the specified error number.
- A number of logging messages have been converted to use
log_unit_info() instead of log_info()
- The client code in sysv-generator no longer #includes core code from
src/core/.
- log_unit_full_errno() has been removed, log_unit_full() instead takes
an errno now, too.
- log_unit_info(), log_link_info(), log_netdev_info() and friends, now
avoid double evaluation of their parameters
2015-05-11 20:38:21 +02:00
|
|
|
#define log_link_full(link, level, error, ...) \
|
|
|
|
({ \
|
2016-08-23 11:29:30 +02:00
|
|
|
const Link *_l = (link); \
|
2016-08-30 23:18:46 +02:00
|
|
|
_l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, NULL, NULL, ##__VA_ARGS__) : \
|
core,network: major per-object logging rework
This changes log_unit_info() (and friends) to take a real Unit* object
insted of just a unit name as parameter. The call will now prefix all
logged messages with the unit name, thus allowing the unit name to be
dropped from the various passed romat strings, simplifying invocations
drastically, and unifying log output across messages. Also, UNIT= vs.
USER_UNIT= is now derived from the Manager object attached to the Unit
object, instead of getpid(). This has the benefit of correcting the
field for --test runs.
Also contains a couple of other logging improvements:
- Drops a couple of strerror() invocations in favour of using %m.
- Not only .mount units now warn if a symlinks exist for the mount
point already, .automount units do that too, now.
- A few invocations of log_struct() that didn't actually pass any
additional structured data have been replaced by simpler invocations
of log_unit_info() and friends.
- For structured data a new LOG_UNIT_MESSAGE() macro has been added,
that works like LOG_MESSAGE() but prefixes the message with the unit
name. Similar, there's now LOG_LINK_MESSAGE() and
LOG_NETDEV_MESSAGE().
- For structured data new LOG_UNIT_ID(), LOG_LINK_INTERFACE(),
LOG_NETDEV_INTERFACE() macros have been added that generate the
necessary per object fields. The old log_unit_struct() call has been
removed in favour of these new macros used in raw log_struct()
invocations. In addition to removing one more function call this
allows generated structured log messages that contain two object
fields, as necessary for example for network interfaces that are
joined into another network interface, and whose messages shall be
indexed by both.
- The LOG_ERRNO() macro has been removed, in favour of
log_struct_errno(). The latter has the benefit of ensuring that %m in
format strings is properly resolved to the specified error number.
- A number of logging messages have been converted to use
log_unit_info() instead of log_info()
- The client code in sysv-generator no longer #includes core code from
src/core/.
- log_unit_full_errno() has been removed, log_unit_full() instead takes
an errno now, too.
- log_unit_info(), log_link_info(), log_netdev_info() and friends, now
avoid double evaluation of their parameters
2015-05-11 20:38:21 +02:00
|
|
|
log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
|
|
|
|
}) \
|
|
|
|
|
|
|
|
#define log_link_debug(link, ...) log_link_full(link, LOG_DEBUG, 0, ##__VA_ARGS__)
|
|
|
|
#define log_link_info(link, ...) log_link_full(link, LOG_INFO, 0, ##__VA_ARGS__)
|
|
|
|
#define log_link_notice(link, ...) log_link_full(link, LOG_NOTICE, 0, ##__VA_ARGS__)
|
|
|
|
#define log_link_warning(link, ...) log_link_full(link, LOG_WARNING, 0, ##__VA_ARGS__)
|
|
|
|
#define log_link_error(link, ...) log_link_full(link, LOG_ERR, 0, ##__VA_ARGS__)
|
2014-11-28 00:42:35 +01:00
|
|
|
|
|
|
|
#define log_link_debug_errno(link, error, ...) log_link_full(link, LOG_DEBUG, error, ##__VA_ARGS__)
|
|
|
|
#define log_link_info_errno(link, error, ...) log_link_full(link, LOG_INFO, error, ##__VA_ARGS__)
|
|
|
|
#define log_link_notice_errno(link, error, ...) log_link_full(link, LOG_NOTICE, error, ##__VA_ARGS__)
|
|
|
|
#define log_link_warning_errno(link, error, ...) log_link_full(link, LOG_WARNING, error, ##__VA_ARGS__)
|
|
|
|
#define log_link_error_errno(link, error, ...) log_link_full(link, LOG_ERR, error, ##__VA_ARGS__)
|
|
|
|
|
core,network: major per-object logging rework
This changes log_unit_info() (and friends) to take a real Unit* object
insted of just a unit name as parameter. The call will now prefix all
logged messages with the unit name, thus allowing the unit name to be
dropped from the various passed romat strings, simplifying invocations
drastically, and unifying log output across messages. Also, UNIT= vs.
USER_UNIT= is now derived from the Manager object attached to the Unit
object, instead of getpid(). This has the benefit of correcting the
field for --test runs.
Also contains a couple of other logging improvements:
- Drops a couple of strerror() invocations in favour of using %m.
- Not only .mount units now warn if a symlinks exist for the mount
point already, .automount units do that too, now.
- A few invocations of log_struct() that didn't actually pass any
additional structured data have been replaced by simpler invocations
of log_unit_info() and friends.
- For structured data a new LOG_UNIT_MESSAGE() macro has been added,
that works like LOG_MESSAGE() but prefixes the message with the unit
name. Similar, there's now LOG_LINK_MESSAGE() and
LOG_NETDEV_MESSAGE().
- For structured data new LOG_UNIT_ID(), LOG_LINK_INTERFACE(),
LOG_NETDEV_INTERFACE() macros have been added that generate the
necessary per object fields. The old log_unit_struct() call has been
removed in favour of these new macros used in raw log_struct()
invocations. In addition to removing one more function call this
allows generated structured log messages that contain two object
fields, as necessary for example for network interfaces that are
joined into another network interface, and whose messages shall be
indexed by both.
- The LOG_ERRNO() macro has been removed, in favour of
log_struct_errno(). The latter has the benefit of ensuring that %m in
format strings is properly resolved to the specified error number.
- A number of logging messages have been converted to use
log_unit_info() instead of log_info()
- The client code in sysv-generator no longer #includes core code from
src/core/.
- log_unit_full_errno() has been removed, log_unit_full() instead takes
an errno now, too.
- log_unit_info(), log_link_info(), log_netdev_info() and friends, now
avoid double evaluation of their parameters
2015-05-11 20:38:21 +02:00
|
|
|
#define LOG_LINK_MESSAGE(link, fmt, ...) "MESSAGE=%s: " fmt, (link)->ifname, ##__VA_ARGS__
|
|
|
|
#define LOG_LINK_INTERFACE(link) "INTERFACE=%s", (link)->ifname
|
2014-08-06 12:50:53 +02:00
|
|
|
|
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 <paul.martin@codethink.co.uk>
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.
2015-02-11 12:50:28 +01:00
|
|
|
#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
|