device: added ad-hoc mode

As with station/ap, a new mode was added for ad-hoc
This commit is contained in:
James Prestwood 2018-07-17 14:16:03 -07:00 committed by Denis Kenzior
parent 682c844239
commit bf3a171e3a
2 changed files with 63 additions and 17 deletions

View File

@ -44,6 +44,7 @@
#include "src/device.h"
#include "src/watchlist.h"
#include "src/ap.h"
#include "src/adhoc.h"
struct device_watchlist_item {
uint32_t id;
@ -2057,18 +2058,8 @@ static struct l_dbus_message *device_signal_agent_unregister(
return l_dbus_message_new_method_return(message);
}
static struct l_dbus_message *device_set_mode_ap(struct device *device,
struct l_dbus_message *message)
static void device_prepare_adhoc_ap_mode(struct device *device)
{
if (device->mode == DEVICE_MODE_AP)
return dbus_error_already_exists(message);
if (device->state != DEVICE_STATE_DISCONNECTED &&
device->state != DEVICE_STATE_AUTOCONNECT)
return dbus_error_busy(message);
l_debug("");
periodic_scan_stop(device);
/* Drop all state we can related to client mode */
@ -2088,6 +2079,44 @@ static struct l_dbus_message *device_set_mode_ap(struct device *device,
l_queue_destroy(device->networks_sorted, NULL);
device->networks_sorted = l_queue_new();
}
static struct l_dbus_message *device_set_mode_adhoc(struct device *device,
struct l_dbus_message *message)
{
if (device->mode == DEVICE_MODE_ADHOC)
return dbus_error_already_exists(message);
if (device->state != DEVICE_STATE_DISCONNECTED &&
device->state != DEVICE_STATE_AUTOCONNECT)
return dbus_error_busy(message);
l_debug("");
device_prepare_adhoc_ap_mode(device);
netdev_set_iftype(device->netdev, NETDEV_IFTYPE_ADHOC);
device->mode = DEVICE_MODE_ADHOC;
adhoc_add_interface(device);
return NULL;
}
static struct l_dbus_message *device_set_mode_ap(struct device *device,
struct l_dbus_message *message)
{
if (device->mode == DEVICE_MODE_AP)
return dbus_error_already_exists(message);
if (device->state != DEVICE_STATE_DISCONNECTED &&
device->state != DEVICE_STATE_AUTOCONNECT)
return dbus_error_busy(message);
l_debug("");
device_prepare_adhoc_ap_mode(device);
netdev_set_iftype(device->netdev, NETDEV_IFTYPE_AP);
@ -2101,15 +2130,24 @@ static struct l_dbus_message *device_set_mode_ap(struct device *device,
static struct l_dbus_message *device_set_mode_sta(struct device *device,
struct l_dbus_message *message)
{
if (device->mode != DEVICE_MODE_AP)
return dbus_error_not_found(message);
if (device->mode == DEVICE_MODE_STATION)
return dbus_error_already_exists(message);
netdev_set_iftype(device->netdev, NETDEV_IFTYPE_STATION);
switch (device->mode) {
case DEVICE_MODE_AP:
netdev_set_iftype(device->netdev, NETDEV_IFTYPE_STATION);
ap_remove_interface(device);
break;
case DEVICE_MODE_ADHOC:
netdev_set_iftype(device->netdev, NETDEV_IFTYPE_STATION);
adhoc_remove_interface(device);
break;
default:
return dbus_error_not_found(message);
}
device->mode = DEVICE_MODE_STATION;
ap_remove_interface(device);
l_debug("");
return NULL;
@ -2499,6 +2537,9 @@ static bool device_property_get_mode(struct l_dbus *dbus,
case DEVICE_MODE_AP:
modestr = "ap";
break;
case DEVICE_MODE_ADHOC:
modestr = "ad-hoc";
break;
}
l_dbus_message_builder_append_basic(builder, 's', modestr);
@ -2527,6 +2568,10 @@ static struct l_dbus_message *device_property_set_mode(struct l_dbus *dbus,
reply = device_set_mode_ap(device, message);
if (reply)
return reply;
} else if (!strcmp(mode, "ad-hoc")) {
reply = device_set_mode_adhoc(device, message);
if (reply)
return reply;
} else {
return dbus_error_invalid_args(message);
}

View File

@ -45,7 +45,8 @@ enum device_state {
enum device_mode {
DEVICE_MODE_STATION,
DEVICE_MODE_AP
DEVICE_MODE_AP,
DEVICE_MODE_ADHOC,
};
typedef void (*device_watch_func_t)(struct device *device,