chiark / gitweb /
networkd: add a basic network daemon
[elogind.git] / src / network / networkd.h
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 #include <linux/rtnetlink.h>
26
27 #include "sd-event.h"
28 #include "sd-rtnl.h"
29 #include "udev.h"
30
31 #include "rtnl-util.h"
32 #include "hashmap.h"
33 #include "list.h"
34
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;
40
41 struct Network {
42         Manager *manager;
43
44         char *filename;
45
46         struct ether_addr *match_mac;
47         char *match_path;
48         char *match_driver;
49         char *match_type;
50         char *match_name;
51
52         char *description;
53
54         LIST_HEAD(Address, addresses);
55         LIST_HEAD(Route, routes);
56
57         LIST_FIELDS(Network, networks);
58 };
59
60 struct Address {
61         Network *network;
62
63         unsigned char family;
64         unsigned char prefixlen;
65         char *label;
66
67         union {
68                 struct in_addr in;
69                 struct in6_addr in6;
70         } in_addr;
71
72         LIST_FIELDS(Address, addresses);
73 };
74
75 struct Route {
76         Network *network;
77
78         unsigned char family;
79
80         union {
81                 struct in_addr in;
82                 struct in6_addr in6;
83         } in_addr;
84
85         LIST_FIELDS(Route, routes);
86 };
87
88 struct Link {
89         Manager *manager;
90
91         int ifindex;
92
93         unsigned flags;
94
95         Network *network;
96 };
97
98 struct Manager {
99         sd_rtnl *rtnl;
100         sd_event *event;
101         struct udev *udev;
102         struct udev_monitor *udev_monitor;
103         sd_event_source *udev_event_source;
104
105         Hashmap *links;
106         LIST_HEAD(Network, networks);
107
108         char **network_dirs;
109         usec_t network_dirs_ts_usec;
110 };
111
112 /* Manager */
113
114 int manager_new(Manager **ret);
115 void manager_free(Manager *m);
116
117 int manager_udev_enumerate_links(Manager *m);
118 int manager_udev_listen(Manager *m);
119
120 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
121 #define _cleanup_manager_free_ _cleanup_(manager_freep)
122
123 /* Network */
124
125 int network_load(Manager *manager);
126 bool network_should_reload(Manager *manager);
127
128 void network_free(Network *network);
129
130 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
131 #define _cleanup_network_free_ _cleanup_(network_freep)
132
133 int network_get(Manager *manager, struct udev_device *device, Network **ret);
134 int network_apply(Manager *manager, Network *network, Link *link);
135
136 const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
137
138 /* Route */
139 int route_new(Network *network, Route **ret);
140 void route_free(Route *route);
141 int route_configure(Manager *manager, Route *route, Link *link);
142
143 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
144 #define _cleanup_route_free_ _cleanup_(route_freep)
145
146 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
147                          const char *section, const char *lvalue, int ltype,
148                          const char *rvalue, void *data, void *userdata);
149
150 /* Address */
151 int address_new(Network *network, Address **ret);
152 void address_free(Address *address);
153 int address_configure(Manager *manager, Address *address, Link *link);
154
155 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
156 #define _cleanup_address_free_ _cleanup_(address_freep)
157
158 int config_parse_address(const char *unit, const char *filename, unsigned line,
159                          const char *section, const char *lvalue, int ltype,
160                          const char *rvalue, void *data, void *userdata);
161
162 /* Link */
163
164 int link_new(Manager *manager, struct udev_device *device, Link **ret);
165 void link_free(Link *link);
166 int link_add(Manager *manager, struct udev_device *device);
167 int link_up(Manager *manager, Link *link);
168
169 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
170 #define _cleanup_link_free_ _cleanup_(link_freep)