networkd.h revision 5a8bcb674f71a20e95df55319b34c556638378ce
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering/***
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering This file is part of systemd.
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Copyright 2013 Tom Gundersen <teg@jklm.no>
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering systemd is free software; you can redistribute it and/or modify it
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering under the terms of the GNU Lesser General Public License as published by
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering (at your option) any later version.
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering systemd is distributed in the hope that it will be useful, but
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Lesser General Public License for more details.
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering You should have received a copy of the GNU Lesser General Public License
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering***/
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#pragma once
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering#include <arpa/inet.h>
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "sd-event.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "sd-rtnl.h"
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering#include "sd-bus.h"
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering#include "sd-dhcp-client.h"
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering#include "sd-dhcp-server.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "sd-ipv4ll.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "sd-icmp6-nd.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "sd-dhcp6-client.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "udev.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "sd-lldp.h"
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering#include "rtnl-util.h"
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering#include "hashmap.h"
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering#include "list.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "set.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "condition.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#include "in-addr-util.h"
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering#define DHCP_ROUTE_METRIC 1024
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering#define IPV4LL_ROUTE_METRIC 2048
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef struct NetDev NetDev;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef struct Network Network;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef struct Link Link;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef struct Address Address;
cb81cd8073392936882643af0129934bf67e96c4Lennart Poetteringtypedef struct Route Route;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef struct Manager Manager;
cb81cd8073392936882643af0129934bf67e96c4Lennart Poetteringtypedef struct AddressPool AddressPool;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef struct FdbEntry FdbEntry;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringtypedef enum DHCPSupport {
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering DHCP_SUPPORT_NONE,
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering DHCP_SUPPORT_BOTH,
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering DHCP_SUPPORT_V4,
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering DHCP_SUPPORT_V6,
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering _DHCP_SUPPORT_MAX,
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering _DHCP_SUPPORT_INVALID = -1,
c75f27ea2b483f91d437ebaf8494457dc76f3fd6Lennart Poettering} DHCPSupport;
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poetteringtypedef enum LLMNRSupport {
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering LLMNR_SUPPORT_NO,
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering LLMNR_SUPPORT_YES,
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering LLMNR_SUPPORT_RESOLVE,
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering _LLMNR_SUPPORT_MAX,
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering _LLMNR_SUPPORT_INVALID = -1,
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering} LLMNRSupport;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poetteringstruct FdbEntry {
e9bc1871b974fa9e33d9c1a45e249e6d1c8bc562Lennart Poettering Network *network;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering unsigned section;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering struct ether_addr *mac_addr;
e9bc1871b974fa9e33d9c1a45e249e6d1c8bc562Lennart Poettering uint16_t vlan_id;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering LIST_FIELDS(FdbEntry, static_fdb_entries);
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering};
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poetteringstruct Network {
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Manager *manager;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering char *filename;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering struct ether_addr *match_mac;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering char *match_path;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering char *match_driver;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering char *match_type;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering char *match_name;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering char *dhcp_vendor_class_identifier;
e9bc1871b974fa9e33d9c1a45e249e6d1c8bc562Lennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Condition *match_host;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Condition *match_virt;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Condition *match_kernel;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering Condition *match_arch;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering char *description;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering NetDev *bridge;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering NetDev *bond;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering Hashmap *stacked_netdevs;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering DHCPSupport dhcp;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_dns;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_ntp;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_mtu;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_hostname;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_domains;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_sendhost;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_broadcast;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_critical;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_routes;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering unsigned dhcp_route_metric;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool ipv4ll;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool ipv4ll_route;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool dhcp_server;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering unsigned cost;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool ip_masquerade;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool ip_forward;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering struct ether_addr *mac;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering unsigned mtu;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering bool lldp;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering LIST_HEAD(Address, static_addresses);
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering LIST_HEAD(Route, static_routes);
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering LIST_HEAD(FdbEntry, static_fdb_entries);
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering Hashmap *addresses_by_section;
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering Hashmap *routes_by_section;
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering Hashmap *fdb_entries_by_section;
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering bool wildcard_domain;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering char **domains, **dns, **ntp;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering LLMNRSupport llmnr;
d9e2daaf3d8649650cf9784b4fe9d9de4507da0cLennart Poettering
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering LIST_FIELDS(Network, networks);
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering};
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poettering
f70a17f8d47ec8a62fa3b9b0bbe40fa107088540Lennart Poetteringstruct Address {
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering Network *network;
d7c7c334f56edab8cfc102b657366277a65738cfLennart Poettering unsigned section;
int family;
unsigned char prefixlen;
unsigned char scope;
unsigned char flags;
char *label;
struct in_addr broadcast;
struct ifa_cacheinfo cinfo;
union in_addr_union in_addr;
union in_addr_union in_addr_peer;
bool ip_forward_done;
LIST_FIELDS(Address, addresses);
};
struct Route {
Network *network;
unsigned section;
int family;
unsigned char dst_prefixlen;
unsigned char src_prefixlen;
unsigned char scope;
uint32_t metrics;
unsigned char protocol; /* RTPROT_* */
union in_addr_union in_addr;
union in_addr_union dst_addr;
union in_addr_union src_addr;
union in_addr_union prefsrc_addr;
LIST_FIELDS(Route, routes);
};
struct AddressPool {
Manager *manager;
int 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;
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_enumerate_addresses(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, int 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_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_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);
int config_parse_vxlan_group_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, unsigned char rtm_protocol);
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);
int address_establish(Address *address, Link *link);
int address_release(Address *address, Link *link);
bool address_equal(Address *a1, Address *a2);
DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
#define _cleanup_address_free_ _cleanup_(address_freep)
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);
/* Forwarding database table. */
int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
void fdb_entry_free(FdbEntry *fdb_entry);
int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
#define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
int config_parse_fdb_hwaddr(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_fdb_vlan_id(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);
/* 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);
/* LLMNR support */
const char* llmnr_support_to_string(LLMNRSupport i) _const_;
LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
int config_parse_llmnr(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, int family, const union in_addr_union *u, unsigned prefixlen);
int address_pool_new_from_string(Manager *m, AddressPool **ret, int 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);