2014-08-06 12:50:53 +02:00
|
|
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
|
|
|
|
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>
|
|
|
|
|
2015-08-27 13:59:06 +02:00
|
|
|
#include "sd-dhcp-client.h"
|
|
|
|
#include "sd-dhcp-server.h"
|
|
|
|
#include "sd-ipv4ll.h"
|
|
|
|
#include "sd-icmp6-nd.h"
|
|
|
|
#include "sd-dhcp6-client.h"
|
|
|
|
#include "sd-lldp.h"
|
|
|
|
|
|
|
|
typedef struct Link Link;
|
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;
|
|
|
|
|
|
|
|
#include "networkd.h"
|
|
|
|
#include "networkd-network.h"
|
|
|
|
#include "networkd-address.h"
|
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
struct Link {
|
|
|
|
Manager *manager;
|
|
|
|
|
|
|
|
int n_ref;
|
|
|
|
|
|
|
|
int ifindex;
|
|
|
|
char *ifname;
|
|
|
|
char *state_file;
|
|
|
|
struct ether_addr mac;
|
|
|
|
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;
|
|
|
|
|
|
|
|
LIST_HEAD(Address, addresses);
|
|
|
|
|
|
|
|
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;
|
2014-08-06 15:54:03 +02:00
|
|
|
|
2014-08-06 12:50:53 +02:00
|
|
|
sd_ipv4ll *ipv4ll;
|
2014-08-06 15:54:03 +02:00
|
|
|
bool ipv4ll_address;
|
|
|
|
bool ipv4ll_route;
|
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;
|
|
|
|
|
|
|
|
sd_icmp6_nd *icmp6_router_discovery;
|
|
|
|
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
|
|
|
|
|
|
|
sd_lldp *lldp;
|
2014-12-11 05:29:55 +01:00
|
|
|
char *lldp_file;
|
2015-02-17 13:06:57 +01:00
|
|
|
|
|
|
|
Hashmap *bound_by_links;
|
|
|
|
Hashmap *bound_to_links;
|
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-22 17:18:20 +02:00
|
|
|
Address *link_get_equal_address(Link *link, Address *address);
|
|
|
|
|
2015-06-12 16:31:33 +02:00
|
|
|
int link_address_drop_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
|
|
|
|
int link_route_drop_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);
|
|
|
|
|
2014-08-06 15:54:03 +02:00
|
|
|
void link_client_handler(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
|
|
|
|
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
|
|
|
|
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);
|
2014-12-10 15:17:34 +01:00
|
|
|
int icmp6_configure(Link *link);
|
2014-08-06 15:54:03 +02:00
|
|
|
|
2015-02-04 15:00:20 +01:00
|
|
|
bool link_lldp_enabled(Link *link);
|
|
|
|
bool link_ipv4ll_enabled(Link *link);
|
2015-02-08 22:27:15 +01:00
|
|
|
bool link_ipv6ll_enabled(Link *link);
|
2015-02-04 15:00:20 +01:00
|
|
|
bool link_dhcp4_server_enabled(Link *link);
|
|
|
|
bool link_dhcp4_enabled(Link *link);
|
|
|
|
bool link_dhcp6_enabled(Link *link);
|
|
|
|
|
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, ...) \
|
|
|
|
({ \
|
|
|
|
Link *_l = (link); \
|
|
|
|
_l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, ##__VA_ARGS__) : \
|
|
|
|
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
|