From c606db69ab5d872c79046aa1632e38be6ac6d1db Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 2 Feb 2019 23:08:10 +0100 Subject: [PATCH 01/12] network: fix errno in log_syntax() in_addr_is_null() returns boolean if the first argument is valid. So, passing the return value to log_syntax() as errno is wrong. --- src/network/networkd-ipv6-proxy-ndp.c | 5 ++--- src/network/networkd-network.c | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/network/networkd-ipv6-proxy-ndp.c b/src/network/networkd-ipv6-proxy-ndp.c index f594b27f7f..2a45dd9489 100644 --- a/src/network/networkd-ipv6-proxy-ndp.c +++ b/src/network/networkd-ipv6-proxy-ndp.c @@ -122,9 +122,8 @@ int config_parse_ipv6_proxy_ndp_address( return 0; } - r = in_addr_is_null(AF_INET6, &buffer); - if (r != 0) { - log_syntax(unit, LOG_ERR, filename, line, r, + if (in_addr_is_null(AF_INET6, &buffer)) { + log_syntax(unit, LOG_ERR, filename, line, 0, "IPv6 proxy NDP address cannot be the ANY address, ignoring: %s", rvalue); return 0; } diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 12344ec695..21fa270631 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -857,9 +857,8 @@ int config_parse_ipv6token( return 0; } - r = in_addr_is_null(AF_INET6, &buffer); - if (r != 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "IPv6 token cannot be the ANY address, ignoring: %s", rvalue); + if (in_addr_is_null(AF_INET6, &buffer)) { + log_syntax(unit, LOG_ERR, filename, line, 0, "IPv6 token cannot be the ANY address, ignoring: %s", rvalue); return 0; } From d40b01e44b1bfc6af72284f722fff131d51ec349 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 00:09:13 +0100 Subject: [PATCH 02/12] network: in_addr_is_null() may return negative errno So, do not silently cast the returned value to boolean. Exception is the case that family is trivially AF_INET or AF_INET6. --- src/network/netdev/geneve.c | 5 +---- src/network/netdev/tunnel.c | 4 ++-- src/network/netdev/vxlan.c | 8 ++------ src/network/networkd-address.c | 2 +- src/network/networkd-route.c | 8 ++++---- src/network/networkd-routing-policy-rule.c | 12 ++++-------- 6 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index 089bbfea22..a5c52bbf82 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -83,16 +83,13 @@ static int netdev_geneve_create(NetDev *netdev) { return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_ID attribute: %m"); } - if (!in_addr_is_null(v->remote_family, &v->remote)) { - + if (in_addr_is_null(v->remote_family, &v->remote) == 0) { if (v->remote_family == AF_INET) r = sd_netlink_message_append_in_addr(m, IFLA_GENEVE_REMOTE, &v->remote.in); else r = sd_netlink_message_append_in6_addr(m, IFLA_GENEVE_REMOTE6, &v->remote.in6); - if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_GROUP attribute: %m"); - } if (v->ttl) { diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 684edddb5f..c7058b3bec 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -578,8 +578,8 @@ int config_parse_tunnel_address(const char *unit, * unspecified, also clear the address family. */ if (t->family != AF_UNSPEC && - in_addr_is_null(t->family, &t->local) && - in_addr_is_null(t->family, &t->remote)) + in_addr_is_null(t->family, &t->local) != 0 && + in_addr_is_null(t->family, &t->remote) != 0) t->family = AF_UNSPEC; return 0; } diff --git a/src/network/netdev/vxlan.c b/src/network/netdev/vxlan.c index 4cb2eca3d2..4b855ae1e1 100644 --- a/src/network/netdev/vxlan.c +++ b/src/network/netdev/vxlan.c @@ -33,24 +33,20 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_ID attribute: %m"); } - if (!in_addr_is_null(v->remote_family, &v->remote)) { - + if (in_addr_is_null(v->remote_family, &v->remote) == 0) { if (v->remote_family == AF_INET) r = sd_netlink_message_append_in_addr(m, IFLA_VXLAN_GROUP, &v->remote.in); else r = sd_netlink_message_append_in6_addr(m, IFLA_VXLAN_GROUP6, &v->remote.in6); - if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_GROUP attribute: %m"); } - if (!in_addr_is_null(v->local_family, &v->local)) { - + if (in_addr_is_null(v->local_family, &v->local) == 0) { if (v->local_family == AF_INET) r = sd_netlink_message_append_in_addr(m, IFLA_VXLAN_LOCAL, &v->local.in); else r = sd_netlink_message_append_in6_addr(m, IFLA_VXLAN_LOCAL6, &v->local.in6); - if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_LOCAL attribute: %m"); } diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 3cdbd9e37e..87345fb2d6 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -625,7 +625,7 @@ int address_configure( if (r < 0) return log_error_errno(r, "Could not append IFA_LOCAL attribute: %m"); - if (!in_addr_is_null(address->family, &address->in_addr_peer)) { + if (in_addr_is_null(address->family, &address->in_addr_peer) == 0) { if (address->family == AF_INET) r = sd_netlink_message_append_in_addr(req, IFA_ADDRESS, &address->in_addr_peer.in); else if (address->family == AF_INET6) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 5553a7e3bd..6dd7a07c32 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -408,7 +408,7 @@ int route_remove(Route *route, Link *link, if (r < 0) return log_error_errno(r, "Could not create RTM_DELROUTE message: %m"); - if (!in_addr_is_null(route->family, &route->gw)) { + if (in_addr_is_null(route->family, &route->gw) == 0) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_GATEWAY, &route->gw.in); else if (route->family == AF_INET6) @@ -443,7 +443,7 @@ int route_remove(Route *route, Link *link, return log_error_errno(r, "Could not set source prefix length: %m"); } - if (!in_addr_is_null(route->family, &route->prefsrc)) { + if (in_addr_is_null(route->family, &route->prefsrc) == 0) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc.in); else if (route->family == AF_INET6) @@ -519,7 +519,7 @@ int route_configure( if (r < 0) return log_error_errno(r, "Could not create RTM_NEWROUTE message: %m"); - if (!in_addr_is_null(route->family, &route->gw)) { + if (in_addr_is_null(route->family, &route->gw) == 0) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_GATEWAY, &route->gw.in); else if (route->family == AF_INET6) @@ -558,7 +558,7 @@ int route_configure( return log_error_errno(r, "Could not set source prefix length: %m"); } - if (!in_addr_is_null(route->family, &route->prefsrc)) { + if (in_addr_is_null(route->family, &route->prefsrc) == 0) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc.in); else if (route->family == AF_INET6) diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 2dc78622ce..e5805ab0ea 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -369,12 +369,11 @@ int routing_policy_rule_remove(RoutingPolicyRule *routing_policy_rule, Link *lin if (r < 0) return log_error_errno(r, "Could not allocate RTM_DELRULE message: %m"); - if (!in_addr_is_null(routing_policy_rule->family, &routing_policy_rule->from)) { + if (in_addr_is_null(routing_policy_rule->family, &routing_policy_rule->from) == 0) { if (routing_policy_rule->family == AF_INET) r = sd_netlink_message_append_in_addr(m, FRA_SRC, &routing_policy_rule->from.in); else r = sd_netlink_message_append_in6_addr(m, FRA_SRC, &routing_policy_rule->from.in6); - if (r < 0) return log_error_errno(r, "Could not append FRA_SRC attribute: %m"); @@ -383,12 +382,11 @@ int routing_policy_rule_remove(RoutingPolicyRule *routing_policy_rule, Link *lin return log_error_errno(r, "Could not set source prefix length: %m"); } - if (!in_addr_is_null(routing_policy_rule->family, &routing_policy_rule->to)) { + if (in_addr_is_null(routing_policy_rule->family, &routing_policy_rule->to) == 0) { if (routing_policy_rule->family == AF_INET) r = sd_netlink_message_append_in_addr(m, FRA_DST, &routing_policy_rule->to.in); else r = sd_netlink_message_append_in6_addr(m, FRA_DST, &routing_policy_rule->to.in6); - if (r < 0) return log_error_errno(r, "Could not append FRA_DST attribute: %m"); @@ -496,12 +494,11 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl if (r < 0) return log_error_errno(r, "Could not allocate RTM_NEWRULE message: %m"); - if (!in_addr_is_null(rule->family, &rule->from)) { + if (in_addr_is_null(rule->family, &rule->from) == 0) { if (rule->family == AF_INET) r = sd_netlink_message_append_in_addr(m, FRA_SRC, &rule->from.in); else r = sd_netlink_message_append_in6_addr(m, FRA_SRC, &rule->from.in6); - if (r < 0) return log_error_errno(r, "Could not append FRA_SRC attribute: %m"); @@ -510,12 +507,11 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl return log_error_errno(r, "Could not set source prefix length: %m"); } - if (!in_addr_is_null(rule->family, &rule->to)) { + if (in_addr_is_null(rule->family, &rule->to) == 0) { if (rule->family == AF_INET) r = sd_netlink_message_append_in_addr(m, FRA_DST, &rule->to.in); else r = sd_netlink_message_append_in6_addr(m, FRA_DST, &rule->to.in6); - if (r < 0) return log_error_errno(r, "Could not append FRA_DST attribute: %m"); From 3f7cc0809dbac5409eaf86e242c5133494eba9da Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 00:24:17 +0100 Subject: [PATCH 03/12] network: coding style fixes --- src/network/netdev/bond.c | 36 ++++++++++++++++-------------------- src/network/netdev/geneve.c | 2 +- src/network/netdev/tunnel.c | 3 +-- src/network/networkd-link.c | 8 ++++---- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/network/netdev/bond.c b/src/network/netdev/bond.c index 550a7f8914..57f82a8f10 100644 --- a/src/network/netdev/bond.c +++ b/src/network/netdev/bond.c @@ -177,22 +177,21 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin assert(b); if (b->mode != _NETDEV_BOND_MODE_INVALID) { - r = sd_netlink_message_append_u8(m, IFLA_BOND_MODE, - bond_mode_to_kernel(b->mode)); + r = sd_netlink_message_append_u8(m, IFLA_BOND_MODE, bond_mode_to_kernel(b->mode)); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_MODE attribute: %m"); } if (b->xmit_hash_policy != _NETDEV_BOND_XMIT_HASH_POLICY_INVALID) { r = sd_netlink_message_append_u8(m, IFLA_BOND_XMIT_HASH_POLICY, - bond_xmit_hash_policy_to_kernel(b->xmit_hash_policy)); + bond_xmit_hash_policy_to_kernel(b->xmit_hash_policy)); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_XMIT_HASH_POLICY attribute: %m"); } if (b->lacp_rate != _NETDEV_BOND_LACP_RATE_INVALID && b->mode == NETDEV_BOND_MODE_802_3AD) { - r = sd_netlink_message_append_u8(m, IFLA_BOND_AD_LACP_RATE, b->lacp_rate ); + r = sd_netlink_message_append_u8(m, IFLA_BOND_AD_LACP_RATE, b->lacp_rate); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_AD_LACP_RATE attribute: %m"); } @@ -220,8 +219,8 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_INTERVAL attribute: %m"); - if ((b->lp_interval >= LEARNING_PACKETS_INTERVAL_MIN_SEC) && - (b->lp_interval <= LEARNING_PACKETS_INTERVAL_MAX_SEC)) { + if (b->lp_interval >= LEARNING_PACKETS_INTERVAL_MIN_SEC && + b->lp_interval <= LEARNING_PACKETS_INTERVAL_MAX_SEC) { r = sd_netlink_message_append_u32(m, IFLA_BOND_LP_INTERVAL, b->lp_interval / USEC_PER_SEC); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_LP_INTERVAL attribute: %m"); @@ -313,23 +312,20 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_TLB_DYNAMIC_LB attribute: %m"); } - if (b->arp_interval > 0) { - if (b->n_arp_ip_targets > 0) { + if (b->arp_interval > 0 && b->n_arp_ip_targets > 0) { + r = sd_netlink_message_open_container(m, IFLA_BOND_ARP_IP_TARGET); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not open contaniner IFLA_BOND_ARP_IP_TARGET : %m"); - r = sd_netlink_message_open_container(m, IFLA_BOND_ARP_IP_TARGET); + LIST_FOREACH(arp_ip_target, target, b->arp_ip_targets) { + r = sd_netlink_message_append_u32(m, i++, target->ip.in.s_addr); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not open contaniner IFLA_BOND_ARP_IP_TARGET : %m"); - - LIST_FOREACH(arp_ip_target, target, b->arp_ip_targets) { - r = sd_netlink_message_append_u32(m, i++, target->ip.in.s_addr); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_ALL_TARGETS attribute: %m"); - } - - r = sd_netlink_message_close_container(m); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not close contaniner IFLA_BOND_ARP_IP_TARGET : %m"); + return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_ALL_TARGETS attribute: %m"); } + + r = sd_netlink_message_close_container(m); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not close contaniner IFLA_BOND_ARP_IP_TARGET : %m"); } return 0; diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index a5c52bbf82..6970423d4b 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -92,7 +92,7 @@ static int netdev_geneve_create(NetDev *netdev) { return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_GROUP attribute: %m"); } - if (v->ttl) { + if (v->ttl > 0) { r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL, v->ttl); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL attribute: %m"); diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index c7058b3bec..48b8d42398 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -66,7 +66,6 @@ static int netdev_ipip_fill_message_create(NetDev *netdev, Link *link, sd_netlin return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_PMTUDISC attribute: %m"); if (t->fou_tunnel) { - r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_TYPE, t->fou_encap_type); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_TYPE attribute: %m"); @@ -430,7 +429,7 @@ static int netdev_ip6tnl_fill_message_create(NetDev *netdev, Link *link, sd_netl if (t->copy_dscp) t->flags |= IP6_TNL_F_RCV_DSCP_COPY; - if (t->allow_localremote != -1) + if (t->allow_localremote >= 0) SET_FLAG(t->flags, IP6_TNL_F_ALLOW_LOCAL_REMOTE, t->allow_localremote); if (t->encap_limit != IPV6_DEFAULT_TNL_ENCAP_LIMIT) { diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 736373ae34..c02a419a29 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -881,9 +881,9 @@ void link_check_ready(Link *link) { if (!link->network->bridge) { - if (link_ipv6ll_enabled(link)) - if (in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address) > 0) - return; + if (link_ipv6ll_enabled(link) && + in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address)) + return; if ((link_dhcp4_enabled(link) && !link_dhcp6_enabled(link) && !link->dhcp4_configured) || @@ -1734,7 +1734,7 @@ static int link_acquire_conf(Link *link) { if (r < 0) return r; - if (in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address) == 0) { + if (!in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address)) { r = link_acquire_ipv6_conf(link); if (r < 0) return r; From bd930cbdebd4f9605937818248a132dc6dd749e3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 00:25:06 +0100 Subject: [PATCH 04/12] network: shorten code by using SYNTHETIC_ERRNO() --- src/network/netdev/tunnel.c | 45 ++++++++++++++----------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 48b8d42398..3e5f5dc96e 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -505,42 +505,31 @@ static int netdev_tunnel_verify(NetDev *netdev, const char *filename) { assert(t); - if (!IN_SET(t->family, AF_INET, AF_INET6, AF_UNSPEC)) { - log_netdev_error(netdev, - "Tunnel with invalid address family configured in %s. Ignoring", filename); - return -EINVAL; - } + if (!IN_SET(t->family, AF_INET, AF_INET6, AF_UNSPEC)) + return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "Tunnel with invalid address family configured in %s. Ignoring", filename); if (IN_SET(netdev->kind, NETDEV_KIND_VTI, NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE, NETDEV_KIND_GRETAP, NETDEV_KIND_ERSPAN) && - (t->family != AF_INET || in_addr_is_null(t->family, &t->local))) { - log_netdev_error(netdev, - "vti/ipip/sit/gre/gretap/erspan tunnel without a local IPv4 address configured in %s. Ignoring", filename); - return -EINVAL; - } + (t->family != AF_INET || in_addr_is_null(t->family, &t->local))) + return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "vti/ipip/sit/gre/gretap/erspan tunnel without a local IPv4 address configured in %s. Ignoring", filename); if (IN_SET(netdev->kind, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP) && - (t->family != AF_INET6 || in_addr_is_null(t->family, &t->local))) { - log_netdev_error(netdev, - "vti6/ip6tnl/ip6gre/ip6gretap tunnel without a local IPv6 address configured in %s. Ignoring", filename); - return -EINVAL; - } + (t->family != AF_INET6 || in_addr_is_null(t->family, &t->local))) + return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "vti6/ip6tnl/ip6gre/ip6gretap tunnel without a local IPv6 address configured in %s. Ignoring", filename); if (netdev->kind == NETDEV_KIND_IP6TNL && - t->ip6tnl_mode == _NETDEV_IP6_TNL_MODE_INVALID) { - log_netdev_error(netdev, - "ip6tnl without mode configured in %s. Ignoring", filename); - return -EINVAL; - } + t->ip6tnl_mode == _NETDEV_IP6_TNL_MODE_INVALID) + return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "ip6tnl without mode configured in %s. Ignoring", filename); - if (t->fou_tunnel && t->fou_destination_port <= 0) { - log_netdev_error(netdev, "FooOverUDP missing port configured in %s. Ignoring", filename); - return -EINVAL; - } + if (t->fou_tunnel && t->fou_destination_port <= 0) + return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "FooOverUDP missing port configured in %s. Ignoring", filename); - if (netdev->kind == NETDEV_KIND_ERSPAN && (t->erspan_index >= (1 << 20) || t->erspan_index == 0)) { - log_netdev_error(netdev, "Invalid erspan index %d. Ignoring", t->erspan_index); - return -EINVAL; - } + if (netdev->kind == NETDEV_KIND_ERSPAN && (t->erspan_index >= (1 << 20) || t->erspan_index == 0)) + return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), "Invalid erspan index %d. Ignoring", t->erspan_index); return 0; } From 67b19a496173e0401e9f2b7a3591715e0fe22b75 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 01:06:23 +0100 Subject: [PATCH 05/12] sd-netlink: unify sd_netlink_message_append_in{,6}_addr() and _sockaddr_in{,6}() --- src/libsystemd/sd-netlink/netlink-message.c | 51 +++++++-------------- src/libsystemd/sd-netlink/netlink-util.h | 5 ++ 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index 5e9bc45139..f878fc9471 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -334,36 +334,46 @@ int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, c return 0; } -int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data) { +int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); + assert_return(IN_SET(family, AF_INET, AF_INET6), -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_IN_ADDR); if (r < 0) return r; - r = add_rtattr(m, type, data, sizeof(struct in_addr)); + r = add_rtattr(m, type, data, FAMILY_ADDRESS_SIZE(family)); if (r < 0) return r; return 0; } +int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data) { + return netlink_message_append_in_addr_union(m, type, AF_INET, (const union in_addr_union *) data); +} + int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data) { + return netlink_message_append_in_addr_union(m, type, AF_INET6, (const union in_addr_union *) data); +} + +int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); + assert_return(IN_SET(data->sa.sa_family, AF_INET, AF_INET6), -EINVAL); - r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_IN_ADDR); + r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); if (r < 0) return r; - r = add_rtattr(m, type, data, sizeof(struct in6_addr)); + r = add_rtattr(m, type, data, data->sa.sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)); if (r < 0) return r; @@ -371,41 +381,14 @@ int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short typ } int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data) { - int r; - - assert_return(m, -EINVAL); - assert_return(!m->sealed, -EPERM); - assert_return(data, -EINVAL); - - r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); - if (r < 0) - return r; - - r = add_rtattr(m, type, data, sizeof(struct sockaddr_in)); - if (r < 0) - return r; - - return 0; + return netlink_message_append_sockaddr_union(m, type, (const union sockaddr_union *) data); } int sd_netlink_message_append_sockaddr_in6(sd_netlink_message *m, unsigned short type, const struct sockaddr_in6 *data) { - int r; - - assert_return(m, -EINVAL); - assert_return(!m->sealed, -EPERM); - assert_return(data, -EINVAL); - - r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); - if (r < 0) - return r; - - r = add_rtattr(m, type, data, sizeof(struct sockaddr_in6)); - if (r < 0) - return r; - - return 0; + return netlink_message_append_sockaddr_union(m, type, (const union sockaddr_union *) data); } + int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data) { int r; diff --git a/src/libsystemd/sd-netlink/netlink-util.h b/src/libsystemd/sd-netlink/netlink-util.h index d2723285a6..0d01a4bd0e 100644 --- a/src/libsystemd/sd-netlink/netlink-util.h +++ b/src/libsystemd/sd-netlink/netlink-util.h @@ -3,6 +3,8 @@ #include "sd-netlink.h" +#include "in-addr-util.h" +#include "socket-util.h" #include "util.h" int rtnl_message_new_synthetic_error(sd_netlink *rtnl, int error, uint32_t serial, sd_netlink_message **ret); @@ -58,3 +60,6 @@ int rtnl_log_create_error(int r); (sd_netlink_destroy_t) _destroy_, \ userdata, __func__); \ }) + +int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data); +int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data); From 434094864c050c3c406067b231da782731c0ab38 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 01:47:25 +0100 Subject: [PATCH 06/12] network: use netlink_message_append_{in_addr,sockaddr}_union() --- src/network/netdev/wireguard.c | 17 ++++----- src/network/networkd-address.c | 15 ++------ src/network/networkd-neighbor.c | 17 ++------- src/network/networkd-route.c | 40 +++++----------------- src/network/networkd-routing-policy-rule.c | 20 +++-------- 5 files changed, 25 insertions(+), 84 deletions(-) diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index 0c0b16d1da..7d35afae6d 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -11,6 +11,7 @@ #include "alloc-util.h" #include "fd-util.h" #include "hexdecoct.h" +#include "netlink-util.h" #include "networkd-link.h" #include "networkd-manager.h" #include "networkd-util.h" @@ -62,10 +63,7 @@ static int wireguard_set_ipmask_one(NetDev *netdev, sd_netlink_message *message, if (r < 0) goto cancel; - if (mask->family == AF_INET) - r = sd_netlink_message_append_in_addr(message, WGALLOWEDIP_A_IPADDR, &mask->ip.in); - else if (mask->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(message, WGALLOWEDIP_A_IPADDR, &mask->ip.in6); + r = netlink_message_append_in_addr_union(message, WGALLOWEDIP_A_IPADDR, mask->family, &mask->ip); if (r < 0) goto cancel; @@ -122,12 +120,11 @@ static int wireguard_set_peer_one(NetDev *netdev, sd_netlink_message *message, c if (r < 0) goto cancel; - if (peer->endpoint.sa.sa_family == AF_INET) - r = sd_netlink_message_append_sockaddr_in(message, WGPEER_A_ENDPOINT, &peer->endpoint.in); - else if (peer->endpoint.sa.sa_family == AF_INET6) - r = sd_netlink_message_append_sockaddr_in6(message, WGPEER_A_ENDPOINT, &peer->endpoint.in6); - if (r < 0) - goto cancel; + if (IN_SET(peer->endpoint.sa.sa_family, AF_INET, AF_INET6)) { + r = netlink_message_append_sockaddr_union(message, WGPEER_A_ENDPOINT, &peer->endpoint); + if (r < 0) + goto cancel; + } } r = sd_netlink_message_open_container(message, WGPEER_A_ALLOWEDIPS); diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 87345fb2d6..06e2662cdd 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -469,10 +469,7 @@ int address_remove( if (r < 0) return log_error_errno(r, "Could not set prefixlen: %m"); - if (address->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, IFA_LOCAL, &address->in_addr.in); - else if (address->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, IFA_LOCAL, &address->in_addr.in6); + r = netlink_message_append_in_addr_union(req, IFA_LOCAL, address->family, &address->in_addr); if (r < 0) return log_error_errno(r, "Could not append IFA_LOCAL attribute: %m"); @@ -618,18 +615,12 @@ int address_configure( if (r < 0) return log_error_errno(r, "Could not set scope: %m"); - if (address->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, IFA_LOCAL, &address->in_addr.in); - else if (address->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, IFA_LOCAL, &address->in_addr.in6); + r = netlink_message_append_in_addr_union(req, IFA_LOCAL, address->family, &address->in_addr); if (r < 0) return log_error_errno(r, "Could not append IFA_LOCAL attribute: %m"); if (in_addr_is_null(address->family, &address->in_addr_peer) == 0) { - if (address->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, IFA_ADDRESS, &address->in_addr_peer.in); - else if (address->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, IFA_ADDRESS, &address->in_addr_peer.in6); + r = netlink_message_append_in_addr_union(req, IFA_ADDRESS, address->family, &address->in_addr_peer); if (r < 0) return log_error_errno(r, "Could not append IFA_ADDRESS attribute: %m"); } else if (address->family == AF_INET && address->prefixlen <= 30) { diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c index 254a60bdc3..713bad2bba 100644 --- a/src/network/networkd-neighbor.c +++ b/src/network/networkd-neighbor.c @@ -137,20 +137,9 @@ int neighbor_configure(Neighbor *neighbor, Link *link, link_netlink_message_hand if (r < 0) return log_error_errno(r, "Could not append NDA_LLADDR attribute: %m"); - switch (neighbor->family) { - case AF_INET6: - r = sd_netlink_message_append_in6_addr(req, NDA_DST, &neighbor->in_addr.in6); - if (r < 0) - return log_error_errno(r, "Could not append NDA_DST attribute: %m"); - break; - case AF_INET: - r = sd_netlink_message_append_in_addr(req, NDA_DST, &neighbor->in_addr.in); - if (r < 0) - return log_error_errno(r, "Could not append NDA_DST attribute: %m"); - break; - default: - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Neighbor with invalid address family"); - } + r = netlink_message_append_in_addr_union(req, NDA_DST, neighbor->family, &neighbor->in_addr); + if (r < 0) + return log_error_errno(r, "Could not append NDA_DST attribute: %m"); r = netlink_call_async(link->manager->rtnl, NULL, req, callback ?: neighbor_handler, link_netlink_destroy_callback, link); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 6dd7a07c32..2d174fafde 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -409,19 +409,13 @@ int route_remove(Route *route, Link *link, return log_error_errno(r, "Could not create RTM_DELROUTE message: %m"); if (in_addr_is_null(route->family, &route->gw) == 0) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_GATEWAY, &route->gw.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_GATEWAY, &route->gw.in6); + r = netlink_message_append_in_addr_union(req, RTA_GATEWAY, route->family, &route->gw); if (r < 0) return log_error_errno(r, "Could not append RTA_GATEWAY attribute: %m"); } if (route->dst_prefixlen) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_DST, &route->dst.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_DST, &route->dst.in6); + r = netlink_message_append_in_addr_union(req, RTA_DST, route->family, &route->dst); if (r < 0) return log_error_errno(r, "Could not append RTA_DST attribute: %m"); @@ -431,10 +425,7 @@ int route_remove(Route *route, Link *link, } if (route->src_prefixlen) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_SRC, &route->src.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_SRC, &route->src.in6); + r = netlink_message_append_in_addr_union(req, RTA_SRC, route->family, &route->src); if (r < 0) return log_error_errno(r, "Could not append RTA_SRC attribute: %m"); @@ -444,10 +435,7 @@ int route_remove(Route *route, Link *link, } if (in_addr_is_null(route->family, &route->prefsrc) == 0) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc.in6); + r = netlink_message_append_in_addr_union(req, RTA_PREFSRC, route->family, &route->prefsrc); if (r < 0) return log_error_errno(r, "Could not append RTA_PREFSRC attribute: %m"); } @@ -520,10 +508,7 @@ int route_configure( return log_error_errno(r, "Could not create RTM_NEWROUTE message: %m"); if (in_addr_is_null(route->family, &route->gw) == 0) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_GATEWAY, &route->gw.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_GATEWAY, &route->gw.in6); + r = netlink_message_append_in_addr_union(req, RTA_GATEWAY, route->family, &route->gw); if (r < 0) return log_error_errno(r, "Could not append RTA_GATEWAY attribute: %m"); @@ -533,10 +518,7 @@ int route_configure( } if (route->dst_prefixlen) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_DST, &route->dst.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_DST, &route->dst.in6); + r = netlink_message_append_in_addr_union(req, RTA_DST, route->family, &route->dst); if (r < 0) return log_error_errno(r, "Could not append RTA_DST attribute: %m"); @@ -546,10 +528,7 @@ int route_configure( } if (route->src_prefixlen) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_SRC, &route->src.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_SRC, &route->src.in6); + r = netlink_message_append_in_addr_union(req, RTA_SRC, route->family, &route->src); if (r < 0) return log_error_errno(r, "Could not append RTA_SRC attribute: %m"); @@ -559,10 +538,7 @@ int route_configure( } if (in_addr_is_null(route->family, &route->prefsrc) == 0) { - if (route->family == AF_INET) - r = sd_netlink_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc.in); - else if (route->family == AF_INET6) - r = sd_netlink_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc.in6); + r = netlink_message_append_in_addr_union(req, RTA_PREFSRC, route->family, &route->prefsrc); if (r < 0) return log_error_errno(r, "Could not append RTA_PREFSRC attribute: %m"); } diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index e5805ab0ea..dd15574817 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -370,10 +370,7 @@ int routing_policy_rule_remove(RoutingPolicyRule *routing_policy_rule, Link *lin return log_error_errno(r, "Could not allocate RTM_DELRULE message: %m"); if (in_addr_is_null(routing_policy_rule->family, &routing_policy_rule->from) == 0) { - if (routing_policy_rule->family == AF_INET) - r = sd_netlink_message_append_in_addr(m, FRA_SRC, &routing_policy_rule->from.in); - else - r = sd_netlink_message_append_in6_addr(m, FRA_SRC, &routing_policy_rule->from.in6); + r = netlink_message_append_in_addr_union(m, FRA_SRC, routing_policy_rule->family, &routing_policy_rule->from); if (r < 0) return log_error_errno(r, "Could not append FRA_SRC attribute: %m"); @@ -383,10 +380,7 @@ int routing_policy_rule_remove(RoutingPolicyRule *routing_policy_rule, Link *lin } if (in_addr_is_null(routing_policy_rule->family, &routing_policy_rule->to) == 0) { - if (routing_policy_rule->family == AF_INET) - r = sd_netlink_message_append_in_addr(m, FRA_DST, &routing_policy_rule->to.in); - else - r = sd_netlink_message_append_in6_addr(m, FRA_DST, &routing_policy_rule->to.in6); + r = netlink_message_append_in_addr_union(m, FRA_DST, routing_policy_rule->family, &routing_policy_rule->to); if (r < 0) return log_error_errno(r, "Could not append FRA_DST attribute: %m"); @@ -495,10 +489,7 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl return log_error_errno(r, "Could not allocate RTM_NEWRULE message: %m"); if (in_addr_is_null(rule->family, &rule->from) == 0) { - if (rule->family == AF_INET) - r = sd_netlink_message_append_in_addr(m, FRA_SRC, &rule->from.in); - else - r = sd_netlink_message_append_in6_addr(m, FRA_SRC, &rule->from.in6); + r = netlink_message_append_in_addr_union(m, FRA_SRC, rule->family, &rule->from); if (r < 0) return log_error_errno(r, "Could not append FRA_SRC attribute: %m"); @@ -508,10 +499,7 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl } if (in_addr_is_null(rule->family, &rule->to) == 0) { - if (rule->family == AF_INET) - r = sd_netlink_message_append_in_addr(m, FRA_DST, &rule->to.in); - else - r = sd_netlink_message_append_in6_addr(m, FRA_DST, &rule->to.in6); + r = netlink_message_append_in_addr_union(m, FRA_DST, rule->family, &rule->to); if (r < 0) return log_error_errno(r, "Could not append FRA_DST attribute: %m"); From 10490d902588a968bfe17bac2c46aa87142b783c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 01:50:27 +0100 Subject: [PATCH 07/12] network/geneve: fix log message --- src/network/netdev/geneve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index 6970423d4b..0fb09961d6 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -89,7 +89,7 @@ static int netdev_geneve_create(NetDev *netdev) { else r = sd_netlink_message_append_in6_addr(m, IFLA_GENEVE_REMOTE6, &v->remote.in6); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_GROUP attribute: %m"); + return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_REMOTE/IFLA_GENEVE_REMOTE6 attribute: %m"); } if (v->ttl > 0) { From 3affe303d3a7fd3bf3e2aae36062f18b1cdd9591 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 02:47:08 +0100 Subject: [PATCH 08/12] network: unify netdev_vti{,6}_fill_message_create() --- src/network/netdev/tunnel.c | 74 ++++++++----------------------------- 1 file changed, 16 insertions(+), 58 deletions(-) diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 3e5f5dc96e..5df93705e9 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -14,6 +14,7 @@ #include "conf-parser.h" #include "missing.h" +#include "netlink-util.h" #include "networkd-link.h" #include "netdev/tunnel.h" #include "parse-util.h" @@ -300,11 +301,12 @@ static int netdev_ip6gre_fill_message_create(NetDev *netdev, Link *link, sd_netl return r; } -static int netdev_vti_fill_message_key(NetDev *netdev, Link *link, sd_netlink_message *m) { +static int netdev_vti_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { uint32_t ikey, okey; Tunnel *t; int r; + assert(netdev); assert(m); if (netdev->kind == NETDEV_KIND_VTI) @@ -313,6 +315,14 @@ static int netdev_vti_fill_message_key(NetDev *netdev, Link *link, sd_netlink_me t = VTI6(netdev); assert(t); + assert((netdev->kind == NETDEV_KIND_VTI && t->family == AF_INET) || + (netdev->kind == NETDEV_KIND_VTI6 && t->family == AF_INET6)); + + if (link) { + r = sd_netlink_message_append_u32(m, IFLA_VTI_LINK, link->ifindex); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_VTI_LINK attribute: %m"); + } if (t->key != 0) ikey = okey = htobe32(t->key); @@ -329,65 +339,13 @@ static int netdev_vti_fill_message_key(NetDev *netdev, Link *link, sd_netlink_me if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_VTI_OKEY attribute: %m"); - return 0; -} - -static int netdev_vti_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { - Tunnel *t = VTI(netdev); - int r; - - assert(netdev); - assert(m); - assert(t); - assert(t->family == AF_INET); - - if (link) { - r = sd_netlink_message_append_u32(m, IFLA_VTI_LINK, link->ifindex); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_LINK attribute: %m"); - } - - r = netdev_vti_fill_message_key(netdev, link, m); + r = netlink_message_append_in_addr_union(m, IFLA_VTI_LOCAL, t->family, &t->local); if (r < 0) - return r; + return log_netdev_error_errno(netdev, r, "Could not append IFLA_VTI_LOCAL attribute: %m"); - r = sd_netlink_message_append_in_addr(m, IFLA_VTI_LOCAL, &t->local.in); + r = netlink_message_append_in_addr_union(m, IFLA_VTI_REMOTE, t->family, &t->remote); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_LOCAL attribute: %m"); - - r = sd_netlink_message_append_in_addr(m, IFLA_VTI_REMOTE, &t->remote.in); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_REMOTE attribute: %m"); - - return r; -} - -static int netdev_vti6_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { - Tunnel *t = VTI6(netdev); - int r; - - assert(netdev); - assert(m); - assert(t); - assert(t->family == AF_INET6); - - if (link) { - r = sd_netlink_message_append_u32(m, IFLA_VTI_LINK, link->ifindex); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_LINK attribute: %m"); - } - - r = netdev_vti_fill_message_key(netdev, link, m); - if (r < 0) - return r; - - r = sd_netlink_message_append_in6_addr(m, IFLA_VTI_LOCAL, &t->local.in6); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_LOCAL attribute: %m"); - - r = sd_netlink_message_append_in6_addr(m, IFLA_VTI_REMOTE, &t->remote.in6); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_REMOTE attribute: %m"); + return log_netdev_error_errno(netdev, r, "Could not append IFLA_VTI_REMOTE attribute: %m"); return r; } @@ -864,7 +822,7 @@ const NetDevVTable vti6_vtable = { .object_size = sizeof(Tunnel), .init = vti_init, .sections = "Match\0NetDev\0Tunnel\0", - .fill_message_create = netdev_vti6_fill_message_create, + .fill_message_create = netdev_vti_fill_message_create, .create_type = NETDEV_CREATE_STACKED, .config_verify = netdev_tunnel_verify, }; From 9e64c1f8b508eca594042e2294c1e6d5efeb2e93 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 02:49:09 +0100 Subject: [PATCH 09/12] network: unify netdev_{ipip,sit}_fill_message_create() --- src/network/netdev/tunnel.c | 102 ++++++++++++++---------------------- 1 file changed, 38 insertions(+), 64 deletions(-) diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 5df93705e9..0ea1679f9d 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -35,59 +35,17 @@ static const char* const ip6tnl_mode_table[_NETDEV_IP6_TNL_MODE_MAX] = { DEFINE_STRING_TABLE_LOOKUP(ip6tnl_mode, Ip6TnlMode); DEFINE_CONFIG_PARSE_ENUM(config_parse_ip6tnl_mode, ip6tnl_mode, Ip6TnlMode, "Failed to parse ip6 tunnel Mode"); -static int netdev_ipip_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { - Tunnel *t = IPIP(netdev); +static int netdev_ipip_sit_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { + Tunnel *t; int r; assert(netdev); - assert(m); - assert(t); - assert(IN_SET(t->family, AF_INET, AF_UNSPEC)); - if (link) { - r = sd_netlink_message_append_u32(m, IFLA_IPTUN_LINK, link->ifindex); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_LINK attribute: %m"); - } + if (netdev->kind == NETDEV_KIND_IPIP) + t = IPIP(netdev); + else + t = SIT(netdev); - r = sd_netlink_message_append_in_addr(m, IFLA_IPTUN_LOCAL, &t->local.in); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_LOCAL attribute: %m"); - - r = sd_netlink_message_append_in_addr(m, IFLA_IPTUN_REMOTE, &t->remote.in); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_REMOTE attribute: %m"); - - r = sd_netlink_message_append_u8(m, IFLA_IPTUN_TTL, t->ttl); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_TTL attribute: %m"); - - r = sd_netlink_message_append_u8(m, IFLA_IPTUN_PMTUDISC, t->pmtudisc); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_PMTUDISC attribute: %m"); - - if (t->fou_tunnel) { - r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_TYPE, t->fou_encap_type); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_TYPE attribute: %m"); - - r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_SPORT, htobe16(t->encap_src_port)); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_SPORT attribute: %m"); - - r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_DPORT, htobe16(t->fou_destination_port)); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_DPORT attribute: %m"); - } - - return r; -} - -static int netdev_sit_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { - Tunnel *t = SIT(netdev); - int r; - - assert(netdev); assert(m); assert(t); assert(IN_SET(t->family, AF_INET, AF_UNSPEC)); @@ -114,27 +72,43 @@ static int netdev_sit_fill_message_create(NetDev *netdev, Link *link, sd_netlink if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_PMTUDISC attribute: %m"); - if (t->sixrd_prefixlen > 0) { - r = sd_netlink_message_append_in6_addr(m, IFLA_IPTUN_6RD_PREFIX, &t->sixrd_prefix); + if (netdev->kind == NETDEV_KIND_IPIP && t->fou_tunnel) { + r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_TYPE, t->fou_encap_type); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_6RD_PREFIX attribute: %m"); + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_TYPE attribute: %m"); - /* u16 is deliberate here, even though we're passing a netmask that can never be >128. The kernel is - * expecting to receive the prefixlen as a u16. - */ - r = sd_netlink_message_append_u16(m, IFLA_IPTUN_6RD_PREFIXLEN, t->sixrd_prefixlen); + r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_SPORT, htobe16(t->encap_src_port)); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_6RD_PREFIXLEN attribute: %m"); + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_SPORT attribute: %m"); + + r = sd_netlink_message_append_u16(m, IFLA_IPTUN_ENCAP_DPORT, htobe16(t->fou_destination_port)); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_DPORT attribute: %m"); } - if (t->isatap >= 0) { - uint16_t flags = 0; + if (netdev->kind == NETDEV_KIND_SIT) { + if (t->sixrd_prefixlen > 0) { + r = sd_netlink_message_append_in6_addr(m, IFLA_IPTUN_6RD_PREFIX, &t->sixrd_prefix); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_6RD_PREFIX attribute: %m"); - SET_FLAG(flags, SIT_ISATAP, t->isatap); + /* u16 is deliberate here, even though we're passing a netmask that can never be >128. The kernel is + * expecting to receive the prefixlen as a u16. + */ + r = sd_netlink_message_append_u16(m, IFLA_IPTUN_6RD_PREFIXLEN, t->sixrd_prefixlen); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_6RD_PREFIXLEN attribute: %m"); + } - r = sd_netlink_message_append_u16(m, IFLA_IPTUN_FLAGS, flags); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_FLAGS attribute: %m"); + if (t->isatap >= 0) { + uint16_t flags = 0; + + SET_FLAG(flags, SIT_ISATAP, t->isatap); + + r = sd_netlink_message_append_u16(m, IFLA_IPTUN_FLAGS, flags); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_FLAGS attribute: %m"); + } } return r; @@ -795,7 +769,7 @@ const NetDevVTable ipip_vtable = { .object_size = sizeof(Tunnel), .init = ipip_init, .sections = "Match\0NetDev\0Tunnel\0", - .fill_message_create = netdev_ipip_fill_message_create, + .fill_message_create = netdev_ipip_sit_fill_message_create, .create_type = NETDEV_CREATE_STACKED, .config_verify = netdev_tunnel_verify, }; @@ -804,7 +778,7 @@ const NetDevVTable sit_vtable = { .object_size = sizeof(Tunnel), .init = sit_init, .sections = "Match\0NetDev\0Tunnel\0", - .fill_message_create = netdev_sit_fill_message_create, + .fill_message_create = netdev_ipip_sit_fill_message_create, .create_type = NETDEV_CREATE_STACKED, .config_verify = netdev_tunnel_verify, }; From b7c2bb4c9e5ecaa8c27833f00df41be5ae4770c3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 02:50:37 +0100 Subject: [PATCH 10/12] network: refuse AF_UNSPEC for Tunnel devices --- src/network/netdev/tunnel.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 0ea1679f9d..9ee6853415 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -48,7 +48,7 @@ static int netdev_ipip_sit_fill_message_create(NetDev *netdev, Link *link, sd_ne assert(m); assert(t); - assert(IN_SET(t->family, AF_INET, AF_UNSPEC)); + assert(t->family == AF_INET); if (link) { r = sd_netlink_message_append_u32(m, IFLA_IPTUN_LINK, link->ifindex); @@ -126,7 +126,7 @@ static int netdev_gre_fill_message_create(NetDev *netdev, Link *link, sd_netlink t = GRETAP(netdev); assert(t); - assert(IN_SET(t->family, AF_INET, AF_UNSPEC)); + assert(t->family == AF_INET); assert(m); if (link) { @@ -171,7 +171,7 @@ static int netdev_erspan_fill_message_create(NetDev *netdev, Link *link, sd_netl t = ERSPAN(netdev); assert(t); - assert(IN_SET(t->family, AF_INET, AF_UNSPEC)); + assert(t->family == AF_INET); assert(m); r = sd_netlink_message_append_u32(m, IFLA_GRE_ERSPAN_INDEX, t->erspan_index); @@ -437,10 +437,6 @@ static int netdev_tunnel_verify(NetDev *netdev, const char *filename) { assert(t); - if (!IN_SET(t->family, AF_INET, AF_INET6, AF_UNSPEC)) - return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), - "Tunnel with invalid address family configured in %s. Ignoring", filename); - if (IN_SET(netdev->kind, NETDEV_KIND_VTI, NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE, NETDEV_KIND_GRETAP, NETDEV_KIND_ERSPAN) && (t->family != AF_INET || in_addr_is_null(t->family, &t->local))) return log_netdev_error_errno(netdev, SYNTHETIC_ERRNO(EINVAL), From 4624289279a1a37336b09d76cb78ab6f83e00d62 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 02:51:09 +0100 Subject: [PATCH 11/12] network/tunnel: fix log message --- src/network/netdev/tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 9ee6853415..90992199ed 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -389,7 +389,7 @@ static int netdev_ip6tnl_fill_message_create(NetDev *netdev, Link *link, sd_netl r = sd_netlink_message_append_u8(m, IFLA_IPTUN_PROTO, proto); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_MODE attribute: %m"); + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_PROTO attribute: %m"); return r; } From af555aa33ed9c5e9e8643dabeff60b496f1f3af7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 02:54:09 +0100 Subject: [PATCH 12/12] man: add missing netdev kind in Tunnel section --- man/systemd.netdev.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index c568a7e7f6..ecfb660b58 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -751,8 +751,9 @@ ip6gre, ip6gretap, vti, - vti6, and - ip6tnl and accepts + vti6, + ip6tnl, and + erspan and accepts the following keys: