LCOV - code coverage report
Current view: top level - network - networkd.h (source / functions) Hit Total Coverage
Test: systemd test coverage Lines: 3 5 60.0 %
Date: 2015-07-29 18:47:03 Functions: 3 5 60.0 %

          Line data    Source code
       1             : /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
       2             : 
       3             : /***
       4             :   This file is part of systemd.
       5             : 
       6             :   Copyright 2013 Tom Gundersen <teg@jklm.no>
       7             : 
       8             :   systemd is free software; you can redistribute it and/or modify it
       9             :   under the terms of the GNU Lesser General Public License as published by
      10             :   the Free Software Foundation; either version 2.1 of the License, or
      11             :   (at your option) any later version.
      12             : 
      13             :   systemd is distributed in the hope that it will be useful, but
      14             :   WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
      16             :   Lesser General Public License for more details.
      17             : 
      18             :   You should have received a copy of the GNU Lesser General Public License
      19             :   along with systemd; If not, see <http://www.gnu.org/licenses/>.
      20             : ***/
      21             : 
      22             : #pragma once
      23             : 
      24             : #include <arpa/inet.h>
      25             : 
      26             : #include "sd-event.h"
      27             : #include "sd-netlink.h"
      28             : #include "sd-bus.h"
      29             : #include "sd-dhcp-client.h"
      30             : #include "sd-dhcp-server.h"
      31             : #include "sd-ipv4ll.h"
      32             : #include "sd-icmp6-nd.h"
      33             : #include "sd-dhcp6-client.h"
      34             : #include "udev.h"
      35             : #include "sd-lldp.h"
      36             : 
      37             : #include "netlink-util.h"
      38             : #include "hashmap.h"
      39             : #include "list.h"
      40             : #include "set.h"
      41             : #include "condition.h"
      42             : #include "in-addr-util.h"
      43             : 
      44             : #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
      45             : #define DHCP_ROUTE_METRIC 1024
      46             : #define IPV4LL_ROUTE_METRIC 2048
      47             : 
      48             : typedef struct NetDev NetDev;
      49             : typedef struct Network Network;
      50             : typedef struct Link Link;
      51             : typedef struct Address Address;
      52             : typedef struct Route Route;
      53             : typedef struct Manager Manager;
      54             : typedef struct AddressPool AddressPool;
      55             : typedef struct FdbEntry FdbEntry;
      56             : 
      57             : typedef enum AddressFamilyBoolean {
      58             :         /* This is a bitmask, though it usually doesn't feel that way! */
      59             :         ADDRESS_FAMILY_NO = 0,
      60             :         ADDRESS_FAMILY_IPV4 = 1,
      61             :         ADDRESS_FAMILY_IPV6 = 2,
      62             :         ADDRESS_FAMILY_YES = 3,
      63             :         _ADDRESS_FAMILY_BOOLEAN_MAX,
      64             :         _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
      65             : } AddressFamilyBoolean;
      66             : 
      67             : typedef enum LLMNRSupport {
      68             :         LLMNR_SUPPORT_NO,
      69             :         LLMNR_SUPPORT_YES,
      70             :         LLMNR_SUPPORT_RESOLVE,
      71             :         _LLMNR_SUPPORT_MAX,
      72             :         _LLMNR_SUPPORT_INVALID = -1,
      73             : } LLMNRSupport;
      74             : 
      75             : typedef enum LinkOperationalState {
      76             :         LINK_OPERSTATE_OFF,
      77             :         LINK_OPERSTATE_NO_CARRIER,
      78             :         LINK_OPERSTATE_DORMANT,
      79             :         LINK_OPERSTATE_CARRIER,
      80             :         LINK_OPERSTATE_DEGRADED,
      81             :         LINK_OPERSTATE_ROUTABLE,
      82             :         _LINK_OPERSTATE_MAX,
      83             :         _LINK_OPERSTATE_INVALID = -1
      84             : } LinkOperationalState;
      85             : 
      86             : typedef enum DCHPClientIdentifier {
      87             :         DHCP_CLIENT_ID_MAC,
      88             :         DHCP_CLIENT_ID_DUID,
      89             :         _DHCP_CLIENT_ID_MAX,
      90             :         _DHCP_CLIENT_ID_INVALID = -1,
      91             : } DCHPClientIdentifier;
      92             : 
      93             : typedef enum IPv6PrivacyExtensions {
      94             :         /* The values map to the kernel's /proc/sys/net/ipv6/conf/xxx/use_tempaddr values */
      95             :         IPV6_PRIVACY_EXTENSIONS_NO,
      96             :         IPV6_PRIVACY_EXTENSIONS_PREFER_PUBLIC,
      97             :         IPV6_PRIVACY_EXTENSIONS_YES, /* aka prefer-temporary */
      98             :         _IPV6_PRIVACY_EXTENSIONS_MAX,
      99             :         _IPV6_PRIVACY_EXTENSIONS_INVALID = -1,
     100             : } IPv6PrivacyExtensions;
     101             : 
     102             : struct FdbEntry {
     103             :         Network *network;
     104             :         unsigned section;
     105             : 
     106             :         struct ether_addr *mac_addr;
     107             :         uint16_t vlan_id;
     108             : 
     109             :         LIST_FIELDS(FdbEntry, static_fdb_entries);
     110             : };
     111             : 
     112             : struct Network {
     113             :         Manager *manager;
     114             : 
     115             :         char *filename;
     116             :         char *name;
     117             : 
     118             :         struct ether_addr *match_mac;
     119             :         char **match_path;
     120             :         char **match_driver;
     121             :         char **match_type;
     122             :         char **match_name;
     123             : 
     124             :         Condition *match_host;
     125             :         Condition *match_virt;
     126             :         Condition *match_kernel;
     127             :         Condition *match_arch;
     128             : 
     129             :         char *description;
     130             :         NetDev *bridge;
     131             :         NetDev *bond;
     132             :         Hashmap *stacked_netdevs;
     133             :         AddressFamilyBoolean dhcp;
     134             :         DCHPClientIdentifier dhcp_client_identifier;
     135             :         char *dhcp_vendor_class_identifier;
     136             :         char *hostname;
     137             :         bool dhcp_dns;
     138             :         bool dhcp_ntp;
     139             :         bool dhcp_mtu;
     140             :         bool dhcp_hostname;
     141             :         bool dhcp_domains;
     142             :         bool dhcp_sendhost;
     143             :         bool dhcp_broadcast;
     144             :         bool dhcp_critical;
     145             :         bool dhcp_routes;
     146             :         unsigned dhcp_route_metric;
     147             :         AddressFamilyBoolean link_local;
     148             :         bool ipv4ll_route;
     149             :         union in_addr_union ipv6_token;
     150             : 
     151             :         bool dhcp_server;
     152             : 
     153             :         bool use_bpdu;
     154             :         bool hairpin;
     155             :         bool fast_leave;
     156             :         bool allow_port_to_be_root;
     157             :         bool unicast_flood;
     158             :         unsigned cost;
     159             : 
     160             :         AddressFamilyBoolean ip_forward;
     161             :         bool ip_masquerade;
     162             : 
     163             :         IPv6PrivacyExtensions ipv6_privacy_extensions;
     164             : 
     165             :         struct ether_addr *mac;
     166             :         unsigned mtu;
     167             : 
     168             :         bool lldp;
     169             : 
     170             :         LIST_HEAD(Address, static_addresses);
     171             :         LIST_HEAD(Route, static_routes);
     172             :         LIST_HEAD(FdbEntry, static_fdb_entries);
     173             : 
     174             :         Hashmap *addresses_by_section;
     175             :         Hashmap *routes_by_section;
     176             :         Hashmap *fdb_entries_by_section;
     177             : 
     178             :         bool wildcard_domain;
     179             :         char **domains, **dns, **ntp, **bind_carrier;
     180             : 
     181             :         LLMNRSupport llmnr;
     182             : 
     183             :         LIST_FIELDS(Network, networks);
     184             : };
     185             : 
     186             : struct Address {
     187             :         Network *network;
     188             :         unsigned section;
     189             : 
     190             :         int family;
     191             :         unsigned char prefixlen;
     192             :         unsigned char scope;
     193             :         uint32_t flags;
     194             :         char *label;
     195             : 
     196             :         struct in_addr broadcast;
     197             :         struct ifa_cacheinfo cinfo;
     198             : 
     199             :         union in_addr_union in_addr;
     200             :         union in_addr_union in_addr_peer;
     201             : 
     202             :         bool ip_masquerade_done;
     203             : 
     204             :         LIST_FIELDS(Address, addresses);
     205             : };
     206             : 
     207             : struct Route {
     208             :         Network *network;
     209             :         unsigned section;
     210             : 
     211             :         int family;
     212             :         unsigned char dst_prefixlen;
     213             :         unsigned char src_prefixlen;
     214             :         unsigned char scope;
     215             :         uint32_t metrics;
     216             :         unsigned char protocol;  /* RTPROT_* */
     217             : 
     218             :         union in_addr_union in_addr;
     219             :         union in_addr_union dst_addr;
     220             :         union in_addr_union src_addr;
     221             :         union in_addr_union prefsrc_addr;
     222             : 
     223             :         LIST_FIELDS(Route, routes);
     224             : };
     225             : 
     226             : struct AddressPool {
     227             :         Manager *manager;
     228             : 
     229             :         int family;
     230             :         unsigned prefixlen;
     231             : 
     232             :         union in_addr_union in_addr;
     233             : 
     234             :         LIST_FIELDS(AddressPool, address_pools);
     235             : };
     236             : 
     237             : struct Manager {
     238             :         sd_netlink *rtnl;
     239             :         sd_event *event;
     240             :         sd_event_source *bus_retry_event_source;
     241             :         sd_bus *bus;
     242             :         sd_bus_slot *prepare_for_sleep_slot;
     243             :         struct udev *udev;
     244             :         struct udev_monitor *udev_monitor;
     245             :         sd_event_source *udev_event_source;
     246             : 
     247             :         bool enumerating;
     248             : 
     249             :         char *state_file;
     250             :         LinkOperationalState operational_state;
     251             : 
     252             :         Hashmap *links;
     253             :         Hashmap *netdevs;
     254             :         Hashmap *networks_by_name;
     255             :         LIST_HEAD(Network, networks);
     256             :         LIST_HEAD(AddressPool, address_pools);
     257             : 
     258             :         usec_t network_dirs_ts_usec;
     259             : };
     260             : 
     261             : extern const char* const network_dirs[];
     262             : 
     263             : /* Manager */
     264             : 
     265             : extern const sd_bus_vtable manager_vtable[];
     266             : 
     267             : int manager_new(Manager **ret);
     268             : void manager_free(Manager *m);
     269             : 
     270             : int manager_connect_bus(Manager *m);
     271             : int manager_run(Manager *m);
     272             : 
     273             : int manager_load_config(Manager *m);
     274             : bool manager_should_reload(Manager *m);
     275             : 
     276             : int manager_rtnl_enumerate_links(Manager *m);
     277             : int manager_rtnl_enumerate_addresses(Manager *m);
     278             : 
     279             : int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
     280             : int manager_save(Manager *m);
     281             : 
     282             : int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
     283             : 
     284           2 : DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
     285             : #define _cleanup_manager_free_ _cleanup_(manager_freep)
     286             : 
     287             : /* Network */
     288             : 
     289             : int network_load(Manager *manager);
     290             : 
     291             : void network_free(Network *network);
     292             : 
     293           3 : DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
     294             : #define _cleanup_network_free_ _cleanup_(network_freep)
     295             : 
     296             : int network_get_by_name(Manager *manager, const char *name, Network **ret);
     297             : int network_get(Manager *manager, struct udev_device *device,
     298             :                 const char *ifname, const struct ether_addr *mac,
     299             :                 Network **ret);
     300             : int network_apply(Manager *manager, Network *network, Link *link);
     301             : 
     302             : int config_parse_netdev(const char *unit, const char *filename, unsigned line,
     303             :                         const char *section, unsigned section_line, const char *lvalue,
     304             :                         int ltype, const char *rvalue, void *data, void *userdata);
     305             : 
     306             : int config_parse_domains(const char *unit,
     307             :                          const char *filename,
     308             :                          unsigned line,
     309             :                          const char *section,
     310             :                          unsigned section_line,
     311             :                          const char *lvalue,
     312             :                          int ltype,
     313             :                          const char *rvalue,
     314             :                          void *data,
     315             :                          void *userdata);
     316             : 
     317             : int config_parse_tunnel(const char *unit,
     318             :                         const char *filename,
     319             :                         unsigned line,
     320             :                         const char *section,
     321             :                         unsigned section_line,
     322             :                         const char *lvalue,
     323             :                         int ltype,
     324             :                         const char *rvalue,
     325             :                         void *data,
     326             :                         void *userdata);
     327             : 
     328             : extern const sd_bus_vtable network_vtable[];
     329             : 
     330             : int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
     331             : int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
     332             : 
     333             : /* gperf */
     334             : const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
     335             : 
     336             : /* Route */
     337             : int route_new_static(Network *network, unsigned section, Route **ret);
     338             : int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
     339             : void route_free(Route *route);
     340             : int route_configure(Route *route, Link *link, sd_netlink_message_handler_t callback);
     341             : int route_drop(Route *route, Link *link, sd_netlink_message_handler_t callback);
     342             : 
     343             : 
     344           0 : DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
     345             : #define _cleanup_route_free_ _cleanup_(route_freep)
     346             : 
     347             : int config_parse_gateway(const char *unit, const char *filename, unsigned line,
     348             :                          const char *section, unsigned section_line, const char *lvalue,
     349             :                          int ltype, const char *rvalue, void *data, void *userdata);
     350             : 
     351             : int config_parse_destination(const char *unit, const char *filename, unsigned line,
     352             :                              const char *section, unsigned section_line, const char *lvalue,
     353             :                              int ltype, const char *rvalue, void *data, void *userdata);
     354             : 
     355             : int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
     356             :                                 const char *section, unsigned section_line, const char *lvalue,
     357             :                                 int ltype, const char *rvalue, void *data, void *userdata);
     358             : 
     359             : int config_parse_route_scope(const char *unit, const char *filename, unsigned line,
     360             :                              const char *section, unsigned section_line, const char *lvalue,
     361             :                              int ltype, const char *rvalue, void *data, void *userdata);
     362             : /* Address */
     363             : int address_new_static(Network *network, unsigned section, Address **ret);
     364             : int address_new_dynamic(Address **ret);
     365             : void address_free(Address *address);
     366             : int address_configure(Address *address, Link *link, sd_netlink_message_handler_t callback);
     367             : int address_update(Address *address, Link *link, sd_netlink_message_handler_t callback);
     368             : int address_drop(Address *address, Link *link, sd_netlink_message_handler_t callback);
     369             : int address_establish(Address *address, Link *link);
     370             : int address_release(Address *address, Link *link);
     371             : bool address_equal(Address *a1, Address *a2);
     372             : 
     373           6 : DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
     374             : #define _cleanup_address_free_ _cleanup_(address_freep)
     375             : 
     376             : int config_parse_address(const char *unit, const char *filename, unsigned line,
     377             :                          const char *section, unsigned section_line, const char *lvalue,
     378             :                          int ltype, const char *rvalue, void *data, void *userdata);
     379             : 
     380             : int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
     381             :                            const char *section, unsigned section_line, const char *lvalue,
     382             :                            int ltype, const char *rvalue, void *data, void *userdata);
     383             : 
     384             : int config_parse_label(const char *unit, const char *filename, unsigned line,
     385             :                        const char *section, unsigned section_line, const char *lvalue,
     386             :                        int ltype, const char *rvalue, void *data, void *userdata);
     387             : 
     388             : /* Forwarding database table. */
     389             : int fdb_entry_configure(Link *const link, FdbEntry *const fdb_entry);
     390             : void fdb_entry_free(FdbEntry *fdb_entry);
     391             : int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
     392             : 
     393           0 : DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
     394             : #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
     395             : 
     396             : int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
     397             :                             const char *section, unsigned section_line, const char *lvalue,
     398             :                             int ltype, const char *rvalue, void *data, void *userdata);
     399             : 
     400             : int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
     401             :                              const char *section, unsigned section_line, const char *lvalue,
     402             :                              int ltype, const char *rvalue, void *data, void *userdata);
     403             : 
     404             : /* DHCP support */
     405             : 
     406             : int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
     407             :                       const char *section, unsigned section_line, const char *lvalue,
     408             :                       int ltype, const char *rvalue, void *data, void *userdata);
     409             : int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line,
     410             :                                         const char *section, unsigned section_line, const char *lvalue,
     411             :                                         int ltype, const char *rvalue, void *data, void *userdata);
     412             : 
     413             : /* IPv4LL support (legacy) */
     414             : 
     415             : int config_parse_ipv4ll(const char *unit, const char *filename, unsigned line,
     416             :                         const char *section, unsigned section_line, const char *lvalue,
     417             :                         int ltype, const char *rvalue, void *data, void *userdata);
     418             : 
     419             : /* IPv6 support */
     420             : int config_parse_ipv6token(const char *unit, const char *filename, unsigned line,
     421             :                            const char *section, unsigned section_line, const char *lvalue,
     422             :                            int ltype, const char *rvalue, void *data, void *userdata);
     423             : 
     424             : /* LLMNR support */
     425             : 
     426             : const char* llmnr_support_to_string(LLMNRSupport i) _const_;
     427             : LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
     428             : 
     429             : int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
     430             :                       const char *section, unsigned section_line, const char *lvalue,
     431             :                       int ltype, const char *rvalue, void *data, void *userdata);
     432             : 
     433             : /* Address Pool */
     434             : 
     435             : int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
     436             : int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
     437             : void address_pool_free(AddressPool *p);
     438             : 
     439             : int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
     440             : 
     441             : const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
     442             : AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
     443             : 
     444             : int config_parse_address_family_boolean(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);
     445             : 
     446             : /* IPForwarding parser */
     447             : int config_parse_address_family_boolean_with_kernel(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);
     448             : 
     449             : /* Operational State */
     450             : 
     451             : const char* link_operstate_to_string(LinkOperationalState s) _const_;
     452             : LinkOperationalState link_operstate_from_string(const char *s) _pure_;
     453             : 
     454             : /* IPv6 privacy extensions support */
     455             : 
     456             : const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;
     457             : IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
     458             : 
     459             : 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);
     460             : 
     461             : 
     462             : /* Hostname */
     463             : 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);

Generated by: LCOV version 1.11