+/*
+ * Mark valid interfaces as 'ready'.
+ * The udev_enumerate_add_match_is_initialized() filter in udev_enumerate()
+ * ensures that any device we see is properly initialized by udev (eg. interface
+ * names); here we check that the properties are sane and mark the interface
+ * as ready for configuration in discover/network.
+ */
+static int udev_check_interface_ready(struct device_handler *handler,
+ struct udev_device *dev)
+{
+ const char *name, *name_path, *ifindex, *interface, *mac_name;
+ uint8_t *mac;
+ char byte[3];
+ unsigned int i, j;
+
+
+ name = udev_device_get_sysname(dev);
+ if (!name) {
+ pb_debug("udev_device_get_sysname failed\n");
+ return -1;
+ }
+
+ name_path = udev_device_get_property_value(dev, "ID_NET_NAME_PATH");
+ ifindex = udev_device_get_property_value(dev, "IFINDEX");
+ interface = udev_device_get_property_value(dev, "INTERFACE");
+ mac_name = udev_device_get_property_value(dev, "ID_NET_NAME_MAC");
+
+ /* Physical interfaces should have all of these properties */
+ if (!name_path || !ifindex || !interface || !mac_name) {
+ pb_debug("%s: interface %s missing properties\n",
+ __func__, name);
+ return -1;
+ }
+
+ /* ID_NET_NAME_MAC format is enxMACADDR */
+ if (strlen(mac_name) < 15) {
+ pb_debug("%s: Unexpected MAC format: %s\n",
+ __func__, mac_name);
+ return -1;
+ }
+
+ mac = talloc_array(handler, uint8_t, HWADDR_SIZE);
+ if (!mac)
+ return -1;
+
+ /*
+ * ID_NET_NAME_MAC is not a conventionally formatted MAC
+ * string - convert it before passing it to network.c
+ */
+ byte[2] = '\0';
+ for (i = strlen("enx"), j = 0;
+ i < strlen(mac_name) && j < HWADDR_SIZE; i += 2) {
+ memcpy(byte, &mac_name[i], 2);
+ mac[j++] = strtoul(byte, NULL, 16);
+ }
+
+ network_mark_interface_ready(handler,
+ atoi(ifindex), interface, mac, HWADDR_SIZE);
+
+ talloc_free(mac);
+ return 0;
+}
+