]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link.h
networkd: address - rework firewall rules lifetime
[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"
28#include "sd-ipv4ll.h"
29#include "sd-icmp6-nd.h"
30#include "sd-dhcp6-client.h"
31#include "sd-lldp.h"
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;
0b1831c2
TG
87
88 sd_dhcp_client *dhcp_client;
89 sd_dhcp_lease *dhcp_lease;
90 char *lease_file;
91 uint16_t original_mtu;
3c9b8860
TG
92 unsigned dhcp4_messages;
93 bool dhcp4_configured;
18d29550 94 bool dhcp6_configured;
b22d8a00 95
0b1831c2 96 sd_ipv4ll *ipv4ll;
b22d8a00
TG
97 bool ipv4ll_address;
98 bool ipv4ll_route;
0b1831c2 99
3c9b8860
TG
100 bool static_configured;
101
0b1831c2
TG
102 LIST_HEAD(Address, pool_addresses);
103
104 sd_dhcp_server *dhcp_server;
105
106 sd_icmp6_nd *icmp6_router_discovery;
107 sd_dhcp6_client *dhcp6_client;
be3a09b7 108 bool rtnl_extended_attrs;
ce43e484
SS
109
110 sd_lldp *lldp;
49699bac 111 char *lldp_file;
0d4ad91d
AR
112
113 Hashmap *bound_by_links;
114 Hashmap *bound_to_links;
0b1831c2
TG
115};
116
117Link *link_unref(Link *link);
118Link *link_ref(Link *link);
119int link_get(Manager *m, int ifindex, Link **ret);
1c4baffc 120int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
0b1831c2
TG
121void link_drop(Link *link);
122
91b5f997
TG
123int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
124int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
0b1831c2 125
b22d8a00 126void link_enter_failed(Link *link);
0b1831c2
TG
127int link_initialized(Link *link, struct udev_device *device);
128
8012cd39 129void link_check_ready(Link *link);
b22d8a00 130
1c4baffc 131int link_update(Link *link, sd_netlink_message *message);
b22d8a00 132
0b1831c2
TG
133int link_save(Link *link);
134
9c0a72f9 135int link_carrier_reset(Link *link);
a61bb41c 136bool link_has_carrier(Link *link);
0b1831c2 137
3c9b8860
TG
138int link_set_mtu(Link *link, uint32_t mtu);
139int link_set_hostname(Link *link, const char *hostname);
21b80ad1 140int link_set_timezone(Link *link, const char *timezone);
3c9b8860 141
b22d8a00 142int ipv4ll_configure(Link *link);
3c9b8860 143int dhcp4_configure(Link *link);
5c79bd79 144int icmp6_configure(Link *link);
b22d8a00 145
a97dcc12
TG
146bool link_lldp_enabled(Link *link);
147bool link_ipv4ll_enabled(Link *link);
d0d6a4cd 148bool link_ipv6ll_enabled(Link *link);
a97dcc12
TG
149bool link_dhcp4_server_enabled(Link *link);
150bool link_dhcp4_enabled(Link *link);
151bool link_dhcp6_enabled(Link *link);
152
0b1831c2
TG
153const char* link_state_to_string(LinkState s) _const_;
154LinkState link_state_from_string(const char *s) _pure_;
155
fc2f9534
LP
156const char* link_operstate_to_string(LinkOperationalState s) _const_;
157LinkOperationalState link_operstate_from_string(const char *s) _pure_;
158
e331e246
TG
159extern const sd_bus_vtable link_vtable[];
160
161int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
162int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
163int link_send_changed(Link *link, const char *property, ...) _sentinel_;
0b1831c2
TG
164
165DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
166#define _cleanup_link_unref_ _cleanup_(link_unrefp)
167
168/* Macros which append INTERFACE= to the message */
169
f2341e0a
LP
170#define log_link_full(link, level, error, ...) \
171 ({ \
172 Link *_l = (link); \
173 _l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, ##__VA_ARGS__) : \
174 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
175 }) \
176
177#define log_link_debug(link, ...) log_link_full(link, LOG_DEBUG, 0, ##__VA_ARGS__)
178#define log_link_info(link, ...) log_link_full(link, LOG_INFO, 0, ##__VA_ARGS__)
179#define log_link_notice(link, ...) log_link_full(link, LOG_NOTICE, 0, ##__VA_ARGS__)
180#define log_link_warning(link, ...) log_link_full(link, LOG_WARNING, 0, ##__VA_ARGS__)
181#define log_link_error(link, ...) log_link_full(link, LOG_ERR, 0, ##__VA_ARGS__)
6c861f0a
LP
182
183#define log_link_debug_errno(link, error, ...) log_link_full(link, LOG_DEBUG, error, ##__VA_ARGS__)
184#define log_link_info_errno(link, error, ...) log_link_full(link, LOG_INFO, error, ##__VA_ARGS__)
185#define log_link_notice_errno(link, error, ...) log_link_full(link, LOG_NOTICE, error, ##__VA_ARGS__)
186#define log_link_warning_errno(link, error, ...) log_link_full(link, LOG_WARNING, error, ##__VA_ARGS__)
187#define log_link_error_errno(link, error, ...) log_link_full(link, LOG_ERR, error, ##__VA_ARGS__)
188
f2341e0a
LP
189#define LOG_LINK_MESSAGE(link, fmt, ...) "MESSAGE=%s: " fmt, (link)->ifname, ##__VA_ARGS__
190#define LOG_LINK_INTERFACE(link) "INTERFACE=%s", (link)->ifname
0b1831c2 191
80431934
PM
192#define ADDRESS_FMT_VAL(address) \
193 be32toh((address).s_addr) >> 24, \
194 (be32toh((address).s_addr) >> 16) & 0xFFu, \
195 (be32toh((address).s_addr) >> 8) & 0xFFu, \
196 be32toh((address).s_addr) & 0xFFu