chiark / gitweb /
networkd: add basic [Link] settings to .network files
authorTom Gundersen <teg@jklm.no>
Thu, 4 Dec 2014 20:57:13 +0000 (21:57 +0100)
committerTom Gundersen <teg@jklm.no>
Thu, 4 Dec 2014 23:38:10 +0000 (00:38 +0100)
This allows the default link settings (set in .link files) to be overridden per Network. Only MTU and MACAddress is supported for now.

man/systemd.network.xml
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd.h

index a913fdf..11b4370 100644 (file)
         </refsect1>
 
         <refsect1>
+                <title>[Link] Section Options</title>
+
+                <para> The <literal>[Link]</literal> section accepts the following keys:</para>
+
+                <variablelist class='network-directives'>
+                        <varlistentry>
+                                <term><varname>MACAddress=</varname></term>
+                                <listitem>
+                                        <para>The hardware address.</para>
+                                </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                                <term><varname>MTUBytes=</varname></term>
+                                <listitem>
+                                        <para>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.</para>
+                                </listitem>
+                        </varlistentry>
+                </variablelist>
+        </refsect1>
+
+        <refsect1>
                 <title>[Network] Section Options</title>
 
                         <para>The <literal>[Network]</literal> section accepts the following keys:</para>
index 7cffcb4..d59a819 100644 (file)
@@ -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) {
index 4f0e05a..bd422e3 100644 (file)
@@ -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)
index cb11138..b014a6b 100644 (file)
@@ -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);
index 07917f0..5f553fb 100644 (file)
@@ -108,6 +108,9 @@ struct Network {
 
         unsigned cost;
 
+        struct ether_addr *mac;
+        unsigned mtu;
+
         LIST_HEAD(Address, static_addresses);
         LIST_HEAD(Route, static_routes);