summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@users.noreply.github.com>2017-08-01 07:44:08 +0000
committerLennart Poettering <lennart@poettering.net>2017-08-01 09:44:08 +0200
commit2959fb07cbad2be0c835fb5ae709f884e4b86dc4 (patch)
tree39b267788b9299b9527e7e2172af081bff06e0cd
parentf19ca6105e9f74b01e799d02c280eec67696c228 (diff)
downloadsystemd-2959fb07cbad2be0c835fb5ae709f884e4b86dc4.tar.gz
networkd: add scope to address section (#6449)
This work allows to configure address Scope to host | link | global or a number. Closes #6446
-rw-r--r--man/systemd.network.xml8
-rw-r--r--src/network/networkd-address.c45
-rw-r--r--src/network/networkd-address.h1
-rw-r--r--src/network/networkd-network-gperf.gperf1
4 files changed, 54 insertions, 1 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 49d97cb604..438e1126dc 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -749,6 +749,14 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><varname>Scope=</varname></term>
+ <listitem>
+ <para>The scope of the address, which can be <literal>global</literal>,
+ <literal>link</literal> or <literal>host</literal> or an unsigned integer ranges 0 to 255.
+ Defaults to <literal>global</literal>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><varname>HomeAddress=</varname></term>
<listitem>
<para>Takes a boolean argument. Designates this address the "home address" as defined in
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index d66b3a288f..7f536b4ba9 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -927,6 +927,49 @@ int config_parse_address_flags(const char *unit,
return 0;
}
+int config_parse_address_scope(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_address_free_ Address *n = NULL;
+ int r;
+
+ assert(filename);
+ assert(section);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ r = address_new_static(network, filename, section_line, &n);
+ if (r < 0)
+ return r;
+
+ if (streq(rvalue, "host"))
+ n->scope = RT_SCOPE_HOST;
+ else if (streq(rvalue, "link"))
+ n->scope = RT_SCOPE_LINK;
+ else if (streq(rvalue, "global"))
+ n->scope = RT_SCOPE_UNIVERSE;
+ else {
+ r = safe_atou8(rvalue , &n->scope);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse address scope \"%s\", ignoring assignment: %m", rvalue);
+ return 0;
+ }
+ }
+
+ n = NULL;
+
+ return 0;
+}
+
bool address_is_ready(const Address *a) {
assert(a);
@@ -1179,4 +1222,4 @@ int config_parse_prefix_lifetime(const char *unit,
p = NULL;
return 0;
-};
+}
diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h
index 065328482e..3281c6d3c2 100644
--- a/src/network/networkd-address.h
+++ b/src/network/networkd-address.h
@@ -102,6 +102,7 @@ int config_parse_broadcast(const char *unit, const char *filename, unsigned line
int config_parse_label(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);
int config_parse_lifetime(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);
int config_parse_address_flags(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);
+int config_parse_address_scope(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);
int config_parse_router_preference(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);
int config_parse_prefix(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);
int config_parse_prefix_flags(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);
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index a2d38501a5..a225836598 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -80,6 +80,7 @@ Address.DuplicateAddressDetection, config_parse_address_flags,
Address.ManageTemporaryAddress, config_parse_address_flags, 0, 0
Address.PrefixRoute, config_parse_address_flags, 0, 0
Address.AutoJoin, config_parse_address_flags, 0, 0
+Address.Scope, config_parse_address_scope, 0, 0
IPv6AddressLabel.Prefix, config_parse_address_label_prefix, 0, 0
IPv6AddressLabel.Label, config_parse_address_label, 0, 0
Route.Gateway, config_parse_gateway, 0, 0