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