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.
This commit is contained in:
Tom Gundersen 2014-12-04 21:57:13 +01:00
parent c18c2a0ea1
commit c106cc36b9
5 changed files with 56 additions and 1 deletions

View File

@ -179,6 +179,30 @@
</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>

View 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) {

View 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)

View 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);

View 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);