networkd-link.h revision 21b80ad126c1aa43bd6d0e5a7ed3cc7c0f10efb0
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering/***
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering This file is part of systemd.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Copyright 2013 Tom Gundersen <teg@jklm.no>
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering systemd is free software; you can redistribute it and/or modify it
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering under the terms of the GNU Lesser General Public License as published by
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering (at your option) any later version.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering systemd is distributed in the hope that it will be useful, but
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Lesser General Public License for more details.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering You should have received a copy of the GNU Lesser General Public License
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering***/
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#pragma once
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#include <endian.h>
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#include "networkd.h"
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringtypedef enum LinkState {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_PENDING,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_ENSLAVING,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_SETTING_ADDRESSES,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_SETTING_ROUTES,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_CONFIGURED,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_UNMANAGED,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_FAILED,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LINK_STATE_LINGER,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering _LINK_STATE_MAX,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering _LINK_STATE_INVALID = -1
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering} LinkState;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringstruct Link {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Manager *manager;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering int n_ref;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering int ifindex;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering char *ifname;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering char *state_file;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering struct ether_addr mac;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering uint32_t mtu;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering struct udev_device *udev_device;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering unsigned flags;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering uint8_t kernel_operstate;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Network *network;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LinkState state;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LinkOperationalState operstate;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering unsigned link_messages;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering unsigned enslaving;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LIST_HEAD(Address, addresses);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_dhcp_client *dhcp_client;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_dhcp_lease *dhcp_lease;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering char *lease_file;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering uint16_t original_mtu;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering unsigned dhcp4_messages;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering bool dhcp4_configured;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_ipv4ll *ipv4ll;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering bool ipv4ll_address;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering bool ipv4ll_route;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering bool static_configured;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LIST_HEAD(Address, pool_addresses);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_dhcp_server *dhcp_server;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_icmp6_nd *icmp6_router_discovery;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_dhcp6_client *dhcp6_client;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering bool rtnl_extended_attrs;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_lldp *lldp;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering char *lldp_file;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Hashmap *bound_by_links;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Hashmap *bound_to_links;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering};
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart PoetteringLink *link_unref(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart PoetteringLink *link_ref(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_get(Manager *m, int ifindex, Link **ret);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_add(Manager *manager, sd_netlink_message *message, Link **ret);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringvoid link_drop(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_address_drop_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_route_drop_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringvoid link_enter_failed(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_initialized(Link *link, struct udev_device *device);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringvoid link_client_handler(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_update(Link *link, sd_netlink_message *message);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_save(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_carrier_reset(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_has_carrier(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_set_mtu(Link *link, uint32_t mtu);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_set_hostname(Link *link, const char *hostname);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_set_timezone(Link *link, const char *timezone);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint ipv4ll_configure(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp4_configure(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint icmp6_configure(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_lldp_enabled(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_ipv4ll_enabled(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_ipv6ll_enabled(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_dhcp4_server_enabled(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_dhcp4_enabled(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringbool link_dhcp6_enabled(Link *link);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringconst char* link_state_to_string(LinkState s) _const_;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart PoetteringLinkState link_state_from_string(const char *s) _pure_;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringextern const sd_bus_vtable link_vtable[];
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint link_send_changed(Link *link, const char *property, ...) _sentinel_;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart PoetteringDEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define _cleanup_link_unref_ _cleanup_(link_unrefp)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering/* Macros which append INTERFACE= to the message */
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_full(link, level, error, ...) \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering ({ \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Link *_l = (link); \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering _l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, ##__VA_ARGS__) : \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering }) \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_debug(link, ...) log_link_full(link, LOG_DEBUG, 0, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_info(link, ...) log_link_full(link, LOG_INFO, 0, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_notice(link, ...) log_link_full(link, LOG_NOTICE, 0, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_warning(link, ...) log_link_full(link, LOG_WARNING, 0, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_error(link, ...) log_link_full(link, LOG_ERR, 0, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_debug_errno(link, error, ...) log_link_full(link, LOG_DEBUG, error, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_info_errno(link, error, ...) log_link_full(link, LOG_INFO, error, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_notice_errno(link, error, ...) log_link_full(link, LOG_NOTICE, error, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_warning_errno(link, error, ...) log_link_full(link, LOG_WARNING, error, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define log_link_error_errno(link, error, ...) log_link_full(link, LOG_ERR, error, ##__VA_ARGS__)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define LOG_LINK_MESSAGE(link, fmt, ...) "MESSAGE=%s: " fmt, (link)->ifname, ##__VA_ARGS__
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define LOG_LINK_INTERFACE(link) "INTERFACE=%s", (link)->ifname
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#define ADDRESS_FMT_VAL(address) \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering be32toh((address).s_addr) >> 24, \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering (be32toh((address).s_addr) >> 16) & 0xFFu, \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering (be32toh((address).s_addr) >> 8) & 0xFFu, \
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering be32toh((address).s_addr) & 0xFFu
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering