summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/udev.xml8
-rw-r--r--src/libsystemd-rtnl/rtnl-message.c8
-rw-r--r--src/libsystemd-rtnl/rtnl-util.c18
-rw-r--r--src/libsystemd-rtnl/rtnl-util.h2
-rw-r--r--src/shared/net-util.c42
-rw-r--r--src/shared/net-util.h4
-rw-r--r--src/udev/net/link-config-gperf.gperf1
-rw-r--r--src/udev/net/link-config.c13
-rw-r--r--src/udev/net/link-config.h1
9 files changed, 78 insertions, 19 deletions
diff --git a/man/udev.xml b/man/udev.xml
index d157b8c433..bd071e1770 100644
--- a/man/udev.xml
+++ b/man/udev.xml
@@ -804,7 +804,13 @@
<varlistentry>
<term><varname>Description</varname></term>
<listitem>
- <para>A description of the device. The <literal>ifalias</literal> is set to this value.</para>
+ <para>A description of the device.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>Alias</varname></term>
+ <listitem>
+ <para>The <literal>ifalias</literal> is set to this value.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/src/libsystemd-rtnl/rtnl-message.c b/src/libsystemd-rtnl/rtnl-message.c
index 1ce6862668..26da7f2db8 100644
--- a/src/libsystemd-rtnl/rtnl-message.c
+++ b/src/libsystemd-rtnl/rtnl-message.c
@@ -129,7 +129,8 @@ int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, unsigned int type,
struct ifinfomsg *ifi;
int r;
- assert_return(nlmsg_type == RTM_NEWLINK || nlmsg_type == RTM_DELLINK || nlmsg_type == RTM_GETLINK, -EINVAL);
+ assert_return(nlmsg_type == RTM_NEWLINK || nlmsg_type == RTM_DELLINK ||
+ nlmsg_type == RTM_SETLINK || nlmsg_type == RTM_GETLINK, -EINVAL);
assert_return(index > 0, -EINVAL);
assert_return(ret, -EINVAL);
@@ -258,14 +259,15 @@ int sd_rtnl_message_append(sd_rtnl_message *m, unsigned short type, const void *
switch (rtm_type) {
case RTM_NEWLINK:
+ case RTM_SETLINK:
case RTM_DELLINK:
case RTM_GETLINK:
switch (type) {
case IFLA_IFNAME:
+ case IFLA_IFALIAS:
case IFLA_QDISC:
return add_rtattr(m, type, data, strlen(data) + 1);
case IFLA_MTU:
- return add_rtattr(m, type, data, sizeof(uint32_t));
case IFLA_LINK:
return add_rtattr(m, type, data, sizeof(uint32_t));
case IFLA_STATS:
@@ -352,6 +354,7 @@ int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data)
switch (rtm_type) {
case RTM_NEWLINK:
+ case RTM_SETLINK:
case RTM_DELLINK:
case RTM_GETLINK:
if (!m->next_rta) {
@@ -512,6 +515,7 @@ int socket_read_message(sd_rtnl *nl, sd_rtnl_message **ret) {
k = -EIO;
break;
case RTM_NEWLINK:
+ case RTM_SETLINK:
case RTM_DELLINK:
case RTM_GETLINK:
if (m->hdr->nlmsg_len < NLMSG_LENGTH(sizeof(struct ifinfomsg)))
diff --git a/src/libsystemd-rtnl/rtnl-util.c b/src/libsystemd-rtnl/rtnl-util.c
index d40858a63b..4e7661bb77 100644
--- a/src/libsystemd-rtnl/rtnl-util.c
+++ b/src/libsystemd-rtnl/rtnl-util.c
@@ -34,7 +34,7 @@ int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
assert(ifindex > 0);
assert(name);
- r = sd_rtnl_message_link_new(RTM_NEWLINK, ifindex, 0, 0, &message);
+ r = sd_rtnl_message_link_new(RTM_SETLINK, ifindex, 0, 0, &message);
if (r < 0)
return r;
@@ -49,7 +49,8 @@ int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
return 0;
}
-int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const struct ether_addr *mac, unsigned mtu) {
+int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const char *alias,
+ const struct ether_addr *mac, unsigned mtu) {
_cleanup_sd_rtnl_message_unref_ sd_rtnl_message *message = NULL;
bool need_update = false;
int r;
@@ -57,13 +58,22 @@ int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const struct ether_addr
assert(rtnl);
assert(ifindex > 0);
- if (!mac && mtu == 0)
+ if (!alias && !mac && mtu == 0)
return 0;
- r = sd_rtnl_message_link_new(RTM_NEWLINK, ifindex, 0, 0, &message);
+ r = sd_rtnl_message_link_new(RTM_SETLINK, ifindex, 0, 0, &message);
if (r < 0)
return r;
+ if (alias) {
+ r = sd_rtnl_message_append(message, IFLA_IFALIAS, alias);
+ if (r < 0)
+ return r;
+
+ need_update = true;
+
+ }
+
if (mac) {
r = sd_rtnl_message_append(message, IFLA_ADDRESS, mac);
if (r < 0)
diff --git a/src/libsystemd-rtnl/rtnl-util.h b/src/libsystemd-rtnl/rtnl-util.h
index ba0f71f944..013002dd60 100644
--- a/src/libsystemd-rtnl/rtnl-util.h
+++ b/src/libsystemd-rtnl/rtnl-util.h
@@ -27,7 +27,7 @@
#include "sd-rtnl.h"
int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name);
-int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const struct ether_addr *mac, unsigned mtu);
+int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const char *alias, const struct ether_addr *mac, unsigned mtu);
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_rtnl*, sd_rtnl_unref);
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_rtnl_message*, sd_rtnl_message_unref);
diff --git a/src/shared/net-util.c b/src/shared/net-util.c
index 2734d119ce..f2fd0819d3 100644
--- a/src/shared/net-util.c
+++ b/src/shared/net-util.c
@@ -20,7 +20,7 @@
***/
#include <netinet/ether.h>
-#include <net/if.h>
+#include <linux/if.h>
#include <arpa/inet.h>
#include "net-util.h"
@@ -123,6 +123,46 @@ int config_parse_ifname(const char *unit,
return 0;
}
+int config_parse_ifalias(const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ char **s = data;
+ char *n;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ n = strdup(rvalue);
+ if (!n)
+ return log_oom();
+
+ if (!ascii_is_valid(n) || strlen(n) >= IFALIASZ) {
+ log_syntax(unit, LOG_ERR, filename, line, EINVAL,
+ "Interface alias is not ASCII clean or is too long, ignoring assignment: %s", rvalue);
+ free(n);
+ return 0;
+ }
+
+ free(*s);
+ if (*n)
+ *s = n;
+ else {
+ free(n);
+ *s = NULL;
+ }
+
+ return 0;
+}
+
int config_parse_hwaddr(const char *unit,
const char *filename,
unsigned line,
diff --git a/src/shared/net-util.h b/src/shared/net-util.h
index eac394bffa..d6ca737e7f 100644
--- a/src/shared/net-util.h
+++ b/src/shared/net-util.h
@@ -43,4 +43,8 @@ int config_parse_ifname(const char *unit, const char *filename, unsigned line,
const char *section, const char *lvalue, int ltype,
const char *rvalue, void *data, void *userdata);
+int config_parse_ifalias(const char *unit, const char *filename, unsigned line,
+ const char *section, const char *lvalue, int ltype,
+ const char *rvalue, void *data, void *userdata);
+
int net_parse_inaddr(const char *address, unsigned char *family, void *dst);
diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf
index 1fe0b93e53..950fb15286 100644
--- a/src/udev/net/link-config-gperf.gperf
+++ b/src/udev/net/link-config-gperf.gperf
@@ -25,6 +25,7 @@ Link.MACAddressPolicy, config_parse_mac_policy, 0, offsetof(link
Link.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, mac)
Link.NamePolicy, config_parse_name_policy, 0, offsetof(link_config, name_policy)
Link.Name, config_parse_ifname, 0, offsetof(link_config, name)
+Link.Alias, config_parse_ifalias, 0, offsetof(link_config, alias)
Link.MTU, config_parse_unsigned, 0, offsetof(link_config, mtu)
Link.SpeedMBytes, config_parse_unsigned, 0, offsetof(link_config, speed)
Link.Duplex, config_parse_duplex, 0, offsetof(link_config, duplex)
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 5156ba6f8a..37918d35e3 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -124,6 +124,7 @@ static void link_configs_free(link_config_ctx *ctx) {
free(link->match_driver);
free(link->match_type);
free(link->description);
+ free(link->alias);
free(link);
}
@@ -364,14 +365,6 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_dev
if (!old_name)
return -EINVAL;
- if (config->description) {
- r = udev_device_set_sysattr_value(device, "ifalias",
- config->description);
- if (r < 0)
- log_warning("Could not set description of %s to '%s': %s",
- old_name, config->description, strerror(-r));
- }
-
r = ethtool_set_speed(ctx->ethtool_fd, old_name, config->speed, config->duplex);
if (r < 0)
log_warning("Could not set speed or duplex of %s to %u Mbytes (%s): %s",
@@ -439,9 +432,9 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_dev
mac = config->mac;
}
- r = rtnl_set_link_properties(ctx->rtnl, ifindex, mac, config->mtu);
+ r = rtnl_set_link_properties(ctx->rtnl, ifindex, config->alias, mac, config->mtu);
if (r < 0) {
- log_warning("Could not set MACAddress or MTU on %s: %s", old_name, strerror(-r));
+ log_warning("Could not set Alias, MACAddress or MTU on %s: %s", old_name, strerror(-r));
return r;
}
diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h
index 9747003635..f74a790d55 100644
--- a/src/udev/net/link-config.h
+++ b/src/udev/net/link-config.h
@@ -59,6 +59,7 @@ struct link_config {
MACPolicy mac_policy;
NamePolicy *name_policy;
char *name;
+ char *alias;
unsigned int mtu;
unsigned int speed;
Duplex duplex;