networkd.h revision 85a8eeee36b57c1ab382b0225fa9a87525bbeee9
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele/***
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele This file is part of systemd.
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele 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
5a58787efeb02a1c3f06569d019ad81fd2efa06end (at your option) any later version.
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end systemd is distributed in the hope that it will be useful, but
5a58787efeb02a1c3f06569d019ad81fd2efa06end WITHOUT ANY WARRANTY; without even the implied warranty of
52fff662005b1866a3ff09bb6c902800c5cc6dedjerenkrantz MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5a58787efeb02a1c3f06569d019ad81fd2efa06end Lesser General Public License for more details.
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end You should have received a copy of the GNU Lesser General Public License
4b5981e276e93df97c34e4da05ca5cf8bbd937dand along with systemd; If not, see <http://www.gnu.org/licenses/>.
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd***/
a78048ccbdb6256da15e6b0e7e95355e480c2301nd
5e740829c3448285963d3882530669f0112cf690gryzor#pragma once
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem#include <arpa/inet.h>
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd#include "sd-event.h"
aee1f193a276866212922ae5072e3014db28582frpluem#include "sd-rtnl.h"
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele#include "sd-bus.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "sd-dhcp-client.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "sd-dhcp-server.h"
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive#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"
df321386f1d9ed17a3e5e6468807996a12890d50gryzor#include "list.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "set.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "condition.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end#include "in-addr-util.h"
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06end#define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
5a58787efeb02a1c3f06569d019ad81fd2efa06end#define DHCP_ROUTE_METRIC 1024
5a58787efeb02a1c3f06569d019ad81fd2efa06end#define IPV4LL_ROUTE_METRIC 2048
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct NetDev NetDev;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct Network Network;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct Link Link;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct Address Address;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct Route Route;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct Manager Manager;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef struct AddressPool AddressPool;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slivetypedef enum DHCPSupport {
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive DHCP_SUPPORT_NONE,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive DHCP_SUPPORT_BOTH,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive DHCP_SUPPORT_V4,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive DHCP_SUPPORT_V6,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive _DHCP_SUPPORT_MAX,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive _DHCP_SUPPORT_INVALID = -1,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive} DHCPSupport;
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive
5a58787efeb02a1c3f06569d019ad81fd2efa06endtypedef enum LLMNRSupport {
5a58787efeb02a1c3f06569d019ad81fd2efa06end LLMNR_SUPPORT_NO,
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive LLMNR_SUPPORT_YES,
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive LLMNR_SUPPORT_RESOLVE,
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive _LLMNR_SUPPORT_MAX,
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive _LLMNR_SUPPORT_INVALID = -1,
06d77ae37da42a6f8bbea25b7d7f8b6629245629slive} LLMNRSupport;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slivestruct Network {
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Manager *manager;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive char *filename;
c6f41bc69d643835804e7e831776d3d46c6f5962slive
c6f41bc69d643835804e7e831776d3d46c6f5962slive struct ether_addr *match_mac;
c6f41bc69d643835804e7e831776d3d46c6f5962slive char *match_path;
c6f41bc69d643835804e7e831776d3d46c6f5962slive char *match_driver;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem char *match_type;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem char *match_name;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive char *dhcp_vendor_class_identifier;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Condition *match_host;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Condition *match_virt;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Condition *match_kernel;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Condition *match_arch;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem char *description;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem NetDev *bridge;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem NetDev *bond;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem Hashmap *stacked_netdevs;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem DHCPSupport dhcp;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_dns;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_ntp;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_mtu;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_hostname;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_domains;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_sendhost;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_broadcast;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem bool dhcp_critical;
c6f41bc69d643835804e7e831776d3d46c6f5962slive bool dhcp_routes;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned dhcp_route_metric;
c6f41bc69d643835804e7e831776d3d46c6f5962slive bool ipv4ll;
c6f41bc69d643835804e7e831776d3d46c6f5962slive bool ipv4ll_route;
06d77ae37da42a6f8bbea25b7d7f8b6629245629slive
c6f41bc69d643835804e7e831776d3d46c6f5962slive bool dhcp_server;
c6f41bc69d643835804e7e831776d3d46c6f5962slive
c6f41bc69d643835804e7e831776d3d46c6f5962slive LIST_HEAD(Address, static_addresses);
c6f41bc69d643835804e7e831776d3d46c6f5962slive LIST_HEAD(Route, static_routes);
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Hashmap *addresses_by_section;
c6f41bc69d643835804e7e831776d3d46c6f5962slive Hashmap *routes_by_section;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive bool wildcard_domain;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive char **domains, **dns, **ntp;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive LLMNRSupport llmnr;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive LIST_FIELDS(Network, networks);
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive};
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slivestruct Address {
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive Network *network;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned section;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive int family;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem unsigned char prefixlen;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem unsigned char scope;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned char flags;
bf380c59be3f235bde21f1c00098e09e3cf7e7aerpluem char *label;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive struct in_addr broadcast;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive struct ifa_cacheinfo cinfo;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive union in_addr_union in_addr;
aee1f193a276866212922ae5072e3014db28582frpluem union in_addr_union in_addr_peer;
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive LIST_FIELDS(Address, addresses);
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive};
aa8cf57195dfb7fa3d0baedf81f8be377946cea8slive
5a58787efeb02a1c3f06569d019ad81fd2efa06endstruct Route {
aee1f193a276866212922ae5072e3014db28582frpluem Network *network;
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele unsigned section;
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem int family;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned char dst_prefixlen;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned char scope;
aee1f193a276866212922ae5072e3014db28582frpluem uint32_t metrics;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned char protocol; /* RTPROT_* */
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem union in_addr_union in_addr;
aee1f193a276866212922ae5072e3014db28582frpluem union in_addr_union dst_addr;
aee1f193a276866212922ae5072e3014db28582frpluem union in_addr_union prefsrc_addr;
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele LIST_FIELDS(Route, routes);
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele};
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabelestruct AddressPool {
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele Manager *manager;
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele int family;
aee1f193a276866212922ae5072e3014db28582frpluem unsigned prefixlen;
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem union in_addr_union in_addr;
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem LIST_FIELDS(AddressPool, address_pools);
aee1f193a276866212922ae5072e3014db28582frpluem};
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabelestruct Manager {
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele sd_rtnl *rtnl;
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele sd_event *event;
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele sd_bus *bus;
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele struct udev *udev;
aee1f193a276866212922ae5072e3014db28582frpluem struct udev_monitor *udev_monitor;
aee1f193a276866212922ae5072e3014db28582frpluem sd_event_source *udev_event_source;
aee1f193a276866212922ae5072e3014db28582frpluem
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele char *state_file;
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem Hashmap *links;
aee1f193a276866212922ae5072e3014db28582frpluem Hashmap *netdevs;
9bcfc3697a91b5215893a7d0206865b13fc72148nd LIST_HEAD(Network, networks);
9bcfc3697a91b5215893a7d0206865b13fc72148nd LIST_HEAD(AddressPool, address_pools);
9bcfc3697a91b5215893a7d0206865b13fc72148nd
aee1f193a276866212922ae5072e3014db28582frpluem usec_t network_dirs_ts_usec;
aee1f193a276866212922ae5072e3014db28582frpluem};
aee1f193a276866212922ae5072e3014db28582frpluem
4ab980a06412fd86f52a6d054fb7e26de155c530erikabeleextern const char* const network_dirs[];
aee1f193a276866212922ae5072e3014db28582frpluem
5a58787efeb02a1c3f06569d019ad81fd2efa06end/* Manager */
5a58787efeb02a1c3f06569d019ad81fd2efa06end
5a58787efeb02a1c3f06569d019ad81fd2efa06endint manager_new(Manager **ret);
aee1f193a276866212922ae5072e3014db28582frpluemvoid manager_free(Manager *m);
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint manager_load_config(Manager *m);
aee1f193a276866212922ae5072e3014db28582frpluembool manager_should_reload(Manager *m);
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint manager_rtnl_enumerate_links(Manager *m);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint manager_rtnl_listen(Manager *m);
aee1f193a276866212922ae5072e3014db28582frpluemint manager_udev_listen(Manager *m);
aee1f193a276866212922ae5072e3014db28582frpluemint manager_bus_listen(Manager *m);
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint manager_save(Manager *m);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemDEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
aee1f193a276866212922ae5072e3014db28582frpluem#define _cleanup_manager_free_ _cleanup_(manager_freep)
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem/* Network */
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint network_load(Manager *manager);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemvoid network_free(Network *network);
10a304fc5348d394375b98ae10ca9b137fd10cafkess
aee1f193a276866212922ae5072e3014db28582frpluemDEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
aee1f193a276866212922ae5072e3014db28582frpluem#define _cleanup_network_free_ _cleanup_(network_freep)
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint network_get(Manager *manager, struct udev_device *device,
aee1f193a276866212922ae5072e3014db28582frpluem const char *ifname, const struct ether_addr *mac,
aee1f193a276866212922ae5072e3014db28582frpluem Network **ret);
aee1f193a276866212922ae5072e3014db28582frpluemint network_apply(Manager *manager, Network *network, Link *link);
aee1f193a276866212922ae5072e3014db28582frpluem
4ab980a06412fd86f52a6d054fb7e26de155c530erikabeleint config_parse_netdev(const char *unit, const char *filename, unsigned line,
aee1f193a276866212922ae5072e3014db28582frpluem const char *section, unsigned section_line, const char *lvalue,
aee1f193a276866212922ae5072e3014db28582frpluem int ltype, const char *rvalue, void *data, void *userdata);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_domains(const char *unit,
5a58787efeb02a1c3f06569d019ad81fd2efa06end const char *filename,
5a58787efeb02a1c3f06569d019ad81fd2efa06end unsigned line,
5a58787efeb02a1c3f06569d019ad81fd2efa06end const char *section,
aee1f193a276866212922ae5072e3014db28582frpluem unsigned section_line,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele const char *lvalue,
aee1f193a276866212922ae5072e3014db28582frpluem int ltype,
aee1f193a276866212922ae5072e3014db28582frpluem const char *rvalue,
aee1f193a276866212922ae5072e3014db28582frpluem void *data,
aee1f193a276866212922ae5072e3014db28582frpluem void *userdata);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_tunnel(const char *unit,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele const char *filename,
aee1f193a276866212922ae5072e3014db28582frpluem unsigned line,
aee1f193a276866212922ae5072e3014db28582frpluem const char *section,
aee1f193a276866212922ae5072e3014db28582frpluem unsigned section_line,
aee1f193a276866212922ae5072e3014db28582frpluem const char *lvalue,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele int ltype,
aee1f193a276866212922ae5072e3014db28582frpluem const char *rvalue,
aee1f193a276866212922ae5072e3014db28582frpluem void *data,
aee1f193a276866212922ae5072e3014db28582frpluem void *userdata);
8ba6e8ba8d8ad4d8228872d5526fa7295ff43149poirier
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_tunnel_address(const char *unit,
5a58787efeb02a1c3f06569d019ad81fd2efa06end const char *filename,
5a58787efeb02a1c3f06569d019ad81fd2efa06end unsigned line,
5a58787efeb02a1c3f06569d019ad81fd2efa06end const char *section,
aee1f193a276866212922ae5072e3014db28582frpluem unsigned section_line,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele const char *lvalue,
aee1f193a276866212922ae5072e3014db28582frpluem int ltype,
aee1f193a276866212922ae5072e3014db28582frpluem const char *rvalue,
5d7e5de2da57434c8e68c8fa49cbf6d70ee0f817slive void *data,
aee1f193a276866212922ae5072e3014db28582frpluem void *userdata);
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_vxlan_group_address(const char *unit,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele const char *filename,
aee1f193a276866212922ae5072e3014db28582frpluem unsigned line,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele const char *section,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele unsigned section_line,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele const char *lvalue,
aee1f193a276866212922ae5072e3014db28582frpluem int ltype,
5a58787efeb02a1c3f06569d019ad81fd2efa06end const char *rvalue,
5a58787efeb02a1c3f06569d019ad81fd2efa06end void *data,
5a58787efeb02a1c3f06569d019ad81fd2efa06end void *userdata);
aee1f193a276866212922ae5072e3014db28582frpluem
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele/* gperf */
aee1f193a276866212922ae5072e3014db28582frpluemconst struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem/* Route */
aee1f193a276866212922ae5072e3014db28582frpluemint route_new_static(Network *network, unsigned section, Route **ret);
aee1f193a276866212922ae5072e3014db28582frpluemint route_new_dynamic(Route **ret, unsigned char rtm_protocol);
4ab980a06412fd86f52a6d054fb7e26de155c530erikabelevoid route_free(Route *route);
aee1f193a276866212922ae5072e3014db28582frpluemint route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
aee1f193a276866212922ae5072e3014db28582frpluemint route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluem
5a58787efeb02a1c3f06569d019ad81fd2efa06endDEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
5a58787efeb02a1c3f06569d019ad81fd2efa06end#define _cleanup_route_free_ _cleanup_(route_freep)
5a58787efeb02a1c3f06569d019ad81fd2efa06end
a3388213b2b4d46b356be205e38204e67b4304d8rbowenint config_parse_gateway(const char *unit, const char *filename, unsigned line,
a3388213b2b4d46b356be205e38204e67b4304d8rbowen const char *section, unsigned section_line, const char *lvalue,
a3388213b2b4d46b356be205e38204e67b4304d8rbowen int ltype, const char *rvalue, void *data, void *userdata);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_destination(const char *unit, const char *filename, unsigned line,
aee1f193a276866212922ae5072e3014db28582frpluem const char *section, unsigned section_line, const char *lvalue,
aee1f193a276866212922ae5072e3014db28582frpluem int ltype, const char *rvalue, void *data, void *userdata);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_route_priority(const char *unit, const char *filename, unsigned line,
a3388213b2b4d46b356be205e38204e67b4304d8rbowen const char *section, unsigned section_line, const char *lvalue,
a3388213b2b4d46b356be205e38204e67b4304d8rbowen int ltype, const char *rvalue, void *data, void *userdata);
5a58787efeb02a1c3f06569d019ad81fd2efa06end/* Address */
5a58787efeb02a1c3f06569d019ad81fd2efa06endint address_new_static(Network *network, unsigned section, Address **ret);
df321386f1d9ed17a3e5e6468807996a12890d50gryzorint address_new_dynamic(Address **ret);
df321386f1d9ed17a3e5e6468807996a12890d50gryzorvoid address_free(Address *address);
df321386f1d9ed17a3e5e6468807996a12890d50gryzorint address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
df321386f1d9ed17a3e5e6468807996a12890d50gryzorint address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
df321386f1d9ed17a3e5e6468807996a12890d50gryzorint address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
df321386f1d9ed17a3e5e6468807996a12890d50gryzorbool address_equal(Address *a1, Address *a2);
df321386f1d9ed17a3e5e6468807996a12890d50gryzor
df321386f1d9ed17a3e5e6468807996a12890d50gryzorDEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
df321386f1d9ed17a3e5e6468807996a12890d50gryzor#define _cleanup_address_free_ _cleanup_(address_freep)
df321386f1d9ed17a3e5e6468807996a12890d50gryzor
df321386f1d9ed17a3e5e6468807996a12890d50gryzorint config_parse_address(const char *unit, const char *filename, unsigned line,
df321386f1d9ed17a3e5e6468807996a12890d50gryzor const char *section, unsigned section_line, const char *lvalue,
df321386f1d9ed17a3e5e6468807996a12890d50gryzor int ltype, const char *rvalue, void *data, void *userdata);
df321386f1d9ed17a3e5e6468807996a12890d50gryzor
df321386f1d9ed17a3e5e6468807996a12890d50gryzorint config_parse_broadcast(const char *unit, const char *filename, unsigned line,
df321386f1d9ed17a3e5e6468807996a12890d50gryzor const char *section, unsigned section_line, const char *lvalue,
df321386f1d9ed17a3e5e6468807996a12890d50gryzor int ltype, const char *rvalue, void *data, void *userdata);
df321386f1d9ed17a3e5e6468807996a12890d50gryzor
5a58787efeb02a1c3f06569d019ad81fd2efa06endint config_parse_label(const char *unit, const char *filename, unsigned line,
aee1f193a276866212922ae5072e3014db28582frpluem const char *section, unsigned section_line, const char *lvalue,
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele int ltype, const char *rvalue, void *data, void *userdata);
aee1f193a276866212922ae5072e3014db28582frpluem
aee1f193a276866212922ae5072e3014db28582frpluem/* DHCP support */
aee1f193a276866212922ae5072e3014db28582frpluem
4ab980a06412fd86f52a6d054fb7e26de155c530erikabeleconst char* dhcp_support_to_string(DHCPSupport i) _const_;
aee1f193a276866212922ae5072e3014db28582frpluemDHCPSupport dhcp_support_from_string(const char *s) _pure_;
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_dhcp(const char *unit, const char *filename, unsigned line,
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele const char *section, unsigned section_line, const char *lvalue,
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele int ltype, const char *rvalue, void *data, void *userdata);
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele/* LLMNR support */
ea49840bfe8467a7d7bd4db27b1d4880a85511aberikabele
aee1f193a276866212922ae5072e3014db28582frpluemconst char* llmnr_support_to_string(LLMNRSupport i) _const_;
aee1f193a276866212922ae5072e3014db28582frpluemLLMNRSupport llmnr_support_from_string(const char *s) _pure_;
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint config_parse_llmnr(const char *unit, const char *filename, unsigned line,
5a58787efeb02a1c3f06569d019ad81fd2efa06end const char *section, unsigned section_line, const char *lvalue,
5a58787efeb02a1c3f06569d019ad81fd2efa06end int ltype, const char *rvalue, void *data, void *userdata);
5a58787efeb02a1c3f06569d019ad81fd2efa06end
aee1f193a276866212922ae5072e3014db28582frpluem/* Address Pool */
4ab980a06412fd86f52a6d054fb7e26de155c530erikabele
aee1f193a276866212922ae5072e3014db28582frpluemint address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
aee1f193a276866212922ae5072e3014db28582frpluemint address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
aee1f193a276866212922ae5072e3014db28582frpluemvoid address_pool_free(AddressPool *p);
aee1f193a276866212922ae5072e3014db28582frpluem
4ab980a06412fd86f52a6d054fb7e26de155c530erikabeleint address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
aee1f193a276866212922ae5072e3014db28582frpluem