]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link.h
networkd: ndisc - handle router advertisement in userspace
[thirdparty/systemd.git] / src / network / networkd-link.h
CommitLineData
0b1831c2
TG
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
fc2f9534
LP
3#pragma once
4
0b1831c2
TG
5/***
6 This file is part of systemd.
7
8 Copyright 2013 Tom Gundersen <teg@jklm.no>
9
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
80431934
PM
24#include <endian.h>
25
fc2f9534
LP
26#include "sd-dhcp-client.h"
27#include "sd-dhcp-server.h"
fc2f9534 28#include "sd-dhcp6-client.h"
07630cea 29#include "sd-ipv4ll.h"
fc2f9534 30#include "sd-lldp.h"
07630cea 31#include "sd-ndisc.h"
fc2f9534
LP
32
33typedef struct Link Link;
0b1831c2
TG
34
35typedef enum LinkState {
8434fd5c 36 LINK_STATE_PENDING,
0b1831c2
TG
37 LINK_STATE_ENSLAVING,
38 LINK_STATE_SETTING_ADDRESSES,
39 LINK_STATE_SETTING_ROUTES,
40 LINK_STATE_CONFIGURED,
41 LINK_STATE_UNMANAGED,
42 LINK_STATE_FAILED,
43 LINK_STATE_LINGER,
44 _LINK_STATE_MAX,
45 _LINK_STATE_INVALID = -1
46} LinkState;
47
fc2f9534
LP
48typedef enum LinkOperationalState {
49 LINK_OPERSTATE_OFF,
50 LINK_OPERSTATE_NO_CARRIER,
51 LINK_OPERSTATE_DORMANT,
52 LINK_OPERSTATE_CARRIER,
53 LINK_OPERSTATE_DEGRADED,
54 LINK_OPERSTATE_ROUTABLE,
55 _LINK_OPERSTATE_MAX,
56 _LINK_OPERSTATE_INVALID = -1
57} LinkOperationalState;
58
59#include "networkd.h"
60#include "networkd-network.h"
61#include "networkd-address.h"
62
0b1831c2
TG
63struct Link {
64 Manager *manager;
65
66 int n_ref;
67
68 int ifindex;
69 char *ifname;
70 char *state_file;
71 struct ether_addr mac;
72 uint32_t mtu;
73 struct udev_device *udev_device;
74
75 unsigned flags;
76 uint8_t kernel_operstate;
77
78 Network *network;
79
80 LinkState state;
81 LinkOperationalState operstate;
82
3c9b8860 83 unsigned link_messages;
0b1831c2
TG
84 unsigned enslaving;
85
cf1d700d 86 Set *addresses;
adda1ed9 87 Set *addresses_foreign;
1c8e710c
TG
88 Set *routes;
89 Set *routes_foreign;
0b1831c2
TG
90
91 sd_dhcp_client *dhcp_client;
92 sd_dhcp_lease *dhcp_lease;
93 char *lease_file;
94 uint16_t original_mtu;
3c9b8860
TG
95 unsigned dhcp4_messages;
96 bool dhcp4_configured;
18d29550 97 bool dhcp6_configured;
3b015d40
TG
98 unsigned ndisc_messages;
99 bool ndisc_configured;
b22d8a00 100
0b1831c2 101 sd_ipv4ll *ipv4ll;
b22d8a00
TG
102 bool ipv4ll_address;
103 bool ipv4ll_route;
0b1831c2 104
3c9b8860
TG
105 bool static_configured;
106
0b1831c2
TG
107 LIST_HEAD(Address, pool_addresses);
108
109 sd_dhcp_server *dhcp_server;
110
de1e9928 111 sd_ndisc *ndisc_router_discovery;
0b1831c2 112 sd_dhcp6_client *dhcp6_client;
be3a09b7 113 bool rtnl_extended_attrs;
ce43e484
SS
114
115 sd_lldp *lldp;
49699bac 116 char *lldp_file;
0d4ad91d
AR
117
118 Hashmap *bound_by_links;
119 Hashmap *bound_to_links;
0b1831c2
TG
120};
121
122Link *link_unref(Link *link);
123Link *link_ref(Link *link);
124int link_get(Manager *m, int ifindex, Link **ret);
1c4baffc 125int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
0b1831c2
TG
126void link_drop(Link *link);
127
91b5f997
TG
128int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
129int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
0b1831c2 130
b22d8a00 131void link_enter_failed(Link *link);
0b1831c2
TG
132int link_initialized(Link *link, struct udev_device *device);
133
8012cd39 134void link_check_ready(Link *link);
b22d8a00 135
84de38c5 136void link_update_operstate(Link *link);
1c4baffc 137int link_update(Link *link, sd_netlink_message *message);
b22d8a00 138
84de38c5
TG
139void link_dirty(Link *link);
140void link_clean(Link *link);
0b1831c2
TG
141int link_save(Link *link);
142
9c0a72f9 143int link_carrier_reset(Link *link);
a61bb41c 144bool link_has_carrier(Link *link);
0b1831c2 145
3c9b8860
TG
146int link_set_mtu(Link *link, uint32_t mtu);
147int link_set_hostname(Link *link, const char *hostname);
21b80ad1 148int link_set_timezone(Link *link, const char *timezone);
3c9b8860 149
b22d8a00 150int ipv4ll_configure(Link *link);
3c9b8860 151int dhcp4_configure(Link *link);
7a695d8e
TG
152int dhcp6_configure(Link *link);
153int dhcp6_request_address(Link *link);
de1e9928 154int ndisc_configure(Link *link);
b22d8a00 155
a97dcc12
TG
156bool link_lldp_enabled(Link *link);
157bool link_ipv4ll_enabled(Link *link);
d0d6a4cd 158bool link_ipv6ll_enabled(Link *link);
a97dcc12
TG
159bool link_dhcp4_server_enabled(Link *link);
160bool link_dhcp4_enabled(Link *link);
161bool link_dhcp6_enabled(Link *link);
f5a8c43f 162bool link_ipv6_accept_ra_enabled(Link *link);
a97dcc12 163
0b1831c2
TG
164const char* link_state_to_string(LinkState s) _const_;
165LinkState link_state_from_string(const char *s) _pure_;
166
fc2f9534
LP
167const char* link_operstate_to_string(LinkOperationalState s) _const_;
168LinkOperationalState link_operstate_from_string(const char *s) _pure_;
169
e331e246
TG
170extern const sd_bus_vtable link_vtable[];
171
172int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
173int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
174int link_send_changed(Link *link, const char *property, ...) _sentinel_;
0b1831c2
TG
175
176DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
177#define _cleanup_link_unref_ _cleanup_(link_unrefp)
178
179/* Macros which append INTERFACE= to the message */
180
f2341e0a
LP
181#define log_link_full(link, level, error, ...) \
182 ({ \
183 Link *_l = (link); \
184 _l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, ##__VA_ARGS__) : \
185 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
186 }) \
187
188#define log_link_debug(link, ...) log_link_full(link, LOG_DEBUG, 0, ##__VA_ARGS__)
189#define log_link_info(link, ...) log_link_full(link, LOG_INFO, 0, ##__VA_ARGS__)
190#define log_link_notice(link, ...) log_link_full(link, LOG_NOTICE, 0, ##__VA_ARGS__)
191#define log_link_warning(link, ...) log_link_full(link, LOG_WARNING, 0, ##__VA_ARGS__)
192#define log_link_error(link, ...) log_link_full(link, LOG_ERR, 0, ##__VA_ARGS__)
6c861f0a
LP
193
194#define log_link_debug_errno(link, error, ...) log_link_full(link, LOG_DEBUG, error, ##__VA_ARGS__)
195#define log_link_info_errno(link, error, ...) log_link_full(link, LOG_INFO, error, ##__VA_ARGS__)
196#define log_link_notice_errno(link, error, ...) log_link_full(link, LOG_NOTICE, error, ##__VA_ARGS__)
197#define log_link_warning_errno(link, error, ...) log_link_full(link, LOG_WARNING, error, ##__VA_ARGS__)
198#define log_link_error_errno(link, error, ...) log_link_full(link, LOG_ERR, error, ##__VA_ARGS__)
199
f2341e0a
LP
200#define LOG_LINK_MESSAGE(link, fmt, ...) "MESSAGE=%s: " fmt, (link)->ifname, ##__VA_ARGS__
201#define LOG_LINK_INTERFACE(link) "INTERFACE=%s", (link)->ifname
0b1831c2 202
80431934
PM
203#define ADDRESS_FMT_VAL(address) \
204 be32toh((address).s_addr) >> 24, \
205 (be32toh((address).s_addr) >> 16) & 0xFFu, \
206 (be32toh((address).s_addr) >> 8) & 0xFFu, \
207 be32toh((address).s_addr) & 0xFFu