]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link.h
networkd: add basic LLDP transmission support
[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
fc2f9534
LP
24#include "sd-dhcp-client.h"
25#include "sd-dhcp-server.h"
fc2f9534 26#include "sd-dhcp6-client.h"
07630cea 27#include "sd-ipv4ll.h"
fc2f9534 28#include "sd-lldp.h"
07630cea 29#include "sd-ndisc.h"
fc2f9534
LP
30
31typedef struct Link Link;
0b1831c2
TG
32
33typedef enum LinkState {
8434fd5c 34 LINK_STATE_PENDING,
0b1831c2
TG
35 LINK_STATE_ENSLAVING,
36 LINK_STATE_SETTING_ADDRESSES,
37 LINK_STATE_SETTING_ROUTES,
38 LINK_STATE_CONFIGURED,
39 LINK_STATE_UNMANAGED,
40 LINK_STATE_FAILED,
41 LINK_STATE_LINGER,
42 _LINK_STATE_MAX,
43 _LINK_STATE_INVALID = -1
44} LinkState;
45
fc2f9534
LP
46typedef enum LinkOperationalState {
47 LINK_OPERSTATE_OFF,
48 LINK_OPERSTATE_NO_CARRIER,
49 LINK_OPERSTATE_DORMANT,
50 LINK_OPERSTATE_CARRIER,
51 LINK_OPERSTATE_DEGRADED,
52 LINK_OPERSTATE_ROUTABLE,
53 _LINK_OPERSTATE_MAX,
54 _LINK_OPERSTATE_INVALID = -1
55} LinkOperationalState;
56
fc2f9534 57#include "networkd-address.h"
71d35b6b
TA
58#include "networkd-network.h"
59#include "networkd.h"
fc2f9534 60
0b1831c2
TG
61struct Link {
62 Manager *manager;
63
64 int n_ref;
65
66 int ifindex;
67 char *ifname;
b710e6b6 68 unsigned short iftype;
0b1831c2
TG
69 char *state_file;
70 struct ether_addr mac;
c601ebf7 71 struct in6_addr ipv6ll_address;
0b1831c2
TG
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;
e7ab854c
TG
102 bool ipv4ll_address:1;
103 bool ipv4ll_route:1;
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 114
8e1ad1ea 115 /* This is about LLDP reception */
ce43e484 116 sd_lldp *lldp;
49699bac 117 char *lldp_file;
0d4ad91d 118
8e1ad1ea
LP
119 /* This is about LLDP transmission */
120 unsigned lldp_tx_fast; /* The LLDP txFast counter (See 802.1ab-2009, section 9.2.5.18) */
121 sd_event_source *lldp_tx_event_source;
122
0d4ad91d
AR
123 Hashmap *bound_by_links;
124 Hashmap *bound_to_links;
0b1831c2
TG
125};
126
127Link *link_unref(Link *link);
128Link *link_ref(Link *link);
129int link_get(Manager *m, int ifindex, Link **ret);
1c4baffc 130int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
0b1831c2
TG
131void link_drop(Link *link);
132
91b5f997
TG
133int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
134int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
0b1831c2 135
b22d8a00 136void link_enter_failed(Link *link);
0b1831c2
TG
137int link_initialized(Link *link, struct udev_device *device);
138
8012cd39 139void link_check_ready(Link *link);
b22d8a00 140
84de38c5 141void link_update_operstate(Link *link);
1c4baffc 142int link_update(Link *link, sd_netlink_message *message);
b22d8a00 143
84de38c5
TG
144void link_dirty(Link *link);
145void link_clean(Link *link);
0b1831c2
TG
146int link_save(Link *link);
147
9c0a72f9 148int link_carrier_reset(Link *link);
a61bb41c 149bool link_has_carrier(Link *link);
0b1831c2 150
c601ebf7 151int link_ipv6ll_gained(Link *link, const struct in6_addr *address);
e7ab854c 152
3c9b8860
TG
153int link_set_mtu(Link *link, uint32_t mtu);
154int link_set_hostname(Link *link, const char *hostname);
21b80ad1 155int link_set_timezone(Link *link, const char *timezone);
3c9b8860 156
b22d8a00 157int ipv4ll_configure(Link *link);
3c9b8860 158int dhcp4_configure(Link *link);
7a695d8e
TG
159int dhcp6_configure(Link *link);
160int dhcp6_request_address(Link *link);
de1e9928 161int ndisc_configure(Link *link);
b22d8a00 162
0b1831c2
TG
163const char* link_state_to_string(LinkState s) _const_;
164LinkState link_state_from_string(const char *s) _pure_;
165
fc2f9534
LP
166const char* link_operstate_to_string(LinkOperationalState s) _const_;
167LinkOperationalState link_operstate_from_string(const char *s) _pure_;
168
e331e246
TG
169extern const sd_bus_vtable link_vtable[];
170
171int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
172int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
173int link_send_changed(Link *link, const char *property, ...) _sentinel_;
0b1831c2
TG
174
175DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
176#define _cleanup_link_unref_ _cleanup_(link_unrefp)
177
178/* Macros which append INTERFACE= to the message */
179
f2341e0a
LP
180#define log_link_full(link, level, error, ...) \
181 ({ \
182 Link *_l = (link); \
183 _l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, ##__VA_ARGS__) : \
184 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
185 }) \
186
187#define log_link_debug(link, ...) log_link_full(link, LOG_DEBUG, 0, ##__VA_ARGS__)
188#define log_link_info(link, ...) log_link_full(link, LOG_INFO, 0, ##__VA_ARGS__)
189#define log_link_notice(link, ...) log_link_full(link, LOG_NOTICE, 0, ##__VA_ARGS__)
190#define log_link_warning(link, ...) log_link_full(link, LOG_WARNING, 0, ##__VA_ARGS__)
191#define log_link_error(link, ...) log_link_full(link, LOG_ERR, 0, ##__VA_ARGS__)
6c861f0a
LP
192
193#define log_link_debug_errno(link, error, ...) log_link_full(link, LOG_DEBUG, error, ##__VA_ARGS__)
194#define log_link_info_errno(link, error, ...) log_link_full(link, LOG_INFO, error, ##__VA_ARGS__)
195#define log_link_notice_errno(link, error, ...) log_link_full(link, LOG_NOTICE, error, ##__VA_ARGS__)
196#define log_link_warning_errno(link, error, ...) log_link_full(link, LOG_WARNING, error, ##__VA_ARGS__)
197#define log_link_error_errno(link, error, ...) log_link_full(link, LOG_ERR, error, ##__VA_ARGS__)
198
f2341e0a
LP
199#define LOG_LINK_MESSAGE(link, fmt, ...) "MESSAGE=%s: " fmt, (link)->ifname, ##__VA_ARGS__
200#define LOG_LINK_INTERFACE(link) "INTERFACE=%s", (link)->ifname
0b1831c2 201
80431934
PM
202#define ADDRESS_FMT_VAL(address) \
203 be32toh((address).s_addr) >> 24, \
204 (be32toh((address).s_addr) >> 16) & 0xFFu, \
205 (be32toh((address).s_addr) >> 8) & 0xFFu, \
206 be32toh((address).s_addr) & 0xFFu