1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
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.
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.
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/>.
24 #include <arpa/inet.h>
25 #include <linux/rtnetlink.h>
31 #include "rtnl-util.h"
35 typedef struct Network Network;
36 typedef struct Link Link;
37 typedef struct Address Address;
38 typedef struct Route Route;
39 typedef struct Manager Manager;
46 struct ether_addr *match_mac;
54 LIST_HEAD(Address, addresses);
55 LIST_HEAD(Route, routes);
57 Hashmap *addresses_by_section;
58 Hashmap *routes_by_section;
60 LIST_FIELDS(Network, networks);
68 unsigned char prefixlen;
71 struct in_addr netmask;
78 LIST_FIELDS(Address, addresses);
86 unsigned char dst_prefixlen;
98 LIST_FIELDS(Route, routes);
101 typedef enum LinkState {
102 LINK_STATE_SET_ADDRESSES,
103 LINK_STATE_ADDRESSES_SET,
104 LINK_STATE_SET_ROUTES,
105 LINK_STATE_ROUTES_SET,
106 LINK_STATE_CONFIGURED,
109 _LINK_STATE_INVALID = -1
117 struct ether_addr mac;
125 unsigned rtnl_messages;
132 struct udev_monitor *udev_monitor;
133 sd_event_source *udev_event_source;
136 LIST_HEAD(Network, networks);
139 usec_t network_dirs_ts_usec;
144 int manager_new(Manager **ret);
145 void manager_free(Manager *m);
147 int manager_udev_enumerate_links(Manager *m);
148 int manager_udev_listen(Manager *m);
150 int manager_rtnl_listen(Manager *m);
152 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
153 #define _cleanup_manager_free_ _cleanup_(manager_freep)
157 int network_load(Manager *manager);
158 bool network_should_reload(Manager *manager);
160 void network_free(Network *network);
162 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
163 #define _cleanup_network_free_ _cleanup_(network_freep)
165 int network_get(Manager *manager, struct udev_device *device, Network **ret);
166 int network_apply(Manager *manager, Network *network, Link *link);
168 const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
171 int route_new(Network *network, unsigned section, Route **ret);
172 void route_free(Route *route);
173 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
175 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
176 #define _cleanup_route_free_ _cleanup_(route_freep)
178 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
179 const char *section, unsigned section_line, const char *lvalue,
180 int ltype, const char *rvalue, void *data, void *userdata);
182 int config_parse_destination(const char *unit, const char *filename, unsigned line,
183 const char *section, unsigned section_line, const char *lvalue,
184 int ltype, const char *rvalue, void *data, void *userdata);
187 int address_new(Network *network, unsigned section, Address **ret);
188 void address_free(Address *address);
189 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
191 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
192 #define _cleanup_address_free_ _cleanup_(address_freep)
194 int config_parse_address(const char *unit, const char *filename, unsigned line,
195 const char *section, unsigned section_line, const char *lvalue,
196 int ltype, const char *rvalue, void *data, void *userdata);
198 int config_parse_label(const char *unit, const char *filename, unsigned line,
199 const char *section, unsigned section_line, const char *lvalue,
200 int ltype, const char *rvalue, void *data, void *userdata);
204 int link_new(Manager *manager, struct udev_device *device, Link **ret);
205 void link_free(Link *link);
206 int link_add(Manager *manager, struct udev_device *device);
207 int link_configure(Link *link);
209 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
210 #define _cleanup_link_free_ _cleanup_(link_freep)