X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-tunnel.c;h=5a244f61b00c770fe3c8a483bcb78f60fe2c9fa0;hb=c9fdc26e96493175668fbde61a04fc70abff300d;hp=885347ab2599818c7c384a1d46893eeb66d653cc;hpb=96c907429e3224289fd360b8d9c8fdc573f4363b;p=elogind.git diff --git a/src/network/networkd-tunnel.c b/src/network/networkd-tunnel.c index 885347ab2..5a244f61b 100644 --- a/src/network/networkd-tunnel.c +++ b/src/network/networkd-tunnel.c @@ -29,6 +29,8 @@ #include "networkd.h" #include "network-internal.h" #include "util.h" +#include "missing.h" +#include "conf-parser.h" static int netdev_fill_ipip_rtnl_message(Link *link, sd_rtnl_message *m) { @@ -42,6 +44,8 @@ static int netdev_fill_ipip_rtnl_message(Link *link, sd_rtnl_message *m) { netdev = link->network->tunnel; + assert(netdev->family == AF_INET); + r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname); if (r < 0) { log_error_netdev(netdev, @@ -95,7 +99,7 @@ static int netdev_fill_ipip_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &netdev->tunnel_local); + r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &netdev->local.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_LOCAL attribute: %s", @@ -103,7 +107,7 @@ static int netdev_fill_ipip_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &netdev->tunnel_remote); + r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &netdev->remote.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_REMOTE attribute: %s", @@ -111,7 +115,7 @@ static int netdev_fill_ipip_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TTL, netdev->tunnel_ttl); + r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TTL, netdev->ttl); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_TTL attribute: %s", @@ -149,6 +153,8 @@ static int netdev_fill_sit_rtnl_message(Link *link, sd_rtnl_message *m) { netdev = link->network->tunnel; + assert(netdev->family == AF_INET); + r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname); if (r < 0) { log_error_netdev(netdev, @@ -202,7 +208,7 @@ static int netdev_fill_sit_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &netdev->tunnel_local); + r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &netdev->local.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_LOCAL attribute: %s", @@ -210,7 +216,7 @@ static int netdev_fill_sit_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &netdev->tunnel_remote); + r = sd_rtnl_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &netdev->remote.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_REMOTE attribute: %s", @@ -218,7 +224,7 @@ static int netdev_fill_sit_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TOS, netdev->tunnel_tos); + r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TOS, netdev->tos); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_TOS attribute: %s", @@ -264,6 +270,8 @@ static int netdev_fill_ipgre_rtnl_message(Link *link, sd_rtnl_message *m) { netdev = link->network->tunnel; + assert(netdev->family == AF_INET); + r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname); if (r < 0) { log_error_netdev(netdev, @@ -317,7 +325,7 @@ static int netdev_fill_ipgre_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_GRE_LOCAL, &netdev->tunnel_local); + r = sd_rtnl_message_append_in_addr(m, IFLA_GRE_LOCAL, &netdev->local.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_GRE_LOCAL attribute: %s", @@ -325,7 +333,7 @@ static int netdev_fill_ipgre_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_GRE_REMOTE, &netdev->tunnel_remote); + r = sd_rtnl_message_append_in_addr(m, IFLA_GRE_REMOTE, &netdev->remote.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_GRE_REMOTE attribute: %s", @@ -333,7 +341,7 @@ static int netdev_fill_ipgre_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_u8(m, IFLA_GRE_TTL, netdev->tunnel_ttl); + r = sd_rtnl_message_append_u8(m, IFLA_GRE_TTL, netdev->ttl); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_GRE_TTL attribute: %s", @@ -341,7 +349,7 @@ static int netdev_fill_ipgre_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_u8(m, IFLA_GRE_TOS, netdev->tunnel_tos); + r = sd_rtnl_message_append_u8(m, IFLA_GRE_TOS, netdev->tos); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_GRE_TOS attribute: %s", @@ -379,6 +387,8 @@ static int netdev_fill_vti_rtnl_message(Link *link, sd_rtnl_message *m) { netdev = link->network->tunnel; + assert(netdev->family == AF_INET); + r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname); if (r < 0) { log_error_netdev(netdev, @@ -432,7 +442,7 @@ static int netdev_fill_vti_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_VTI_LOCAL, &netdev->tunnel_local); + r = sd_rtnl_message_append_in_addr(m, IFLA_VTI_LOCAL, &netdev->local.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_LOCAL attribute: %s", @@ -440,7 +450,7 @@ static int netdev_fill_vti_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } - r = sd_rtnl_message_append_in_addr(m, IFLA_VTI_REMOTE, &netdev->tunnel_remote); + r = sd_rtnl_message_append_in_addr(m, IFLA_VTI_REMOTE, &netdev->remote.in); if (r < 0) { log_error_netdev(netdev, "Could not append IFLA_IPTUN_REMOTE attribute: %s", @@ -467,21 +477,17 @@ static int netdev_fill_vti_rtnl_message(Link *link, sd_rtnl_message *m) { return r; } -int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback) { +int netdev_create_tunnel(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback) { _cleanup_rtnl_message_unref_ sd_rtnl_message *m = NULL; - NetDev *netdev; int r; - assert(link); - assert(link->network); - assert(link->network->tunnel); - - netdev = link->network->tunnel; - assert(netdev); assert(netdev->ifname); assert(netdev->manager); assert(netdev->manager->rtnl); + assert(link); + assert(link->network); + assert(link->network->tunnel == netdev); r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0); if (r < 0) { @@ -516,13 +522,15 @@ int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback) { return -ENOTSUP; } - r = sd_rtnl_call_async(netdev->manager->rtnl, m, callback, netdev, 0, NULL); + r = sd_rtnl_call_async(netdev->manager->rtnl, m, callback, link, 0, NULL); if (r < 0) { log_error_netdev(netdev, "Could not send rtnetlink message: %s", strerror(-r)); return r; } + link_ref(link); + log_debug_netdev(netdev, "Creating tunnel netdev: %s", netdev_kind_to_string(netdev->kind)); @@ -530,3 +538,32 @@ int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback) { return 0; } + +int config_parse_tunnel_address(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) { + NetDev *n = userdata; + union in_addr_union *addr = data; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + r = net_parse_inaddr(rvalue, &n->family, addr); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Tunnel address is invalid, ignoring assignment: %s", rvalue); + return 0; + } + + return 0; +}