X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd.h;h=87eadd1c51a6647ec55b3d4574074fbff67d4b8e;hp=57eecf4db3316cfb05d9f3cf712af20fec760d35;hb=dd43110f781a9245ec00531456fee68ed763a179;hpb=68a8723c8592c06b2c978f391cb47db266d9d6de diff --git a/src/network/networkd.h b/src/network/networkd.h index 57eecf4db..87eadd1c5 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -27,6 +27,7 @@ #include "sd-rtnl.h" #include "sd-bus.h" #include "sd-dhcp-client.h" +#include "sd-dhcp-server.h" #include "sd-ipv4ll.h" #include "udev.h" @@ -68,6 +69,11 @@ typedef enum NetDevKind { NETDEV_KIND_BOND, NETDEV_KIND_VLAN, NETDEV_KIND_MACVLAN, + NETDEV_KIND_IPIP, + NETDEV_KIND_GRE, + NETDEV_KIND_SIT, + NETDEV_KIND_VETH, + NETDEV_KIND_VTI, _NETDEV_KIND_MAX, _NETDEV_KIND_INVALID = -1 } NetDevKind; @@ -76,6 +82,7 @@ typedef enum NetDevState { NETDEV_STATE_FAILED, NETDEV_STATE_CREATING, NETDEV_STATE_READY, + NETDEV_STATE_LINGER, _NETDEV_STATE_MAX, _NETDEV_STATE_INVALID = -1, } NetDevState; @@ -83,6 +90,8 @@ typedef enum NetDevState { struct NetDev { Manager *manager; + int n_ref; + char *filename; Condition *match_host; @@ -91,7 +100,9 @@ struct NetDev { Condition *match_arch; char *description; - char *name; + char *ifname; + char *ifname_peer; + size_t mtu; NetDevKind kind; uint64_t vlanid; @@ -100,6 +111,12 @@ struct NetDev { int ifindex; NetDevState state; + bool tunnel_pmtudisc; + unsigned tunnel_ttl; + unsigned tunnel_tos; + struct in_addr tunnel_local; + struct in_addr tunnel_remote; + LIST_HEAD(netdev_enslave_callback, callbacks); }; @@ -121,23 +138,28 @@ struct Network { char *description; NetDev *bridge; NetDev *bond; + NetDev *tunnel; Hashmap *vlans; Hashmap *macvlans; bool dhcp; bool dhcp_dns; + bool dhcp_ntp; bool dhcp_mtu; bool dhcp_hostname; bool dhcp_domainname; bool dhcp_critical; bool ipv4ll; + bool dhcp_server; + LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes); Hashmap *addresses_by_section; Hashmap *routes_by_section; - Set *dns; + LIST_HEAD(Address, dns); + LIST_HEAD(Address, ntp); LIST_FIELDS(Network, networks); }; @@ -159,7 +181,7 @@ struct Address { struct in6_addr in6; } in_addr; - LIST_FIELDS(Address, static_addresses); + LIST_FIELDS(Address, addresses); }; struct Route { @@ -181,7 +203,7 @@ struct Route { struct in6_addr in6; } dst_addr; - LIST_FIELDS(Route, static_routes); + LIST_FIELDS(Route, routes); }; typedef enum LinkState { @@ -192,13 +214,26 @@ typedef enum LinkState { LINK_STATE_CONFIGURED, LINK_STATE_UNMANAGED, LINK_STATE_FAILED, + LINK_STATE_LINGER, _LINK_STATE_MAX, _LINK_STATE_INVALID = -1 } LinkState; +typedef enum LinkOperationalState { + LINK_OPERSTATE_UNKNOWN, + LINK_OPERSTATE_DORMANT, + LINK_OPERSTATE_CARRIER, + LINK_OPERSTATE_DEGRADED, + LINK_OPERSTATE_ROUTABLE, + _LINK_OPERSTATE_MAX, + _LINK_OPERSTATE_INVALID = -1 +} LinkOperationalState; + struct Link { Manager *manager; + int n_ref; + uint64_t ifindex; char *ifname; char *state_file; @@ -206,21 +241,26 @@ struct Link { struct udev_device *udev_device; unsigned flags; - uint8_t operstate; + uint8_t kernel_operstate; Network *network; LinkState state; + LinkOperationalState operstate; unsigned addr_messages; unsigned route_messages; unsigned enslaving; + LIST_HEAD(Address, addresses); + sd_dhcp_client *dhcp_client; sd_dhcp_lease *dhcp_lease; char *lease_file; uint16_t original_mtu; sd_ipv4ll *ipv4ll; + + sd_dhcp_server *dhcp_server; }; struct Manager { @@ -258,7 +298,6 @@ int manager_rtnl_listen(Manager *m); int manager_udev_listen(Manager *m); int manager_bus_listen(Manager *m); -int manager_update_resolv_conf(Manager *m); int manager_save(Manager *m); DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); @@ -267,15 +306,19 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); /* NetDev */ int netdev_load(Manager *manager); +void netdev_drop(NetDev *netdev); -void netdev_free(NetDev *netdev); +NetDev *netdev_unref(NetDev *netdev); +NetDev *netdev_ref(NetDev *netdev); -DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_free); -#define _cleanup_netdev_free_ _cleanup_(netdev_freep) +DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref); +#define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp) int netdev_get(Manager *manager, const char *name, NetDev **ret); int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink); int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb); +int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback); +int netdev_create_veth(NetDev *netdev, sd_rtnl_message_handler_t callback); const char *netdev_kind_to_string(NetDevKind d) _const_; NetDevKind netdev_kind_from_string(const char *d) _pure_; @@ -304,21 +347,31 @@ int network_get(Manager *manager, struct udev_device *device, Network **ret); int network_apply(Manager *manager, Network *network, Link *link); -int config_parse_bridge(const char *unit, const char *filename, unsigned line, +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_bond(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_vlan(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_macvlan(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); @@ -349,6 +402,7 @@ 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) @@ -371,11 +425,14 @@ int config_parse_label(const char *unit, const char *filename, unsigned line, /* Link */ -void link_free(Link *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); @@ -386,12 +443,15 @@ 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_; -DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); -#define _cleanup_link_free_ _cleanup_(link_freep) +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) /* 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, link->ifname, ##__VA_ARGS__) +#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__) @@ -402,16 +462,16 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); /* More macros which append INTERFACE= to the message */ -#define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->name, "%s: " fmt, netdev->name, ##__VA_ARGS__) +#define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__) #define log_debug_netdev(netdev, ...) log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__) #define log_info_netdev(netdev, ...) log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__) #define log_notice_netdev(netdev, ...) log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__) #define log_warning_netdev(netdev, ...) log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__) #define log_error_netdev(netdev, ...) log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__) -#define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->name, __VA_ARGS__) +#define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__) -#define NETDEV(netdev) "INTERFACE=%s", netdev->name +#define NETDEV(netdev) "INTERFACE=%s", netdev->ifname #define ADDRESS_FMT_VAL(address) \ (address).s_addr & 0xFF, \ ((address).s_addr >> 8) & 0xFF, \