chiark / gitweb /
networkd: store netmask and mac address explicitly
[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         struct in_addr netmask;
68
69         union {
70                 struct in_addr in;
71                 struct in6_addr in6;
72         } in_addr;
73
74         LIST_FIELDS(Address, addresses);
75 };
76
77 struct Route {
78         Network *network;
79
80         unsigned char family;
81
82         union {
83                 struct in_addr in;
84                 struct in6_addr in6;
85         } in_addr;
86
87         LIST_FIELDS(Route, routes);
88 };
89
90 struct Link {
91         Manager *manager;
92
93         int ifindex;
94         struct ether_addr mac;
95
96         unsigned flags;
97
98         Network *network;
99 };
100
101 struct Manager {
102         sd_rtnl *rtnl;
103         sd_event *event;
104         struct udev *udev;
105         struct udev_monitor *udev_monitor;
106         sd_event_source *udev_event_source;
107
108         Hashmap *links;
109         LIST_HEAD(Network, networks);
110
111         char **network_dirs;
112         usec_t network_dirs_ts_usec;
113 };
114
115 /* Manager */
116
117 int manager_new(Manager **ret);
118 void manager_free(Manager *m);
119
120 int manager_udev_enumerate_links(Manager *m);
121 int manager_udev_listen(Manager *m);
122
123 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
124 #define _cleanup_manager_free_ _cleanup_(manager_freep)
125
126 /* Network */
127
128 int network_load(Manager *manager);
129 bool network_should_reload(Manager *manager);
130
131 void network_free(Network *network);
132
133 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
134 #define _cleanup_network_free_ _cleanup_(network_freep)
135
136 int network_get(Manager *manager, struct udev_device *device, Network **ret);
137 int network_apply(Manager *manager, Network *network, Link *link);
138
139 const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
140
141 /* Route */
142 int route_new(Network *network, Route **ret);
143 void route_free(Route *route);
144 int route_configure(Manager *manager, Route *route, Link *link);
145
146 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
147 #define _cleanup_route_free_ _cleanup_(route_freep)
148
149 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
150                          const char *section, const char *lvalue, int ltype,
151                          const char *rvalue, void *data, void *userdata);
152
153 /* Address */
154 int address_new(Network *network, Address **ret);
155 void address_free(Address *address);
156 int address_configure(Manager *manager, Address *address, Link *link);
157
158 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
159 #define _cleanup_address_free_ _cleanup_(address_freep)
160
161 int config_parse_address(const char *unit, const char *filename, unsigned line,
162                          const char *section, const char *lvalue, int ltype,
163                          const char *rvalue, void *data, void *userdata);
164
165 /* Link */
166
167 int link_new(Manager *manager, struct udev_device *device, Link **ret);
168 void link_free(Link *link);
169 int link_add(Manager *manager, struct udev_device *device);
170 int link_up(Manager *manager, Link *link);
171
172 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
173 #define _cleanup_link_free_ _cleanup_(link_freep)