struct iface_data {
char ifname[IFNAMSIZ];
+ char ifaddr[18];
GSList *stations;
gchar *network;
{
struct iface_data *data;
struct ifreq ifr;
+ struct ether_addr *eth;
int sk, err;
sk = socket(PF_INET, SOCK_DGRAM, 0);
err = ioctl(sk, SIOCGIFNAME, &ifr);
+ if (err == 0)
+ err = ioctl(sk, SIOCGIFHWADDR, &ifr);
+
close(sk);
if (err < 0)
memcpy(data->ifname, ifr.ifr_name, IFNAMSIZ);
+ eth = (void *) &ifr.ifr_hwaddr.sa_data;
+ sprintf(data->ifaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+ eth->ether_addr_octet[0],
+ eth->ether_addr_octet[1],
+ eth->ether_addr_octet[2],
+ eth->ether_addr_octet[3],
+ eth->ether_addr_octet[4],
+ eth->ether_addr_octet[5]);
+
iface->type = CONNMAN_IFACE_TYPE_80211;
iface->flags = CONNMAN_IFACE_FLAG_RTNL |
return 0;
}
+static const char *iface_get_address(struct connman_iface *iface)
+{
+ struct iface_data *data = connman_iface_get_data(iface);
+
+ printf("[802.11] get address %s\n", data->ifname);
+
+ return data->ifaddr;
+}
+
static void iface_set_network(struct connman_iface *iface,
const char *network)
{
.activate = iface_activate,
.scan = iface_scan,
.connect = iface_connect,
+ .get_address = iface_get_address,
.set_network = iface_set_network,
.set_passphrase = iface_set_passphrase,
.rtnl_carrier = iface_carrier,
return TRUE;
}
+static dbus_bool_t get_address(DBusConnection *conn,
+ DBusMessageIter *iter, void *data)
+{
+ struct connman_iface *iface = data;
+ const char *address;
+
+ DBG("iface %p", iface);
+
+ if (!iface->driver->get_address)
+ return FALSE;
+
+ address = iface->driver->get_address(iface);
+ if (address == NULL)
+ return FALSE;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &address);
+
+ return TRUE;
+}
+
+static dbus_bool_t get_driver(DBusConnection *conn,
+ DBusMessageIter *iter, void *data)
+{
+ struct connman_iface *iface = data;
+
+ DBG("iface %p", iface);
+
+ if (iface->device.driver == NULL)
+ return FALSE;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
+ &iface->device.driver);
+
+ return TRUE;
+}
+
+static dbus_bool_t get_vendor(DBusConnection *conn,
+ DBusMessageIter *iter, void *data)
+{
+ struct connman_iface *iface = data;
+
+ DBG("iface %p", iface);
+
+ if (iface->device.vendor == NULL)
+ return FALSE;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
+ &iface->device.vendor);
+
+ return TRUE;
+}
+
+static dbus_bool_t get_product(DBusConnection *conn,
+ DBusMessageIter *iter, void *data)
+{
+ struct connman_iface *iface = data;
+
+ DBG("iface %p", iface);
+
+ if (iface->device.product == NULL)
+ return FALSE;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
+ &iface->device.product);
+
+ return TRUE;
+}
+
static GDBusPropertyTable iface_properties[] = {
- { "Type", "s", get_type },
+ { "Type", "s", get_type },
+ { "Address", "s", get_address },
+ { "Driver", "s", get_driver },
+ { "Vendor", "s", get_vendor },
+ { "Product", "s", get_product },
{ },
};
g_free(iface->path);
g_free(iface->udi);
g_free(iface->sysfs);
+ g_free(iface->device.driver);
+ g_free(iface->device.vendor);
+ g_free(iface->device.product);
g_free(iface);
}
+static void detect_device_info(LibHalContext *ctx, struct connman_iface *iface)
+{
+ char *parent, *subsys, *value;
+
+ parent = libhal_device_get_property_string(ctx, iface->udi,
+ "info.parent", NULL);
+
+ subsys = libhal_device_get_property_string(ctx, iface->udi,
+ "linux.subsystem", NULL);
+
+ value = libhal_device_get_property_string(ctx, iface->udi,
+ "info.linux.driver", NULL);
+ if (value == NULL) {
+ value = libhal_device_get_property_string(ctx, parent,
+ "info.linux.driver", NULL);
+ if (value != NULL)
+ iface->device.driver = g_strdup(value);
+ }
+
+ if (strcmp(subsys, "net") == 0) {
+ value = libhal_device_get_property_string(ctx, parent,
+ "info.vendor", NULL);
+ if (value != NULL)
+ iface->device.vendor = g_strdup(value);
+
+ value = libhal_device_get_property_string(ctx, parent,
+ "info.product", NULL);
+ if (value != NULL)
+ iface->device.product = g_strdup(value);
+ }
+}
+
static int probe_device(LibHalContext *ctx,
struct connman_iface_driver *driver, const char *udi)
{
if (sysfs != NULL)
iface->sysfs = g_strdup(sysfs);
+ detect_device_info(ctx, iface);
+
iface->index = -1;
if (g_str_has_prefix(driver->capability, "net") == TRUE)