From 1176b054e1da1ed8e65bef0b242f71da21b569f8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:12:02 +0900 Subject: [PATCH 01/18] network: shorten code a bit --- src/network/netdev/bond.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/network/netdev/bond.c b/src/network/netdev/bond.c index 43019c3700..248b7b4eef 100644 --- a/src/network/netdev/bond.c +++ b/src/network/netdev/bond.c @@ -376,10 +376,8 @@ int config_parse_arp_ip_target_address(const char *unit, return 0; } - LIST_PREPEND(arp_ip_target, b->arp_ip_targets, buffer); + LIST_PREPEND(arp_ip_target, b->arp_ip_targets, TAKE_PTR(buffer)); b->n_arp_ip_targets++; - - buffer = NULL; } if (b->n_arp_ip_targets > NETDEV_BOND_ARP_TARGETS_MAX) From 8627d1120a5cdc1e4cc70e0ad868ce27ac09bb7c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:13:03 +0900 Subject: [PATCH 02/18] network: invert the order in comparison --- src/network/networkd-fdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/networkd-fdb.c b/src/network/networkd-fdb.c index 694065e3d9..aa0c4c800f 100644 --- a/src/network/networkd-fdb.c +++ b/src/network/networkd-fdb.c @@ -200,7 +200,7 @@ int config_parse_fdb_hwaddr( &fdb_entry->mac_addr->ether_addr_octet[4], &fdb_entry->mac_addr->ether_addr_octet[5]); - if (ETHER_ADDR_LEN != r) { + if (r != ETHER_ADDR_LEN) { log_syntax(unit, LOG_ERR, filename, line, 0, "Not a valid MAC address, ignoring assignment: %s", rvalue); return 0; } From 8a4871c7d1181cb33794b8011a333e6112802055 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:14:07 +0900 Subject: [PATCH 03/18] network: fix indentation --- src/network/networkd-ipv6-proxy-ndp.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/network/networkd-ipv6-proxy-ndp.c b/src/network/networkd-ipv6-proxy-ndp.c index c4e2091142..cb25812260 100644 --- a/src/network/networkd-ipv6-proxy-ndp.c +++ b/src/network/networkd-ipv6-proxy-ndp.c @@ -88,16 +88,16 @@ void ipv6_proxy_ndp_address_free(IPv6ProxyNDPAddress *ipv6_proxy_ndp_address) { } int config_parse_ipv6_proxy_ndp_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) { + 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) { Network *network = userdata; _cleanup_(ipv6_proxy_ndp_address_freep) IPv6ProxyNDPAddress *ipv6_proxy_ndp_address = NULL; From 6b1dec66962cda322556eb8bf130d9ca6f2ec62e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:15:25 +0900 Subject: [PATCH 04/18] network: introduce radv_prefix_delegation_{from,to}_string() --- src/network/networkd-network.h | 5 +++++ src/network/networkd-radv.c | 34 ++++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 1be7d46735..495fac83d3 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -78,6 +78,8 @@ typedef enum RADVPrefixDelegation { RADV_PREFIX_DELEGATION_STATIC, RADV_PREFIX_DELEGATION_DHCP6, RADV_PREFIX_DELEGATION_BOTH, + _RADV_PREFIX_DELEGATION_MAX, + _RADV_PREFIX_DELEGATION_INVALID = -1, } RADVPrefixDelegation; typedef struct NetworkConfigSection { @@ -316,3 +318,6 @@ DHCPUseDomains dhcp_use_domains_from_string(const char *s) _pure_; const char* lldp_mode_to_string(LLDPMode m) _const_; LLDPMode lldp_mode_from_string(const char *s) _pure_; + +const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_; +RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_; diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 9b393d82a0..dc8b24a238 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -12,8 +12,21 @@ #include "parse-util.h" #include "sd-radv.h" #include "string-util.h" +#include "string-table.h" #include "strv.h" +static const char * const radv_prefix_delegation_table[_RADV_PREFIX_DELEGATION_MAX] = { + [RADV_PREFIX_DELEGATION_NONE] = "no", + [RADV_PREFIX_DELEGATION_STATIC] = "static", + [RADV_PREFIX_DELEGATION_DHCP6] = "dhcpv6", + [RADV_PREFIX_DELEGATION_BOTH] = "yes", +}; + +DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN( + radv_prefix_delegation, + RADVPrefixDelegation, + RADV_PREFIX_DELEGATION_BOTH); + int config_parse_router_prefix_delegation( const char *unit, const char *filename, @@ -27,7 +40,7 @@ int config_parse_router_prefix_delegation( void *userdata) { Network *network = userdata; - int d; + RADVPrefixDelegation d; assert(filename); assert(section); @@ -35,21 +48,14 @@ int config_parse_router_prefix_delegation( assert(rvalue); assert(data); - if (streq(rvalue, "static")) - network->router_prefix_delegation = RADV_PREFIX_DELEGATION_STATIC; - else if (streq(rvalue, "dhcpv6")) - network->router_prefix_delegation = RADV_PREFIX_DELEGATION_DHCP6; - else { - d = parse_boolean(rvalue); - if (d > 0) - network->router_prefix_delegation = RADV_PREFIX_DELEGATION_BOTH; - else - network->router_prefix_delegation = RADV_PREFIX_DELEGATION_NONE; - - if (d < 0) - log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Router prefix delegation '%s' is invalid, ignoring assignment: %m", rvalue); + d = radv_prefix_delegation_from_string(rvalue); + if (d < 0) { + log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Invalid router prefix delegation '%s', ignoring assignment.", rvalue); + return 0; } + network->router_prefix_delegation = d; + return 0; } From 5f74e49e8589921a53f53da6a68a767be459b1f9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:15:54 +0900 Subject: [PATCH 05/18] test: add test for radv_prefix_delegation_{from,to}_string() --- src/network/test-network-tables.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/network/test-network-tables.c b/src/network/test-network-tables.c index 521c5c2dc5..cfcfbeebf2 100644 --- a/src/network/test-network-tables.c +++ b/src/network/test-network-tables.c @@ -33,6 +33,7 @@ int main(int argc, char **argv) { test_table(lldp_mode, LLDP_MODE); test_table(netdev_kind, NETDEV_KIND); test_table(nl_union_link_info_data, NL_UNION_LINK_INFO_DATA); + test_table(radv_prefix_delegation, RADV_PREFIX_DELEGATION); test_table(wol, WOL); test_table_sparse(ipvlan_mode, NETDEV_IPVLAN_MODE); From 25ed70f76fc6b830d936e56411f1c1552be87f41 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:17:55 +0900 Subject: [PATCH 06/18] network: fix possible memleak caused by multiple setting of Bridge=, Bond= or VRF= --- src/network/networkd-network.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 8d7795d72c..1890021f51 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -607,14 +607,17 @@ int config_parse_netdev(const char *unit, switch (kind) { case NETDEV_KIND_BRIDGE: + network->bridge = netdev_unref(network->bridge); network->bridge = netdev; break; case NETDEV_KIND_BOND: + network->bond = netdev_unref(network->bond); network->bond = netdev; break; case NETDEV_KIND_VRF: + network->vrf = netdev_unref(network->vrf); network->vrf = netdev; break; From 44386b449b8435096cc17157263281981f1ec079 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:24:57 +0900 Subject: [PATCH 07/18] network: improve readability of config_parse_ifalias() --- src/libsystemd-network/network-internal.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 949798a1d3..d2590d7c46 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -255,11 +255,10 @@ int config_parse_ifalias(const char *unit, return 0; } - free(*s); - if (*n) - *s = TAKE_PTR(n); + if (isempty(n)) + *s = mfree(*s); else - *s = NULL; + free_and_replace(*s, n); return 0; } From 899f0d259d4d3ee277541d2f573c96d22b900f60 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 03:25:22 +0900 Subject: [PATCH 08/18] network: fix memleak in config_parse_hwaddr() Fixes #10615. --- src/libsystemd-network/network-internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index d2590d7c46..d35e3e2ce1 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -293,7 +293,7 @@ int config_parse_hwaddr(const char *unit, return 0; } - *hwaddr = TAKE_PTR(n); + free_and_replace(*hwaddr, n); return 0; } From fd3005f9b86d0c768d43b480c3dbb090439471b1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 16:20:54 +0900 Subject: [PATCH 09/18] network: fix worng offset for .network parser --- src/network/networkd-network-gperf.gperf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index ac924596f3..adbba5f480 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -38,8 +38,8 @@ Link.AllMulticast, config_parse_tristate, Link.Unmanaged, config_parse_bool, 0, offsetof(Network, unmanaged) Link.RequiredForOnline, config_parse_bool, 0, offsetof(Network, required_for_online) Network.Description, config_parse_string, 0, offsetof(Network, description) -Network.Bridge, config_parse_netdev, 0, offsetof(Network, bridge) -Network.Bond, config_parse_netdev, 0, offsetof(Network, bond) +Network.Bridge, config_parse_netdev, 0, 0 +Network.Bond, config_parse_netdev, 0, 0 Network.VLAN, config_parse_netdev, 0, 0 Network.MACVLAN, config_parse_netdev, 0, 0 Network.MACVTAP, config_parse_netdev, 0, 0 From a6306c31760fa6c72386a9d184a522b219fd0e78 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 16:38:17 +0900 Subject: [PATCH 10/18] man: drop duplicated line in systemd.netdev(5) --- man/systemd.netdev.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 7b702e8ed1..c690786130 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -1486,7 +1486,6 @@ Protocol=4 /etc/systemd/network/25-fou-ipip.netdev [NetDev] -[NetDev] Name=ipip-tun Kind=ipip From 6f1a96ded4ee225b17586a3862a4f10fdf126040 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 16:59:06 +0900 Subject: [PATCH 11/18] netdev: also support GENEVE.UDP6ZeroChecksum{Tx,Rx}= After 53c06862c12918ec717ea70918039765212eee95, we prefer Checksum instead of CheckSum. Let's do so for GENEVE netdev. --- src/network/netdev/netdev-gperf.gperf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index f754f230d7..4cf92204ba 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -108,7 +108,9 @@ GENEVE.TOS, config_parse_uint8, 0, GENEVE.TTL, config_parse_uint8, 0, offsetof(Geneve, ttl) GENEVE.UDPChecksum, config_parse_bool, 0, offsetof(Geneve, udpcsum) GENEVE.UDP6ZeroCheckSumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx) +GENEVE.UDP6ZeroChecksumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx) GENEVE.UDP6ZeroCheckSumTx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumtx) +GENEVE.UDP6ZeroChecksumTx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumtx) GENEVE.DestinationPort, config_parse_ip_port, 0, offsetof(Geneve, dest_port) GENEVE.FlowLabel, config_parse_geneve_flow_label, 0, 0 Tun.OneQueue, config_parse_bool, 0, offsetof(TunTap, one_queue) From ecee0abe775dd02ebd8ca3211ce84707a81fa8b8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 17:14:05 +0900 Subject: [PATCH 12/18] network: fix memleak in static prefix The fix by 744faf5e4e64e26181f03d1d9fa292ce6fb1456a is not perfect, as the section leaks if `hashmap_put()` in `prefix_new_static()` fails. --- src/network/networkd-radv.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index dc8b24a238..600fb27d75 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -98,13 +98,12 @@ void prefix_free(Prefix *prefix) { assert(prefix->network->n_static_prefixes > 0); prefix->network->n_static_prefixes--; - if (prefix->section) { + if (prefix->section) hashmap_remove(prefix->network->prefixes_by_section, prefix->section); - network_config_section_free(prefix->section); - } } + network_config_section_free(prefix->section); prefix->radv_prefix = sd_radv_prefix_unref(prefix->radv_prefix); free(prefix); From 7946d57f18e50a7e19fd667a29f4cd61dc0a9d9b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 17:36:50 +0900 Subject: [PATCH 13/18] network: drop error cause in log message Fixes for 21486d9e99463b0dc1f3ff9b9f3846aa67ffca6d. --- src/network/networkd-manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 9dcd911535..c8a6f81fd8 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -201,7 +201,7 @@ static int manager_udev_process_link(sd_device_monitor *monitor, sd_device *devi } if (!STR_IN_SET(action, "add", "change")) { - log_device_debug(device, "Ignoring udev %s event for device: %m", action); + log_device_debug(device, "Ignoring udev %s event for device.", action); return 0; } From 9a4720a9efee04c56cac16ab8e45ca1dfc9182dd Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 17:48:44 +0900 Subject: [PATCH 14/18] test-network: wait after removing links After ec6a47044a2ab321ae6427ce0d9fa3f6a17544a8, networkd starts soon after removing links used by previous test. That causes some racy situation of removing links and detecting links by networkd. --- test/test-network/systemd-networkd-tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index ff632740fc..632d0691a7 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -58,6 +58,7 @@ class Utilities(): for link in links: if os.path.exists(os.path.join('/sys/class/net', link)): subprocess.call(['ip', 'link', 'del', 'dev', link]) + time.sleep(1) def read_ipv6_sysctl_attr(self, link, attribute): with open(os.path.join(os.path.join(network_sysctl_ipv6_path, link), attribute)) as f: From 22f64c32fa600255abb39b539227434994e08201 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Nov 2018 18:13:14 +0900 Subject: [PATCH 15/18] test: UseRoutes= and UseTimezone= need to be in [DHCP] section --- test/test-network/conf/dhcp-client-timezone-router.network | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test-network/conf/dhcp-client-timezone-router.network b/test/test-network/conf/dhcp-client-timezone-router.network index 6316f9cf59..23e04649de 100644 --- a/test/test-network/conf/dhcp-client-timezone-router.network +++ b/test/test-network/conf/dhcp-client-timezone-router.network @@ -4,5 +4,7 @@ Name=veth99 [Network] IPv6AcceptRA=false DHCP=ipv4 + +[DHCP] UseRoutes=true UseTimezone=true From de4224aa224d0138635091188ea6e5c91058f8f3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 3 Nov 2018 15:44:34 +0900 Subject: [PATCH 16/18] network: fix memleak abot Address.label Also fix possible memleak about Address.section. Fixes #10628. --- src/network/networkd-address.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index cf33563bdd..2041100e5e 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -91,10 +91,8 @@ void address_free(Address *address) { assert(address->network->n_static_addresses > 0); address->network->n_static_addresses--; - if (address->section) { + if (address->section) hashmap_remove(address->network->addresses_by_section, address->section); - network_config_section_free(address->section); - } } if (address->link) { @@ -105,6 +103,8 @@ void address_free(Address *address) { memzero(&address->link->ipv6ll_address, sizeof(struct in6_addr)); } + network_config_section_free(address->section); + free(address->label); free(address); } From 2e5da68b7d9e2604e42feb8b1f6d43acec4937d7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 3 Nov 2018 16:29:49 +0900 Subject: [PATCH 17/18] network: add missing .sections element for vcan and vrf Fixes #10629. --- src/network/netdev/vcan.c | 1 + src/network/netdev/vrf.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/netdev/vcan.c b/src/network/netdev/vcan.c index f06ad0fb42..574d1cad31 100644 --- a/src/network/netdev/vcan.c +++ b/src/network/netdev/vcan.c @@ -4,5 +4,6 @@ const NetDevVTable vcan_vtable = { .object_size = sizeof(VCan), + .sections = "Match\0NetDev\0", .create_type = NETDEV_CREATE_INDEPENDENT, }; diff --git a/src/network/netdev/vrf.c b/src/network/netdev/vrf.c index b18090f7a1..5efab537cc 100644 --- a/src/network/netdev/vrf.c +++ b/src/network/netdev/vrf.c @@ -27,7 +27,7 @@ static int netdev_vrf_fill_message_create(NetDev *netdev, Link *link, sd_netlink const NetDevVTable vrf_vtable = { .object_size = sizeof(Vrf), - .sections = "NetDev\0VRF\0", + .sections = "Match\0NetDev\0VRF\0", .fill_message_create = netdev_vrf_fill_message_create, .create_type = NETDEV_CREATE_MASTER, }; From 383bb2bc1a7366f6d13feb9c7095565bd76dd466 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 3 Nov 2018 16:30:32 +0900 Subject: [PATCH 18/18] vlan-util: add assertions to parse_vlanid() --- src/shared/vlan-util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/shared/vlan-util.c b/src/shared/vlan-util.c index 400994a354..2f9df7dd1b 100644 --- a/src/shared/vlan-util.c +++ b/src/shared/vlan-util.c @@ -9,6 +9,9 @@ int parse_vlanid(const char *p, uint16_t *ret) { uint16_t id; int r; + assert(p); + assert(ret); + r = safe_atou16(p, &id); if (r < 0) return r;