]>
Commit | Line | Data |
---|---|---|
f579559b TG |
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> | |
f579559b TG |
25 | |
26 | #include "sd-event.h" | |
27 | #include "sd-rtnl.h" | |
1346b1f0 | 28 | #include "sd-bus.h" |
f5be5601 | 29 | #include "sd-dhcp-client.h" |
5c1d3fc9 | 30 | #include "sd-ipv4ll.h" |
f579559b TG |
31 | #include "udev.h" |
32 | ||
33 | #include "rtnl-util.h" | |
34 | #include "hashmap.h" | |
35 | #include "list.h" | |
06f021a8 | 36 | #include "set.h" |
2cc412b5 | 37 | #include "condition-util.h" |
f579559b | 38 | |
aba496a5 UTL |
39 | #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU |
40 | ||
1a436809 | 41 | typedef struct NetDev NetDev; |
f579559b TG |
42 | typedef struct Network Network; |
43 | typedef struct Link Link; | |
44 | typedef struct Address Address; | |
45 | typedef struct Route Route; | |
46 | typedef struct Manager Manager; | |
47 | ||
52433f6b | 48 | typedef struct netdev_enslave_callback netdev_enslave_callback; |
02b59d57 | 49 | |
52433f6b | 50 | struct netdev_enslave_callback { |
02b59d57 TG |
51 | sd_rtnl_message_handler_t callback; |
52 | Link *link; | |
53 | ||
52433f6b | 54 | LIST_FIELDS(netdev_enslave_callback, callbacks); |
02b59d57 TG |
55 | }; |
56 | ||
fe6b2d55 TG |
57 | typedef enum MacVlanMode { |
58 | NETDEV_MACVLAN_MODE_PRIVATE = MACVLAN_MODE_PRIVATE, | |
59 | NETDEV_MACVLAN_MODE_VEPA = MACVLAN_MODE_VEPA, | |
60 | NETDEV_MACVLAN_MODE_BRIDGE = MACVLAN_MODE_BRIDGE, | |
61 | NETDEV_MACVLAN_MODE_PASSTHRU = MACVLAN_MODE_PASSTHRU, | |
62 | _NETDEV_MACVLAN_MODE_MAX, | |
63 | _NETDEV_MACVLAN_MODE_INVALID = -1 | |
64 | } MacVlanMode; | |
65 | ||
1a436809 | 66 | typedef enum NetDevKind { |
52433f6b TG |
67 | NETDEV_KIND_BRIDGE, |
68 | NETDEV_KIND_BOND, | |
54abf461 | 69 | NETDEV_KIND_VLAN, |
fe6b2d55 | 70 | NETDEV_KIND_MACVLAN, |
7951dea2 SS |
71 | NETDEV_KIND_IPIP, |
72 | NETDEV_KIND_GRE, | |
73 | NETDEV_KIND_SIT, | |
10142d75 | 74 | NETDEV_KIND_VETH, |
a613382b | 75 | NETDEV_KIND_VTI, |
52433f6b TG |
76 | _NETDEV_KIND_MAX, |
77 | _NETDEV_KIND_INVALID = -1 | |
1a436809 | 78 | } NetDevKind; |
52433f6b | 79 | |
1a436809 | 80 | typedef enum NetDevState { |
52433f6b TG |
81 | NETDEV_STATE_FAILED, |
82 | NETDEV_STATE_CREATING, | |
83 | NETDEV_STATE_READY, | |
2cc7e981 | 84 | NETDEV_STATE_LINGER, |
52433f6b TG |
85 | _NETDEV_STATE_MAX, |
86 | _NETDEV_STATE_INVALID = -1, | |
1a436809 | 87 | } NetDevState; |
52433f6b | 88 | |
1a436809 | 89 | struct NetDev { |
02b59d57 TG |
90 | Manager *manager; |
91 | ||
14b746f7 TG |
92 | int n_ref; |
93 | ||
02b59d57 TG |
94 | char *filename; |
95 | ||
edbb03e9 TG |
96 | Condition *match_host; |
97 | Condition *match_virt; | |
98 | Condition *match_kernel; | |
99 | Condition *match_arch; | |
c0dda186 | 100 | |
02b59d57 | 101 | char *description; |
af4e9e2c | 102 | char *ifname; |
10142d75 | 103 | char *ifname_peer; |
7951dea2 | 104 | size_t mtu; |
1a436809 | 105 | NetDevKind kind; |
02b59d57 | 106 | |
672682a6 | 107 | uint64_t vlanid; |
fe6b2d55 | 108 | int32_t macvlan_mode; |
54abf461 | 109 | |
50add290 | 110 | int ifindex; |
1a436809 | 111 | NetDevState state; |
02b59d57 | 112 | |
a9f434cf | 113 | bool tunnel_pmtudisc; |
7951dea2 SS |
114 | unsigned tunnel_ttl; |
115 | unsigned tunnel_tos; | |
116 | struct in_addr tunnel_local; | |
117 | struct in_addr tunnel_remote; | |
118 | ||
52433f6b | 119 | LIST_HEAD(netdev_enslave_callback, callbacks); |
02b59d57 TG |
120 | }; |
121 | ||
f579559b TG |
122 | struct Network { |
123 | Manager *manager; | |
124 | ||
125 | char *filename; | |
126 | ||
127 | struct ether_addr *match_mac; | |
128 | char *match_path; | |
129 | char *match_driver; | |
130 | char *match_type; | |
131 | char *match_name; | |
2cc412b5 TG |
132 | Condition *match_host; |
133 | Condition *match_virt; | |
134 | Condition *match_kernel; | |
edbb03e9 | 135 | Condition *match_arch; |
f579559b TG |
136 | |
137 | char *description; | |
1a436809 TG |
138 | NetDev *bridge; |
139 | NetDev *bond; | |
7951dea2 | 140 | NetDev *tunnel; |
672682a6 | 141 | Hashmap *vlans; |
fe6b2d55 | 142 | Hashmap *macvlans; |
f5be5601 | 143 | bool dhcp; |
5be4d38e | 144 | bool dhcp_dns; |
bcb7a07e | 145 | bool dhcp_ntp; |
4f882b2a | 146 | bool dhcp_mtu; |
1346b1f0 | 147 | bool dhcp_hostname; |
039ebe6a | 148 | bool dhcp_domainname; |
eb27aeca | 149 | bool dhcp_critical; |
5c1d3fc9 | 150 | bool ipv4ll; |
f579559b | 151 | |
f048a16b TG |
152 | LIST_HEAD(Address, static_addresses); |
153 | LIST_HEAD(Route, static_routes); | |
f579559b | 154 | |
6ae115c1 TG |
155 | Hashmap *addresses_by_section; |
156 | Hashmap *routes_by_section; | |
157 | ||
d4920165 | 158 | LIST_HEAD(Address, dns); |
bcb7a07e | 159 | LIST_HEAD(Address, ntp); |
06f021a8 | 160 | |
f579559b TG |
161 | LIST_FIELDS(Network, networks); |
162 | }; | |
163 | ||
164 | struct Address { | |
165 | Network *network; | |
6ae115c1 | 166 | uint64_t section; |
f579559b TG |
167 | |
168 | unsigned char family; | |
169 | unsigned char prefixlen; | |
5c1d3fc9 | 170 | unsigned char scope; |
f579559b TG |
171 | char *label; |
172 | ||
eb0ea358 | 173 | struct in_addr broadcast; |
aba496a5 | 174 | struct ifa_cacheinfo cinfo; |
8cd11a0f | 175 | |
f579559b TG |
176 | union { |
177 | struct in_addr in; | |
178 | struct in6_addr in6; | |
179 | } in_addr; | |
180 | ||
3d3d4255 | 181 | LIST_FIELDS(Address, addresses); |
f579559b TG |
182 | }; |
183 | ||
184 | struct Route { | |
185 | Network *network; | |
6ae115c1 | 186 | uint64_t section; |
f579559b TG |
187 | |
188 | unsigned char family; | |
6ae115c1 | 189 | unsigned char dst_prefixlen; |
5c1d3fc9 UTL |
190 | unsigned char scope; |
191 | uint32_t metrics; | |
f579559b TG |
192 | |
193 | union { | |
194 | struct in_addr in; | |
195 | struct in6_addr in6; | |
196 | } in_addr; | |
197 | ||
6ae115c1 TG |
198 | union { |
199 | struct in_addr in; | |
200 | struct in6_addr in6; | |
201 | } dst_addr; | |
202 | ||
3d3d4255 | 203 | LIST_FIELDS(Route, routes); |
f579559b TG |
204 | }; |
205 | ||
f882c247 | 206 | typedef enum LinkState { |
505f8da7 | 207 | LINK_STATE_INITIALIZING, |
52433f6b | 208 | LINK_STATE_ENSLAVING, |
ef1ba606 TG |
209 | LINK_STATE_SETTING_ADDRESSES, |
210 | LINK_STATE_SETTING_ROUTES, | |
f882c247 | 211 | LINK_STATE_CONFIGURED, |
57bd6899 | 212 | LINK_STATE_UNMANAGED, |
f882c247 | 213 | LINK_STATE_FAILED, |
370e9930 | 214 | LINK_STATE_LINGER, |
f882c247 TG |
215 | _LINK_STATE_MAX, |
216 | _LINK_STATE_INVALID = -1 | |
217 | } LinkState; | |
218 | ||
e375dcde TG |
219 | typedef enum LinkOperationalState { |
220 | LINK_OPERSTATE_UNKNOWN, | |
221 | LINK_OPERSTATE_DORMANT, | |
222 | LINK_OPERSTATE_CARRIER, | |
223 | LINK_OPERSTATE_DEGRADED, | |
224 | LINK_OPERSTATE_ROUTABLE, | |
225 | _LINK_OPERSTATE_MAX, | |
226 | _LINK_OPERSTATE_INVALID = -1 | |
227 | } LinkOperationalState; | |
228 | ||
f579559b TG |
229 | struct Link { |
230 | Manager *manager; | |
231 | ||
14b746f7 TG |
232 | int n_ref; |
233 | ||
0617ffab | 234 | uint64_t ifindex; |
c166a070 | 235 | char *ifname; |
fe8db0c5 | 236 | char *state_file; |
8cd11a0f | 237 | struct ether_addr mac; |
b5db00e5 | 238 | struct udev_device *udev_device; |
f579559b TG |
239 | |
240 | unsigned flags; | |
e375dcde | 241 | uint8_t kernel_operstate; |
f579559b TG |
242 | |
243 | Network *network; | |
f882c247 TG |
244 | |
245 | LinkState state; | |
e375dcde | 246 | LinkOperationalState operstate; |
f882c247 | 247 | |
f5be5601 TG |
248 | unsigned addr_messages; |
249 | unsigned route_messages; | |
52433f6b | 250 | unsigned enslaving; |
f5be5601 | 251 | |
428fd0a7 TG |
252 | LIST_HEAD(Address, addresses); |
253 | ||
a6cc569e TG |
254 | sd_dhcp_client *dhcp_client; |
255 | sd_dhcp_lease *dhcp_lease; | |
68a8723c | 256 | char *lease_file; |
a6cc569e | 257 | uint16_t original_mtu; |
5c1d3fc9 | 258 | sd_ipv4ll *ipv4ll; |
f579559b TG |
259 | }; |
260 | ||
261 | struct Manager { | |
262 | sd_rtnl *rtnl; | |
263 | sd_event *event; | |
1346b1f0 | 264 | sd_bus *bus; |
f579559b TG |
265 | struct udev *udev; |
266 | struct udev_monitor *udev_monitor; | |
267 | sd_event_source *udev_event_source; | |
0c2f9b84 TG |
268 | sd_event_source *sigterm_event_source; |
269 | sd_event_source *sigint_event_source; | |
f579559b | 270 | |
bbf7c048 TG |
271 | char *state_file; |
272 | ||
f579559b | 273 | Hashmap *links; |
52433f6b | 274 | Hashmap *netdevs; |
f579559b TG |
275 | LIST_HEAD(Network, networks); |
276 | ||
f579559b | 277 | usec_t network_dirs_ts_usec; |
7951dea2 | 278 | struct kmod_ctx *kmod_ctx; |
f579559b TG |
279 | }; |
280 | ||
2ad8416d ZJS |
281 | extern const char* const network_dirs[]; |
282 | ||
f579559b TG |
283 | /* Manager */ |
284 | ||
285 | int manager_new(Manager **ret); | |
286 | void manager_free(Manager *m); | |
287 | ||
02b59d57 TG |
288 | int manager_load_config(Manager *m); |
289 | bool manager_should_reload(Manager *m); | |
290 | ||
505f8da7 | 291 | int manager_rtnl_enumerate_links(Manager *m); |
f579559b | 292 | |
f882c247 | 293 | int manager_rtnl_listen(Manager *m); |
505f8da7 | 294 | int manager_udev_listen(Manager *m); |
1346b1f0 | 295 | int manager_bus_listen(Manager *m); |
f882c247 | 296 | |
bbf7c048 | 297 | int manager_save(Manager *m); |
3bef724f | 298 | |
f579559b TG |
299 | DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); |
300 | #define _cleanup_manager_free_ _cleanup_(manager_freep) | |
301 | ||
1a436809 | 302 | /* NetDev */ |
52433f6b TG |
303 | |
304 | int netdev_load(Manager *manager); | |
2cc7e981 | 305 | void netdev_drop(NetDev *netdev); |
02b59d57 | 306 | |
14b746f7 TG |
307 | NetDev *netdev_unref(NetDev *netdev); |
308 | NetDev *netdev_ref(NetDev *netdev); | |
02b59d57 | 309 | |
14b746f7 TG |
310 | DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref); |
311 | #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp) | |
02b59d57 | 312 | |
1a436809 | 313 | int netdev_get(Manager *manager, const char *name, NetDev **ret); |
d39edfc7 | 314 | int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink); |
1a436809 | 315 | int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb); |
7951dea2 | 316 | int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback); |
10142d75 | 317 | int netdev_create_veth(NetDev *netdev, sd_rtnl_message_handler_t callback); |
02b59d57 | 318 | |
1a436809 TG |
319 | const char *netdev_kind_to_string(NetDevKind d) _const_; |
320 | NetDevKind netdev_kind_from_string(const char *d) _pure_; | |
52433f6b | 321 | |
fe6b2d55 TG |
322 | const char *macvlan_mode_to_string(MacVlanMode d) _const_; |
323 | MacVlanMode macvlan_mode_from_string(const char *d) _pure_; | |
324 | ||
52433f6b | 325 | int config_parse_netdev_kind(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); |
02b59d57 | 326 | |
fe6b2d55 TG |
327 | int config_parse_macvlan_mode(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); |
328 | ||
c0dda186 TG |
329 | /* gperf */ |
330 | const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length); | |
331 | ||
f579559b TG |
332 | /* Network */ |
333 | ||
334 | int network_load(Manager *manager); | |
f579559b TG |
335 | |
336 | void network_free(Network *network); | |
337 | ||
338 | DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free); | |
339 | #define _cleanup_network_free_ _cleanup_(network_freep) | |
340 | ||
505f8da7 TG |
341 | int network_get(Manager *manager, struct udev_device *device, |
342 | const char *ifname, const struct ether_addr *mac, | |
343 | Network **ret); | |
f579559b TG |
344 | int network_apply(Manager *manager, Network *network, Link *link); |
345 | ||
69a93e7d | 346 | int config_parse_netdev(const char *unit, const char *filename, unsigned line, |
02b59d57 TG |
347 | const char *section, unsigned section_line, const char *lvalue, |
348 | int ltype, const char *rvalue, void *data, void *userdata); | |
349 | ||
7951dea2 SS |
350 | int config_parse_tunnel(const char *unit, |
351 | const char *filename, | |
352 | unsigned line, | |
353 | const char *section, | |
354 | unsigned section_line, | |
355 | const char *lvalue, | |
356 | int ltype, | |
357 | const char *rvalue, | |
358 | void *data, | |
359 | void *userdata); | |
360 | ||
361 | int config_parse_tunnel_address(const char *unit, | |
362 | const char *filename, | |
363 | unsigned line, | |
364 | const char *section, | |
365 | unsigned section_line, | |
366 | const char *lvalue, | |
367 | int ltype, | |
368 | const char *rvalue, | |
369 | void *data, | |
370 | void *userdata); | |
371 | ||
02b59d57 | 372 | /* gperf */ |
c0dda186 | 373 | const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length); |
f579559b TG |
374 | |
375 | /* Route */ | |
f048a16b TG |
376 | int route_new_static(Network *network, unsigned section, Route **ret); |
377 | int route_new_dynamic(Route **ret); | |
f579559b | 378 | void route_free(Route *route); |
f882c247 | 379 | int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback); |
5c1d3fc9 UTL |
380 | int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback); |
381 | ||
f579559b TG |
382 | |
383 | DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free); | |
384 | #define _cleanup_route_free_ _cleanup_(route_freep) | |
385 | ||
386 | int config_parse_gateway(const char *unit, const char *filename, unsigned line, | |
71a61510 TG |
387 | const char *section, unsigned section_line, const char *lvalue, |
388 | int ltype, const char *rvalue, void *data, void *userdata); | |
f579559b | 389 | |
6ae115c1 TG |
390 | int config_parse_destination(const char *unit, const char *filename, unsigned line, |
391 | const char *section, unsigned section_line, const char *lvalue, | |
392 | int ltype, const char *rvalue, void *data, void *userdata); | |
393 | ||
f579559b | 394 | /* Address */ |
f048a16b TG |
395 | int address_new_static(Network *network, unsigned section, Address **ret); |
396 | int address_new_dynamic(Address **ret); | |
f579559b | 397 | void address_free(Address *address); |
f882c247 | 398 | int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
aba496a5 | 399 | int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
407fe036 | 400 | int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
9505d3c6 | 401 | bool address_equal(Address *a1, Address *a2); |
f579559b TG |
402 | |
403 | DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free); | |
404 | #define _cleanup_address_free_ _cleanup_(address_freep) | |
405 | ||
3bef724f TG |
406 | int config_parse_dns(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 | ||
f579559b | 410 | int config_parse_address(const char *unit, const char *filename, unsigned line, |
71a61510 TG |
411 | const char *section, unsigned section_line, const char *lvalue, |
412 | int ltype, const char *rvalue, void *data, void *userdata); | |
f579559b | 413 | |
eb0ea358 TG |
414 | int config_parse_broadcast(const char *unit, const char *filename, unsigned line, |
415 | const char *section, unsigned section_line, const char *lvalue, | |
416 | int ltype, const char *rvalue, void *data, void *userdata); | |
417 | ||
6ae115c1 TG |
418 | int config_parse_label(const char *unit, const char *filename, unsigned line, |
419 | const char *section, unsigned section_line, const char *lvalue, | |
420 | int ltype, const char *rvalue, void *data, void *userdata); | |
421 | ||
f579559b TG |
422 | /* Link */ |
423 | ||
14b746f7 TG |
424 | Link *link_unref(Link *link); |
425 | Link *link_ref(Link *link); | |
11a7f229 | 426 | int link_get(Manager *m, int ifindex, Link **ret); |
505f8da7 | 427 | int link_add(Manager *manager, sd_rtnl_message *message, Link **ret); |
370e9930 | 428 | void link_drop(Link *link); |
f579559b | 429 | |
22936833 | 430 | int link_update(Link *link, sd_rtnl_message *message); |
fbbeb65a | 431 | int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata); |
dd3efc09 | 432 | |
505f8da7 TG |
433 | int link_initialized(Link *link, struct udev_device *device); |
434 | ||
fe8db0c5 TG |
435 | int link_save(Link *link); |
436 | ||
bbf7c048 TG |
437 | bool link_has_carrier(unsigned flags, uint8_t operstate); |
438 | ||
fe8db0c5 TG |
439 | const char* link_state_to_string(LinkState s) _const_; |
440 | LinkState link_state_from_string(const char *s) _pure_; | |
441 | ||
e375dcde TG |
442 | const char* link_operstate_to_string(LinkOperationalState s) _const_; |
443 | LinkOperationalState link_operstate_from_string(const char *s) _pure_; | |
444 | ||
14b746f7 TG |
445 | DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref); |
446 | #define _cleanup_link_unref_ _cleanup_(link_unrefp) | |
3333d748 ZJS |
447 | |
448 | /* Macros which append INTERFACE= to the message */ | |
449 | ||
987efa17 | 450 | #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__) |
39032b87 ZJS |
451 | #define log_debug_link(link, ...) log_full_link(LOG_DEBUG, link, ##__VA_ARGS__) |
452 | #define log_info_link(link, ...) log_full_link(LOG_INFO, link, ##__VA_ARGS__) | |
453 | #define log_notice_link(link, ...) log_full_link(LOG_NOTICE, link, ##__VA_ARGS__) | |
454 | #define log_warning_link(link, ...) log_full_link(LOG_WARNING, link, ##__VA_ARGS__) | |
455 | #define log_error_link(link, ...) log_full_link(LOG_ERR, link, ##__VA_ARGS__) | |
3333d748 ZJS |
456 | |
457 | #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__) | |
458 | ||
459 | /* More macros which append INTERFACE= to the message */ | |
460 | ||
987efa17 | 461 | #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__) |
52433f6b TG |
462 | #define log_debug_netdev(netdev, ...) log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__) |
463 | #define log_info_netdev(netdev, ...) log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__) | |
464 | #define log_notice_netdev(netdev, ...) log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__) | |
465 | #define log_warning_netdev(netdev, ...) log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__) | |
466 | #define log_error_netdev(netdev, ...) log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__) | |
3333d748 | 467 | |
af4e9e2c | 468 | #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__) |
3333d748 | 469 | |
af4e9e2c | 470 | #define NETDEV(netdev) "INTERFACE=%s", netdev->ifname |
62870613 ZJS |
471 | #define ADDRESS_FMT_VAL(address) \ |
472 | (address).s_addr & 0xFF, \ | |
473 | ((address).s_addr >> 8) & 0xFF, \ | |
474 | ((address).s_addr >> 16) & 0xFF, \ | |
475 | (address).s_addr >> 24 |