2015-08-27 13:59:06 +02:00
|
|
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/***
|
|
|
|
This file is part of systemd.
|
|
|
|
|
|
|
|
Copyright 2013 Tom Gundersen <teg@jklm.no>
|
|
|
|
|
|
|
|
systemd is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
systemd is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
|
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
|
|
|
|
#include "condition.h"
|
2016-01-05 17:25:10 +01:00
|
|
|
#include "resolve-util.h"
|
2015-08-27 13:59:06 +02:00
|
|
|
|
|
|
|
typedef struct Network Network;
|
|
|
|
|
|
|
|
#include "networkd-address.h"
|
|
|
|
#include "networkd-fdb.h"
|
2015-11-18 22:46:33 +01:00
|
|
|
#include "networkd-netdev.h"
|
|
|
|
#include "networkd-route.h"
|
2015-08-27 13:59:06 +02:00
|
|
|
#include "networkd-util.h"
|
2015-11-18 22:46:33 +01:00
|
|
|
#include "networkd.h"
|
2015-08-27 13:59:06 +02:00
|
|
|
|
|
|
|
#define DHCP_ROUTE_METRIC 1024
|
|
|
|
#define IPV4LL_ROUTE_METRIC 2048
|
|
|
|
|
|
|
|
typedef enum DCHPClientIdentifier {
|
|
|
|
DHCP_CLIENT_ID_MAC,
|
|
|
|
DHCP_CLIENT_ID_DUID,
|
|
|
|
_DHCP_CLIENT_ID_MAX,
|
|
|
|
_DHCP_CLIENT_ID_INVALID = -1,
|
|
|
|
} DCHPClientIdentifier;
|
|
|
|
|
|
|
|
typedef enum IPv6PrivacyExtensions {
|
|
|
|
/* The values map to the kernel's /proc/sys/net/ipv6/conf/xxx/use_tempaddr values */
|
|
|
|
IPV6_PRIVACY_EXTENSIONS_NO,
|
|
|
|
IPV6_PRIVACY_EXTENSIONS_PREFER_PUBLIC,
|
|
|
|
IPV6_PRIVACY_EXTENSIONS_YES, /* aka prefer-temporary */
|
|
|
|
_IPV6_PRIVACY_EXTENSIONS_MAX,
|
|
|
|
_IPV6_PRIVACY_EXTENSIONS_INVALID = -1,
|
|
|
|
} IPv6PrivacyExtensions;
|
|
|
|
|
|
|
|
struct Network {
|
|
|
|
Manager *manager;
|
|
|
|
|
|
|
|
char *filename;
|
|
|
|
char *name;
|
|
|
|
|
|
|
|
struct ether_addr *match_mac;
|
|
|
|
char **match_path;
|
|
|
|
char **match_driver;
|
|
|
|
char **match_type;
|
|
|
|
char **match_name;
|
|
|
|
|
|
|
|
Condition *match_host;
|
|
|
|
Condition *match_virt;
|
|
|
|
Condition *match_kernel;
|
|
|
|
Condition *match_arch;
|
|
|
|
|
|
|
|
char *description;
|
|
|
|
|
|
|
|
NetDev *bridge;
|
|
|
|
NetDev *bond;
|
|
|
|
Hashmap *stacked_netdevs;
|
|
|
|
|
|
|
|
/* DHCP Client Support */
|
|
|
|
AddressFamilyBoolean dhcp;
|
|
|
|
DCHPClientIdentifier dhcp_client_identifier;
|
|
|
|
char *dhcp_vendor_class_identifier;
|
2016-01-25 21:47:02 +01:00
|
|
|
char *dhcp_hostname;
|
|
|
|
bool dhcp_use_dns;
|
|
|
|
bool dhcp_use_ntp;
|
|
|
|
bool dhcp_use_mtu;
|
|
|
|
bool dhcp_use_hostname;
|
|
|
|
bool dhcp_use_domains;
|
|
|
|
bool dhcp_send_hostname;
|
2015-08-27 13:59:06 +02:00
|
|
|
bool dhcp_broadcast;
|
|
|
|
bool dhcp_critical;
|
2016-01-25 21:47:02 +01:00
|
|
|
bool dhcp_use_routes;
|
|
|
|
bool dhcp_use_timezone;
|
2015-08-27 13:59:06 +02:00
|
|
|
unsigned dhcp_route_metric;
|
|
|
|
|
|
|
|
/* DHCP Server Support */
|
|
|
|
bool dhcp_server;
|
2015-08-27 14:48:37 +02:00
|
|
|
bool dhcp_server_emit_dns;
|
|
|
|
struct in_addr *dhcp_server_dns;
|
|
|
|
unsigned n_dhcp_server_dns;
|
|
|
|
bool dhcp_server_emit_ntp;
|
|
|
|
struct in_addr *dhcp_server_ntp;
|
|
|
|
unsigned n_dhcp_server_ntp;
|
2015-08-27 13:59:06 +02:00
|
|
|
bool dhcp_server_emit_timezone;
|
2015-08-27 14:48:37 +02:00
|
|
|
char *dhcp_server_timezone;
|
2015-08-27 13:59:06 +02:00
|
|
|
usec_t dhcp_server_default_lease_time_usec, dhcp_server_max_lease_time_usec;
|
2015-08-29 00:18:20 +02:00
|
|
|
uint32_t dhcp_server_pool_offset;
|
|
|
|
uint32_t dhcp_server_pool_size;
|
2015-08-27 13:59:06 +02:00
|
|
|
|
|
|
|
/* IPV4LL Support */
|
|
|
|
AddressFamilyBoolean link_local;
|
|
|
|
bool ipv4ll_route;
|
|
|
|
|
|
|
|
/* Bridge Support */
|
|
|
|
bool use_bpdu;
|
|
|
|
bool hairpin;
|
|
|
|
bool fast_leave;
|
|
|
|
bool allow_port_to_be_root;
|
|
|
|
bool unicast_flood;
|
|
|
|
unsigned cost;
|
|
|
|
|
|
|
|
AddressFamilyBoolean ip_forward;
|
|
|
|
bool ip_masquerade;
|
|
|
|
|
2015-09-12 04:48:06 +02:00
|
|
|
int ipv6_accept_ra;
|
2015-10-12 11:01:10 +02:00
|
|
|
int ipv6_dad_transmits;
|
2015-11-10 04:56:38 +01:00
|
|
|
int ipv6_hop_limit;
|
2015-09-12 04:48:06 +02:00
|
|
|
|
2015-08-27 13:59:06 +02:00
|
|
|
union in_addr_union ipv6_token;
|
|
|
|
IPv6PrivacyExtensions ipv6_privacy_extensions;
|
|
|
|
|
|
|
|
struct ether_addr *mac;
|
|
|
|
unsigned mtu;
|
|
|
|
|
|
|
|
bool lldp;
|
|
|
|
|
|
|
|
LIST_HEAD(Address, static_addresses);
|
|
|
|
LIST_HEAD(Route, static_routes);
|
|
|
|
LIST_HEAD(FdbEntry, static_fdb_entries);
|
|
|
|
|
|
|
|
Hashmap *addresses_by_section;
|
|
|
|
Hashmap *routes_by_section;
|
|
|
|
Hashmap *fdb_entries_by_section;
|
|
|
|
|
networkd: rework Domains= setting
Previously, .network files only knew a vaguely defined "Domains=" concept, for which the documentation declared it was
the "DNS domain" for the network connection, without specifying what that means.
With this the Domains setting is reworked, so that there are now "routing" domains and "search" domains. The former are
to be used by resolved to route DNS request to specific network interfaces, the latter is to be used for searching
single-label hostnames with (in addition to being used for routing). Both settings are configured in the "Domains="
setting. Normal domain names listed in it are now considered search domains (for compatibility with existing setups),
while those prefixed with "~" are considered routing domains only. To route all lookups to a specific interface the
routing domain "." may be used, referring to the root domain. An alternative syntax for this is the "*", as was already
implemented before using the "wildcard" domain concept.
This commit adds proper parsers for this new logic, and exposes this via the sd-network API. This information is not
used by resolved yet, this will be added in a later commit.
2016-01-25 19:46:00 +01:00
|
|
|
char **search_domains, **route_domains, **dns, **ntp, **bind_carrier;
|
2015-08-27 13:59:06 +02:00
|
|
|
|
|
|
|
ResolveSupport llmnr;
|
2016-01-05 17:32:25 +01:00
|
|
|
ResolveSupport mdns;
|
2016-01-05 19:57:33 +01:00
|
|
|
DnssecMode dnssec_mode;
|
2016-01-06 18:36:32 +01:00
|
|
|
Set *dnssec_negative_trust_anchors;
|
2015-08-27 13:59:06 +02:00
|
|
|
|
|
|
|
LIST_FIELDS(Network, networks);
|
|
|
|
};
|
|
|
|
|
|
|
|
void network_free(Network *network);
|
|
|
|
|
|
|
|
DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
|
|
|
|
#define _cleanup_network_free_ _cleanup_(network_freep)
|
|
|
|
|
|
|
|
int network_load(Manager *manager);
|
|
|
|
|
|
|
|
int network_get_by_name(Manager *manager, const char *name, Network **ret);
|
|
|
|
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_domains(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_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);
|
|
|
|
int config_parse_dhcp_client_identifier(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_ipv6token(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_ipv6_privacy_extensions(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_hostname(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_timezone(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);
|
2015-08-27 14:48:37 +02:00
|
|
|
int config_parse_dhcp_server_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_dhcp_server_ntp(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);
|
2016-01-06 18:36:32 +01:00
|
|
|
int config_parse_dnssec_negative_trust_anchors(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);
|
2015-08-27 13:59:06 +02:00
|
|
|
|
|
|
|
/* Legacy IPv4LL support */
|
|
|
|
int config_parse_ipv4ll(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);
|
|
|
|
|
|
|
|
const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
|
|
|
|
|
|
|
|
extern const sd_bus_vtable network_vtable[];
|
|
|
|
|
|
|
|
int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
|
|
|
|
int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
|
|
|
|
|
|
|
|
const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;
|
|
|
|
IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
|