[systemd-devel] [PATCH] udev/net_id: Introduce predictable network names for Linux on System z

Tom Gundersen teg at jklm.no
Thu Jan 9 03:46:55 PST 2014


On Thu, Jan 9, 2014 at 11:28 AM, Hendrik Brueckner <brueckner at redhat.com> wrote:
> Use the bus-ID to create predicatable devices names for network interfaces
> on Linux on System z instances.  The bus-ID identifies a device in the s390
> channel subsystem.

Looks good to me (assuming the names are truly stable between boots,
as I have no idea about how the internals of this work in the kernel).

Could you also make sure that these things are supported by path_id
when you are at it? We use that to reference devices from
udev/networkd so makes sense if these things are in sync.

Cheers,

Tom

> Network interfaces of device type Ethernet are named as:
>     enccw0.0.1234    (13 characters)
> up to
>     enccwff.7.ffff   (14 characters)
>
> CTC network devices of device type SLIP, use a different prefix as follows:
>     slccw0.0.1234    (13 characters)
>
> See also Red Hat Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=870859

Would be nice if you could post a summary, as a login is required.

> ---
>  src/udev/udev-builtin-net_id.c |   64 ++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
> index c322056..4f2b2c1 100644
> --- a/src/udev/udev-builtin-net_id.c
> +++ b/src/udev/udev-builtin-net_id.c
> @@ -28,6 +28,7 @@
>   *
>   * Two character prefixes based on the type of interface:
>   *   en -- ethernet
> + *   sl -- serial line IP (slip)
>   *   wl -- wlan
>   *   ww -- wwan
>   *
> @@ -102,6 +103,7 @@ enum netname_type{
>          NET_USB,
>          NET_BCMA,
>          NET_VIRTIO,
> +        NET_CCWGROUP,
>  };
>
>  struct netnames {
> @@ -121,6 +123,8 @@ struct netnames {
>          char bcma_core[IFNAMSIZ];
>
>          char virtio_core[IFNAMSIZ];
> +
> +        char ccw_core[IFNAMSIZ];
>  };
>
>  /* retrieve on-board index number and label from firmware */
> @@ -366,6 +370,44 @@ static int names_virtio(struct udev_device *dev, struct netnames *names) {
>          return 0;
>  }
>
> +static int names_ccw(struct  udev_device *dev, struct netnames *names) {
> +        struct udev_device *cdev;
> +        const char *bus_id;
> +        size_t bus_id_len;
> +        int rc;
> +
> +        /* Retrieve the associated CCW device */
> +        cdev = udev_device_get_parent(dev);
> +        if (!cdev)
> +                return -ENOENT;
> +
> +        /* Network devices are always grouped CCW devices */
> +        if (!streq_ptr("ccwgroup", udev_device_get_subsystem(cdev)))
> +                return -ENOENT;
> +
> +        /* Retrieve bus-ID of the grouped CCW device.  The bus-ID uniquely
> +         * identifies the network device on the Linux on System z channel
> +         * subsystem.  Note that the bus-ID contains lowercase characters.
> +         */
> +        bus_id = udev_device_get_sysname(cdev);
> +        if (!bus_id)
> +                return -ENOENT;
> +
> +        /* Check the length of the bus-ID.  Rely on that the kernel provides
> +         * a correct bus-ID; alternatively, improve this check and parse and
> +         * verify each bus-ID part...
> +         */
> +        bus_id_len = strlen(bus_id);
> +        if (!bus_id_len || bus_id_len < 8 || bus_id_len > 9)
> +                return -EINVAL;
> +
> +        /* Store the CCW bus-ID for use as network device name */
> +        rc = snprintf(names->ccw_core, sizeof(names->ccw_core), "ccw%s", bus_id);
> +        if (rc >= 0 && rc < (int)sizeof(names->ccw_core))
> +                names->type = NET_CCWGROUP;
> +        return 0;
> +}
> +
>  static int names_mac(struct udev_device *dev, struct netnames *names) {
>          const char *s;
>          unsigned int i;
> @@ -424,13 +466,21 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
>          struct netnames names = {};
>          int err;
>
> -        /* handle only ARPHRD_ETHER devices */
> +        /* handle only ARPHRD_ETHER and ARPHRD_SLIP devices */
>          s = udev_device_get_sysattr_value(dev, "type");
>          if (!s)
>                  return EXIT_FAILURE;
>          i = strtoul(s, NULL, 0);
> -        if (i != 1)
> +        switch (i) {
> +        case 1: /* ARPHRD_ETHER */
> +                prefix = "en";
> +                break;
> +        case 256: /* ARPHRD_SLIP */
> +                prefix = "sl";
> +                break;
> +        default:
>                  return 0;
> +        }
>
>          /* skip stacked devices, like VLANs, ... */
>          s = udev_device_get_sysattr_value(dev, "ifindex");
> @@ -462,6 +512,16 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
>                  ieee_oui(dev, &names, test);
>          }
>
> +        /* get path names for Linux on System z network devices */
> +        err = names_ccw(dev, &names);
> +        if (err >= 0 && names.type == NET_CCWGROUP) {
> +                char str[IFNAMSIZ];
> +
> +                if (snprintf(str, sizeof(str), "%s%s", prefix, names.ccw_core) < (int)sizeof(str))
> +                        udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
> +                goto out;
> +        }
> +
>          /* get PCI based path names, we compose only PCI based paths */
>          err = names_pci(dev, &names);
>          if (err < 0)
> --
> 1.7.5.4
>
> _______________________________________________
> 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