1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2014 Susant Sahani <susant@redhat.com>
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/>.
22 #include <netinet/ether.h>
23 #include <arpa/inet.h>
26 #include <linux/if_tunnel.h>
29 #include "networkd-netdev-tunnel.h"
30 #include "network-internal.h"
33 #include "conf-parser.h"
35 static int netdev_ipip_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) {
39 assert(netdev->kind == NETDEV_KIND_IPIP);
40 assert(netdev->ifname);
41 assert(netdev->manager);
42 assert(netdev->manager->rtnl);
45 assert(netdev->family == AF_INET);
47 r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname);
49 log_error_netdev(netdev,
50 "Could not append IFLA_IFNAME, attribute: %s",
56 r = sd_rtnl_message_append_u32(m, IFLA_MTU, netdev->mtu);
58 log_error_netdev(netdev,
59 "Could not append IFLA_MTU attribute: %s",
66 r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac);
68 log_error_netdev(netdev,
69 "Colud not append IFLA_ADDRESS attribute: %s",
75 r = sd_rtnl_message_open_container(m, IFLA_LINKINFO);
77 log_error_netdev(netdev,
78 "Could not append IFLA_LINKINFO attribute: %s",
83 r = sd_rtnl_message_open_container_union(m, IFLA_INFO_DATA,
84 netdev_kind_to_string(netdev->kind));
86 log_error_netdev(netdev,
87 "Could not append IFLA_INFO_DATA attribute: %s",
92 r = sd_rtnl_message_append_u32(m, IFLA_IPTUN_LINK, link->ifindex);
94 log_error_netdev(netdev,
95 "Could not append IFLA_IPTUN_LINK attribute: %s",
100 r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &netdev->local.in);
102 log_error_netdev(netdev,
103 "Could not append IFLA_IPTUN_LOCAL attribute: %s",
108 r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &netdev->remote.in);
110 log_error_netdev(netdev,
111 "Could not append IFLA_IPTUN_REMOTE attribute: %s",
116 r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TTL, netdev->ttl);
118 log_error_netdev(netdev,
119 "Could not append IFLA_IPTUN_TTL attribute: %s",
124 r = sd_rtnl_message_close_container(m);
126 log_error_netdev(netdev,
127 "Could not append IFLA_INFO_DATA attribute: %s",
132 r = sd_rtnl_message_close_container(m);
134 log_error_netdev(netdev,
135 "Could not append IFLA_LINKINFO attribute: %s",
143 static int netdev_sit_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) {
147 assert(netdev->kind == NETDEV_KIND_SIT);
148 assert(netdev->ifname);
149 assert(netdev->manager);
150 assert(netdev->manager->rtnl);
153 assert(netdev->family == AF_INET);
155 r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname);
157 log_error_netdev(netdev,
158 "Could not append IFLA_IFNAME, attribute: %s",
164 r = sd_rtnl_message_append_u32(m, IFLA_MTU, netdev->mtu);
166 log_error_netdev(netdev,
167 "Could not append IFLA_MTU attribute: %s",
174 r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac);
176 log_error_netdev(netdev,
177 "Colud not append IFLA_ADDRESS attribute: %s",
183 r = sd_rtnl_message_open_container(m, IFLA_LINKINFO);
185 log_error_netdev(netdev,
186 "Could not append IFLA_LINKINFO attribute: %s",
191 r = sd_rtnl_message_open_container_union(m, IFLA_INFO_DATA,
192 netdev_kind_to_string(netdev->kind));
194 log_error_netdev(netdev,
195 "Could not append IFLA_INFO_DATA attribute: %s",
200 r = sd_rtnl_message_append_u32(m, IFLA_IPTUN_LINK, link->ifindex);
202 log_error_netdev(netdev,
203 "Could not append IFLA_IPTUN_LINK attribute: %s",
208 r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &netdev->local.in);
210 log_error_netdev(netdev,
211 "Could not append IFLA_IPTUN_LOCAL attribute: %s",
216 r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &netdev->remote.in);
218 log_error_netdev(netdev,
219 "Could not append IFLA_IPTUN_REMOTE attribute: %s",
224 r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TTL, netdev->ttl);
226 log_error_netdev(netdev,
227 "Could not append IFLA_IPTUN_TTL attribute: %s",
232 r = sd_rtnl_message_close_container(m);
234 log_error_netdev(netdev,
235 "Could not append IFLA_INFO_DATA attribute: %s",
240 r = sd_rtnl_message_close_container(m);
242 log_error_netdev(netdev,
243 "Could not append IFLA_LINKINFO attribute: %s",
251 static int netdev_gre_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) {
255 assert(netdev->kind == NETDEV_KIND_GRE);
256 assert(netdev->ifname);
257 assert(netdev->manager);
258 assert(netdev->manager->rtnl);
261 assert(netdev->family == AF_INET);
263 r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname);
265 log_error_netdev(netdev,
266 "Could not append IFLA_IFNAME, attribute: %s",
272 r = sd_rtnl_message_append_u32(m, IFLA_MTU, netdev->mtu);
274 log_error_netdev(netdev,
275 "Could not append IFLA_MTU attribute: %s",
282 r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac);
284 log_error_netdev(netdev,
285 "Colud not append IFLA_ADDRESS attribute: %s",
291 r = sd_rtnl_message_open_container(m, IFLA_LINKINFO);
293 log_error_netdev(netdev,
294 "Could not append IFLA_LINKINFO attribute: %s",
299 r = sd_rtnl_message_open_container_union(m, IFLA_INFO_DATA,
300 netdev_kind_to_string(netdev->kind));
302 log_error_netdev(netdev,
303 "Could not append IFLA_INFO_DATA attribute: %s",
308 r = sd_rtnl_message_append_u32(m, IFLA_GRE_LINK, link->ifindex);
310 log_error_netdev(netdev,
311 "Could not append IFLA_GRE_LINK attribute: %s",
316 r = sd_rtnl_message_append_in_addr(m, IFLA_GRE_LOCAL, &netdev->local.in);
318 log_error_netdev(netdev,
319 "Could not append IFLA_GRE_LOCAL attribute: %s",
324 r = sd_rtnl_message_append_in_addr(m, IFLA_GRE_REMOTE, &netdev->remote.in);
326 log_error_netdev(netdev,
327 "Could not append IFLA_GRE_REMOTE attribute: %s",
332 r = sd_rtnl_message_append_u8(m, IFLA_GRE_TTL, netdev->ttl);
334 log_error_netdev(netdev,
335 "Could not append IFLA_GRE_TTL attribute: %s",
340 r = sd_rtnl_message_append_u8(m, IFLA_GRE_TOS, netdev->tos);
342 log_error_netdev(netdev,
343 "Could not append IFLA_GRE_TOS attribute: %s",
348 r = sd_rtnl_message_close_container(m);
350 log_error_netdev(netdev,
351 "Could not append IFLA_INFO_DATA attribute: %s",
356 r = sd_rtnl_message_close_container(m);
358 log_error_netdev(netdev,
359 "Could not append IFLA_LINKINFO attribute: %s",
367 static int netdev_vti_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) {
371 assert(netdev->kind == NETDEV_KIND_VTI);
372 assert(netdev->ifname);
373 assert(netdev->manager);
374 assert(netdev->manager->rtnl);
377 assert(netdev->family == AF_INET);
379 r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname);
381 log_error_netdev(netdev,
382 "Could not append IFLA_IFNAME, attribute: %s",
388 r = sd_rtnl_message_append_u32(m, IFLA_MTU, netdev->mtu);
390 log_error_netdev(netdev,
391 "Could not append IFLA_MTU attribute: %s",
398 r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac);
400 log_error_netdev(netdev,
401 "Colud not append IFLA_ADDRESS attribute: %s",
407 r = sd_rtnl_message_open_container(m, IFLA_LINKINFO);
409 log_error_netdev(netdev,
410 "Could not append IFLA_LINKINFO attribute: %s",
415 r = sd_rtnl_message_open_container_union(m, IFLA_INFO_DATA,
416 netdev_kind_to_string(netdev->kind));
418 log_error_netdev(netdev,
419 "Could not append IFLA_INFO_DATA attribute: %s",
424 r = sd_rtnl_message_append_u32(m, IFLA_VTI_LINK, link->ifindex);
426 log_error_netdev(netdev,
427 "Could not append IFLA_IPTUN_LINK attribute: %s",
432 r = sd_rtnl_message_append_in_addr(m, IFLA_VTI_LOCAL, &netdev->local.in);
434 log_error_netdev(netdev,
435 "Could not append IFLA_IPTUN_LOCAL attribute: %s",
440 r = sd_rtnl_message_append_in_addr(m, IFLA_VTI_REMOTE, &netdev->remote.in);
442 log_error_netdev(netdev,
443 "Could not append IFLA_IPTUN_REMOTE attribute: %s",
448 r = sd_rtnl_message_close_container(m);
450 log_error_netdev(netdev,
451 "Could not append IFLA_INFO_DATA attribute: %s",
456 r = sd_rtnl_message_close_container(m);
458 log_error_netdev(netdev,
459 "Could not append IFLA_LINKINFO attribute: %s",
467 static int netdev_tunnel_verify(NetDev *netdev, const char *filename) {
471 if (netdev->local.in.s_addr == INADDR_ANY) {
472 log_warning("Tunnel without local address configured in %s. Ignoring", filename);
476 if (netdev->remote.in.s_addr == INADDR_ANY) {
477 log_warning("Tunnel without remote address configured in %s. Ignoring", filename);
481 if (netdev->family != AF_INET) {
482 log_warning("Tunnel with invalid address family configured in %s. Ignoring", filename);
489 int config_parse_tunnel_address(const char *unit,
490 const char *filename,
493 unsigned section_line,
499 NetDev *n = userdata;
500 union in_addr_union *addr = data;
508 r = net_parse_inaddr(rvalue, &n->family, addr);
510 log_syntax(unit, LOG_ERR, filename, line, EINVAL,
511 "Tunnel address is invalid, ignoring assignment: %s", rvalue);
518 const NetDevVTable ipip_vtable = {
519 .fill_message_create_on_link = netdev_ipip_fill_message_create,
520 .config_verify = netdev_tunnel_verify,
523 const NetDevVTable sit_vtable = {
524 .fill_message_create_on_link = netdev_sit_fill_message_create,
525 .config_verify = netdev_tunnel_verify,
528 const NetDevVTable vti_vtable = {
529 .fill_message_create_on_link = netdev_vti_fill_message_create,
530 .config_verify = netdev_tunnel_verify,
533 const NetDevVTable gre_vtable = {
534 .fill_message_create_on_link = netdev_gre_fill_message_create,
535 .config_verify = netdev_tunnel_verify,