networkd.h revision f5de5b00204f041aaec828d336c8afd9e860a5c3
97a9a944b5887e91042b019776c41d5dd74557aferikabele/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
97a9a944b5887e91042b019776c41d5dd74557aferikabele
97a9a944b5887e91042b019776c41d5dd74557aferikabele/***
a945f35eff8b6a88009ce73de6d4c862ce58de3cslive This file is part of systemd.
a945f35eff8b6a88009ce73de6d4c862ce58de3cslive
a945f35eff8b6a88009ce73de6d4c862ce58de3cslive Copyright 2013 Tom Gundersen <teg@jklm.no>
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end systemd is free software; you can redistribute it and/or modify it
5a58787efeb02a1c3f06569d019ad81fd2efa06end under the terms of the GNU Lesser General Public License as published by
5a58787efeb02a1c3f06569d019ad81fd2efa06end the Free Software Foundation; either version 2.1 of the License, or
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen (at your option) any later version.
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen systemd is distributed in the hope that it will be useful, but
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen WITHOUT ANY WARRANTY; without even the implied warranty of
5a58787efeb02a1c3f06569d019ad81fd2efa06end MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5a58787efeb02a1c3f06569d019ad81fd2efa06end Lesser General Public License for more details.
5a58787efeb02a1c3f06569d019ad81fd2efa06end
d229f940abfb2490dee17979e9a5ff31b7012eb5rbowen You should have received a copy of the GNU Lesser General Public License
3f08db06526d6901aa08c110b5bc7dde6bc39905nd along with systemd; If not, see <http://www.gnu.org/licenses/>.
5a58787efeb02a1c3f06569d019ad81fd2efa06end***/
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end#pragma once
3f08db06526d6901aa08c110b5bc7dde6bc39905nd
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include <arpa/inet.h>
a63f0ab647ad2ab72efc9bea7a66e24e9ebc5cc2nd
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd#include "sd-event.h"
ad74a0524a06bfe11b7de9e3b4ce7233ab3bd3f7nd#include "sd-rtnl.h"
ad74a0524a06bfe11b7de9e3b4ce7233ab3bd3f7nd#include "sd-bus.h"
e1e8390280254f7f0580d701e583f670643d4f3fnilgun#include "sd-dhcp-client.h"
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung#include "sd-dhcp-server.h"
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd#include "sd-ipv4ll.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "sd-icmp6-nd.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "sd-dhcp6-client.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "udev.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "rtnl-util.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "hashmap.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "list.h"
06ba4a61654b3763ad65f52283832ebf058fdf1cslive#include "set.h"
ced7ef1f8c0df1805da0e87dbc5a1b6282910573nd#include "condition-util.h"
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive#include "in-addr-util.h"
ced7ef1f8c0df1805da0e87dbc5a1b6282910573nd
b21197dc8e6b8c764fdcc24d4bae8b0eebb6bc4end#define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive#define DHCP_ROUTE_METRIC 1024
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive#define IPV4LL_ROUTE_METRIC 2048
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive
97a9a944b5887e91042b019776c41d5dd74557aferikabeletypedef struct NetDev NetDev;
f8396ed8364b56ec8adeaa49cac35a929758a29eslivetypedef struct Network Network;
ffb01336be79c64046b636e59fa8ddca8ec029edsftypedef struct Link Link;
f8396ed8364b56ec8adeaa49cac35a929758a29eslivetypedef struct Address Address;
f8396ed8364b56ec8adeaa49cac35a929758a29eslivetypedef struct Route Route;
5a58787efeb02a1c3f06569d019ad81fd2efa06endtypedef struct Manager Manager;
5a58787efeb02a1c3f06569d019ad81fd2efa06endtypedef struct AddressPool AddressPool;
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06endtypedef enum DHCPSupport {
deeee6bb6fd94c0ba5f3730b58abd9d299c89ccdnd DHCP_SUPPORT_NONE,
4db28ee269aa06f7c6232e11cd01f58c3349af23noodl DHCP_SUPPORT_BOTH,
117c1f888a14e73cdd821dc6c23eb0411144a41cnd DHCP_SUPPORT_V4,
117c1f888a14e73cdd821dc6c23eb0411144a41cnd DHCP_SUPPORT_V6,
4a31db3c3a0202003c1b9f87affa7cc143e120e5sf _DHCP_SUPPORT_MAX,
117c1f888a14e73cdd821dc6c23eb0411144a41cnd _DHCP_SUPPORT_INVALID = -1,
ffb01336be79c64046b636e59fa8ddca8ec029edsf} DHCPSupport;
117c1f888a14e73cdd821dc6c23eb0411144a41cnd
117c1f888a14e73cdd821dc6c23eb0411144a41cndstruct Network {
117c1f888a14e73cdd821dc6c23eb0411144a41cnd Manager *manager;
2bc7f1cf720973a67f8ff7a8d523e40569ae5b6cnd
117c1f888a14e73cdd821dc6c23eb0411144a41cnd char *filename;
117c1f888a14e73cdd821dc6c23eb0411144a41cnd
117c1f888a14e73cdd821dc6c23eb0411144a41cnd struct ether_addr *match_mac;
117c1f888a14e73cdd821dc6c23eb0411144a41cnd char *match_path;
117c1f888a14e73cdd821dc6c23eb0411144a41cnd char *match_driver;
117c1f888a14e73cdd821dc6c23eb0411144a41cnd char *match_type;
87ffb6e33f3cbef3b9bb406cc2d27039fa336eaatrawick char *match_name;
4db28ee269aa06f7c6232e11cd01f58c3349af23noodl char *dhcp_vendor_class_identifier;
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end Condition *match_host;
5a58787efeb02a1c3f06569d019ad81fd2efa06end Condition *match_virt;
5a58787efeb02a1c3f06569d019ad81fd2efa06end Condition *match_kernel;
5a58787efeb02a1c3f06569d019ad81fd2efa06end Condition *match_arch;
5a58787efeb02a1c3f06569d019ad81fd2efa06end
654d8eb036bedc99e90e11910ee02d3421417697rbowen char *description;
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh NetDev *bridge;
5a58787efeb02a1c3f06569d019ad81fd2efa06end NetDev *bond;
5a58787efeb02a1c3f06569d019ad81fd2efa06end NetDev *tunnel;
5a58787efeb02a1c3f06569d019ad81fd2efa06end Hashmap *vlans;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf Hashmap *macvlans;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick Hashmap *vxlans;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick DHCPSupport dhcp;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick bool dhcp_dns;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick bool dhcp_ntp;
06ba4a61654b3763ad65f52283832ebf058fdf1cslive bool dhcp_mtu;
654d8eb036bedc99e90e11910ee02d3421417697rbowen bool dhcp_hostname;
06ba4a61654b3763ad65f52283832ebf058fdf1cslive bool dhcp_domainname;
06ba4a61654b3763ad65f52283832ebf058fdf1cslive bool dhcp_sendhost;
06ba4a61654b3763ad65f52283832ebf058fdf1cslive bool dhcp_broadcast;
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive bool dhcp_critical;
97a9a944b5887e91042b019776c41d5dd74557aferikabele bool dhcp_routes;
654d8eb036bedc99e90e11910ee02d3421417697rbowen bool ipv4ll;
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive
97a9a944b5887e91042b019776c41d5dd74557aferikabele bool dhcp_server;
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive LIST_HEAD(Address, static_addresses);
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive LIST_HEAD(Route, static_routes);
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive
ffb01336be79c64046b636e59fa8ddca8ec029edsf Hashmap *addresses_by_section;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick Hashmap *routes_by_section;
ffb01336be79c64046b636e59fa8ddca8ec029edsf
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick LIST_HEAD(Address, dns);
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick LIST_HEAD(Address, ntp);
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick LIST_FIELDS(Network, networks);
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick};
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawickstruct Address {
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf Network *network;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf uint64_t section;
ffb01336be79c64046b636e59fa8ddca8ec029edsf
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick unsigned char family;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf unsigned char prefixlen;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick unsigned char scope;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick char *label;
77c77cf89621f21c8e2bbad63058b5eaa5f88d4ajim
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick struct in_addr broadcast;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf struct ifa_cacheinfo cinfo;
ced7ef1f8c0df1805da0e87dbc5a1b6282910573nd
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick union in_addr_union in_addr;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf union in_addr_union in_addr_peer;
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf LIST_FIELDS(Address, addresses);
ced7ef1f8c0df1805da0e87dbc5a1b6282910573nd};
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawickstruct Route {
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick Network *network;
4a31db3c3a0202003c1b9f87affa7cc143e120e5sf uint64_t section;
4a31db3c3a0202003c1b9f87affa7cc143e120e5sf
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick unsigned char family;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick unsigned char dst_prefixlen;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick unsigned char scope;
ffb01336be79c64046b636e59fa8ddca8ec029edsf uint32_t metrics;
8a6d5edcb07aeccca7afba02a17dd6904d6b206ctrawick
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive union in_addr_union in_addr;
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive union in_addr_union dst_addr;
97a9a944b5887e91042b019776c41d5dd74557aferikabele
92510838f2eb125726e15c5eb4f7a23c7a0396e4slive LIST_FIELDS(Route, routes);
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic};
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalictypedef enum LinkState {
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic LINK_STATE_INITIALIZING,
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic LINK_STATE_ENSLAVING,
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic LINK_STATE_SETTING_ADDRESSES,
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic LINK_STATE_SETTING_ROUTES,
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic LINK_STATE_CONFIGURED,
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic LINK_STATE_UNMANAGED,
06ba4a61654b3763ad65f52283832ebf058fdf1cslive LINK_STATE_FAILED,
e8d485701957d5c6de870111c112e168a894d49and LINK_STATE_LINGER,
e8d485701957d5c6de870111c112e168a894d49and _LINK_STATE_MAX,
654d8eb036bedc99e90e11910ee02d3421417697rbowen _LINK_STATE_INVALID = -1
654d8eb036bedc99e90e11910ee02d3421417697rbowen} LinkState;
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slivetypedef enum LinkOperationalState {
9bcfc3697a91b5215893a7d0206865b13fc72148nd LINK_OPERSTATE_UNKNOWN,
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive LINK_OPERSTATE_DORMANT,
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive LINK_OPERSTATE_CARRIER,
06ba4a61654b3763ad65f52283832ebf058fdf1cslive LINK_OPERSTATE_DEGRADED,
4a31db3c3a0202003c1b9f87affa7cc143e120e5sf LINK_OPERSTATE_ROUTABLE,
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive _LINK_OPERSTATE_MAX,
9b6a3a558cc90ffdaa0b50bd02546ffec424ded7slive _LINK_OPERSTATE_INVALID = -1
709e3a21ba73b8433462959cd56c773454b34441trawick} LinkOperationalState;
709e3a21ba73b8433462959cd56c773454b34441trawick
709e3a21ba73b8433462959cd56c773454b34441trawickstruct Link {
709e3a21ba73b8433462959cd56c773454b34441trawick Manager *manager;
709e3a21ba73b8433462959cd56c773454b34441trawick
709e3a21ba73b8433462959cd56c773454b34441trawick int n_ref;
709e3a21ba73b8433462959cd56c773454b34441trawick
5a58787efeb02a1c3f06569d019ad81fd2efa06end uint64_t ifindex;
5a58787efeb02a1c3f06569d019ad81fd2efa06end char *ifname;
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd char *state_file;
ad74a0524a06bfe11b7de9e3b4ce7233ab3bd3f7nd struct ether_addr mac;
ad74a0524a06bfe11b7de9e3b4ce7233ab3bd3f7nd struct udev_device *udev_device;
e1e8390280254f7f0580d701e583f670643d4f3fnilgun
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung unsigned flags;
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh uint8_t kernel_operstate;
19737f4fbef1805f9c3e9e045bb6d710a1e5e10fhumbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd Network *network;
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd LinkState state;
0d0ba3a410038e179b695446bb149cce6264e0abnd LinkOperationalState operstate;
0d0ba3a410038e179b695446bb149cce6264e0abnd
0d0ba3a410038e179b695446bb149cce6264e0abnd unsigned addr_messages;
0d0ba3a410038e179b695446bb149cce6264e0abnd unsigned route_messages;
0d0ba3a410038e179b695446bb149cce6264e0abnd unsigned enslaving;
0d0ba3a410038e179b695446bb149cce6264e0abnd
0d0ba3a410038e179b695446bb149cce6264e0abnd LIST_HEAD(Address, addresses);
0d0ba3a410038e179b695446bb149cce6264e0abnd
0d0ba3a410038e179b695446bb149cce6264e0abnd sd_dhcp_client *dhcp_client;
0d0ba3a410038e179b695446bb149cce6264e0abnd sd_dhcp_lease *dhcp_lease;
0d0ba3a410038e179b695446bb149cce6264e0abnd char *lease_file;
0d0ba3a410038e179b695446bb149cce6264e0abnd uint16_t original_mtu;
0d0ba3a410038e179b695446bb149cce6264e0abnd sd_ipv4ll *ipv4ll;
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh
5effc8b39fae5cd169d17f342bfc265705840014rbowen LIST_HEAD(Address, pool_addresses);
d229f940abfb2490dee17979e9a5ff31b7012eb5rbowen
0d0ba3a410038e179b695446bb149cce6264e0abnd sd_dhcp_server *dhcp_server;
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd sd_icmp6_nd *icmp6_router_discovery;
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd sd_dhcp6_client *dhcp6_client;
5a58787efeb02a1c3f06569d019ad81fd2efa06end};
struct AddressPool {
Manager *manager;
unsigned family;
unsigned prefixlen;
union in_addr_union in_addr;
LIST_FIELDS(AddressPool, address_pools);
};
struct Manager {
sd_rtnl *rtnl;
sd_event *event;
sd_bus *bus;
struct udev *udev;
struct udev_monitor *udev_monitor;
sd_event_source *udev_event_source;
sd_event_source *sigterm_event_source;
sd_event_source *sigint_event_source;
char *state_file;
Hashmap *links;
Hashmap *netdevs;
LIST_HEAD(Network, networks);
LIST_HEAD(AddressPool, address_pools);
usec_t network_dirs_ts_usec;
};
extern const char* const network_dirs[];
/* Manager */
int manager_new(Manager **ret);
void manager_free(Manager *m);
int manager_load_config(Manager *m);
bool manager_should_reload(Manager *m);
int manager_rtnl_enumerate_links(Manager *m);
int manager_rtnl_listen(Manager *m);
int manager_udev_listen(Manager *m);
int manager_bus_listen(Manager *m);
int manager_save(Manager *m);
int manager_address_pool_acquire(Manager *m, unsigned family, unsigned prefixlen, union in_addr_union *found);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
#define _cleanup_manager_free_ _cleanup_(manager_freep)
/* Network */
int network_load(Manager *manager);
void network_free(Network *network);
DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
#define _cleanup_network_free_ _cleanup_(network_freep)
int network_get(Manager *manager, struct udev_device *device,
const char *ifname, const struct ether_addr *mac,
Network **ret);
int network_apply(Manager *manager, Network *network, Link *link);
int config_parse_netdev(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_tunnel(const char *unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata);
int config_parse_tunnel_address(const char *unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata);
/* gperf */
const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
/* Route */
int route_new_static(Network *network, unsigned section, Route **ret);
int route_new_dynamic(Route **ret);
void route_free(Route *route);
int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
#define _cleanup_route_free_ _cleanup_(route_freep)
int config_parse_gateway(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_destination(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
/* Address */
int address_new_static(Network *network, unsigned section, Address **ret);
int address_new_dynamic(Address **ret);
void address_free(Address *address);
int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
bool address_equal(Address *a1, Address *a2);
DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
#define _cleanup_address_free_ _cleanup_(address_freep)
int config_parse_dns(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_address(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_label(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
/* Link */
Link *link_unref(Link *link);
Link *link_ref(Link *link);
int link_get(Manager *m, int ifindex, Link **ret);
int link_add(Manager *manager, sd_rtnl_message *message, Link **ret);
void link_drop(Link *link);
int link_update(Link *link, sd_rtnl_message *message);
int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata);
int link_initialized(Link *link, struct udev_device *device);
int link_save(Link *link);
bool link_has_carrier(unsigned flags, uint8_t operstate);
const char* link_state_to_string(LinkState s) _const_;
LinkState link_state_from_string(const char *s) _pure_;
const char* link_operstate_to_string(LinkOperationalState s) _const_;
LinkOperationalState link_operstate_from_string(const char *s) _pure_;
DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
#define _cleanup_link_unref_ _cleanup_(link_unrefp)
/* DHCP support */
const char* dhcp_support_to_string(DHCPSupport i) _const_;
DHCPSupport dhcp_support_from_string(const char *s) _pure_;
int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
/* Address Pool */
int address_pool_new(Manager *m, AddressPool **ret, unsigned family, const union in_addr_union *u, unsigned prefixlen);
int address_pool_new_from_string(Manager *m, AddressPool **ret, unsigned family, const char *p, unsigned prefixlen);
void address_pool_free(AddressPool *p);
int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
/* Macros which append INTERFACE= to the message */
#define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
#define log_debug_link(link, ...) log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
#define log_info_link(link, ...) log_full_link(LOG_INFO, link, ##__VA_ARGS__)
#define log_notice_link(link, ...) log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
#define log_warning_link(link, ...) log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
#define log_error_link(link, ...) log_full_link(LOG_ERR, link, ##__VA_ARGS__)
#define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
#define ADDRESS_FMT_VAL(address) \
(address).s_addr & 0xFF, \
((address).s_addr >> 8) & 0xFF, \
((address).s_addr >> 16) & 0xFF, \
(address).s_addr >> 24