From: Tom Gundersen Date: Thu, 4 Dec 2014 20:57:13 +0000 (+0100) Subject: networkd: add basic [Link] settings to .network files X-Git-Tag: v218~99 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=c106cc36b9b8e8998eb95299b02f1db9c1209122 networkd: add basic [Link] settings to .network files This allows the default link settings (set in .link files) to be overridden per Network. Only MTU and MACAddress is supported for now. --- diff --git a/man/systemd.network.xml b/man/systemd.network.xml index a913fdfc5..11b4370a6 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -179,6 +179,30 @@ + + [Link] Section Options + + The [Link] section accepts the following keys: + + + + MACAddress= + + The hardware address. + + + + MTUBytes= + + The maximum transmission unit in bytes to + set for the device. The usual suffixes K, M, G, + are supported and are understood to the base of + 1024. + + + + + [Network] Section Options diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 7cffcb48d..d59a8192b 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1074,6 +1074,7 @@ static int link_up(Link *link) { int r; assert(link); + assert(link->network); assert(link->manager); assert(link->manager->rtnl); @@ -1093,6 +1094,22 @@ static int link_up(Link *link) { return r; } + if (link->network->mac) { + r = sd_rtnl_message_append_ether_addr(req, IFLA_ADDRESS, link->network->mac); + if (r < 0) { + log_link_error(link, "Could not set MAC address: %s", strerror(-r)); + return r; + } + } + + if (link->network->mtu) { + r = sd_rtnl_message_append_u32(req, IFLA_MTU, link->network->mtu); + if (r < 0) { + log_link_error(link, "Could not set MTU: %s", strerror(-r)); + return r; + } + } + r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL); if (r < 0) { diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 4f0e05aeb..bd422e3e0 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -24,6 +24,8 @@ Match.Host, config_parse_net_condition, CONDITION_HOST, Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(Network, match_virt) Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, match_kernel) Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(Network, match_arch) +Link.MACAddress, config_parse_hwaddr, 0, offsetof(Network, mac) +Link.MTUBytes, config_parse_iec_size, 0, offsetof(Network, mtu) 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) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index cb111382f..b014a6b64 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -90,7 +90,14 @@ static int network_load_one(Manager *manager, const char *filename) { network->llmnr = LLMNR_SUPPORT_YES; r = config_parse(NULL, filename, file, - "Match\0Network\0Address\0Route\0DHCP\0DHCPv4\0BridgePort\0", + "Match\0" + "Link\0" + "Network\0" + "Address\0" + "Route\0" + "DHCP\0" + "DHCPv4\0" + "BridgePort\0", config_item_perf_lookup, network_network_gperf_lookup, false, false, true, network); if (r < 0) @@ -163,6 +170,8 @@ void network_free(Network *network) { free(network->description); free(network->dhcp_vendor_class_identifier); + free(network->mac); + strv_free(network->ntp); strv_free(network->dns); strv_free(network->domains); diff --git a/src/network/networkd.h b/src/network/networkd.h index 07917f0ef..5f553fb3b 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -108,6 +108,9 @@ struct Network { unsigned cost; + struct ether_addr *mac; + unsigned mtu; + LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes);