[systemd-devel] [PATCH] udev: ifname matches given mac
Umut Tezduyar Lindskog
umut.tezduyar at axis.com
Wed Jan 15 06:57:50 PST 2014
Hi Tom,
> -----Original Message-----
> From: Tom Gundersen [mailto:teg at jklm.no]
> Sent: den 15 januari 2014 14:23
> To: Umut Tezduyar Lindskog
> Cc: systemd Mailing List; Umut Tezduyar Lindskog
> Subject: Re: [systemd-devel] [PATCH] udev: ifname matches given mac
>
> Hi Umut,
>
> I'm not really convinced about this. I think we should be fairly conservative
> about what names we consider persistent.
>
> The way NamePolicy=mac currently works is that it will base the name on the
> hardware mac address (i.e., not randomly generated by the kernel, set by
> userspace etc), and only do that if we deem it to be sane.
My thought was as a user, NamePolicy=mac meant that whatever the end mac address is going to be will form the basis for my interface name. With this thought, I realized my interface name was not same as my mac address since I set the mac address from userspace. I thought this is a bug but I also see your point of view which is NamePolicy=mac means hardware's mac address as also stated in the man page.
Thanks
>
> With your patch you also allow using the mac address set by us (but note that
> if it is set by other userspace it is still not used). In the case of
> MACPolicy=random, this is certainly the wrong thing to do, and even in the
> case of MACAddress=persistent or MACAddress=XX:XX:XX:XX:XX:XX, I'm not
> entirely convinced as these values are not really "permanent", in the sense
> that they are part of the configuration and not of the hardware.
>
> Any other opinions on this?
>
> Cheers,
>
> Tom
>
> On Wed, Jan 15, 2014 at 1:39 PM, Umut Tezduyar Lindskog
> <umut.tezduyar at axis.com> wrote:
> > This covers the case where NamePolicy has mac in it and MACAddress is
> > given.
> >
> > Ex:
> >
> > NamePolicy=mac
> > MACAddress=00:00:00:00:00:00
> >
> > Interface name becomes [en|wl]x000000000000
> >
> > Also cleanup rtnl_set_link_properties
> > ---
> > src/libsystemd/rtnl-util.c | 16 ++-------
> > src/udev/net/link-config.c | 56 +++++++++++++++++++------------
> > src/udev/net/link-config.h | 2 +-
> > src/udev/udev-builtin-net_setup_link.c | 8 +++-
> > 4 files changed, 44 insertions(+), 38 deletions(-)
> >
> > diff --git a/src/libsystemd/rtnl-util.c b/src/libsystemd/rtnl-util.c
> > index dfc0050..cebda2e 100644
> > --- a/src/libsystemd/rtnl-util.c
> > +++ b/src/libsystemd/rtnl-util.c
> > @@ -52,7 +52,6 @@ int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex,
> > const char *name) { 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;
> >
> > assert(rtnl);
> > @@ -69,32 +68,23 @@ int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex,
> const char *alias,
> > r = sd_rtnl_message_append_string(message, IFLA_IFALIAS, alias);
> > if (r < 0)
> > return r;
> > -
> > - need_update = true;
> > -
> > }
> >
> > if (mac) {
> > r = sd_rtnl_message_append_ether_addr(message,
> IFLA_ADDRESS, mac);
> > if (r < 0)
> > return r;
> > -
> > - need_update = true;
> > }
> >
> > if (mtu > 0) {
> > r = sd_rtnl_message_append_u32(message, IFLA_MTU, mtu);
> > if (r < 0)
> > return r;
> > -
> > - need_update = true;
> > }
> >
> > - if (need_update) {
> > - r = sd_rtnl_call(rtnl, message, 0, NULL);
> > - if (r < 0)
> > - return r;
> > - }
> > + r = sd_rtnl_call(rtnl, message, 0, NULL);
> > + if (r < 0)
> > + return r;
> >
> > return 0;
> > }
> > diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
> > index bd97cd8..e0a58ff 100644
> > --- a/src/udev/net/link-config.c
> > +++ b/src/udev/net/link-config.c
> > @@ -342,7 +342,7 @@ static int get_mac(struct udev_device *device, bool
> want_random, struct ether_ad
> > return 0;
> > }
> >
> > -int link_config_apply(link_config_ctx *ctx, link_config *config,
> > struct udev_device *device, const char **name) {
> > +int link_config_apply(link_config_ctx *ctx, link_config *config,
> > +struct udev_device *device, const char **name, bool *free_name) {
> > const char *old_name;
> > const char *new_name = NULL;
> > struct ether_addr generated_mac; @@ -378,6 +378,27 @@ int
> > link_config_apply(link_config_ctx *ctx, link_config *config, struct
> udev_dev
> > return -ENODEV;
> > }
> >
> > + switch (config->mac_policy) {
> > + case MACPOLICY_PERSISTENT:
> > + if (!mac_is_permanent(device)) {
> > + r = get_mac(device, false, &generated_mac);
> > + if (r < 0)
> > + return r;
> > + mac = &generated_mac;
> > + }
> > + break;
> > + case MACPOLICY_RANDOM:
> > + if (!mac_is_random(device)) {
> > + r = get_mac(device, true, &generated_mac);
> > + if (r < 0)
> > + return r;
> > + mac = &generated_mac;
> > + }
> > + break;
> > + default:
> > + mac = config->mac;
> > + }
> > +
> > if (ctx->enable_name_policy && config->name_policy) {
> > NamePolicy *policy;
> >
> > @@ -394,6 +415,18 @@ int link_config_apply(link_config_ctx *ctx,
> link_config *config, struct udev_dev
> > break;
> > case NAMEPOLICY_MAC:
> > new_name =
> > udev_device_get_property_value(device, "ID_NET_NAME_MAC");
> > + if (mac && new_name) {
> > + char *mac_name = NULL;
> > + mac_name = strdup(new_name);
> > + if (!mac_name)
> > + break;
> > + snprintf(mac_name+strlen(mac_name)-
> (2*ETHER_ADDR_LEN), 2*ETHER_ADDR_LEN+1,
> > + "%02x%02x%02x%02x%02x%02x",
> > + mac->ether_addr_octet[0], mac-
> >ether_addr_octet[1], mac->ether_addr_octet[2],
> > + mac->ether_addr_octet[3], mac-
> >ether_addr_octet[4], mac->ether_addr_octet[5]);
> > + new_name = mac_name;
> > + *free_name = true;
> > + }
> > break;
> > default:
> > break; @@ -408,27 +441,6 @@
> > int link_config_apply(link_config_ctx *ctx, link_config *config, struct
> udev_dev
> > else
> > *name = NULL;
> >
> > - switch (config->mac_policy) {
> > - case MACPOLICY_PERSISTENT:
> > - if (!mac_is_permanent(device)) {
> > - r = get_mac(device, false, &generated_mac);
> > - if (r < 0)
> > - return r;
> > - mac = &generated_mac;
> > - }
> > - break;
> > - case MACPOLICY_RANDOM:
> > - if (!mac_is_random(device)) {
> > - r = get_mac(device, true, &generated_mac);
> > - if (r < 0)
> > - return r;
> > - mac = &generated_mac;
> > - }
> > - break;
> > - default:
> > - mac = config->mac;
> > - }
> > -
> > r = rtnl_set_link_properties(ctx->rtnl, ifindex, config->alias, mac,
> config->mtu);
> > if (r < 0) {
> > log_warning("Could not set Alias, MACAddress or MTU
> > on %s: %s", old_name, strerror(-r)); diff --git
> > a/src/udev/net/link-config.h b/src/udev/net/link-config.h index
> > a55c6f5..460501c 100644
> > --- a/src/udev/net/link-config.h
> > +++ b/src/udev/net/link-config.h
> > @@ -75,7 +75,7 @@ int link_config_load(link_config_ctx *ctx); bool
> > link_config_should_reload(link_config_ctx *ctx);
> >
> > int link_config_get(link_config_ctx *ctx, struct udev_device *device,
> > struct link_config **ret); -int link_config_apply(link_config_ctx
> > *ctx, struct link_config *config, struct udev_device *device, const
> > char **name);
> > +int link_config_apply(link_config_ctx *ctx, struct link_config
> > +*config, struct udev_device *device, const char **name, bool
> > +*free_name);
> >
> > const char *name_policy_to_string(NamePolicy p) _const_; NamePolicy
> > name_policy_from_string(const char *p) _pure_; diff --git
> > a/src/udev/udev-builtin-net_setup_link.c
> > b/src/udev/udev-builtin-net_setup_link.c
> > index b7ba8c9..7c8346b 100644
> > --- a/src/udev/udev-builtin-net_setup_link.c
> > +++ b/src/udev/udev-builtin-net_setup_link.c
> > @@ -27,6 +27,7 @@ static link_config_ctx *ctx = NULL;
> >
> > static int builtin_net_setup_link(struct udev_device *dev, int argc, char
> **argv, bool test) {
> > const char *name;
> > + bool free_name = false;
> > link_config *link;
> > int r;
> >
> > @@ -46,14 +47,17 @@ static int builtin_net_setup_link(struct udev_device
> *dev, int argc, char **argv
> > }
> > }
> >
> > - r = link_config_apply(ctx, link, dev, &name);
> > + r = link_config_apply(ctx, link, dev, &name, &free_name);
> > if (r < 0) {
> > log_error("Could not apply link config to %s",
> udev_device_get_sysname(dev));
> > return EXIT_FAILURE;
> > }
> >
> > - if (name)
> > + if (name) {
> > udev_builtin_add_property(dev, test, "ID_NET_NAME",
> > name);
> > + if (free_name)
> > + free(name);
> > + }
> >
> > return EXIT_SUCCESS;
> > }
> > --
> > 1.7.2.5
> >
> > _______________________________________________
> > systemd-devel mailing list
> > systemd-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/systemd-devel
More information about the systemd-devel
mailing list