X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-tunnel.c;h=734148779544a5b841532b7e70070033a53c6dad;hp=e3ceb8b52b788ba6820b5294cd734102c8f701c8;hb=bce415edcae8e7af8327de8265d621f95fa5426f;hpb=a613382bbf4357ce13f17c988713b80172e091fb diff --git a/src/network/networkd-tunnel.c b/src/network/networkd-tunnel.c index e3ceb8b52..734148779 100644 --- a/src/network/networkd-tunnel.c +++ b/src/network/networkd-tunnel.c @@ -24,12 +24,13 @@ #include #include #include -#include #include "sd-rtnl.h" #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) { @@ -43,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, @@ -61,6 +64,16 @@ static int netdev_fill_ipip_rtnl_message(Link *link, sd_rtnl_message *m) { } } + if (netdev->mac) { + r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac); + if (r < 0) { + log_error_netdev(netdev, + "Colud not append IFLA_ADDRESS attribute: %s", + strerror(-r)); + return r; + } + } + r = sd_rtnl_message_open_container(m, IFLA_LINKINFO); if (r < 0) { log_error_netdev(netdev, @@ -86,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", @@ -94,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", @@ -102,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", @@ -140,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, @@ -158,6 +173,16 @@ static int netdev_fill_sit_rtnl_message(Link *link, sd_rtnl_message *m) { } } + if (netdev->mac) { + r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac); + if (r < 0) { + log_error_netdev(netdev, + "Colud not append IFLA_ADDRESS attribute: %s", + strerror(-r)); + return r; + } + } + r = sd_rtnl_message_open_container(m, IFLA_LINKINFO); if (r < 0) { log_error_netdev(netdev, @@ -183,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", @@ -191,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", @@ -199,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", @@ -245,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, @@ -263,6 +290,16 @@ static int netdev_fill_ipgre_rtnl_message(Link *link, sd_rtnl_message *m) { } } + if (netdev->mac) { + r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac); + if (r < 0) { + log_error_netdev(netdev, + "Colud not append IFLA_ADDRESS attribute: %s", + strerror(-r)); + return r; + } + } + r = sd_rtnl_message_open_container(m, IFLA_LINKINFO); if (r < 0) { log_error_netdev(netdev, @@ -288,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", @@ -296,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", @@ -304,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", @@ -312,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", @@ -350,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, @@ -368,6 +407,16 @@ static int netdev_fill_vti_rtnl_message(Link *link, sd_rtnl_message *m) { } } + if (netdev->mac) { + r = sd_rtnl_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac); + if (r < 0) { + log_error_netdev(netdev, + "Colud not append IFLA_ADDRESS attribute: %s", + strerror(-r)); + return r; + } + } + r = sd_rtnl_message_open_container(m, IFLA_LINKINFO); if (r < 0) { log_error_netdev(netdev, @@ -393,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", @@ -401,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", @@ -428,42 +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(netdev->manager->kmod_ctx); - - /* Load kernel module first */ - switch(netdev->kind) { - case NETDEV_KIND_IPIP: - case NETDEV_KIND_GRE: - case NETDEV_KIND_SIT: - r = load_module(netdev->manager->kmod_ctx, - netdev_kind_to_string(netdev->kind)); - if (r < 0) { - log_error_netdev(netdev, - "Could not load Kernel module: %s . Ignoring", - netdev_kind_to_string(netdev->kind)); - return r; - } - break; - case NETDEV_KIND_VTI: - break; - default: - return -ENOTSUP; - } + 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) { @@ -498,7 +522,7 @@ 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)); @@ -512,3 +536,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; +}