summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSusant Sahani <susant@redhat.com>2014-07-10 23:09:58 +0530
committerTom Gundersen <teg@jklm.no>2014-07-14 11:39:20 +0200
commit5d8e593dce074bff966fc0a46579c61b4f3bc33a (patch)
tree6e43e5a00d743b152da56080011f8333453325d4
parent5bdd314cd9954b605542571490738326f007c46c (diff)
networkd: make metric of routes configurable
Now route metric can be configuted via conf file: example conf: [Match] Name=em1 [Route] Gateway=192.168.1.12 Metric=10 Test: ip route output default via 192.168.1.12 dev em1 metric 10 [tomegun: squash TODO update and reword man page a bit]
-rw-r--r--TODO1
-rw-r--r--man/systemd.network.xml6
-rw-r--r--src/network/networkd-network-gperf.gperf2
-rw-r--r--src/network/networkd-route.c36
-rw-r--r--src/network/networkd.h3
5 files changed, 46 insertions, 2 deletions
diff --git a/TODO b/TODO
index 4bdf6c3115..877321f157 100644
--- a/TODO
+++ b/TODO
@@ -624,7 +624,6 @@ Features:
- properly handle routerless dhcp leases
- default to DHCP unicast, but make broadcast opt-in. detect devices that needs broadcast and opt-in automatically (needs kernel patch?)
- add more attribute support for SIT tunnel
- - make metric of routes configurable
- work with non-ethernet devices
- add support for more bond options
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index c13085c056..738977ee8d 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -389,6 +389,12 @@
prefixlength. If ommitted, a full-length host route is assumed.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>Metric=</varname></term>
+ <listitem>
+ <para>The metric of the route. An unsigned integer</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index c821eadb70..50cb0f8be9 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -43,7 +43,7 @@ Address.Peer, config_parse_address, 0,
Address.Broadcast, config_parse_broadcast, 0, 0
Address.Label, config_parse_label, 0, 0
Route.Gateway, config_parse_gateway, 0, 0
-Route.Destination, config_parse_destination, 0, 0
+Route.Metric, config_parse_route_priority, 0, 0
DHCP.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns)
DHCP.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_mtu)
DHCP.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_hostname)
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index acfe3f023f..9e6295f8c8 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -360,3 +360,39 @@ int config_parse_destination(const char *unit,
return 0;
}
+
+int config_parse_route_priority(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_route_free_ Route *n = NULL;
+ _cleanup_free_ char *route = NULL;
+ int r;
+
+ assert(filename);
+ assert(section);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ r = route_new_static(network, section_line, &n);
+ if (r < 0)
+ return r;
+
+ r = config_parse_unsigned(unit, filename, line, section,
+ section_line, lvalue, ltype,
+ rvalue, &n->metrics, userdata);
+ if (r < 0)
+ return r;
+
+ n = NULL;
+
+ return 0;
+}
diff --git a/src/network/networkd.h b/src/network/networkd.h
index 9132e70217..aca3b8dd24 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -467,6 +467,9 @@ int config_parse_destination(const char *unit, const char *filename, unsigned li
const char *section, unsigned section_line, const char *lvalue,
int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_route_priority(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);
/* Address */
int address_new_static(Network *network, unsigned section, Address **ret);
int address_new_dynamic(Address **ret);